Imported Upstream version 0.9.40 08/50908/1 upstream/0.9.40
authorYoungbok Shin <youngb.shin@samsung.com>
Tue, 3 Nov 2015 11:24:15 +0000 (20:24 +0900)
committerYoungbok Shin <youngb.shin@samsung.com>
Tue, 3 Nov 2015 11:49:45 +0000 (20:49 +0900)
Change-Id: Ifcc6c10a445fb0c0cc5bfee7638d67eb05a63a4c

119 files changed:
Android.mk
ChangeLog
Makefile.am
Makefile.in
NEWS
README
README.python [new file with mode: 0644]
autogen.sh
config.h.in
configure
configure.ac
docs/Makefile.am
docs/Makefile.in
docs/reference/html/annotation-glossary.html
docs/reference/html/ch01.html
docs/reference/html/harfbuzz-hb-blob.html
docs/reference/html/harfbuzz-hb-buffer.html
docs/reference/html/harfbuzz-hb-common.html
docs/reference/html/harfbuzz-hb-coretext.html
docs/reference/html/harfbuzz-hb-face.html
docs/reference/html/harfbuzz-hb-font.html
docs/reference/html/harfbuzz-hb-ft.html
docs/reference/html/harfbuzz-hb-glib.html
docs/reference/html/harfbuzz-hb-graphite2.html
docs/reference/html/harfbuzz-hb-icu.html
docs/reference/html/harfbuzz-hb-ot-layout.html
docs/reference/html/harfbuzz-hb-ot-tag.html
docs/reference/html/harfbuzz-hb-set.html
docs/reference/html/harfbuzz-hb-shape-plan.html
docs/reference/html/harfbuzz-hb-shape.html
docs/reference/html/harfbuzz-hb-unicode.html
docs/reference/html/harfbuzz-hb-uniscribe.html
docs/reference/html/harfbuzz-hb-version.html
docs/reference/html/harfbuzz.devhelp2
docs/reference/html/index.html
docs/reference/html/index.sgml
docs/reference/version.xml
src/Makefile.am
src/Makefile.in
src/check-defs.sh
src/check-libstdc++.sh
src/check-static-inits.sh
src/check-symbols.sh
src/gen-indic-table.py
src/hb-blob.cc
src/hb-buffer-deserialize-json.hh
src/hb-buffer-deserialize-json.rl
src/hb-buffer-deserialize-text.hh
src/hb-buffer.cc
src/hb-buffer.h
src/hb-common.cc
src/hb-coretext.cc
src/hb-face-private.hh
src/hb-ft.cc
src/hb-ft.h
src/hb-glib.cc
src/hb-glib.h
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-font.cc
src/hb-ot-head-table.hh
src/hb-ot-hhea-table.hh
src/hb-ot-hmtx-table.hh
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-maxp-table.hh
src/hb-ot-name-table.hh
src/hb-ot-shape-complex-arabic-fallback.hh
src/hb-ot-shape-complex-arabic-win1256.hh
src/hb-ot-shape-complex-indic-machine.hh
src/hb-ot-shape-complex-indic-machine.rl
src/hb-ot-shape-complex-indic-table.cc
src/hb-ot-shape-complex-myanmar-machine.hh
src/hb-ot-shape-complex-private.hh
src/hb-ot-shape-complex-sea-machine.hh
src/hb-ot-shape-fallback.cc
src/hb-ot-shape-normalize.cc
src/hb-ot-shape.cc
src/hb-private.hh
src/hb-set-private.hh
src/hb-shape.cc
src/hb-shaper-private.hh
src/hb-shaper.cc
src/hb-unicode.cc
src/hb-uniscribe.cc
src/hb-utf-private.hh
src/hb-version.h
test/api/test-blob.c
test/shaping/Makefile.am
test/shaping/Makefile.in
test/shaping/fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf [new file with mode: 0644]
test/shaping/fonts/sha1sum/MANIFEST
test/shaping/hb_test_tools.py
test/shaping/tests/arabic-fallback-shaping.tests
test/shaping/tests/hangul-jamo.tests
test/shaping/tests/indic-joiner-candrabindu.tests [new file with mode: 0644]
util/Makefile.am
util/Makefile.in
util/hb-ot-shape-closure.cc
util/hb-shape.cc
util/hb-view.cc
util/helper-cairo-ansi.cc
util/helper-cairo.cc
util/helper-cairo.hh
util/main-font-text.hh
util/options.cc
util/options.hh
util/view-cairo.cc
util/view-cairo.hh

index 07dfa5b..0552507 100644 (file)
@@ -99,8 +99,7 @@ LOCAL_SHARED_LIBRARIES := \
        libutils \
        liblog
 LOCAL_C_INCLUDES += \
        libutils \
        liblog
 LOCAL_C_INCLUDES += \
-        $(LOCAL_PATH)/src \
-        external/icu/icu4c/source/common
+        $(LOCAL_PATH)/src
 LOCAL_CFLAGS += -DHB_NO_MT -DHAVE_OT -DHAVE_ICU -DHAVE_ICU_BUILTIN
 LOCAL_MODULE:= libharfbuzz_ng
 include $(BUILD_SHARED_LIBRARY)
 LOCAL_CFLAGS += -DHB_NO_MT -DHAVE_OT -DHAVE_ICU -DHAVE_ICU_BUILTIN
 LOCAL_MODULE:= libharfbuzz_ng
 include $(BUILD_SHARED_LIBRARY)
index 909fdf0..2ef17b2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+commit 9e401f6890f2bea1d11914bca436c2230f8d0f1b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Fri Mar 20 16:08:38 2015 -0400
+
+    Fix reverse_range() for empty range
+
+    Fixes coretext notdef loop consisting of all default_ignorable glyphs
+
+    https://code.google.com/p/chromium/issues/detail?id=464755
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 7481bd49d56d4e814ab1f85fc2df8bf934d520f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 15:47:25 2015 -0800
+
+    Fix previous commit
+
+    I misunderstood how which works.
+
+ autogen.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6763e21afb77b250ad4416ff921d46c63ea12443
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 15:43:05 2015 -0800
+
+    Accept glibtoolize as libtoolize
+
+    Of course, we don't really run it, autoreconf does.  We just
+    err if neither is available.  glibtoolize is the name it is
+    shipped under on OS X.  Reported by Adam.
+
+ autogen.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 02a04e6afb1a76894f3723a467716607970d95d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 12:32:03 2015 -0800
+
+    0.9.39
+
+ NEWS         | 10 ++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 11 insertions(+), 1 deletion(-)
+
+commit 98e3ea8e34c798ce003e946c9a150bb41be9d09b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Mar 4 12:03:39 2015 -0800
+
+    Fix hb-uniscribe build
+
+ src/hb-ot-name-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8ac345e5c0ed0aad6547592ea0839aabfb4ba980
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Mon Mar 2 16:06:55 2015 -0800
+
+    Fix reverse_range() to only reverse alt array if positions are used
+
+    In hb-coretext, when we were using scratch buffer for book-keeping,
+    a reverse_range() caused by the notdef-insertion loop could mess up
+    our log_clusters.  Ouch!
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1e03d7ac83f3e17aafed1e37390d9ff8394e36da
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:58:32 2015 -0800
+
+    Better error message if libtool is not installed
+
+    Fixes https://github.com/behdad/harfbuzz/pull/88
+
+ autogen.sh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 6c918e2997fb82e89485f2b50bee2bf4fcd70592
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:55:34 2015 -0800
+
+    Clean up gtk-doc.make
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5ec5875acb12cf07447c9ebfb03212601368dfc4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:53:05 2015 -0800
+
+    Install git.mk in docs/
+
+ docs/Makefile.am | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit d146678d103425b3da7ef393bc6d66f6ba4c5593
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 26 13:52:50 2015 -0800
+
+    Update git.mk from upstream
+
+ git.mk | 35 ++++++++++++++++++++++++++++-------
+ 1 file changed, 28 insertions(+), 7 deletions(-)
+
+commit 5f541f8f7be82f29b77b481827deb212e12d53e4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:51:17 2015 +0300
+
+    Minor refactoring
+
+ src/hb-private.hh | 44 ++++++++++++++++++++++++++++----------------
+ 1 file changed, 28 insertions(+), 16 deletions(-)
+
+commit ef79bdf73bbfde1bfaa222834809d105ab7755b3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:49:15 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 68e04afbb1e1073c47474f7a4d6d2cacf7057f6f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:30:28 2015 +0300
+
+    Typo
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 55553699b38d6481fbfacd0a32fc266e55553b34
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 16:29:08 2015 +0300
+
+    Minor
+
+ src/hb-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5175300fbaf4ff19b7d38c14c86331bb614b0390
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 12:50:01 2015 +0300
+
+    [layout] Fix comparison of GlyphID and hb_codepoint_t
+
+    Before, the IntType::cmp functions providing this and was truncating
+    the hb_codepoint_t to 16bits before comparison.  I have no idea how
+    this was never discovered, and I'm too lazy to try to reproduce this
+    with Pango (which uses non-16bit codepoint numbers for missing
+    glyphs).
+
+ src/hb-open-type-private.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 7cce809cb11e0ce65dbdab899779ece3dc337763
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 12:41:08 2015 +0300
+
+    Remove unused (and wrong as of a few commits ago) cmp() function
+
+ src/hb-open-type-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 8e3d4bae033bdec649676da26cfc3eb7610832a8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 12:31:59 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f47cf1f12dd1fa3cd3aa84502139caca9d469af8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Sat Feb 21 11:45:22 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 640b66c6348653bfd7cf88ea9caa2133c0eb949f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 17:30:05 2015 +0300
+
+    [layout] If lookup has only one subtable, move the forward loop down
+    to subtable
+
+    I was hoping to see a nice speedup, but it resulted in a very
+    minor one.
+
+ src/hb-ot-layout.cc | 33 ++++++++++++++++++++++++++++++++-
+ 1 file changed, 32 insertions(+), 1 deletion(-)
+
+commit e2f50f2a7ebf9882ea89dc3f0c740e7fce964e37
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 17:15:05 2015 +0300
+
+    [layout] Add apply_forward / apply_backward
+
+ src/hb-ot-layout.cc | 69
+ +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 46 insertions(+), 23 deletions(-)
+
+commit 1d4a328472f094c0d75a062f6e176c6b1875cfdc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 11:33:30 2015 +0300
+
+    [layout] Remove unneeded return value from apply()
+
+ src/hb-ot-layout.cc | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+commit bbdd6fd21cc2e079defff7cb17c3eb8eff3f9e09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 17:03:02 2015 +0300
+
+    Minor simpilfy BEInt
+
+ src/hb-open-type-private.hh | 25 ++-----------------------
+ 1 file changed, 2 insertions(+), 23 deletions(-)
+
+commit 88a399acdc0fcb060803da0e7db56de2866981e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 16:57:12 2015 +0300
+
+    Optimize IntType comparison to avoid branches for 16bit numbers
+
+ src/hb-open-type-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 37de2d533126245774417234e3536fcfb24f3a6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 16:55:51 2015 +0300
+
+    Minor simplify IntType
+
+ src/hb-open-type-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bd047d3b7f04d551c0a26bc0ce9b9d61481e34e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:47:18 2015 +0300
+
+    [layout] Minor
+
+ src/hb-ot-layout-gpos-table.hh | 6 ++++++
+ src/hb-ot-layout-gsub-table.hh | 6 ++++++
+ src/hb-ot-layout.cc            | 4 ++--
+ 3 files changed, 14 insertions(+), 2 deletions(-)
+
+commit b9d3f60520c022dc952e65a66eb138d1f7cae2e1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:42:41 2015 +0300
+
+    [layout] Minor
+
+ src/hb-ot-layout.cc | 15 ++++-----------
+ 1 file changed, 4 insertions(+), 11 deletions(-)
+
+commit 1a2322134a5d7bba990da28baf893b35879a5a7a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:40:23 2015 +0300
+
+    [layout] Don't check glyph props against lookup flags when recursing
+
+    Shouldn't be needed.  I have a hard time imagining this breaking any
+    legitimate use case.
+
+ src/hb-ot-layout-gpos-table.hh | 10 +---------
+ src/hb-ot-layout-gsub-table.hh | 10 +---------
+ 2 files changed, 2 insertions(+), 18 deletions(-)
+
+commit 095a1257cc3cc56b044b4cd842a92f0d0f933a50
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Feb 19 10:29:41 2015 +0300
+
+    [layout] Port sanitize() to use dispatch()
+
+    Needed some rework of Extension table.  Hopefully I got it right, and
+    the new template usage doesn't break any compilers...
+
+ src/hb-open-type-private.hh          |  5 ++-
+ src/hb-ot-layout-gpos-table.hh       | 82
+ +----------------------------------
+ src/hb-ot-layout-gsub-table.hh       | 72 ++-----------------------------
+ src/hb-ot-layout-gsubgpos-private.hh | 84
+ ++++++++++++------------------------
+ 4 files changed, 37 insertions(+), 206 deletions(-)
+
+commit 758fb20630f84c3d373cda37974b88f16c02995e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 18 13:45:03 2015 +0300
+
+    Remove unused macro
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 40c58923cbf689c465f9b65334c455a9b7f71ab0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 18 13:18:46 2015 +0300
+
+    [layout] Refactor Lookup::dispatch()
+
+ src/hb-ot-layout-common-private.hh   | 20 ++++++++++++++++++++
+ src/hb-ot-layout-gpos-table.hh       | 12 +-----------
+ src/hb-ot-layout-gsub-table.hh       | 12 +-----------
+ src/hb-ot-layout-gsubgpos-private.hh |  6 ------
+ 4 files changed, 22 insertions(+), 28 deletions(-)
+
+commit 70366f5d19df2e654f0933474fecf1aa16e27812
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 18 13:09:54 2015 +0300
+
+    [layout] Refactor get_subtable()
+
+ src/hb-ot-layout-common-private.hh | 12 ++++++++++++
+ src/hb-ot-layout-gpos-table.hh     |  4 ++--
+ src/hb-ot-layout-gsub-table.hh     |  6 +++---
+ 3 files changed, 17 insertions(+), 5 deletions(-)
+
+commit f72f326aea6d1e93f63040730f7aecd401676c1c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 19:18:07 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 8e36ccfd4f076888076ca176c055c18104af03b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 19:15:34 2015 +0300
+
+    [layout] Use dispatch() for add_coverage()
+
+ src/hb-ot-layout-gpos-table.hh       | 12 ++----------
+ src/hb-ot-layout-gsub-table.hh       | 12 ++----------
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++++++--
+ 3 files changed, 14 insertions(+), 22 deletions(-)
+
+commit 50b8dc79daffc7ef671dd5eedfea47f8d5e946f4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 18:14:17 2015 +0300
+
+    [layout] Add may_dispatch()
+
+    No functional change right now.
+
+ src/hb-ot-layout-gpos-table.hh       |  7 +++++++
+ src/hb-ot-layout-gsub-table.hh       |  6 ++++++
+ src/hb-ot-layout-gsubgpos-private.hh | 12 ++++++++++++
+ 3 files changed, 25 insertions(+)
+
+commit de2118ed7a998a1df9b28fd1be96b4af89ed82c3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 17:27:44 2015 +0300
+
+    Make sanitize() a const method
+
+    This makes a lot of code safer.  We only try modifying the object
+    in one
+    place, after making sure it's safe to do so.  So, do a const_cast<> in
+    that one place...
+
+ src/hb-open-file-private.hh          |  15 +++--
+ src/hb-open-type-private.hh          |  51 +++++++++++------
+ src/hb-ot-cmap-table.hh              |  35 ++++++++----
+ src/hb-ot-head-table.hh              |   6 +-
+ src/hb-ot-hhea-table.hh              |   3 +-
+ src/hb-ot-hmtx-table.hh              |   3 +-
+ src/hb-ot-layout-common-private.hh   |  58 ++++++++++++-------
+ src/hb-ot-layout-gdef-table.hh       |  30 ++++++----
+ src/hb-ot-layout-gpos-table.hh       | 108
+ +++++++++++++++++++++++------------
+ src/hb-ot-layout-gsub-table.hh       |  58 ++++++++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh |  65 +++++++++++++--------
+ src/hb-ot-layout-jstf-table.hh       |  12 ++--
+ src/hb-ot-maxp-table.hh              |   6 +-
+ src/hb-ot-name-table.hh              |   6 +-
+ 14 files changed, 296 insertions(+), 160 deletions(-)
+
+commit 6759ed95a3bec2874826376b68ebff19ba277ef2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 16:05:30 2015 +0300
+
+    Minor
+
+ src/hb-ot-layout-gpos-table.hh | 6 ++----
+ src/hb-ot-layout-gsub-table.hh | 6 ++----
+ 2 files changed, 4 insertions(+), 8 deletions(-)
+
+commit 6b599dac1f814a3c900300241d4c492a8f8b66d2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Tue Feb 17 16:04:07 2015 +0300
+
+    Remove unnecessary check in sanitize
+
+ src/hb-ot-layout-gpos-table.hh | 2 --
+ src/hb-ot-layout-gsub-table.hh | 2 --
+ 2 files changed, 4 deletions(-)
+
+commit 365576d246949f9d587e90cf0539dc0381e4d0a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:59:42 2015 +0100
+
+    [layout] Allocate iters in the context
+
+    Can be further optimized, but I think I didn't break anything.
+
+    Saves another 3% off Roboto shaping.
+
+ src/hb-ot-layout-gpos-table.hh       | 18 ++++++------------
+ src/hb-ot-layout-gsubgpos-private.hh | 21 +++++++++++++--------
+ src/hb-ot-shape-fallback.cc          |  2 +-
+ 3 files changed, 20 insertions(+), 21 deletions(-)
+
+commit 514564f5444b8ad2f210b1e3d7d66378f7275317
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:48:48 2015 +0100
+
+    [layout] Move skippy_iter setup from constructor into init()
+
+ src/hb-ot-layout-gpos-table.hh       | 18 ++++++++++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 28 +++++++++++++++-------------
+ src/hb-ot-shape-fallback.cc          |  3 ++-
+ 3 files changed, 29 insertions(+), 20 deletions(-)
+
+commit b051be542a8945ec14b0192bbc285f3e1a78c8f1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:40:39 2015 +0100
+
+    [lookup] Add skippy_iter.reset()
+
+    Towards reducing the cost of initializing skippy_iter()
+
+ src/hb-ot-layout-gpos-table.hh       | 18 ++++++++++++------
+ src/hb-ot-layout-gsubgpos-private.hh | 27 ++++++++++++++++++---------
+ src/hb-ot-shape-fallback.cc          |  3 ++-
+ 3 files changed, 32 insertions(+), 16 deletions(-)
+
+commit 2cecc38c7cf49b2cf697efa7e974ceee7055f2c5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:32:05 2015 +0100
+
+    [layout] Shuffle code around
+
+ src/hb-ot-layout-gsubgpos-private.hh | 111
+ ++++++++++++++++++-----------------
+ 1 file changed, 56 insertions(+), 55 deletions(-)
+
+commit 696266981df5ef6c62ad0115133dad1d6c1d9acc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:08:41 2015 +0100
+
+    [layout] Merge forward and backward iterators
+
+ src/hb-ot-layout-gpos-table.hh       | 12 +++---
+ src/hb-ot-layout-gsubgpos-private.hh | 71
+ ++++++++----------------------------
+ src/hb-ot-shape-fallback.cc          |  2 +-
+ 3 files changed, 23 insertions(+), 62 deletions(-)
+
+commit 1f038eec3c0dd6331036f795614fe1ddcbf613b0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 13:05:25 2015 +0100
+
+    [layout] Fix backward reject()
+
+    Has no functional effect since reject was never used with
+    match_glyph_data.
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 37d13acd8d414a4b53fac0152addfadecf755cd4
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 11:38:01 2015 +0100
+
+    [layout] Remove some unnecessary checks in skippy
+
+ src/hb-ot-layout-gpos-table.hh       | 3 ---
+ src/hb-ot-layout-gsubgpos-private.hh | 9 ++-------
+ 2 files changed, 2 insertions(+), 10 deletions(-)
+
+commit baa14e18148d3f5493f78b4fe9e0c835a01f50f7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Thu Jan 29 11:08:43 2015 +0100
+
+    [lookup] Don't initialize skippy if coverage match fails
+
+    Currently:
+
+      - Initializing skippy is very expensive,
+
+      - Our lookup accelerator (using set-digests) can be very ineffecite,
+
+    As such, we end up many times initializing skippy but then failing
+    coverage check.  Reordering fixes that.
+
+    When, later, we fix our accelerator to have truly small false-positive
+    rate (for example by using the frozen-sets), then we might want to
+    reorder these checks such that we wouldn't calculate coverage number
+    if skippy is going to fail.
+
+    This shows a 5% speedup with Roboto already.
+
+ src/hb-ot-layout-gpos-table.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 7788993bc19bf122f1e143ab64cc1da2ed1865a3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 23:01:12 2015 -0800
+
+    [layout] Use setter method to set c->lookup_props
+
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-ot-layout-gsub-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f4ee48fd7b312550faf9b0be4cd1b2f2849dd08d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 22:53:54 2015 -0800
+
+    [layout] Remove unused wrapper method
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 7b7129c7a997def599fb4d2ba05fda40d27aed20
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 21:46:07 2015 -0800
+
+    Add hb_frozen_set_t
+
+    I experimented with replacing use of hb_set_digest_t with this new
+    hb_frozen_set_t, hoping to get a huge speedup for busy lookups
+    (like kern lookup in Roboto), but I only got 6% speendup in Roboto
+    and 4% in NotoNastaliqUrduDraft :(.
+
+ src/hb-set-private.hh | 57
+ ++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 56 insertions(+), 1 deletion(-)
+
+commit 241eac9559465fa79f396570af4e87f455b7e9d5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 20:55:42 2015 -0800
+
+    Hide internals of lookup accelerators
+
+ src/hb-ot-layout-gsub-table.hh | 5 +++--
+ src/hb-ot-layout-private.hh    | 5 +++++
+ src/hb-ot-layout.cc            | 6 +++---
+ 3 files changed, 11 insertions(+), 5 deletions(-)
+
+commit e2d4e8480d85436a3acad8145acac345ed593f5a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 20:29:48 2015 -0800
+
+    [util] Add convenience "make lib" target
+
+ util/Makefile.am | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit faaae64bf28abdcdd15185374bc09a3809794118
+Merge: 7888a6b 9768e65
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Feb 25 15:34:34 2015 -0800
+
+    Merge pull request #85 from KonstantinRitt/define_inline
+
+    Fix build with MSVC on CE
+
+commit 9768e651be0561f07d6f38c3ed8bc5ee04882990
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:   Sat Feb 14 00:58:51 2015 +0400
+
+    Fix build with MSVC on CE
+
+    This code is C++ only. There isn't a single C++ compiler that fails to
+    understand the "inline" keyword, since it's required by C++98. Any
+    compiler older than C++98 is likely to choke on the template usage
+    further down, so this isn't necessary.
+
+    Moreover, the C++ standard says you cannot define macros.
+    [lib.macro.names] says "Nor shall such a translation unit define
+    macros
+    for names lexically identical to keywords." -- technically, it's a
+    promise that the Standard Library headers won't do it, the wording
+    means
+    that the entire translation unit won't do it, which implies no source
+    can do it.
+
+    MSVC complains about it:
+    fatal error C1189: #error : The C++ Standard Library forbids
+    macroizing
+    keywords. Enable warning C4005 to find the forbidden macro.
+
+    Author: Thiago Macieira <thiago.macieira@intel.com>
+
+ src/hb-private.hh | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+commit 7888a6b07a9922cedd3e0d235959058e0011357b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 12:40:40 2015 -0800
+
+    [ft] Handle negative scales with vertical writing
+
+ src/hb-ft.cc | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 982d94eaa2a377616f22f39427e5ed9f1ce43263
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 10:51:33 2015 -0800
+
+    [coretext] Don't generate notdef glyph for default-ignorables
+
+    As discovered on Chrome Mac:
+    https://code.google.com/p/chromium/issues/detail?id=452326
+
+ src/hb-coretext.cc | 2 ++
+ src/hb-ot-shape.cc | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit 6917a045fd8d16952cad75fda8b291b11e1d3564
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:   Wed Jan 28 10:43:32 2015 -0800
+
+    [coretext] Unbreak glyph positioning in presence of notdef runs
+
+    As discovered on Chrome Mac:
+    https://code.google.com/p/chromium/issues/detail?id=452326
+
+    This was originally broken in:
+
+       commit 5a0eed3b50629be4826e4e9428f2c3255195395d
+       Author: Behdad Esfahbod <behdad@behdad.org>
+       Date:   Mon Aug 11 23:47:16 2014 -0400
+
+           [coretext] Implement vertical shaping
+
+ src/hb-coretext.cc | 35 +++++++++++++++++++++++++++--------
+ 1 file changed, 27 insertions(+), 8 deletions(-)
+
+commit 1eff4350239b0768e1042b52db9fb1c0d266f96a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Jan 27 12:26:04 2015 -0800
+
+    Minor optimization
+
+ src/hb-ot-shape-normalize.cc | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 675956aca01fc4e005a338af43d1c1f4f938abd1
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:  Tue Jan 27 11:23:07 2015 +0400
+
+    Do not leak hb_language_t on hb_language_item_t destruction
+
+ src/hb-common.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b306f9674a599da50754d24fa5aefcb6bba04420
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:  Tue Jan 27 20:08:41 2015 +0400
+
+    Minor improvement to HB_SHAPER_DATA_DESTROY
+
+ src/hb-shaper-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 61820bc4ca1f02433db4be7c81f27cf97e2bd519
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Jan 26 14:25:52 2015 -0800
+
+    [API] Add hb_buffer_add_latin1()
+
+    This is by no ways to promote non-Unicode encodings.  This is an entry
+    point that takes Unicode codepoints that happen to all be the first
+    256 characters and hence fit in 8bit strings.  This is useful eg
+    in Chrome
+    where strings that can fit in 8bit are implemented that way, and this
+    avoids copying into UTF-8 or UTF-16.
+
+    Perhaps we should rename this to hb_buffer_add_codepoints8().
+    I'm also
+    curious if anyone would be really interested in
+    hb_buffer_add_codepoints16().
+
+    Please discuss!
+
+ src/hb-buffer.cc      | 36 +++++++++++++++++++++++++-------
+ src/hb-buffer.h       |  8 ++++++++
+ src/hb-utf-private.hh | 57
+ ++++++++++++++++++++++++++++++++++++++-------------
+ 3 files changed, 80 insertions(+), 21 deletions(-)
+
+commit 78c6e86c04f12154c88b9f9264d0bd50b721699b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Jan 26 14:08:36 2015 -0800
+
+    Fix hb_buffer_add_codepoints to actually NOT validate
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 70c25ee215635db23eb0757641bd372940c0d85d
+Merge: 28f5e0b f3537b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Jan 25 13:06:03 2015 -0800
+
+    Merge pull request #81 from KonstantinRitt/fixes/build/win8phone
+
+    winrt_buildfixes
+
+commit f3537b620b0a7392ea27f01f465c5ba79459c858
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:  Sun Jan 25 09:50:51 2015 +0400
+
+    Move some code around
+
+    Just to keep Windows specific workarounds in a single place.
+
+ src/hb-private.hh | 25 ++++++++++++-------------
+ 1 file changed, 12 insertions(+), 13 deletions(-)
+
+commit afb62d88d78cacb6b881aaf329a654fd32f5ae29
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:  Sun Jan 25 08:16:26 2015 +0400
+
+    Do not define MemoryBarrier on WinCE
+
+    There is a _HBMemoryBarrier() wrapper function that emulates
+    MemoryBarrier() behavior when it is not defined.
+
+ src/hb-private.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 7db326a15b173c0d101adc608bf551a628c65dcd
+Author: Konstantin Ritt <ritt.ks@gmail.com>
+Date:  Sun Jan 25 08:13:24 2015 +0400
+
+    Fix build on WinRT
+
+    There is no environment (like WinCE) and the basic version
+    of InitializeCriticalSection is unsupported.
+
+    https://codereview.qt-project.org/#/c/92496/
+
+ src/hb-mutex-private.hh | 4 ++++
+ src/hb-private.hh      | 2 ++
+ 2 files changed, 6 insertions(+)
+
+commit 28f5e0b2f41670617bd778660364bbd58b1b68f2
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Jan 23 12:45:35 2015 -0800
+
+    0.9.38
+
+ NEWS        | 23 +++++++++++++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 24 insertions(+), 1 deletion(-)
+
+commit a319d0777b746a2bbe5cd5a206172f1580da3379
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Jan 23 12:44:24 2015 -0800
+
+    [ft] Handle negative x_scale / y_scale
+
+ src/hb-ft.cc | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+commit b0b38bb892473d9a65e06dd3b4713da39f92bef9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Jan 21 19:19:33 2015 -0800
+
+    [coretext] Fix positioning of notdef
+
+ src/hb-coretext.cc | 19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+commit 70622e5089c01ea16fd9deed11cb39d43145c121
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Jan 21 18:50:57 2015 -0800
+
+    [coretext] Fix scaling
+
+    Before we were not accounting for possible differences in x_scale and
+    y_scale, as well as the signs of those.  All should be in good shape
+    now.
+
+ src/hb-coretext.cc | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+commit 221ba02b0816584a02471037edae7cec9c1b8acc
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Jan 21 16:42:09 2015 -0800
+
+    [coretext] Use vertical advance for notdef in vertical direction
+
+ src/hb-coretext.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit 7988da24c507ee310772f72cc5bcfd3c0a1187a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Jan 21 18:33:50 2015 -0800
+
+    Add convenience make target "make lib" in src/
+
+ src/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 31d48dd919e3b4a0bec5ede384f76db9b44f4d71
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Jan 21 01:57:44 2015 -0800
+
+    Add README.python
+
+ README.python | 26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+commit ca1c2813dd0b082a8c418bd3edd3f6cba97bd5f0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Jan 21 01:51:48 2015 -0800
+
+    [bindings] Add README.python
+
+ Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit cd4eb96abb90a84b42e9b288e39bad759e4411a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Jan 20 12:30:45 2015 -0800
+
+    [util] Add --font-size to hb-shape
+
+    Also makes hb-view to use 8 bits of subpixel precision and shape at
+    requested size, instead of always shaping at upem and scaling results.
+
+ util/hb-ot-shape-closure.cc | 2 +-
+ util/hb-shape.cc           |  2 +-
+ util/hb-view.cc            |  5 ++++-
+ util/helper-cairo.cc       | 16 ++++++++--------
+ util/helper-cairo.hh       |  5 ++---
+ util/main-font-text.hh      | 4 ++--
+ util/options.cc            | 44
+ +++++++++++++++++++++++++++++++++++++++++---
+ util/options.hh            | 16 ++++++++++++----
+ util/view-cairo.cc         |  2 +-
+ util/view-cairo.hh         |  8 ++++----
+ 10 files changed, 76 insertions(+), 28 deletions(-)
+
+commit 5789ca69d7464bab5fa0c5bdf404f3afaa490faf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Jan 9 14:22:01 2015 -0800
+
+    [util] Minor
+
+ util/options.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 67dfa8c7c2f2e9040a9c60c680f739ada4a35fb5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Jan 19 17:00:31 2015 -0800
+
+    When matching second glyph of kerning pairs, use bsearch
+
+    Roboto has glyphs (like 'F') that have 200 kerning pairs.
+    Add a handcoded bsearch instead of previous linear search.
+
+    This doesn't show much speedup though, apparently we spend the
+    bulk of the time somewhere before here.
+
+ src/hb-ot-layout-gpos-table.hh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit e9f5c65be027eb7759ab819e267e24dff3b017b6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Jan 19 14:42:11 2015 -0800
+
+    [bindings] Minor
+
+ src/sample.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 3704628d1f124234324b5f2bdd5fdd61c14c7801
+Merge: 1aaa7d6 5eb939d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Jan 19 16:15:00 2015 -0800
+
+    Merge pull request #77 from roozbehp/master
+
+    Change New Tai Lue shaping engine from SEA to default
+
+commit 5eb939ddfe9ef217da2e48d7d0f1f4b7501714ad
+Author: Roozbeh Pournader <roozbeh@google.com>
+Date:  Sun Jan 18 14:30:08 2015 -0800
+
+    Change New Tai Lue shaping engine from SEA to default
+
+    This is to reflect the UTC decision to change the encoding model of
+    New Tai Lue from logical to visual to be similar to Thai, Lao, and
+    Tai Viet: http://www.unicode.org/L2/L2014/14250.htm#141-C26
+
+    The visual encoding is already the current practice of encoding New
+    Tai Lue on the web anyway:
+    http://www.unicode.org/L2/L2014/14195-newtailue.txt
+
+    Fixes behdad/harfbuzz#66.
+
+ src/hb-ot-shape-complex-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1aaa7d6799b42b392dd191d3c12011721ef99e74
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sat Jan 17 20:16:56 2015 -0800
+
+    [indic] Fix out-of-bounds access
+
+ src/gen-indic-table.py                        |  2 +-
+ src/hb-ot-shape-complex-indic-table.cc | 36
+ +++++++++++++++++-----------------
+ 2 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 238d6a38f2ceb7d8dceec9365a823f032b3b9f7d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Jan 7 10:51:44 2015 -0800
+
+    [bindings] Update sample.py
+
+ src/sample.py | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 2cd5323531dcd800549b2cb1cb51d708e72ab2d8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Jan 6 19:16:38 2015 -0800
+
+    [bindings] Use hb_glib_blob_create() in sample
+
+    hb_blob_create() is considered C-only API.
+
+ src/hb-blob.cc |  8 ++++----
+ src/sample.py | 19 +++++++++----------
+ 2 files changed, 13 insertions(+), 14 deletions(-)
+
+commit 0ef179e2dc040c13497af847b8c1cec846dbdbf9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Jan 6 16:58:33 2015 -0800
+
+    [glib] Add hb_glib_blob_create() that takes GBytes
+
+ src/hb-glib.cc | 11 +++++++++++
+ src/hb-glib.h |  3 +++
+ 2 files changed, 14 insertions(+)
+
+commit b91904a40da6287f84bc79de60674fa57232ec09
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Jan 6 15:43:14 2015 -0800
+
+    [bindings] Replace deprecated allow-none with optional and nullable
+
+ src/hb-blob.cc    | 4 ++--
+ src/hb-shape.cc   | 2 +-
+ src/hb-unicode.cc | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 81a31f3eff44a85bb2160d51156a01a18f0a97df
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Jan 6 15:37:31 2015 -0800
+
+    [bindings] Make sample Python 2/3 compatible
+
+ src/sample.py | 15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+commit b632e7997d9cb6e4782cab6d8c62e8e5edaa4cb0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Jan 6 14:05:26 2015 -0800
+
+    Fix up gobject-introspection a bit
+
+    Minimal shaping works now!
+
+ src/hb-blob.cc   |  6 +++---
+ src/hb-buffer.cc |  2 +-
+ src/sample.py   | 34 ++++++++++++++++++++++++++++------
+ 3 files changed, 32 insertions(+), 10 deletions(-)
+
+commit 3d1a666a8629a8502a2bcf23ab943e2b39a0da92
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Jan 5 14:43:13 2015 -0800
+
+    Remove hardcoded ICU include paths.
+
+    ICU exports them using LOCAL_EXPORT_C_INCLUDE_DIRS.
+
+    https://android-review.googlesource.com/#/c/121311/
+
+ Android.mk | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8cb41cb9508eb1bb6319e92f900cfe5e8a131be3
+Merge: 365c03f fb85d61
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Jan 4 20:32:18 2015 -0800
+
+    Merge pull request #76 from cpeterso/cpeterso/Wunused-function
+
+    Add #ifdef HB_USE_ATEXIT to fix -Wunused-function warnings
+
+commit fb85d618f5883458bacf0ecb0894772291a2d738
+Author: Chris Peterson <cpeterson@mozilla.com>
+Date:  Sun Jan 4 19:31:10 2015 -0800
+
+    Add #ifdef HB_USE_ATEXIT to fix -Wunused-function warnings
+
+ src/hb-common.cc | 2 +-
+ src/hb-ft.cc    | 4 +++-
+ src/hb-shape.cc  | 4 +++-
+ src/hb-shaper.cc | 4 +++-
+ 4 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 365c03fc2bcdb4098314a0e123c46018fb882586
+Merge: c36c4a9 d1897a9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sat Jan 3 21:55:30 2015 -0800
+
+    Merge pull request #75 from cpeterso/cpeterso/Wunused-value
+
+    Fix hb_atomic_ptr_cmpexch -Wunused-value warnings
+
+commit d1897a98d8da40cffb57c07099a9a93cfeaacc36
+Author: Chris Peterson <cpeterson@mozilla.com>
+Date:  Sat Jan 3 19:46:19 2015 -0800
+
+    Fix hb_atomic_ptr_cmpexch -Wunused-value warnings
+
+ src/hb-common.cc | 2 +-
+ src/hb-icu.cc   | 4 +---
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+commit c36c4a9924609df648e62e47fa017b19b844fd98
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Jan 2 14:09:23 2015 -0800
+
+    Add missing va_end()
+
+    Fixes https://github.com/behdad/harfbuzz/pull/74
+
+ util/options.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f34aaba8687a20794835e2dc878c52d1b53e6f85
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Dec 28 18:56:15 2014 -0800
+
+    [ft] Don't set font ppem
+
+    For discussion see:
+
+      http://lists.freedesktop.org/archives/harfbuzz/2012-April/001905.html
+
+    Over time we have had added NO_HINTING all over the place in hb-ft.
+    Finish it off.
+    Not setting ppem on hb-font disables get_contour_point() calls which
+    is good anyway.
+
+    See comments in the commit.
+
+ src/hb-ft.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit 350f3a02ce225e5d78db8ac96de1351ff9f96dd5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Dec 28 17:44:26 2014 -0800
+
+    [ft] Add hb_ft_face_create_referenced() and
+    hb_ft_font_create_referenced()
+
+    When I originally wrote hb-ft, FreeType objects did not support
+    reference
+    counting.  As such, hb_ft_face_create() and hb_ft_font_create() had a
+    "destroy" callback and client was responsible for making sure
+    FT_Face is
+    kept around as long as the hb-font/face are alive.
+
+    However, since this was not clearly documented, some clienets didn't
+    correctly did that.  In particular, some clients assumed that
+    it's safe
+    to destroy FT_Face and then hb_face_t.  This, indeed, used to work,
+    until
+    45fd9424c723f115ca98995b8f8a25185a6fc71d, which make face destroy
+    access
+    font tables.
+
+    Now, I fixed that issue in 395b35903e052aecc97d0807e4f813c64c0d2b0b
+    since
+    the access was not needed, but the problem remains that not all
+    clients
+    handle this correctly.  See:
+
+      https://bugs.freedesktop.org/show_bug.cgi?id=86300
+
+    Fortunately, FT_Reference_Face() was added to FreeType in 2010,
+    and so we
+    can use it now.  Originally I wanted to change hb_ft_face_create() and
+    hb_ft_font_create() to reference the face if destroy==NULL was
+    passed in.
+    That would improve pretty much all clients, with little undesired
+    effects.
+    Except that FreeType itself, when compiled with HarfBuzz support,
+    calls
+    hb_ft_font_create() with destroy==NULL and saves the resulting
+    hb-font on
+    the ft-face (why does it not free it immediately?).  Making hb-face
+    reference ft-face causes a cycling reference there.  At least,
+    that's my
+    current understanding.
+
+    At any rate, a cleaner approach, even if it means all clients will
+    need a
+    change, is to introduce brand new API.  Which this commit does.
+
+    Some comments added to hb-ft.h, hoping to make future clients
+    make better
+    choices.
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=75299
+
+ configure.ac |  4 ++--
+ src/hb-ft.cc | 32 ++++++++++++++++++++++++++++++++
+ src/hb-ft.h  | 59
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 3 files changed, 92 insertions(+), 3 deletions(-)
+
+commit 9a3b74884b2e41c7040611030f4336f13d18fd3e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Dec 28 17:27:39 2014 -0800
+
+    Remove redundant check for FT_Face_GetCharVariantIndex
+
+    We require FreeType >= 2.8.3.  This symbol was introduced earlier
+    than that.
+
+ configure.ac | 9 +--------
+ src/hb-ft.cc | 2 --
+ 2 files changed, 1 insertion(+), 10 deletions(-)
+
+commit 1226b2e930aa456cc05bbe621c96f4286a95cff6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Dec 28 17:04:23 2014 -0800
+
+    Fix FreeType version check
+
+ configure.ac | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit affacf2f37db767ab8df7f2db6cd9e0e9b0a2b8a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Dec 28 16:20:31 2014 -0800
+
+    [ft] Open blob in READONLY mode
+
+    HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE is deprecated and fairly
+    useless now.
+
+ src/hb-ft.cc | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit 395b35903e052aecc97d0807e4f813c64c0d2b0b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Sun Dec 28 16:03:26 2014 -0800
+
+    Avoid accessing layout tables at face destruction
+
+    "Fixes" https://bugs.freedesktop.org/show_bug.cgi?id=86300
+
+    Based on discussion someone else who had a similar issue, most
+    probably
+    the user is releasing FT_Face before destructing hb_face_t /
+    hb_font_t.
+    While that's a client bug, and while we can (and should) use FreeType
+    refcounting to help avoid that, it happens that we were accessing
+    the table when we didn't really have to.  Avoid that.
+
+ src/hb-ot-layout-private.hh               | 3 +--
+ src/hb-ot-layout.cc                       | 4 ++--
+ src/hb-ot-shape-complex-arabic-fallback.hh | 2 +-
+ 3 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 7d5e7613ced3dd39d05df83ca7e8952cbecd68f6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Dec 18 18:22:21 2014 -0800
+
+    Fail blob creation if length overflows or is too large
+
+    Fail if blob start plus length overflows; or if blob length
+    is greater than 2GB.  It takes a while for fonts to get to that
+    size.  In the mean time, it protects against bugs like this:
+
+      http://www.icu-project.org/trac/ticket/11450
+
+    Also avoids some weird issues with 32bit vs 64bit systems
+    as we accept length as unsigned int.  As such, a length of
+    -1 will cause overflow on 32bit machines, but happily
+    accepted on a 64bit machine.  Avoid that.
+
+ src/hb-blob.cc       | 5 ++++-
+ test/api/test-blob.c | 3 +++
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+commit d5a5052098b0aa79ff55c235e61a9db477c4120f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Dec 18 18:09:41 2014 -0800
+
+    Assert that blob length doesn't overflow address.
+
+    This will crash now, if blob was created with wrong length.
+    Check for that coming next commit.
+
+ src/hb-open-type-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 66e37409b3bc1eddc86704ae26d9176677ce6aa6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Dec 17 12:09:17 2014 -0800
+
+    0.9.37
+
+ NEWS        | 8 ++++++++
+ configure.ac | 2 +-
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+commit 093c520de506aec74f3fb1e195c0ca85813424dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 21:07:53 2014 -0800
+
+    [otlayout] Mark variables that are C arrays as opposed to OT::ArrayOf
+
+ src/hb-ot-layout-gpos-table.hh       | 24 +++++++--------
+ src/hb-ot-layout-gsubgpos-private.hh | 60
+ ++++++++++++++++++------------------
+ 2 files changed, 42 insertions(+), 42 deletions(-)
+
+commit 9df0a520306a491f973d42965597bfda6023e508
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 20:54:28 2014 -0800
+
+    [otlayout] Avoid invalid access with Context format 3
+
+ src/hb-ot-layout-gsubgpos-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 295ef1dd5229f47d8e0eb5b4eb48c90a6b470073
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 20:43:18 2014 -0800
+
+    [ot] Debug get_coverage
+
+ src/hb-ot-layout-gsubgpos-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 00f6a8e334ec4c586e4e633a95b411ccb50306d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 20:36:49 2014 -0800
+
+    [ot] Print format in dispatch trace
+
+ src/hb-ot-layout-gpos-table.hh       | 16 ++++++++--------
+ src/hb-ot-layout-gsub-table.hh       | 14 +++++++-------
+ src/hb-ot-layout-gsubgpos-private.hh |  8 ++++----
+ 3 files changed, 19 insertions(+), 19 deletions(-)
+
+commit 5c7d6f02d71362c2b192a7d96e6181977682921c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 20:28:49 2014 -0800
+
+    Minor
+
+ src/hb-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 153beebba9b76901b8b62b90ba0dc69462ae2090
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 19:46:09 2014 -0800
+
+    [ot] Make sure all toplevel tables have tableTag
+
+ src/hb-open-file-private.hh | 2 ++
+ src/hb-ot-hhea-table.hh     | 2 ++
+ src/hb-ot-hmtx-table.hh     | 2 ++
+ 3 files changed, 6 insertions(+)
+
+commit 282b13f9b4d86b091714de7fbddc94b3e3ff3d91
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 19:32:46 2014 -0800
+
+    [sanitize] Improve debug output some more
+
+ src/hb-open-type-private.hh | 30 ++++++++++++++++--------------
+ 1 file changed, 16 insertions(+), 14 deletions(-)
+
+commit 0766ee1f4e6046598a2e8fb1b167c3942b4a87a0
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Dec 12 18:23:20 2014 -0800
+
+    [sanitize] Improve debug output
+
+ src/hb-open-type-private.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit e6f80fa1044243898c402ec6a59d6c1b5420be53
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Dec 10 12:05:24 2014 -0800
+
+    [indic] Allow ZWJ/ZWNJ before SM
+
+    In Oriya, a ZWJ/ZWNJ might be added before candrabindu to encourage
+    or stop ligation of the candrabindu.  This is clearly specified in
+    the Unicode section on Oriya.  Allow it there.  Note that Uniscribe
+    doesn't allow this.
+
+    Micro tests added using Noto Sans Oriya draft.
+
+    No changes in numbers.  Currently at:
+
+    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: 1048147 out of 1048334 tests passed. 187 failed
+    (0.0178378%)
+    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-machine.rl                |   2 +-
+ test/shaping/Makefile.am                                |   1 +
+ .../sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf | Bin 0 ->
+ 4720 bytes
+ test/shaping/fonts/sha1sum/MANIFEST                     |   1 +
+ test/shaping/tests/MANIFEST                             |   1 +
+ test/shaping/tests/indic-joiner-candrabindu.tests       |   2 ++
+ 6 files changed, 6 insertions(+), 1 deletion(-)
+
+commit c0e95abc5f3f14121483b71f10837828a3a1d73a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Nov 20 14:42:24 2014 -0800
+
+    0.9.36
+
+ NEWS        | 12 ++++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit fde3e4a423871463c883cb969e99c29cb6f69f6b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 29 11:23:08 2014 -0700
+
+    In hb_ot_collect_glyphs(), don't recurse to a lookup more than once
+
+    Otherwise, we might process a lookup thousands of times, with no
+    benefit.  This pathological case was hit by Noto Nastaliq Urdu Draft
+    in Firefox's code to determine whether space glyph is involved in
+    any GSUB/GPOS rules.  A test page is at http://behdad.org/urdu
+
+    See:
+    https://bugzilla.mozilla.org/show_bug.cgi?id=1090869
+
+ src/hb-ot-layout-gsubgpos-private.hh | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 5a5640d8506ccfc99fd119e89e829170d1fea421
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Oct 14 21:26:13 2014 -0700
+
+    Move code around
+
+ src/hb-open-type-private.hh | 50
+ ++++++++++++++++++++++-----------------------
+ 1 file changed, 25 insertions(+), 25 deletions(-)
+
+commit 666b42f73bd1f516657b206ef738108825bf239f
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Oct 14 21:24:59 2014 -0700
+
+    Move macros around
+
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=84491
+
+ src/hb-open-type-private.hh | 63
+ ++++++++++++++++++++++++++++++++++++++-------
+ src/hb-private.hh          | 41 -----------------------------
+ src/hb-uniscribe.cc        |  6 +++++
+ 3 files changed, 60 insertions(+), 50 deletions(-)
+
+commit 5c87120b8178566ddae99d9825edc24f9b87ea3d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Tue Oct 14 20:07:31 2014 -0700
+
+    Fix misc warnings
+
+    Fixes https://github.com/behdad/harfbuzz/pull/51
+
+ src/hb-buffer-deserialize-json.rl | 4 ++--
+ src/hb-ot-layout-gsub-table.hh    | 2 +-
+ src/hb-private.hh                | 6 +++---
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit a1f27ac3c48cfe6d532dc422cf256952fea472ed
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Oct 2 16:54:33 2014 -0400
+
+    Update test expectation for previous commit
+
+ test/shaping/tests/arabic-fallback-shaping.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8afaf096870d7895cf2fffb6438b02c0ad1b6c52
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Oct 2 16:40:41 2014 -0400
+
+    [ft] Add NO_HINTING in a couple other places
+
+ src/hb-ft.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 7228011411f0e490ad1ba9894dd0d576823903ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 18:58:43 2014 -0400
+
+    [travis] Fix clang again
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 406a020e5228d4a04da6282f5a75165bab7a483e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 18:54:55 2014 -0400
+
+    [travis] Fail build if coveralls fails
+
+ .travis.yml | 15 ++-------------
+ 1 file changed, 2 insertions(+), 13 deletions(-)
+
+commit a8aa20260dbd9af9cbcc7d545fa8b41b07aae276
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 18:48:40 2014 -0400
+
+    [travis] Only run coveralls under gcc
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 5de0407337d630117e424b7c715b7cbd432f4ef9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 18:18:25 2014 -0400
+
+    Help clang with gcov
+
+ src/check-defs.sh    | 2 +-
+ src/check-symbols.sh | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit ef40ca8e5e830231539dc61088b58e907a840629
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 18:07:27 2014 -0400
+
+    [travis] Try to make coverage work with clang
+
+ .travis.yml | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 52784da17b7278f2587168234878bb15d918c9fe
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:57:43 2014 -0400
+
+    [travis] Minor
+
+ README | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit f2c9005f5123c7f9b227fd9ac9a3438c5fe4cf47
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:45:17 2014 -0400
+
+    Add README.md symlink to make github happy
+
+ README.md | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 40987e8aaca4155d9cff211549e8d23f24c334e5
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:44:30 2014 -0400
+
+    [travis] Re-enable clang
+
+ .travis.yml | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit 5400ac476e5a5bcc66559fcfb05a683a6b433ea1
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:41:41 2014 -0400
+
+    Add build and coverage status links
+
+ README | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 19360e0a5609c65842a989587b01a4dc7c9eae36
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:35:03 2014 -0400
+
+    [travis] Report matrix settings to help debugging
+
+ .travis.yml | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 9b89fc52f49b80df1f27ac7de69e0152bdcc94d6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:20:31 2014 -0400
+
+    [travis] More coveralls
+
+ .travis.yml | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit a68f2b62c1f24009993911b1dbcb76b821e58c51
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:05:58 2014 -0400
+
+    [travis] Give coveralls a hand
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5194d647e13aa5ba2cfcdbdcd4a659dc5bd11418
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 17:03:26 2014 -0400
+
+    [travis] Disable clang for now
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 715f27f85f97fee13b119f60037db5c139489ee6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 16:53:00 2014 -0400
+
+    [test] Fixup test
+
+ test/shaping/tests/hangul-jamo.tests | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+commit 2a508ddae5de3852243725ce22caa3dcffccb83e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 16:49:22 2014 -0400
+
+    [travis] Another try at coveralls.io
+
+ .travis.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit dfe8078e5be46cab5e67aed977749c1d6725e6a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 16:38:47 2014 -0400
+
+    [travis] First try to hookup coveralls.io code coverage tracking
+
+ .travis.yml | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 1b387571e4d0eed883f1ae8ec85cf0e818b4a7f9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 16:14:59 2014 -0400
+
+    [travis] Unbreak
+
+ .travis.yml | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+commit e281ed360dfdf803aea87b6078983867d08e07a7
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 16:09:08 2014 -0400
+
+    [travis] Minor
+
+ .travis.yml | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+commit c0b82ba32a1987902a3b9c05b46f8be6b121883a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 14:24:07 2014 -0400
+
+    Create ragel-generated files in srcdir
+
+ src/Makefile.am | 25 ++++++++++---------------
+ 1 file changed, 10 insertions(+), 15 deletions(-)
+
+commit 79bbb10b0da49ace763a50f259c2ea687143f7ea
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 13:33:21 2014 -0400
+
+    Clean ragel-generated headers in maintainercleanfiles
+
+ src/Makefile.am | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 8971cac83eb4f06847abfa3eaa15857d27141810
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 12:41:03 2014 -0400
+
+    Don't use tmp files in Makefile
+
+    Useful for code-coverage generation of the ragel-generated files
+    as they will now contain the correct .hh filename in them.
+
+ src/Makefile.am | 27 +++++++++++++--------------
+ 1 file changed, 13 insertions(+), 14 deletions(-)
+
+commit 22723186652224a635f1dad5cda0f753e78c301d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 11:56:07 2014 -0400
+
+    check-static-inits: Filter out zero-length sections
+
+    When compiling with -O0, zero-sized constructors were showing up
+    and confusing the test.
+
+ src/check-static-inits.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b695a3dc2300ed970a4154ad8b997407b3cb4faf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 11:55:14 2014 -0400
+
+    check-static-inits: check for static finalizers
+
+ src/check-static-inits.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 250398b1e4f102e4e44eeb9e2aebf0cd2d397344
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 11:28:01 2014 -0400
+
+    Hide other bubble-sort
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c1e87442621beff98791ce56cfd1ccee506c4ee6
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Oct 1 11:07:08 2014 -0400
+
+    Hide bubble-sort!
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 80f77282264afb1356351024b1f062b2824bba3b
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Sep 25 17:59:46 2014 +0300
+
+    [util] Fix ansi output when surface is empty
+
+ util/helper-cairo-ansi.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 156852991e18e5ac256ee4d6b2916931cc274977
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Sep 25 17:45:49 2014 +0300
+
+    [ot-font] Add hb_ot_face_cmap_accelerator_t
+
+ src/hb-ot-font.cc | 113
+ +++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 66 insertions(+), 47 deletions(-)
+
+commit d088ccaf11d9475fe0d269ce130b1793b8a1ffbf
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Sep 25 17:26:56 2014 +0300
+
+    [ot-font] Minor
+
+ src/hb-ot-font.cc | 23 ++++++++++++-----------
+ 1 file changed, 12 insertions(+), 11 deletions(-)
+
+commit d7c160a1530adabbcf33725b105072293115a34c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Sep 25 17:15:35 2014 +0300
+
+    [ot-font] Handle missing vertical metrics tables
+
+ src/hb-ot-font.cc | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+commit be1cca270257bfdfee3fbe821175269713acf408
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Sep 25 16:53:24 2014 +0300
+
+    [ot-font] Add metrics_accel_t
+
+ src/hb-ot-font.cc      | 111
+ ++++++++++++++++++++++--------------------------
+ src/hb-ot-hhea-table.hh |   2 +-
+ src/hb-ot-hmtx-table.hh |   4 +-
+ 3 files changed, 54 insertions(+), 63 deletions(-)
+
+commit d41b809e9d21e655129a97c600d28f278fd7e62c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Sep 25 13:04:08 2014 +0300
+
+    [ot-font] Start adding vertical support
+
+ src/hb-ot-font.cc      | 57 ++++++++++++++++++++++++++++++++++----------
+ src/hb-ot-hhea-table.hh | 63
+ ++++++++++++++++++++++++++-----------------------
+ src/hb-ot-hmtx-table.hh | 35 +++++++++++++++++----------
+ 3 files changed, 100 insertions(+), 55 deletions(-)
+
+commit 22f0de5025aeeef4c8b3ca876d291d4c8e558d94
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Aug 25 12:54:57 2014 -0400
+
+    Fix build
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d457e3f0ff9b27616a34e4cc110d3edbf8796841
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Aug 25 12:31:19 2014 -0400
+
+    [arabic] Don't #include __FILE__
+
+    Fine!
+
+    https://code.google.com/p/chromium/issues/detail?id=406957
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9ceb673d9c35bb28c9b2ed5359bdd8b23fda0019
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Mon Aug 25 11:48:12 2014 -0400
+
+    [arabic] Allow disabling win1256 fallback code
+
+    By defining HB_NO_WIN1256.
+
+ src/hb-ot-shape-complex-arabic-fallback.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8a9319502141c09695461c386e54f998250420e9
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Aug 22 12:06:57 2014 -0400
+
+    [ot] Prefer Windows platform cmap tables / accept all Unicode
+    encodingIDs
+
+    Some fonts on the Mac ship with (0,1).
+
+ src/hb-ot-font.cc | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+commit 270971a0fccdf4964fd3e8ab8e5cf53037a3518d
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Fri Aug 15 14:28:04 2014 -0400
+
+    [win32] Avoid preprocessor warnings re macros
+
+ src/hb-private.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 8c6bd34d38fb3007c3d660fce0095cc5c7e9962e
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 13:33:37 2014 -0400
+
+    Fix check-symbols on OS X
+
+ src/check-libstdc++.sh | 14 +++++++-------
+ src/check-symbols.sh  |  8 +++++++-
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+commit 522b1cc5261c1419166bfb90d2ff634b684be66a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 13:29:30 2014 -0400
+
+    [coretext] Hide feature_mappings
+
+ src/hb-coretext.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0d2c2f238bf0a847ecd55a70cc0f081f18a053ac
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 13:25:55 2014 -0400
+
+    Simplify hb-object
+
+ src/hb-object-private.hh | 118
+ +++++++++++++++--------------------------------
+ 1 file changed, 36 insertions(+), 82 deletions(-)
+
+commit 9d861b81f349188a4507350398786a6e94038095
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 13:15:21 2014 -0400
+
+    Really fix clang build this time
+
+ src/hb-object-private.hh | 141
+ +++++++++++++++++++++++------------------------
+ 1 file changed, 68 insertions(+), 73 deletions(-)
+
+commit 272226f294382b0c6921b36e0e67fc53daa765d3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 13:11:33 2014 -0400
+
+    Revert "Fix build on clang after previous commit"
+
+    This reverts commit 9c80cbc87f23040a334e30c750f64523d9ef10c8.
+
+ src/hb-object-private.hh | 34 +++++++++++++---------------------
+ 1 file changed, 13 insertions(+), 21 deletions(-)
+
+commit 9c80cbc87f23040a334e30c750f64523d9ef10c8
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 13:09:52 2014 -0400
+
+    Fix build on clang after previous commit
+
+ src/hb-object-private.hh | 34 +++++++++++++++++++++-------------
+ 1 file changed, 21 insertions(+), 13 deletions(-)
+
+commit a5a27073cfff91c4f80209ca8462543130af61dd
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 13:05:36 2014 -0400
+
+    Rewrite this==NULL checks to avoid undefined behavior
+
+    Fixes https://code.google.com/p/chromium/issues/detail?id=403594
+
+ src/hb-object-private.hh | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+commit cc3b2d432b02f9381cdf19e2dd5fbbdd002a750c
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 12:59:16 2014 -0400
+
+    Remove this==NULL check from face->reference_table()
+
+    Not supposed to happen, and apparently this is undefined in C++.
+    https://code.google.com/p/chromium/issues/detail?id=403594
+
+ src/hb-face-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cd7ea4f791dc41d62ad238673e2ea0107883c9e3
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Thu Aug 14 12:57:02 2014 -0400
+
+    Make hb_object_t members private
+
+    In preparation for fixing:
+    https://code.google.com/p/chromium/issues/detail?id=403594
+
+ src/hb-object-private.hh | 26 +++++++++++++++++++++-----
+ src/hb-set-private.hh   |  2 +-
+ 2 files changed, 22 insertions(+), 6 deletions(-)
+
+commit c4308f895aef93ed884fd54e4ebc65b6d2cfc94a
+Author: Behdad Esfahbod <behdad@behdad.org>
+Date:  Wed Aug 13 19:42:01 2014 -0400
+
+    Minor
+
+ test/shaping/hb_test_tools.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
 commit cd5a1149d980dc3c17b6bb9d961c761b2671ba1b
 Author: Behdad Esfahbod <behdad@behdad.org>
 commit cd5a1149d980dc3c17b6bb9d961c761b2671ba1b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 13 12:39:34 2014 -0400
+Date:  Wed Aug 13 12:39:34 2014 -0400
 
     0.9.35
 
 
     0.9.35
 
- NEWS         | 29 +++++++++++++++++++++++++++++
+ NEWS        | 29 +++++++++++++++++++++++++++++
  configure.ac |  2 +-
  2 files changed, 30 insertions(+), 1 deletion(-)
 
 commit 20076cc41e673c31305fcb58d37b3b292fd35f83
 Author: Behdad Esfahbod <behdad@behdad.org>
  configure.ac |  2 +-
  2 files changed, 30 insertions(+), 1 deletion(-)
 
 commit 20076cc41e673c31305fcb58d37b3b292fd35f83
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 19:26:35 2014 -0400
+Date:  Tue Aug 12 19:26:35 2014 -0400
 
     [coretext] Add version guards for kCTLanguageAttributeName
 
 
     [coretext] Add version guards for kCTLanguageAttributeName
 
@@ -19,7 +1906,7 @@ Date:   Tue Aug 12 19:26:35 2014 -0400
 
 commit 1b3011c27df531875d432e909ae6b77f115c5017
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 1b3011c27df531875d432e909ae6b77f115c5017
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 19:17:19 2014 -0400
+Date:  Tue Aug 12 19:17:19 2014 -0400
 
     [coretext] Pass buffer language to CoreText
 
 
     [coretext] Pass buffer language to CoreText
 
@@ -28,7 +1915,7 @@ Date:   Tue Aug 12 19:17:19 2014 -0400
 
 commit 3eb6a4dbf25b11fce5e0e426e89f7457887aeca0
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 3eb6a4dbf25b11fce5e0e426e89f7457887aeca0
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 19:10:33 2014 -0400
+Date:  Tue Aug 12 19:10:33 2014 -0400
 
     [coretext] Minor
 
 
     [coretext] Minor
 
@@ -37,7 +1924,7 @@ Date:   Tue Aug 12 19:10:33 2014 -0400
 
 commit 08acfe0d3a1d8223a9fa0696703fff63d6c2ea8b
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 08acfe0d3a1d8223a9fa0696703fff63d6c2ea8b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 18:57:08 2014 -0400
+Date:  Tue Aug 12 18:57:08 2014 -0400
 
     [hb-coretext] Fix cluster order of notdef runs in RTL text
 
 
     [hb-coretext] Fix cluster order of notdef runs in RTL text
 
@@ -46,7 +1933,7 @@ Date:   Tue Aug 12 18:57:08 2014 -0400
 
 commit 30eed75de24ac0b6648a72d98d10bb24a563d7ef
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 30eed75de24ac0b6648a72d98d10bb24a563d7ef
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 17:15:09 2014 -0400
+Date:  Tue Aug 12 17:15:09 2014 -0400
 
     [shape-plan] Fix typo!
 
 
     [shape-plan] Fix typo!
 
@@ -59,7 +1946,7 @@ Date:   Tue Aug 12 17:15:09 2014 -0400
 
 commit dc9aba6fc53898acd7281b118cec0355d61b1df2
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit dc9aba6fc53898acd7281b118cec0355d61b1df2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 17:14:36 2014 -0400
+Date:  Tue Aug 12 17:14:36 2014 -0400
 
     [shape-plan] Better debug messages
 
 
     [shape-plan] Better debug messages
 
@@ -68,7 +1955,7 @@ Date:   Tue Aug 12 17:14:36 2014 -0400
 
 commit e956c65bf724a8403471362288d2361361b6ac58
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit e956c65bf724a8403471362288d2361361b6ac58
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 17:03:27 2014 -0400
+Date:  Tue Aug 12 17:03:27 2014 -0400
 
     [shape-plan] Simplify macro
 
 
     [shape-plan] Simplify macro
 
@@ -77,7 +1964,7 @@ Date:   Tue Aug 12 17:03:27 2014 -0400
 
 commit 29e25550ce8fee3fecc42d20a45ce9c212dc59df
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 29e25550ce8fee3fecc42d20a45ce9c212dc59df
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 17:02:59 2014 -0400
+Date:  Tue Aug 12 17:02:59 2014 -0400
 
     Fix gcc warning
 
 
     Fix gcc warning
 
@@ -86,7 +1973,7 @@ Date:   Tue Aug 12 17:02:59 2014 -0400
 
 commit 8d5eebc0c6ada01128c6ee384340efdbef7ba29d
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 8d5eebc0c6ada01128c6ee384340efdbef7ba29d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 16:50:22 2014 -0400
+Date:  Tue Aug 12 16:50:22 2014 -0400
 
     [shape-plan] Fix shape-plan caching with more than one requested
     shaper
 
     [shape-plan] Fix shape-plan caching with more than one requested
     shaper
@@ -100,7 +1987,7 @@ Date:   Tue Aug 12 16:50:22 2014 -0400
 
 commit bc3d0dc60104f1cda465a5e8ba5b40ed5bec70b9
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit bc3d0dc60104f1cda465a5e8ba5b40ed5bec70b9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 16:49:18 2014 -0400
+Date:  Tue Aug 12 16:49:18 2014 -0400
 
     [shape-plan] Add debug tracing
 
 
     [shape-plan] Add debug tracing
 
@@ -109,7 +1996,7 @@ Date:   Tue Aug 12 16:49:18 2014 -0400
 
 commit 81b8d9777b9c38c7e6408591763a4cac6de18e4b
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 81b8d9777b9c38c7e6408591763a4cac6de18e4b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 15:49:47 2014 -0400
+Date:  Tue Aug 12 15:49:47 2014 -0400
 
     [coretext] Fix buffer resizing
 
 
     [coretext] Fix buffer resizing
 
@@ -120,7 +2007,7 @@ Date:   Tue Aug 12 15:49:47 2014 -0400
 
 commit c3e924fb9e0e2d4003790817655efd9c5688c7e1
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit c3e924fb9e0e2d4003790817655efd9c5688c7e1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 14:25:11 2014 -0400
+Date:  Tue Aug 12 14:25:11 2014 -0400
 
     [coretext] Rewind scratch-allocated arrays when not needed anymore
 
 
     [coretext] Rewind scratch-allocated arrays when not needed anymore
 
@@ -129,7 +2016,7 @@ Date:   Tue Aug 12 14:25:11 2014 -0400
 
 commit 8fd4d70b1450d7261a35ab3dea1c70baea2e5c99
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 8fd4d70b1450d7261a35ab3dea1c70baea2e5c99
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 13:12:31 2014 -0400
+Date:  Tue Aug 12 13:12:31 2014 -0400
 
     [wince] Two more Windows CE fixes
 
 
     [wince] Two more Windows CE fixes
 
@@ -138,12 +2025,12 @@ Date:   Tue Aug 12 13:12:31 2014 -0400
       https://codereview.qt-project.org/#/c/92087/
 
  src/hb-mutex-private.hh | 2 +-
       https://codereview.qt-project.org/#/c/92087/
 
  src/hb-mutex-private.hh | 2 +-
- src/hb-private.hh       | 2 ++
+ src/hb-private.hh      | 2 ++
  2 files changed, 3 insertions(+), 1 deletion(-)
 
 commit fd0001d7dbe6ede99a9f87f96f231ffb53303be8
 Author: Behdad Esfahbod <behdad@behdad.org>
  2 files changed, 3 insertions(+), 1 deletion(-)
 
 commit fd0001d7dbe6ede99a9f87f96f231ffb53303be8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 12 10:32:41 2014 -0400
+Date:  Tue Aug 12 10:32:41 2014 -0400
 
     [coretext] Compare CGFont and PS name, if CTFont didn't match
 
 
     [coretext] Compare CGFont and PS name, if CTFont didn't match
 
@@ -163,7 +2050,7 @@ Date:   Tue Aug 12 10:32:41 2014 -0400
 
 commit 5a0eed3b50629be4826e4e9428f2c3255195395d
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 5a0eed3b50629be4826e4e9428f2c3255195395d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 23:47:16 2014 -0400
+Date:  Mon Aug 11 23:47:16 2014 -0400
 
     [coretext] Implement vertical shaping
 
 
     [coretext] Implement vertical shaping
 
@@ -177,7 +2064,7 @@ Date:   Mon Aug 11 23:47:16 2014 -0400
 
 commit 1b55077f03758e49f93b8bc1de678e96ea58718c
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 1b55077f03758e49f93b8bc1de678e96ea58718c
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 20:45:12 2014 -0400
+Date:  Mon Aug 11 20:45:12 2014 -0400
 
     [coretext] Remove unnecessary alt_size
 
 
     [coretext] Remove unnecessary alt_size
 
@@ -188,7 +2075,7 @@ Date:   Mon Aug 11 20:45:12 2014 -0400
 
 commit 10b1104d791a0b0103c6bbb083b5819f2b7d328d
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 10b1104d791a0b0103c6bbb083b5819f2b7d328d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 20:02:45 2014 -0400
+Date:  Mon Aug 11 20:02:45 2014 -0400
 
     [coretext] Use CFRunStatus
 
 
     [coretext] Use CFRunStatus
 
@@ -200,7 +2087,7 @@ Date:   Mon Aug 11 20:02:45 2014 -0400
 
 commit fd1a6aa8d029c701b1532efa59ce901109cfc216
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit fd1a6aa8d029c701b1532efa59ce901109cfc216
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 20:01:37 2014 -0400
+Date:  Mon Aug 11 20:01:37 2014 -0400
 
     [coretext] Minor
 
 
     [coretext] Minor
 
@@ -209,7 +2096,7 @@ Date:   Mon Aug 11 20:01:37 2014 -0400
 
 commit 130856c705641aa681307b5b51b5fb84e295f382
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 130856c705641aa681307b5b51b5fb84e295f382
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 19:16:26 2014 -0400
+Date:  Mon Aug 11 19:16:26 2014 -0400
 
     [coretext] Remove debug printf!
 
 
     [coretext] Remove debug printf!
 
@@ -218,7 +2105,7 @@ Date:   Mon Aug 11 19:16:26 2014 -0400
 
 commit b5fbc3b8f560235d014c62e49220574ffcf89349
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit b5fbc3b8f560235d014c62e49220574ffcf89349
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 18:40:01 2014 -0400
+Date:  Mon Aug 11 18:40:01 2014 -0400
 
     API: Do not clear buffer-flags in hb_buffer_clear_contents()
 
 
     API: Do not clear buffer-flags in hb_buffer_clear_contents()
 
@@ -231,13 +2118,13 @@ Date:   Mon Aug 11 18:40:01 2014 -0400
     Tests updated.
 
  src/hb-buffer-private.hh |  4 +---
     Tests updated.
 
  src/hb-buffer-private.hh |  4 +---
- src/hb-buffer.cc         |  4 ++--
+ src/hb-buffer.cc        |  4 ++--
  test/api/test-buffer.c   | 15 ++++++++++++---
  3 files changed, 15 insertions(+), 8 deletions(-)
 
 commit 104484cefeca03d95837bba5f39178693c86ce8a
 Author: Behdad Esfahbod <behdad@behdad.org>
  test/api/test-buffer.c   | 15 ++++++++++++---
  3 files changed, 15 insertions(+), 8 deletions(-)
 
 commit 104484cefeca03d95837bba5f39178693c86ce8a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 18:23:43 2014 -0400
+Date:  Mon Aug 11 18:23:43 2014 -0400
 
     Minor
 
 
     Minor
 
@@ -246,7 +2133,7 @@ Date:   Mon Aug 11 18:23:43 2014 -0400
 
 commit 4acce77db7dd588ba277779c4997b0256ebe426e
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 4acce77db7dd588ba277779c4997b0256ebe426e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 17:46:50 2014 -0400
+Date:  Mon Aug 11 17:46:50 2014 -0400
 
     [coretext] Pass buffer direction to CoreText
 
 
     [coretext] Pass buffer direction to CoreText
 
@@ -257,7 +2144,7 @@ Date:   Mon Aug 11 17:46:50 2014 -0400
 
 commit 5ec45dd37caa8a87ce2689a66272ba8a343fe6ba
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 5ec45dd37caa8a87ce2689a66272ba8a343fe6ba
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 17:46:12 2014 -0400
+Date:  Mon Aug 11 17:46:12 2014 -0400
 
     [coretext] Minor
 
 
     [coretext] Minor
 
@@ -269,7 +2156,7 @@ Date:   Mon Aug 11 17:46:12 2014 -0400
 
 commit 624a299b829ccf9864dd2f3001b1a49476e96b4a
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 624a299b829ccf9864dd2f3001b1a49476e96b4a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 15:29:18 2014 -0400
+Date:  Mon Aug 11 15:29:18 2014 -0400
 
     [coretext] Attach marks to base clusters
 
 
     [coretext] Attach marks to base clusters
 
@@ -281,7 +2168,7 @@ Date:   Mon Aug 11 15:29:18 2014 -0400
 
 commit 3c41ccb5358b0be6cc68d49f436d2cb1792cd5e5
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 3c41ccb5358b0be6cc68d49f436d2cb1792cd5e5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 15:11:59 2014 -0400
+Date:  Mon Aug 11 15:11:59 2014 -0400
 
     [coretext] Use input clusters
 
 
     [coretext] Use input clusters
 
@@ -295,7 +2182,7 @@ Date:   Mon Aug 11 15:11:59 2014 -0400
 
 commit a6b8dc87421de33746b0b14d86d2d1532aec02af
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit a6b8dc87421de33746b0b14d86d2d1532aec02af
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 15:08:19 2014 -0400
+Date:  Mon Aug 11 15:08:19 2014 -0400
 
     [coretext] Fix buffer resize handling
 
 
     [coretext] Fix buffer resize handling
 
@@ -304,13 +2191,13 @@ Date:   Mon Aug 11 15:08:19 2014 -0400
     shaper to retry from (almost) scratch.
 
  src/hb-buffer-private.hh |   3 +
     shaper to retry from (almost) scratch.
 
  src/hb-buffer-private.hh |   3 +
- src/hb-coretext.cc       | 428
+ src/hb-coretext.cc      | 428
  ++++++++++++++++++++++++++---------------------
  2 files changed, 238 insertions(+), 193 deletions(-)
 
 commit 9b3c60c88b118f01610ae7a608b138f79f2dc7be
 Author: Behdad Esfahbod <behdad@behdad.org>
  ++++++++++++++++++++++++++---------------------
  2 files changed, 238 insertions(+), 193 deletions(-)
 
 commit 9b3c60c88b118f01610ae7a608b138f79f2dc7be
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 13:25:43 2014 -0400
+Date:  Mon Aug 11 13:25:43 2014 -0400
 
     [coretext] Always compute log_clusters
 
 
     [coretext] Always compute log_clusters
 
@@ -321,7 +2208,7 @@ Date:   Mon Aug 11 13:25:43 2014 -0400
 
 commit 15c633dd1f412f9ef839d80a8f7af35e7ea48fbc
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 15c633dd1f412f9ef839d80a8f7af35e7ea48fbc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 13:42:42 2014 -0400
+Date:  Mon Aug 11 13:42:42 2014 -0400
 
     Minor
 
 
     Minor
 
@@ -331,7 +2218,7 @@ Date:   Mon Aug 11 13:42:42 2014 -0400
 
 commit 9ce067c77524a9ffc77ceabcba5e7dab36fd39de
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 9ce067c77524a9ffc77ceabcba5e7dab36fd39de
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Aug 11 02:04:38 2014 -0400
+Date:  Mon Aug 11 02:04:38 2014 -0400
 
     [coretext] Simplify cluster mapping
 
 
     [coretext] Simplify cluster mapping
 
@@ -340,7 +2227,7 @@ Date:   Mon Aug 11 02:04:38 2014 -0400
 
 commit 49f7fb63761e4ca9936990fb90a77fd3600f5ad2
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 49f7fb63761e4ca9936990fb90a77fd3600f5ad2
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Aug 10 19:19:38 2014 -0400
+Date:  Sun Aug 10 19:19:38 2014 -0400
 
     [coretext] Minor
 
 
     [coretext] Minor
 
@@ -349,7 +2236,7 @@ Date:   Sun Aug 10 19:19:38 2014 -0400
 
 commit 25f4fb9b56bb3f8bec821571c78f8829e40daa54
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 25f4fb9b56bb3f8bec821571c78f8829e40daa54
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Aug 10 19:05:25 2014 -0400
+Date:  Sun Aug 10 19:05:25 2014 -0400
 
     [coretext] Fix fallback detection
 
 
     [coretext] Fix fallback detection
 
@@ -360,7 +2247,7 @@ Date:   Sun Aug 10 19:05:25 2014 -0400
 
 commit 77a7a53acef7de355116d488e7d64ff1d7e9e9e1
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 77a7a53acef7de355116d488e7d64ff1d7e9e9e1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Aug 10 18:59:47 2014 -0400
+Date:  Sun Aug 10 18:59:47 2014 -0400
 
     [coretext] Fix last range
 
 
     [coretext] Fix last range
 
@@ -374,7 +2261,7 @@ Date:   Sun Aug 10 18:59:47 2014 -0400
 
 commit c2b151d95262a8dc2d2ce94e19ab0ef5b0c8f98d
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit c2b151d95262a8dc2d2ce94e19ab0ef5b0c8f98d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Aug 10 18:52:07 2014 -0400
+Date:  Sun Aug 10 18:52:07 2014 -0400
 
     Fix hb_in_range() for types smaller than int
 
 
     Fix hb_in_range() for types smaller than int
 
@@ -385,7 +2272,7 @@ Date:   Sun Aug 10 18:52:07 2014 -0400
 
 commit 26a963b9cb4af3119177f277a2d48a5d537458fb
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 26a963b9cb4af3119177f277a2d48a5d537458fb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Aug 10 18:04:50 2014 -0400
+Date:  Sun Aug 10 18:04:50 2014 -0400
 
     [wince] Try to fix some stuff on Windows CE
 
 
     [wince] Try to fix some stuff on Windows CE
 
@@ -399,7 +2286,7 @@ Date:   Sun Aug 10 18:04:50 2014 -0400
 
 commit 92aeee3f040c2c32cbf70b27bd6954535388c870
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 92aeee3f040c2c32cbf70b27bd6954535388c870
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Aug 10 17:42:19 2014 -0400
+Date:  Sun Aug 10 17:42:19 2014 -0400
 
     Minor
 
 
     Minor
 
@@ -409,7 +2296,7 @@ Date:   Sun Aug 10 17:42:19 2014 -0400
 
 commit b9993d8d6d332994dfbd29e99ff8043622003417
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit b9993d8d6d332994dfbd29e99ff8043622003417
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Aug 10 17:40:24 2014 -0400
+Date:  Sun Aug 10 17:40:24 2014 -0400
 
     [coretext] Fix assert on Yosemite
 
 
     [coretext] Fix assert on Yosemite
 
@@ -423,7 +2310,7 @@ Date:   Sun Aug 10 17:40:24 2014 -0400
 
 commit 087733dd66e17297ef0e53680fafe42c84884104
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 087733dd66e17297ef0e53680fafe42c84884104
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Apr 18 11:21:08 2014 -0700
+Date:  Fri Apr 18 11:21:08 2014 -0700
 
     [coretext] Use CGFont as face_data
 
 
     [coretext] Use CGFont as face_data
 
@@ -432,7 +2319,7 @@ Date:   Fri Apr 18 11:21:08 2014 -0700
 
 commit d277c3d7eee1fd4fb41c38255e5c4df539353e89
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit d277c3d7eee1fd4fb41c38255e5c4df539353e89
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Aug 7 15:38:52 2014 -0400
+Date:  Thu Aug 7 15:38:52 2014 -0400
 
     [arabic] Bug 82306 - Mandaic had errors in its Unicode Joining_Type
 
 
     [arabic] Bug 82306 - Mandaic had errors in its Unicode Joining_Type
 
@@ -443,7 +2330,7 @@ Date:   Thu Aug 7 15:38:52 2014 -0400
 
 commit 38fb30d7420a4b01f99cee31baa8c3990a1d1c5f
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 38fb30d7420a4b01f99cee31baa8c3990a1d1c5f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Aug 6 13:34:49 2014 -0400
+Date:  Wed Aug 6 13:34:49 2014 -0400
 
     Use atexit() only if it's safe to call from shared library
 
 
     Use atexit() only if it's safe to call from shared library
 
@@ -454,17 +2341,17 @@ Date:   Wed Aug 6 13:34:49 2014 -0400
 
     https://bugs.freedesktop.org/show_bug.cgi?id=82246
 
 
     https://bugs.freedesktop.org/show_bug.cgi?id=82246
 
- src/hb-common.cc    |  4 ++--
- src/hb-ft.cc        |  2 +-
+ src/hb-common.cc    | 4 ++--
+ src/hb-ft.cc       |  2 +-
  src/hb-private.hh   | 25 +++++++++++++++++++++++++
  src/hb-private.hh   | 25 +++++++++++++++++++++++++
- src/hb-shape.cc     |  2 +-
- src/hb-shaper.cc    |  2 +-
- src/hb-uniscribe.cc |  2 +-
+ src/hb-shape.cc     | 2 +-
+ src/hb-shaper.cc    | 2 +-
+ src/hb-uniscribe.cc | 2 +-
  6 files changed, 31 insertions(+), 6 deletions(-)
 
 commit d5e61470fa8e5046c35a79988e00e012ae4fff0f
 Author: Behdad Esfahbod <behdad@behdad.org>
  6 files changed, 31 insertions(+), 6 deletions(-)
 
 commit d5e61470fa8e5046c35a79988e00e012ae4fff0f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Aug 5 14:19:01 2014 -0400
+Date:  Tue Aug 5 14:19:01 2014 -0400
 
     [arabic] Fix fallback shaping regression
 
 
     [arabic] Fix fallback shaping regression
 
@@ -474,28 +2361,28 @@ Date:   Tue Aug 5 14:19:01 2014 -0400
 
     Micro-test added.
 
 
     Micro-test added.
 
- src/hb-ot-shape-complex-arabic.cc                        |   4 ++--
- test/shaping/Makefile.am                                 |   1 +
- test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
+ src/hb-ot-shape-complex-arabic.cc                       |   4 ++--
+ test/shaping/Makefile.am                                |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST                     |   1 +
  .../sha1sum/df768b9c257e0c9c35786c47cae15c46571d56be.ttf | Bin 0 ->
  6332 bytes
  .../sha1sum/df768b9c257e0c9c35786c47cae15c46571d56be.ttf | Bin 0 ->
  6332 bytes
- test/shaping/tests/MANIFEST                              |   1 +
- test/shaping/tests/arabic-fallback-shaping.tests         |   1 +
+ test/shaping/tests/MANIFEST                             |   1 +
+ test/shaping/tests/arabic-fallback-shaping.tests        |   1 +
  6 files changed, 6 insertions(+), 2 deletions(-)
 
 commit 91c2c0fd2b0f660d79744b3dfaf39ab86883e96b
 Author: Behdad Esfahbod <behdad@behdad.org>
  6 files changed, 6 insertions(+), 2 deletions(-)
 
 commit 91c2c0fd2b0f660d79744b3dfaf39ab86883e96b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 2 19:24:55 2014 -0400
+Date:  Sat Aug 2 19:24:55 2014 -0400
 
     0.9.34
 
 
     0.9.34
 
- NEWS         | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ NEWS        | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
  configure.ac |  2 +-
  2 files changed, 54 insertions(+), 1 deletion(-)
 
 commit d7c850f8037d2701366008eb8c2a527c9d40abde
 Author: Behdad Esfahbod <behdad@behdad.org>
  configure.ac |  2 +-
  2 files changed, 54 insertions(+), 1 deletion(-)
 
 commit d7c850f8037d2701366008eb8c2a527c9d40abde
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 2 17:46:38 2014 -0400
+Date:  Sat Aug 2 17:46:38 2014 -0400
 
     [uniscribe] Minor
 
 
     [uniscribe] Minor
 
@@ -504,29 +2391,29 @@ Date:   Sat Aug 2 17:46:38 2014 -0400
 
 commit 8f3eebf7ee4005f9a8efaafcb7f4058cc0a3756e
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 8f3eebf7ee4005f9a8efaafcb7f4058cc0a3756e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 2 17:18:46 2014 -0400
+Date:  Sat Aug 2 17:18:46 2014 -0400
 
     Make sure gsubgpos buffer vars are available during fallback_position
 
     Add buffer var allocation asserts to a few key places.
 
 
     Make sure gsubgpos buffer vars are available during fallback_position
 
     Add buffer var allocation asserts to a few key places.
 
- src/hb-ot-layout-gpos-table.hh             |  4 ++--
- src/hb-ot-layout-gsub-table.hh             |  2 +-
- src/hb-ot-layout-private.hh                | 15 +++++++++++++++
+ src/hb-ot-layout-gpos-table.hh                    |  4 ++--
+ src/hb-ot-layout-gsub-table.hh                    |  2 +-
+ src/hb-ot-layout-private.hh               | 15 +++++++++++++++
  src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
  src/hb-ot-shape-complex-arabic-fallback.hh |  2 +-
- src/hb-ot-shape-fallback.cc                |  2 ++
- src/hb-ot-shape-normalize.cc               |  2 ++
- src/hb-ot-shape.cc                         |  3 +++
+ src/hb-ot-shape-fallback.cc               |  2 ++
+ src/hb-ot-shape-normalize.cc              |  2 ++
+ src/hb-ot-shape.cc                        |  3 +++
  7 files changed, 26 insertions(+), 4 deletions(-)
 
 commit 2053f369f84676f197ac41ea654a318c48922abd
 Author: Behdad Esfahbod <behdad@behdad.org>
  7 files changed, 26 insertions(+), 4 deletions(-)
 
 commit 2053f369f84676f197ac41ea654a318c48922abd
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 2 16:31:16 2014 -0400
+Date:  Sat Aug 2 16:31:16 2014 -0400
 
     Disable 'liga' for vertical text
 
     The reason we turned it on is because Kazuraki uses it.  But that's
 
     Disable 'liga' for vertical text
 
     The reason we turned it on is because Kazuraki uses it.  But that's
-    not reason enough.  Until the OpenType spec gets its act together re
+    not reason enough. Until the OpenType spec gets its act together re
     adding design-direction to lookups, this is better user experience.
 
  src/hb-ot-shape.cc | 2 +-
     adding design-direction to lookups, this is better user experience.
 
  src/hb-ot-shape.cc | 2 +-
@@ -534,7 +2421,7 @@ Date:   Sat Aug 2 16:31:16 2014 -0400
 
 commit 763e5466c0a03a7c27020e1e2598e488612529a7
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 763e5466c0a03a7c27020e1e2598e488612529a7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 2 16:17:44 2014 -0400
+Date:  Sat Aug 2 16:17:44 2014 -0400
 
     Make it easier to use HB_BUFFER_FLAG_BOT/EOT
 
 
     Make it easier to use HB_BUFFER_FLAG_BOT/EOT
 
@@ -544,23 +2431,23 @@ Date:   Sat Aug 2 16:17:44 2014 -0400
     had code like this:
 
       hb_buffer_set_flags (hb_buffer,
     had code like this:
 
       hb_buffer_set_flags (hb_buffer,
-                           (item_offset == 0 ? HB_BUFFER_FLAG_BOT : 0) |
-                           (item_offset + item_length == paragraph_length
-                           ?
-                            HB_BUFFER_FLAG_EOT : 0));
+                          (item_offset == 0 ? HB_BUFFER_FLAG_BOT : 0) |
+                          (item_offset + item_length == paragraph_length
+                          ?
+                           HB_BUFFER_FLAG_EOT : 0));
 
       hb_buffer_add_utf8 (hb_buffer,
 
       hb_buffer_add_utf8 (hb_buffer,
-                          paragraph_text, paragraph_length,
-                          item_offset, item_length);
+                         paragraph_text, paragraph_length,
+                         item_offset, item_length);
 
     After this change such clients can simply say:
 
       hb_buffer_set_flags (hb_buffer,
 
     After this change such clients can simply say:
 
       hb_buffer_set_flags (hb_buffer,
-                           HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
+                          HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
 
       hb_buffer_add_utf8 (hb_buffer,
 
       hb_buffer_add_utf8 (hb_buffer,
-                          paragraph_text, paragraph_length,
-                          item_offset, item_length);
+                         paragraph_text, paragraph_length,
+                         item_offset, item_length);
 
     Ie, HarfBuzz itself checks whether the segment is at the beginning/end
     of the paragraph.  Clients that only pass item-at-a-time to HarfBuzz
 
     Ie, HarfBuzz itself checks whether the segment is at the beginning/end
     of the paragraph.  Clients that only pass item-at-a-time to HarfBuzz
@@ -572,19 +2459,19 @@ Date:   Sat Aug 2 16:17:44 2014 -0400
 
  src/hb-ot-shape-complex-arabic.cc | 40
  +++++++++++++++++++--------------------
 
  src/hb-ot-shape-complex-arabic.cc | 40
  +++++++++++++++++++--------------------
- src/hb-ot-shape.cc                |  1 +
+ src/hb-ot-shape.cc               |  1 +
  2 files changed, 20 insertions(+), 21 deletions(-)
 
 commit 0a5ae9336231c4d189e1682e4fd9c9c4552b8bbf
 Merge: ac53443 6ab6be3
 Author: Behdad Esfahbod <behdad@behdad.org>
  2 files changed, 20 insertions(+), 21 deletions(-)
 
 commit 0a5ae9336231c4d189e1682e4fd9c9c4552b8bbf
 Merge: ac53443 6ab6be3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 2 15:00:34 2014 -0400
+Date:  Sat Aug 2 15:00:34 2014 -0400
 
     Merge branch 'win1256'
 
 commit 6ab6be32c5857ce3344021ad2996e80b2a8c8f99
 Author: Behdad Esfahbod <behdad@behdad.org>
 
     Merge branch 'win1256'
 
 commit 6ab6be32c5857ce3344021ad2996e80b2a8c8f99
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Aug 2 14:58:38 2014 -0400
+Date:  Sat Aug 2 14:58:38 2014 -0400
 
     [arabic/win1256] Remove unused MultipleSubst macros
 
 
     [arabic/win1256] Remove unused MultipleSubst macros
 
@@ -593,7 +2480,7 @@ Date:   Sat Aug 2 14:58:38 2014 -0400
 
 commit abfa4252cce1c56c472693dcd8400cd97ededd2f
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit abfa4252cce1c56c472693dcd8400cd97ededd2f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 1 19:05:33 2014 -0400
+Date:  Fri Aug 1 19:05:33 2014 -0400
 
     [arabic/win1256] Really fix lam-alef this time
 
 
     [arabic/win1256] Really fix lam-alef this time
 
@@ -607,7 +2494,7 @@ Date:   Fri Aug 1 19:05:33 2014 -0400
 
 commit 55977f2a462b7fa1248eab3787053dc82320d3e5
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 55977f2a462b7fa1248eab3787053dc82320d3e5
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 1 16:14:33 2014 -0400
+Date:  Fri Aug 1 16:14:33 2014 -0400
 
     [arabic/win1256] Hook up lamMedi lookup
 
 
     [arabic/win1256] Hook up lamMedi lookup
 
@@ -622,7 +2509,7 @@ Date:   Fri Aug 1 16:14:33 2014 -0400
 
 commit e839e2523e64fd0cf21929f6a45e2facd59c7917
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit e839e2523e64fd0cf21929f6a45e2facd59c7917
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Aug 1 16:09:31 2014 -0400
+Date:  Fri Aug 1 16:09:31 2014 -0400
 
     [arabic/win1256] Fix TEH MARBUTA final form
 
 
     [arabic/win1256] Fix TEH MARBUTA final form
 
@@ -633,7 +2520,7 @@ Date:   Fri Aug 1 16:09:31 2014 -0400
 
 commit a2de193220ee2839125594bd1a60b5b66ab4598e
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit a2de193220ee2839125594bd1a60b5b66ab4598e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 31 18:21:05 2014 -0400
+Date:  Thu Jul 31 18:21:05 2014 -0400
 
     [arabic/win1256] Fix shaping of JEEM, HAH, and KHAH
 
 
     [arabic/win1256] Fix shaping of JEEM, HAH, and KHAH
 
@@ -644,7 +2531,7 @@ Date:   Thu Jul 31 18:21:05 2014 -0400
 
 commit 1789ccb1dd56af6117eac00e633eff94860ba252
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 1789ccb1dd56af6117eac00e633eff94860ba252
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 31 11:04:00 2014 -0400
+Date:  Thu Jul 31 11:04:00 2014 -0400
 
     [arabic/win1256] Remove GCC'ism
 
 
     [arabic/win1256] Remove GCC'ism
 
@@ -662,14 +2549,14 @@ Date:   Thu Jul 31 11:04:00 2014 -0400
     See:
     https://github.com/behdad/harfbuzz/commit/a97f537cec209649302899975d76ca2b2661da7a#commitcomment-7218736
 
     See:
     https://github.com/behdad/harfbuzz/commit/a97f537cec209649302899975d76ca2b2661da7a#commitcomment-7218736
 
- src/hb-ot-shape-complex-arabic-fallback.hh |   4 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh |  4 +-
  src/hb-ot-shape-complex-arabic-win1256.hh  | 123
  +++++++++++++++++------------
  2 files changed, 75 insertions(+), 52 deletions(-)
 
 commit f28b1c823db2ad56fed356ef864a7508d23048b8
 Author: Behdad Esfahbod <behdad@behdad.org>
  src/hb-ot-shape-complex-arabic-win1256.hh  | 123
  +++++++++++++++++------------
  2 files changed, 75 insertions(+), 52 deletions(-)
 
 commit f28b1c823db2ad56fed356ef864a7508d23048b8
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 30 02:15:44 2014 -0400
+Date:  Wed Jul 30 02:15:44 2014 -0400
 
     [arabic] Implement Windows-1256 private shaping
 
 
     [arabic] Implement Windows-1256 private shaping
 
@@ -678,7 +2565,7 @@ Date:   Wed Jul 30 02:15:44 2014 -0400
     https://bugzilla.mozilla.org/show_bug.cgi?id=1045139
 
     This is only enabled on Windows platforms, and requires support from
     https://bugzilla.mozilla.org/show_bug.cgi?id=1045139
 
     This is only enabled on Windows platforms, and requires support from
-    Uniscribe to work.  But for clients that do hook up to Uniscribe, this
+    Uniscribe to work. But for clients that do hook up to Uniscribe, this
     fixes shaping of Windows-1256-encoded bitmap fonts like "MS Sans
     Serif".
 
     fixes shaping of Windows-1256-encoded bitmap fonts like "MS Sans
     Serif".
 
@@ -687,8 +2574,8 @@ Date:   Wed Jul 30 02:15:44 2014 -0400
 
     UNTESTED.  I might even have broken regular Arabic fallback shaping.
 
 
     UNTESTED.  I might even have broken regular Arabic fallback shaping.
 
- src/Makefile.am                            |   1 +
- src/check-includes.sh                      |   2 +-
+ src/Makefile.am                           |   1 +
+ src/check-includes.sh                     |   2 +-
  src/hb-ot-shape-complex-arabic-fallback.hh | 125 +++++++++--
  src/hb-ot-shape-complex-arabic-win1256.hh  | 328
  +++++++++++++++++++++++++++++
  src/hb-ot-shape-complex-arabic-fallback.hh | 125 +++++++++--
  src/hb-ot-shape-complex-arabic-win1256.hh  | 328
  +++++++++++++++++++++++++++++
@@ -696,7 +2583,7 @@ Date:   Wed Jul 30 02:15:44 2014 -0400
 
 commit ac53443f1cea83ed43a4e41a9fdb91902f7fae7b
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit ac53443f1cea83ed43a4e41a9fdb91902f7fae7b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 31 18:51:37 2014 -0400
+Date:  Thu Jul 31 18:51:37 2014 -0400
 
     [hangul] Don't apply 'calt'
 
 
     [hangul] Don't apply 'calt'
 
@@ -704,22 +2591,22 @@ Date:   Thu Jul 31 18:51:37 2014 -0400
 
     Micro-test added.
 
 
     Micro-test added.
 
- src/hb-ot-shape-complex-hangul.cc                        |  11
+ src/hb-ot-shape-complex-hangul.cc                       |  11
  ++++++++++-
  ++++++++++-
- test/shaping/Makefile.am                                 |   1 +
+ test/shaping/Makefile.am                                |   1 +
  .../sha1sum/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf | Bin 0 ->
  1804 bytes
  .../sha1sum/7e14e7883ed152baa158b80e207b66114c823a8b.ttf | Bin 0 ->
  1644 bytes
  .../sha1sum/757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf | Bin 0 ->
  1804 bytes
  .../sha1sum/7e14e7883ed152baa158b80e207b66114c823a8b.ttf | Bin 0 ->
  1644 bytes
- test/shaping/fonts/sha1sum/MANIFEST                      |   2 ++
- test/shaping/tests/MANIFEST                              |   1 +
- test/shaping/tests/hangul-jamo.tests                     |  11
+ test/shaping/fonts/sha1sum/MANIFEST                     |   2 ++
+ test/shaping/tests/MANIFEST                             |   1 +
+ test/shaping/tests/hangul-jamo.tests                    |  11
  +++++++++++
  7 files changed, 25 insertions(+), 1 deletion(-)
 
 commit 8292f96b2be173ebceb1b54426c271cfeaecd633
 Author: Behdad Esfahbod <behdad@behdad.org>
  +++++++++++
  7 files changed, 25 insertions(+), 1 deletion(-)
 
 commit 8292f96b2be173ebceb1b54426c271cfeaecd633
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 31 18:33:11 2014 -0400
+Date:  Thu Jul 31 18:33:11 2014 -0400
 
     [test] Fix record-test.sh
 
 
     [test] Fix record-test.sh
 
@@ -728,7 +2615,7 @@ Date:   Thu Jul 31 18:33:11 2014 -0400
 
 commit 88911e8cc765c26e502503a3a00ac7f17973f3d9
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 88911e8cc765c26e502503a3a00ac7f17973f3d9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 29 19:47:26 2014 -0400
+Date:  Tue Jul 29 19:47:26 2014 -0400
 
     Minor
 
 
     Minor
 
@@ -737,7 +2624,7 @@ Date:   Tue Jul 29 19:47:26 2014 -0400
 
 commit 9e834e29e0b657f0555df1ab9cea79ff7abcf08d
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 9e834e29e0b657f0555df1ab9cea79ff7abcf08d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 26 20:34:01 2014 -0400
+Date:  Sat Jul 26 20:34:01 2014 -0400
 
     [hebrew] Zero mark advance by GDEF late
 
 
     [hebrew] Zero mark advance by GDEF late
 
@@ -751,16 +2638,16 @@ Date:   Sat Jul 26 20:34:01 2014 -0400
 
     Micro-test added.
 
 
     Micro-test added.
 
- src/hb-ot-shape-complex-hebrew.cc                        |   2 +-
+ src/hb-ot-shape-complex-hebrew.cc                       |   2 +-
  .../sha1sum/8454d22037f892e76614e1645d066689a0200e61.ttf | Bin 0 ->
  6068 bytes
  .../sha1sum/8454d22037f892e76614e1645d066689a0200e61.ttf | Bin 0 ->
  6068 bytes
- test/shaping/fonts/sha1sum/MANIFEST                      |   1 +
- test/shaping/tests/zero-width-marks.tests                |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST                     |   1 +
+ test/shaping/tests/zero-width-marks.tests               |   1 +
  4 files changed, 3 insertions(+), 1 deletion(-)
 
 commit 6f2d9ba52a6d1e3fc200da1ef0e85ba020fcd0dc
 Author: Behdad Esfahbod <behdad@behdad.org>
  4 files changed, 3 insertions(+), 1 deletion(-)
 
 commit 6f2d9ba52a6d1e3fc200da1ef0e85ba020fcd0dc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 26 19:17:44 2014 -0400
+Date:  Sat Jul 26 19:17:44 2014 -0400
 
     Add old-Myanmar shaper
 
 
     Add old-Myanmar shaper
 
@@ -773,30 +2660,30 @@ Date:   Sat Jul 26 19:17:44 2014 -0400
 
     Micro-test added based on Padauk.
 
 
     Micro-test added based on Padauk.
 
- src/hb-ot-shape-complex-myanmar.cc                    |  18
+ src/hb-ot-shape-complex-myanmar.cc                   |  18
  ++++++++++++++++++
  ++++++++++++++++++
- src/hb-ot-shape-complex-private.hh                    |   5 +++--
- test/shaping/Makefile.am                              |   1 +
- test/shaping/fonts/sha1sum/MANIFEST                   |   1 +
+ src/hb-ot-shape-complex-private.hh                   |   5 +++--
+ test/shaping/Makefile.am                             |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST                  |   1 +
  .../bb9473d2403488714043bcfb946c9f78b86ad627.ttf      | Bin 0 ->
  3440 bytes
  .../bb9473d2403488714043bcfb946c9f78b86ad627.ttf      | Bin 0 ->
  3440 bytes
- test/shaping/tests/MANIFEST                           |   1 +
- test/shaping/tests/zero-width-marks.tests             |   1 +
+ test/shaping/tests/MANIFEST                          |   1 +
+ test/shaping/tests/zero-width-marks.tests            |   1 +
  7 files changed, 25 insertions(+), 2 deletions(-)
 
 commit 595d2b96c37de8147489dc5e0ddcc4ab1ad3eea9
 Author: Behdad Esfahbod <behdad@behdad.org>
  7 files changed, 25 insertions(+), 2 deletions(-)
 
 commit 595d2b96c37de8147489dc5e0ddcc4ab1ad3eea9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 26 18:44:15 2014 -0400
+Date:  Sat Jul 26 18:44:15 2014 -0400
 
     Minor
 
  src/hb-ot-shape-complex-indic.cc | 1 +
 
     Minor
 
  src/hb-ot-shape-complex-indic.cc | 1 +
- src/hb-ot-shape.cc               | 2 +-
+ src/hb-ot-shape.cc              | 2 +-
  2 files changed, 2 insertions(+), 1 deletion(-)
 
 commit fe6788bc570d77d5b3aafc68efd51ca6b80499b1
 Author: Behdad Esfahbod <behdad@behdad.org>
  2 files changed, 2 insertions(+), 1 deletion(-)
 
 commit fe6788bc570d77d5b3aafc68efd51ca6b80499b1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:40:56 2014 -0400
+Date:  Fri Jul 25 12:40:56 2014 -0400
 
     Typo
 
 
     Typo
 
@@ -805,7 +2692,7 @@ Date:   Fri Jul 25 12:40:56 2014 -0400
 
 commit 0de25d4184d2d92b1a2ebb6fa054275aaae4c316
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 0de25d4184d2d92b1a2ebb6fa054275aaae4c316
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:35:03 2014 -0400
+Date:  Fri Jul 25 12:35:03 2014 -0400
 
     [util] Note CSS compatibility in --help-features
 
 
     [util] Note CSS compatibility in --help-features
 
@@ -814,7 +2701,7 @@ Date:   Fri Jul 25 12:35:03 2014 -0400
 
 commit 6e69200a2aadbc6bba35ffb4a058c14286b84f46
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 6e69200a2aadbc6bba35ffb4a058c14286b84f46
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:30:47 2014 -0400
+Date:  Fri Jul 25 12:30:47 2014 -0400
 
     Fix snprintf() format
 
 
     Fix snprintf() format
 
@@ -826,7 +2713,7 @@ Date:   Fri Jul 25 12:30:47 2014 -0400
 
 commit 5c5cdbbdf8be231c433e21b050a6c6991d327b61
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 5c5cdbbdf8be231c433e21b050a6c6991d327b61
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:21:49 2014 -0400
+Date:  Fri Jul 25 12:21:49 2014 -0400
 
     Make sure broken feature strings are not partially parsed
 
 
     Make sure broken feature strings are not partially parsed
 
@@ -838,7 +2725,7 @@ Date:   Fri Jul 25 12:21:49 2014 -0400
 
 commit a795fe637846e0d9561d2f7cdd84cfafd58b23a7
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit a795fe637846e0d9561d2f7cdd84cfafd58b23a7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:15:33 2014 -0400
+Date:  Fri Jul 25 12:15:33 2014 -0400
 
     Allow quotation marks around feature tag in hb_feature_from_string()
 
 
     Allow quotation marks around feature tag in hb_feature_from_string()
 
@@ -849,7 +2736,7 @@ Date:   Fri Jul 25 12:15:33 2014 -0400
 
 commit 3f6461847412e78bcddc8eba97200f3afcde869a
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 3f6461847412e78bcddc8eba97200f3afcde869a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:04:27 2014 -0400
+Date:  Fri Jul 25 12:04:27 2014 -0400
 
     Allow space at the end of feature string with values, eg 'dlig=1 '
 
 
     Allow space at the end of feature string with values, eg 'dlig=1 '
 
@@ -858,7 +2745,7 @@ Date:   Fri Jul 25 12:04:27 2014 -0400
 
 commit f31f7d2259dd8edffc070af55938cb7aa23514c1
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit f31f7d2259dd8edffc070af55938cb7aa23514c1
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:03:52 2014 -0400
+Date:  Fri Jul 25 12:03:52 2014 -0400
 
     Minor
 
 
     Minor
 
@@ -867,7 +2754,7 @@ Date:   Fri Jul 25 12:03:52 2014 -0400
 
 commit 60cb18a5dea2d30793f89e80995bb729c014864a
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 60cb18a5dea2d30793f89e80995bb729c014864a
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 12:01:22 2014 -0400
+Date:  Fri Jul 25 12:01:22 2014 -0400
 
     Allow on/off in hb_feature_from_string()
 
 
     Allow on/off in hb_feature_from_string()
 
@@ -878,7 +2765,7 @@ Date:   Fri Jul 25 12:01:22 2014 -0400
 
 commit d9e618eca9e01c2eb6db65504af3f73be370a1e7
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit d9e618eca9e01c2eb6db65504af3f73be370a1e7
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 11:56:01 2014 -0400
+Date:  Fri Jul 25 11:56:01 2014 -0400
 
     Remove duplicate definition of ISALNUM
 
 
     Remove duplicate definition of ISALNUM
 
@@ -889,7 +2776,7 @@ Date:   Fri Jul 25 11:56:01 2014 -0400
 
 commit 2ee5f665ded86147acedc400153c0b3a90fe07c6
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 2ee5f665ded86147acedc400153c0b3a90fe07c6
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 11:53:46 2014 -0400
+Date:  Fri Jul 25 11:53:46 2014 -0400
 
     Fix parsing of features like "- liga" (with the space)
 
 
     Fix parsing of features like "- liga" (with the space)
 
@@ -898,7 +2785,7 @@ Date:   Fri Jul 25 11:53:46 2014 -0400
 
 commit e15fa7a8cffbe6a67b1048d7b87b7df77d8b1686
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit e15fa7a8cffbe6a67b1048d7b87b7df77d8b1686
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 11:44:35 2014 -0400
+Date:  Fri Jul 25 11:44:35 2014 -0400
 
     Do not require the '=' in hb_feature_from_string()
 
 
     Do not require the '=' in hb_feature_from_string()
 
@@ -909,7 +2796,7 @@ Date:   Fri Jul 25 11:44:35 2014 -0400
 
 commit f4fe9baefdb7e0ff9946f88b6f4b55738fa30cdf
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit f4fe9baefdb7e0ff9946f88b6f4b55738fa30cdf
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 11:39:55 2014 -0400
+Date:  Fri Jul 25 11:39:55 2014 -0400
 
     Reject tags longer than 4 chars in hb_feature_from_string()
 
 
     Reject tags longer than 4 chars in hb_feature_from_string()
 
@@ -918,22 +2805,22 @@ Date:   Fri Jul 25 11:39:55 2014 -0400
 
 commit 7e8c38954649c0bf2e6051d84ca08dce090ec169
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 7e8c38954649c0bf2e6051d84ca08dce090ec169
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 25 11:18:11 2014 -0400
+Date:  Fri Jul 25 11:18:11 2014 -0400
 
     Minor warnings fixes
 
     Some systems insist on -Wmissing-field-initializers.  We have
     too many,
 
     Minor warnings fixes
 
     Some systems insist on -Wmissing-field-initializers.  We have
     too many,
-    by design.  Fix a few easy ones.
+    by design. Fix a few easy ones.
 
  src/hb-open-type-private.hh | 2 +-
  src/hb-ot-layout-private.hh | 2 +-
 
  src/hb-open-type-private.hh | 2 +-
  src/hb-ot-layout-private.hh | 2 +-
- src/hb-private.hh           | 2 +-
+ src/hb-private.hh          | 2 +-
  3 files changed, 3 insertions(+), 3 deletions(-)
 
 commit fc0daafab0336b847ac14682e581a8838f36a0bf
 Author: Behdad Esfahbod <behdad@behdad.org>
  3 files changed, 3 insertions(+), 3 deletions(-)
 
 commit fc0daafab0336b847ac14682e581a8838f36a0bf
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 23 16:48:51 2014 -0400
+Date:  Wed Jul 23 16:48:51 2014 -0400
 
     [indic] Handle old-spec Malayalam reordering with final Halant
 
 
     [indic] Handle old-spec Malayalam reordering with final Halant
 
@@ -941,20 +2828,20 @@ Date:   Wed Jul 23 16:48:51 2014 -0400
 
     Micro-tests added.
 
 
     Micro-tests added.
 
- src/hb-ot-shape-complex-indic.cc                   |  28
+ src/hb-ot-shape-complex-indic.cc                  |  28
  +++++++++++++++++----
  +++++++++++++++++----
- test/shaping/Makefile.am                           |   1 +
+ test/shaping/Makefile.am                          |   1 +
  .../270b89df543a7e48e206a2d830c0e10e5265c630.ttf   | Bin 0 -> 3428 bytes
  .../57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf   | Bin 0 -> 2272 bytes
  .../270b89df543a7e48e206a2d830c0e10e5265c630.ttf   | Bin 0 -> 3428 bytes
  .../57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf   | Bin 0 -> 2272 bytes
- test/shaping/fonts/sha1sum/MANIFEST                |   2 ++
- test/shaping/tests/MANIFEST                        |   1 +
- test/shaping/tests/indic-old-spec.tests            |   2 ++
- .../indic/script-malayalam/misc/misc.txt           |   1 +
+ test/shaping/fonts/sha1sum/MANIFEST               |   2 ++
+ test/shaping/tests/MANIFEST                       |   1 +
+ test/shaping/tests/indic-old-spec.tests           |   2 ++
+ .../indic/script-malayalam/misc/misc.txt          |   1 +
  8 files changed, 30 insertions(+), 5 deletions(-)
 
 commit d6d349d17898529ecdf8217a54987a3e9f81ce05
 Author: Behdad Esfahbod <behdad@behdad.org>
  8 files changed, 30 insertions(+), 5 deletions(-)
 
 commit d6d349d17898529ecdf8217a54987a3e9f81ce05
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Wed Jul 23 11:38:49 2014 -0400
+Date:  Wed Jul 23 11:38:49 2014 -0400
 
     Give CC to gir-scanner
 
 
     Give CC to gir-scanner
 
@@ -966,17 +2853,17 @@ Date:   Wed Jul 23 11:38:49 2014 -0400
 
 commit 8c1bdb46facb79cfca5ebfea9a7e467b40337f47
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 8c1bdb46facb79cfca5ebfea9a7e467b40337f47
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 22 17:56:43 2014 -0400
+Date:  Tue Jul 22 17:56:43 2014 -0400
 
     0.9.33
 
 
     0.9.33
 
- NEWS         | 10 ++++++++++
+ NEWS        | 10 ++++++++++
  configure.ac |  2 +-
  2 files changed, 11 insertions(+), 1 deletion(-)
 
 commit d218bdb26b226fbf68331eb586b24460c061313d
 Author: Behdad Esfahbod <behdad@behdad.org>
  configure.ac |  2 +-
  2 files changed, 11 insertions(+), 1 deletion(-)
 
 commit d218bdb26b226fbf68331eb586b24460c061313d
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 22 18:01:46 2014 -0400
+Date:  Tue Jul 22 18:01:46 2014 -0400
 
     Fix test runner under Windows
 
 
     Fix test runner under Windows
 
@@ -985,7 +2872,7 @@ Date:   Tue Jul 22 18:01:46 2014 -0400
 
 commit 3f310dc0cae9015c45ba642b9b83d5695c807aad
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 3f310dc0cae9015c45ba642b9b83d5695c807aad
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Tue Jul 22 16:26:27 2014 -0400
+Date:  Tue Jul 22 16:26:27 2014 -0400
 
     Disallow changing settings on immutable face
 
 
     Disallow changing settings on immutable face
 
@@ -998,7 +2885,7 @@ Date:   Tue Jul 22 16:26:27 2014 -0400
 
 commit 0fc0a1022854324261fea8893678a3e9fd9443eb
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 0fc0a1022854324261fea8893678a3e9fd9443eb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Mon Jul 21 11:12:54 2014 -0400
+Date:  Mon Jul 21 11:12:54 2014 -0400
 
     [win] Fix Cygwin build
 
 
     [win] Fix Cygwin build
 
@@ -1009,7 +2896,7 @@ Date:   Mon Jul 21 11:12:54 2014 -0400
 
 commit 1132a7dd0ecf1c425078e39e5471330bace42659
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 1132a7dd0ecf1c425078e39e5471330bace42659
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sun Jul 20 01:17:40 2014 -0400
+Date:  Sun Jul 20 01:17:40 2014 -0400
 
     Add HB_TAG_MAX_SIGNED / _HB_SCRIPT_MAX_VALUE_SIGNED
 
 
     Add HB_TAG_MAX_SIGNED / _HB_SCRIPT_MAX_VALUE_SIGNED
 
@@ -1020,7 +2907,7 @@ Date:   Sun Jul 20 01:17:40 2014 -0400
 
 commit df99976398a53521e0228541055dcaee8f5ba87f
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit df99976398a53521e0228541055dcaee8f5ba87f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 19 17:31:23 2014 -0400
+Date:  Sat Jul 19 17:31:23 2014 -0400
 
     [gobject] Skip _HB_SCRIPT_MAX_VALUE
 
 
     [gobject] Skip _HB_SCRIPT_MAX_VALUE
 
@@ -1031,7 +2918,7 @@ Date:   Sat Jul 19 17:31:23 2014 -0400
 
 commit f1a8d50a87edfb8147aa1bec732ed7ccbfef2877
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit f1a8d50a87edfb8147aa1bec732ed7ccbfef2877
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 19 16:52:32 2014 -0400
+Date:  Sat Jul 19 16:52:32 2014 -0400
 
     [win] Don't define visibility attribtue under Cygwin
 
 
     [win] Don't define visibility attribtue under Cygwin
 
@@ -1040,7 +2927,7 @@ Date:   Sat Jul 19 16:52:32 2014 -0400
 
 commit 9c77027d645142794c3ff1590a96bb151c3f2e91
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 9c77027d645142794c3ff1590a96bb151c3f2e91
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 19 16:37:22 2014 -0400
+Date:  Sat Jul 19 16:37:22 2014 -0400
 
     [win] Turn STRICT on for including windows.h
 
 
     [win] Turn STRICT on for including windows.h
 
@@ -1049,20 +2936,20 @@ Date:   Sat Jul 19 16:37:22 2014 -0400
 
 commit db308280488c2ee11ba865a9922eb6a0c1abeef3
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit db308280488c2ee11ba865a9922eb6a0c1abeef3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 19 16:32:04 2014 -0400
+Date:  Sat Jul 19 16:32:04 2014 -0400
 
     [win] Consolidate windows.h include tips and tricks
 
  src/hb-atomic-private.hh |  4 ----
  src/hb-mutex-private.hh  |  1 -
 
     [win] Consolidate windows.h include tips and tricks
 
  src/hb-atomic-private.hh |  4 ----
  src/hb-mutex-private.hh  |  1 -
- src/hb-private.hh        | 12 ++++++++++++
- src/hb-uniscribe.cc      |  3 ---
- src/hb-uniscribe.h       |  3 ---
+ src/hb-private.hh       | 12 ++++++++++++
+ src/hb-uniscribe.cc     |  3 ---
+ src/hb-uniscribe.h      |  3 ---
  5 files changed, 12 insertions(+), 11 deletions(-)
 
 commit f26d59d4684be3419c976d781b6dbc956248e3bb
 Author: Behdad Esfahbod <behdad@behdad.org>
  5 files changed, 12 insertions(+), 11 deletions(-)
 
 commit f26d59d4684be3419c976d781b6dbc956248e3bb
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Sat Jul 19 16:10:21 2014 -0400
+Date:  Sat Jul 19 16:10:21 2014 -0400
 
     More fixing MemoryBarrier() on Mingw32
 
 
     More fixing MemoryBarrier() on Mingw32
 
@@ -1075,37 +2962,37 @@ Date:   Sat Jul 19 16:10:21 2014 -0400
 
 commit 00a57eb4b50fd894dc68c6525a5bbebf0ebc30e4
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 00a57eb4b50fd894dc68c6525a5bbebf0ebc30e4
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 18 14:42:50 2014 -0400
+Date:  Fri Jul 18 14:42:50 2014 -0400
 
     [test] Remove unused micro-font
 
 
     [test] Remove unused micro-font
 
- .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf        | Bin 81968 ->
+ .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf       | Bin 81968 ->
  0 bytes
  0 bytes
- test/shaping/fonts/sha1sum/MANIFEST                     |   1 -
+ test/shaping/fonts/sha1sum/MANIFEST                    |   1 -
  2 files changed, 1 deletion(-)
 
 commit ed29b15f5d0d9e7b40143926ca7d40bf645f67e9
 Author: Behdad Esfahbod <behdad@behdad.org>
  2 files changed, 1 deletion(-)
 
 commit ed29b15f5d0d9e7b40143926ca7d40bf645f67e9
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Fri Jul 18 14:37:49 2014 -0400
+Date:  Fri Jul 18 14:37:49 2014 -0400
 
     [test] Add more Mongolian variation selector tests
 
     From
     https://code.google.com/p/chromium/issues/detail?id=393896
 
 
     [test] Add more Mongolian variation selector tests
 
     From
     https://code.google.com/p/chromium/issues/detail?id=393896
 
- .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf        | Bin 0 ->
+ .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf       | Bin 0 ->
  81968 bytes
  81968 bytes
- test/shaping/fonts/sha1sum/MANIFEST                     |   2 ++
- .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf        | Bin 0 ->
+ test/shaping/fonts/sha1sum/MANIFEST                    |   2 ++
+ .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf       | Bin 0 ->
  74856 bytes
  74856 bytes
- test/shaping/tests/mongolian-variation-selector.tests   |   1 +
- .../shaper-arabic/script-mongolian/misc/MANIFEST        |   1 +
- .../script-mongolian/misc/variation-selectors.txt       |   8 ++++++++
+ test/shaping/tests/mongolian-variation-selector.tests  |   1 +
+ .../shaper-arabic/script-mongolian/misc/MANIFEST       |   1 +
+ .../script-mongolian/misc/variation-selectors.txt      |   8 ++++++++
  6 files changed, 12 insertions(+)
 
 commit 385cf37cf084198e3aedb4354a7b025938a9f11b
 Author: Behdad Esfahbod <behdad@behdad.org>
  6 files changed, 12 insertions(+)
 
 commit 385cf37cf084198e3aedb4354a7b025938a9f11b
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 18:22:07 2014 -0400
+Date:  Thu Jul 17 18:22:07 2014 -0400
 
     Fix hb_in_range() unused-var warning on Windows
 
 
     Fix hb_in_range() unused-var warning on Windows
 
@@ -1114,7 +3001,7 @@ Date:   Thu Jul 17 18:22:07 2014 -0400
 
 commit e3b42f1af409c073b819bfc696024ccb1f1da63f
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit e3b42f1af409c073b819bfc696024ccb1f1da63f
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 17:13:54 2014 -0400
+Date:  Thu Jul 17 17:13:54 2014 -0400
 
     [arabic] Disable 'cswh' again
 
 
     [arabic] Disable 'cswh' again
 
@@ -1125,17 +3012,17 @@ Date:   Thu Jul 17 17:13:54 2014 -0400
 
 commit 66f30915b185727a0041c998641edb550eb8a7fc
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 66f30915b185727a0041c998641edb550eb8a7fc
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 16:05:47 2014 -0400
+Date:  Thu Jul 17 16:05:47 2014 -0400
 
     0.9.32
 
 
     0.9.32
 
- NEWS         | 12 ++++++++++++
+ NEWS        | 12 ++++++++++++
  configure.ac |  2 +-
  2 files changed, 13 insertions(+), 1 deletion(-)
 
 commit 82f4d9d53f348f41b14b877c1ac77c0372c49caa
 Author: Behdad Esfahbod <behdad@behdad.org>
  configure.ac |  2 +-
  2 files changed, 13 insertions(+), 1 deletion(-)
 
 commit 82f4d9d53f348f41b14b877c1ac77c0372c49caa
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 15:57:37 2014 -0400
+Date:  Thu Jul 17 15:57:37 2014 -0400
 
     [arabic] Add note re disabled 'cswh'
 
 
     [arabic] Add note re disabled 'cswh'
 
@@ -1144,7 +3031,7 @@ Date:   Thu Jul 17 15:57:37 2014 -0400
 
 commit 615d00ea252739da57edbd980ff27e573f88ee7e
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 615d00ea252739da57edbd980ff27e573f88ee7e
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 13:36:09 2014 -0400
+Date:  Thu Jul 17 13:36:09 2014 -0400
 
     [arabic] Apply init/medi/isol/fini/... in separate stages
 
 
     [arabic] Apply init/medi/isol/fini/... in separate stages
 
@@ -1153,20 +3040,20 @@ Date:   Thu Jul 17 13:36:09 2014 -0400
 
     Micro-tests for Arabic and Mongolian added for the latter.
 
 
     Micro-tests for Arabic and Mongolian added for the latter.
 
- src/hb-ot-shape-complex-arabic.cc                  |  56
+ src/hb-ot-shape-complex-arabic.cc                 |  56
  +++++++++++++--------
  +++++++++++++--------
- test/shaping/Makefile.am                           |   2 +
+ test/shaping/Makefile.am                          |   2 +
  .../813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf   | Bin 0 -> 3428 bytes
  .../8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf   | Bin 0 -> 3428 bytes
  .../813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf   | Bin 0 -> 3428 bytes
  .../8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf   | Bin 0 -> 3428 bytes
- test/shaping/fonts/sha1sum/MANIFEST                |   3 ++
+ test/shaping/fonts/sha1sum/MANIFEST               |   3 ++
  .../a919b33197965846f21074b24e30250d67277bce.ttf   | Bin 0 -> 12560 bytes
  .../a919b33197965846f21074b24e30250d67277bce.ttf   | Bin 0 -> 12560 bytes
- test/shaping/tests/MANIFEST                        |   1 +
- test/shaping/tests/arabic-feature-order.tests      |   3 ++
+ test/shaping/tests/MANIFEST                       |   1 +
+ test/shaping/tests/arabic-feature-order.tests     |   3 ++
  8 files changed, 43 insertions(+), 22 deletions(-)
 
 commit d21e997035b16e9807dfb29c3605abb93f92f1ee
 Author: Behdad Esfahbod <behdad@behdad.org>
  8 files changed, 43 insertions(+), 22 deletions(-)
 
 commit d21e997035b16e9807dfb29c3605abb93f92f1ee
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 15:27:46 2014 -0400
+Date:  Thu Jul 17 15:27:46 2014 -0400
 
     [test] Make record_test understand cmdline args to hb-shape
 
 
     [test] Make record_test understand cmdline args to hb-shape
 
@@ -1175,23 +3062,23 @@ Date:   Thu Jul 17 15:27:46 2014 -0400
 
 commit 7cd33f230441093dbfb1fec48f8c580ee8d9ef71
 Author: Behdad Esfahbod <behdad@behdad.org>
 
 commit 7cd33f230441093dbfb1fec48f8c580ee8d9ef71
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 14:22:11 2014 -0400
+Date:  Thu Jul 17 14:22:11 2014 -0400
 
     Micro optimization
 
 
     Micro optimization
 
- src/hb-fallback-shape.cc           | 36
+ src/hb-fallback-shape.cc          | 36
  +++++++++++++++++++-----------------
  src/hb-ot-shape-complex-arabic.cc  | 19 +++++++++++--------
  src/hb-ot-shape-complex-indic.cc   | 15 ++++++++++-----
  src/hb-ot-shape-complex-myanmar.cc |  7 +++++--
  src/hb-ot-shape-complex-sea.cc     |  7 +++++--
  +++++++++++++++++++-----------------
  src/hb-ot-shape-complex-arabic.cc  | 19 +++++++++++--------
  src/hb-ot-shape-complex-indic.cc   | 15 ++++++++++-----
  src/hb-ot-shape-complex-myanmar.cc |  7 +++++--
  src/hb-ot-shape-complex-sea.cc     |  7 +++++--
- src/hb-ot-shape-fallback.cc        | 30 ++++++++++++++++--------------
- src/hb-ot-shape.cc                 | 18 ++++++++++++------
+ src/hb-ot-shape-fallback.cc       | 30 ++++++++++++++++--------------
+ src/hb-ot-shape.cc                | 18 ++++++++++++------
  7 files changed, 78 insertions(+), 54 deletions(-)
 
 commit 164c13d73f67fdddba28e6409d76b4903e8ffab3
 Author: Behdad Esfahbod <behdad@behdad.org>
  7 files changed, 78 insertions(+), 54 deletions(-)
 
 commit 164c13d73f67fdddba28e6409d76b4903e8ffab3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 14:16:38 2014 -0400
+Date:  Thu Jul 17 14:16:38 2014 -0400
 
     Another try to fix Mongolian free variation selectors
 
 
     Another try to fix Mongolian free variation selectors
 
@@ -1203,23 +3090,23 @@ Date:   Thu Jul 17 14:16:38 2014 -0400
 
     https://code.google.com/p/chromium/issues/detail?id=393896
 
 
     https://code.google.com/p/chromium/issues/detail?id=393896
 
- src/hb-ot-shape-complex-arabic.cc                  |  24
+ src/hb-ot-shape-complex-arabic.cc                 |  24
  +++++++++++++++------
  +++++++++++++++------
- src/hb-unicode-private.hh                          |   3 ++-
- test/shaping/fonts/sha1sum/MANIFEST                |   1 +
+ src/hb-unicode-private.hh                         |   3 ++-
+ test/shaping/fonts/sha1sum/MANIFEST               |   1 +
  .../ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf   | Bin 0 -> 2748 bytes
  .../ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf   | Bin 0 -> 2748 bytes
- .../tests/mongolian-variation-selector.tests       |   1 +
+ .../tests/mongolian-variation-selector.tests      |   1 +
  5 files changed, 22 insertions(+), 7 deletions(-)
 
 commit 5209c505061130854a2bfea8849928ade3ee92f3
 Author: Behdad Esfahbod <behdad@behdad.org>
  5 files changed, 22 insertions(+), 7 deletions(-)
 
 commit 5209c505061130854a2bfea8849928ade3ee92f3
 Author: Behdad Esfahbod <behdad@behdad.org>
-Date:   Thu Jul 17 12:23:44 2014 -0400
+Date:  Thu Jul 17 12:23:44 2014 -0400
 
     Revert "Show U+FFFD REPLACEMENT CHARACTER for invalid Unicode
     codepoints"
 
     We now handle U+FFFD replacement in hb_buffer_add_utf*().  Any other
 
     Revert "Show U+FFFD REPLACEMENT CHARACTER for invalid Unicode
     codepoints"
 
     We now handle U+FFFD replacement in hb_buffer_add_utf*().  Any other
-    manipulation can happen in user callbacks.  No need for this.
+    manipulation can happen in user callbacks. No need for this.
 
     https://github.com/behdad/harfbuzz/commit/efe74214bbb68eaa3d7621e73869b5d58210107e#commitcomment-7039404
 
 
     https://github.com/behdad/harfbuzz/commit/efe74214bbb68eaa3d7621e73869b5d58210107e#commitcomment-7039404
 
index fa87114..47aeb97 100644 (file)
@@ -10,6 +10,7 @@ EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        Android.mk \
        autogen.sh \
        harfbuzz.doap \
        Android.mk \
+       README.python \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -18,6 +19,7 @@ MAINTAINERCLEANFILES = \
        $(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
        $(srcdir)/INSTALL \
        $(srcdir)/ChangeLog \
        $(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
        $(srcdir)/INSTALL \
        $(srcdir)/ChangeLog \
+       $(srcdir)/gtk-doc.make \
        $(NULL)
 
 
        $(NULL)
 
 
index 61de622..badd4c0 100644 (file)
@@ -371,6 +371,7 @@ EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        Android.mk \
        autogen.sh \
        harfbuzz.doap \
        Android.mk \
+       README.python \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -379,6 +380,7 @@ MAINTAINERCLEANFILES = \
        $(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
        $(srcdir)/INSTALL \
        $(srcdir)/ChangeLog \
        $(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
        $(srcdir)/INSTALL \
        $(srcdir)/ChangeLog \
+       $(srcdir)/gtk-doc.make \
        $(NULL)
 
 
        $(NULL)
 
 
diff --git a/NEWS b/NEWS
index adc8f69..c4950e2 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,64 @@
+Overview of changes leading to 0.9.40
+Friday, March 20, 2015
+=====================================
+
+- Another hb-coretext crasher fix.  Ouch!
+- Happy Norouz!
+
+
+Overview of changes leading to 0.9.39
+Wednesday, March 4, 2015
+=====================================
+
+- Critical hb-coretext fixes.
+- Optimizations and refactoring; no functional change
+  expected.
+- Misc build fixes.
+
+
+Overview of changes leading to 0.9.38
+Friday, January 23, 2015
+=====================================
+
+- Fix minor out-of-bounds access in Indic shaper.
+- Change New Tai Lue shaping engine from South-East Asian to default,
+  reflecting change in Unicode encoding model.
+- Add hb-shape --font-size.  Can take up to two numbers for separate
+  x / y size.
+- Fix CoreText and FreeType scale issues with negative scales.
+- Reject blobs larger than 2GB.  This might break some icu-le-hb clients
+  that need security fixes.  See:
+  http://www.icu-project.org/trac/ticket/11450
+- Avoid accessing font tables during face destruction, in casce rogue
+  clients released face data already.
+- Fix up gobject-introspection a bit.  Python bindings kinda working.
+  See README.python.
+- Misc fixes.
+- API additions:
+  hb_ft_face_create_referenced()
+  hb_ft_font_create_referenced()
+
+
+Overview of changes leading to 0.9.37
+Wednesday, December 17, 2014
+=====================================
+
+- Fix out-of-bounds access in Context lookup format 3.
+- Indic: Allow ZWJ/ZWNJ before syllable modifiers.
+
+
+Overview of changes leading to 0.9.36
+Thursday, November 20, 2014
+=====================================
+
+- First time that three months went by without a release since
+  0.9.2 was released on August 10, 2012!
+- Fix performance bug in hb_ot_collect_glyphs():
+  https://bugzilla.mozilla.org/show_bug.cgi?id=1090869
+- Add basic vertical-text support to hb-ot-font.
+- Misc build fixes.
+
+
 Overview of changes leading to 0.9.35
 Saturday, August 13, 2014
 =====================================
 Overview of changes leading to 0.9.35
 Saturday, August 13, 2014
 =====================================
diff --git a/README b/README
index 74e739d..d34bc74 100644 (file)
--- a/README
+++ b/README
@@ -1,3 +1,6 @@
+[![Build Status](https://travis-ci.org/behdad/harfbuzz.svg)](https://travis-ci.org/behdad/harfbuzz)
+[![Coverage Status](https://img.shields.io/coveralls/behdad/harfbuzz.svg)](https://coveralls.io/r/behdad/harfbuzz)
+
 This is HarfBuzz, a text shaping library.
 
 For bug reports, mailing list, and other information please visit:
 This is HarfBuzz, a text shaping library.
 
 For bug reports, mailing list, and other information please visit:
diff --git a/README.python b/README.python
new file mode 100644 (file)
index 0000000..eabdf5b
--- /dev/null
@@ -0,0 +1,26 @@
+To enable HarfBuzz bindings for Python among other languages, make sure
+you have latest version of gobject-introspection compiled, and then
+run autogen.sh (if building from git), and then:
+
+  ./configure --with-gobject --enable-introspection
+
+Make sure that gobject-introspection is enabled then in the final report.
+
+Compile and install.
+
+Make sure you have the installation lib dir in LD_LIBRARY_PATH, as needed
+for the linker to find the library.
+
+Then make sure you also have GI_TYPELIB_PATH pointing to the resulting
+$prefix/lib/girepository-* directory.
+
+Make sure you have pygobject installed.  Then check that the following
+import works in your Python interpretter:
+
+  from gi.repository import HarfBuzz
+
+If it does, you are ready to call HarfBuzz from Python!  Congratulations.
+See src/sample.py.
+
+The Python API will change.  Let us know on the mailing list if you are
+using it, and send lots of feedback.
index a267f29..ff1b0c0 100755 (executable)
@@ -19,17 +19,22 @@ which pkg-config || {
        exit 1
 }
 
        exit 1
 }
 
+echo -n "checking for libtoolize... "
+which glibtoolize || which libtoolize || {
+       echo "*** No libtoolize (libtool) found, please install it ***"
+       exit 1
+}
 echo -n "checking for gtkdocize... "
 if which gtkdocize ; then
        gtkdocize --copy || exit 1
 else
 echo -n "checking for gtkdocize... "
 if which gtkdocize ; then
        gtkdocize --copy || exit 1
 else
-       echo "*** No gtkdocize found, skipping documentation ***"
+       echo "*** No gtkdocize (gtk-doc) found, skipping documentation ***"
        echo "EXTRA_DIST = " > gtk-doc.make
 fi
 
 echo -n "checking for autoreconf... "
 which autoreconf || {
        echo "EXTRA_DIST = " > gtk-doc.make
 fi
 
 echo -n "checking for autoreconf... "
 which autoreconf || {
-       echo "*** No autoreconf found, please install it ***"
+       echo "*** No autoreconf (autoconf) found, please install it ***"
        exit 1
 }
 
        exit 1
 }
 
index 491e7f4..35395c3 100644 (file)
@@ -24,9 +24,6 @@
 /* Have FreeType 2 library */
 #undef HAVE_FREETYPE
 
 /* Have FreeType 2 library */
 #undef HAVE_FREETYPE
 
-/* Define to 1 if you have the `FT_Face_GetCharVariantIndex' function. */
-#undef HAVE_FT_FACE_GETCHARVARIANTINDEX
-
 /* Define to 1 if you have the `getpagesize' function. */
 #undef HAVE_GETPAGESIZE
 
 /* Define to 1 if you have the `getpagesize' function. */
 #undef HAVE_GETPAGESIZE
 
index 84e04c7..1c08cae 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /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 0.9.35.
+# Generated by GNU Autoconf 2.69 for HarfBuzz 0.9.40.
 #
 # Report bugs to <http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz>.
 #
 #
 # Report bugs to <http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz>.
 #
@@ -591,8 +591,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='HarfBuzz'
 PACKAGE_TARNAME='harfbuzz'
 # Identity of this package.
 PACKAGE_NAME='HarfBuzz'
 PACKAGE_TARNAME='harfbuzz'
-PACKAGE_VERSION='0.9.35'
-PACKAGE_STRING='HarfBuzz 0.9.35'
+PACKAGE_VERSION='0.9.40'
+PACKAGE_STRING='HarfBuzz 0.9.40'
 PACKAGE_BUGREPORT='http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz'
 PACKAGE_URL='http://harfbuzz.org/'
 
 PACKAGE_BUGREPORT='http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz'
 PACKAGE_URL='http://harfbuzz.org/'
 
@@ -1445,7 +1445,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 0.9.35 to adapt to many kinds of systems.
+\`configure' configures HarfBuzz 0.9.40 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1515,7 +1515,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 0.9.35:";;
+     short | recursive ) echo "Configuration of HarfBuzz 0.9.40:";;
    esac
   cat <<\_ACEOF
 
    esac
   cat <<\_ACEOF
 
@@ -1674,7 +1674,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 0.9.35
+HarfBuzz configure 0.9.40
 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.
@@ -2401,7 +2401,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 0.9.35, which was
+It was created by HarfBuzz $as_me 0.9.40, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3270,7 +3270,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='harfbuzz'
 
 # Define the identity of the package.
  PACKAGE='harfbuzz'
- VERSION='0.9.35'
+ VERSION='0.9.40'
 
 
 # Some tools Automake needs.
 
 
 # Some tools Automake needs.
@@ -16813,8 +16813,8 @@ GIT=${GIT-"${am_missing_run}git"}
 
 HB_VERSION_MAJOR=0
 HB_VERSION_MINOR=9
 
 HB_VERSION_MAJOR=0
 HB_VERSION_MINOR=9
-HB_VERSION_MICRO=35
-HB_VERSION=0.9.35
+HB_VERSION_MICRO=40
+HB_VERSION=0.9.40
 
 
 
 
 
 
@@ -16825,7 +16825,7 @@ HB_VERSION=0.9.35
 
 
 
 
 
 
-HB_LIBTOOL_VERSION_INFO=935:0:935
+HB_LIBTOOL_VERSION_INFO=940:0:940
 
 
 # Documentation
 
 
 # Documentation
@@ -18618,6 +18618,7 @@ fi
 
 have_freetype=false
 if test "x$with_freetype" = "xyes" -o "x$with_freetype" = "xauto"; then
 
 have_freetype=false
 if test "x$with_freetype" = "xyes" -o "x$with_freetype" = "xauto"; then
+       # See freetype/docs/VERSION.DLL; 12.0.6 means freetype-2.4.2
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5
@@ -18628,12 +18629,12 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
         pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 2.3.8\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "freetype2 >= 2.3.8") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 12.0.6\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "freetype2 >= 12.0.6") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2 >= 2.3.8" 2>/dev/null`
+  pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2 >= 12.0.6" 2>/dev/null`
 else
   pkg_failed=yes
 fi
 else
   pkg_failed=yes
 fi
@@ -18646,12 +18647,12 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
         pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 2.3.8\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "freetype2 >= 2.3.8") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 12.0.6\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "freetype2 >= 12.0.6") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2 >= 2.3.8" 2>/dev/null`
+  pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2 >= 12.0.6" 2>/dev/null`
 else
   pkg_failed=yes
 fi
 else
   pkg_failed=yes
 fi
@@ -18670,9 +18671,9 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-               FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "freetype2 >= 2.3.8"`
+               FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "freetype2 >= 12.0.6"`
         else
         else
-               FREETYPE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "freetype2 >= 2.3.8"`
+               FREETYPE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "freetype2 >= 12.0.6"`
         fi
        # Put the nasty error message in config.log where it belongs
        echo "$FREETYPE_PKG_ERRORS" >&5
         fi
        # Put the nasty error message in config.log where it belongs
        echo "$FREETYPE_PKG_ERRORS" >&5
@@ -18697,23 +18698,6 @@ if $have_freetype; then
 
 $as_echo "#define HAVE_FREETYPE 1" >>confdefs.h
 
 
 $as_echo "#define HAVE_FREETYPE 1" >>confdefs.h
 
-       _save_libs="$LIBS"
-       _save_cflags="$CFLAGS"
-       LIBS="$LIBS $FREETYPE_LIBS"
-       CFLAGS="$CFLAGS $FREETYPE_CFLAGS"
-       for ac_func in FT_Face_GetCharVariantIndex
-do :
-  ac_fn_c_check_func "$LINENO" "FT_Face_GetCharVariantIndex" "ac_cv_func_FT_Face_GetCharVariantIndex"
-if test "x$ac_cv_func_FT_Face_GetCharVariantIndex" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_FT_FACE_GETCHARVARIANTINDEX 1
-_ACEOF
-
-fi
-done
-
-       LIBS="$_save_libs"
-       CFLAGS="$_save_cflags"
 fi
  if $have_freetype; then
   HAVE_FREETYPE_TRUE=
 fi
  if $have_freetype; then
   HAVE_FREETYPE_TRUE=
@@ -19622,7 +19606,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 0.9.35, which was
+This file was extended by HarfBuzz $as_me 0.9.40, 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
@@ -19689,7 +19673,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
 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 0.9.35
+HarfBuzz config.status 0.9.40
 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\\"
 
index b9e82d9..5baad1f 100644 (file)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [0.9.35],
+        [0.9.40],
         [http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz],
         [harfbuzz],
         [http://harfbuzz.org/])
         [http://bugs.freedesktop.org/enter_bug.cgi?product=harfbuzz],
         [harfbuzz],
         [http://harfbuzz.org/])
@@ -285,7 +285,7 @@ if test "x$with_graphite2" = "xyes" -a "x$have_graphite2" != "xtrue"; then
        AC_MSG_ERROR([graphite2 support requested but libgraphite2 not found])
 fi
 if $have_graphite2; then
        AC_MSG_ERROR([graphite2 support requested but libgraphite2 not found])
 fi
 if $have_graphite2; then
-    AC_DEFINE(HAVE_GRAPHITE2, 1, [Have Graphite2 library])
+       AC_DEFINE(HAVE_GRAPHITE2, 1, [Have Graphite2 library])
 fi
 AM_CONDITIONAL(HAVE_GRAPHITE2, $have_graphite2)
 
 fi
 AM_CONDITIONAL(HAVE_GRAPHITE2, $have_graphite2)
 
@@ -297,20 +297,14 @@ AC_ARG_WITH(freetype,
        [with_freetype=auto])
 have_freetype=false
 if test "x$with_freetype" = "xyes" -o "x$with_freetype" = "xauto"; then
        [with_freetype=auto])
 have_freetype=false
 if test "x$with_freetype" = "xyes" -o "x$with_freetype" = "xauto"; then
-       PKG_CHECK_MODULES(FREETYPE, freetype2 >= 2.3.8, have_freetype=true, :)
+       # See freetype/docs/VERSION.DLL; 12.0.6 means freetype-2.4.2
+       PKG_CHECK_MODULES(FREETYPE, freetype2 >= 12.0.6, have_freetype=true, :)
 fi
 if test "x$with_freetype" = "xyes" -a "x$have_freetype" != "xtrue"; then
        AC_MSG_ERROR([FreeType support requested but libfreetype2 not found])
 fi
 if $have_freetype; then
        AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library])
 fi
 if test "x$with_freetype" = "xyes" -a "x$have_freetype" != "xtrue"; then
        AC_MSG_ERROR([FreeType support requested but libfreetype2 not found])
 fi
 if $have_freetype; then
        AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library])
-       _save_libs="$LIBS"
-       _save_cflags="$CFLAGS"
-       LIBS="$LIBS $FREETYPE_LIBS"
-       CFLAGS="$CFLAGS $FREETYPE_CFLAGS"
-       AC_CHECK_FUNCS(FT_Face_GetCharVariantIndex)
-       LIBS="$_save_libs"
-       CFLAGS="$_save_cflags"
 fi
 AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
 
 fi
 AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
 
index f3ddc22..034926c 100644 (file)
@@ -1 +1,3 @@
 SUBDIRS = reference
 SUBDIRS = reference
+
+-include $(top_srcdir)/git.mk
index 615c464..f8fe860 100644 (file)
@@ -650,6 +650,8 @@ uninstall-am:
        ps ps-am tags tags-am uninstall uninstall-am
 
 
        ps ps-am tags tags-am uninstall uninstall-am
 
 
+-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:
 # 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:
index a78200e..1afb91d 100644 (file)
@@ -18,6 +18,8 @@
                     Â <span class="dim">|</span> 
                   <a class="shortcut" href="#glsD">D</a>
                     Â <span class="dim">|</span> 
                     Â <span class="dim">|</span> 
                   <a class="shortcut" href="#glsD">D</a>
                     Â <span class="dim">|</span> 
+                  <a class="shortcut" href="#glsE">E</a>
+                    Â <span class="dim">|</span> 
                   <a class="shortcut" href="#glsI">I</a>
                     Â <span class="dim">|</span> 
                   <a class="shortcut" href="#glsO">O</a>
                   <a class="shortcut" href="#glsI">I</a>
                     Â <span class="dim">|</span> 
                   <a class="shortcut" href="#glsO">O</a>
@@ -35,9 +37,6 @@
 <a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
 <a name="glsA"></a><h3 class="title">A</h3>
 <dt>
 <a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
 <a name="glsA"></a><h3 class="title">A</h3>
 <dt>
-<a name="annotation-glossterm-allow-none"></a>allow-none</dt>
-<dd><p>NULL is ok, both for passing and for returning.</p></dd>
-<dt>
 <a name="annotation-glossterm-array"></a>array</dt>
 <dd><p>Parameter points to an array of items.</p></dd>
 <a name="glsC"></a><h3 class="title">C</h3>
 <a name="annotation-glossterm-array"></a>array</dt>
 <dd><p>Parameter points to an array of items.</p></dd>
 <a name="glsC"></a><h3 class="title">C</h3>
 <dt>
 <a name="annotation-glossterm-destroy"></a>destroy</dt>
 <dd><p>This parameter is a 'destroy_data', for callbacks.</p></dd>
 <dt>
 <a name="annotation-glossterm-destroy"></a>destroy</dt>
 <dd><p>This parameter is a 'destroy_data', for callbacks.</p></dd>
+<a name="glsE"></a><h3 class="title">E</h3>
+<dt>
+<a name="annotation-glossterm-element-type"></a>element-type</dt>
+<dd><p>Generics and defining elements of containers and arrays.</p></dd>
 <a name="glsI"></a><h3 class="title">I</h3>
 <dt>
 <a name="annotation-glossterm-inout"></a>inout</dt>
 <a name="glsI"></a><h3 class="title">I</h3>
 <dt>
 <a name="annotation-glossterm-inout"></a>inout</dt>
index 58329ec..a86abae 100644 (file)
@@ -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="idp8266576"></a>[Insert title here]</h2></div></div></div>
+<a name="idp8290832"></a>[Insert title here]</h2></div></div></div>
 <div class="toc"><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
 <div class="toc"><dl>
 <dt>
 <span class="refentrytitle"><a href="harfbuzz-hb.html">hb</a></span><span class="refpurpose"></span>
index 00f828d..b7f9a12 100644 (file)
@@ -179,12 +179,60 @@ hb_blob_create (<em class="parameter"><code>const <span class="type">char</span>
                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-memory-mode-t" title="enum hb_memory_mode_t"><span class="type">hb_memory_mode_t</span></a> mode</code></em>,
                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-memory-mode-t" title="enum hb_memory_mode_t"><span class="type">hb_memory_mode_t</span></a> mode</code></em>,
                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
-<p>
-</p>
+<p>Creates a new "blob" object wrapping <em class="parameter"><code>data</code></em>
+.  The <em class="parameter"><code>mode</code></em>
+ parameter is used
+to negotiate ownership and lifecycle of <em class="parameter"><code>data</code></em>
+.</p>
+<div class="refsect3">
+<a name="idp17456912"></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>data</p></td>
+<td class="parameter_description"><p>Pointer to blob data.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>length</p></td>
+<td class="parameter_description"><p>Length of <em class="parameter"><code>data</code></em>
+in bytes.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>mode</p></td>
+<td class="parameter_description"><p>Memory mode for <em class="parameter"><code>data</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>Data parameter to pass to <em class="parameter"><code>destroy</code></em>
+.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>destroy</p></td>
+<td class="parameter_description"><p>Callback to call when <em class="parameter"><code>data</code></em>
+is not needed anymore.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
 <div class="refsect3">
 <div class="refsect3">
-<a name="idp8155232"></a><h4>Returns</h4>
+<a name="idp18906304"></a><h4>Returns</h4>
+<p> New blob, or the empty blob if something failed or if <em class="parameter"><code>length</code></em>
+is
+zero.  Destroy with <a class="link" href="harfbuzz-hb-blob.html#hb-blob-destroy" title="hb_blob_destroy ()"><code class="function">hb_blob_destroy()</code></a>.</p>
 <p></p>
 </div>
 <p></p>
 </div>
+<p class="since">Since 1.0</p>
 </div>
 <hr>
 <div class="refsect2">
 </div>
 <hr>
 <div class="refsect2">
@@ -202,7 +250,7 @@ is.</p>
 <p>Makes <em class="parameter"><code>parent</code></em>
  immutable.</p>
 <div class="refsect3">
 <p>Makes <em class="parameter"><code>parent</code></em>
  immutable.</p>
 <div class="refsect3">
-<a name="idp17402736"></a><h4>Parameters</h4>
+<a name="idp13979952"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -230,7 +278,7 @@ is.</p>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp17140192"></a><h4>Returns</h4>
+<a name="idp20653328"></a><h4>Returns</h4>
 <p> New blob, or the empty blob if something failed or if
 <em class="parameter"><code>length</code></em>
 is zero or <em class="parameter"><code>offset</code></em>
 <p> New blob, or the empty blob if something failed or if
 <em class="parameter"><code>length</code></em>
 is zero or <em class="parameter"><code>offset</code></em>
@@ -253,7 +301,7 @@ hb_blob_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-b
 was created for if it has not been called already.</p>
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
 was created for if it has not been called already.</p>
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
-<a name="idp18089520"></a><h4>Parameters</h4>
+<a name="idp21977536"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -276,7 +324,7 @@ was created for if it has not been called already.</p>
 hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
 <div class="refsect3">
 hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> *length</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21534832"></a><h4>Parameters</h4>
+<a name="idp21995504"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -298,7 +346,7 @@ hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21133808"></a><h4>Returns</h4>
+<a name="idp22007616"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
 </div>
 <p>. </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>
@@ -315,7 +363,7 @@ return pointer to data.</p>
 <p>Fails if blob has been made immutable, or if memory allocation
 fails.</p>
 <div class="refsect3">
 <p>Fails if blob has been made immutable, or if memory allocation
 fails.</p>
 <div class="refsect3">
-<a name="idp21147760"></a><h4>Parameters</h4>
+<a name="idp22021568"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -337,7 +385,7 @@ fails.</p>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21159888"></a><h4>Returns</h4>
+<a name="idp22033696"></a><h4>Returns</h4>
 <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>
 <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>
@@ -352,7 +400,7 @@ hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <p>Returns the singleton empty blob.</p>
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
 <p>Returns the singleton empty blob.</p>
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
-<a name="idp21172704"></a><h4>Returns</h4>
+<a name="idp22046512"></a><h4>Returns</h4>
 <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> 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>
@@ -364,7 +412,7 @@ hb_blob_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21183504"></a><h4>Parameters</h4>
+<a name="idp22057312"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -379,7 +427,7 @@ hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21191904"></a><h4>Returns</h4>
+<a name="idp22065712"></a><h4>Returns</h4>
 <p> the length of blob data in bytes.</p>
 <p></p>
 </div>
 <p> the length of blob data in bytes.</p>
 <p></p>
 </div>
@@ -392,7 +440,7 @@ hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-h
 hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21203104"></a><h4>Parameters</h4>
+<a name="idp22076912"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -414,7 +462,7 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21214112"></a><h4>Returns</h4>
+<a name="idp22087920"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -426,7 +474,7 @@ hb_blob_get_user_data (<em class="parameter"><code><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_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">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21224768"></a><h4>Parameters</h4>
+<a name="idp22098576"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -441,7 +489,7 @@ hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21233168"></a><h4>Returns</h4>
+<a name="idp21531488"></a><h4>Returns</h4>
 <p> TODO</p>
 <p></p>
 </div>
 <p> TODO</p>
 <p></p>
 </div>
@@ -453,7 +501,7 @@ hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_blob_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_blob_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="type">hb_blob_t</span></a> *blob</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21242720"></a><h4>Parameters</h4>
+<a name="idp21541040"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -478,7 +526,7 @@ hb_blob_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 .</p>
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
 .</p>
 <p>See TODO:link object types for more information.</p>
 <div class="refsect3">
-<a name="idp21260576"></a><h4>Parameters</h4>
+<a name="idp21558896"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -493,7 +541,7 @@ hb_blob_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21268976"></a><h4>Returns</h4>
+<a name="idp21567296"></a><h4>Returns</h4>
 <p> <em class="parameter"><code>blob</code></em>
 .</p>
 <p></p>
 <p> <em class="parameter"><code>blob</code></em>
 .</p>
 <p></p>
@@ -510,7 +558,7 @@ hb_blob_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21285920"></a><h4>Parameters</h4>
+<a name="idp21584240"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -548,7 +596,7 @@ is not needed anymore.</p></td>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21305600"></a><h4>Returns</h4>
+<a name="idp21603920"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -569,7 +617,7 @@ is not needed anymore.</p></td>
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21317472"></a><h4>Members</h4>
+<a name="idp21615792"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
index a4214dd..0c32fc8 100644 (file)
@@ -482,7 +482,7 @@ hb_buffer_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buf
                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>,
                <em class="parameter"><code>unsigned <span class="type">int</span> cluster</code></em>);</pre>
 <div class="refsect3">
                <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> codepoint</code></em>,
                <em class="parameter"><code>unsigned <span class="type">int</span> cluster</code></em>);</pre>
 <div class="refsect3">
-<a name="idp20929456"></a><h4>Parameters</h4>
+<a name="idp20358224"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -508,7 +508,7 @@ hb_buffer_add_utf16 (<em class="parameter"><code><a class="link" href="harfbuzz-
                      <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
                      <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
 <div class="refsect3">
                      <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
                      <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
 <div class="refsect3">
-<a name="idp20952352"></a><h4>Parameters</h4>
+<a name="idp20381120"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -541,7 +541,7 @@ hb_buffer_add_utf32 (<em class="parameter"><code><a class="link" href="harfbuzz-
                      <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
                      <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
 <div class="refsect3">
                      <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
                      <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
 <div class="refsect3">
-<a name="idp20978960"></a><h4>Parameters</h4>
+<a name="idp20407728"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -574,7 +574,7 @@ hb_buffer_add_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-h
                     <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
                     <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
 <div class="refsect3">
                     <em class="parameter"><code>unsigned <span class="type">int</span> item_offset</code></em>,
                     <em class="parameter"><code><span class="type">int</span> item_length</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21005488"></a><h4>Parameters</h4>
+<a name="idp20434256"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -590,7 +590,7 @@ hb_buffer_add_utf8 (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <tr>
 <td class="parameter_name"><p>text</p></td>
 <td class="parameter_description"><p>. </p></td>
 <tr>
 <td class="parameter_name"><p>text</p></td>
 <td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=text_length]</span></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>
 </tbody>
 </table></div>
 </tr>
 </tbody>
 </table></div>
@@ -614,7 +614,7 @@ hb_buffer_add_codepoints (<em class="parameter"><code><a class="link" href="harf
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21039872"></a><h4>Parameters</h4>
+<a name="idp20469136"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -629,7 +629,7 @@ hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" hre
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21048272"></a><h4>Returns</h4>
+<a name="idp20477536"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -640,7 +640,7 @@ hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" hre
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_clear_contents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_clear_contents (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21057392"></a><h4>Parameters</h4>
+<a name="idp20486656"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -664,7 +664,7 @@ hb_buffer_create (<em class="parameter"><code><span class="type">void</span></co
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21072704"></a><h4>Returns</h4>
+<a name="idp20501968"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -679,7 +679,7 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-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">
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-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="idp21089760"></a><h4>Parameters</h4>
+<a name="idp20519024"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -706,7 +706,7 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22503936"></a><h4>Returns</h4>
+<a name="idp22130896"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -717,7 +717,7 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22511728"></a><h4>Parameters</h4>
+<a name="idp22138688"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -739,7 +739,7 @@ hb_buffer_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="returnvalue">hb_buffer_content_type_t</span></a>
 hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="returnvalue">hb_buffer_content_type_t</span></a>
 hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22525760"></a><h4>Parameters</h4>
+<a name="idp22152720"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -754,7 +754,7 @@ hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="ha
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22533264"></a><h4>Returns</h4>
+<a name="idp22160224"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -765,7 +765,7 @@ hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="ha
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
 hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
 hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22541056"></a><h4>Parameters</h4>
+<a name="idp22168016"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -780,7 +780,7 @@ hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22548560"></a><h4>Returns</h4>
+<a name="idp22175520"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -791,7 +791,7 @@ hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfb
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
 hb_buffer_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
 hb_buffer_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp22555808"></a><h4>Returns</h4>
+<a name="idp22182768"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -803,7 +803,7 @@ hb_buffer_get_empty (<em class="parameter"><code><span class="type">void</span><
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="returnvalue">hb_buffer_flags_t</span></a>
 hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="returnvalue">hb_buffer_flags_t</span></a>
 hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22565008"></a><h4>Parameters</h4>
+<a name="idp22191968"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -818,7 +818,7 @@ hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22572512"></a><h4>Returns</h4>
+<a name="idp22199472"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -832,7 +832,7 @@ hb_buffer_get_glyph_infos (<em class="parameter"><code><a class="link" href="har
 <p>Returns buffer glyph information array.  Returned pointer
 is valid as long as buffer contents are not modified.</p>
 <div class="refsect3">
 <p>Returns buffer glyph information array.  Returned pointer
 is valid as long as buffer contents are not modified.</p>
 <div class="refsect3">
-<a name="idp22582256"></a><h4>Parameters</h4>
+<a name="idp22209216"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -854,7 +854,7 @@ is valid as long as buffer contents are not modified.</p>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22593088"></a><h4>Returns</h4>
+<a name="idp22220048"></a><h4>Returns</h4>
 <p> buffer glyph information array. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
 </div>
 <p> buffer glyph information array. </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>
@@ -869,7 +869,7 @@ hb_buffer_get_glyph_positions (<em class="parameter"><code><a class="link" href=
 <p>Returns buffer glyph position array.  Returned pointer
 is valid as long as buffer contents are not modified.</p>
 <div class="refsect3">
 <p>Returns buffer glyph position array.  Returned pointer
 is valid as long as buffer contents are not modified.</p>
 <div class="refsect3">
-<a name="idp22604800"></a><h4>Parameters</h4>
+<a name="idp22231760"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -891,7 +891,7 @@ is valid as long as buffer contents are not modified.</p>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22615632"></a><h4>Returns</h4>
+<a name="idp22242592"></a><h4>Returns</h4>
 <p> buffer glyph position array. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=length]</span></p>
 </div>
 <p> buffer glyph position array. </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>
@@ -903,7 +903,7 @@ is valid as long as buffer contents are not modified.</p>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="returnvalue">hb_language_t</span></a>
 hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="returnvalue">hb_language_t</span></a>
 hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22625264"></a><h4>Parameters</h4>
+<a name="idp22252224"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -918,7 +918,7 @@ hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbu
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22632768"></a><h4>Returns</h4>
+<a name="idp22259728"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -930,7 +930,7 @@ hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbu
 hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <p>Returns the number of items in the buffer.</p>
 <div class="refsect3">
 hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <p>Returns the number of items in the buffer.</p>
 <div class="refsect3">
-<a name="idp22641136"></a><h4>Parameters</h4>
+<a name="idp22268096"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -945,7 +945,7 @@ hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22648640"></a><h4>Returns</h4>
+<a name="idp22275600"></a><h4>Returns</h4>
 <p> buffer length.</p>
 <p></p>
 </div>
 <p> buffer length.</p>
 <p></p>
 </div>
@@ -964,7 +964,7 @@ hb_buffer_get_replacement_codepoint (<em class="parameter"><code><a class="link"
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
 hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
 hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22663392"></a><h4>Parameters</h4>
+<a name="idp22290352"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -979,7 +979,7 @@ hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22670896"></a><h4>Returns</h4>
+<a name="idp22297856"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -991,7 +991,7 @@ hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz
 hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22680064"></a><h4>Parameters</h4>
+<a name="idp22307024"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1013,7 +1013,7 @@ hb_buffer_get_segment_properties (<em class="parameter"><code><a class="link" hr
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22694096"></a><h4>Parameters</h4>
+<a name="idp22321056"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1028,7 +1028,7 @@ hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22701600"></a><h4>Returns</h4>
+<a name="idp22328560"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1040,7 +1040,7 @@ hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22710768"></a><h4>Parameters</h4>
+<a name="idp22337728"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1055,7 +1055,7 @@ hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22718272"></a><h4>Returns</h4>
+<a name="idp22345232"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1080,7 +1080,7 @@ it will be set to the process's default language as returned by
 <a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()"><code class="function">hb_language_get_default()</code></a>.  This may change in the future by
 taking buffer script into consideration when choosing a language.</p>
 <div class="refsect3">
 <a class="link" href="harfbuzz-hb-common.html#hb-language-get-default" title="hb_language_get_default ()"><code class="function">hb_language_get_default()</code></a>.  This may change in the future by
 taking buffer script into consideration when choosing a language.</p>
 <div class="refsect3">
-<a name="idp22738080"></a><h4>Parameters</h4>
+<a name="idp22365040"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1102,7 +1102,7 @@ taking buffer script into consideration when choosing a language.</p>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_normalize_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_normalize_glyphs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22752112"></a><h4>Parameters</h4>
+<a name="idp22379072"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1125,7 +1125,7 @@ hb_buffer_normalize_glyphs (<em class="parameter"><code><a class="link" href="ha
 hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22767664"></a><h4>Parameters</h4>
+<a name="idp22394624"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1140,7 +1140,7 @@ hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbu
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22775168"></a><h4>Returns</h4>
+<a name="idp22402128"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1151,7 +1151,7 @@ hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbu
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
 hb_buffer_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="returnvalue">hb_buffer_t</span></a> *
 hb_buffer_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22782960"></a><h4>Parameters</h4>
+<a name="idp22409920"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1166,7 +1166,7 @@ hb_buffer_reference (<em class="parameter"><code><a class="link" href="harfbuzz-
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22790464"></a><h4>Returns</h4>
+<a name="idp22417424"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -1178,7 +1178,7 @@ hb_buffer_reference (<em class="parameter"><code><a class="link" href="harfbuzz-
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_reset (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_buffer_reset (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22799664"></a><h4>Parameters</h4>
+<a name="idp22426624"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1201,7 +1201,7 @@ hb_buffer_reset (<em class="parameter"><code><a class="link" href="harfbuzz-hb-b
 hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <p>Reverses buffer contents.</p>
 <div class="refsect3">
 hb_buffer_reverse (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>);</pre>
 <p>Reverses buffer contents.</p>
 <div class="refsect3">
-<a name="idp22814128"></a><h4>Parameters</h4>
+<a name="idp22441088"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1226,7 +1226,7 @@ hb_buffer_reverse_clusters (<em class="parameter"><code><a class="link" href="ha
 reversed, then each cluster (consecutive items having the
 same cluster number) are reversed again.</p>
 <div class="refsect3">
 reversed, then each cluster (consecutive items having the
 same cluster number) are reversed again.</p>
 <div class="refsect3">
-<a name="idp22828768"></a><h4>Parameters</h4>
+<a name="idp22455728"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1250,7 +1250,7 @@ hb_buffer_serialize_format_from_string
                                (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                                 <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
                                (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                                 <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22844320"></a><h4>Returns</h4>
+<a name="idp22471280"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1261,7 +1261,7 @@ hb_buffer_serialize_format_from_string
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_buffer_serialize_format_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_buffer_serialize_format_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22852256"></a><h4>Returns</h4>
+<a name="idp22479216"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1280,7 +1280,7 @@ hb_buffer_serialize_glyphs (<em class="parameter"><code><a class="link" href="ha
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> flags</code></em>);</pre>
 <div class="refsect3">
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-format-t" title="enum hb_buffer_serialize_format_t"><span class="type">hb_buffer_serialize_format_t</span></a> format</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-serialize-flags-t" title="enum hb_buffer_serialize_flags_t"><span class="type">hb_buffer_serialize_flags_t</span></a> flags</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22871776"></a><h4>Parameters</h4>
+<a name="idp22498736"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1307,7 +1307,7 @@ hb_buffer_serialize_glyphs (<em class="parameter"><code><a class="link" href="ha
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22885936"></a><h4>Returns</h4>
+<a name="idp22512896"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1318,7 +1318,7 @@ hb_buffer_serialize_glyphs (<em class="parameter"><code><a class="link" href="ha
 <pre class="programlisting">const <span class="returnvalue">char</span> **
 hb_buffer_serialize_list_formats (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting">const <span class="returnvalue">char</span> **
 hb_buffer_serialize_list_formats (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp22893328"></a><h4>Returns</h4>
+<a name="idp22520288"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -1331,7 +1331,7 @@ hb_buffer_serialize_list_formats (<em class="parameter"><code><span class="type"
 hb_buffer_set_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="type">hb_buffer_content_type_t</span></a> content_type</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_content_type (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-content-type-t" title="enum hb_buffer_content_type_t"><span class="type">hb_buffer_content_type_t</span></a> content_type</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22903904"></a><h4>Parameters</h4>
+<a name="idp22530864"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1354,7 +1354,7 @@ hb_buffer_set_content_type (<em class="parameter"><code><a class="link" href="ha
 hb_buffer_set_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22919312"></a><h4>Parameters</h4>
+<a name="idp22546272"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1377,7 +1377,7 @@ hb_buffer_set_direction (<em class="parameter"><code><a class="link" href="harfb
 hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="type">hb_buffer_flags_t</span></a> flags</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-flags-t" title="enum hb_buffer_flags_t"><span class="type">hb_buffer_flags_t</span></a> flags</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22934720"></a><h4>Parameters</h4>
+<a name="idp22561680"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1400,7 +1400,7 @@ hb_buffer_set_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 hb_buffer_set_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_language (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22950128"></a><h4>Parameters</h4>
+<a name="idp22577088"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1423,7 +1423,7 @@ hb_buffer_set_language (<em class="parameter"><code><a class="link" href="harfbu
 hb_buffer_set_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                       <em class="parameter"><code>unsigned <span class="type">int</span> length</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_length (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                       <em class="parameter"><code>unsigned <span class="type">int</span> length</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22965680"></a><h4>Parameters</h4>
+<a name="idp22592640"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1438,7 +1438,7 @@ hb_buffer_set_length (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22973184"></a><h4>Returns</h4>
+<a name="idp22600400"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1458,7 +1458,7 @@ hb_buffer_set_replacement_codepoint (<em class="parameter"><code><a class="link"
 hb_buffer_set_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22990256"></a><h4>Parameters</h4>
+<a name="idp22621216"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1481,7 +1481,7 @@ hb_buffer_set_script (<em class="parameter"><code><a class="link" href="harfbuzz
 hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-buffer.html#hb-segment-properties-t"><span class="type">hb_segment_properties_t</span></a> *props</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23005808"></a><h4>Parameters</h4>
+<a name="idp22639536"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1504,7 +1504,7 @@ hb_buffer_set_segment_properties (<em class="parameter"><code><a class="link" hr
 hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *unicode_funcs</code></em>);</pre>
 <div class="refsect3">
 hb_buffer_set_unicode_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb-buffer.html#hb-buffer-t"><span class="type">hb_buffer_t</span></a> *buffer</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *unicode_funcs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23021216"></a><h4>Parameters</h4>
+<a name="idp22657648"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1530,7 +1530,7 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                          <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23040752"></a><h4>Parameters</h4>
+<a name="idp22680784"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1545,7 +1545,7 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp23048256"></a><h4>Returns</h4>
+<a name="idp22689184"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1559,7 +1559,7 @@ hb_segment_properties_equal (<em class="parameter"><code>const <a class="link" h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23057632"></a><h4>Returns</h4>
+<a name="idp22700656"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1571,7 +1571,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23065088"></a><h4>Returns</h4>
+<a name="idp22709792"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1590,7 +1590,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23074720"></a><h4>Members</h4>
+<a name="idp22721776"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1623,7 +1623,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23090928"></a><h4>Members</h4>
+<a name="idp22740960"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1661,7 +1661,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23110400"></a><h4>Members</h4>
+<a name="idp22763504"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1699,7 +1699,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23132992"></a><h4>Members</h4>
+<a name="idp22786240"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
index 47aedb6..e2b1a8b 100644 (file)
 hb_direction_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                           <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 hb_direction_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                           <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
-<a name="idp18987296"></a><h4>Parameters</h4>
+<a name="idp17685104"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -326,7 +326,7 @@ hb_direction_from_string (<em class="parameter"><code>const <span class="type">c
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp18996800"></a><h4>Returns</h4>
+<a name="idp17694608"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -337,7 +337,7 @@ hb_direction_from_string (<em class="parameter"><code>const <span class="type">c
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_direction_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_direction_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19006032"></a><h4>Returns</h4>
+<a name="idp17703840"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -350,7 +350,7 @@ hb_direction_to_string (<em class="parameter"><code><a class="link" href="harfbu
 hb_language_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                          <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 hb_language_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                          <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19018560"></a><h4>Parameters</h4>
+<a name="idp17716368"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -365,7 +365,7 @@ hb_language_from_string (<em class="parameter"><code>const <span class="type">ch
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp19028064"></a><h4>Returns</h4>
+<a name="idp17725872"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -376,7 +376,7 @@ hb_language_from_string (<em class="parameter"><code>const <span class="type">ch
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="returnvalue">hb_language_t</span></a>
 hb_language_get_default (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="returnvalue">hb_language_t</span></a>
 hb_language_get_default (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp19036576"></a><h4>Returns</h4>
+<a name="idp17734384"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -387,7 +387,7 @@ hb_language_get_default (<em class="parameter"><code><span class="type">void</sp
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-language-t"><span class="type">hb_language_t</span></a> language</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19045808"></a><h4>Returns</h4>
+<a name="idp17743616"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -399,7 +399,7 @@ hb_language_to_string (<em class="parameter"><code><a class="link" href="harfbuz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
 hb_script_from_iso15924_tag (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="returnvalue">hb_script_t</span></a>
 hb_script_from_iso15924_tag (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19056528"></a><h4>Returns</h4>
+<a name="idp17754336"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -411,7 +411,7 @@ hb_script_from_iso15924_tag (<em class="parameter"><code><a class="link" href="h
 hb_script_from_string (<em class="parameter"><code>const <span class="type">char</span> *s</code></em>,
                        <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 hb_script_from_string (<em class="parameter"><code>const <span class="type">char</span> *s</code></em>,
                        <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19067392"></a><h4>Parameters</h4>
+<a name="idp17765200"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -426,7 +426,7 @@ hb_script_from_string (<em class="parameter"><code>const <span class="type">char
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp19076896"></a><h4>Returns</h4>
+<a name="idp17774704"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -437,7 +437,7 @@ hb_script_from_string (<em class="parameter"><code>const <span class="type">char
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
 hb_script_get_horizontal_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="returnvalue">hb_direction_t</span></a>
 hb_script_get_horizontal_direction (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19086016"></a><h4>Returns</h4>
+<a name="idp17783824"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -448,7 +448,7 @@ hb_script_get_horizontal_direction (<em class="parameter"><code><a class="link"
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
 hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="returnvalue">hb_tag_t</span></a>
 hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-script-t" title="enum hb_script_t"><span class="type">hb_script_t</span></a> script</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19095136"></a><h4>Returns</h4>
+<a name="idp17792944"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -460,7 +460,7 @@ hb_script_to_iso15924_tag (<em class="parameter"><code><a class="link" href="har
 hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                     <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
 hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</span> *str</code></em>,
                     <em class="parameter"><code><span class="type">int</span> len</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19105952"></a><h4>Parameters</h4>
+<a name="idp17803760"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -475,7 +475,7 @@ hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</s
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp19115456"></a><h4>Returns</h4>
+<a name="idp17813264"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -487,7 +487,7 @@ hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</s
 hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>,
                   <em class="parameter"><code><span class="type">char</span> *buf</code></em>);</pre>
 <div class="refsect3">
 hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-tag-t" title="hb_tag_t"><span class="type">hb_tag_t</span></a> tag</code></em>,
                   <em class="parameter"><code><span class="type">char</span> *buf</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19126096"></a><h4>Parameters</h4>
+<a name="idp17823904"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -581,7 +581,7 @@ hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19182160"></a><h4>Members</h4>
+<a name="idp17879968"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -648,7 +648,7 @@ hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19220528"></a><h4>Members</h4>
+<a name="idp17918336"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
index 939d711..8d3ab15 100644 (file)
@@ -105,7 +105,7 @@ hb_coretext_face_get_cg_font (<em class="parameter"><code><a class="link" href="
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19763168"></a><h4>Returns</h4>
+<a name="idp14032320"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -117,7 +117,7 @@ hb_coretext_font_get_ct_font (<em class="parameter"><code><a class="link" href="
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23989600"></a><h4>Returns</h4>
+<a name="idp19308640"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index 4a2f856..dc31c55 100644 (file)
@@ -210,7 +210,7 @@ hb_face_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-bl
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp17669104"></a><h4>Returns</h4>
+<a name="idp20616992"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -222,7 +222,7 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
                            <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                            <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp16965008"></a><h4>Parameters</h4>
+<a name="idp20628080"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -237,7 +237,7 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp17846736"></a><h4>Returns</h4>
+<a name="idp22848528"></a><h4>Returns</h4>
 <p> (transfer full)</p>
 <p></p>
 </div>
 <p> (transfer full)</p>
 <p></p>
 </div>
@@ -249,7 +249,7 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
-<a name="idp14634400"></a><h4>Parameters</h4>
+<a name="idp22856752"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -271,7 +271,7 @@ hb_face_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-f
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_face_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_face_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp21412768"></a><h4>Returns</h4>
+<a name="idp22870240"></a><h4>Returns</h4>
 <p> (transfer full)</p>
 <p></p>
 </div>
 <p> (transfer full)</p>
 <p></p>
 </div>
@@ -283,7 +283,7 @@ hb_face_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <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">
 <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="idp22131376"></a><h4>Parameters</h4>
+<a name="idp22878608"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -298,7 +298,7 @@ hb_face_get_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22139776"></a><h4>Returns</h4>
+<a name="idp22886112"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -309,7 +309,7 @@ hb_face_get_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 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">
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 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="idp22148976"></a><h4>Parameters</h4>
+<a name="idp22894048"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -324,7 +324,7 @@ hb_face_get_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22157376"></a><h4>Returns</h4>
+<a name="idp22901552"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -335,7 +335,7 @@ hb_face_get_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 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">
 <pre class="programlisting">unsigned <span class="returnvalue">int</span>
 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="idp22166576"></a><h4>Parameters</h4>
+<a name="idp22909488"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -350,7 +350,7 @@ hb_face_get_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22174976"></a><h4>Returns</h4>
+<a name="idp18604560"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -362,7 +362,7 @@ hb_face_get_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 hb_face_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_face_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22185664"></a><h4>Parameters</h4>
+<a name="idp15960320"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -377,7 +377,7 @@ hb_face_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22194064"></a><h4>Returns</h4>
+<a name="idp22913232"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -389,7 +389,7 @@ hb_face_get_user_data (<em class="parameter"><code><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_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">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_face_is_immutable (<em class="parameter"><code><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="idp22204720"></a><h4>Parameters</h4>
+<a name="idp22920864"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -404,7 +404,7 @@ hb_face_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22213120"></a><h4>Returns</h4>
+<a name="idp22926912"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -415,7 +415,7 @@ hb_face_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22222176"></a><h4>Parameters</h4>
+<a name="idp22933248"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -437,7 +437,7 @@ hb_face_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22238192"></a><h4>Parameters</h4>
+<a name="idp22944480"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -452,7 +452,7 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22246592"></a><h4>Returns</h4>
+<a name="idp22950528"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -463,7 +463,7 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
 hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-blob.html#hb-blob-t"><span class="returnvalue">hb_blob_t</span></a> *
 hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22255648"></a><h4>Parameters</h4>
+<a name="idp22958208"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -478,7 +478,7 @@ hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbu
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22264048"></a><h4>Returns</h4>
+<a name="idp22965712"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -491,7 +491,7 @@ hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbu
 hb_face_reference_table (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                          <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">
 hb_face_reference_table (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                          <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="idp22276400"></a><h4>Parameters</h4>
+<a name="idp22976288"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -506,7 +506,7 @@ hb_face_reference_table (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22284800"></a><h4>Returns</h4>
+<a name="idp22983792"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -519,7 +519,7 @@ hb_face_reference_table (<em class="parameter"><code><a class="link" href="harfb
 hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> glyph_count</code></em>);</pre>
 <div class="refsect3">
 hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> glyph_count</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22297328"></a><h4>Parameters</h4>
+<a name="idp22994512"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -542,7 +542,7 @@ hb_face_set_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                    <em class="parameter"><code>unsigned <span class="type">int</span> index</code></em>);</pre>
 <div class="refsect3">
 hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                    <em class="parameter"><code>unsigned <span class="type">int</span> index</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22315120"></a><h4>Parameters</h4>
+<a name="idp23010064"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -565,7 +565,7 @@ hb_face_set_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 hb_face_set_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> upem</code></em>);</pre>
 <div class="refsect3">
 hb_face_set_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="type">hb_face_t</span></a> *face</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> upem</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22332912"></a><h4>Parameters</h4>
+<a name="idp23025616"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -591,7 +591,7 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp22355472"></a><h4>Parameters</h4>
+<a name="idp23045152"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -606,7 +606,7 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22363872"></a><h4>Returns</h4>
+<a name="idp23052656"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
index 2f91181..9596d54 100644 (file)
@@ -630,7 +630,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> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24857136"></a><h4>Parameters</h4>
+<a name="idp24645120"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -666,7 +666,7 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24877744"></a><h4>Returns</h4>
+<a name="idp24665728"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -676,7 +676,7 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *parent</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24884992"></a><h4>Parameters</h4>
+<a name="idp24672976"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -691,7 +691,7 @@ hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24892496"></a><h4>Returns</h4>
+<a name="idp24680480"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -703,7 +703,7 @@ hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfb
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24901696"></a><h4>Parameters</h4>
+<a name="idp24689680"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -727,7 +727,7 @@ hb_font_funcs_create (<em class="parameter"><code><span class="type">void</span>
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24915104"></a><h4>Returns</h4>
+<a name="idp24703088"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -737,7 +737,7 @@ hb_font_funcs_create (<em class="parameter"><code><span class="type">void</span>
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24922352"></a><h4>Parameters</h4>
+<a name="idp24710336"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -759,7 +759,7 @@ hb_font_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
 hb_font_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
 hb_font_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp24935840"></a><h4>Returns</h4>
+<a name="idp24723824"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -772,7 +772,7 @@ hb_font_funcs_get_empty (<em class="parameter"><code><span class="type">void</sp
 hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24946416"></a><h4>Parameters</h4>
+<a name="idp24734400"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -787,7 +787,7 @@ hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24953920"></a><h4>Returns</h4>
+<a name="idp24741904"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -799,7 +799,7 @@ hb_font_funcs_get_user_data (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_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">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24963120"></a><h4>Parameters</h4>
+<a name="idp24751104"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -814,7 +814,7 @@ hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="ha
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24970624"></a><h4>Returns</h4>
+<a name="idp24759184"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -825,7 +825,7 @@ hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="ha
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24978416"></a><h4>Parameters</h4>
+<a name="idp24768624"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -847,7 +847,7 @@ hb_font_funcs_make_immutable (<em class="parameter"><code><a class="link" href="
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
 hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="returnvalue">hb_font_funcs_t</span></a> *
 hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-funcs-t"><span class="type">hb_font_funcs_t</span></a> *ffuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24992448"></a><h4>Parameters</h4>
+<a name="idp24785040"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -862,7 +862,7 @@ hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24999952"></a><h4>Returns</h4>
+<a name="idp24793440"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -877,7 +877,7 @@ hb_font_funcs_set_glyph_contour_point_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25014480"></a><h4>Parameters</h4>
+<a name="idp24808064"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -909,7 +909,7 @@ hb_font_funcs_set_glyph_extents_func (<em class="parameter"><code><a class="link
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                       <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25040736"></a><h4>Parameters</h4>
+<a name="idp24834320"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -942,7 +942,7 @@ hb_font_funcs_set_glyph_from_name_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25067056"></a><h4>Parameters</h4>
+<a name="idp24860624"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -967,7 +967,7 @@ 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>,
                               <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">
                               <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                               <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25088528"></a><h4>Parameters</h4>
+<a name="idp24882160"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -993,7 +993,7 @@ hb_font_funcs_set_glyph_h_advance_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25110128"></a><h4>Parameters</h4>
+<a name="idp24903696"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1026,7 +1026,7 @@ hb_font_funcs_set_glyph_h_kerning_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25136432"></a><h4>Parameters</h4>
+<a name="idp24930000"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1058,7 +1058,7 @@ hb_font_funcs_set_glyph_h_origin_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25162752"></a><h4>Parameters</h4>
+<a name="idp24956320"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1090,7 +1090,7 @@ hb_font_funcs_set_glyph_name_func (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25188992"></a><h4>Parameters</h4>
+<a name="idp24982496"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1116,7 +1116,7 @@ hb_font_funcs_set_glyph_v_advance_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25210592"></a><h4>Parameters</h4>
+<a name="idp25004096"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1149,7 +1149,7 @@ hb_font_funcs_set_glyph_v_kerning_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25236896"></a><h4>Parameters</h4>
+<a name="idp25030400"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1181,7 +1181,7 @@ hb_font_funcs_set_glyph_v_origin_func (<em class="parameter"><code><a class="lin
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                        <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25263216"></a><h4>Parameters</h4>
+<a name="idp25056720"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1214,7 +1214,7 @@ hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="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>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25291120"></a><h4>Parameters</h4>
+<a name="idp25084624"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1229,7 +1229,7 @@ hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25299520"></a><h4>Returns</h4>
+<a name="idp25093024"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1240,7 +1240,7 @@ hb_font_funcs_set_user_data (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp25308272"></a><h4>Returns</h4>
+<a name="idp25101776"></a><h4>Returns</h4>
 <p> (transfer full)</p>
 <p></p>
 </div>
 <p> (transfer full)</p>
 <p></p>
 </div>
@@ -1252,7 +1252,7 @@ hb_font_get_empty (<em class="parameter"><code><span class="type">void</span></c
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25318112"></a><h4>Parameters</h4>
+<a name="idp25111616"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1267,7 +1267,7 @@ hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25326512"></a><h4>Returns</h4>
+<a name="idp25120016"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -1282,7 +1282,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> variation_selector</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> variation_selector</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25342432"></a><h4>Parameters</h4>
+<a name="idp25136000"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1304,7 +1304,7 @@ hb_font_get_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25354544"></a><h4>Returns</h4>
+<a name="idp25148112"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1320,7 +1320,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> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25370832"></a><h4>Parameters</h4>
+<a name="idp25164464"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1359,7 +1359,7 @@ hb_font_get_glyph_advance_for_direction
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25401296"></a><h4>Returns</h4>
+<a name="idp25194864"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1373,7 +1373,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> *x</code></em>,
                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                  <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25417088"></a><h4>Parameters</h4>
+<a name="idp25210592"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1400,7 +1400,7 @@ hb_font_get_glyph_contour_point (<em class="parameter"><code><a class="link" hre
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25432912"></a><h4>Returns</h4>
+<a name="idp25226416"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1417,7 +1417,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> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25451136"></a><h4>Parameters</h4>
+<a name="idp25244640"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1444,7 +1444,7 @@ hb_font_get_glyph_contour_point_for_origin
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25466960"></a><h4>Returns</h4>
+<a name="idp25260464"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1464,7 +1464,7 @@ hb_font_get_glyph_contour_point_for_origin
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25488288"></a><h4>Returns</h4>
+<a name="idp25281728"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1476,7 +1476,7 @@ hb_font_get_glyph_extents (<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>,
                            <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> glyph</code></em>,
                            <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25500512"></a><h4>Parameters</h4>
+<a name="idp25293952"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1498,7 +1498,7 @@ hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="har
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25512624"></a><h4>Returns</h4>
+<a name="idp25306064"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1512,7 +1512,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                       <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
                                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-direction-t" title="enum hb_direction_t"><span class="type">hb_direction_t</span></a> direction</code></em>,
                                       <em class="parameter"><code><span class="type">hb_glyph_extents_t</span> *extents</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25527232"></a><h4>Parameters</h4>
+<a name="idp25320672"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1534,7 +1534,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25539344"></a><h4>Returns</h4>
+<a name="idp25332784"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1551,7 +1551,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25557120"></a><h4>Returns</h4>
+<a name="idp25350560"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1564,7 +1564,7 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code><span class="type">int</span> len</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
                              <em class="parameter"><code><span class="type">int</span> len</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25571216"></a><h4>Parameters</h4>
+<a name="idp25364656"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1591,7 +1591,7 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25587040"></a><h4>Returns</h4>
+<a name="idp25380480"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1607,7 +1607,7 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25603280"></a><h4>Returns</h4>
+<a name="idp25396720"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1624,7 +1624,7 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25622080"></a><h4>Returns</h4>
+<a name="idp25415520"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1635,7 +1635,7 @@ hb_font_get_glyph_from_name (<em class="parameter"><code><a class="link" href="h
 hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <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">
 hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <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="idp25632608"></a><h4>Parameters</h4>
+<a name="idp25426048"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1650,7 +1650,7 @@ hb_font_get_glyph_h_advance (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25641008"></a><h4>Returns</h4>
+<a name="idp25434448"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1663,7 +1663,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> left_glyph</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> right_glyph</code></em>);</pre>
 <div class="refsect3">
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> left_glyph</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> right_glyph</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25653840"></a><h4>Parameters</h4>
+<a name="idp25447280"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1678,7 +1678,7 @@ hb_font_get_glyph_h_kerning (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25662240"></a><h4>Returns</h4>
+<a name="idp25455680"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1692,7 +1692,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> *x</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25676768"></a><h4>Parameters</h4>
+<a name="idp25470208"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1719,7 +1719,7 @@ hb_font_get_glyph_h_origin (<em class="parameter"><code><a class="link" href="ha
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25692592"></a><h4>Returns</h4>
+<a name="idp25486032"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1736,7 +1736,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> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25710640"></a><h4>Parameters</h4>
+<a name="idp25504080"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1776,7 +1776,7 @@ hb_font_get_glyph_kerning_for_direction
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25742752"></a><h4>Returns</h4>
+<a name="idp25536256"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1789,7 +1789,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
                         <em class="parameter"><code><span class="type">char</span> *name</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
                         <em class="parameter"><code><span class="type">char</span> *name</code></em>,
                         <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25756784"></a><h4>Parameters</h4>
+<a name="idp25550288"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1811,7 +1811,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25768896"></a><h4>Returns</h4>
+<a name="idp25562400"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1829,7 +1829,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25788480"></a><h4>Returns</h4>
+<a name="idp25581984"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1844,7 +1844,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> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25804160"></a><h4>Parameters</h4>
+<a name="idp25597664"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1885,7 +1885,7 @@ hb_font_get_glyph_origin_for_direction
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25837968"></a><h4>Returns</h4>
+<a name="idp25631472"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1896,7 +1896,7 @@ hb_font_get_glyph_origin_for_direction
 hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <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">
 hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                              <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="idp25848496"></a><h4>Parameters</h4>
+<a name="idp25641936"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1911,7 +1911,7 @@ hb_font_get_glyph_v_advance (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25856896"></a><h4>Returns</h4>
+<a name="idp25650336"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1924,7 +1924,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> top_glyph</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> bottom_glyph</code></em>);</pre>
 <div class="refsect3">
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> top_glyph</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> bottom_glyph</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25869728"></a><h4>Parameters</h4>
+<a name="idp25663104"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1939,7 +1939,7 @@ hb_font_get_glyph_v_kerning (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25878128"></a><h4>Returns</h4>
+<a name="idp25671504"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1953,7 +1953,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> *x</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                             <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25892592"></a><h4>Parameters</h4>
+<a name="idp25686032"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1980,7 +1980,7 @@ hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="ha
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25908416"></a><h4>Returns</h4>
+<a name="idp25701856"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -1991,7 +1991,7 @@ hb_font_get_glyph_v_origin (<em class="parameter"><code><a class="link" href="ha
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25917776"></a><h4>Parameters</h4>
+<a name="idp25711216"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2006,7 +2006,7 @@ hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp25926176"></a><h4>Returns</h4>
+<a name="idp25719616"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -2020,7 +2020,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> *x_ppem</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> *y_ppem</code></em>);</pre>
 <div class="refsect3">
                   <em class="parameter"><code>unsigned <span class="type">int</span> *x_ppem</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> *y_ppem</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25940768"></a><h4>Parameters</h4>
+<a name="idp25734272"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2056,7 +2056,7 @@ hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><span class="type">int</span> *x_scale</code></em>,
                    <em class="parameter"><code><span class="type">int</span> *y_scale</code></em>);</pre>
 <div class="refsect3">
                    <em class="parameter"><code><span class="type">int</span> *x_scale</code></em>,
                    <em class="parameter"><code><span class="type">int</span> *y_scale</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25967872"></a><h4>Parameters</h4>
+<a name="idp25761376"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2091,7 +2091,7 @@ hb_font_get_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp25993280"></a><h4>Parameters</h4>
+<a name="idp25786848"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2106,7 +2106,7 @@ hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26001680"></a><h4>Returns</h4>
+<a name="idp25795248"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -2121,7 +2121,7 @@ hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="har
                            <em class="parameter"><code><span class="type">int</span> len</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
                            <em class="parameter"><code><span class="type">int</span> len</code></em>,
                            <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *glyph</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26017984"></a><h4>Parameters</h4>
+<a name="idp25811552"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2148,7 +2148,7 @@ hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="har
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26033808"></a><h4>Returns</h4>
+<a name="idp25827376"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -2162,7 +2162,7 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
                          <em class="parameter"><code><span class="type">char</span> *s</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
                          <em class="parameter"><code><span class="type">char</span> *s</code></em>,
                          <em class="parameter"><code>unsigned <span class="type">int</span> size</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26048448"></a><h4>Parameters</h4>
+<a name="idp25842016"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2191,7 +2191,7 @@ hb_font_glyph_to_string (<em class="parameter"><code><a class="link" href="harfb
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26068512"></a><h4>Parameters</h4>
+<a name="idp25862080"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2206,7 +2206,7 @@ hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26076912"></a><h4>Returns</h4>
+<a name="idp25870480"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -2217,7 +2217,7 @@ hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26086288"></a><h4>Parameters</h4>
+<a name="idp25879856"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2239,7 +2239,7 @@ hb_font_make_immutable (<em class="parameter"><code><a class="link" href="harfbu
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="returnvalue">hb_font_t</span></a> *
 hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.html#hb-font-t"><span class="type">hb_font_t</span></a> *font</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26102624"></a><h4>Parameters</h4>
+<a name="idp25896192"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2254,7 +2254,7 @@ hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26111024"></a><h4>Returns</h4>
+<a name="idp25904592"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -2269,7 +2269,7 @@ hb_font_set_funcs (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                    <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26127008"></a><h4>Parameters</h4>
+<a name="idp25920576"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2300,7 +2300,7 @@ hb_font_set_funcs_data (<em class="parameter"><code><a class="link" href="harfbu
                         <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                         <em class="parameter"><code><span class="type">void</span> *font_data</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26151456"></a><h4>Parameters</h4>
+<a name="idp25945024"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2331,7 +2331,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> x_ppem</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> y_ppem</code></em>);</pre>
 <div class="refsect3">
                   <em class="parameter"><code>unsigned <span class="type">int</span> x_ppem</code></em>,
                   <em class="parameter"><code>unsigned <span class="type">int</span> y_ppem</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26175696"></a><h4>Parameters</h4>
+<a name="idp25969200"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2355,7 +2355,7 @@ hb_font_set_scale (<em class="parameter"><code><a class="link" href="harfbuzz-hb
                    <em class="parameter"><code><span class="type">int</span> x_scale</code></em>,
                    <em class="parameter"><code><span class="type">int</span> y_scale</code></em>);</pre>
 <div class="refsect3">
                    <em class="parameter"><code><span class="type">int</span> x_scale</code></em>,
                    <em class="parameter"><code><span class="type">int</span> y_scale</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26195376"></a><h4>Parameters</h4>
+<a name="idp25988880"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2381,7 +2381,7 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                        <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26218448"></a><h4>Parameters</h4>
+<a name="idp26012016"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2396,7 +2396,7 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26226848"></a><h4>Returns</h4>
+<a name="idp26020416"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -2412,7 +2412,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> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *x</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-position-t" title="hb_position_t"><span class="type">hb_position_t</span></a> *y</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26243200"></a><h4>Parameters</h4>
+<a name="idp26036768"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -2450,7 +2450,7 @@ hb_font_subtract_glyph_origin_for_direction
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp26271920"></a><h4>Returns</h4>
+<a name="idp26065488"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index 5194725..910af86 100644 (file)
@@ -95,7 +95,7 @@
 hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
 hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp15898752"></a><h4>Parameters</h4>
+<a name="idp18589520"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -110,7 +110,7 @@ hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp12575376"></a><h4>Returns</h4>
+<a name="idp14983456"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -122,7 +122,7 @@ hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span>
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_ft_face_create_cached (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-face.html#hb-face-t"><span class="returnvalue">hb_face_t</span></a> *
 hb_ft_face_create_cached (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26678384"></a><h4>Returns</h4>
+<a name="idp16534320"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -135,7 +135,7 @@ hb_ft_face_create_cached (<em class="parameter"><code><span class="type">FT_Face
 hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
 hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span> ft_face</code></em>,
                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19378304"></a><h4>Parameters</h4>
+<a name="idp18930768"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -150,7 +150,7 @@ hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24573216"></a><h4>Returns</h4>
+<a name="idp14801584"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -164,7 +164,7 @@ hb_ft_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp26520048"></a><h4>Returns</h4>
+<a name="idp26507392"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index d8ebd68..03ab919 100644 (file)
@@ -80,7 +80,7 @@ hb_glib_get_unicode_funcs (<em class="parameter"><code><span class="type">void</
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp17205360"></a><h4>Returns</h4>
+<a name="idp18673488"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -92,7 +92,7 @@ hb_glib_script_from_script (<em class="parameter"><code><a class="link" href="ha
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp15952992"></a><h4>Returns</h4>
+<a name="idp19415904"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -104,7 +104,7 @@ hb_glib_script_to_script (<em class="parameter"><code><span class="type">GUnicod
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp17801872"></a><h4>Returns</h4>
+<a name="idp16666160"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index cc51db9..2c57cac 100644 (file)
@@ -85,7 +85,7 @@ hb_graphite2_face_get_gr_face (<em class="parameter"><code><a class="link" href=
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp9994096"></a><h4>Returns</h4>
+<a name="idp14441472"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -97,7 +97,7 @@ hb_graphite2_font_get_gr_font (<em class="parameter"><code><a class="link" href=
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp18663728"></a><h4>Returns</h4>
+<a name="idp23104224"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index 77c031c..307aeb2 100644 (file)
@@ -80,7 +80,7 @@ hb_icu_get_unicode_funcs (<em class="parameter"><code><span class="type">void</s
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp14261024"></a><h4>Returns</h4>
+<a name="idp14126544"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -92,7 +92,7 @@ hb_icu_script_from_script (<em class="parameter"><code><a class="link" href="har
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24211888"></a><h4>Returns</h4>
+<a name="idp20698224"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -104,7 +104,7 @@ hb_icu_script_to_script (<em class="parameter"><code><span class="type">UScriptC
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp14646672"></a><h4>Returns</h4>
+<a name="idp16604368"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index 32a2663..d7231db 100644 (file)
@@ -319,7 +319,7 @@ hb_ot_layout_feature_get_lookups (<em class="parameter"><code><a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23755552"></a><h4>Returns</h4>
+<a name="idp26122576"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -335,7 +335,7 @@ hb_ot_layout_get_attach_points (<em class="parameter"><code><a class="link" href
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23771216"></a><h4>Returns</h4>
+<a name="idp26138240"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -348,7 +348,7 @@ hb_ot_layout_get_glyph_class (<em class="parameter"><code><a class="link" href="
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23781312"></a><h4>Returns</h4>
+<a name="idp26148336"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -375,7 +375,7 @@ hb_ot_layout_get_ligature_carets (<em class="parameter"><code><a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23808736"></a><h4>Returns</h4>
+<a name="idp26175760"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -392,7 +392,7 @@ hb_ot_layout_get_size_params (<em class="parameter"><code><a class="link" href="
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23826208"></a><h4>Returns</h4>
+<a name="idp26193232"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -408,7 +408,7 @@ hb_ot_layout_get_size_params (<em class="parameter"><code><a class="link" href="
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23842928"></a><h4>Returns</h4>
+<a name="idp26209952"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -420,7 +420,7 @@ hb_ot_layout_has_glyph_classes (<em class="parameter"><code><a class="link" href
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23851360"></a><h4>Returns</h4>
+<a name="idp26218384"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -432,7 +432,7 @@ hb_ot_layout_has_positioning (<em class="parameter"><code><a class="link" href="
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23859792"></a><h4>Returns</h4>
+<a name="idp26226816"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -444,7 +444,7 @@ hb_ot_layout_has_substitution (<em class="parameter"><code><a class="link" href=
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23868224"></a><h4>Returns</h4>
+<a name="idp26235248"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -461,7 +461,7 @@ hb_ot_layout_language_find_feature (<em class="parameter"><code><a class="link"
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23885344"></a><h4>Returns</h4>
+<a name="idp26252368"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -480,7 +480,7 @@ hb_ot_layout_language_get_feature_indexes
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23904336"></a><h4>Returns</h4>
+<a name="idp26271360"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -499,7 +499,7 @@ hb_ot_layout_language_get_feature_tags
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23923344"></a><h4>Returns</h4>
+<a name="idp26290368"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -552,7 +552,7 @@ hb_ot_layout_lookup_would_substitute (<em class="parameter"><code><a class="link
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23980784"></a><h4>Returns</h4>
+<a name="idp26347808"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -568,7 +568,7 @@ hb_ot_layout_script_find_language (<em class="parameter"><code><a class="link" h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24314880"></a><h4>Returns</h4>
+<a name="idp23893888"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -585,7 +585,7 @@ hb_ot_layout_script_get_language_tags (<em class="parameter"><code><a class="lin
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24331840"></a><h4>Returns</h4>
+<a name="idp23910848"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -601,7 +601,7 @@ hb_ot_layout_table_choose_script (<em class="parameter"><code><a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24347152"></a><h4>Returns</h4>
+<a name="idp23926160"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -616,7 +616,7 @@ hb_ot_layout_table_find_script (<em class="parameter"><code><a class="link" href
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24360656"></a><h4>Returns</h4>
+<a name="idp23939664"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -632,7 +632,7 @@ hb_ot_layout_table_get_feature_tags (<em class="parameter"><code><a class="link"
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24375904"></a><h4>Returns</h4>
+<a name="idp23954912"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -648,7 +648,7 @@ hb_ot_layout_table_get_script_tags (<em class="parameter"><code><a class="link"
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24391392"></a><h4>Returns</h4>
+<a name="idp23970400"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -725,7 +725,7 @@ hb_ot_shape_plan_collect_lookups (<em class="parameter"><code><a class="link" hr
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24443872"></a><h4>Members</h4>
+<a name="idp24022880"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
index e909d29..058623f 100644 (file)
@@ -107,7 +107,7 @@ hb_ot_tag_from_language (<em class="parameter"><code><a class="link" href="harfb
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp17314176"></a><h4>Returns</h4>
+<a name="idp16597424"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -119,7 +119,7 @@ hb_ot_tag_to_language (<em class="parameter"><code><a class="link" href="harfbuz
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp17962528"></a><h4>Returns</h4>
+<a name="idp15287904"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -131,7 +131,7 @@ hb_ot_tag_to_script (<em class="parameter"><code><a class="link" href="harfbuzz-
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp20744864"></a><h4>Returns</h4>
+<a name="idp14593888"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index 3663879..87ce9bf 100644 (file)
 hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <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">
 hb_set_add (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <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="idp23360080"></a><h4>Parameters</h4>
+<a name="idp20721456"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -316,7 +316,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> first</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
 <div class="refsect3">
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23503168"></a><h4>Parameters</h4>
+<a name="idp23182976"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -338,7 +338,7 @@ hb_set_add_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_allocation_successful (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_set_allocation_successful (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23519440"></a><h4>Parameters</h4>
+<a name="idp23199248"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -353,7 +353,7 @@ hb_set_allocation_successful (<em class="parameter"><code>const <a class="link"
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp23527840"></a><h4>Returns</h4>
+<a name="idp23207648"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -364,7 +364,7 @@ hb_set_allocation_successful (<em class="parameter"><code>const <a class="link"
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_clear (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23536864"></a><h4>Parameters</h4>
+<a name="idp23216672"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -388,7 +388,7 @@ hb_set_create (<em class="parameter"><code><span class="type">void</span></code>
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23552176"></a><h4>Returns</h4>
+<a name="idp23231984"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -399,7 +399,7 @@ hb_set_create (<em class="parameter"><code><span class="type">void</span></code>
 hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <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">
 hb_set_del (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <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="idp23562208"></a><h4>Parameters</h4>
+<a name="idp23242016"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -423,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> first</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
 <div class="refsect3">
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> first</code></em>,
                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> last</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23581440"></a><h4>Parameters</h4>
+<a name="idp23261248"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -445,7 +445,7 @@ hb_set_del_range (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23597440"></a><h4>Parameters</h4>
+<a name="idp23277248"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -467,7 +467,7 @@ hb_set_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-se
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
 hb_set_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="returnvalue">hb_set_t</span></a> *
 hb_set_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp23612832"></a><h4>Returns</h4>
+<a name="idp23292640"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -480,7 +480,7 @@ hb_set_get_empty (<em class="parameter"><code><span class="type">void</span></co
 hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <p>Finds the maximum number in the set.</p>
 <div class="refsect3">
 hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <p>Finds the maximum number in the set.</p>
 <div class="refsect3">
-<a name="idp23624144"></a><h4>Parameters</h4>
+<a name="idp23303952"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -495,7 +495,7 @@ hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp23632544"></a><h4>Returns</h4>
+<a name="idp23312352"></a><h4>Returns</h4>
 <p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
 <p></p>
 </div>
 <p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
 <p></p>
 </div>
@@ -508,7 +508,7 @@ hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz
 hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <p>Finds the minimum number in the set.</p>
 <div class="refsect3">
 hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <p>Finds the minimum number in the set.</p>
 <div class="refsect3">
-<a name="idp23644080"></a><h4>Parameters</h4>
+<a name="idp23323888"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -523,7 +523,7 @@ hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp23652480"></a><h4>Returns</h4>
+<a name="idp23332288"></a><h4>Returns</h4>
 <p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
 <p></p>
 </div>
 <p> minimum of the set, or <a class="link" href="harfbuzz-hb-set.html#HB-SET-VALUE-INVALID:CAPS" title="HB_SET_VALUE_INVALID"><code class="literal">HB_SET_VALUE_INVALID</code></a> if set is empty.</p>
 <p></p>
 </div>
@@ -536,7 +536,7 @@ hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz
 hb_set_get_population (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <p>Returns the number of numbers in the set.</p>
 <div class="refsect3">
 hb_set_get_population (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>);</pre>
 <p>Returns the number of numbers in the set.</p>
 <div class="refsect3">
-<a name="idp23664176"></a><h4>Parameters</h4>
+<a name="idp23343984"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -551,7 +551,7 @@ hb_set_get_population (<em class="parameter"><code>const <a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp23672576"></a><h4>Returns</h4>
+<a name="idp23352384"></a><h4>Returns</h4>
 <p> set population.</p>
 <p></p>
 </div>
 <p> set population.</p>
 <p></p>
 </div>
@@ -564,7 +564,7 @@ hb_set_get_population (<em class="parameter"><code>const <a class="link" href="h
 hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23683760"></a><h4>Parameters</h4>
+<a name="idp23363568"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -579,7 +579,7 @@ hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp23692160"></a><h4>Returns</h4>
+<a name="idp23371968"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -592,7 +592,7 @@ hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <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">
 hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <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="idp23704576"></a><h4>Parameters</h4>
+<a name="idp23384384"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -607,7 +607,7 @@ hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp23712976"></a><h4>Returns</h4>
+<a name="idp23392784"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -619,7 +619,7 @@ hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
 hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                   <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
-<a name="idp23723792"></a><h4>Parameters</h4>
+<a name="idp23403600"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -641,7 +641,7 @@ hb_set_intersect (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <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">
 <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="idp23739792"></a><h4>Parameters</h4>
+<a name="idp23419600"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -663,7 +663,7 @@ hb_set_invert (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set
 <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">
 <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="idp26791456"></a><h4>Parameters</h4>
+<a name="idp26531232"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -678,7 +678,7 @@ hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26798960"></a><h4>Returns</h4>
+<a name="idp26538736"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -690,7 +690,7 @@ hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
 hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26808416"></a><h4>Parameters</h4>
+<a name="idp26548192"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -705,7 +705,7 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26815808"></a><h4>Returns</h4>
+<a name="idp26555696"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -717,7 +717,7 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 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>
 <div class="refsect3">
 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>
 <div class="refsect3">
-<a name="idp26825120"></a><h4>Parameters</h4>
+<a name="idp26564896"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -739,7 +739,7 @@ hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26835952"></a><h4>Returns</h4>
+<a name="idp26575728"></a><h4>Returns</h4>
 <p> whether there was a next value.</p>
 <p></p>
 </div>
 <p> whether there was a next value.</p>
 <p></p>
 </div>
@@ -757,7 +757,7 @@ hb_set_next_range (<em class="parameter"><code>const <a class="link" href="harfb
 are greater than current value of <em class="parameter"><code>last</code></em>
 .</p>
 <div class="refsect3">
 are greater than current value of <em class="parameter"><code>last</code></em>
 .</p>
 <div class="refsect3">
-<a name="idp26848880"></a><h4>Parameters</h4>
+<a name="idp26588656"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -784,7 +784,7 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26863040"></a><h4>Returns</h4>
+<a name="idp26602816"></a><h4>Returns</h4>
 <p> whether there was a next range.</p>
 <p></p>
 </div>
 <p> whether there was a next range.</p>
 <p></p>
 </div>
@@ -796,7 +796,7 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 <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>
 <div class="refsect3">
 <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>
 <div class="refsect3">
-<a name="idp26871264"></a><h4>Parameters</h4>
+<a name="idp26611040"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -811,7 +811,7 @@ hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26878768"></a><h4>Returns</h4>
+<a name="idp26618544"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -824,7 +824,7 @@ hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 hb_set_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
 hb_set_set (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
             <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26889488"></a><h4>Parameters</h4>
+<a name="idp26629264"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -850,7 +850,7 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26909024"></a><h4>Parameters</h4>
+<a name="idp26648800"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -873,7 +873,7 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp26919424"></a><h4>Returns</h4>
+<a name="idp26659200"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -885,7 +885,7 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
 hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                  <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26928736"></a><h4>Parameters</h4>
+<a name="idp26668512"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -908,7 +908,7 @@ hb_set_subtract (<em class="parameter"><code><a class="link" href="harfbuzz-hb-s
 hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
 hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
                              <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26944288"></a><h4>Parameters</h4>
+<a name="idp26684064"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -931,7 +931,7 @@ hb_set_symmetric_difference (<em class="parameter"><code><a class="link" href="h
 hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
 hb_set_union (<em class="parameter"><code><a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *set</code></em>,
               <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-set.html#hb-set-t"><span class="type">hb_set_t</span></a> *other</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26959840"></a><h4>Parameters</h4>
+<a name="idp26699616"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
index 0fd311f..d612552 100644 (file)
@@ -151,7 +151,7 @@ hb_shape_plan_create (<em class="parameter"><code><a class="link" href="harfbuzz
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19672080"></a><h4>Returns</h4>
+<a name="idp14878704"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -165,7 +165,7 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
                              <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
                              <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
 <div class="refsect3">
                              <em class="parameter"><code>unsigned <span class="type">int</span> num_user_features</code></em>,
                              <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
 <div class="refsect3">
-<a name="idp18027296"></a><h4>Parameters</h4>
+<a name="idp16920256"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -187,7 +187,7 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21113632"></a><h4>Returns</h4>
+<a name="idp14478448"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -199,7 +199,7 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_shape_plan_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_shape_plan_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
 <div class="refsect3">
-<a name="idp18653136"></a><h4>Parameters</h4>
+<a name="idp16259760"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -225,7 +225,7 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
                        <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
                        <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>);</pre>
 <div class="refsect3">
                        <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
                        <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>);</pre>
 <div class="refsect3">
-<a name="idp26555664"></a><h4>Parameters</h4>
+<a name="idp24238496"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -257,7 +257,7 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24004304"></a><h4>Returns</h4>
+<a name="idp23522512"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -268,7 +268,7 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
 hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
 hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp24012816"></a><h4>Returns</h4>
+<a name="idp23531024"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -280,7 +280,7 @@ hb_shape_plan_get_empty (<em class="parameter"><code><span class="type">void</sp
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting">const <span class="returnvalue">char</span> *
 hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24023712"></a><h4>Parameters</h4>
+<a name="idp23541920"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -295,7 +295,7 @@ hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harf
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24032112"></a><h4>Returns</h4>
+<a name="idp23550320"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -308,7 +308,7 @@ hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harf
 hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24044464"></a><h4>Parameters</h4>
+<a name="idp23562672"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -323,7 +323,7 @@ hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24052864"></a><h4>Returns</h4>
+<a name="idp23571072"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -335,7 +335,7 @@ hb_shape_plan_get_user_data (<em class="parameter"><code><a class="link" href="h
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
 hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="returnvalue">hb_shape_plan_t</span></a> *
 hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-shape-plan.html#hb-shape-plan-t"><span class="type">hb_shape_plan_t</span></a> *shape_plan</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24063584"></a><h4>Parameters</h4>
+<a name="idp23581792"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -350,7 +350,7 @@ hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfb
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24071984"></a><h4>Returns</h4>
+<a name="idp23590192"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -366,7 +366,7 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="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>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                              <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp24089232"></a><h4>Parameters</h4>
+<a name="idp23607440"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -381,7 +381,7 @@ hb_shape_plan_set_user_data (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp24097632"></a><h4>Returns</h4>
+<a name="idp23615840"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
index 288025d..c055347 100644 (file)
@@ -115,7 +115,7 @@ hb_feature_from_string (<em class="parameter"><code>const <span class="type">cha
                         <em class="parameter"><code><span class="type">int</span> len</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *feature</code></em>);</pre>
 <div class="refsect3">
                         <em class="parameter"><code><span class="type">int</span> len</code></em>,
                         <em class="parameter"><code><a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *feature</code></em>);</pre>
 <div class="refsect3">
-<a name="idp17629440"></a><h4>Parameters</h4>
+<a name="idp18031264"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -131,13 +131,13 @@ hb_feature_from_string (<em class="parameter"><code>const <span class="type">cha
 <tr>
 <td class="parameter_name"><p>feature</p></td>
 <td class="parameter_description"><p>. </p></td>
 <tr>
 <td class="parameter_name"><p>feature</p></td>
 <td class="parameter_description"><p>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][optional]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect3">
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp15995600"></a><h4>Returns</h4>
+<a name="idp17491264"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -150,7 +150,7 @@ hb_feature_to_string (<em class="parameter"><code><a class="link" href="harfbuzz
                       <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>
 <div class="refsect3">
                       <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>
 <div class="refsect3">
-<a name="idp17672592"></a><h4>Parameters</h4>
+<a name="idp16212496"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -175,7 +175,7 @@ hb_shape (<em class="parameter"><code><a class="link" href="harfbuzz-hb-font.htm
           <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
           <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>);</pre>
 <div class="refsect3">
           <em class="parameter"><code>const <a class="link" href="harfbuzz-hb-shape.html#hb-feature-t"><span class="type">hb_feature_t</span></a> *features</code></em>,
           <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>);</pre>
 <div class="refsect3">
-<a name="idp16399600"></a><h4>Parameters</h4>
+<a name="idp20849744"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -213,7 +213,7 @@ hb_shape_full (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fon
                <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>,
                <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
 <div class="refsect3">
                <em class="parameter"><code>unsigned <span class="type">int</span> num_features</code></em>,
                <em class="parameter"><code>const <span class="type">char</span> * const *shaper_list</code></em>);</pre>
 <div class="refsect3">
-<a name="idp14558768"></a><h4>Parameters</h4>
+<a name="idp20668592"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -245,7 +245,7 @@ hb_shape_full (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fon
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp22383984"></a><h4>Returns</h4>
+<a name="idp24215408"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -256,7 +256,7 @@ hb_shape_full (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fon
 <pre class="programlisting">const <span class="returnvalue">char</span> **
 hb_shape_list_shapers (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting">const <span class="returnvalue">char</span> **
 hb_shape_list_shapers (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp22392608"></a><h4>Returns</h4>
+<a name="idp24224032"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
index a5ee566..91358b2 100644 (file)
@@ -356,7 +356,7 @@ hb_unicode_combining_class (<em class="parameter"><code><a class="link" href="ha
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19818576"></a><h4>Returns</h4>
+<a name="idp19583296"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -370,7 +370,7 @@ hb_unicode_combining_class (<em class="parameter"><code><a class="link" href="ha
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19831776"></a><h4>Returns</h4>
+<a name="idp19596496"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -383,7 +383,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> b</code></em>,
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *ab</code></em>);</pre>
 <div class="refsect3">
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> b</code></em>,
                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *ab</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19845040"></a><h4>Parameters</h4>
+<a name="idp19609760"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -405,7 +405,7 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp19857152"></a><h4>Returns</h4>
+<a name="idp19621872"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -422,7 +422,7 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19874288"></a><h4>Returns</h4>
+<a name="idp19639008"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -435,7 +435,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> *a</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *b</code></em>);</pre>
 <div class="refsect3">
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *a</code></em>,
                       <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *b</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19887632"></a><h4>Parameters</h4>
+<a name="idp19652352"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -462,7 +462,7 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp19903456"></a><h4>Returns</h4>
+<a name="idp19668176"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -475,7 +475,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> u</code></em>,
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *decomposed</code></em>);</pre>
 <div class="refsect3">
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> u</code></em>,
                                     <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-codepoint-t" title="hb_codepoint_t"><span class="type">hb_codepoint_t</span></a> *decomposed</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19916016"></a><h4>Parameters</h4>
+<a name="idp19680736"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -497,7 +497,7 @@ hb_unicode_decompose_compatibility (<em class="parameter"><code><a class="link"
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp19928128"></a><h4>Returns</h4>
+<a name="idp19692848"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -514,7 +514,7 @@ hb_unicode_decompose_compatibility (<em class="parameter"><code><a class="link"
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19945264"></a><h4>Returns</h4>
+<a name="idp19709984"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -527,7 +527,7 @@ hb_unicode_eastasian_width (<em class="parameter"><code><a class="link" href="ha
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19955504"></a><h4>Returns</h4>
+<a name="idp19720224"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -539,7 +539,7 @@ hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfb
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19963936"></a><h4>Returns</h4>
+<a name="idp19728656"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -549,7 +549,7 @@ hb_unicode_funcs_create (<em class="parameter"><code><a class="link" href="harfb
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_destroy (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp19972448"></a><h4>Parameters</h4>
+<a name="idp19737168"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -573,7 +573,7 @@ hb_unicode_funcs_get_default (<em class="parameter"><code><span class="type">voi
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19987856"></a><h4>Returns</h4>
+<a name="idp19752576"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -583,7 +583,7 @@ hb_unicode_funcs_get_default (<em class="parameter"><code><span class="type">voi
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <div class="refsect3">
-<a name="idp19995760"></a><h4>Returns</h4>
+<a name="idp19760480"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -595,7 +595,7 @@ hb_unicode_funcs_get_empty (<em class="parameter"><code><span class="type">void<
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp20006480"></a><h4>Parameters</h4>
+<a name="idp19771200"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -610,7 +610,7 @@ hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="h
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp20014880"></a><h4>Returns</h4>
+<a name="idp19779600"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -622,7 +622,7 @@ hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="h
 hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
 hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-user-data-key-t"><span class="type">hb_user_data_key_t</span></a> *key</code></em>);</pre>
 <div class="refsect3">
-<a name="idp20025632"></a><h4>Parameters</h4>
+<a name="idp19790352"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -637,7 +637,7 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp20034032"></a><h4>Returns</h4>
+<a name="idp19798752"></a><h4>Returns</h4>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
 <p>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -649,7 +649,7 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="returnvalue">hb_bool_t</span></a>
 hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21543488"></a><h4>Parameters</h4>
+<a name="idp20958624"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -664,7 +664,7 @@ hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href=
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21550992"></a><h4>Returns</h4>
+<a name="idp20966128"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -675,7 +675,7 @@ hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href=
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><span class="returnvalue">void</span>
 hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21558784"></a><h4>Parameters</h4>
+<a name="idp20973920"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -697,7 +697,7 @@ hb_unicode_funcs_make_immutable (<em class="parameter"><code><a class="link" hre
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
 <pre class="programlisting"><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="returnvalue">hb_unicode_funcs_t</span></a> *
 hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-unicode.html#hb-unicode-funcs-t"><span class="type">hb_unicode_funcs_t</span></a> *ufuncs</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21572816"></a><h4>Parameters</h4>
+<a name="idp20987952"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -712,7 +712,7 @@ hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="ha
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21580320"></a><h4>Returns</h4>
+<a name="idp20995456"></a><h4>Returns</h4>
 <p>. </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>. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
@@ -728,7 +728,7 @@ hb_unicode_funcs_set_combining_class_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21593648"></a><h4>Parameters</h4>
+<a name="idp21008784"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -753,7 +753,7 @@ hb_unicode_funcs_set_compose_func (<em class="parameter"><code><a class="link" h
                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                    <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                    <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21611808"></a><h4>Parameters</h4>
+<a name="idp21026832"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -779,7 +779,7 @@ hb_unicode_funcs_set_decompose_compatibility_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21629968"></a><h4>Parameters</h4>
+<a name="idp21044992"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -804,7 +804,7 @@ hb_unicode_funcs_set_decompose_func (<em class="parameter"><code><a class="link"
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21648128"></a><h4>Parameters</h4>
+<a name="idp21063152"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -830,7 +830,7 @@ hb_unicode_funcs_set_eastasian_width_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21666288"></a><h4>Parameters</h4>
+<a name="idp21081312"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -856,7 +856,7 @@ hb_unicode_funcs_set_general_category_func
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21684448"></a><h4>Parameters</h4>
+<a name="idp21099472"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -881,7 +881,7 @@ hb_unicode_funcs_set_mirroring_func (<em class="parameter"><code><a class="link"
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                      <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                      <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21702608"></a><h4>Parameters</h4>
+<a name="idp21117632"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -906,7 +906,7 @@ hb_unicode_funcs_set_script_func (<em class="parameter"><code><a class="link" hr
                                   <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
                                   <em class="parameter"><code><span class="type">void</span> *user_data</code></em>,
                                   <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21720768"></a><h4>Parameters</h4>
+<a name="idp21135792"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -932,7 +932,7 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-destroy-func-t" title="hb_destroy_func_t ()"><span class="type">hb_destroy_func_t</span></a> destroy</code></em>,
                                 <em class="parameter"><code><a class="link" href="harfbuzz-hb-common.html#hb-bool-t" title="hb_bool_t"><span class="type">hb_bool_t</span></a> replace</code></em>);</pre>
 <div class="refsect3">
-<a name="idp21740304"></a><h4>Parameters</h4>
+<a name="idp21155328"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -947,7 +947,7 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
 </table></div>
 </div>
 <div class="refsect3">
 </table></div>
 </div>
 <div class="refsect3">
-<a name="idp21747808"></a><h4>Returns</h4>
+<a name="idp21162832"></a><h4>Returns</h4>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
 <p></p>
 </div>
 <p class="since">Since 1.0</p>
@@ -961,7 +961,7 @@ hb_unicode_general_category (<em class="parameter"><code><a class="link" href="h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21756896"></a><h4>Returns</h4>
+<a name="idp21171920"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -975,7 +975,7 @@ hb_unicode_general_category (<em class="parameter"><code><a class="link" href="h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21768192"></a><h4>Returns</h4>
+<a name="idp21183216"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -988,7 +988,7 @@ hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21777952"></a><h4>Returns</h4>
+<a name="idp21191760"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1002,7 +1002,7 @@ hb_unicode_mirroring (<em class="parameter"><code><a class="link" href="harfbuzz
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21791664"></a><h4>Returns</h4>
+<a name="idp21203056"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1015,7 +1015,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21801936"></a><h4>Returns</h4>
+<a name="idp21211600"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1029,7 +1029,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21815648"></a><h4>Returns</h4>
+<a name="idp21222896"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -1041,7 +1041,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21822720"></a><h4>Members</h4>
+<a name="idp21228688"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1352,7 +1352,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp22023440"></a><h4>Members</h4>
+<a name="idp21422768"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
index eb90c9f..3b9645a 100644 (file)
@@ -72,7 +72,7 @@ hb_uniscribe_font_get_hfont (<em class="parameter"><code><a class="link" href="h
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp18176784"></a><h4>Returns</h4>
+<a name="idp26513136"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
@@ -84,7 +84,7 @@ hb_uniscribe_font_get_logfontw (<em class="parameter"><code><a class="link" href
 <p>
 </p>
 <div class="refsect3">
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19749248"></a><h4>Returns</h4>
+<a name="idp15442704"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
 <p></p>
 </div>
 </div>
index a20d726..3438e91 100644 (file)
@@ -98,7 +98,7 @@ hb_version (<em class="parameter"><code>unsigned <span class="type">int</span> *
             <em class="parameter"><code>unsigned <span class="type">int</span> *minor</code></em>,
             <em class="parameter"><code>unsigned <span class="type">int</span> *micro</code></em>);</pre>
 <div class="refsect3">
             <em class="parameter"><code>unsigned <span class="type">int</span> *minor</code></em>,
             <em class="parameter"><code>unsigned <span class="type">int</span> *micro</code></em>);</pre>
 <div class="refsect3">
-<a name="idp17096464"></a><h4>Parameters</h4>
+<a name="idp16699792"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -133,7 +133,7 @@ hb_version (<em class="parameter"><code>unsigned <span class="type">int</span> *
 hb_version_string (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <p>Returns library version as a string with three components.</p>
 <div class="refsect3">
 hb_version_string (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <p>Returns library version as a string with three components.</p>
 <div class="refsect3">
-<a name="idp21398048"></a><h4>Returns</h4>
+<a name="idp14950384"></a><h4>Returns</h4>
 <p> library version string.</p>
 <p></p>
 </div>
 <p> library version string.</p>
 <p></p>
 </div>
@@ -152,7 +152,7 @@ hb_version_string (<em class="parameter"><code><span class="type">void</span></c
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MICRO:CAPS"></a><h3>HB_VERSION_MICRO</h3>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-MICRO:CAPS"></a><h3>HB_VERSION_MICRO</h3>
-<pre class="programlisting">#define HB_VERSION_MICRO 35
+<pre class="programlisting">#define HB_VERSION_MICRO 40
 </pre>
 <p>
 </p>
 </pre>
 <p>
 </p>
@@ -168,7 +168,7 @@ hb_version_string (<em class="parameter"><code><span class="type">void</span></c
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-STRING:CAPS"></a><h3>HB_VERSION_STRING</h3>
 <hr>
 <div class="refsect2">
 <a name="HB-VERSION-STRING:CAPS"></a><h3>HB_VERSION_STRING</h3>
-<pre class="programlisting">#define HB_VERSION_STRING "0.9.35"
+<pre class="programlisting">#define HB_VERSION_STRING "0.9.40"
 </pre>
 <p>
 </p>
 </pre>
 <p>
 </p>
index 4fdf9d4..10bb40c 100644 (file)
     <keyword type="struct" name="hb_glyph_info_t" link="harfbuzz-hb-buffer.html#hb-glyph-info-t-struct"/>
     <keyword type="struct" name="hb_glyph_position_t" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct"/>
     <keyword type="struct" name="hb_segment_properties_t" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct"/>
     <keyword type="struct" name="hb_glyph_info_t" link="harfbuzz-hb-buffer.html#hb-glyph-info-t-struct"/>
     <keyword type="struct" name="hb_glyph_position_t" link="harfbuzz-hb-buffer.html#hb-glyph-position-t-struct"/>
     <keyword type="struct" name="hb_segment_properties_t" link="harfbuzz-hb-buffer.html#hb-segment-properties-t-struct"/>
-    <keyword type="function" name="hb_blob_create ()" link="harfbuzz-hb-blob.html#hb-blob-create"/>
+    <keyword type="function" name="hb_blob_create ()" link="harfbuzz-hb-blob.html#hb-blob-create" since="1.0"/>
     <keyword type="function" name="hb_blob_create_sub_blob ()" link="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" since="1.0"/>
     <keyword type="function" name="hb_blob_destroy ()" link="harfbuzz-hb-blob.html#hb-blob-destroy" since="1.0"/>
     <keyword type="function" name="hb_blob_get_data ()" link="harfbuzz-hb-blob.html#hb-blob-get-data" since="1.0"/>
     <keyword type="function" name="hb_blob_create_sub_blob ()" link="harfbuzz-hb-blob.html#hb-blob-create-sub-blob" since="1.0"/>
     <keyword type="function" name="hb_blob_destroy ()" link="harfbuzz-hb-blob.html#hb-blob-destroy" since="1.0"/>
     <keyword type="function" name="hb_blob_get_data ()" link="harfbuzz-hb-blob.html#hb-blob-get-data" since="1.0"/>
index d5cc2bb..772db71 100644 (file)
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">HarfBuzz Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">HarfBuzz Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for HarfBuzz 0.9.35
+      for HarfBuzz 0.9.40
 .
       
     </p></div>
 .
       
     </p></div>
index e9d29e0..7b469b5 100644 (file)
 <ANCHOR id="harfbuzz-hb-gobject.description" href="harfbuzz/harfbuzz-hb-gobject.html#harfbuzz-hb-gobject.description">
 <ANCHOR id="harfbuzz-hb-gobject.functions_details" href="harfbuzz/harfbuzz-hb-gobject.html#harfbuzz-hb-gobject.functions_details">
 <ANCHOR id="harfbuzz-hb-gobject.other_details" href="harfbuzz/harfbuzz-hb-gobject.html#harfbuzz-hb-gobject.other_details">
 <ANCHOR id="harfbuzz-hb-gobject.description" href="harfbuzz/harfbuzz-hb-gobject.html#harfbuzz-hb-gobject.description">
 <ANCHOR id="harfbuzz-hb-gobject.functions_details" href="harfbuzz/harfbuzz-hb-gobject.html#harfbuzz-hb-gobject.functions_details">
 <ANCHOR id="harfbuzz-hb-gobject.other_details" href="harfbuzz/harfbuzz-hb-gobject.html#harfbuzz-hb-gobject.other_details">
-<ANCHOR id="annotation-glossterm-allow-none" href="harfbuzz/annotation-glossary.html#annotation-glossterm-allow-none">
 <ANCHOR id="annotation-glossterm-array" href="harfbuzz/annotation-glossary.html#annotation-glossterm-array">
 <ANCHOR id="annotation-glossterm-closure" href="harfbuzz/annotation-glossary.html#annotation-glossterm-closure">
 <ANCHOR id="annotation-glossterm-destroy" href="harfbuzz/annotation-glossary.html#annotation-glossterm-destroy">
 <ANCHOR id="annotation-glossterm-array" href="harfbuzz/annotation-glossary.html#annotation-glossterm-array">
 <ANCHOR id="annotation-glossterm-closure" href="harfbuzz/annotation-glossary.html#annotation-glossterm-closure">
 <ANCHOR id="annotation-glossterm-destroy" href="harfbuzz/annotation-glossary.html#annotation-glossterm-destroy">
+<ANCHOR id="annotation-glossterm-element-type" href="harfbuzz/annotation-glossary.html#annotation-glossterm-element-type">
 <ANCHOR id="annotation-glossterm-inout" href="harfbuzz/annotation-glossary.html#annotation-glossterm-inout">
 <ANCHOR id="annotation-glossterm-out" href="harfbuzz/annotation-glossary.html#annotation-glossterm-out">
 <ANCHOR id="annotation-glossterm-scope notified" href="harfbuzz/annotation-glossary.html#annotation-glossterm-scope notified">
 <ANCHOR id="annotation-glossterm-inout" href="harfbuzz/annotation-glossary.html#annotation-glossterm-inout">
 <ANCHOR id="annotation-glossterm-out" href="harfbuzz/annotation-glossary.html#annotation-glossterm-out">
 <ANCHOR id="annotation-glossterm-scope notified" href="harfbuzz/annotation-glossary.html#annotation-glossterm-scope notified">
index ba07ac5..c99967f 100644 (file)
@@ -13,6 +13,9 @@ DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
 # The following warning options are useful for debugging: -Wpadded
 #AM_CXXFLAGS =
 
 # The following warning options are useful for debugging: -Wpadded
 #AM_CXXFLAGS =
 
+# Convenience targets:
+lib: libharfbuzz.la
+
 lib_LTLIBRARIES = libharfbuzz.la
 
 HBCFLAGS =
 lib_LTLIBRARIES = libharfbuzz.la
 
 HBCFLAGS =
@@ -234,8 +237,8 @@ hb-gobject-enums.%: hb-gobject-enums.%.tmpl $(HBHEADERS)
        $(AM_V_GEN) $(GLIB_MKENUMS) \
                --identifier-prefix hb_ --symbol-prefix hb_gobject \
                --template $^ | \
        $(AM_V_GEN) $(GLIB_MKENUMS) \
                --identifier-prefix hb_ --symbol-prefix hb_gobject \
                --template $^ | \
-       sed 's/_t_get_type/_get_type/g; s/_T (/ (/g' > "$@.tmp" && \
-       mv "$@.tmp" "$@" || ( $(RM) "@.tmp" && false )
+       sed 's/_t_get_type/_get_type/g; s/_T (/ (/g' > "$@" \
+       || ($(RM) "$@"; false)
 endif
 EXTRA_DIST += \
        harfbuzz-gobject.pc.in \
 endif
 EXTRA_DIST += \
        harfbuzz-gobject.pc.in \
@@ -251,8 +254,8 @@ EXTRA_DIST += \
                -e 's@%libdir%@$(libdir)@g' \
                -e 's@%includedir%@$(includedir)@g' \
                -e 's@%VERSION%@$(VERSION)@g' \
                -e 's@%libdir%@$(libdir)@g' \
                -e 's@%includedir%@$(includedir)@g' \
                -e 's@%VERSION%@$(VERSION)@g' \
-       "$<" \
-       > "$@.tmp" && mv "$@.tmp" "$@" || ( $(RM) "$@.tmp"; false )
+       "$<" > "$@" \
+       || ($(RM) "$@"; false)
 
 CLEANFILES += $(pkgconfig_DATA)
 
 
 CLEANFILES += $(pkgconfig_DATA)
 
@@ -265,8 +268,9 @@ harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
        sed -e 's/ (.*//' | \
        LANG=C sort; \
        echo LIBRARY libharfbuzz-$(HB_VERSION_MAJOR).dll; \
        sed -e 's/ (.*//' | \
        LANG=C sort; \
        echo LIBRARY libharfbuzz-$(HB_VERSION_MAJOR).dll; \
-       ) >"$@.tmp"
-       @ ! grep -q hb_ERROR "$@.tmp" && mv "$@.tmp" "$@" || ($(RM) "$@"; false)
+       ) >"$@"
+       @ ! grep -q hb_ERROR "$@" \
+       || ($(RM) "$@"; false)
 
 
 GENERATORS = \
 
 
 GENERATORS = \
@@ -278,26 +282,25 @@ EXTRA_DIST += $(GENERATORS)
 unicode-tables: arabic-table indic-table
 
 indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
 unicode-tables: arabic-table indic-table
 
 indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-indic-table.cc.tmp && \
-       mv hb-ot-shape-complex-indic-table.cc.tmp $(srcdir)/hb-ot-shape-complex-indic-table.cc || \
-       ($(RM) hb-ot-shape-complex-indic-table.cc.tmp; false)
+       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-indic-table.cc \
+       || ($(RM) hb-ot-shape-complex-indic-table.cc; false)
 
 arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
 
 arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-arabic-table.hh.tmp && \
-       mv hb-ot-shape-complex-arabic-table.hh.tmp $(srcdir)/hb-ot-shape-complex-arabic-table.hh || \
-       ($(RM) hb-ot-shape-complex-arabic-table.hh.tmp; false)
+       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-arabic-table.hh \
+       || ($(RM) hb-ot-shape-complex-arabic-table.hh; false)
 
 built-sources: $(BUILT_SOURCES)
 
 .PHONY: unicode-tables arabic-table indic-table built-sources
 
 
 built-sources: $(BUILT_SOURCES)
 
 .PHONY: unicode-tables arabic-table indic-table built-sources
 
-BUILT_SOURCES += \
-       hb-buffer-deserialize-json.hh \
-       hb-buffer-deserialize-text.hh \
-       hb-ot-shape-complex-indic-machine.hh \
-       hb-ot-shape-complex-myanmar-machine.hh \
-       hb-ot-shape-complex-sea-machine.hh \
+RAGEL_GENERATED = \
+       $(srcdir)/hb-buffer-deserialize-json.hh \
+       $(srcdir)/hb-buffer-deserialize-text.hh \
+       $(srcdir)/hb-ot-shape-complex-indic-machine.hh \
+       $(srcdir)/hb-ot-shape-complex-myanmar-machine.hh \
+       $(srcdir)/hb-ot-shape-complex-sea-machine.hh \
        $(NULL)
        $(NULL)
+BUILT_SOURCES += $(RAGEL_GENERATED)
 EXTRA_DIST += \
        hb-buffer-deserialize-json.rl \
        hb-buffer-deserialize-text.rl \
 EXTRA_DIST += \
        hb-buffer-deserialize-json.rl \
        hb-buffer-deserialize-text.rl \
@@ -305,9 +308,10 @@ EXTRA_DIST += \
        hb-ot-shape-complex-myanmar-machine.rl \
        hb-ot-shape-complex-sea-machine.rl \
        $(NULL)
        hb-ot-shape-complex-myanmar-machine.rl \
        hb-ot-shape-complex-sea-machine.rl \
        $(NULL)
-.rl.hh:
-       $(AM_V_GEN)$(RAGEL) -e -F1 -o "$@.tmp" "$<" && \
-       mv "$@.tmp" "$@" || ( $(RM) "$@.tmp" && false )
+MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
+$(srcdir)/%.hh: $(srcdir)/%.rl
+       $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
+       || ($(RM) "$@"; false)
 
 noinst_PROGRAMS = \
        main \
 
 noinst_PROGRAMS = \
        main \
index 703d994..bd923e6 100644 (file)
@@ -861,11 +861,7 @@ top_srcdir = @top_srcdir@
 NULL = 
 SUBDIRS = $(am__append_26)
 DIST_SUBDIRS = hb-ucdn
 NULL = 
 SUBDIRS = $(am__append_26)
 DIST_SUBDIRS = hb-ucdn
-BUILT_SOURCES = $(am__append_37) hb-buffer-deserialize-json.hh \
-       hb-buffer-deserialize-text.hh \
-       hb-ot-shape-complex-indic-machine.hh \
-       hb-ot-shape-complex-myanmar-machine.hh \
-       hb-ot-shape-complex-sea-machine.hh $(NULL)
+BUILT_SOURCES = $(am__append_37) $(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-buffer-deserialize-json.rl \
 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-buffer-deserialize-json.rl \
@@ -875,11 +871,8 @@ EXTRA_DIST = harfbuzz.pc.in harfbuzz-icu.pc.in harfbuzz-gobject.pc.in \
        hb-ot-shape-complex-sea-machine.rl $(NULL)
 CLEANFILES = $(pkgconfig_DATA) harfbuzz.def $(am__append_39)
 DISTCLEANFILES = $(am__append_38)
        hb-ot-shape-complex-sea-machine.rl $(NULL)
 CLEANFILES = $(pkgconfig_DATA) harfbuzz.def $(am__append_39)
 DISTCLEANFILES = $(am__append_38)
-MAINTAINERCLEANFILES = 
+MAINTAINERCLEANFILES = $(RAGEL_GENERATED)
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
-
-# The following warning options are useful for debugging: -Wpadded
-#AM_CXXFLAGS =
 lib_LTLIBRARIES = libharfbuzz.la $(am__append_30) $(am__append_33)
 HBCFLAGS = $(am__append_4) $(am__append_6) $(am__append_10) \
        $(am__append_14) $(am__append_18) $(am__append_22) \
 lib_LTLIBRARIES = libharfbuzz.la $(am__append_30) $(am__append_33)
 HBCFLAGS = $(am__append_4) $(am__append_6) $(am__append_10) \
        $(am__append_14) $(am__append_18) $(am__append_22) \
@@ -943,6 +936,14 @@ GENERATORS = \
        gen-indic-table.py \
        $(NULL)
 
        gen-indic-table.py \
        $(NULL)
 
+RAGEL_GENERATED = \
+       $(srcdir)/hb-buffer-deserialize-json.hh \
+       $(srcdir)/hb-buffer-deserialize-text.hh \
+       $(srcdir)/hb-ot-shape-complex-indic-machine.hh \
+       $(srcdir)/hb-ot-shape-complex-myanmar-machine.hh \
+       $(srcdir)/hb-ot-shape-complex-sea-machine.hh \
+       $(NULL)
+
 main_SOURCES = main.cc
 main_CPPFLAGS = $(HBCFLAGS)
 main_LDADD = libharfbuzz.la $(HBLIBS)
 main_SOURCES = main.cc
 main_CPPFLAGS = $(HBCFLAGS)
 main_LDADD = libharfbuzz.la $(HBLIBS)
@@ -1014,7 +1015,7 @@ all: $(BUILT_SOURCES)
        $(MAKE) $(AM_MAKEFLAGS) all-recursive
 
 .SUFFIXES:
        $(MAKE) $(AM_MAKEFLAGS) all-recursive
 
 .SUFFIXES:
-.SUFFIXES: .cc .hh .lo .log .o .obj .rl .test .test$(EXEEXT) .trs
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(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 \
@@ -2223,12 +2224,18 @@ uninstall-am: uninstall-binPROGRAMS uninstall-girDATA \
        uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS \
        uninstall-typelibDATA
 
        uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS \
        uninstall-typelibDATA
 
+
+# The following warning options are useful for debugging: -Wpadded
+#AM_CXXFLAGS =
+
+# Convenience targets:
+lib: libharfbuzz.la
 @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@            --template $^ | \
 @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@            --template $^ | \
-@HAVE_GOBJECT_TRUE@    sed 's/_t_get_type/_get_type/g; s/_T (/ (/g' > "$@.tmp" && \
-@HAVE_GOBJECT_TRUE@    mv "$@.tmp" "$@" || ( $(RM) "@.tmp" && false )
+@HAVE_GOBJECT_TRUE@    sed 's/_t_get_type/_get_type/g; s/_T (/ (/g' > "$@" \
+@HAVE_GOBJECT_TRUE@    || ($(RM) "$@"; false)
 
 %.pc: %.pc.in $(top_builddir)/config.status
        $(AM_V_GEN) \
 
 %.pc: %.pc.in $(top_builddir)/config.status
        $(AM_V_GEN) \
@@ -2237,8 +2244,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-girDATA \
                -e 's@%libdir%@$(libdir)@g' \
                -e 's@%includedir%@$(includedir)@g' \
                -e 's@%VERSION%@$(VERSION)@g' \
                -e 's@%libdir%@$(libdir)@g' \
                -e 's@%includedir%@$(includedir)@g' \
                -e 's@%VERSION%@$(VERSION)@g' \
-       "$<" \
-       > "$@.tmp" && mv "$@.tmp" "$@" || ( $(RM) "$@.tmp"; false )
+       "$<" > "$@" \
+       || ($(RM) "$@"; false)
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
        $(AM_V_GEN) (echo EXPORTS; \
        (cat $^ || echo 'hb_ERROR ()' ) | \
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
        $(AM_V_GEN) (echo EXPORTS; \
        (cat $^ || echo 'hb_ERROR ()' ) | \
@@ -2246,27 +2253,26 @@ harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
        sed -e 's/ (.*//' | \
        LANG=C sort; \
        echo LIBRARY libharfbuzz-$(HB_VERSION_MAJOR).dll; \
        sed -e 's/ (.*//' | \
        LANG=C sort; \
        echo LIBRARY libharfbuzz-$(HB_VERSION_MAJOR).dll; \
-       ) >"$@.tmp"
-       @ ! grep -q hb_ERROR "$@.tmp" && mv "$@.tmp" "$@" || ($(RM) "$@"; false)
+       ) >"$@"
+       @ ! grep -q hb_ERROR "$@" \
+       || ($(RM) "$@"; false)
 
 unicode-tables: arabic-table indic-table
 
 indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
 
 unicode-tables: arabic-table indic-table
 
 indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-indic-table.cc.tmp && \
-       mv hb-ot-shape-complex-indic-table.cc.tmp $(srcdir)/hb-ot-shape-complex-indic-table.cc || \
-       ($(RM) hb-ot-shape-complex-indic-table.cc.tmp; false)
+       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-indic-table.cc \
+       || ($(RM) hb-ot-shape-complex-indic-table.cc; false)
 
 arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
 
 arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt
-       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-arabic-table.hh.tmp && \
-       mv hb-ot-shape-complex-arabic-table.hh.tmp $(srcdir)/hb-ot-shape-complex-arabic-table.hh || \
-       ($(RM) hb-ot-shape-complex-arabic-table.hh.tmp; false)
+       $(AM_V_GEN) $(builddir)/$^ > hb-ot-shape-complex-arabic-table.hh \
+       || ($(RM) hb-ot-shape-complex-arabic-table.hh; false)
 
 built-sources: $(BUILT_SOURCES)
 
 .PHONY: unicode-tables arabic-table indic-table built-sources
 
 built-sources: $(BUILT_SOURCES)
 
 .PHONY: unicode-tables arabic-table indic-table built-sources
-.rl.hh:
-       $(AM_V_GEN)$(RAGEL) -e -F1 -o "$@.tmp" "$<" && \
-       mv "$@.tmp" "$@" || ( $(RM) "$@.tmp" && false )
+$(srcdir)/%.hh: $(srcdir)/%.rl
+       $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
+       || ($(RM) "$@"; false)
 
 @HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
 
 
 @HAVE_INTROSPECTION_TRUE@-include $(INTROSPECTION_MAKEFILE)
 
index 357347f..65a2467 100755 (executable)
@@ -21,7 +21,7 @@ for def in $defs; do
        lib=`echo "$def" | sed 's/[.]def$//;s@.*/@@'`
        so=.libs/lib${lib}.so
 
        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__\>' | cut -d' ' -f3`"
+       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
 
 
        if test -f "$so"; then
 
index e7e0e29..27deb42 100755 (executable)
@@ -17,14 +17,14 @@ fi
 tested=false
 for suffix in so dylib; do
        so=.libs/libharfbuzz.$suffix
 tested=false
 for suffix in so dylib; do
        so=.libs/libharfbuzz.$suffix
-       if test -f "$so"; then
-               echo "Checking that we are not linking to libstdc++"
-               if ldd $so | grep 'libstdc[+][+]'; then
-                       echo "Ouch, linked to libstdc++"
-                       stat=1
-               fi
-               tested=true
+       if ! test -f "$so"; then continue; fi
+
+       echo "Checking that we are not linking to libstdc++"
+       if ldd $so | grep 'libstdc[+][+]'; then
+               echo "Ouch, linked to libstdc++"
+               stat=1
        fi
        fi
+       tested=true
 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 83d02c8..1446fa7 100755 (executable)
@@ -22,8 +22,8 @@ fi
 
 echo "Checking that no object file has static initializers"
 for obj in $OBJS; do
 
 echo "Checking that no object file has static initializers"
 for obj in $OBJS; do
-       if objdump -t "$obj" | grep '[.]ctors'; then
-               echo "Ouch, $obj has static initializers"
+       if objdump -t "$obj" | grep '[.][cd]tors' | grep -v '\<00*\>'; then
+               echo "Ouch, $obj has static initializers/finalizers"
                stat=1
        fi
 done
                stat=1
        fi
 done
index e000b01..b2bf43f 100755 (executable)
@@ -16,11 +16,17 @@ fi
 
 echo "Checking that we are not exposing internal symbols"
 tested=false
 
 echo "Checking that we are not exposing internal symbols"
 tested=false
-for so in `ls .libs/lib*.so .libs/lib*.dylib 2>/dev/null` ; do
+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__\>' | cut -d' ' -f3`"
+       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`"
+
        prefix=`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`
 
        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"
        echo "Processing $so"
        if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}_"; then
                echo "Ouch, internal symbols exposed"
index 4fb76f4..f5716bd 100755 (executable)
@@ -209,7 +209,7 @@ for p in sorted(pages):
        for (start,end) in zip (starts, ends):
                if p not in [start>>page_bits, end>>page_bits]: continue
                offset = "indic_offset_0x%04xu" % start
        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, start, offset)
+               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]])
index b82b4b2..8759a25 100644 (file)
@@ -78,8 +78,8 @@ _hb_blob_destroy_user_data (hb_blob_t *blob)
 }
 
 /**
 }
 
 /**
- * hb_blob_create: (Xconstructor)
- * @data: (array length=length) (closure user_data) (destroy destroy) (scope notified) (transfer none): Pointer to blob data.
+ * hb_blob_create: (skip)
+ * @data: Pointer to blob data.
  * @length: Length of @data in bytes.
  * @mode: Memory mode for @data.
  * @user_data: Data parameter to pass to @destroy.
  * @length: Length of @data in bytes.
  * @mode: Memory mode for @data.
  * @user_data: Data parameter to pass to @destroy.
@@ -102,7 +102,10 @@ hb_blob_create (const char        *data,
 {
   hb_blob_t *blob;
 
 {
   hb_blob_t *blob;
 
-  if (!length || !(blob = hb_object_create<hb_blob_t> ())) {
+  if (!length ||
+      length >= 1u << 31 ||
+      data + length < data /* overflows */ ||
+      !(blob = hb_object_create<hb_blob_t> ())) {
     if (destroy)
       destroy (user_data);
     return hb_blob_get_empty ();
     if (destroy)
       destroy (user_data);
     return hb_blob_get_empty ();
index dead700..3f626bd 100644 (file)
@@ -1,5 +1,5 @@
 
 
-#line 1 "../../src/hb-buffer-deserialize-json.rl"
+#line 1 "hb-buffer-deserialize-json.rl"
 /*
  * Copyright Â© 2013  Google, Inc.
  *
 /*
  * Copyright Â© 2013  Google, Inc.
  *
@@ -32,7 +32,7 @@
 #include "hb-private.hh"
 
 
 #include "hb-private.hh"
 
 
-#line 36 "hb-buffer-deserialize-json.hh.tmp"
+#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, 
 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, 
@@ -435,7 +435,7 @@ static const int deserialize_json_error = 0;
 static const int deserialize_json_en_main = 1;
 
 
 static const int deserialize_json_en_main = 1;
 
 
-#line 97 "../../src/hb-buffer-deserialize-json.rl"
+#line 97 "hb-buffer-deserialize-json.rl"
 
 
 static hb_bool_t
 
 
 static hb_bool_t
@@ -459,15 +459,15 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
 
   const char *tok = NULL;
   int cs;
 
   const char *tok = NULL;
   int cs;
-  hb_glyph_info_t info;
-  hb_glyph_position_t pos;
+  hb_glyph_info_t info = {0};
+  hb_glyph_position_t pos = {0};
   
   
-#line 466 "hb-buffer-deserialize-json.hh.tmp"
+#line 466 "hb-buffer-deserialize-json.hh"
        {
        cs = deserialize_json_start;
        }
 
        {
        cs = deserialize_json_start;
        }
 
-#line 471 "hb-buffer-deserialize-json.hh.tmp"
+#line 471 "hb-buffer-deserialize-json.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -493,14 +493,14 @@ _resume:
 
        switch ( _deserialize_json_trans_actions[_trans] ) {
        case 1:
 
        switch ( _deserialize_json_trans_actions[_trans] ) {
        case 1:
-#line 38 "../../src/hb-buffer-deserialize-json.rl"
+#line 38 "hb-buffer-deserialize-json.rl"
        {
        memset (&info, 0, sizeof (info));
        memset (&pos , 0, sizeof (pos ));
 }
        break;
        case 5:
        {
        memset (&info, 0, sizeof (info));
        memset (&pos , 0, sizeof (pos ));
 }
        break;
        case 5:
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -510,13 +510,13 @@ _resume:
 }
        break;
        case 2:
 }
        break;
        case 2:
-#line 51 "../../src/hb-buffer-deserialize-json.rl"
+#line 51 "hb-buffer-deserialize-json.rl"
        {
        tok = p;
 }
        break;
        case 14:
        {
        tok = p;
 }
        break;
        case 14:
-#line 55 "../../src/hb-buffer-deserialize-json.rl"
+#line 55 "hb-buffer-deserialize-json.rl"
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
@@ -525,33 +525,33 @@ _resume:
 }
        break;
        case 15:
 }
        break;
        case 15:
-#line 62 "../../src/hb-buffer-deserialize-json.rl"
+#line 62 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.codepoint)) return false; }
        break;
        case 8:
        { if (!parse_uint (tok, p, &info.codepoint)) return false; }
        break;
        case 8:
-#line 63 "../../src/hb-buffer-deserialize-json.rl"
+#line 63 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        break;
        case 10:
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        break;
        case 10:
-#line 64 "../../src/hb-buffer-deserialize-json.rl"
+#line 64 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
        break;
        case 12:
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
        break;
        case 12:
-#line 65 "../../src/hb-buffer-deserialize-json.rl"
+#line 65 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        break;
        case 3:
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        break;
        case 3:
-#line 66 "../../src/hb-buffer-deserialize-json.rl"
+#line 66 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        break;
        case 6:
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        break;
        case 6:
-#line 67 "../../src/hb-buffer-deserialize-json.rl"
+#line 67 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
        break;
        case 16:
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
        break;
        case 16:
-#line 62 "../../src/hb-buffer-deserialize-json.rl"
+#line 62 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.codepoint)) return false; }
        { if (!parse_uint (tok, p, &info.codepoint)) return false; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -561,9 +561,9 @@ _resume:
 }
        break;
        case 9:
 }
        break;
        case 9:
-#line 63 "../../src/hb-buffer-deserialize-json.rl"
+#line 63 "hb-buffer-deserialize-json.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -573,9 +573,9 @@ _resume:
 }
        break;
        case 11:
 }
        break;
        case 11:
-#line 64 "../../src/hb-buffer-deserialize-json.rl"
+#line 64 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -585,9 +585,9 @@ _resume:
 }
        break;
        case 13:
 }
        break;
        case 13:
-#line 65 "../../src/hb-buffer-deserialize-json.rl"
+#line 65 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -597,9 +597,9 @@ _resume:
 }
        break;
        case 4:
 }
        break;
        case 4:
-#line 66 "../../src/hb-buffer-deserialize-json.rl"
+#line 66 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -609,9 +609,9 @@ _resume:
 }
        break;
        case 7:
 }
        break;
        case 7:
-#line 67 "../../src/hb-buffer-deserialize-json.rl"
+#line 67 "hb-buffer-deserialize-json.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -620,7 +620,7 @@ _resume:
        *end_ptr = p;
 }
        break;
        *end_ptr = p;
 }
        break;
-#line 624 "hb-buffer-deserialize-json.hh.tmp"
+#line 624 "hb-buffer-deserialize-json.hh"
        }
 
 _again:
        }
 
 _again:
@@ -632,7 +632,7 @@ _again:
        _out: {}
        }
 
        _out: {}
        }
 
-#line 125 "../../src/hb-buffer-deserialize-json.rl"
+#line 125 "hb-buffer-deserialize-json.rl"
 
 
   *end_ptr = p;
 
 
   *end_ptr = p;
index 7351b2a..91b350f 100644 (file)
@@ -117,8 +117,8 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
 
   const char *tok = NULL;
   int cs;
 
   const char *tok = NULL;
   int cs;
-  hb_glyph_info_t info;
-  hb_glyph_position_t pos;
+  hb_glyph_info_t info = {0};
+  hb_glyph_position_t pos = {0};
   %%{
     write init;
     write exec;
   %%{
     write init;
     write exec;
index a38efe3..7a46ab2 100644 (file)
@@ -1,5 +1,5 @@
 
 
-#line 1 "../../src/hb-buffer-deserialize-text.rl"
+#line 1 "hb-buffer-deserialize-text.rl"
 /*
  * Copyright Â© 2013  Google, Inc.
  *
 /*
  * Copyright Â© 2013  Google, Inc.
  *
@@ -32,7 +32,7 @@
 #include "hb-private.hh"
 
 
 #include "hb-private.hh"
 
 
-#line 36 "hb-buffer-deserialize-text.hh.tmp"
+#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, 
 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, 
@@ -312,7 +312,7 @@ static const int deserialize_text_error = 0;
 static const int deserialize_text_en_main = 1;
 
 
 static const int deserialize_text_en_main = 1;
 
 
-#line 91 "../../src/hb-buffer-deserialize-text.rl"
+#line 91 "hb-buffer-deserialize-text.rl"
 
 
 static hb_bool_t
 
 
 static hb_bool_t
@@ -339,12 +339,12 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
   hb_glyph_info_t info;
   hb_glyph_position_t pos;
   
   hb_glyph_info_t info;
   hb_glyph_position_t pos;
   
-#line 343 "hb-buffer-deserialize-text.hh.tmp"
+#line 343 "hb-buffer-deserialize-text.hh"
        {
        cs = deserialize_text_start;
        }
 
        {
        cs = deserialize_text_start;
        }
 
-#line 348 "hb-buffer-deserialize-text.hh.tmp"
+#line 348 "hb-buffer-deserialize-text.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -370,13 +370,13 @@ _resume:
 
        switch ( _deserialize_text_trans_actions[_trans] ) {
        case 2:
 
        switch ( _deserialize_text_trans_actions[_trans] ) {
        case 2:
-#line 51 "../../src/hb-buffer-deserialize-text.rl"
+#line 51 "hb-buffer-deserialize-text.rl"
        {
        tok = p;
 }
        break;
        case 5:
        {
        tok = p;
 }
        break;
        case 5:
-#line 55 "../../src/hb-buffer-deserialize-text.rl"
+#line 55 "hb-buffer-deserialize-text.rl"
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
@@ -385,41 +385,41 @@ _resume:
 }
        break;
        case 10:
 }
        break;
        case 10:
-#line 62 "../../src/hb-buffer-deserialize-text.rl"
+#line 62 "hb-buffer-deserialize-text.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        break;
        case 3:
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        break;
        case 3:
-#line 63 "../../src/hb-buffer-deserialize-text.rl"
+#line 63 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
        break;
        case 12:
        { if (!parse_int  (tok, p, &pos.x_offset )) return false; }
        break;
        case 12:
-#line 64 "../../src/hb-buffer-deserialize-text.rl"
+#line 64 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        break;
        case 7:
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        break;
        case 7:
-#line 65 "../../src/hb-buffer-deserialize-text.rl"
+#line 65 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        break;
        case 1:
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        break;
        case 1:
-#line 38 "../../src/hb-buffer-deserialize-text.rl"
+#line 38 "hb-buffer-deserialize-text.rl"
        {
        memset (&info, 0, sizeof (info));
        memset (&pos , 0, sizeof (pos ));
 }
        {
        memset (&info, 0, sizeof (info));
        memset (&pos , 0, sizeof (pos ));
 }
-#line 51 "../../src/hb-buffer-deserialize-text.rl"
+#line 51 "hb-buffer-deserialize-text.rl"
        {
        tok = p;
 }
        break;
        case 4:
        {
        tok = p;
 }
        break;
        case 4:
-#line 55 "../../src/hb-buffer-deserialize-text.rl"
+#line 55 "hb-buffer-deserialize-text.rl"
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -429,9 +429,9 @@ _resume:
 }
        break;
        case 9:
 }
        break;
        case 9:
-#line 62 "../../src/hb-buffer-deserialize-text.rl"
+#line 62 "hb-buffer-deserialize-text.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -441,9 +441,9 @@ _resume:
 }
        break;
        case 11:
 }
        break;
        case 11:
-#line 64 "../../src/hb-buffer-deserialize-text.rl"
+#line 64 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -453,9 +453,9 @@ _resume:
 }
        break;
        case 6:
 }
        break;
        case 6:
-#line 65 "../../src/hb-buffer-deserialize-text.rl"
+#line 65 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -465,9 +465,9 @@ _resume:
 }
        break;
        case 8:
 }
        break;
        case 8:
-#line 66 "../../src/hb-buffer-deserialize-text.rl"
+#line 66 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -476,7 +476,7 @@ _resume:
        *end_ptr = p;
 }
        break;
        *end_ptr = p;
 }
        break;
-#line 480 "hb-buffer-deserialize-text.hh.tmp"
+#line 480 "hb-buffer-deserialize-text.hh"
        }
 
 _again:
        }
 
 _again:
@@ -489,14 +489,14 @@ _again:
        {
        switch ( _deserialize_text_eof_actions[cs] ) {
        case 4:
        {
        switch ( _deserialize_text_eof_actions[cs] ) {
        case 4:
-#line 55 "../../src/hb-buffer-deserialize-text.rl"
+#line 55 "hb-buffer-deserialize-text.rl"
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
        {
        if (!hb_font_glyph_from_string (font,
                                        tok, p - tok,
                                        &info.codepoint))
          return false;
 }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -506,9 +506,9 @@ _again:
 }
        break;
        case 9:
 }
        break;
        case 9:
-#line 62 "../../src/hb-buffer-deserialize-text.rl"
+#line 62 "hb-buffer-deserialize-text.rl"
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
        { if (!parse_uint (tok, p, &info.cluster )) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -518,9 +518,9 @@ _again:
 }
        break;
        case 11:
 }
        break;
        case 11:
-#line 64 "../../src/hb-buffer-deserialize-text.rl"
+#line 64 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
        { if (!parse_int  (tok, p, &pos.y_offset )) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -530,9 +530,9 @@ _again:
 }
        break;
        case 6:
 }
        break;
        case 6:
-#line 65 "../../src/hb-buffer-deserialize-text.rl"
+#line 65 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
        { if (!parse_int  (tok, p, &pos.x_advance)) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -542,9 +542,9 @@ _again:
 }
        break;
        case 8:
 }
        break;
        case 8:
-#line 66 "../../src/hb-buffer-deserialize-text.rl"
+#line 66 "hb-buffer-deserialize-text.rl"
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
        { if (!parse_int  (tok, p, &pos.y_advance)) return false; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -553,14 +553,14 @@ _again:
        *end_ptr = p;
 }
        break;
        *end_ptr = p;
 }
        break;
-#line 557 "hb-buffer-deserialize-text.hh.tmp"
+#line 557 "hb-buffer-deserialize-text.hh"
        }
        }
 
        _out: {}
        }
 
        }
        }
 
        _out: {}
        }
 
-#line 119 "../../src/hb-buffer-deserialize-text.rl"
+#line 119 "hb-buffer-deserialize-text.rl"
 
 
   *end_ptr = p;
 
 
   *end_ptr = p;
index 74ae273..b9fe263 100644 (file)
@@ -443,7 +443,7 @@ hb_buffer_t::reverse_range (unsigned int start,
 {
   unsigned int i, j;
 
 {
   unsigned int i, j;
 
-  if (start == end - 1)
+  if (end - start < 2)
     return;
 
   for (i = start, j = end - 1; i < j; i++, j--) {
     return;
 
   for (i = start, j = end - 1; i < j; i++, j--) {
@@ -454,7 +454,7 @@ hb_buffer_t::reverse_range (unsigned int start,
     info[j] = t;
   }
 
     info[j] = t;
   }
 
-  if (pos) {
+  if (have_positions) {
     for (i = start, j = end - 1; i < j; i++, j--) {
       hb_glyph_position_t t;
 
     for (i = start, j = end - 1; i < j; i++, j--) {
       hb_glyph_position_t t;
 
@@ -1328,15 +1328,15 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer)
   buffer->guess_segment_properties ();
 }
 
   buffer->guess_segment_properties ();
 }
 
-template <bool validate, typename T>
+template <typename utf_t>
 static inline void
 hb_buffer_add_utf (hb_buffer_t  *buffer,
 static inline void
 hb_buffer_add_utf (hb_buffer_t  *buffer,
-                  const T      *text,
+                  const typename utf_t::codepoint_t *text,
                   int           text_length,
                   unsigned int  item_offset,
                   int           item_length)
 {
                   int           text_length,
                   unsigned int  item_offset,
                   int           item_length)
 {
-  typedef hb_utf_t<T, true> utf_t;
+  typedef typename utf_t::codepoint_t T;
   const hb_codepoint_t replacement = buffer->replacement;
 
   assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
   const hb_codepoint_t replacement = buffer->replacement;
 
   assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE ||
@@ -1400,7 +1400,7 @@ hb_buffer_add_utf (hb_buffer_t  *buffer,
 /**
  * hb_buffer_add_utf8:
  * @buffer: a buffer.
 /**
  * hb_buffer_add_utf8:
  * @buffer: a buffer.
- * @text: (array length=text_length):
+ * @text: (array length=text_length) (element-type uint8_t):
  * @text_length: 
  * @item_offset: 
  * @item_length: 
  * @text_length: 
  * @item_offset: 
  * @item_length: 
@@ -1416,7 +1416,7 @@ hb_buffer_add_utf8 (hb_buffer_t  *buffer,
                    unsigned int  item_offset,
                    int           item_length)
 {
                    unsigned int  item_offset,
                    int           item_length)
 {
-  hb_buffer_add_utf<true> (buffer, (const uint8_t *) text, text_length, item_offset, item_length);
+  hb_buffer_add_utf<hb_utf8_t> (buffer, (const uint8_t *) text, text_length, item_offset, item_length);
 }
 
 /**
 }
 
 /**
@@ -1438,7 +1438,7 @@ hb_buffer_add_utf16 (hb_buffer_t    *buffer,
                     unsigned int    item_offset,
                     int             item_length)
 {
                     unsigned int    item_offset,
                     int             item_length)
 {
-  hb_buffer_add_utf<true> (buffer, text, text_length, item_offset, item_length);
+  hb_buffer_add_utf<hb_utf16_t> (buffer, text, text_length, item_offset, item_length);
 }
 
 /**
 }
 
 /**
@@ -1460,7 +1460,29 @@ hb_buffer_add_utf32 (hb_buffer_t    *buffer,
                     unsigned int    item_offset,
                     int             item_length)
 {
                     unsigned int    item_offset,
                     int             item_length)
 {
-  hb_buffer_add_utf<true> (buffer, text, text_length, item_offset, item_length);
+  hb_buffer_add_utf<hb_utf32_t<> > (buffer, text, text_length, item_offset, item_length);
+}
+
+/**
+ * hb_buffer_add_latin1:
+ * @buffer: a buffer.
+ * @text: (array length=text_length) (element-type uint8_t):
+ * @text_length: 
+ * @item_offset: 
+ * @item_length: 
+ *
+ * 
+ *
+ * Since: 1.0
+ **/
+void
+hb_buffer_add_latin1 (hb_buffer_t   *buffer,
+                     const uint8_t *text,
+                     int            text_length,
+                     unsigned int   item_offset,
+                     int            item_length)
+{
+  hb_buffer_add_utf<hb_latin1_t> (buffer, text, text_length, item_offset, item_length);
 }
 
 /**
 }
 
 /**
@@ -1482,7 +1504,7 @@ hb_buffer_add_codepoints (hb_buffer_t          *buffer,
                          unsigned int          item_offset,
                          int                   item_length)
 {
                          unsigned int          item_offset,
                          int                   item_length)
 {
-  hb_buffer_add_utf<false> (buffer, text, text_length, item_offset, item_length);
+  hb_buffer_add_utf<hb_utf32_t<false> > (buffer, text, text_length, item_offset, item_length);
 }
 
 
 }
 
 
index 7b0c920..e5b46d8 100644 (file)
@@ -253,6 +253,14 @@ hb_buffer_add_utf32 (hb_buffer_t    *buffer,
                     unsigned int    item_offset,
                     int             item_length);
 
                     unsigned int    item_offset,
                     int             item_length);
 
+/* Allows only access to first 256 Unicode codepoints. */
+void
+hb_buffer_add_latin1 (hb_buffer_t   *buffer,
+                     const uint8_t *text,
+                     int            text_length,
+                     unsigned int   item_offset,
+                     int            item_length);
+
 /* Like add_utf32 but does NOT check for invalid Unicode codepoints. */
 void
 hb_buffer_add_codepoints (hb_buffer_t          *buffer,
 /* Like add_utf32 but does NOT check for invalid Unicode codepoints. */
 void
 hb_buffer_add_codepoints (hb_buffer_t          *buffer,
index a6a5144..05a1f9c 100644 (file)
@@ -235,7 +235,7 @@ 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 inline
+static
 void free_langs (void)
 {
   while (langs) {
 void free_langs (void)
 {
   while (langs) {
@@ -265,6 +265,7 @@ retry:
   *lang = key;
 
   if (!hb_atomic_ptr_cmpexch (&langs, first_lang, lang)) {
   *lang = key;
 
   if (!hb_atomic_ptr_cmpexch (&langs, first_lang, lang)) {
+    lang->finish ();
     free (lang);
     goto retry;
   }
     free (lang);
     goto retry;
   }
@@ -345,7 +346,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)) {
     language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1);
   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);
-    hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language);
+    (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language);
   }
 
   return default_language;
   }
 
   return default_language;
index 9097cce..4a45175 100644 (file)
@@ -140,6 +140,7 @@ hb_coretext_face_get_cg_font (hb_face_t *face)
 
 struct hb_coretext_shaper_font_data_t {
   CTFontRef ct_font;
 
 struct hb_coretext_shaper_font_data_t {
   CTFontRef ct_font;
+  CGFloat x_mult, y_mult; /* From CT space to HB space. */
 };
 
 hb_coretext_shaper_font_data_t *
 };
 
 hb_coretext_shaper_font_data_t *
@@ -154,7 +155,17 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font)
   hb_face_t *face = font->face;
   hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
 
   hb_face_t *face = font->face;
   hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
 
-  data->ct_font = CTFontCreateWithGraphicsFont (face_data, font->y_scale, NULL, NULL);
+  /* Choose a CoreText font size and calculate multipliers to convert to HarfBuzz space. */
+  CGFloat font_size = 36.; /* Default... */
+  /* No idea if the following is even a good idea. */
+  if (font->y_ppem)
+    font_size = font->y_ppem;
+
+  if (font_size < 0)
+    font_size = -font_size;
+  data->x_mult = (CGFloat) font->x_scale / font_size;
+  data->y_mult = (CGFloat) font->y_scale / font_size;
+  data->ct_font = CTFontCreateWithGraphicsFont (face_data, font_size, NULL, NULL);
   if (unlikely (!data->ct_font)) {
     DEBUG_MSG (CORETEXT, font, "Font CTFontCreateWithGraphicsFont() failed");
     free (data);
   if (unlikely (!data->ct_font)) {
     DEBUG_MSG (CORETEXT, font, "Font CTFontCreateWithGraphicsFont() failed");
     free (data);
@@ -327,7 +338,7 @@ struct range_record_t {
 #define kUpperCaseType                         38
 
 /* Table data courtesy of Apple. */
 #define kUpperCaseType                         38
 
 /* Table data courtesy of Apple. */
-struct feature_mapping_t {
+static const struct feature_mapping_t {
     FourCharCode otFeatureTag;
     uint16_t aatFeatureType;
     uint16_t selectorToEnable;
     FourCharCode otFeatureTag;
     uint16_t aatFeatureType;
     uint16_t selectorToEnable;
@@ -776,6 +787,7 @@ retry:
 
     buffer->len = 0;
     uint32_t status_and = ~0, status_or = 0;
 
     buffer->len = 0;
     uint32_t status_and = ~0, status_or = 0;
+    double advances_so_far = 0;
 
     const CFRange range_all = CFRangeMake (0, 0);
 
 
     const CFRange range_all = CFRangeMake (0, 0);
 
@@ -786,6 +798,10 @@ 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);
+      if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
+         run_advance = -run_advance;
+      DEBUG_MSG (CORETEXT, run, "Run advance: %g", run_advance);
 
       /* CoreText does automatic font fallback (AKA "cascading") for  characters
        * not supported by the requested font, and provides no way to turn it off,
 
       /* CoreText does automatic font fallback (AKA "cascading") for  characters
        * not supported by the requested font, and provides no way to turn it off,
@@ -860,8 +876,14 @@ retry:
            goto resize_and_retry;
          hb_glyph_info_t *info = buffer->info + buffer->len;
 
            goto resize_and_retry;
          hb_glyph_info_t *info = buffer->info + buffer->len;
 
-         CGGlyph notdef = 0;
-         double advance = CTFontGetAdvancesForGlyphs (font_data->ct_font, kCTFontHorizontalOrientation, &notdef, NULL, 1);
+         hb_codepoint_t notdef = 0;
+         hb_direction_t dir = buffer->props.direction;
+         hb_position_t x_advance, y_advance, x_offset, y_offset;
+         hb_font_get_glyph_advance_for_direction (font, notdef, dir, &x_advance, &y_advance);
+         hb_font_get_glyph_origin_for_direction (font, notdef, dir, &x_offset, &y_offset);
+         hb_position_t advance = x_advance + y_advance;
+         x_offset = -x_offset;
+         y_offset = -y_offset;
 
          unsigned int old_len = buffer->len;
          for (CFIndex j = range.location; j < range.location + range.length; j++)
 
          unsigned int old_len = buffer->len;
          for (CFIndex j = range.location; j < range.location + range.length; j++)
@@ -875,19 +897,22 @@ retry:
                   * for this one. */
                  continue;
              }
                   * for this one. */
                  continue;
              }
+             if (buffer->unicode->is_default_ignorable (ch))
+               continue;
 
              info->codepoint = notdef;
              info->cluster = log_clusters[j];
 
              info->mask = advance;
 
              info->codepoint = notdef;
              info->cluster = log_clusters[j];
 
              info->mask = advance;
-             info->var1.u32 = 0;
-             info->var2.u32 = 0;
+             info->var1.u32 = x_offset;
+             info->var2.u32 = y_offset;
 
              info++;
              buffer->len++;
          }
          if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction))
            buffer->reverse_range (old_len, buffer->len);
 
              info++;
              buffer->len++;
          }
          if (HB_DIRECTION_IS_BACKWARD (buffer->props.direction))
            buffer->reverse_range (old_len, buffer->len);
+         advances_so_far += run_advance;
          continue;
        }
       }
          continue;
        }
       }
@@ -917,7 +942,7 @@ retry:
   scratch_size = scratch_size_saved; \
   scratch = scratch_saved;
 
   scratch_size = scratch_size_saved; \
   scratch = scratch_saved;
 
-      {
+      { /* Setup glyphs */
         SCRATCH_SAVE();
        const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : NULL;
        if (!glyphs) {
         SCRATCH_SAVE();
        const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : NULL;
        if (!glyphs) {
@@ -941,6 +966,11 @@ retry:
        SCRATCH_RESTORE();
       }
       {
        SCRATCH_RESTORE();
       }
       {
+        /* Setup positions.
+        * Note that CoreText does not return advances for glyphs.  As such,
+        * for all but last glyph, we use the delta position to next glyph as
+        * 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;
        if (!positions) {
         SCRATCH_SAVE();
        const CGPoint* positions = USE_PTR ? CTRunGetPositionsPtr (run) : NULL;
        if (!positions) {
@@ -948,33 +978,42 @@ retry:
          CTRunGetPositions (run, range_all, position_buf);
          positions = position_buf;
        }
          CTRunGetPositions (run, range_all, position_buf);
          positions = position_buf;
        }
-       double run_advance = CTRunGetTypographicBounds (run, range_all, NULL, NULL, NULL);
-       DEBUG_MSG (CORETEXT, run, "Run advance: %g", run_advance);
        hb_glyph_info_t *info = run_info;
        hb_glyph_info_t *info = run_info;
+       CGFloat x_mult = font_data->x_mult, y_mult = font_data->y_mult;
        if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
        {
        if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
        {
+         hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult;
          for (unsigned int j = 0; j < num_glyphs; j++)
          {
          for (unsigned int j = 0; j < num_glyphs; j++)
          {
-           double advance = (j + 1 < num_glyphs ? positions[j + 1].x : positions[0].x + run_advance) - positions[j].x;
-           info->mask = advance;
-           info->var1.u32 = positions[0].x; /* Yes, zero. */
-           info->var2.u32 = positions[j].y;
+           double advance;
+           if (likely (j + 1 < num_glyphs))
+             advance = positions[j + 1].x - positions[j].x;
+           else /* last glyph */
+             advance = run_advance - (positions[j].x - positions[0].x);
+           info->mask = advance * x_mult;
+           info->var1.u32 = x_offset;
+           info->var2.u32 = positions[j].y * y_mult;
            info++;
          }
        }
        else
        {
            info++;
          }
        }
        else
        {
-         run_advance = -run_advance;
+         hb_position_t y_offset = (positions[0].y - advances_so_far) * y_mult;
          for (unsigned int j = 0; j < num_glyphs; j++)
          {
          for (unsigned int j = 0; j < num_glyphs; j++)
          {
-           double advance = (j + 1 < num_glyphs ? positions[j + 1].y : positions[0].y + run_advance) - positions[j].y;
-           info->mask = advance;
-           info->var1.u32 = positions[j].x;
-           info->var2.u32 = positions[0].y; /* Yes, zero. */
+           double advance;
+           if (likely (j + 1 < num_glyphs))
+             advance = positions[j + 1].y - positions[j].y;
+           else /* last glyph */
+             advance = run_advance - (positions[j].y - positions[0].y);
+           info->mask = advance * y_mult;
+           info->var1.u32 = positions[j].x * x_mult;
+           info->var2.u32 = y_offset;
            info++;
          }
        }
        SCRATCH_RESTORE();
            info++;
          }
        }
        SCRATCH_RESTORE();
+       advances_so_far += run_advance;
       }
 #undef SCRATCH_RESTORE
 #undef SCRATCH_SAVE
       }
 #undef SCRATCH_RESTORE
 #undef SCRATCH_SAVE
index 6520d3d..c4266ff 100644 (file)
@@ -66,7 +66,7 @@ struct hb_face_t {
   {
     hb_blob_t *blob;
 
   {
     hb_blob_t *blob;
 
-    if (unlikely (!this || !reference_table_func))
+    if (unlikely (!reference_table_func))
       return hb_blob_get_empty ();
 
     blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data);
       return hb_blob_get_empty ();
 
     blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data);
index 16bf51f..322f93a 100644 (file)
  *     In particular, FT_Get_Advance() without the NO_HINTING flag seems to be
  *     buggy.
  *
  *     In particular, FT_Get_Advance() without the NO_HINTING flag seems to be
  *     buggy.
  *
+ *     FreeType works in 26.6 mode.  Clients can decide to use that mode, and everything
+ *     would work fine.  However, we also abuse this API for performing in font-space,
+ *     but don't pass the correct flags to FreeType.  We just abuse the no-hinting mode
+ *     for that, such that no rounding etc happens.  As such, we don't set ppem, and
+ *     pass NO_HINTING around.  This seems to work best, until we go ahead and add a full
+ *     load_flags API.
+ *
  *   - We don't handle / allow for emboldening / obliqueing.
  *
  *   - In the future, we should add constructors to create fonts in font space?
  *   - We don't handle / allow for emboldening / obliqueing.
  *
  *   - In the future, we should add constructors to create fonts in font space?
@@ -70,12 +77,10 @@ hb_ft_get_glyph (hb_font_t *font HB_UNUSED,
 {
   FT_Face ft_face = (FT_Face) font_data;
 
 {
   FT_Face ft_face = (FT_Face) font_data;
 
-#ifdef HAVE_FT_FACE_GETCHARVARIANTINDEX
   if (unlikely (variation_selector)) {
     *glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector);
     return *glyph != 0;
   }
   if (unlikely (variation_selector)) {
     *glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector);
     return *glyph != 0;
   }
-#endif
 
   *glyph = FT_Get_Char_Index (ft_face, unicode);
   return *glyph != 0;
 
   *glyph = FT_Get_Char_Index (ft_face, unicode);
   return *glyph != 0;
@@ -94,6 +99,9 @@ hb_ft_get_glyph_h_advance (hb_font_t *font HB_UNUSED,
   if (unlikely (FT_Get_Advance (ft_face, glyph, load_flags, &v)))
     return 0;
 
   if (unlikely (FT_Get_Advance (ft_face, glyph, load_flags, &v)))
     return 0;
 
+  if (font->x_scale < 0)
+    v = -v;
+
   return (v + (1<<9)) >> 10;
 }
 
   return (v + (1<<9)) >> 10;
 }
 
@@ -110,6 +118,9 @@ hb_ft_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
   if (unlikely (FT_Get_Advance (ft_face, glyph, load_flags, &v)))
     return 0;
 
   if (unlikely (FT_Get_Advance (ft_face, glyph, load_flags, &v)))
     return 0;
 
+  if (font->y_scale < 0)
+    v = -v;
+
   /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
    * have a Y growing upward.  Hence the extra negation. */
   return (-v + (1<<9)) >> 10;
   /* Note: FreeType's vertical metrics grows downward while other FreeType coordinates
    * have a Y growing upward.  Hence the extra negation. */
   return (-v + (1<<9)) >> 10;
@@ -136,7 +147,7 @@ hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
                          void *user_data HB_UNUSED)
 {
   FT_Face ft_face = (FT_Face) font_data;
                          void *user_data HB_UNUSED)
 {
   FT_Face ft_face = (FT_Face) font_data;
-  int load_flags = FT_LOAD_DEFAULT;
+  int load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
 
   if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags)))
     return false;
 
   if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags)))
     return false;
@@ -146,6 +157,11 @@ hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
   *x = ft_face->glyph->metrics.horiBearingX -   ft_face->glyph->metrics.vertBearingX;
   *y = ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY);
 
   *x = ft_face->glyph->metrics.horiBearingX -   ft_face->glyph->metrics.vertBearingX;
   *y = ft_face->glyph->metrics.horiBearingY - (-ft_face->glyph->metrics.vertBearingY);
 
+  if (font->x_scale < 0)
+    *x = -*x;
+  if (font->y_scale < 0)
+    *y = -*y;
+
   return true;
 }
 
   return true;
 }
 
@@ -185,7 +201,7 @@ hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED,
                         void *user_data HB_UNUSED)
 {
   FT_Face ft_face = (FT_Face) font_data;
                         void *user_data HB_UNUSED)
 {
   FT_Face ft_face = (FT_Face) font_data;
-  int load_flags = FT_LOAD_DEFAULT;
+  int load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
 
   if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags)))
     return false;
 
   if (unlikely (FT_Load_Glyph (ft_face, glyph, load_flags)))
     return false;
@@ -340,11 +356,7 @@ hb_ft_face_create (FT_Face           ft_face,
 
     blob = hb_blob_create ((const char *) ft_face->stream->base,
                           (unsigned int) ft_face->stream->size,
 
     blob = hb_blob_create ((const char *) ft_face->stream->base,
                           (unsigned int) ft_face->stream->size,
-                          /* TODO: We assume that it's mmap()'ed, but FreeType code
-                           * suggests that there are cases we reach here but font is
-                           * not mmapped.  For example, when mmap() fails.  No idea
-                           * how to deal with it better here. */
-                          HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE,
+                          HB_MEMORY_MODE_READONLY,
                           ft_face, destroy);
     face = hb_face_create (blob, ft_face->face_index);
     hb_blob_destroy (blob);
                           ft_face, destroy);
     face = hb_face_create (blob, ft_face->face_index);
     hb_blob_destroy (blob);
@@ -358,6 +370,22 @@ hb_ft_face_create (FT_Face           ft_face,
   return face;
 }
 
   return face;
 }
 
+/**
+ * hb_ft_face_create_referenced:
+ * @ft_face:
+ *
+ * 
+ *
+ * Return value: (transfer full): 
+ * Since: 1.0
+ **/
+hb_face_t *
+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) FT_Done_Face);
+}
+
 static void
 hb_ft_face_finalize (FT_Face ft_face)
 {
 static void
 hb_ft_face_finalize (FT_Face ft_face)
 {
@@ -420,23 +448,43 @@ hb_ft_font_create (FT_Face           ft_face,
   hb_font_set_scale (font,
                     (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1<<15)) >> 16),
                     (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1<<15)) >> 16));
   hb_font_set_scale (font,
                     (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1<<15)) >> 16),
                     (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1<<15)) >> 16));
+#if 0 /* hb-ft works in no-hinting model */
   hb_font_set_ppem (font,
                    ft_face->size->metrics.x_ppem,
                    ft_face->size->metrics.y_ppem);
   hb_font_set_ppem (font,
                    ft_face->size->metrics.x_ppem,
                    ft_face->size->metrics.y_ppem);
+#endif
 
   return font;
 }
 
 
   return font;
 }
 
+/**
+ * hb_ft_font_create_referenced:
+ * @ft_face:
+ *
+ * 
+ *
+ * Return value: (transfer full): 
+ * Since: 1.0
+ **/
+hb_font_t *
+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) FT_Done_Face);
+}
+
 
 /* Thread-safe, lock-free, FT_Library */
 
 static FT_Library ft_library;
 
 
 /* Thread-safe, lock-free, FT_Library */
 
 static FT_Library ft_library;
 
-static inline
+#ifdef HB_USE_ATEXIT
+static
 void free_ft_library (void)
 {
   FT_Done_FreeType (ft_library);
 }
 void free_ft_library (void)
 {
   FT_Done_FreeType (ft_library);
 }
+#endif
 
 static FT_Library
 get_ft_library (void)
 
 static FT_Library
 get_ft_library (void)
@@ -493,14 +541,19 @@ hb_ft_font_set_funcs (hb_font_t *font)
 
   FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
 
 
   FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
 
-  assert (font->y_scale >= 0);
   FT_Set_Char_Size (ft_face,
   FT_Set_Char_Size (ft_face,
-                   font->x_scale, font->y_scale,
+                   abs (font->x_scale), abs (font->y_scale),
                    0, 0);
 #if 0
                    font->x_ppem * 72 * 64 / font->x_scale,
                    font->y_ppem * 72 * 64 / font->y_scale);
 #endif
                    0, 0);
 #if 0
                    font->x_ppem * 72 * 64 / font->x_scale,
                    font->y_ppem * 72 * 64 / font->y_scale);
 #endif
+  if (font->x_scale < 0 || font->y_scale < 0)
+  {
+    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_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 696251e..92f4b36 100644 (file)
 
 HB_BEGIN_DECLS
 
 
 HB_BEGIN_DECLS
 
-/* Note: FreeType is not thread-safe.  Hence, these functions are not either. */
+/*
+ * Note: FreeType is not thread-safe.
+ * Hence, these functions are not either.
+ */
+
+/*
+ * hb-face from ft-face.
+ */
 
 
+/* This one creates a new hb-face for given ft-face.
+ * When the returned hb-face is destroyed, the destroy
+ * callback is called (if not NULL), with the ft-face passed
+ * to it.
+ *
+ * The client is responsible to make sure that ft-face is
+ * destroyed after hb-face is destroyed.
+ *
+ * Most often you don't want this function.  You should use either
+ * hb_ft_face_create_cached(), or hb_ft_face_create_referenced().
+ * In particular, if you are going to pass NULL as destroy, you
+ * probably should use (the more recent) hb_ft_face_create_referenced()
+ * instead.
+ */
 hb_face_t *
 hb_ft_face_create (FT_Face           ft_face,
                   hb_destroy_func_t destroy);
 
 hb_face_t *
 hb_ft_face_create (FT_Face           ft_face,
                   hb_destroy_func_t destroy);
 
+/* This version is like hb_ft_face_create(), except that it caches
+ * the hb-face using the generic pointer of the ft-face.  This means
+ * that subsequent calls to this function with the same ft-face will
+ * return the same hb-face (correctly referenced).
+ *
+ * Client is still responsible for making sure that ft-face is destroyed
+ * after hb-face is.
+ */
 hb_face_t *
 hb_ft_face_create_cached (FT_Face ft_face);
 
 hb_face_t *
 hb_ft_face_create_cached (FT_Face ft_face);
 
+/* This version is like hb_ft_face_create(), except that it calls
+ * FT_Reference_Face() on ft-face, as such keeping ft-face alive
+ * as long as the hb-face is.
+ *
+ * This is the most convenient version to use.  Use it unless you have
+ * very good reasons not to.
+ */
+hb_face_t *
+hb_ft_face_create_referenced (FT_Face ft_face);
+
+
+/*
+ * hb-font from ft-face.
+ */
+
+/*
+ * Note:
+ *
+ * Set face size on ft-face before creating hb-font from it.
+ * Otherwise hb-ft would NOT pick up the font size correctly.
+ */
+
+/* See notes on hb_ft_face_create().  Same issues re lifecycle-management
+ * apply here.  Use hb_ft_font_create_referenced() if you can. */
 hb_font_t *
 hb_ft_font_create (FT_Face           ft_face,
                   hb_destroy_func_t destroy);
 
 hb_font_t *
 hb_ft_font_create (FT_Face           ft_face,
                   hb_destroy_func_t destroy);
 
+/* See notes on hb_ft_face_create_referenced() re lifecycle-management
+ * issues. */
+hb_font_t *
+hb_ft_font_create_referenced (FT_Face ft_face);
 
 
 /* Makes an hb_font_t use FreeType internally to implement font functions. */
 
 
 /* Makes an hb_font_t use FreeType internally to implement font functions. */
index af43cab..61dff5e 100644 (file)
@@ -382,3 +382,14 @@ hb_glib_get_unicode_funcs (void)
   return const_cast<hb_unicode_funcs_t *> (&_hb_glib_unicode_funcs);
 }
 
   return const_cast<hb_unicode_funcs_t *> (&_hb_glib_unicode_funcs);
 }
 
+hb_blob_t *
+hb_glib_blob_create (GBytes *gbytes)
+{
+  gsize size = 0;
+  gconstpointer data = g_bytes_get_data (gbytes, &size);
+  return hb_blob_create ((const char *) data,
+                        size,
+                        HB_MEMORY_MODE_READONLY,
+                        g_bytes_ref (gbytes),
+                        (hb_destroy_func_t) g_bytes_unref);
+}
index 63a9d33..1a8f42e 100644 (file)
@@ -46,6 +46,9 @@ hb_glib_script_from_script (hb_script_t script);
 hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs (void);
 
 hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs (void);
 
+hb_blob_t *
+hb_glib_blob_create (GBytes *gbytes);
+
 
 HB_END_DECLS
 
 
 HB_END_DECLS
 
index 86c8b5c..24cec9d 100644 (file)
@@ -363,10 +363,8 @@ hb_icu_get_unicode_funcs (void)
   if (!hb_atomic_ptr_get (&normalizer)) {
     UErrorCode icu_err = U_ZERO_ERROR;
     /* We ignore failure in getNFCInstace(). */
   if (!hb_atomic_ptr_get (&normalizer)) {
     UErrorCode icu_err = U_ZERO_ERROR;
     /* We ignore failure in getNFCInstace(). */
-    hb_atomic_ptr_cmpexch (&normalizer, NULL, unorm2_getNFCInstance (&icu_err));
+    (void) hb_atomic_ptr_cmpexch (&normalizer, NULL, unorm2_getNFCInstance (&icu_err));
   }
 #endif
   return const_cast<hb_unicode_funcs_t *> (&_hb_icu_unicode_funcs);
 }
   }
 #endif
   return const_cast<hb_unicode_funcs_t *> (&_hb_icu_unicode_funcs);
 }
-
-
index 6281201..a8ea39c 100644 (file)
 #include <windows.h>
 typedef CRITICAL_SECTION hb_mutex_impl_t;
 #define HB_MUTEX_IMPL_INIT     {0}
 #include <windows.h>
 typedef CRITICAL_SECTION hb_mutex_impl_t;
 #define HB_MUTEX_IMPL_INIT     {0}
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#define hb_mutex_impl_init(M)  InitializeCriticalSectionEx (M, 0, 0)
+#else
 #define hb_mutex_impl_init(M)  InitializeCriticalSection (M)
 #define hb_mutex_impl_init(M)  InitializeCriticalSection (M)
+#endif
 #define hb_mutex_impl_lock(M)  EnterCriticalSection (M)
 #define hb_mutex_impl_unlock(M)        LeaveCriticalSection (M)
 #define hb_mutex_impl_finish(M)        DeleteCriticalSection (M)
 #define hb_mutex_impl_lock(M)  EnterCriticalSection (M)
 #define hb_mutex_impl_unlock(M)        LeaveCriticalSection (M)
 #define hb_mutex_impl_finish(M)        DeleteCriticalSection (M)
index 8a9ae34..7bd0f16 100644 (file)
@@ -68,8 +68,6 @@ struct hb_reference_count_t
 #define HB_USER_DATA_ARRAY_INIT {HB_MUTEX_INIT, HB_LOCKABLE_SET_INIT}
 struct hb_user_data_array_t
 {
 #define HB_USER_DATA_ARRAY_INIT {HB_MUTEX_INIT, HB_LOCKABLE_SET_INIT}
 struct hb_user_data_array_t
 {
-  /* TODO Add tracing. */
-
   struct hb_user_data_item_t {
     hb_user_data_key_t *key;
     void *data;
   struct hb_user_data_item_t {
     hb_user_data_key_t *key;
     void *data;
@@ -106,69 +104,6 @@ struct hb_object_header_t
 
 #define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INVALID, HB_USER_DATA_ARRAY_INIT}
 
 
 #define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INVALID, HB_USER_DATA_ARRAY_INIT}
 
-  static inline void *create (unsigned int size) {
-    hb_object_header_t *obj = (hb_object_header_t *) calloc (1, size);
-
-    if (likely (obj))
-      obj->init ();
-
-    return obj;
-  }
-
-  inline void init (void) {
-    ref_count.init (1);
-    user_data.init ();
-  }
-
-  inline bool is_inert (void) const {
-    return unlikely (ref_count.is_invalid ());
-  }
-
-  inline void reference (void) {
-    if (unlikely (!this || this->is_inert ()))
-      return;
-    ref_count.inc ();
-  }
-
-  inline bool destroy (void) {
-    if (unlikely (!this || this->is_inert ()))
-      return false;
-    if (ref_count.dec () != 1)
-      return false;
-
-    ref_count.finish (); /* Do this before user_data */
-    user_data.finish ();
-
-    return true;
-  }
-
-  inline bool set_user_data (hb_user_data_key_t *key,
-                            void *              data,
-                            hb_destroy_func_t   destroy_func,
-                            hb_bool_t           replace) {
-    if (unlikely (!this || this->is_inert ()))
-      return false;
-
-    return user_data.set (key, data, destroy_func, replace);
-  }
-
-  inline void *get_user_data (hb_user_data_key_t *key) {
-    if (unlikely (!this || this->is_inert ()))
-      return NULL;
-
-    return user_data.get (key);
-  }
-
-  inline void trace (const char *function) const {
-    if (unlikely (!this)) return;
-    /* TODO We cannot use DEBUG_MSG_FUNC here since that one currently only
-     * prints the class name and throws away the template info. */
-    DEBUG_MSG (OBJECT, (void *) this,
-              "%s refcount=%d",
-              function,
-              this ? ref_count.ref_count : 0);
-  }
-
   private:
   ASSERT_POD ();
 };
   private:
   ASSERT_POD ();
 };
@@ -179,32 +114,56 @@ struct hb_object_header_t
 template <typename Type>
 static inline void hb_object_trace (const Type *obj, const char *function)
 {
 template <typename Type>
 static inline void hb_object_trace (const Type *obj, const char *function)
 {
-  obj->header.trace (function);
+  DEBUG_MSG (OBJECT, (void *) obj,
+            "%s refcount=%d",
+            function,
+            obj ? obj->header.ref_count.ref_count : 0);
 }
 }
+
 template <typename Type>
 static inline Type *hb_object_create (void)
 {
 template <typename Type>
 static inline Type *hb_object_create (void)
 {
-  Type *obj = (Type *) hb_object_header_t::create (sizeof (Type));
+  Type *obj = (Type *) calloc (1, sizeof (Type));
+
+  if (unlikely (!obj))
+    return obj;
+
+  hb_object_init (obj);
   hb_object_trace (obj, HB_FUNC);
   return obj;
 }
 template <typename Type>
   hb_object_trace (obj, HB_FUNC);
   return obj;
 }
 template <typename Type>
+static inline void hb_object_init (Type *obj)
+{
+  obj->header.ref_count.init (1);
+  obj->header.user_data.init ();
+}
+template <typename Type>
 static inline bool hb_object_is_inert (const Type *obj)
 {
 static inline bool hb_object_is_inert (const Type *obj)
 {
-  return unlikely (obj->header.is_inert ());
+  return unlikely (obj->header.ref_count.is_invalid ());
 }
 template <typename Type>
 static inline Type *hb_object_reference (Type *obj)
 {
   hb_object_trace (obj, HB_FUNC);
 }
 template <typename Type>
 static inline Type *hb_object_reference (Type *obj)
 {
   hb_object_trace (obj, HB_FUNC);
-  obj->header.reference ();
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return obj;
+  obj->header.ref_count.inc ();
   return obj;
 }
 template <typename Type>
 static inline bool hb_object_destroy (Type *obj)
 {
   hb_object_trace (obj, HB_FUNC);
   return obj;
 }
 template <typename Type>
 static inline bool hb_object_destroy (Type *obj)
 {
   hb_object_trace (obj, HB_FUNC);
-  return obj->header.destroy ();
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return false;
+  if (obj->header.ref_count.dec () != 1)
+    return false;
+
+  obj->header.ref_count.finish (); /* Do this before user_data */
+  obj->header.user_data.finish ();
+  return true;
 }
 template <typename Type>
 static inline bool hb_object_set_user_data (Type               *obj,
 }
 template <typename Type>
 static inline bool hb_object_set_user_data (Type               *obj,
@@ -213,14 +172,18 @@ static inline bool hb_object_set_user_data (Type               *obj,
                                            hb_destroy_func_t   destroy,
                                            hb_bool_t           replace)
 {
                                            hb_destroy_func_t   destroy,
                                            hb_bool_t           replace)
 {
-  return obj->header.set_user_data (key, data, destroy, replace);
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return false;
+  return obj->header.user_data.set (key, data, destroy, replace);
 }
 
 template <typename Type>
 static inline void *hb_object_get_user_data (Type               *obj,
                                             hb_user_data_key_t *key)
 {
 }
 
 template <typename Type>
 static inline void *hb_object_get_user_data (Type               *obj,
                                             hb_user_data_key_t *key)
 {
-  return obj->header.get_user_data (key);
+  if (unlikely (!obj || hb_object_is_inert (obj)))
+    return NULL;
+  return obj->header.user_data.get (key);
 }
 
 
 }
 
 
index 57db59d..178bc7c 100644 (file)
@@ -53,7 +53,8 @@ struct TTCHeader;
 
 typedef struct TableRecord
 {
 
 typedef struct TableRecord
 {
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -102,7 +103,8 @@ typedef struct OffsetTable
   }
 
   public:
   }
 
   public:
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && c->check_array (tables, TableRecord::static_size, numTables));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && c->check_array (tables, TableRecord::static_size, numTables));
   }
@@ -130,7 +132,8 @@ struct TTCHeaderVersion1
   inline unsigned int get_face_count (void) const { return table.len; }
   inline const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
 
   inline unsigned int get_face_count (void) const { return table.len; }
   inline const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (table.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (table.sanitize (c, this));
   }
@@ -169,7 +172,8 @@ struct TTCHeader
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!u.header.version.sanitize (c))) return TRACE_RETURN (false);
     switch (u.header.version.major) {
     TRACE_SANITIZE (this);
     if (unlikely (!u.header.version.sanitize (c))) return TRACE_RETURN (false);
     switch (u.header.version.major) {
@@ -197,6 +201,8 @@ struct TTCHeader
 
 struct OpenTypeFontFile
 {
 
 struct OpenTypeFontFile
 {
+  static const hb_tag_t tableTag       = HB_TAG ('_','_','_','_'); /* Sanitizer needs this. */
+
   static const hb_tag_t CFFTag         = HB_TAG ('O','T','T','O'); /* OpenType with Postscript outlines */
   static const hb_tag_t TrueTypeTag    = HB_TAG ( 0 , 1 , 0 , 0 ); /* OpenType with TrueType outlines */
   static const hb_tag_t TTCTag         = HB_TAG ('t','t','c','f'); /* TrueType Collection */
   static const hb_tag_t CFFTag         = HB_TAG ('O','T','T','O'); /* OpenType with Postscript outlines */
   static const hb_tag_t TrueTypeTag    = HB_TAG ( 0 , 1 , 0 , 0 ); /* OpenType with TrueType outlines */
   static const hb_tag_t TTCTag         = HB_TAG ('t','t','c','f'); /* TrueType Collection */
@@ -231,7 +237,8 @@ struct OpenTypeFontFile
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!u.tag.sanitize (c))) return TRACE_RETURN (false);
     switch (u.tag) {
     TRACE_SANITIZE (this);
     if (unlikely (!u.tag.sanitize (c))) return TRACE_RETURN (false);
     switch (u.tag) {
index 475187b..75a0f56 100644 (file)
@@ -179,10 +179,13 @@ struct hb_sanitize_context_t
   inline const char *get_name (void) { return "SANITIZE"; }
   static const unsigned int max_debug_depth = HB_DEBUG_SANITIZE;
   typedef bool return_t;
   inline const char *get_name (void) { return "SANITIZE"; }
   static const unsigned int max_debug_depth = HB_DEBUG_SANITIZE;
   typedef bool return_t;
+  template <typename T, typename F>
+  inline bool may_dispatch (const T *obj, const F *format)
+  { return format->sanitize (this); }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.sanitize (this); }
   static return_t default_return_value (void) { return true; }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.sanitize (this); }
   static return_t default_return_value (void) { return true; }
-  bool stop_sublookup_iteration (const return_t r HB_UNUSED) const { return false; }
+  bool stop_sublookup_iteration (const return_t r) const { return !r; }
 
   inline void init (hb_blob_t *b)
   {
 
   inline void init (hb_blob_t *b)
   {
@@ -194,10 +197,11 @@ struct hb_sanitize_context_t
   {
     this->start = hb_blob_get_data (this->blob, NULL);
     this->end = this->start + hb_blob_get_length (this->blob);
   {
     this->start = hb_blob_get_data (this->blob, NULL);
     this->end = this->start + hb_blob_get_length (this->blob);
+    assert (this->start <= this->end); /* Must not overflow. */
     this->edit_count = 0;
     this->debug_depth = 0;
 
     this->edit_count = 0;
     this->debug_depth = 0;
 
-    DEBUG_MSG_LEVEL (SANITIZE, this->blob, 0, +1,
+    DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1,
                     "start [%p..%p] (%lu bytes)",
                     this->start, this->end,
                     (unsigned long) (this->end - this->start));
                     "start [%p..%p] (%lu bytes)",
                     this->start, this->end,
                     (unsigned long) (this->end - this->start));
@@ -205,7 +209,7 @@ struct hb_sanitize_context_t
 
   inline void end_processing (void)
   {
 
   inline void end_processing (void)
   {
-    DEBUG_MSG_LEVEL (SANITIZE, this->blob, 0, -1,
+    DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1,
                     "end [%p..%p] %u edit requests",
                     this->start, this->end, this->edit_count);
 
                     "end [%p..%p] %u edit requests",
                     this->start, this->end, this->edit_count);
 
@@ -217,28 +221,31 @@ struct hb_sanitize_context_t
   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;
 
 
-    hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
-      (&this->debug_depth, "SANITIZE", this->blob, NULL,
-       "check_range [%p..%p] (%d bytes) in [%p..%p]",
+    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+       "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s",
        p, p + len, len,
        p, p + len, len,
-       this->start, this->end);
+       this->start, this->end,
+       ok ? "OK" : "OUT-OF-RANGE");
 
 
-    return TRACE_RETURN (likely (this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len));
+    return likely (ok);
   }
 
   inline bool check_array (const void *base, unsigned int record_size, unsigned int len) const
   {
     const char *p = (const char *) base;
     bool overflows = _hb_unsigned_int_mul_overflows (len, record_size);
   }
 
   inline bool check_array (const void *base, unsigned int record_size, unsigned int len) const
   {
     const char *p = (const char *) base;
     bool overflows = _hb_unsigned_int_mul_overflows (len, record_size);
+    unsigned int array_size = record_size * len;
+    bool ok = !overflows && this->check_range (base, array_size);
 
 
-    hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
-      (&this->debug_depth, "SANITIZE", this->blob, NULL,
-       "check_array [%p..%p] (%d*%d=%ld bytes) in [%p..%p]",
-       p, p + (record_size * len), record_size, len, (unsigned long) record_size * len,
-       this->start, this->end);
+    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
+       "check_array [%p..%p] (%d*%d=%d bytes) in [%p..%p] -> %s",
+       p, p + (record_size * len), record_size, len, (unsigned int) array_size,
+       this->start, this->end,
+       overflows ? "OVERFLOWS" : ok ? "OK" : "OUT-OF-RANGE");
 
 
-    return TRACE_RETURN (likely (!overflows && this->check_range (base, record_size * len)));
+    return likely (ok);
   }
 
   template <typename Type>
   }
 
   template <typename Type>
@@ -255,21 +262,20 @@ struct hb_sanitize_context_t
     const char *p = (const char *) base;
     this->edit_count++;
 
     const char *p = (const char *) base;
     this->edit_count++;
 
-    hb_auto_trace_t<HB_DEBUG_SANITIZE, bool> trace
-      (&this->debug_depth, "SANITIZE", this->blob, NULL,
+    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
        "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
        this->edit_count,
        p, p + len, len,
        this->start, this->end,
        this->writable ? "GRANTED" : "DENIED");
 
        "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s",
        this->edit_count,
        p, p + len, len,
        this->start, this->end,
        this->writable ? "GRANTED" : "DENIED");
 
-    return TRACE_RETURN (this->writable);
+    return this->writable;
   }
 
   template <typename Type, typename ValueType>
   }
 
   template <typename Type, typename ValueType>
-  inline bool try_set (Type *obj, const ValueType &v) {
+  inline bool try_set (const Type *obj, const ValueType &v) {
     if (this->may_edit (obj, obj->static_size)) {
     if (this->may_edit (obj, obj->static_size)) {
-      obj->set (v);
+      const_cast<Type *> (obj)->set (v);
       return true;
     }
     return false;
       return true;
     }
     return false;
@@ -297,7 +303,7 @@ struct Sanitizer
     c->init (blob);
 
   retry:
     c->init (blob);
 
   retry:
-    DEBUG_MSG_FUNC (SANITIZE, blob, "start");
+    DEBUG_MSG_FUNC (SANITIZE, c->start, "start");
 
     c->start_processing ();
 
 
     c->start_processing ();
 
@@ -311,13 +317,13 @@ struct Sanitizer
     sane = t->sanitize (c);
     if (sane) {
       if (c->edit_count) {
     sane = t->sanitize (c);
     if (sane) {
       if (c->edit_count) {
-       DEBUG_MSG_FUNC (SANITIZE, blob, "passed first round with %d edits; going for second round", c->edit_count);
+       DEBUG_MSG_FUNC (SANITIZE, c->start, "passed first round with %d edits; going for second round", c->edit_count);
 
         /* sanitize again to ensure no toe-stepping */
         c->edit_count = 0;
        sane = t->sanitize (c);
        if (c->edit_count) {
 
         /* sanitize again to ensure no toe-stepping */
         c->edit_count = 0;
        sane = t->sanitize (c);
        if (c->edit_count) {
-         DEBUG_MSG_FUNC (SANITIZE, blob, "requested %d edits in second round; FAILLING", c->edit_count);
+         DEBUG_MSG_FUNC (SANITIZE, c->start, "requested %d edits in second round; FAILLING", c->edit_count);
          sane = false;
        }
       }
          sane = false;
        }
       }
@@ -330,7 +336,7 @@ struct Sanitizer
        if (c->start) {
          c->writable = true;
          /* ok, we made it writable by relocating.  try again */
        if (c->start) {
          c->writable = true;
          /* ok, we made it writable by relocating.  try again */
-         DEBUG_MSG_FUNC (SANITIZE, blob, "retry");
+         DEBUG_MSG_FUNC (SANITIZE, c->start, "retry");
          goto retry;
        }
       }
          goto retry;
        }
       }
@@ -338,7 +344,7 @@ struct Sanitizer
 
     c->end_processing ();
 
 
     c->end_processing ();
 
-    DEBUG_MSG_FUNC (SANITIZE, blob, sane ? "PASSED" : "FAILED");
+    DEBUG_MSG_FUNC (SANITIZE, c->start, sane ? "PASSED" : "FAILED");
     if (sane)
       return blob;
     else {
     if (sane)
       return blob;
     else {
@@ -533,31 +539,55 @@ template <typename Type>
 struct BEInt<Type, 2>
 {
   public:
 struct BEInt<Type, 2>
 {
   public:
-  inline void set (Type i) { hb_be_uint16_put (v,i); }
-  inline operator Type (void) const { return hb_be_uint16_get (v); }
-  inline bool operator == (const BEInt<Type, 2>& o) const { return hb_be_uint16_eq (v, o.v); }
-  inline bool operator != (const BEInt<Type, 2>& o) const { return !(*this == o); }
+  inline void set (Type V)
+  {
+    v[0] = (V >>  8) & 0xFF;
+    v[1] = (V      ) & 0xFF;
+  }
+  inline operator Type (void) const
+  {
+    return (v[0] <<  8)
+         + (v[1]      );
+  }
   private: uint8_t v[2];
 };
 template <typename Type>
   private: uint8_t v[2];
 };
 template <typename Type>
-struct BEInt<Type, 4>
+struct BEInt<Type, 3>
 {
   public:
 {
   public:
-  inline void set (Type i) { hb_be_uint32_put (v,i); }
-  inline operator Type (void) const { return hb_be_uint32_get (v); }
-  inline bool operator == (const BEInt<Type, 4>& o) const { return hb_be_uint32_eq (v, o.v); }
-  inline bool operator != (const BEInt<Type, 4>& o) const { return !(*this == o); }
-  private: uint8_t v[4];
+  inline void set (Type V)
+  {
+    v[0] = (V >> 16) & 0xFF;
+    v[1] = (V >>  8) & 0xFF;
+    v[2] = (V      ) & 0xFF;
+  }
+  inline operator Type (void) const
+  {
+    return (v[0] << 16)
+         + (v[1] <<  8)
+         + (v[2]      );
+  }
+  private: uint8_t v[3];
 };
 template <typename Type>
 };
 template <typename Type>
-struct BEInt<Type, 3>
+struct BEInt<Type, 4>
 {
   public:
 {
   public:
-  inline void set (Type i) { hb_be_uint24_put (v,i); }
-  inline operator Type (void) const { return hb_be_uint24_get (v); }
-  inline bool operator == (const BEInt<Type, 3>& o) const { return hb_be_uint24_eq (v, o.v); }
-  inline bool operator != (const BEInt<Type, 3>& o) const { return !(*this == o); }
-  private: uint8_t v[3];
+  inline void set (Type V)
+  {
+    v[0] = (V >> 24) & 0xFF;
+    v[1] = (V >> 16) & 0xFF;
+    v[2] = (V >>  8) & 0xFF;
+    v[3] = (V      ) & 0xFF;
+  }
+  inline operator Type (void) const
+  {
+    return (v[0] << 24)
+         + (v[1] << 16)
+         + (v[2] <<  8)
+         + (v[3]      );
+  }
+  private: uint8_t v[4];
 };
 
 /* Integer types in big-endian order and no alignment requirement */
 };
 
 /* Integer types in big-endian order and no alignment requirement */
@@ -566,12 +596,19 @@ struct IntType
 {
   inline void set (Type i) { v.set (i); }
   inline operator Type(void) const { return v; }
 {
   inline void set (Type i) { v.set (i); }
   inline operator Type(void) const { return v; }
-  inline bool operator == (const IntType<Type,Size> &o) const { return v == o.v; }
-  inline bool operator != (const IntType<Type,Size> &o) const { return v != o.v; }
+  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); }
   static inline int cmp (const IntType<Type,Size> *a, const IntType<Type,Size> *b) { return b->cmp (*a); }
-  inline int cmp (IntType<Type,Size> va) const { Type a = va; Type b = v; return a < b ? -1 : a == b ? 0 : +1; }
-  inline int cmp (Type a) const { Type b = v; return a < b ? -1 : a == b ? 0 : +1; }
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline int cmp (Type a) const
+  {
+    Type b = v;
+    if (sizeof (Type) < sizeof (int))
+      return (int) a - (int) b;
+    else
+      return a < b ? -1 : a == b ? 0 : +1;
+  }
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (likely (c->check_struct (this)));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (likely (c->check_struct (this)));
   }
@@ -598,7 +635,8 @@ typedef USHORT UFWORD;
  * 1904. The value is represented as a signed 64-bit integer. */
 struct LONGDATETIME
 {
  * 1904. The value is represented as a signed 64-bit integer. */
 struct LONGDATETIME
 {
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (likely (c->check_struct (this)));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (likely (c->check_struct (this)));
   }
@@ -622,7 +660,10 @@ 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) */
-typedef USHORT GlyphID;
+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; }
+};
 
 /* Script/language-system/feature index */
 struct Index : USHORT {
 
 /* Script/language-system/feature index */
 struct Index : USHORT {
@@ -671,7 +712,8 @@ struct FixedVersion
 {
   inline uint32_t to_int (void) const { return (major << 16) + minor; }
 
 {
   inline uint32_t to_int (void) const { return (major << 16) + minor; }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -699,33 +741,35 @@ struct OffsetTo : Offset<OffsetType>
     return StructAtOffset<Type> (base, offset);
   }
 
     return StructAtOffset<Type> (base, offset);
   }
 
-  inline Type& serialize (hb_serialize_context_t *c, 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;
   }
 
   {
     Type *t = c->start_embed<Type> ();
     this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */
     return *t;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
     unsigned int offset = *this;
     if (unlikely (!offset)) return TRACE_RETURN (true);
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
     unsigned int offset = *this;
     if (unlikely (!offset)) return TRACE_RETURN (true);
-    Type &obj = StructAtOffset<Type> (base, offset);
+    const Type &obj = StructAtOffset<Type> (base, offset);
     return TRACE_RETURN (likely (obj.sanitize (c)) || neuter (c));
   }
   template <typename T>
     return TRACE_RETURN (likely (obj.sanitize (c)) || neuter (c));
   }
   template <typename T>
-  inline bool sanitize (hb_sanitize_context_t *c, void *base, T user_data) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
     unsigned int offset = *this;
     if (unlikely (!offset)) return TRACE_RETURN (true);
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
     unsigned int offset = *this;
     if (unlikely (!offset)) return TRACE_RETURN (true);
-    Type &obj = StructAtOffset<Type> (base, offset);
+    const Type &obj = StructAtOffset<Type> (base, offset);
     return TRACE_RETURN (likely (obj.sanitize (c, user_data)) || neuter (c));
   }
 
   /* Set the offset to Null */
     return TRACE_RETURN (likely (obj.sanitize (c, user_data)) || neuter (c));
   }
 
   /* Set the offset to Null */
-  inline bool neuter (hb_sanitize_context_t *c) {
+  inline bool neuter (hb_sanitize_context_t *c) const {
     return c->try_set (this, 0);
   }
   DEFINE_SIZE_STATIC (sizeof(OffsetType));
     return c->try_set (this, 0);
   }
   DEFINE_SIZE_STATIC (sizeof(OffsetType));
@@ -790,7 +834,8 @@ struct ArrayOf
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
 
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
 
@@ -805,7 +850,8 @@ struct ArrayOf
 
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
     unsigned int count = len;
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
     unsigned int count = len;
@@ -815,7 +861,8 @@ struct ArrayOf
     return TRACE_RETURN (true);
   }
   template <typename T>
     return TRACE_RETURN (true);
   }
   template <typename T>
-  inline bool sanitize (hb_sanitize_context_t *c, void *base, T user_data) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
     unsigned int count = len;
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
     unsigned int count = len;
@@ -836,7 +883,8 @@ struct ArrayOf
   }
 
   private:
   }
 
   private:
-  inline bool sanitize_shallow (hb_sanitize_context_t *c) {
+  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && c->check_array (this, Type::static_size, len));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && c->check_array (this, Type::static_size, len));
   }
@@ -862,12 +910,14 @@ struct OffsetListOf : OffsetArrayOf<Type>
     return this+this->array[i];
   }
 
     return this+this->array[i];
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this));
   }
   template <typename T>
     TRACE_SANITIZE (this);
     return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this));
   }
   template <typename T>
-  inline bool sanitize (hb_sanitize_context_t *c, T user_data) {
+  inline bool sanitize (hb_sanitize_context_t *c, T user_data) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this, user_data));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (OffsetArrayOf<Type>::sanitize (c, this, user_data));
   }
@@ -901,12 +951,14 @@ struct HeadlessArrayOf
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize_shallow (hb_sanitize_context_t *c) {
+  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
     return c->check_struct (this)
        && c->check_array (this, Type::static_size, len);
   }
 
     return c->check_struct (this)
        && c->check_array (this, Type::static_size, len);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
 
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return TRACE_RETURN (false);
 
index d531411..0482312 100644 (file)
@@ -51,7 +51,8 @@ struct CmapSubtableFormat0
     return true;
   }
 
     return true;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -125,7 +126,7 @@ struct CmapSubtableFormat4
     return true;
   }
 
     return true;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c)
+  inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
   {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this)))
@@ -183,7 +184,8 @@ struct CmapSubtableLongGroup
     return 0;
   }
 
     return 0;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -210,7 +212,8 @@ struct CmapSubtableTrimmed
     return true;
   }
 
     return true;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && glyphIdArray.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && glyphIdArray.sanitize (c));
   }
@@ -242,7 +245,8 @@ struct CmapSubtableLongSegmented
     return true;
   }
 
     return true;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && groups.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && groups.sanitize (c));
   }
@@ -288,7 +292,8 @@ struct UnicodeValueRange
     return 0;
   }
 
     return 0;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -309,7 +314,8 @@ struct UVSMapping
     return unicodeValue.cmp (codepoint);
   }
 
     return unicodeValue.cmp (codepoint);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -348,7 +354,8 @@ struct VariationSelectorRecord
     return varSelector.cmp (variation_selector);
   }
 
     return varSelector.cmp (variation_selector);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         defaultUVS.sanitize (c, base) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         defaultUVS.sanitize (c, base) &&
@@ -373,7 +380,8 @@ struct CmapSubtableFormat14
     return record[record.bsearch(variation_selector)].get_glyph (codepoint, glyph, this);
   }
 
     return record[record.bsearch(variation_selector)].get_glyph (codepoint, glyph, this);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         record.sanitize (c, this));
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         record.sanitize (c, this));
@@ -418,7 +426,8 @@ struct CmapSubtable
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
@@ -461,7 +470,8 @@ struct EncodingRecord
     return 0;
   }
 
     return 0;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         subtable.sanitize (c, base));
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         subtable.sanitize (c, base));
@@ -496,7 +506,8 @@ struct cmap
     return &(this+encodingRecord[result].subtable);
   }
 
     return &(this+encodingRecord[result].subtable);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         likely (version == 0) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         likely (version == 0) &&
index c9890c5..2af2f54 100644 (file)
 #include "hb-ot-hmtx-table.hh"
 
 
 #include "hb-ot-hmtx-table.hh"
 
 
+struct hb_ot_face_metrics_accelerator_t
+{
+  unsigned int num_metrics;
+  unsigned int num_advances;
+  unsigned int default_advance;
+  const OT::_mtx *table;
+  hb_blob_t *blob;
+
+  inline void init (hb_face_t *face,
+                   hb_tag_t _hea_tag, hb_tag_t _mtx_tag,
+                   unsigned int default_advance)
+  {
+    this->default_advance = default_advance;
+    this->num_metrics = face->get_num_glyphs ();
+
+    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;
+    hb_blob_destroy (_hea_blob);
+
+    this->blob = OT::Sanitizer<OT::_mtx>::sanitize (face->reference_table (_mtx_tag));
+    if (unlikely (!this->num_advances ||
+                 2 * (this->num_advances + this->num_metrics) < hb_blob_get_length (this->blob)))
+    {
+      this->num_metrics = this->num_advances = 0;
+      hb_blob_destroy (this->blob);
+      this->blob = hb_blob_get_empty ();
+    }
+    this->table = OT::Sanitizer<OT::_mtx>::lock_instance (this->blob);
+  }
+
+  inline void fini (void)
+  {
+    hb_blob_destroy (this->blob);
+  }
+
+  inline unsigned int get_advance (hb_codepoint_t glyph) 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 one EM.  Otherwise, it means that the glyph
+       * index is out of bound: return zero. */
+      if (this->num_metrics)
+       return 0;
+      else
+       return this->default_advance;
+    }
+
+    if (glyph >= this->num_advances)
+      glyph = this->num_advances - 1;
+
+    return this->table->longMetric[glyph].advance;
+  }
+};
+
+struct hb_ot_face_cmap_accelerator_t
+{
+  const OT::CmapSubtable *table;
+  const OT::CmapSubtable *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::CmapSubtable *subtable_uvs = NULL;
+
+    /* 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);
+    /* Meh. */
+    if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
+
+    /* UVS subtable. */
+    if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5);
+    /* Meh. */
+    if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable);
+
+    this->table = subtable;
+    this->uvs_table = subtable_uvs;
+  }
+
+  inline void fini (void)
+  {
+    hb_blob_destroy (this->blob);
+  }
+
+  inline bool get_glyph (hb_codepoint_t  unicode,
+                        hb_codepoint_t  variation_selector,
+                        hb_codepoint_t *glyph) const
+  {
+    if (unlikely (variation_selector))
+    {
+      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 this->table->get_glyph (unicode, glyph);
+  }
+};
+
 
 struct hb_ot_font_t
 {
 
 struct hb_ot_font_t
 {
-  unsigned int num_glyphs;
-  unsigned int num_hmetrics;
-  const OT::hmtx *hmtx;
-  hb_blob_t *hmtx_blob;
-
-  const OT::CmapSubtable *cmap;
-  const OT::CmapSubtable *cmap_uvs;
-  hb_blob_t *cmap_blob;
+  hb_ot_face_cmap_accelerator_t cmap;
+  hb_ot_face_metrics_accelerator_t h_metrics;
+  hb_ot_face_metrics_accelerator_t v_metrics;
 };
 
 
 };
 
 
@@ -53,50 +164,16 @@ static hb_ot_font_t *
 _hb_ot_font_create (hb_font_t *font)
 {
   hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t));
 _hb_ot_font_create (hb_font_t *font)
 {
   hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t));
+  hb_face_t *face = font->face;
 
   if (unlikely (!ot_font))
     return NULL;
 
 
   if (unlikely (!ot_font))
     return NULL;
 
-  ot_font->num_glyphs = font->face->get_num_glyphs ();
+  unsigned int upem = face->get_upem ();
 
 
-  {
-    hb_blob_t *hhea_blob = OT::Sanitizer<OT::hhea>::sanitize (font->face->reference_table (HB_OT_TAG_hhea));
-    const OT::hhea *hhea = OT::Sanitizer<OT::hhea>::lock_instance (hhea_blob);
-    ot_font->num_hmetrics = hhea->numberOfHMetrics;
-    hb_blob_destroy (hhea_blob);
-  }
-  ot_font->hmtx_blob = OT::Sanitizer<OT::hmtx>::sanitize (font->face->reference_table (HB_OT_TAG_hmtx));
-  if (unlikely (!ot_font->num_hmetrics ||
-               2 * (ot_font->num_hmetrics + ot_font->num_glyphs) < hb_blob_get_length (ot_font->hmtx_blob)))
-  {
-    hb_blob_destroy (ot_font->hmtx_blob);
-    free (ot_font);
-    return NULL;
-  }
-  ot_font->hmtx = OT::Sanitizer<OT::hmtx>::lock_instance (ot_font->hmtx_blob);
-
-  ot_font->cmap_blob = OT::Sanitizer<OT::cmap>::sanitize (font->face->reference_table (HB_OT_TAG_cmap));
-  const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (ot_font->cmap_blob);
-  const OT::CmapSubtable *subtable = NULL;
-  const OT::CmapSubtable *subtable_uvs = NULL;
-
-  /* 32-bit subtables. */
-  if (!subtable) subtable = cmap->find_subtable (0, 6);
-  if (!subtable) subtable = cmap->find_subtable (0, 4);
-  if (!subtable) subtable = cmap->find_subtable (3, 10);
-  /* 16-bit subtables. */
-  if (!subtable) subtable = cmap->find_subtable (0, 3);
-  if (!subtable) subtable = cmap->find_subtable (3, 1);
-  /* Meh. */
-  if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
-
-  /* UVS subtable. */
-  if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5);
-  /* Meh. */
-  if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable);
-
-  ot_font->cmap = subtable;
-  ot_font->cmap_uvs = subtable_uvs;
+  ot_font->cmap.init (face);
+  ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, upem>>1);
+  ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, upem); /* TODO Can we do this lazily? */
 
   return ot_font;
 }
 
   return ot_font;
 }
@@ -104,8 +181,9 @@ _hb_ot_font_create (hb_font_t *font)
 static void
 _hb_ot_font_destroy (hb_ot_font_t *ot_font)
 {
 static void
 _hb_ot_font_destroy (hb_ot_font_t *ot_font)
 {
-  hb_blob_destroy (ot_font->cmap_blob);
-  hb_blob_destroy (ot_font->hmtx_blob);
+  ot_font->cmap.fini ();
+  ot_font->h_metrics.fini ();
+  ot_font->v_metrics.fini ();
 
   free (ot_font);
 }
 
   free (ot_font);
 }
@@ -121,20 +199,7 @@ hb_ot_get_glyph (hb_font_t *font HB_UNUSED,
 
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
 
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
-
-  if (unlikely (variation_selector))
-  {
-    switch (ot_font->cmap_uvs->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 ot_font->cmap->get_glyph (unicode, glyph);
+  return ot_font->cmap.get_glyph (unicode, variation_selector, glyph);
 }
 
 static hb_position_t
 }
 
 static hb_position_t
@@ -144,14 +209,7 @@ hb_ot_get_glyph_h_advance (hb_font_t *font HB_UNUSED,
                           void *user_data HB_UNUSED)
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
                           void *user_data HB_UNUSED)
 {
   const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
-
-  if (unlikely (glyph >= ot_font->num_glyphs))
-    return 0; /* Maybe better to return notdef's advance instead? */
-
-  if (glyph >= ot_font->num_hmetrics)
-    glyph = ot_font->num_hmetrics - 1;
-
-  return font->em_scale_x (ot_font->hmtx->longHorMetric[glyph].advanceWidth);
+  return font->em_scale_x (ot_font->h_metrics.get_advance (glyph));
 }
 
 static hb_position_t
 }
 
 static hb_position_t
@@ -160,8 +218,8 @@ hb_ot_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
                           hb_codepoint_t glyph,
                           void *user_data HB_UNUSED)
 {
                           hb_codepoint_t glyph,
                           void *user_data HB_UNUSED)
 {
-  /* TODO */
-  return 0;
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+  return font->em_scale_y (-ot_font->v_metrics.get_advance (glyph));
 }
 
 static hb_bool_t
 }
 
 static hb_bool_t
@@ -206,6 +264,7 @@ hb_ot_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
                           hb_codepoint_t bottom_glyph HB_UNUSED,
                           void *user_data HB_UNUSED)
 {
                           hb_codepoint_t bottom_glyph HB_UNUSED,
                           void *user_data HB_UNUSED)
 {
+  /* OpenType doesn't have vertical-kerning other than GPOS. */
   return 0;
 }
 
   return 0;
 }
 
index ec4e8c9..268f133 100644 (file)
@@ -45,13 +45,15 @@ struct head
 {
   static const hb_tag_t tableTag       = HB_OT_TAG_head;
 
 {
   static const hb_tag_t tableTag       = HB_OT_TAG_head;
 
-  inline unsigned int get_upem (void) const {
+  inline unsigned int get_upem (void) const
+  {
     unsigned int upem = unitsPerEm;
     /* If no valid head table found, assume 1000, which matches typical Type1 usage. */
     return 16 <= upem && upem <= 16384 ? upem : 1000;
   }
 
     unsigned int upem = unitsPerEm;
     /* If no valid head table found, assume 1000, which matches typical Type1 usage. */
     return 16 <= upem && upem <= 16384 ? upem : 1000;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
   }
index d433200..992fe55 100644 (file)
@@ -35,61 +35,67 @@ namespace OT {
 
 /*
  * hhea -- The Horizontal Header Table
 
 /*
  * hhea -- The Horizontal Header Table
+ * vhea -- The Vertical Header Table
  */
 
 #define HB_OT_TAG_hhea HB_TAG('h','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')
 
 
 
 
-struct hhea
+struct _hea
 {
 {
-  static const hb_tag_t tableTag       = HB_OT_TAG_hhea;
+  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) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
   }
 
   public:
   FixedVersion version;                /* 0x00010000u for version 1.0. */
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && likely (version.major == 1));
   }
 
   public:
   FixedVersion version;                /* 0x00010000u for version 1.0. */
-  FWORD                ascender;               /* Typographic ascent. <a
-                                        * href="http://developer.apple.com/fonts/TTRefMan/RM06/Chap6hhea.html">
-                                        * (Distance from baseline of highest
-                                        * ascender)</a> */
-  FWORD                descender;              /* Typographic descent. <a
-                                        * href="http://developer.apple.com/fonts/TTRefMan/RM06/Chap6hhea.html">
-                                        * (Distance from baseline of lowest
-                                        * descender)</a> */
-  FWORD                lineGap;                /* Typographic line gap. Negative
-                                        * LineGap values are treated as zero
-                                        * in Windows 3.1, System 6, and
-                                        * System 7. */
-  UFWORD       advanceWidthMax;        /* Maximum advance width value in
-                                        * 'hmtx' table. */
-  FWORD                minLeftSideBearing;     /* Minimum left sidebearing value in
-                                        * 'hmtx' table. */
-  FWORD                minRightSideBearing;    /* Minimum right sidebearing value;
+  FWORD                ascender;               /* Typographic ascent. */
+  FWORD                descender;              /* Typographic descent. */
+  FWORD                lineGap;                /* Typographic line gap. */
+  UFWORD       advanceMax;             /* Maximum advance width/height value in
+                                        * metrics table. */
+  FWORD                minLeadingBearing;      /* Minimum left/top sidebearing value in
+                                        * metrics table. */
+  FWORD                minTrailingBearing;     /* Minimum right/bottom sidebearing value;
                                         * calculated as Min(aw - lsb -
                                         * calculated as Min(aw - lsb -
-                                        * (xMax - xMin)). */
-  FWORD                xMaxExtent;             /* Max(lsb + (xMax - xMin)). */
+                                        * (xMax - xMin)) for horizontal. */
+  FWORD                maxExtent;              /* horizontal: Max(lsb + (xMax - xMin)),
+                                        * vertical: minLeadingBearing+(yMax-yMin). */
   SHORT                caretSlopeRise;         /* Used to calculate the slope of the
   SHORT                caretSlopeRise;         /* Used to calculate the slope of the
-                                        * cursor (rise/run); 1 for vertical. */
-  SHORT                caretSlopeRun;          /* 0 for vertical. */
+                                        * 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
                                         * highlight on a glyph needs
                                         * to be shifted to produce the
                                         * best appearance. Set to 0 for
   SHORT                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 */
-  SHORT                reserved1;              /* set to 0 */
-  SHORT                reserved2;              /* set to 0 */
-  SHORT                reserved3;              /* set to 0 */
-  SHORT                reserved4;              /* set to 0 */
+                                        * 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. */
   SHORT                metricDataFormat;       /* 0 for current format. */
-  USHORT       numberOfHMetrics;       /* Number of hMetric entries in 'hmtx'
-                                        * table */
+  USHORT       numberOfLongMetrics;    /* Number of LongMetric entries in metric
+                                        * table. */
   public:
   DEFINE_SIZE_STATIC (36);
 };
 
   public:
   DEFINE_SIZE_STATIC (36);
 };
 
+struct hhea : _hea {
+  static const hb_tag_t tableTag       = HB_OT_TAG_hhea;
+};
+struct vhea : _hea {
+  static const hb_tag_t tableTag       = HB_OT_TAG_vhea;
+};
+
 
 } /* namespace OT */
 
 
 } /* namespace OT */
 
index e918e3b..a0e3855 100644 (file)
@@ -35,24 +35,30 @@ namespace OT {
 
 /*
  * hmtx -- The Horizontal Metrics Table
 
 /*
  * hmtx -- The Horizontal Metrics Table
+ * vmtx -- The Vertical Metrics Table
  */
 
 #define HB_OT_TAG_hmtx HB_TAG('h','m','t','x')
  */
 
 #define HB_OT_TAG_hmtx HB_TAG('h','m','t','x')
+#define HB_OT_TAG_vmtx HB_TAG('v','m','t','x')
 
 
 
 
-struct LongHorMetric
+struct LongMetric
 {
 {
-  USHORT       advanceWidth;
-  SHORT                lsb;
+  USHORT       advance; /* Advance width/height. */
+  SHORT                lsb; /* Leading (left/top) side bearing. */
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
   public:
   DEFINE_SIZE_STATIC (4);
 };
 
-struct hmtx
+struct _mtx
 {
 {
-  static const hb_tag_t tableTag       = HB_OT_TAG_hmtx;
+  static const hb_tag_t tableTag = HB_TAG('_','m','t','x');
+
+  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) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     /* We don't check for anything specific here.  The users of the
      * struct do all the hard work... */
     TRACE_SANITIZE (this);
     /* We don't check for anything specific here.  The users of the
      * struct do all the hard work... */
@@ -60,7 +66,7 @@ struct hmtx
   }
 
   public:
   }
 
   public:
-  LongHorMetric        longHorMetric[VAR];     /* Paired advance width and left side
+  LongMetric   longMetric[VAR];        /* Paired advance width and leading
                                         * bearing values for each glyph. The
                                         * value numOfHMetrics comes from
                                         * the 'hhea' table. If the font is
                                         * bearing values for each glyph. The
                                         * value numOfHMetrics comes from
                                         * the 'hhea' table. If the font is
@@ -68,23 +74,29 @@ struct hmtx
                                         * 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. */
-  SHORT                leftSideBearingX[VAR];  /* Here the advanceWidth is assumed
-                                        * to be the same as the advanceWidth
+  SHORT                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
                                         * derived from numGlyphs (from 'maxp'
                                         * for the last entry above. The
                                         * number of entries in this array is
                                         * derived from numGlyphs (from 'maxp'
-                                        * table) minus numberOfHMetrics. This
-                                        * generally is used with a run of
-                                        * monospaced glyphs (e.g., Kanji
+                                        * table) minus numberOfLongMetrics.
+                                        * This generally is used with a run
+                                        * of monospaced glyphs (e.g., Kanji
                                         * fonts or Courier fonts). Only one
                                         * run is allowed and it must be at
                                         * the end. This allows a monospaced
                                         * fonts or Courier fonts). Only one
                                         * run is allowed and it must be at
                                         * the end. This allows a monospaced
-                                        * font to vary the left side bearing
+                                        * font to vary the side bearing
                                         * values for each glyph. */
   public:
                                         * values for each glyph. */
   public:
-  DEFINE_SIZE_ARRAY2 (0, longHorMetric, leftSideBearingX);
+  DEFINE_SIZE_ARRAY2 (0, longMetric, leadingBearingX);
 };
 
 };
 
+struct hmtx : _mtx {
+  static const hb_tag_t tableTag       = HB_OT_TAG_hmtx;
+};
+struct vmtx : _mtx {
+  static const hb_tag_t tableTag       = HB_OT_TAG_vmtx;
+};
 
 } /* namespace OT */
 
 
 } /* namespace OT */
 
index abd063c..3db7f57 100644 (file)
 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 MAX_NESTING_LEVEL      8
 #define MAX_CONTEXT_LENGTH     64
 #define NOT_COVERED            ((unsigned int) -1)
 #define MAX_NESTING_LEVEL      8
 #define MAX_CONTEXT_LENGTH     64
@@ -63,9 +69,10 @@ struct Record
 
   struct sanitize_closure_t {
     hb_tag_t tag;
 
   struct sanitize_closure_t {
     hb_tag_t tag;
-    void *list_base;
+    const void *list_base;
   };
   };
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     const sanitize_closure_t closure = {tag, base};
     return TRACE_RETURN (c->check_struct (this) && offset.sanitize (c, base, &closure));
     TRACE_SANITIZE (this);
     const sanitize_closure_t closure = {tag, base};
     return TRACE_RETURN (c->check_struct (this) && offset.sanitize (c, base, &closure));
@@ -121,7 +128,8 @@ struct RecordListOf : RecordArrayOf<Type>
   inline const Type& operator [] (unsigned int i) const
   { return this+RecordArrayOf<Type>::operator [](i).offset; }
 
   inline const Type& operator [] (unsigned int i) const
   { return this+RecordArrayOf<Type>::operator [](i).offset; }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (RecordArrayOf<Type>::sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (RecordArrayOf<Type>::sanitize (c, this));
   }
@@ -134,7 +142,8 @@ struct RangeRecord
     return g < start ? -1 : g <= end ? 0 : +1 ;
   }
 
     return g < start ? -1 : g <= end ? 0 : +1 ;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -199,7 +208,8 @@ 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 Record<LangSys>::sanitize_closure_t * = NULL) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && featureIndex.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && featureIndex.sanitize (c));
   }
@@ -238,7 +248,8 @@ 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 Record<Script>::sanitize_closure_t * = NULL) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
   }
@@ -260,7 +271,8 @@ typedef RecordListOf<Script> ScriptList;
 /* http://www.microsoft.com/typography/otspec/features_pt.htm#size */
 struct FeatureParamsSize
 {
 /* http://www.microsoft.com/typography/otspec/features_pt.htm#size */
 struct FeatureParamsSize
 {
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
 
     TRACE_SANITIZE (this);
     if (unlikely (!c->check_struct (this))) return TRACE_RETURN (false);
 
@@ -371,7 +383,8 @@ struct FeatureParamsSize
 /* http://www.microsoft.com/typography/otspec/features_pt.htm#ssxx */
 struct FeatureParamsStylisticSet
 {
 /* http://www.microsoft.com/typography/otspec/features_pt.htm#ssxx */
 struct FeatureParamsStylisticSet
 {
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     /* Right now minorVersion is at zero.  Which means, any table supports
      * the uiNameID field. */
     TRACE_SANITIZE (this);
     /* Right now minorVersion is at zero.  Which means, any table supports
      * the uiNameID field. */
@@ -404,7 +417,8 @@ struct FeatureParamsStylisticSet
 /* http://www.microsoft.com/typography/otspec/features_ae.htm#cv01-cv99 */
 struct FeatureParamsCharacterVariants
 {
 /* http://www.microsoft.com/typography/otspec/features_ae.htm#cv01-cv99 */
 struct FeatureParamsCharacterVariants
 {
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         characters.sanitize (c));
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         characters.sanitize (c));
@@ -444,7 +458,8 @@ struct FeatureParamsCharacterVariants
 
 struct FeatureParams
 {
 
 struct FeatureParams
 {
-  inline bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) {
+  inline bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const
+  {
     TRACE_SANITIZE (this);
     if (tag == HB_TAG ('s','i','z','e'))
       return TRACE_RETURN (u.size.sanitize (c));
     TRACE_SANITIZE (this);
     if (tag == HB_TAG ('s','i','z','e'))
       return TRACE_RETURN (u.size.sanitize (c));
@@ -486,7 +501,8 @@ 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) {
+                       const Record<Feature>::sanitize_closure_t *closure) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
       return TRACE_RETURN (false);
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
       return TRACE_RETURN (false);
@@ -561,6 +577,17 @@ struct Lookup
 {
   inline unsigned int get_subtable_count (void) const { return subTable.len; }
 
 {
   inline unsigned int get_subtable_count (void) const { return subTable.len; }
 
+  template <typename SubTableType>
+  inline const SubTableType& get_subtable (unsigned int i) const
+  { return this+CastR<OffsetArrayOf<SubTableType> > (subTable)[i]; }
+
+  template <typename SubTableType>
+  inline const OffsetArrayOf<SubTableType>& get_subtables (void) const
+  { return CastR<OffsetArrayOf<SubTableType> > (subTable); }
+  template <typename SubTableType>
+  inline OffsetArrayOf<SubTableType>& get_subtables (void)
+  { return CastR<OffsetArrayOf<SubTableType> > (subTable); }
+
   inline unsigned int get_type (void) const { return lookupType; }
 
   /* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and
   inline unsigned int get_type (void) const { return lookupType; }
 
   /* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and
@@ -577,6 +604,20 @@ struct Lookup
     return flag;
   }
 
     return flag;
   }
 
+  template <typename SubTableType, typename context_t>
+  inline typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int lookup_type = get_type ();
+    TRACE_DISPATCH (this, lookup_type);
+    unsigned int count = get_subtable_count ();
+    for (unsigned int i = 0; i < count; i++) {
+      typename context_t::return_t r = get_subtable<SubTableType> (i).dispatch (c, lookup_type);
+      if (c->stop_sublookup_iteration (r))
+        return TRACE_RETURN (r);
+    }
+    return TRACE_RETURN (c->default_return_value ());
+  }
+
   inline bool serialize (hb_serialize_context_t *c,
                         unsigned int lookup_type,
                         uint32_t lookup_props,
   inline bool serialize (hb_serialize_context_t *c,
                         unsigned int lookup_type,
                         uint32_t lookup_props,
@@ -595,18 +636,20 @@ struct Lookup
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     /* Real sanitize of the subtables is done by GSUB/GPOS/... */
     if (!(c->check_struct (this) && subTable.sanitize (c))) return TRACE_RETURN (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
     TRACE_SANITIZE (this);
     /* Real sanitize of the subtables is done by GSUB/GPOS/... */
     if (!(c->check_struct (this) && subTable.sanitize (c))) return TRACE_RETURN (false);
     if (lookupFlag & LookupFlag::UseMarkFilteringSet)
     {
-      USHORT &markFilteringSet = StructAfter<USHORT> (subTable);
+      const USHORT &markFilteringSet = StructAfter<USHORT> (subTable);
       if (!markFilteringSet.sanitize (c)) return TRACE_RETURN (false);
     }
     return TRACE_RETURN (true);
   }
 
       if (!markFilteringSet.sanitize (c)) return TRACE_RETURN (false);
     }
     return TRACE_RETURN (true);
   }
 
+  private:
   USHORT       lookupType;             /* Different enumerations for GSUB and GPOS */
   USHORT       lookupFlag;             /* Lookup qualifiers */
   ArrayOf<Offset<> >
   USHORT       lookupType;             /* Different enumerations for GSUB and GPOS */
   USHORT       lookupFlag;             /* Lookup qualifiers */
   ArrayOf<Offset<> >
@@ -651,7 +694,8 @@ struct CoverageFormat1
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (glyphArray.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (glyphArray.sanitize (c));
   }
@@ -737,7 +781,8 @@ struct CoverageFormat2
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rangeRecord.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rangeRecord.sanitize (c));
   }
@@ -832,7 +877,8 @@ struct Coverage
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
@@ -938,12 +984,14 @@ struct ClassDefFormat1
   private:
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
   private:
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
-    if (unlikely ((unsigned int) (glyph_id - startGlyph) < classValue.len))
-      return classValue[glyph_id - startGlyph];
+    unsigned int i = (unsigned int) (glyph_id - startGlyph);
+    if (unlikely (i < classValue.len))
+      return classValue[i];
     return 0;
   }
 
     return 0;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && classValue.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && classValue.sanitize (c));
   }
@@ -994,12 +1042,13 @@ struct ClassDefFormat2
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
     int i = rangeRecord.bsearch (glyph_id);
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
     int i = rangeRecord.bsearch (glyph_id);
-    if (i != -1)
+    if (unlikely (i != -1))
       return rangeRecord[i].value;
     return 0;
   }
 
       return rangeRecord[i].value;
     return 0;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rangeRecord.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rangeRecord.sanitize (c));
   }
@@ -1056,7 +1105,8 @@ struct ClassDef
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
@@ -1148,7 +1198,8 @@ struct Device
     return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
   }
 
     return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && c->check_range (this, this->get_size ()));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && c->check_range (this, this->get_size ()));
   }
index 84a5e79..7a6c04d 100644 (file)
@@ -71,7 +71,8 @@ struct AttachList
     return points.len;
   }
 
     return points.len;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && attachPoint.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && attachPoint.sanitize (c, this));
   }
@@ -101,7 +102,8 @@ struct CaretValueFormat1
     return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_x (coordinate) : font->em_scale_y (coordinate);
   }
 
     return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_x (coordinate) : font->em_scale_y (coordinate);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -127,7 +129,8 @@ struct CaretValueFormat2
       return 0;
   }
 
       return 0;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -150,7 +153,8 @@ struct CaretValueFormat3
            font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font);
   }
 
            font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && deviceTable.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && deviceTable.sanitize (c, this));
   }
@@ -178,7 +182,8 @@ struct CaretValue
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
@@ -219,7 +224,8 @@ struct LigGlyph
     return carets.len;
   }
 
     return carets.len;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (carets.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (carets.sanitize (c, this));
   }
@@ -253,7 +259,8 @@ struct LigCaretList
     return lig_glyph.get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array);
   }
 
     return lig_glyph.get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
   }
@@ -275,7 +282,8 @@ struct MarkGlyphSetsFormat1
   inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
 
   inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this));
   }
@@ -299,7 +307,8 @@ struct MarkGlyphSets
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
@@ -364,7 +373,8 @@ struct GDEF
   inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   { return version.to_int () >= 0x00010002u && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); }
 
   inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   { return version.to_int () >= 0x00010002u && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (version.sanitize (c) &&
                         likely (version.major == 1) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (version.sanitize (c) &&
                         likely (version.major == 1) &&
index 8e2860c..d88f787 100644 (file)
@@ -146,7 +146,8 @@ struct ValueFormat : USHORT
   }
 
   private:
   }
 
   private:
-  inline bool sanitize_value_devices (hb_sanitize_context_t *c, void *base, Value *values) {
+  inline bool sanitize_value_devices (hb_sanitize_context_t *c, const void *base, const Value *values) const
+  {
     unsigned int format = *this;
 
     if (format & xPlacement) values++;
     unsigned int format = *this;
 
     if (format & xPlacement) values++;
@@ -177,12 +178,14 @@ struct ValueFormat : USHORT
     return (format & devices) != 0;
   }
 
     return (format & devices) != 0;
   }
 
-  inline bool sanitize_value (hb_sanitize_context_t *c, void *base, Value *values) {
+  inline bool sanitize_value (hb_sanitize_context_t *c, const void *base, const Value *values) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values)));
   }
 
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values)));
   }
 
-  inline bool sanitize_values (hb_sanitize_context_t *c, void *base, Value *values, unsigned int count) {
+  inline bool sanitize_values (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count) const
+  {
     TRACE_SANITIZE (this);
     unsigned int len = get_len ();
 
     TRACE_SANITIZE (this);
     unsigned int len = get_len ();
 
@@ -200,7 +203,8 @@ struct ValueFormat : USHORT
   }
 
   /* Just sanitize referenced Device tables.  Doesn't check the values themselves. */
   }
 
   /* Just sanitize referenced Device tables.  Doesn't check the values themselves. */
-  inline bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, void *base, Value *values, unsigned int count, unsigned int stride) {
+  inline bool sanitize_values_stride_unsafe (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count, unsigned int stride) const
+  {
     TRACE_SANITIZE (this);
 
     if (!has_device ()) return TRACE_RETURN (true);
     TRACE_SANITIZE (this);
 
     if (!has_device ()) return TRACE_RETURN (true);
@@ -225,7 +229,8 @@ struct AnchorFormat1
       *y = font->em_scale_y (yCoordinate);
   }
 
       *y = font->em_scale_y (yCoordinate);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -254,7 +259,8 @@ struct AnchorFormat2
       *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate);
   }
 
       *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -282,7 +288,8 @@ struct AnchorFormat3
        *y += (this+yDeviceTable).get_x_delta (font);
   }
 
        *y += (this+yDeviceTable).get_x_delta (font);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this));
   }
@@ -317,7 +324,8 @@ struct Anchor
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
     TRACE_SANITIZE (this);
     if (!u.format.sanitize (c)) return TRACE_RETURN (false);
     switch (u.format) {
@@ -345,28 +353,29 @@ struct AnchorMatrix
   inline const Anchor& get_anchor (unsigned int row, unsigned int col, unsigned int cols, bool *found) const {
     *found = false;
     if (unlikely (row >= rows || col >= cols)) return Null(Anchor);
   inline const Anchor& get_anchor (unsigned int row, unsigned int col, unsigned int cols, bool *found) const {
     *found = false;
     if (unlikely (row >= rows || col >= cols)) return Null(Anchor);
-    *found = !matrix[row * cols + col].is_null ();
-    return this+matrix[row * cols + col];
+    *found = !matrixZ[row * cols + col].is_null ();
+    return this+matrixZ[row * cols + col];
   }
 
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) {
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) const
+  {
     TRACE_SANITIZE (this);
     if (!c->check_struct (this)) return TRACE_RETURN (false);
     if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return TRACE_RETURN (false);
     unsigned int count = rows * cols;
     TRACE_SANITIZE (this);
     if (!c->check_struct (this)) return TRACE_RETURN (false);
     if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return TRACE_RETURN (false);
     unsigned int count = rows * cols;
-    if (!c->check_array (matrix, matrix[0].static_size, count)) return TRACE_RETURN (false);
+    if (!c->check_array (matrixZ, matrixZ[0].static_size, count)) return TRACE_RETURN (false);
     for (unsigned int i = 0; i < count; i++)
     for (unsigned int i = 0; i < count; i++)
-      if (!matrix[i].sanitize (c, this)) return TRACE_RETURN (false);
+      if (!matrixZ[i].sanitize (c, this)) return TRACE_RETURN (false);
     return TRACE_RETURN (true);
   }
 
   USHORT       rows;                   /* Number of rows */
   protected:
   OffsetTo<Anchor>
     return TRACE_RETURN (true);
   }
 
   USHORT       rows;                   /* Number of rows */
   protected:
   OffsetTo<Anchor>
-               matrix[VAR];            /* Matrix of offsets to Anchor tables--
+               matrixZ[VAR];           /* Matrix of offsets to Anchor tables--
                                         * from beginning of AnchorMatrix table */
   public:
                                         * from beginning of AnchorMatrix table */
   public:
-  DEFINE_SIZE_ARRAY (2, matrix);
+  DEFINE_SIZE_ARRAY (2, matrixZ);
 };
 
 
 };
 
 
@@ -374,7 +383,8 @@ struct MarkRecord
 {
   friend struct MarkArray;
 
 {
   friend struct MarkArray;
 
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && markAnchor.sanitize (c, base));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && markAnchor.sanitize (c, base));
   }
@@ -421,7 +431,8 @@ struct MarkArray : ArrayOf<MarkRecord>      /* Array of MarkRecords--in Coverage orde
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (ArrayOf<MarkRecord>::sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (ArrayOf<MarkRecord>::sanitize (c, this));
   }
@@ -457,9 +468,12 @@ struct SinglePosFormat1
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     TRACE_SANITIZE (this);
-    return TRACE_RETURN (c->check_struct (this) && coverage.sanitize (c, this) && valueFormat.sanitize_value (c, this, values));
+    return TRACE_RETURN (c->check_struct (this)
+        && coverage.sanitize (c, this)
+       && valueFormat.sanitize_value (c, this, values));
   }
 
   protected:
   }
 
   protected:
@@ -506,9 +520,12 @@ struct SinglePosFormat2
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     TRACE_SANITIZE (this);
-    return TRACE_RETURN (c->check_struct (this) && coverage.sanitize (c, this) && valueFormat.sanitize_values (c, this, values, valueCount));
+    return TRACE_RETURN (c->check_struct (this)
+       && coverage.sanitize (c, this)
+       && valueFormat.sanitize_values (c, this, values, valueCount));
   }
 
   protected:
   }
 
   protected:
@@ -530,7 +547,8 @@ struct SinglePos
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
@@ -538,16 +556,6 @@ struct SinglePos
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    case 2: return TRACE_RETURN (u.format2.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -583,7 +591,7 @@ struct PairSet
     unsigned int len2 = valueFormats[1].get_len ();
     unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
 
     unsigned int len2 = valueFormats[1].get_len ();
     unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
 
-    const PairValueRecord *record = CastP<PairValueRecord> (array);
+    const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
     unsigned int count = len;
     for (unsigned int i = 0; i < count; i++)
     {
     unsigned int count = len;
     for (unsigned int i = 0; i < count; i++)
     {
@@ -602,12 +610,24 @@ struct PairSet
     unsigned int len2 = valueFormats[1].get_len ();
     unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
 
     unsigned int len2 = valueFormats[1].get_len ();
     unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
 
-    const PairValueRecord *record = CastP<PairValueRecord> (array);
+    const PairValueRecord *record_array = CastP<PairValueRecord> (arrayZ);
     unsigned int count = len;
     unsigned int count = len;
-    for (unsigned int i = 0; i < count; i++)
+
+    /* Hand-coded bsearch. */
+    if (unlikely (!count))
+      return TRACE_RETURN (false);
+    hb_codepoint_t x = buffer->info[pos].codepoint;
+    int min = 0, max = (int) count - 1;
+    while (min <= max)
     {
     {
-      /* TODO bsearch */
-      if (buffer->info[pos].codepoint == record->secondGlyph)
+      int mid = (min + max) / 2;
+      const PairValueRecord *record = &StructAtOffset<PairValueRecord> (record_array, record_size * mid);
+      hb_codepoint_t mid_x = record->secondGlyph;
+      if (x < mid_x)
+        max = mid - 1;
+      else if (x > mid_x)
+        min = mid + 1;
+      else
       {
        valueFormats[0].apply_value (c->font, c->direction, this,
                                     &record->values[0], buffer->cur_pos());
       {
        valueFormats[0].apply_value (c->font, c->direction, this,
                                     &record->values[0], buffer->cur_pos());
@@ -618,36 +638,36 @@ struct PairSet
        buffer->idx = pos;
        return TRACE_RETURN (true);
       }
        buffer->idx = pos;
        return TRACE_RETURN (true);
       }
-      record = &StructAtOffset<PairValueRecord> (record, record_size);
     }
 
     return TRACE_RETURN (false);
   }
 
   struct sanitize_closure_t {
     }
 
     return TRACE_RETURN (false);
   }
 
   struct sanitize_closure_t {
-    void *base;
-    ValueFormat *valueFormats;
+    const void *base;
+    const ValueFormat *valueFormats;
     unsigned int len1; /* valueFormats[0].get_len() */
     unsigned int stride; /* 1 + len1 + len2 */
   };
 
     unsigned int len1; /* valueFormats[0].get_len() */
     unsigned int stride; /* 1 + len1 + len2 */
   };
 
-  inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) {
+  inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *closure) const
+  {
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this)
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this)
-       && c->check_array (array, USHORT::static_size * closure->stride, len))) return TRACE_RETURN (false);
+       && c->check_array (arrayZ, USHORT::static_size * closure->stride, len))) return TRACE_RETURN (false);
 
     unsigned int count = len;
 
     unsigned int count = len;
-    PairValueRecord *record = CastP<PairValueRecord> (array);
+    const PairValueRecord *record = CastP<PairValueRecord> (arrayZ);
     return TRACE_RETURN (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride)
                      && closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride));
   }
 
   protected:
   USHORT       len;                    /* Number of PairValueRecords */
     return TRACE_RETURN (closure->valueFormats[0].sanitize_values_stride_unsafe (c, closure->base, &record->values[0], count, closure->stride)
                      && closure->valueFormats[1].sanitize_values_stride_unsafe (c, closure->base, &record->values[closure->len1], count, closure->stride));
   }
 
   protected:
   USHORT       len;                    /* Number of PairValueRecords */
-  USHORT       array[VAR];             /* Array of PairValueRecords--ordered
+  USHORT       arrayZ[VAR];            /* Array of PairValueRecords--ordered
                                         * by GlyphID of the second glyph */
   public:
                                         * by GlyphID of the second glyph */
   public:
-  DEFINE_SIZE_ARRAY (2, array);
+  DEFINE_SIZE_ARRAY (2, arrayZ);
 };
 
 struct PairPosFormat1
 };
 
 struct PairPosFormat1
@@ -670,18 +690,18 @@ struct PairPosFormat1
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
-    hb_apply_context_t::skipping_forward_iterator_t skippy_iter (c, buffer->idx, 1);
-    if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
-
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
 
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
 
+    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return TRACE_RETURN (false);
 
     return TRACE_RETURN ((this+pairSet[index]).apply (c, &valueFormat1, skippy_iter.idx));
   }
 
     if (!skippy_iter.next ()) return TRACE_RETURN (false);
 
     return TRACE_RETURN ((this+pairSet[index]).apply (c, &valueFormat1, skippy_iter.idx));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
 
     unsigned int len1 = valueFormat1.get_len ();
     TRACE_SANITIZE (this);
 
     unsigned int len1 = valueFormat1.get_len ();
@@ -741,12 +761,11 @@ struct PairPosFormat2
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
   {
     TRACE_APPLY (this);
     hb_buffer_t *buffer = c->buffer;
-    hb_apply_context_t::skipping_forward_iterator_t skippy_iter (c, buffer->idx, 1);
-    if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
-
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
 
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
 
+    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return TRACE_RETURN (false);
 
     unsigned int len1 = valueFormat1.get_len ();
     if (!skippy_iter.next ()) return TRACE_RETURN (false);
 
     unsigned int len1 = valueFormat1.get_len ();
@@ -770,7 +789,8 @@ struct PairPosFormat2
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this)
        && coverage.sanitize (c, this)
     TRACE_SANITIZE (this);
     if (!(c->check_struct (this)
        && coverage.sanitize (c, this)
@@ -822,7 +842,8 @@ struct PairPos
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
@@ -830,16 +851,6 @@ struct PairPos
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    case 2: return TRACE_RETURN (u.format2.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -853,7 +864,8 @@ struct EntryExitRecord
 {
   friend struct CursivePosFormat1;
 
 {
   friend struct CursivePosFormat1;
 
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (entryAnchor.sanitize (c, base) && exitAnchor.sanitize (c, base));
   }
@@ -892,12 +904,11 @@ struct CursivePosFormat1
     /* We don't handle mark glyphs here. */
     if (unlikely (_hb_glyph_info_is_mark (&buffer->cur()))) return TRACE_RETURN (false);
 
     /* We don't handle mark glyphs here. */
     if (unlikely (_hb_glyph_info_is_mark (&buffer->cur()))) return TRACE_RETURN (false);
 
-    hb_apply_context_t::skipping_forward_iterator_t skippy_iter (c, buffer->idx, 1);
-    if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
-
     const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
     if (!this_record.exitAnchor) return TRACE_RETURN (false);
 
     const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage  (buffer->cur().codepoint)];
     if (!this_record.exitAnchor) return TRACE_RETURN (false);
 
+    hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
+    skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return TRACE_RETURN (false);
 
     const EntryExitRecord &next_record = entryExitRecord[(this+coverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint)];
     if (!skippy_iter.next ()) return TRACE_RETURN (false);
 
     const EntryExitRecord &next_record = entryExitRecord[(this+coverage).get_coverage  (buffer->info[skippy_iter.idx].codepoint)];
@@ -967,7 +978,8 @@ struct CursivePosFormat1
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this));
   }
@@ -989,22 +1001,14 @@ struct CursivePos
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -1040,7 +1044,8 @@ struct MarkBasePosFormat1
     if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
 
     /* now we search backwards for a non-mark glyph */
     if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
 
     /* now we search backwards for a non-mark glyph */
-    hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, buffer->idx, 1);
+    hb_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_RETURN (false);
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     do {
       if (!skippy_iter.prev ()) return TRACE_RETURN (false);
@@ -1058,7 +1063,8 @@ struct MarkBasePosFormat1
     return TRACE_RETURN ((this+markArray).apply (c, mark_index, base_index, this+baseArray, classCount, skippy_iter.idx));
   }
 
     return TRACE_RETURN ((this+markArray).apply (c, mark_index, base_index, this+baseArray, classCount, skippy_iter.idx));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && baseCoverage.sanitize (c, this) &&
                         markArray.sanitize (c, this) && baseArray.sanitize (c, this, (unsigned int) classCount));
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && baseCoverage.sanitize (c, this) &&
                         markArray.sanitize (c, this) && baseArray.sanitize (c, this, (unsigned int) classCount));
@@ -1088,22 +1094,14 @@ struct MarkBasePos
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -1144,7 +1142,8 @@ struct MarkLigPosFormat1
     if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
 
     /* now we search backwards for a non-mark glyph */
     if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
 
     /* now we search backwards for a non-mark glyph */
-    hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, buffer->idx, 1);
+    hb_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_RETURN (false);
 
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     if (!skippy_iter.prev ()) return TRACE_RETURN (false);
 
@@ -1178,7 +1177,8 @@ struct MarkLigPosFormat1
     return TRACE_RETURN ((this+markArray).apply (c, mark_index, comp_index, lig_attach, classCount, j));
   }
 
     return TRACE_RETURN ((this+markArray).apply (c, mark_index, comp_index, lig_attach, classCount, j));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && ligatureCoverage.sanitize (c, this) &&
                         markArray.sanitize (c, this) && ligatureArray.sanitize (c, this, (unsigned int) classCount));
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && markCoverage.sanitize (c, this) && ligatureCoverage.sanitize (c, this) &&
                         markArray.sanitize (c, this) && ligatureArray.sanitize (c, this, (unsigned int) classCount));
@@ -1209,22 +1209,14 @@ struct MarkLigPos
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -1260,7 +1252,8 @@ struct MarkMarkPosFormat1
     if (likely (mark1_index == NOT_COVERED)) return TRACE_RETURN (false);
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
     if (likely (mark1_index == NOT_COVERED)) return TRACE_RETURN (false);
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
-    hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, buffer->idx, 1);
+    hb_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_RETURN (false);
 
     skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
     if (!skippy_iter.prev ()) return TRACE_RETURN (false);
 
@@ -1295,7 +1288,8 @@ struct MarkMarkPosFormat1
     return TRACE_RETURN ((this+mark1Array).apply (c, mark1_index, mark2_index, this+mark2Array, classCount, j));
   }
 
     return TRACE_RETURN ((this+mark1Array).apply (c, mark1_index, mark2_index, this+mark2Array, classCount, j));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && mark1Coverage.sanitize (c, this) &&
                         mark2Coverage.sanitize (c, this) && mark1Array.sanitize (c, this)
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) && mark1Coverage.sanitize (c, this) &&
                         mark2Coverage.sanitize (c, this) && mark1Array.sanitize (c, this)
@@ -1328,22 +1322,14 @@ struct MarkMarkPos
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -1387,7 +1373,9 @@ struct PosLookupSubTable
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, lookup_type);
+    /* The sub_format passed to may_dispatch is unnecessary but harmless. */
+    if (unlikely (!c->may_dispatch (this, &u.sub_format))) TRACE_RETURN (c->default_return_value ());
     switch (lookup_type) {
     case Single:               return TRACE_RETURN (u.single.dispatch (c));
     case Pair:                 return TRACE_RETURN (u.pair.dispatch (c));
     switch (lookup_type) {
     case Single:               return TRACE_RETURN (u.single.dispatch (c));
     case Pair:                 return TRACE_RETURN (u.pair.dispatch (c));
@@ -1402,29 +1390,9 @@ struct PosLookupSubTable
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) {
-    TRACE_SANITIZE (this);
-    if (!u.header.sub_format.sanitize (c))
-      return TRACE_RETURN (false);
-    switch (lookup_type) {
-    case Single:               return TRACE_RETURN (u.single.sanitize (c));
-    case Pair:                 return TRACE_RETURN (u.pair.sanitize (c));
-    case Cursive:              return TRACE_RETURN (u.cursive.sanitize (c));
-    case MarkBase:             return TRACE_RETURN (u.markBase.sanitize (c));
-    case MarkLig:              return TRACE_RETURN (u.markLig.sanitize (c));
-    case MarkMark:             return TRACE_RETURN (u.markMark.sanitize (c));
-    case Context:              return TRACE_RETURN (u.context.sanitize (c));
-    case ChainContext:         return TRACE_RETURN (u.chainContext.sanitize (c));
-    case Extension:            return TRACE_RETURN (u.extension.sanitize (c));
-    default:                   return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   protected:
   union {
-  struct {
-    USHORT             sub_format;
-  } header;
+  USHORT               sub_format;
   SinglePos            single;
   PairPos              pair;
   CursivePos           cursive;
   SinglePos            single;
   PairPos              pair;
   CursivePos           cursive;
@@ -1436,48 +1404,37 @@ struct PosLookupSubTable
   ExtensionPos         extension;
   } u;
   public:
   ExtensionPos         extension;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, header.sub_format);
+  DEFINE_SIZE_UNION (2, sub_format);
 };
 
 
 struct PosLookup : Lookup
 {
   inline const PosLookupSubTable& get_subtable (unsigned int i) const
 };
 
 
 struct PosLookup : Lookup
 {
   inline const PosLookupSubTable& get_subtable (unsigned int i) const
-  { return this+CastR<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; }
+  { return Lookup::get_subtable<PosLookupSubTable> (i); }
 
   inline bool is_reverse (void) const
   {
     return false;
   }
 
 
   inline bool is_reverse (void) const
   {
     return false;
   }
 
+  inline bool apply (hb_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    return TRACE_RETURN (dispatch (c));
+  }
+
   inline hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs_context_t *c) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    c->set_recurse_func (NULL);
     return TRACE_RETURN (dispatch (c));
   }
 
   template <typename set_t>
   inline void add_coverage (set_t *glyphs) const
   {
     return TRACE_RETURN (dispatch (c));
   }
 
   template <typename set_t>
   inline void add_coverage (set_t *glyphs) const
   {
-    hb_get_coverage_context_t c;
-    const Coverage *last = NULL;
-    unsigned int count = get_subtable_count ();
-    for (unsigned int i = 0; i < count; i++) {
-      const Coverage *coverage = &get_subtable (i).dispatch (&c, get_type ());
-      if (coverage != last) {
-        coverage->add_coverage (glyphs);
-        last = coverage;
-      }
-    }
-  }
-
-  inline bool apply_once (hb_apply_context_t *c) const
-  {
-    TRACE_APPLY (this);
-    if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props))
-      return TRACE_RETURN (false);
-    return TRACE_RETURN (dispatch (c));
+    hb_add_coverage_context_t<set_t> c (glyphs);
+    dispatch (&c);
   }
 
   static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
   }
 
   static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
@@ -1487,23 +1444,14 @@ struct PosLookup : Lookup
 
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
 
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
-  {
-    TRACE_DISPATCH (this);
-    unsigned int lookup_type = get_type ();
-    unsigned int count = get_subtable_count ();
-    for (unsigned int i = 0; i < count; i++) {
-      typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type);
-      if (c->stop_sublookup_iteration (r))
-        return TRACE_RETURN (r);
-    }
-    return TRACE_RETURN (c->default_return_value ());
-  }
+  { return Lookup::dispatch<PosLookupSubTable> (c); }
 
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
     TRACE_SANITIZE (this);
     if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
-    OffsetArrayOf<PosLookupSubTable> &list = CastR<OffsetArrayOf<PosLookupSubTable> > (subTable);
-    return TRACE_RETURN (list.sanitize (c, this, get_type ()));
+    const OffsetArrayOf<PosLookupSubTable> &list = get_subtables<PosLookupSubTable> ();
+    return TRACE_RETURN (dispatch (c));
   }
 };
 
   }
 };
 
@@ -1523,10 +1471,11 @@ struct GPOS : GSUBGPOS
   static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
   static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer);
 
   static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
   static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer);
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
     TRACE_SANITIZE (this);
     if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
-    OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
+    const OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
     return TRACE_RETURN (list.sanitize (c, this));
   }
   public:
     return TRACE_RETURN (list.sanitize (c, this));
   }
   public:
@@ -1621,8 +1570,8 @@ template <typename context_t>
   const PosLookup &l = gpos.get_lookup (lookup_index);
   unsigned int saved_lookup_props = c->lookup_props;
   c->set_lookup (l);
   const PosLookup &l = gpos.get_lookup (lookup_index);
   unsigned int saved_lookup_props = c->lookup_props;
   c->set_lookup (l);
-  bool ret = l.apply_once (c);
-  c->lookup_props = saved_lookup_props;
+  bool ret = l.dispatch (c);
+  c->set_lookup_props (saved_lookup_props);
   return ret;
 }
 
   return ret;
 }
 
index 2b421a9..ebe4c9e 100644 (file)
@@ -97,7 +97,8 @@ struct SingleSubstFormat1
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
   }
@@ -173,7 +174,8 @@ struct SingleSubstFormat2
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && substitute.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && substitute.sanitize (c));
   }
@@ -200,7 +202,7 @@ struct SingleSubst
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
     unsigned int format = 2;
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false);
     unsigned int format = 2;
-    int delta;
+    int delta = 0;
     if (num_glyphs) {
       format = 1;
       /* TODO(serialize) check for wrap-around */
     if (num_glyphs) {
       format = 1;
       /* TODO(serialize) check for wrap-around */
@@ -222,7 +224,8 @@ struct SingleSubst
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
@@ -230,16 +233,6 @@ struct SingleSubst
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    case 2: return TRACE_RETURN (u.format2.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -312,7 +305,8 @@ struct Sequence
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (substitute.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (substitute.sanitize (c));
   }
@@ -384,7 +378,8 @@ struct MultipleSubstFormat1
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && sequence.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && sequence.sanitize (c, this));
   }
@@ -422,22 +417,14 @@ struct MultipleSubst
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -535,7 +522,8 @@ struct AlternateSubstFormat1
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && alternateSet.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && alternateSet.sanitize (c, this));
   }
@@ -573,22 +561,14 @@ struct AlternateSubst
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -686,7 +666,8 @@ struct Ligature
   }
 
   public:
   }
 
   public:
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (ligGlyph.sanitize (c) && component.sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (ligGlyph.sanitize (c) && component.sanitize (c));
   }
@@ -764,7 +745,8 @@ struct LigatureSet
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (ligature.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (ligature.sanitize (c, this));
   }
@@ -848,7 +830,8 @@ struct LigatureSubstFormat1
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this));
   }
@@ -889,22 +872,14 @@ struct LigatureSubst
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -1017,14 +992,15 @@ struct ReverseChainSingleSubstFormat1
     return TRACE_RETURN (false);
   }
 
     return TRACE_RETURN (false);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
       return TRACE_RETURN (false);
     TRACE_SANITIZE (this);
     if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
       return TRACE_RETURN (false);
-    OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
     if (!lookahead.sanitize (c, this))
       return TRACE_RETURN (false);
     if (!lookahead.sanitize (c, this))
       return TRACE_RETURN (false);
-    ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
+    const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
     return TRACE_RETURN (substitute.sanitize (c));
   }
 
     return TRACE_RETURN (substitute.sanitize (c));
   }
 
@@ -1053,22 +1029,14 @@ struct ReverseChainSingleSubst
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT                               format;         /* Format identifier */
   protected:
   union {
   USHORT                               format;         /* Format identifier */
@@ -1100,7 +1068,9 @@ struct SubstLookupSubTable
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, lookup_type);
+    /* The sub_format passed to may_dispatch is unnecessary but harmless. */
+    if (unlikely (!c->may_dispatch (this, &u.sub_format))) TRACE_RETURN (c->default_return_value ());
     switch (lookup_type) {
     case Single:               return TRACE_RETURN (u.single.dispatch (c));
     case Multiple:             return TRACE_RETURN (u.multiple.dispatch (c));
     switch (lookup_type) {
     case Single:               return TRACE_RETURN (u.single.dispatch (c));
     case Multiple:             return TRACE_RETURN (u.multiple.dispatch (c));
@@ -1114,28 +1084,9 @@ struct SubstLookupSubTable
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) {
-    TRACE_SANITIZE (this);
-    if (!u.header.sub_format.sanitize (c))
-      return TRACE_RETURN (false);
-    switch (lookup_type) {
-    case Single:               return TRACE_RETURN (u.single.sanitize (c));
-    case Multiple:             return TRACE_RETURN (u.multiple.sanitize (c));
-    case Alternate:            return TRACE_RETURN (u.alternate.sanitize (c));
-    case Ligature:             return TRACE_RETURN (u.ligature.sanitize (c));
-    case Context:              return TRACE_RETURN (u.context.sanitize (c));
-    case ChainContext:         return TRACE_RETURN (u.chainContext.sanitize (c));
-    case Extension:            return TRACE_RETURN (u.extension.sanitize (c));
-    case ReverseChainSingle:   return TRACE_RETURN (u.reverseChainContextSingle.sanitize (c));
-    default:                   return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   protected:
   union {
-  struct {
-    USHORT                     sub_format;
-  } header;
+  USHORT                       sub_format;
   SingleSubst                  single;
   MultipleSubst                        multiple;
   AlternateSubst               alternate;
   SingleSubst                  single;
   MultipleSubst                        multiple;
   AlternateSubst               alternate;
@@ -1146,14 +1097,14 @@ struct SubstLookupSubTable
   ReverseChainSingleSubst      reverseChainContextSingle;
   } u;
   public:
   ReverseChainSingleSubst      reverseChainContextSingle;
   } u;
   public:
-  DEFINE_SIZE_UNION (2, header.sub_format);
+  DEFINE_SIZE_UNION (2, sub_format);
 };
 
 
 struct SubstLookup : Lookup
 {
   inline const SubstLookupSubTable& get_subtable (unsigned int i) const
 };
 
 
 struct SubstLookup : Lookup
 {
   inline const SubstLookupSubTable& get_subtable (unsigned int i) const
-  { return this+CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i]; }
+  { return Lookup::get_subtable<SubstLookupSubTable> (i); }
 
   inline static bool lookup_type_is_reverse (unsigned int lookup_type)
   { return lookup_type == SubstLookupSubTable::ReverseChainSingle; }
 
   inline static bool lookup_type_is_reverse (unsigned int lookup_type)
   { return lookup_type == SubstLookupSubTable::ReverseChainSingle; }
@@ -1166,6 +1117,12 @@ struct SubstLookup : Lookup
     return lookup_type_is_reverse (type);
   }
 
     return lookup_type_is_reverse (type);
   }
 
+  inline bool apply (hb_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    return TRACE_RETURN (dispatch (c));
+  }
+
   inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE (this);
   inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE (this);
@@ -1183,39 +1140,24 @@ struct SubstLookup : Lookup
   template <typename set_t>
   inline void add_coverage (set_t *glyphs) const
   {
   template <typename set_t>
   inline void add_coverage (set_t *glyphs) const
   {
-    hb_get_coverage_context_t c;
-    const Coverage *last = NULL;
-    unsigned int count = get_subtable_count ();
-    for (unsigned int i = 0; i < count; i++) {
-      const Coverage *coverage = &get_subtable (i).dispatch (&c, get_type ());
-      if (coverage != last) {
-        coverage->add_coverage (glyphs);
-        last = coverage;
-      }
-    }
+    hb_add_coverage_context_t<set_t> c (glyphs);
+    dispatch (&c);
   }
 
   }
 
-  inline bool would_apply (hb_would_apply_context_t *c, const hb_set_digest_t *digest) const
+  inline bool would_apply (hb_would_apply_context_t *c,
+                          const hb_ot_layout_lookup_accelerator_t *accel) const
   {
     TRACE_WOULD_APPLY (this);
     if (unlikely (!c->len))  return TRACE_RETURN (false);
   {
     TRACE_WOULD_APPLY (this);
     if (unlikely (!c->len))  return TRACE_RETURN (false);
-    if (!digest->may_have (c->glyphs[0]))  return TRACE_RETURN (false);
+    if (!accel->may_have (c->glyphs[0]))  return TRACE_RETURN (false);
       return TRACE_RETURN (dispatch (c));
   }
 
       return TRACE_RETURN (dispatch (c));
   }
 
-  inline bool apply_once (hb_apply_context_t *c) const
-  {
-    TRACE_APPLY (this);
-    if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props))
-      return TRACE_RETURN (false);
-    return TRACE_RETURN (dispatch (c));
-  }
-
   static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
 
   inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
                                                  unsigned int i)
   static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
 
   inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
                                                  unsigned int i)
-  { return CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i].serialize (c, this); }
+  { return get_subtables<SubstLookupSubTable> ()[i].serialize (c, this); }
 
   inline bool serialize_single (hb_serialize_context_t *c,
                                uint32_t lookup_props,
 
   inline bool serialize_single (hb_serialize_context_t *c,
                                uint32_t lookup_props,
@@ -1274,24 +1216,14 @@ struct SubstLookup : Lookup
 
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
 
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
-  {
-    TRACE_DISPATCH (this);
-    unsigned int lookup_type = get_type ();
-    unsigned int count = get_subtable_count ();
-    for (unsigned int i = 0; i < count; i++) {
-      typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type);
-      if (c->stop_sublookup_iteration (r))
-        return TRACE_RETURN (r);
-    }
-    return TRACE_RETURN (c->default_return_value ());
-  }
+  { return Lookup::dispatch<SubstLookupSubTable> (c); }
 
 
-  inline bool sanitize (hb_sanitize_context_t *c)
+  inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
   {
     TRACE_SANITIZE (this);
     if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false);
-    OffsetArrayOf<SubstLookupSubTable> &list = CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable);
-    if (unlikely (!list.sanitize (c, this, get_type ()))) return TRACE_RETURN (false);
+    const OffsetArrayOf<SubstLookupSubTable> &list = get_subtables<SubstLookupSubTable> ();
+    if (unlikely (!dispatch (c))) return TRACE_RETURN (false);
 
     if (unlikely (get_type () == SubstLookupSubTable::Extension))
     {
 
     if (unlikely (get_type () == SubstLookupSubTable::Extension))
     {
@@ -1324,10 +1256,11 @@ struct GSUB : GSUBGPOS
   static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
   static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
 
   static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
   static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
     TRACE_SANITIZE (this);
     if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false);
-    OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
+    const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
     return TRACE_RETURN (list.sanitize (c, this));
   }
   public:
     return TRACE_RETURN (list.sanitize (c, this));
   }
   public:
@@ -1362,7 +1295,7 @@ GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSE
 {
   unsigned int type = get_type ();
   if (unlikely (type == SubstLookupSubTable::Extension))
 {
   unsigned int type = get_type ();
   if (unlikely (type == SubstLookupSubTable::Extension))
-    return CastR<ExtensionSubst> (get_subtable<SubstLookupSubTable>()).is_reverse ();
+    return CastR<ExtensionSubst> (get_subtable<LookupSubTable>()).is_reverse ();
   return SubstLookup::lookup_type_is_reverse (type);
 }
 
   return SubstLookup::lookup_type_is_reverse (type);
 }
 
@@ -1380,8 +1313,8 @@ template <typename context_t>
   const SubstLookup &l = gsub.get_lookup (lookup_index);
   unsigned int saved_lookup_props = c->lookup_props;
   c->set_lookup (l);
   const SubstLookup &l = gsub.get_lookup (lookup_index);
   unsigned int saved_lookup_props = c->lookup_props;
   c->set_lookup (l);
-  bool ret = l.apply_once (c);
-  c->lookup_props = saved_lookup_props;
+  bool ret = l.dispatch (c);
+  c->set_lookup_props (saved_lookup_props);
   return ret;
 }
 
   return ret;
 }
 
index 546ff4b..cbc6840 100644 (file)
 namespace OT {
 
 
 namespace OT {
 
 
-
-#define TRACE_DISPATCH(this) \
-       hb_auto_trace_t<context_t::max_debug_depth, typename context_t::return_t> trace \
-       (&c->debug_depth, c->get_name (), this, HB_FUNC, \
-        "");
-
 #ifndef HB_DEBUG_CLOSURE
 #define HB_DEBUG_CLOSURE (HB_DEBUG+0)
 #endif
 #ifndef HB_DEBUG_CLOSURE
 #define HB_DEBUG_CLOSURE (HB_DEBUG+0)
 #endif
@@ -58,6 +52,8 @@ struct hb_closure_context_t
   static const unsigned int max_debug_depth = HB_DEBUG_CLOSURE;
   typedef hb_void_t return_t;
   typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
   static const unsigned int max_debug_depth = HB_DEBUG_CLOSURE;
   typedef hb_void_t return_t;
   typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
+  template <typename T, typename F>
+  inline bool may_dispatch (const T *obj, const F *format) { return true; }
   template <typename T>
   inline return_t dispatch (const T &obj) { obj.closure (this); return HB_VOID; }
   static return_t default_return_value (void) { return HB_VOID; }
   template <typename T>
   inline return_t dispatch (const T &obj) { obj.closure (this); return HB_VOID; }
   static return_t default_return_value (void) { return HB_VOID; }
@@ -107,6 +103,8 @@ struct hb_would_apply_context_t
   inline const char *get_name (void) { return "WOULD_APPLY"; }
   static const unsigned int max_debug_depth = HB_DEBUG_WOULD_APPLY;
   typedef bool return_t;
   inline const char *get_name (void) { return "WOULD_APPLY"; }
   static const unsigned int max_debug_depth = HB_DEBUG_WOULD_APPLY;
   typedef bool return_t;
+  template <typename T, typename F>
+  inline bool may_dispatch (const T *obj, const F *format) { return true; }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.would_apply (this); }
   static return_t default_return_value (void) { return false; }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.would_apply (this); }
   static return_t default_return_value (void) { return false; }
@@ -146,6 +144,8 @@ struct hb_collect_glyphs_context_t
   static const unsigned int max_debug_depth = HB_DEBUG_COLLECT_GLYPHS;
   typedef hb_void_t return_t;
   typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
   static const unsigned int max_debug_depth = HB_DEBUG_COLLECT_GLYPHS;
   typedef hb_void_t return_t;
   typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
+  template <typename T, typename F>
+  inline bool may_dispatch (const T *obj, const F *format) { return true; }
   template <typename T>
   inline return_t dispatch (const T &obj) { obj.collect_glyphs (this); return HB_VOID; }
   static return_t default_return_value (void) { return HB_VOID; }
   template <typename T>
   inline return_t dispatch (const T &obj) { obj.collect_glyphs (this); return HB_VOID; }
   static return_t default_return_value (void) { return HB_VOID; }
@@ -168,6 +168,10 @@ struct hb_collect_glyphs_context_t
     if (output == hb_set_get_empty ())
       return HB_VOID;
 
     if (output == hb_set_get_empty ())
       return HB_VOID;
 
+    /* Return if new lookup was recursed to before. */
+    if (recursed_lookups.has (lookup_index))
+      return HB_VOID;
+
     hb_set_t *old_before = before;
     hb_set_t *old_input  = input;
     hb_set_t *old_after  = after;
     hb_set_t *old_before = before;
     hb_set_t *old_input  = input;
     hb_set_t *old_after  = after;
@@ -181,6 +185,8 @@ struct hb_collect_glyphs_context_t
     input  = old_input;
     after  = old_after;
 
     input  = old_input;
     after  = old_after;
 
+    recursed_lookups.add (lookup_index);
+
     return HB_VOID;
   }
 
     return HB_VOID;
   }
 
@@ -190,6 +196,7 @@ 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;
   unsigned int nesting_level_left;
   unsigned int debug_depth;
 
   unsigned int nesting_level_left;
   unsigned int debug_depth;
 
@@ -205,26 +212,48 @@ struct hb_collect_glyphs_context_t
                              after  (glyphs_after  ? glyphs_after  : hb_set_get_empty ()),
                              output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
                              recurse_func (NULL),
                              after  (glyphs_after  ? glyphs_after  : hb_set_get_empty ()),
                              output (glyphs_output ? glyphs_output : hb_set_get_empty ()),
                              recurse_func (NULL),
+                             recursed_lookups (),
                              nesting_level_left (nesting_level_left_),
                              nesting_level_left (nesting_level_left_),
-                             debug_depth (0) {}
+                             debug_depth (0)
+  {
+    recursed_lookups.init ();
+  }
+  ~hb_collect_glyphs_context_t (void)
+  {
+    recursed_lookups.fini ();
+  }
 
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
 };
 
 
 
 
   void set_recurse_func (recurse_func_t func) { recurse_func = func; }
 };
 
 
 
-struct hb_get_coverage_context_t
+#ifndef HB_DEBUG_GET_COVERAGE
+#define HB_DEBUG_GET_COVERAGE (HB_DEBUG+0)
+#endif
+
+template <typename set_t>
+struct hb_add_coverage_context_t
 {
   inline const char *get_name (void) { return "GET_COVERAGE"; }
 {
   inline const char *get_name (void) { return "GET_COVERAGE"; }
-  static const unsigned int max_debug_depth = 0;
+  static const unsigned int max_debug_depth = HB_DEBUG_GET_COVERAGE;
   typedef const Coverage &return_t;
   typedef const Coverage &return_t;
+  template <typename T, typename F>
+  inline bool may_dispatch (const T *obj, const F *format) { return true; }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.get_coverage (); }
   static return_t default_return_value (void) { return Null(Coverage); }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.get_coverage (); }
   static return_t default_return_value (void) { return Null(Coverage); }
+  bool stop_sublookup_iteration (return_t r) const
+  {
+    r.add_coverage (set);
+    return false;
+  }
 
 
-  hb_get_coverage_context_t (void) :
+  hb_add_coverage_context_t (set_t *set_) :
+                           set (set_),
                            debug_depth (0) {}
 
                            debug_depth (0) {}
 
+  set_t *set;
   unsigned int debug_depth;
 };
 
   unsigned int debug_depth;
 };
 
@@ -241,61 +270,6 @@ struct hb_get_coverage_context_t
 
 struct hb_apply_context_t
 {
 
 struct hb_apply_context_t
 {
-  inline const char *get_name (void) { return "APPLY"; }
-  static const unsigned int max_debug_depth = HB_DEBUG_APPLY;
-  typedef bool return_t;
-  typedef return_t (*recurse_func_t) (hb_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; }
-  return_t recurse (unsigned int lookup_index)
-  {
-    if (unlikely (nesting_level_left == 0 || !recurse_func))
-      return default_return_value ();
-
-    nesting_level_left--;
-    bool ret = recurse_func (this, lookup_index);
-    nesting_level_left++;
-    return ret;
-  }
-
-  unsigned int table_index; /* GSUB/GPOS */
-  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;
-  unsigned int nesting_level_left;
-  unsigned int lookup_props;
-  const GDEF &gdef;
-  bool has_glyph_classes;
-  unsigned int debug_depth;
-
-
-  hb_apply_context_t (unsigned int table_index_,
-                     hb_font_t *font_,
-                     hb_buffer_t *buffer_) :
-                       table_index (table_index_),
-                       font (font_), face (font->face), buffer (buffer_),
-                       direction (buffer_->props.direction),
-                       lookup_mask (1),
-                       auto_zwj (true),
-                       recurse_func (NULL),
-                       nesting_level_left (MAX_NESTING_LEVEL),
-                       lookup_props (0),
-                       gdef (*hb_ot_layout_from_face (face)->gdef),
-                       has_glyph_classes (gdef.has_glyph_classes ()),
-                       debug_depth (0) {}
-
-  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_recurse_func (recurse_func_t func) { recurse_func = func; }
-  inline void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
-  inline void set_lookup (const Lookup &l) { lookup_props = l.get_props (); }
-
   struct matcher_t
   {
     inline matcher_t (void) :
   struct matcher_t
   {
     inline matcher_t (void) :
@@ -371,29 +345,24 @@ struct hb_apply_context_t
     const void *match_data;
   };
 
     const void *match_data;
   };
 
-  struct skipping_forward_iterator_t
-  {
-    inline skipping_forward_iterator_t (hb_apply_context_t *c_,
-                                       unsigned int start_index_,
-                                       unsigned int num_items_,
-                                       bool context_match = false) :
-                                        idx (start_index_),
-                                        c (c_),
-                                        match_glyph_data (NULL),
-                                        num_items (num_items_),
-                                        end (c->buffer->len)
+  struct skipping_iterator_t
+  {
+    inline void init (hb_apply_context_t *c_, bool context_match = false)
     {
     {
+      c = c_;
+      match_glyph_data = NULL,
+      matcher.set_match_func (NULL, NULL);
       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);
       /* 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_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);
       /* 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);
-      if (!context_match)
-       matcher.set_mask (c->lookup_mask);
-      matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
+      matcher.set_mask (context_match ? -1 : c->lookup_mask);
+    }
+    inline void set_lookup_props (unsigned int lookup_props)
+    {
+      matcher.set_lookup_props (lookup_props);
     }
     }
-    inline void set_lookup_props (unsigned int lookup_props) { matcher.set_lookup_props (lookup_props); }
-    inline void set_syllable (unsigned int syllable) { matcher.set_syllable (syllable); }
     inline void set_match_func (matcher_t::match_func_t match_func,
                                const void *match_data,
                                const USHORT glyph_data[])
     inline void set_match_func (matcher_t::match_func_t match_func,
                                const void *match_data,
                                const USHORT glyph_data[])
@@ -402,12 +371,21 @@ struct hb_apply_context_t
       match_glyph_data = glyph_data;
     }
 
       match_glyph_data = glyph_data;
     }
 
-    inline bool has_no_chance (void) const { return unlikely (num_items && idx + num_items >= end); }
+    inline void reset (unsigned int start_index_,
+                      unsigned int num_items_)
+    {
+      idx = start_index_;
+      num_items = num_items_;
+      end = c->buffer->len;
+      matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
+    }
+
     inline void reject (void) { num_items++; match_glyph_data--; }
     inline void reject (void) { num_items++; match_glyph_data--; }
+
     inline bool next (void)
     {
       assert (num_items > 0);
     inline bool next (void)
     {
       assert (num_items > 0);
-      while (!has_no_chance ())
+      while (idx + num_items < end)
       {
        idx++;
        const hb_glyph_info_t &info = c->buffer->info[idx];
       {
        idx++;
        const hb_glyph_info_t &info = c->buffer->info[idx];
@@ -431,53 +409,10 @@ struct hb_apply_context_t
       }
       return false;
     }
       }
       return false;
     }
-
-    unsigned int idx;
-    protected:
-    hb_apply_context_t *c;
-    matcher_t matcher;
-    const USHORT *match_glyph_data;
-
-    unsigned int num_items;
-    unsigned int end;
-  };
-
-  struct skipping_backward_iterator_t
-  {
-    inline skipping_backward_iterator_t (hb_apply_context_t *c_,
-                                        unsigned int start_index_,
-                                        unsigned int num_items_,
-                                        bool context_match = false) :
-                                         idx (start_index_),
-                                         c (c_),
-                                         match_glyph_data (NULL),
-                                         num_items (num_items_)
-    {
-      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);
-      /* 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);
-      if (!context_match)
-       matcher.set_mask (c->lookup_mask);
-      matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0);
-    }
-    inline void set_lookup_props (unsigned int lookup_props) { matcher.set_lookup_props (lookup_props); }
-    inline void set_syllable (unsigned int syllable) { matcher.set_syllable (syllable); }
-    inline void set_match_func (matcher_t::match_func_t match_func,
-                               const void *match_data,
-                               const USHORT glyph_data[])
-    {
-      matcher.set_match_func (match_func, match_data);
-      match_glyph_data = glyph_data;
-    }
-
-    inline bool has_no_chance (void) const { return unlikely (idx < num_items); }
-    inline void reject (void) { num_items++; }
     inline bool prev (void)
     {
       assert (num_items > 0);
     inline bool prev (void)
     {
       assert (num_items > 0);
-      while (!has_no_chance ())
+      while (idx >= num_items)
       {
        idx--;
        const hb_glyph_info_t &info = c->buffer->out_info[idx];
       {
        idx--;
        const hb_glyph_info_t &info = c->buffer->out_info[idx];
@@ -509,8 +444,75 @@ struct hb_apply_context_t
     const USHORT *match_glyph_data;
 
     unsigned int num_items;
     const USHORT *match_glyph_data;
 
     unsigned int num_items;
+    unsigned int end;
   };
 
   };
 
+
+  inline const char *get_name (void) { return "APPLY"; }
+  static const unsigned int max_debug_depth = HB_DEBUG_APPLY;
+  typedef bool return_t;
+  typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
+  template <typename T, typename F>
+  inline bool may_dispatch (const T *obj, const F *format) { return true; }
+  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)
+  {
+    if (unlikely (nesting_level_left == 0 || !recurse_func))
+      return default_return_value ();
+
+    nesting_level_left--;
+    bool ret = recurse_func (this, lookup_index);
+    nesting_level_left++;
+    return ret;
+  }
+
+  unsigned int table_index; /* GSUB/GPOS */
+  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;
+  unsigned int nesting_level_left;
+  unsigned int lookup_props;
+  const GDEF &gdef;
+  bool has_glyph_classes;
+  skipping_iterator_t iter_input, iter_context;
+  unsigned int debug_depth;
+
+
+  hb_apply_context_t (unsigned int table_index_,
+                     hb_font_t *font_,
+                     hb_buffer_t *buffer_) :
+                       table_index (table_index_),
+                       font (font_), face (font->face), buffer (buffer_),
+                       direction (buffer_->props.direction),
+                       lookup_mask (1),
+                       auto_zwj (true),
+                       recurse_func (NULL),
+                       nesting_level_left (MAX_NESTING_LEVEL),
+                       lookup_props (0),
+                       gdef (*hb_ot_layout_from_face (face)->gdef),
+                       has_glyph_classes (gdef.has_glyph_classes ()),
+                       iter_input (),
+                       iter_context (),
+                       debug_depth (0) {}
+
+  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_recurse_func (recurse_func_t func) { recurse_func = func; }
+  inline void set_lookup (const Lookup &l) { set_lookup_props (l.get_props ()); }
+  inline void set_lookup_props (unsigned int lookup_props_)
+  {
+    lookup_props = lookup_props_;
+    iter_input.init (this, false);
+    iter_context.init (this, true);
+  }
+
   inline bool
   match_properties_mark (hb_codepoint_t  glyph,
                         unsigned int    glyph_props,
   inline bool
   match_properties_mark (hb_codepoint_t  glyph,
                         unsigned int    glyph_props,
@@ -722,9 +724,9 @@ static inline bool match_input (hb_apply_context_t *c,
 
   hb_buffer_t *buffer = c->buffer;
 
 
   hb_buffer_t *buffer = c->buffer;
 
-  hb_apply_context_t::skipping_forward_iterator_t skippy_iter (c, buffer->idx, count - 1);
+  hb_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.set_match_func (match_func, match_data, input);
-  if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
 
   /*
    * This is perhaps the trickiest part of OpenType...  Remarks:
 
   /*
    * This is perhaps the trickiest part of OpenType...  Remarks:
@@ -891,9 +893,9 @@ static inline bool match_backtrack (hb_apply_context_t *c,
 {
   TRACE_APPLY (NULL);
 
 {
   TRACE_APPLY (NULL);
 
-  hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, c->buffer->backtrack_len (), count, true);
+  hb_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.set_match_func (match_func, match_data, backtrack);
-  if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
 
   for (unsigned int i = 0; i < count; i++)
     if (!skippy_iter.prev ())
 
   for (unsigned int i = 0; i < count; i++)
     if (!skippy_iter.prev ())
@@ -911,9 +913,9 @@ static inline bool match_lookahead (hb_apply_context_t *c,
 {
   TRACE_APPLY (NULL);
 
 {
   TRACE_APPLY (NULL);
 
-  hb_apply_context_t::skipping_forward_iterator_t skippy_iter (c, c->buffer->idx + offset - 1, count, true);
+  hb_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.set_match_func (match_func, match_data, lookahead);
-  if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
 
   for (unsigned int i = 0; i < count; i++)
     if (!skippy_iter.next ())
 
   for (unsigned int i = 0; i < count; i++)
     if (!skippy_iter.next ())
@@ -926,7 +928,8 @@ static inline bool match_lookahead (hb_apply_context_t *c,
 
 struct LookupRecord
 {
 
 struct LookupRecord
 {
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this));
   }
@@ -1117,9 +1120,9 @@ struct Rule
   inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
   {
     TRACE_CLOSURE (this);
   inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
   {
     TRACE_CLOSURE (this);
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
     context_closure_lookup (c,
     context_closure_lookup (c,
-                           inputCount, input,
+                           inputCount, inputZ,
                            lookupCount, lookupRecord,
                            lookup_context);
   }
                            lookupCount, lookupRecord,
                            lookup_context);
   }
@@ -1127,9 +1130,9 @@ struct Rule
   inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
   {
     TRACE_COLLECT_GLYPHS (this);
   inline void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const
   {
     TRACE_COLLECT_GLYPHS (this);
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
     context_collect_glyphs_lookup (c,
     context_collect_glyphs_lookup (c,
-                                  inputCount, input,
+                                  inputCount, inputZ,
                                   lookupCount, lookupRecord,
                                   lookup_context);
   }
                                   lookupCount, lookupRecord,
                                   lookup_context);
   }
@@ -1137,24 +1140,25 @@ struct Rule
   inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_WOULD_APPLY (this);
   inline bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_WOULD_APPLY (this);
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
-    return TRACE_RETURN (context_would_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context));
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
+    return TRACE_RETURN (context_would_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context));
   }
 
   inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
   }
 
   inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const
   {
     TRACE_APPLY (this);
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (input, input[0].static_size * (inputCount ? inputCount - 1 : 0));
-    return TRACE_RETURN (context_apply_lookup (c, inputCount, input, lookupCount, lookupRecord, lookup_context));
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0));
+    return TRACE_RETURN (context_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context));
   }
 
   public:
   }
 
   public:
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return inputCount.sanitize (c)
        && lookupCount.sanitize (c)
     TRACE_SANITIZE (this);
     return inputCount.sanitize (c)
        && lookupCount.sanitize (c)
-       && c->check_range (input,
-                          input[0].static_size * inputCount
+       && c->check_range (inputZ,
+                          inputZ[0].static_size * inputCount
                           + lookupRecordX[0].static_size * lookupCount);
   }
 
                           + lookupRecordX[0].static_size * lookupCount);
   }
 
@@ -1163,12 +1167,12 @@ struct Rule
                                         * glyph sequence--includes the first
                                         * glyph */
   USHORT       lookupCount;            /* Number of LookupRecords */
                                         * glyph sequence--includes the first
                                         * glyph */
   USHORT       lookupCount;            /* Number of LookupRecords */
-  USHORT       input[VAR];             /* Array of match inputs--start with
+  USHORT       inputZ[VAR];            /* Array of match inputs--start with
                                         * second glyph */
   LookupRecord lookupRecordX[VAR];     /* Array of LookupRecords--in
                                         * design order */
   public:
                                         * second glyph */
   LookupRecord lookupRecordX[VAR];     /* Array of LookupRecords--in
                                         * design order */
   public:
-  DEFINE_SIZE_ARRAY2 (4, input, lookupRecordX);
+  DEFINE_SIZE_ARRAY2 (4, inputZ, lookupRecordX);
 };
 
 struct RuleSet
 };
 
 struct RuleSet
@@ -1213,7 +1217,8 @@ struct RuleSet
     return TRACE_RETURN (false);
   }
 
     return TRACE_RETURN (false);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rule.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rule.sanitize (c, this));
   }
@@ -1295,7 +1300,8 @@ struct ContextFormat1
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
   }
@@ -1387,7 +1393,8 @@ struct ContextFormat2
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && classDef.sanitize (c, this) && ruleSet.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && classDef.sanitize (c, this) && ruleSet.sanitize (c, this));
   }
@@ -1413,16 +1420,16 @@ struct ContextFormat3
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE (this);
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE (this);
-    if (!(this+coverage[0]).intersects (c->glyphs))
+    if (!(this+coverageZ[0]).intersects (c->glyphs))
       return;
 
       return;
 
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
     struct ContextClosureLookupContext lookup_context = {
       {intersects_coverage},
       this
     };
     context_closure_lookup (c,
     struct ContextClosureLookupContext lookup_context = {
       {intersects_coverage},
       this
     };
     context_closure_lookup (c,
-                           glyphCount, (const USHORT *) (coverage + 1),
+                           glyphCount, (const USHORT *) (coverageZ + 1),
                            lookupCount, lookupRecord,
                            lookup_context);
   }
                            lookupCount, lookupRecord,
                            lookup_context);
   }
@@ -1430,16 +1437,16 @@ struct ContextFormat3
   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[0]).add_coverage (c->input);
+    (this+coverageZ[0]).add_coverage (c->input);
 
 
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
     struct ContextCollectGlyphsLookupContext lookup_context = {
       {collect_coverage},
       this
     };
 
     context_collect_glyphs_lookup (c,
     struct ContextCollectGlyphsLookupContext lookup_context = {
       {collect_coverage},
       this
     };
 
     context_collect_glyphs_lookup (c,
-                                  glyphCount, (const USHORT *) (coverage + 1),
+                                  glyphCount, (const USHORT *) (coverageZ + 1),
                                   lookupCount, lookupRecord,
                                   lookup_context);
   }
                                   lookupCount, lookupRecord,
                                   lookup_context);
   }
@@ -1448,41 +1455,43 @@ struct ContextFormat3
   {
     TRACE_WOULD_APPLY (this);
 
   {
     TRACE_WOULD_APPLY (this);
 
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
     struct ContextApplyLookupContext lookup_context = {
       {match_coverage},
       this
     };
     struct ContextApplyLookupContext lookup_context = {
       {match_coverage},
       this
     };
-    return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
+    return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
   }
 
   inline const Coverage &get_coverage (void) const
   {
   }
 
   inline const Coverage &get_coverage (void) const
   {
-    return this+coverage[0];
+    return this+coverageZ[0];
   }
 
   inline bool apply (hb_apply_context_t *c) const
   {
     TRACE_APPLY (this);
   }
 
   inline bool apply (hb_apply_context_t *c) const
   {
     TRACE_APPLY (this);
-    unsigned int index = (this+coverage[0]).get_coverage (c->buffer->cur().codepoint);
+    unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
 
     if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
 
-    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * glyphCount);
     struct ContextApplyLookupContext lookup_context = {
       {match_coverage},
       this
     };
     struct ContextApplyLookupContext lookup_context = {
       {match_coverage},
       this
     };
-    return TRACE_RETURN (context_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
+    return TRACE_RETURN (context_apply_lookup (c, glyphCount, (const USHORT *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context));
   }
 
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!c->check_struct (this)) return TRACE_RETURN (false);
     unsigned int count = glyphCount;
     TRACE_SANITIZE (this);
     if (!c->check_struct (this)) return TRACE_RETURN (false);
     unsigned int count = glyphCount;
-    if (!c->check_array (coverage, coverage[0].static_size, count)) return TRACE_RETURN (false);
+    if (!count) return TRACE_RETURN (false); /* We want to access coverageZ[0] freely. */
+    if (!c->check_array (coverageZ, coverageZ[0].static_size, count)) return TRACE_RETURN (false);
     for (unsigned int i = 0; i < count; i++)
     for (unsigned int i = 0; i < count; i++)
-      if (!coverage[i].sanitize (c, this)) return TRACE_RETURN (false);
-    LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * count);
+      if (!coverageZ[i].sanitize (c, this)) return TRACE_RETURN (false);
+    const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverageZ, coverageZ[0].static_size * count);
     return TRACE_RETURN (c->check_array (lookupRecord, lookupRecord[0].static_size, lookupCount));
   }
 
     return TRACE_RETURN (c->check_array (lookupRecord, lookupRecord[0].static_size, lookupCount));
   }
 
@@ -1492,12 +1501,12 @@ struct ContextFormat3
                                         * sequence */
   USHORT       lookupCount;            /* Number of LookupRecords */
   OffsetTo<Coverage>
                                         * sequence */
   USHORT       lookupCount;            /* Number of LookupRecords */
   OffsetTo<Coverage>
-               coverage[VAR];          /* Array of offsets to Coverage
+               coverageZ[VAR];         /* Array of offsets to Coverage
                                         * table in glyph sequence order */
   LookupRecord lookupRecordX[VAR];     /* Array of LookupRecords--in
                                         * design order */
   public:
                                         * table in glyph sequence order */
   LookupRecord lookupRecordX[VAR];     /* Array of LookupRecords--in
                                         * design order */
   public:
-  DEFINE_SIZE_ARRAY2 (6, coverage, lookupRecordX);
+  DEFINE_SIZE_ARRAY2 (6, coverageZ, lookupRecordX);
 };
 
 struct Context
 };
 
 struct Context
@@ -1505,7 +1514,8 @@ struct Context
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
@@ -1514,17 +1524,6 @@ struct Context
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    case 2: return TRACE_RETURN (u.format2.sanitize (c));
-    case 3: return TRACE_RETURN (u.format3.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
@@ -1706,14 +1705,15 @@ struct ChainRule
                                                     lookup.array, lookup_context));
   }
 
                                                     lookup.array, lookup_context));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c)) return TRACE_RETURN (false);
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c)) return TRACE_RETURN (false);
-    HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
+    const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
     if (!input.sanitize (c)) return TRACE_RETURN (false);
     if (!input.sanitize (c)) return TRACE_RETURN (false);
-    ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
+    const ArrayOf<USHORT> &lookahead = StructAfter<ArrayOf<USHORT> > (input);
     if (!lookahead.sanitize (c)) return TRACE_RETURN (false);
     if (!lookahead.sanitize (c)) return TRACE_RETURN (false);
-    ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return TRACE_RETURN (lookup.sanitize (c));
   }
 
     return TRACE_RETURN (lookup.sanitize (c));
   }
 
@@ -1775,7 +1775,8 @@ struct ChainRuleSet
     return TRACE_RETURN (false);
   }
 
     return TRACE_RETURN (false);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rule.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (rule.sanitize (c, this));
   }
@@ -1854,7 +1855,8 @@ struct ChainContextFormat1
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && ruleSet.sanitize (c, this));
   }
@@ -1964,7 +1966,8 @@ struct ChainContextFormat2
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
     return TRACE_RETURN (rule_set.apply (c, lookup_context));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && backtrackClassDef.sanitize (c, this) &&
                         inputClassDef.sanitize (c, this) && lookaheadClassDef.sanitize (c, this) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (coverage.sanitize (c, this) && backtrackClassDef.sanitize (c, this) &&
                         inputClassDef.sanitize (c, this) && lookaheadClassDef.sanitize (c, this) &&
@@ -2085,14 +2088,16 @@ struct ChainContextFormat3
                                                     lookup.len, lookup.array, lookup_context));
   }
 
                                                     lookup.len, lookup.array, lookup_context));
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c, this)) return TRACE_RETURN (false);
     TRACE_SANITIZE (this);
     if (!backtrack.sanitize (c, this)) return TRACE_RETURN (false);
-    OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
     if (!input.sanitize (c, this)) return TRACE_RETURN (false);
     if (!input.sanitize (c, this)) return TRACE_RETURN (false);
-    OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
+    if (!input.len) return TRACE_RETURN (false); /* To be consistent with Context. */
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
     if (!lookahead.sanitize (c, this)) return TRACE_RETURN (false);
     if (!lookahead.sanitize (c, this)) return TRACE_RETURN (false);
-    ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return TRACE_RETURN (lookup.sanitize (c));
   }
 
     return TRACE_RETURN (lookup.sanitize (c));
   }
 
@@ -2122,7 +2127,8 @@ struct ChainContext
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    TRACE_DISPATCH (this);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
     switch (u.format) {
     case 1: return TRACE_RETURN (c->dispatch (u.format1));
     case 2: return TRACE_RETURN (c->dispatch (u.format2));
@@ -2131,17 +2137,6 @@ struct ChainContext
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
-    switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    case 2: return TRACE_RETURN (u.format2.sanitize (c));
-    case 3: return TRACE_RETURN (u.format3.sanitize (c));
-    default:return TRACE_RETURN (true);
-    }
-  }
-
   protected:
   union {
   USHORT               format; /* Format identifier */
   protected:
   union {
   USHORT               format; /* Format identifier */
@@ -2152,14 +2147,32 @@ struct ChainContext
 };
 
 
 };
 
 
+template <typename T>
 struct ExtensionFormat1
 {
   inline unsigned int get_type (void) const { return extensionLookupType; }
 struct ExtensionFormat1
 {
   inline unsigned int get_type (void) const { return extensionLookupType; }
-  inline unsigned int get_offset (void) const { return extensionOffset; }
 
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  template <typename X>
+  inline const X& get_subtable (void) const
+  {
+    unsigned int offset = extensionOffset;
+    if (unlikely (!offset)) return Null(typename T::LookupSubTable);
+    return StructAtOffset<typename T::LookupSubTable> (this, offset);
+  }
+
+  template <typename context_t>
+  inline typename context_t::return_t dispatch (context_t *c) const
+  {
+    TRACE_DISPATCH (this, format);
+    if (unlikely (!c->may_dispatch (this, this))) TRACE_RETURN (c->default_return_value ());
+    return get_subtable<typename T::LookupSubTable> ().dispatch (c, get_type ());
+  }
+
+  /* This is called from may_dispatch() above with hb_sanitize_context_t. */
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     TRACE_SANITIZE (this);
-    return TRACE_RETURN (c->check_struct (this));
+    return TRACE_RETURN (c->check_struct (this) && extensionOffset != 0);
   }
 
   protected:
   }
 
   protected:
@@ -2183,49 +2196,30 @@ struct Extension
     default:return 0;
     }
   }
     default:return 0;
     }
   }
-  inline unsigned int get_offset (void) const
-  {
-    switch (u.format) {
-    case 1: return u.format1.get_offset ();
-    default:return 0;
-    }
-  }
-
   template <typename X>
   inline const X& get_subtable (void) const
   {
   template <typename X>
   inline const X& get_subtable (void) const
   {
-    unsigned int offset = get_offset ();
-    if (unlikely (!offset)) return Null(typename T::LookupSubTable);
-    return StructAtOffset<typename T::LookupSubTable> (this, offset);
+    switch (u.format) {
+    case 1: return u.format1.template get_subtable<typename T::LookupSubTable> ();
+    default:return Null(typename T::LookupSubTable);
+    }
   }
 
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
   }
 
   template <typename context_t>
   inline typename context_t::return_t dispatch (context_t *c) const
   {
-    return get_subtable<typename T::LookupSubTable> ().dispatch (c, get_type ());
-  }
-
-  inline bool sanitize_self (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
+    TRACE_DISPATCH (this, u.format);
+    if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_return_value ());
     switch (u.format) {
     switch (u.format) {
-    case 1: return TRACE_RETURN (u.format1.sanitize (c));
-    default:return TRACE_RETURN (true);
+    case 1: return TRACE_RETURN (u.format1.dispatch (c));
+    default:return TRACE_RETURN (c->default_return_value ());
     }
   }
 
     }
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE (this);
-    if (!sanitize_self (c)) return TRACE_RETURN (false);
-    unsigned int offset = get_offset ();
-    if (unlikely (!offset)) return TRACE_RETURN (true);
-    return TRACE_RETURN (StructAtOffset<typename T::LookupSubTable> (this, offset).sanitize (c, get_type ()));
-  }
-
   protected:
   union {
   USHORT               format;         /* Format identifier */
   protected:
   union {
   USHORT               format;         /* Format identifier */
-  ExtensionFormat1     format1;
+  ExtensionFormat1<T>  format1;
   } u;
 };
 
   } u;
 };
 
@@ -2270,7 +2264,8 @@ struct GSUBGPOS
   inline const Lookup& get_lookup (unsigned int i) const
   { return (this+lookupList)[i]; }
 
   inline const Lookup& get_lookup (unsigned int i) const
   { return (this+lookupList)[i]; }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (version.sanitize (c) && likely (version.major == 1) &&
                         scriptList.sanitize (c, this) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (version.sanitize (c) && likely (version.major == 1) &&
                         scriptList.sanitize (c, this) &&
index 67a6df5..739dfd9 100644 (file)
@@ -54,7 +54,8 @@ typedef OffsetListOf<PosLookup> JstfMax;
 
 struct JstfPriority
 {
 
 struct JstfPriority
 {
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         shrinkageEnableGSUB.sanitize (c, this) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         shrinkageEnableGSUB.sanitize (c, this) &&
@@ -123,7 +124,8 @@ 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 Record<JstfLangSys>::sanitize_closure_t * = NULL) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (OffsetListOf<JstfPriority>::sanitize (c));
   }
     TRACE_SANITIZE (this);
     return TRACE_RETURN (OffsetListOf<JstfPriority>::sanitize (c));
   }
@@ -163,7 +165,8 @@ 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 Record<JstfScript>::sanitize_closure_t * = NULL) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (extenderGlyphs.sanitize (c, this) &&
                         defaultLangSys.sanitize (c, this) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (extenderGlyphs.sanitize (c, this) &&
                         defaultLangSys.sanitize (c, this) &&
@@ -206,7 +209,8 @@ struct JSTF
   inline bool find_script_index (hb_tag_t tag, unsigned int *index) const
   { return scriptList.find_index (tag, index); }
 
   inline bool find_script_index (hb_tag_t tag, unsigned int *index) const
   { return scriptList.find_index (tag, index); }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (version.sanitize (c) && likely (version.major == 1) &&
                         scriptList.sanitize (c, this));
     TRACE_SANITIZE (this);
     return TRACE_RETURN (version.sanitize (c) && likely (version.major == 1) &&
                         scriptList.sanitize (c, this));
index ae7daa6..47fecd2 100644 (file)
@@ -126,11 +126,15 @@ struct hb_ot_layout_lookup_accelerator_t
     lookup.add_coverage (&digest);
   }
 
     lookup.add_coverage (&digest);
   }
 
-  template <typename TLookup>
-  inline void fini (const TLookup &lookup HB_UNUSED)
+  inline void fini (void)
   {
   }
 
   {
   }
 
+  inline bool may_have (hb_codepoint_t g) const {
+    return digest.may_have (g);
+  }
+
+  private:
   hb_set_digest_t digest;
 };
 
   hb_set_digest_t digest;
 };
 
index 661d90e..b1e69e8 100644 (file)
@@ -84,9 +84,9 @@ void
 _hb_ot_layout_destroy (hb_ot_layout_t *layout)
 {
   for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
 _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 (layout->gsub->get_lookup (i));
+    layout->gsub_accels[i].fini ();
   for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
   for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
-    layout->gpos_accels[i].fini (layout->gpos->get_lookup (i));
+    layout->gpos_accels[i].fini ();
 
   free (layout->gsub_accels);
   free (layout->gpos_accels);
 
   free (layout->gsub_accels);
   free (layout->gpos_accels);
@@ -699,7 +699,7 @@ hb_ot_layout_lookup_would_substitute_fast (hb_face_t            *face,
 
   const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
 
 
   const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
 
-  return l.would_apply (&c, &hb_ot_layout_from_face (face)->gsub_accels[lookup_index].digest);
+  return l.would_apply (&c, &hb_ot_layout_from_face (face)->gsub_accels[lookup_index]);
 }
 
 void
 }
 
 void
@@ -829,26 +829,83 @@ struct GPOSProxy
 };
 
 
 };
 
 
-template <typename Lookup>
-static inline bool apply_once (OT::hb_apply_context_t *c,
-                              const Lookup &lookup)
+template <typename Obj>
+static inline bool
+apply_forward (OT::hb_apply_context_t *c,
+              const Obj &obj,
+              const hb_ot_layout_lookup_accelerator_t &accel)
 {
 {
-  if (!c->check_glyph_property (&c->buffer->cur(), c->lookup_props))
-    return false;
-  return lookup.dispatch (c);
+  bool ret = false;
+  hb_buffer_t *buffer = c->buffer;
+  while (buffer->idx < buffer->len)
+  {
+    if (accel.may_have (buffer->cur().codepoint) &&
+       (buffer->cur().mask & c->lookup_mask) &&
+       c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
+       obj.apply (c))
+      ret = true;
+    else
+      buffer->next_glyph ();
+  }
+  return ret;
 }
 
 }
 
-template <typename Proxy>
+template <typename Obj>
 static inline bool
 static inline bool
+apply_backward (OT::hb_apply_context_t *c,
+               const Obj &obj,
+               const hb_ot_layout_lookup_accelerator_t &accel)
+{
+  bool ret = false;
+  hb_buffer_t *buffer = c->buffer;
+  do
+  {
+    if (accel.may_have (buffer->cur().codepoint) &&
+       (buffer->cur().mask & c->lookup_mask) &&
+       c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
+       obj.apply (c))
+      ret = true;
+    /* The reverse lookup doesn't "advance" cursor (for good reason). */
+    buffer->idx--;
+
+  }
+  while ((int) buffer->idx >= 0);
+  return ret;
+}
+
+struct hb_apply_forward_context_t
+{
+  inline const char *get_name (void) { return "APPLY_FORWARD"; }
+  static const unsigned int max_debug_depth = HB_DEBUG_APPLY;
+  typedef bool return_t;
+  template <typename T, typename F>
+  inline bool may_dispatch (const T *obj, const F *format) { return true; }
+  template <typename T>
+  inline return_t dispatch (const T &obj) { return apply_forward (c, obj, accel); }
+  static return_t default_return_value (void) { return false; }
+  bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return true; }
+
+  hb_apply_forward_context_t (OT::hb_apply_context_t *c_,
+                             const hb_ot_layout_lookup_accelerator_t &accel_) :
+                               c (c_),
+                               accel (accel_),
+                               debug_depth (0) {}
+
+  OT::hb_apply_context_t *c;
+  const hb_ot_layout_lookup_accelerator_t &accel;
+  unsigned int debug_depth;
+};
+
+template <typename Proxy>
+static inline void
 apply_string (OT::hb_apply_context_t *c,
              const typename Proxy::Lookup &lookup,
              const hb_ot_layout_lookup_accelerator_t &accel)
 {
 apply_string (OT::hb_apply_context_t *c,
              const typename Proxy::Lookup &lookup,
              const hb_ot_layout_lookup_accelerator_t &accel)
 {
-  bool ret = false;
   hb_buffer_t *buffer = c->buffer;
 
   if (unlikely (!buffer->len || !c->lookup_mask))
   hb_buffer_t *buffer = c->buffer;
 
   if (unlikely (!buffer->len || !c->lookup_mask))
-    return false;
+    return;
 
   c->set_lookup (lookup);
 
 
   c->set_lookup (lookup);
 
@@ -859,21 +916,20 @@ apply_string (OT::hb_apply_context_t *c,
       buffer->clear_output ();
     buffer->idx = 0;
 
       buffer->clear_output ();
     buffer->idx = 0;
 
-    while (buffer->idx < buffer->len)
+    bool ret;
+    if (lookup.get_subtable_count () == 1)
     {
     {
-      if (accel.digest.may_have (buffer->cur().codepoint) &&
-         (buffer->cur().mask & c->lookup_mask) &&
-         apply_once (c, lookup))
-       ret = true;
-      else
-       buffer->next_glyph ();
+      hb_apply_forward_context_t c_forward (c, accel);
+      ret = lookup.dispatch (&c_forward);
     }
     }
+    else
+      ret = apply_forward (c, lookup, accel);
     if (ret)
     {
       if (!Proxy::inplace)
        buffer->swap_buffers ();
       else
     if (ret)
     {
       if (!Proxy::inplace)
        buffer->swap_buffers ();
       else
-        assert (!buffer->has_separate_output ());
+       assert (!buffer->has_separate_output ());
     }
   }
   else
     }
   }
   else
@@ -882,20 +938,9 @@ apply_string (OT::hb_apply_context_t *c,
     if (Proxy::table_index == 0)
       buffer->remove_output ();
     buffer->idx = buffer->len - 1;
     if (Proxy::table_index == 0)
       buffer->remove_output ();
     buffer->idx = buffer->len - 1;
-    do
-    {
-      if (accel.digest.may_have (buffer->cur().codepoint) &&
-         (buffer->cur().mask & c->lookup_mask) &&
-         apply_once (c, lookup))
-       ret = true;
-      /* The reverse lookup doesn't "advance" cursor (for good reason). */
-      buffer->idx--;
 
 
-    }
-    while ((int) buffer->idx >= 0);
+    apply_backward (c, lookup, accel);
   }
   }
-
-  return ret;
 }
 
 template <typename Proxy>
 }
 
 template <typename Proxy>
index b1f8328..0d9a0fa 100644 (file)
@@ -43,11 +43,13 @@ 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 {
+  inline unsigned int get_num_glyphs (void) const
+  {
     return numGlyphs;
   }
 
     return numGlyphs;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         likely (version.major == 1 || (version.major == 0 && version.minor == 0x5000u)));
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         likely (version.major == 1 || (version.major == 0 && version.minor == 0x5000u)));
index 31d9fac..21450c6 100644 (file)
@@ -56,7 +56,8 @@ struct NameRecord
     return 0;
   }
 
     return 0;
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     /* We can check from base all the way up to the end of string... */
     return TRACE_RETURN (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
     TRACE_SANITIZE (this);
     /* We can check from base all the way up to the end of string... */
     return TRACE_RETURN (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset));
@@ -101,7 +102,7 @@ struct name
   inline unsigned int get_size (void) const
   { return min_size + count * nameRecord[0].min_size; }
 
   inline unsigned int get_size (void) const
   { return min_size + count * nameRecord[0].min_size; }
 
-  inline bool sanitize_records (hb_sanitize_context_t *c) {
+  inline bool sanitize_records (hb_sanitize_context_t *c) const {
     TRACE_SANITIZE (this);
     char *string_pool = (char *) this + stringOffset;
     unsigned int _count = count;
     TRACE_SANITIZE (this);
     char *string_pool = (char *) this + stringOffset;
     unsigned int _count = count;
@@ -110,7 +111,8 @@ struct name
     return TRACE_RETURN (true);
   }
 
     return TRACE_RETURN (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) {
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         likely (format == 0 || format == 1) &&
     TRACE_SANITIZE (this);
     return TRACE_RETURN (c->check_struct (this) &&
                         likely (format == 0 || format == 1) &&
index e5b7ed4..a77f24e 100644 (file)
@@ -207,7 +207,7 @@ struct arabic_fallback_plan_t
 
 static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
 
 
 static const arabic_fallback_plan_t arabic_fallback_plan_nil = {};
 
-#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(HB_WITH_WIN1256)
+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(HB_NO_WIN1256)
 #define HB_WITH_WIN1256
 #endif
 
 #define HB_WITH_WIN1256
 #endif
 
@@ -327,7 +327,7 @@ arabic_fallback_plan_destroy (arabic_fallback_plan_t *fallback_plan)
   for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
     if (fallback_plan->lookup_array[i])
     {
   for (unsigned int i = 0; i < fallback_plan->num_lookups; i++)
     if (fallback_plan->lookup_array[i])
     {
-      fallback_plan->accel_array[i].fini (fallback_plan->lookup_array[i]);
+      fallback_plan->accel_array[i].fini ();
       if (fallback_plan->free_lookups)
        free (fallback_plan->lookup_array[i]);
     }
       if (fallback_plan->free_lookups)
        free (fallback_plan->lookup_array[i]);
     }
index 63ed3f8..8edd3ba 100644 (file)
  */
 
 #define OT_LOOKUP_TYPE_SUBST_SINGLE    1u
  */
 
 #define OT_LOOKUP_TYPE_SUBST_SINGLE    1u
-#define OT_LOOKUP_TYPE_SUBST_MULTIPLE  2u
 #define OT_LOOKUP_TYPE_SUBST_LIGATURE  4u
 
 #define OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(Name, FromGlyphs, ToGlyphs) \
 #define OT_LOOKUP_TYPE_SUBST_LIGATURE  4u
 
 #define OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(Name, FromGlyphs, ToGlyphs) \
@@ -313,8 +312,11 @@ OT_TABLE_END
 /*
  * Include a second time to get the table data...
  */
 /*
  * Include a second time to get the table data...
  */
+#if 0
+#include "hb-private.hh" /* Make check-includes.sh happy. */
+#endif
 #ifdef OT_MEASURE
 #ifdef OT_MEASURE
-#include __FILE__
+#include "hb-ot-shape-complex-arabic-win1256.hh"
 #endif
 
 #define HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH
 #endif
 
 #define HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH
index 5fbdcc8..f652d4f 100644 (file)
@@ -1,5 +1,5 @@
 
 
-#line 1 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 1 "hb-ot-shape-complex-indic-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-indic-machine.hh.tmp"
+#line 36 "hb-ot-shape-complex-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
-       1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 
-       5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 4u, 4u, 6u, 6u, 
-       16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 
-       6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-       4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, 
-       7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 
-       5u, 7u, 7u, 7u, 4u, 4u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 
-       4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 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, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-       1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 
-       5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 4u, 4u, 6u, 6u, 
-       16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 
-       6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 
-       4u, 14u, 4u, 14u, 4u, 14u, 1u, 16u, 13u, 13u, 5u, 7u, 5u, 7u, 7u, 7u, 
-       5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 
-       7u, 7u, 4u, 4u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 
-       6u, 6u, 16u, 16u, 4u, 7u, 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, 
-       4u, 14u, 5u, 7u, 5u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 5u, 7u, 5u, 7u, 
-       7u, 7u, 5u, 7u, 5u, 7u, 7u, 7u, 1u, 16u, 13u, 13u, 4u, 4u, 6u, 6u, 
-       16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 6u, 6u, 16u, 16u, 4u, 7u, 
-       6u, 6u, 16u, 16u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
+       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, 
+       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, 
+       4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 
+       16u, 16u, 8u, 8u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-       3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, 
+       3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 
        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
-       3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
+       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, 
        3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-       6u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
+       5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-       3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, 
+       3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 
        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
-       3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
+       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, 
        3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-       6u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
+       5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 
        4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 
        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 
        4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 
-       4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, 5u, 10u, 
+       4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u, 
        9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 
        9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 
-       8u, 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, 6u, 14u, 
+       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, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
        3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 
-       3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 8u, 14u, 
+       3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 
        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 
-       3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 
+       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, 
        3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 
-       6u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
+       5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 
        1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 
-       1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 1u, 16u, 3u, 31u, 
-       3u, 31u, 4u, 31u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 
-       5u, 10u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 
-       4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 8u, 14u, 
-       3u, 13u, 3u, 10u, 8u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 8u, 10u, 
+       1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 5u, 10u, 9u, 10u, 
+       9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 3u, 31u, 3u, 31u, 
+       4u, 31u, 3u, 31u, 3u, 31u, 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
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
        5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0
 };
 
 static const char _indic_syllable_machine_key_spans[] = {
-       16, 1, 3, 3, 1, 3, 3, 1, 
-       3, 3, 1, 3, 3, 1, 1, 1, 
-       1, 4, 1, 1, 4, 1, 1, 4, 
-       1, 1, 11, 11, 11, 11, 11, 11, 
-       11, 11, 11, 11, 16, 1, 3, 3, 
-       1, 3, 3, 1, 3, 3, 1, 3, 
-       3, 1, 1, 1, 1, 4, 1, 1, 
-       4, 1, 1, 4, 1, 1, 11, 11, 
-       11, 11, 11, 11, 11, 11, 11, 11, 
-       16, 1, 3, 3, 1, 3, 3, 1, 
-       3, 3, 1, 3, 3, 1, 1, 1, 
-       1, 4, 1, 1, 4, 1, 1, 4, 
-       1, 1, 11, 11, 11, 11, 11, 11, 
-       11, 11, 11, 16, 1, 3, 3, 1, 
-       3, 3, 1, 3, 3, 1, 3, 3, 
-       1, 1, 1, 1, 4, 1, 1, 4, 
-       1, 1, 4, 1, 1, 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, 11, 11, 11, 11, 11, 11, 11, 
-       11, 3, 3, 3, 3, 1, 3, 3, 
-       1, 3, 3, 1, 16, 1, 1, 1, 
-       1, 4, 1, 1, 4, 1, 1, 4, 
+       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, 
+       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, 
+       5, 1, 1, 5, 1, 1, 5, 1, 
        1, 1, 31, 29, 29, 28, 16, 29, 
        29, 28, 16, 29, 29, 28, 16, 29, 
        1, 1, 31, 29, 29, 28, 16, 29, 
        29, 28, 16, 29, 29, 28, 16, 29, 
-       29, 28, 16, 29, 29, 28, 10, 7
+       29, 28, 16, 29, 29, 28, 10, 10
        6, 2, 1, 2, 2, 1, 6, 11, 
        6, 2, 1, 2, 2, 1, 6, 11, 
-       8, 3, 8, 11, 12, 12, 11, 10, 
+       8, 6, 8, 11, 12, 12, 11, 10, 
        12, 11, 10, 12, 11, 10, 12, 11, 
        12, 11, 10, 12, 11, 10, 12, 11, 
-       9, 12, 16, 28, 11, 29, 29, 16, 
+       10, 12, 16, 28, 11, 29, 29, 16, 
        16, 16, 16, 16, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
        16, 29, 29, 29, 29, 28, 16, 29, 
        29, 28, 16, 29, 29, 28, 16, 29, 
        16, 16, 16, 16, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
        16, 29, 29, 29, 29, 28, 16, 29, 
        29, 28, 16, 29, 29, 28, 16, 29, 
-       29, 28, 16, 29, 29, 28, 10, 7
+       29, 28, 16, 29, 29, 28, 10, 10
        6, 2, 1, 2, 2, 1, 6, 11, 
        6, 2, 1, 2, 2, 1, 6, 11, 
-       8, 3, 8, 11, 12, 12, 11, 10, 
+       8, 6, 8, 11, 12, 12, 11, 10, 
        12, 11, 10, 12, 11, 10, 12, 11, 
        12, 11, 10, 12, 11, 10, 12, 11, 
-       9, 12, 16, 28, 11, 29, 29, 16, 
+       10, 12, 16, 28, 11, 29, 29, 16, 
        16, 16, 16, 16, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
        11, 16, 29, 29, 28, 16, 29, 29, 
        28, 16, 29, 29, 28, 16, 29, 29, 
        16, 16, 16, 16, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
        11, 16, 29, 29, 28, 16, 29, 29, 
        28, 16, 29, 29, 28, 16, 29, 29, 
-       28, 16, 29, 29, 28, 10, 7, 6, 
+       28, 16, 29, 29, 28, 10, 10, 6, 
        2, 1, 2, 2, 1, 6, 11, 8, 
        2, 1, 2, 2, 1, 6, 11, 8, 
-       3, 8, 11, 12, 12, 11, 10, 12, 
-       11, 10, 12, 11, 10, 12, 11, 9
+       6, 8, 11, 12, 12, 11, 10, 12, 
+       11, 10, 12, 11, 10, 12, 11, 10
        12, 16, 28, 11, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
        16, 29, 29, 16, 16, 16, 16, 16, 
        11, 29, 11, 29, 29, 28, 16, 29, 
        29, 28, 16, 29, 29, 28, 16, 29, 
        12, 16, 28, 11, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
        16, 29, 29, 16, 16, 16, 16, 16, 
        11, 29, 11, 29, 29, 28, 16, 29, 
        29, 28, 16, 29, 29, 28, 16, 29, 
-       29, 28, 16, 29, 29, 28, 10, 7
+       29, 28, 16, 29, 29, 28, 10, 10
        6, 2, 1, 2, 2, 1, 6, 11, 
        6, 2, 1, 2, 2, 1, 6, 11, 
-       8, 3, 8, 11, 12, 12, 11, 10, 
+       8, 6, 8, 11, 12, 12, 11, 10, 
        12, 11, 10, 12, 11, 10, 12, 11, 
        12, 11, 10, 12, 11, 10, 12, 11, 
-       9, 12, 16, 28, 11, 29, 29, 16, 
+       10, 12, 16, 28, 11, 29, 29, 16, 
        16, 16, 16, 16, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
        16, 16, 16, 16, 29, 29, 16, 16, 
        16, 16, 16, 29, 29, 16, 16, 16, 
        16, 16, 29, 29, 16, 16, 16, 16, 
-       16, 29, 31, 29, 31, 11, 16, 29
-       29, 28, 6, 2, 1, 2, 2, 1
-       6, 29, 29, 16, 12, 11, 10, 12, 
-       11, 10, 12, 11, 10, 12, 11, 7
-       11, 8, 3, 8, 11, 16, 8, 3
+       16, 29, 31, 29, 31, 11, 6, 2
+       1, 2, 2, 1, 6, 16, 29, 29
+       28, 29, 29, 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
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
        6, 2, 1, 2, 2, 1, 6
 };
 
 static const short _indic_syllable_machine_index_offsets[] = {
-       0, 17, 19, 23, 27, 29, 33, 37, 
-       39, 43, 47, 49, 53, 57, 59, 61, 
-       63, 65, 70, 72, 74, 79, 81, 83, 
-       88, 90, 92, 104, 116, 128, 140, 152, 
-       164, 176, 188, 200, 212, 229, 231, 235, 
-       239, 241, 245, 249, 251, 255, 259, 261, 
-       265, 269, 271, 273, 275, 277, 282, 284, 
-       286, 291, 293, 295, 300, 302, 304, 316, 
-       328, 340, 352, 364, 376, 388, 400, 412, 
-       424, 441, 443, 447, 451, 453, 457, 461, 
-       463, 467, 471, 473, 477, 481, 483, 485, 
-       487, 489, 494, 496, 498, 503, 505, 507, 
-       512, 514, 516, 528, 540, 552, 564, 576, 
-       588, 600, 612, 624, 641, 643, 647, 651, 
-       653, 657, 661, 663, 667, 671, 673, 677, 
-       681, 683, 685, 687, 689, 694, 696, 698, 
-       703, 705, 707, 712, 714, 716, 728, 740, 
-       752, 764, 776, 788, 800, 812, 824, 836, 
-       848, 860, 864, 868, 872, 876, 878, 882, 
-       886, 888, 892, 896, 898, 915, 917, 919, 
-       921, 923, 928, 930, 932, 937, 939, 941, 
-       946, 948, 950, 982, 1012, 1042, 1071, 1088, 
-       1118, 1148, 1177, 1194, 1224, 1254, 1283, 1300, 
-       1330, 1360, 1389, 1406, 1436, 1466, 1495, 1506, 
-       1514, 1521, 1524, 1526, 1529, 1532, 1534, 1541, 
-       1553, 1562, 1566, 1575, 1587, 1600, 1613, 1625, 
-       1636, 1649, 1661, 1672, 1685, 1697, 1708, 1721, 
-       1733, 1743, 1756, 1773, 1802, 1814, 1844, 1874, 
-       1891, 1908, 1925, 1942, 1959, 1989, 2019, 2036, 
-       2053, 2070, 2087, 2104, 2134, 2164, 2181, 2198, 
-       2215, 2232, 2249, 2279, 2309, 2326, 2343, 2360, 
-       2377, 2394, 2424, 2454, 2484, 2514, 2543, 2560, 
-       2590, 2620, 2649, 2666, 2696, 2726, 2755, 2772, 
-       2802, 2832, 2861, 2878, 2908, 2938, 2967, 2978, 
-       2986, 2993, 2996, 2998, 3001, 3004, 3006, 3013, 
-       3025, 3034, 3038, 3047, 3059, 3072, 3085, 3097, 
-       3108, 3121, 3133, 3144, 3157, 3169, 3180, 3193, 
-       3205, 3215, 3228, 3245, 3274, 3286, 3316, 3346, 
-       3363, 3380, 3397, 3414, 3431, 3461, 3491, 3508, 
-       3525, 3542, 3559, 3576, 3606, 3636, 3653, 3670, 
-       3687, 3704, 3721, 3751, 3781, 3798, 3815, 3832, 
-       3849, 3861, 3878, 3908, 3938, 3967, 3984, 4014, 
-       4044, 4073, 4090, 4120, 4150, 4179, 4196, 4226, 
-       4256, 4285, 4302, 4332, 4362, 4391, 4402, 4410, 
-       4417, 4420, 4422, 4425, 4428, 4430, 4437, 4449, 
-       4458, 4462, 4471, 4483, 4496, 4509, 4521, 4532, 
-       4545, 4557, 4568, 4581, 4593, 4604, 4617, 4629, 
-       4639, 4652, 4669, 4698, 4710, 4740, 4770, 4787, 
-       4804, 4821, 4838, 4855, 4885, 4915, 4932, 4949, 
-       4966, 4983, 5000, 5030, 5060, 5077, 5094, 5111, 
-       5128, 5145, 5175, 5205, 5222, 5239, 5256, 5273, 
-       5290, 5302, 5332, 5344, 5374, 5404, 5433, 5450, 
-       5480, 5510, 5539, 5556, 5586, 5616, 5645, 5662, 
-       5692, 5722, 5751, 5768, 5798, 5828, 5857, 5868, 
-       5876, 5883, 5886, 5888, 5891, 5894, 5896, 5903, 
-       5915, 5924, 5928, 5937, 5949, 5962, 5975, 5987, 
-       5998, 6011, 6023, 6034, 6047, 6059, 6070, 6083, 
-       6095, 6105, 6118, 6135, 6164, 6176, 6206, 6236, 
-       6253, 6270, 6287, 6304, 6321, 6351, 6381, 6398, 
-       6415, 6432, 6449, 6466, 6496, 6526, 6543, 6560, 
-       6577, 6594, 6611, 6641, 6671, 6688, 6705, 6722, 
-       6739, 6756, 6786, 6818, 6848, 6880, 6892, 6909, 
-       6939, 6969, 6998, 7005, 7008, 7010, 7013, 7016, 
-       7018, 7025, 7055, 7085, 7102, 7115, 7127, 7138, 
-       7151, 7163, 7174, 7187, 7199, 7210, 7223, 7235, 
-       7243, 7255, 7264, 7268, 7277, 7289, 7306, 7315, 
-       7319, 7326, 7329, 7331, 7334, 7337, 7339
+       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, 1091, 1121, 1151, 1180, 1197, 
+       1227, 1257, 1286, 1303, 1333, 1363, 1392, 1409, 
+       1439, 1469, 1498, 1515, 1545, 1575, 1604, 1615, 
+       1626, 1633, 1636, 1638, 1641, 1644, 1646, 1653, 
+       1665, 1674, 1681, 1690, 1702, 1715, 1728, 1740, 
+       1751, 1764, 1776, 1787, 1800, 1812, 1823, 1836, 
+       1848, 1859, 1872, 1889, 1918, 1930, 1960, 1990, 
+       2007, 2024, 2041, 2058, 2075, 2105, 2135, 2152, 
+       2169, 2186, 2203, 2220, 2250, 2280, 2297, 2314, 
+       2331, 2348, 2365, 2395, 2425, 2442, 2459, 2476, 
+       2493, 2510, 2540, 2570, 2600, 2630, 2659, 2676, 
+       2706, 2736, 2765, 2782, 2812, 2842, 2871, 2888, 
+       2918, 2948, 2977, 2994, 3024, 3054, 3083, 3094, 
+       3105, 3112, 3115, 3117, 3120, 3123, 3125, 3132, 
+       3144, 3153, 3160, 3169, 3181, 3194, 3207, 3219, 
+       3230, 3243, 3255, 3266, 3279, 3291, 3302, 3315, 
+       3327, 3338, 3351, 3368, 3397, 3409, 3439, 3469, 
+       3486, 3503, 3520, 3537, 3554, 3584, 3614, 3631, 
+       3648, 3665, 3682, 3699, 3729, 3759, 3776, 3793, 
+       3810, 3827, 3844, 3874, 3904, 3921, 3938, 3955, 
+       3972, 3984, 4001, 4031, 4061, 4090, 4107, 4137, 
+       4167, 4196, 4213, 4243, 4273, 4302, 4319, 4349, 
+       4379, 4408, 4425, 4455, 4485, 4514, 4525, 4536, 
+       4543, 4546, 4548, 4551, 4554, 4556, 4563, 4575, 
+       4584, 4591, 4600, 4612, 4625, 4638, 4650, 4661, 
+       4674, 4686, 4697, 4710, 4722, 4733, 4746, 4758, 
+       4769, 4782, 4799, 4828, 4840, 4870, 4900, 4917, 
+       4934, 4951, 4968, 4985, 5015, 5045, 5062, 5079, 
+       5096, 5113, 5130, 5160, 5190, 5207, 5224, 5241, 
+       5258, 5275, 5305, 5335, 5352, 5369, 5386, 5403, 
+       5420, 5432, 5462, 5474, 5504, 5534, 5563, 5580, 
+       5610, 5640, 5669, 5686, 5716, 5746, 5775, 5792, 
+       5822, 5852, 5881, 5898, 5928, 5958, 5987, 5998, 
+       6009, 6016, 6019, 6021, 6024, 6027, 6029, 6036, 
+       6048, 6057, 6064, 6073, 6085, 6098, 6111, 6123, 
+       6134, 6147, 6159, 6170, 6183, 6195, 6206, 6219, 
+       6231, 6242, 6255, 6272, 6301, 6313, 6343, 6373, 
+       6390, 6407, 6424, 6441, 6458, 6488, 6518, 6535, 
+       6552, 6569, 6586, 6603, 6633, 6663, 6680, 6697, 
+       6714, 6731, 6748, 6778, 6808, 6825, 6842, 6859, 
+       6876, 6893, 6923, 6955, 6985, 7017, 7029, 7036, 
+       7039, 7041, 7044, 7047, 7049, 7056, 7073, 7103, 
+       7133, 7162, 7192, 7222, 7239, 7252, 7264, 7275, 
+       7288, 7300, 7311, 7324, 7336, 7347, 7360, 7372, 
+       7383, 7395, 7404, 7411, 7420, 7432, 7449, 7458, 
+       7465, 7472, 7475, 7477, 7480, 7483, 7485
 };
 
 static const short _indic_syllable_machine_indicies[] = {
 };
 
 static const short _indic_syllable_machine_indicies[] = {
-       1, 2, 0, 0, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 1, 
-       0, 3, 0, 4, 4, 5, 0, 6, 
-       6, 5, 0, 5, 0, 7, 7, 8, 
-       0, 9, 9, 8, 0, 8, 0, 10, 
-       10, 11, 0, 12, 12, 11, 0, 11, 
-       0, 13, 13, 14, 0, 15, 15, 14, 
-       0, 14, 0, 16, 0, 17, 0, 18, 
-       0, 19, 13, 13, 14, 0, 20, 0, 
-       21, 0, 22, 10, 10, 11, 0, 23, 
-       0, 24, 0, 25, 7, 7, 8, 0, 
-       26, 0, 27, 0, 28, 4, 4, 5, 
-       0, 0, 0, 0, 0, 0, 28, 0, 
-       28, 4, 4, 5, 0, 0, 0, 0, 
-       0, 29, 28, 0, 30, 4, 4, 5, 
-       0, 0, 0, 0, 0, 0, 30, 0, 
-       30, 4, 4, 5, 0, 0, 0, 0, 
-       0, 31, 30, 0, 32, 4, 4, 5, 
-       0, 0, 0, 0, 0, 0, 32, 0, 
-       32, 4, 4, 5, 0, 0, 0, 0, 
-       0, 33, 32, 0, 34, 4, 4, 5, 
-       0, 0, 0, 0, 0, 0, 34, 0, 
-       34, 4, 4, 5, 0, 0, 0, 0, 
-       0, 35, 34, 0, 36, 4, 4, 5, 
-       0, 0, 0, 0, 0, 0, 36, 0, 
-       36, 4, 4, 5, 0, 0, 0, 0, 
-       0, 37, 36, 0, 39, 40, 38, 38, 
-       38, 38, 38, 38, 38, 38, 38, 38, 
-       38, 38, 38, 39, 38, 41, 38, 42, 
-       42, 43, 38, 44, 44, 43, 38, 43, 
-       38, 45, 45, 46, 38, 47, 47, 46, 
-       38, 46, 38, 48, 48, 49, 38, 50, 
-       50, 49, 38, 49, 38, 51, 51, 52, 
-       38, 53, 53, 52, 38, 52, 38, 54, 
-       38, 55, 38, 56, 38, 57, 51, 51, 
-       52, 38, 58, 38, 59, 38, 60, 48, 
-       48, 49, 38, 61, 38, 62, 38, 63, 
-       45, 45, 46, 38, 64, 38, 65, 38, 
-       66, 42, 42, 43, 38, 38, 38, 38, 
-       38, 38, 66, 38, 66, 42, 42, 43, 
-       38, 38, 38, 38, 38, 67, 66, 38, 
-       68, 42, 42, 43, 38, 38, 38, 38, 
-       38, 38, 68, 38, 68, 42, 42, 43, 
-       38, 38, 38, 38, 38, 69, 68, 38, 
-       70, 42, 42, 43, 38, 38, 38, 38, 
-       38, 38, 70, 38, 70, 42, 42, 43, 
-       38, 38, 38, 38, 38, 71, 70, 38, 
-       72, 42, 42, 43, 38, 38, 38, 38, 
-       38, 38, 72, 38, 72, 42, 42, 43, 
-       38, 38, 38, 38, 38, 73, 72, 38, 
-       74, 42, 42, 43, 38, 38, 38, 38, 
-       38, 38, 74, 38, 74, 42, 42, 43, 
-       38, 38, 38, 38, 38, 75, 74, 38, 
-       77, 78, 76, 76, 76, 76, 76, 76, 
-       76, 76, 76, 76, 76, 76, 76, 77, 
-       76, 79, 76, 80, 80, 81, 76, 83, 
-       83, 81, 82, 81, 82, 84, 84, 85, 
-       76, 86, 86, 85, 76, 85, 76, 87, 
-       87, 88, 76, 89, 89, 88, 76, 88, 
-       76, 90, 90, 91, 76, 92, 92, 91, 
-       76, 91, 76, 93, 76, 94, 76, 95, 
-       76, 96, 90, 90, 91, 76, 97, 76, 
-       98, 76, 99, 87, 87, 88, 76, 100, 
-       76, 101, 76, 102, 84, 84, 85, 76, 
-       103, 76, 104, 76, 105, 80, 80, 81, 
-       76, 76, 76, 76, 76, 76, 105, 76, 
-       105, 80, 80, 81, 76, 76, 76, 76, 
-       76, 106, 105, 76, 107, 80, 80, 81, 
-       76, 76, 76, 76, 76, 76, 107, 76, 
-       107, 80, 80, 81, 76, 76, 76, 76, 
-       76, 108, 107, 76, 109, 80, 80, 81, 
-       76, 76, 76, 76, 76, 76, 109, 76, 
-       109, 80, 80, 81, 76, 76, 76, 76, 
-       76, 110, 109, 76, 111, 80, 80, 81, 
-       82, 82, 82, 82, 82, 82, 111, 82, 
-       111, 80, 80, 81, 76, 76, 76, 76, 
-       76, 112, 111, 76, 113, 80, 80, 81, 
-       76, 76, 76, 76, 76, 76, 113, 76, 
-       115, 116, 114, 114, 114, 114, 114, 114, 
-       114, 114, 114, 114, 114, 114, 114, 115, 
-       114, 117, 114, 118, 118, 119, 114, 120, 
-       120, 119, 114, 119, 114, 121, 121, 122, 
-       114, 123, 123, 122, 114, 122, 114, 124, 
-       124, 125, 114, 126, 126, 125, 114, 125, 
-       114, 127, 127, 128, 114, 129, 129, 128, 
-       114, 128, 114, 130, 114, 131, 114, 132, 
-       114, 133, 127, 127, 128, 114, 134, 114, 
-       135, 114, 136, 124, 124, 125, 114, 137, 
-       114, 138, 114, 139, 121, 121, 122, 114, 
-       140, 114, 141, 114, 142, 118, 118, 119, 
-       114, 114, 114, 114, 114, 114, 142, 114, 
-       142, 118, 118, 119, 114, 114, 114, 114, 
-       114, 143, 142, 114, 144, 118, 118, 119, 
-       114, 114, 114, 114, 114, 114, 144, 114, 
-       144, 118, 118, 119, 114, 114, 114, 114, 
-       114, 145, 144, 114, 146, 118, 118, 119, 
-       114, 114, 114, 114, 114, 114, 146, 114, 
-       146, 118, 118, 119, 114, 114, 114, 114, 
-       114, 147, 146, 114, 148, 118, 118, 119, 
-       114, 114, 114, 114, 114, 114, 148, 114, 
-       148, 118, 118, 119, 114, 114, 114, 114, 
-       114, 149, 148, 114, 150, 118, 118, 119, 
-       114, 114, 114, 114, 114, 114, 150, 114, 
-       150, 118, 118, 119, 114, 114, 114, 114, 
-       114, 151, 150, 114, 113, 80, 80, 81, 
-       76, 76, 76, 76, 76, 152, 113, 76, 
-       111, 80, 80, 81, 0, 0, 0, 0, 
-       0, 153, 111, 0, 154, 154, 155, 0, 
-       6, 6, 155, 0, 156, 156, 157, 0, 
-       158, 158, 157, 0, 157, 0, 159, 159, 
-       160, 0, 161, 161, 160, 0, 160, 0, 
-       162, 162, 163, 0, 164, 164, 163, 0, 
-       163, 0, 165, 166, 0, 0, 0, 0, 
-       0, 0, 0, 0, 0, 0, 0, 0, 
-       0, 165, 0, 167, 0, 168, 0, 169, 
-       0, 170, 0, 171, 162, 162, 163, 0, 
-       172, 0, 173, 0, 174, 159, 159, 160, 
-       0, 175, 0, 176, 0, 177, 156, 156, 
-       157, 0, 178, 0, 179, 0, 181, 182, 
-       183, 184, 185, 186, 81, 187, 188, 189, 
-       190, 190, 152, 191, 192, 193, 194, 195, 
-       180, 180, 180, 180, 180, 180, 180, 180, 
-       180, 180, 180, 180, 196, 180, 198, 199, 
-       200, 201, 5, 202, 203, 204, 197, 197, 
-       37, 205, 197, 197, 206, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 207, 197, 208, 199, 209, 209, 
-       5, 202, 203, 204, 197, 197, 197, 205, 
-       197, 197, 206, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       207, 197, 199, 209, 209, 5, 202, 203, 
-       204, 197, 197, 197, 205, 197, 197, 206, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 207, 197, 210, 
-       197, 197, 197, 18, 211, 197, 202, 203, 
-       204, 197, 197, 197, 212, 197, 210, 197, 
-       213, 214, 215, 216, 5, 202, 203, 204, 
-       197, 197, 35, 217, 197, 197, 206, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 207, 197, 218, 214, 
-       219, 219, 5, 202, 203, 204, 197, 197, 
-       197, 217, 197, 197, 206, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 207, 197, 214, 219, 219, 5, 
-       202, 203, 204, 197, 197, 197, 217, 197, 
-       197, 206, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 207, 
-       197, 220, 197, 197, 197, 18, 221, 197, 
-       202, 203, 204, 197, 197, 197, 212, 197, 
-       220, 197, 222, 223, 224, 225, 5, 202, 
-       203, 204, 197, 197, 33, 226, 197, 197, 
-       206, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 207, 197, 
-       227, 223, 228, 228, 5, 202, 203, 204, 
-       197, 197, 197, 226, 197, 197, 206, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 207, 197, 223, 228, 
-       228, 5, 202, 203, 204, 197, 197, 197, 
-       226, 197, 197, 206, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 207, 197, 229, 197, 197, 197, 18, 
-       230, 197, 202, 203, 204, 197, 197, 197, 
-       212, 197, 229, 197, 231, 232, 233, 234, 
-       5, 202, 203, 204, 197, 197, 31, 235, 
-       197, 197, 206, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       207, 197, 236, 232, 237, 237, 5, 202, 
-       203, 204, 197, 197, 197, 235, 197, 197, 
-       206, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 207, 197, 
-       232, 237, 237, 5, 202, 203, 204, 197, 
-       197, 197, 235, 197, 197, 206, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 207, 197, 238, 197, 197, 
-       197, 18, 239, 197, 202, 203, 204, 197, 
-       197, 197, 212, 197, 238, 197, 240, 241, 
-       242, 243, 5, 202, 203, 204, 197, 197, 
-       29, 244, 197, 197, 206, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 207, 197, 245, 241, 246, 246, 
-       5, 202, 203, 204, 197, 197, 197, 244, 
-       197, 197, 206, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       207, 197, 241, 246, 246, 5, 202, 203, 
-       204, 197, 197, 197, 244, 197, 197, 206, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 207, 197, 18, 
-       247, 197, 202, 203, 204, 197, 197, 197, 
-       212, 197, 202, 203, 204, 197, 197, 197, 
-       212, 197, 248, 197, 197, 249, 203, 204, 
-       197, 203, 204, 197, 250, 197, 203, 251, 
-       197, 203, 252, 197, 203, 197, 248, 197, 
-       197, 197, 203, 204, 197, 253, 197, 254, 
-       255, 197, 202, 203, 204, 197, 197, 3, 
-       197, 2, 197, 197, 197, 197, 202, 203, 
-       204, 197, 202, 203, 204, 197, 253, 197, 
-       197, 197, 197, 202, 203, 204, 197, 253, 
-       197, 254, 197, 197, 202, 203, 204, 197, 
-       197, 3, 197, 18, 197, 256, 256, 5, 
-       202, 203, 204, 197, 197, 197, 212, 197, 
-       257, 27, 258, 259, 8, 202, 203, 204, 
-       197, 197, 197, 212, 197, 27, 258, 259, 
-       8, 202, 203, 204, 197, 197, 197, 212, 
-       197, 258, 258, 8, 202, 203, 204, 197, 
-       197, 197, 212, 197, 260, 24, 261, 262, 
-       11, 202, 203, 204, 197, 197, 197, 212, 
-       197, 24, 261, 262, 11, 202, 203, 204, 
-       197, 197, 197, 212, 197, 261, 261, 11, 
-       202, 203, 204, 197, 197, 197, 212, 197, 
-       263, 21, 264, 265, 14, 202, 203, 204, 
-       197, 197, 197, 212, 197, 21, 264, 265, 
-       14, 202, 203, 204, 197, 197, 197, 212, 
-       197, 264, 264, 14, 202, 203, 204, 197, 
-       197, 197, 212, 197, 266, 18, 197, 267, 
-       197, 202, 203, 204, 197, 197, 197, 212, 
-       197, 18, 197, 267, 197, 202, 203, 204, 
-       197, 197, 197, 212, 197, 268, 197, 202, 
-       203, 204, 197, 197, 197, 212, 197, 18, 
-       197, 197, 197, 197, 202, 203, 204, 197, 
-       197, 197, 212, 197, 1, 2, 197, 197, 
-       18, 247, 197, 202, 203, 204, 197, 197, 
-       197, 212, 197, 1, 197, 241, 246, 246, 
-       5, 202, 203, 204, 197, 197, 197, 244, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       207, 197, 241, 246, 246, 5, 202, 203, 
-       204, 197, 197, 197, 244, 197, 240, 241, 
-       246, 246, 5, 202, 203, 204, 197, 197, 
-       197, 244, 197, 197, 206, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 207, 197, 240, 241, 242, 246, 
-       5, 202, 203, 204, 197, 197, 29, 244, 
-       197, 197, 206, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       207, 197, 238, 197, 269, 197, 256, 256, 
-       5, 202, 203, 204, 197, 197, 197, 212, 
-       197, 238, 197, 238, 197, 197, 197, 197, 
-       197, 197, 202, 203, 204, 197, 197, 197, 
-       212, 197, 238, 197, 238, 197, 197, 197, 
-       197, 270, 197, 202, 203, 204, 197, 197, 
-       197, 212, 197, 238, 197, 238, 197, 269, 
-       197, 197, 197, 197, 202, 203, 204, 197, 
-       197, 197, 212, 197, 238, 197, 238, 2, 
-       197, 197, 18, 239, 197, 202, 203, 204, 
-       197, 197, 197, 212, 197, 238, 197, 231, 
-       232, 237, 237, 5, 202, 203, 204, 197, 
-       197, 197, 235, 197, 197, 206, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 207, 197, 231, 232, 233, 
-       237, 5, 202, 203, 204, 197, 197, 31, 
-       235, 197, 197, 206, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 207, 197, 229, 197, 271, 197, 256, 
-       256, 5, 202, 203, 204, 197, 197, 197, 
-       212, 197, 229, 197, 229, 197, 197, 197, 
-       197, 197, 197, 202, 203, 204, 197, 197, 
-       197, 212, 197, 229, 197, 229, 197, 197, 
-       197, 197, 272, 197, 202, 203, 204, 197, 
-       197, 197, 212, 197, 229, 197, 229, 197, 
-       271, 197, 197, 197, 197, 202, 203, 204, 
-       197, 197, 197, 212, 197, 229, 197, 229, 
-       2, 197, 197, 18, 230, 197, 202, 203, 
-       204, 197, 197, 197, 212, 197, 229, 197, 
-       222, 223, 228, 228, 5, 202, 203, 204, 
-       197, 197, 197, 226, 197, 197, 206, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 207, 197, 222, 223, 
-       224, 228, 5, 202, 203, 204, 197, 197, 
-       33, 226, 197, 197, 206, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 207, 197, 220, 197, 273, 197, 
-       256, 256, 5, 202, 203, 204, 197, 197, 
-       197, 212, 197, 220, 197, 220, 197, 197, 
-       197, 197, 197, 197, 202, 203, 204, 197, 
-       197, 197, 212, 197, 220, 197, 220, 197, 
-       197, 197, 197, 274, 197, 202, 203, 204, 
-       197, 197, 197, 212, 197, 220, 197, 220, 
-       197, 273, 197, 197, 197, 197, 202, 203, 
-       204, 197, 197, 197, 212, 197, 220, 197, 
-       220, 2, 197, 197, 18, 221, 197, 202, 
-       203, 204, 197, 197, 197, 212, 197, 220, 
-       197, 213, 214, 219, 219, 5, 202, 203, 
-       204, 197, 197, 197, 217, 197, 197, 206, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 207, 197, 213, 
-       214, 215, 219, 5, 202, 203, 204, 197, 
-       197, 35, 217, 197, 197, 206, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 207, 197, 210, 197, 275, 
-       197, 256, 256, 5, 202, 203, 204, 197, 
-       197, 197, 212, 197, 210, 197, 210, 197, 
-       197, 197, 197, 197, 197, 202, 203, 204, 
-       197, 197, 197, 212, 197, 210, 197, 210, 
-       197, 197, 197, 197, 276, 197, 202, 203, 
-       204, 197, 197, 197, 212, 197, 210, 197, 
-       210, 197, 275, 197, 197, 197, 197, 202, 
-       203, 204, 197, 197, 197, 212, 197, 210, 
-       197, 210, 2, 197, 197, 18, 211, 197, 
-       202, 203, 204, 197, 197, 197, 212, 197, 
-       210, 197, 198, 199, 209, 209, 5, 202, 
-       203, 204, 197, 197, 197, 205, 197, 197, 
-       206, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 207, 197, 
-       198, 199, 200, 209, 5, 202, 203, 204, 
-       197, 197, 37, 205, 197, 197, 206, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 207, 197, 278, 279, 
-       280, 281, 43, 282, 283, 284, 277, 277, 
-       75, 285, 277, 277, 286, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 287, 277, 288, 279, 289, 281, 
-       43, 282, 283, 284, 277, 277, 277, 285, 
-       277, 277, 286, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       287, 277, 279, 289, 281, 43, 282, 283, 
-       284, 277, 277, 277, 285, 277, 277, 286, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 287, 277, 290, 
-       277, 277, 277, 56, 291, 277, 282, 283, 
-       284, 277, 277, 277, 292, 277, 290, 277, 
-       293, 294, 295, 296, 43, 282, 283, 284, 
-       277, 277, 73, 297, 277, 277, 286, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 287, 277, 298, 294, 
-       299, 299, 43, 282, 283, 284, 277, 277, 
-       277, 297, 277, 277, 286, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 287, 277, 294, 299, 299, 43, 
-       282, 283, 284, 277, 277, 277, 297, 277, 
-       277, 286, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 287, 
-       277, 300, 277, 277, 277, 56, 301, 277, 
-       282, 283, 284, 277, 277, 277, 292, 277, 
-       300, 277, 302, 303, 304, 305, 43, 282, 
-       283, 284, 277, 277, 71, 306, 277, 277, 
-       286, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 287, 277, 
-       307, 303, 308, 308, 43, 282, 283, 284, 
-       277, 277, 277, 306, 277, 277, 286, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 287, 277, 303, 308, 
-       308, 43, 282, 283, 284, 277, 277, 277, 
-       306, 277, 277, 286, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 287, 277, 309, 277, 277, 277, 56, 
-       310, 277, 282, 283, 284, 277, 277, 277, 
-       292, 277, 309, 277, 311, 312, 313, 314, 
-       43, 282, 283, 284, 277, 277, 69, 315, 
-       277, 277, 286, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       287, 277, 316, 312, 317, 317, 43, 282, 
-       283, 284, 277, 277, 277, 315, 277, 277, 
-       286, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 287, 277, 
-       312, 317, 317, 43, 282, 283, 284, 277, 
-       277, 277, 315, 277, 277, 286, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 287, 277, 318, 277, 277, 
-       277, 56, 319, 277, 282, 283, 284, 277, 
-       277, 277, 292, 277, 318, 277, 320, 321, 
-       322, 323, 43, 282, 283, 284, 277, 277, 
-       67, 324, 277, 277, 286, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 287, 277, 325, 321, 326, 326, 
-       43, 282, 283, 284, 277, 277, 277, 324, 
-       277, 277, 286, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       287, 277, 321, 326, 326, 43, 282, 283, 
-       284, 277, 277, 277, 324, 277, 277, 286, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 287, 277, 56, 
-       327, 277, 282, 283, 284, 277, 277, 277, 
-       292, 277, 282, 283, 284, 277, 277, 277, 
-       292, 277, 328, 277, 277, 329, 283, 284, 
-       277, 283, 284, 277, 330, 277, 283, 331, 
-       277, 283, 332, 277, 283, 277, 328, 277, 
-       277, 277, 283, 284, 277, 333, 277, 334, 
-       335, 277, 282, 283, 284, 277, 277, 41, 
-       277, 40, 277, 277, 277, 277, 282, 283, 
-       284, 277, 282, 283, 284, 277, 333, 277, 
-       277, 277, 277, 282, 283, 284, 277, 333, 
-       277, 334, 277, 277, 282, 283, 284, 277, 
-       277, 41, 277, 56, 277, 336, 336, 43, 
-       282, 283, 284, 277, 277, 277, 292, 277, 
-       337, 65, 338, 339, 46, 282, 283, 284, 
-       277, 277, 277, 292, 277, 65, 338, 339, 
-       46, 282, 283, 284, 277, 277, 277, 292, 
-       277, 338, 338, 46, 282, 283, 284, 277, 
-       277, 277, 292, 277, 340, 62, 341, 342, 
-       49, 282, 283, 284, 277, 277, 277, 292, 
-       277, 62, 341, 342, 49, 282, 283, 284, 
-       277, 277, 277, 292, 277, 341, 341, 49, 
-       282, 283, 284, 277, 277, 277, 292, 277, 
-       343, 59, 344, 345, 52, 282, 283, 284, 
-       277, 277, 277, 292, 277, 59, 344, 345, 
-       52, 282, 283, 284, 277, 277, 277, 292, 
-       277, 344, 344, 52, 282, 283, 284, 277, 
-       277, 277, 292, 277, 346, 56, 277, 347, 
-       277, 282, 283, 284, 277, 277, 277, 292, 
-       277, 56, 277, 347, 277, 282, 283, 284, 
-       277, 277, 277, 292, 277, 348, 277, 282, 
-       283, 284, 277, 277, 277, 292, 277, 56, 
-       277, 277, 277, 277, 282, 283, 284, 277, 
-       277, 277, 292, 277, 39, 40, 277, 277, 
-       56, 327, 277, 282, 283, 284, 277, 277, 
-       277, 292, 277, 39, 277, 321, 326, 326, 
-       43, 282, 283, 284, 277, 277, 277, 324, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       287, 277, 321, 326, 326, 43, 282, 283, 
-       284, 277, 277, 277, 324, 277, 320, 321, 
-       326, 326, 43, 282, 283, 284, 277, 277, 
-       277, 324, 277, 277, 286, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 287, 277, 320, 321, 322, 326, 
-       43, 282, 283, 284, 277, 277, 67, 324, 
-       277, 277, 286, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       287, 277, 318, 277, 349, 277, 336, 336, 
-       43, 282, 283, 284, 277, 277, 277, 292, 
-       277, 318, 277, 318, 277, 277, 277, 277, 
-       277, 277, 282, 283, 284, 277, 277, 277, 
-       292, 277, 318, 277, 318, 277, 277, 277, 
-       277, 350, 277, 282, 283, 284, 277, 277, 
-       277, 292, 277, 318, 277, 318, 277, 349, 
-       277, 277, 277, 277, 282, 283, 284, 277, 
-       277, 277, 292, 277, 318, 277, 318, 40, 
-       277, 277, 56, 319, 277, 282, 283, 284, 
-       277, 277, 277, 292, 277, 318, 277, 311, 
-       312, 317, 317, 43, 282, 283, 284, 277, 
-       277, 277, 315, 277, 277, 286, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 287, 277, 311, 312, 313, 
-       317, 43, 282, 283, 284, 277, 277, 69, 
-       315, 277, 277, 286, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 287, 277, 309, 277, 351, 277, 336, 
-       336, 43, 282, 283, 284, 277, 277, 277, 
-       292, 277, 309, 277, 309, 277, 277, 277, 
-       277, 277, 277, 282, 283, 284, 277, 277, 
-       277, 292, 277, 309, 277, 309, 277, 277, 
-       277, 277, 352, 277, 282, 283, 284, 277, 
-       277, 277, 292, 277, 309, 277, 309, 277, 
-       351, 277, 277, 277, 277, 282, 283, 284, 
-       277, 277, 277, 292, 277, 309, 277, 309, 
-       40, 277, 277, 56, 310, 277, 282, 283, 
-       284, 277, 277, 277, 292, 277, 309, 277, 
-       302, 303, 308, 308, 43, 282, 283, 284, 
-       277, 277, 277, 306, 277, 277, 286, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 287, 277, 302, 303, 
-       304, 308, 43, 282, 283, 284, 277, 277, 
-       71, 306, 277, 277, 286, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 287, 277, 300, 277, 353, 277, 
-       336, 336, 43, 282, 283, 284, 277, 277, 
-       277, 292, 277, 300, 277, 300, 277, 277, 
-       277, 277, 277, 277, 282, 283, 284, 277, 
-       277, 277, 292, 277, 300, 277, 300, 277, 
-       277, 277, 277, 354, 277, 282, 283, 284, 
-       277, 277, 277, 292, 277, 300, 277, 300, 
-       277, 353, 277, 277, 277, 277, 282, 283, 
-       284, 277, 277, 277, 292, 277, 300, 277, 
-       300, 40, 277, 277, 56, 301, 277, 282, 
-       283, 284, 277, 277, 277, 292, 277, 300, 
-       277, 293, 294, 299, 299, 43, 282, 283, 
-       284, 277, 277, 277, 297, 277, 277, 286, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 277, 277, 287, 277, 293, 
-       294, 295, 299, 43, 282, 283, 284, 277, 
-       277, 73, 297, 277, 277, 286, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 277, 287, 277, 290, 277, 355, 
-       277, 336, 336, 43, 282, 283, 284, 277, 
-       277, 277, 292, 277, 290, 277, 290, 277, 
-       277, 277, 277, 277, 277, 282, 283, 284, 
-       277, 277, 277, 292, 277, 290, 277, 290, 
-       277, 277, 277, 277, 356, 277, 282, 283, 
-       284, 277, 277, 277, 292, 277, 290, 277, 
-       290, 277, 355, 277, 277, 277, 277, 282, 
-       283, 284, 277, 277, 277, 292, 277, 290, 
-       277, 74, 42, 42, 43, 277, 277, 277, 
-       277, 277, 277, 74, 277, 290, 40, 277, 
-       277, 56, 291, 277, 282, 283, 284, 277, 
-       277, 277, 292, 277, 290, 277, 278, 279, 
-       289, 281, 43, 282, 283, 284, 277, 277, 
-       277, 285, 277, 277, 286, 277, 277, 277, 
-       277, 277, 277, 277, 277, 277, 277, 277, 
-       277, 277, 287, 277, 358, 184, 359, 359, 
-       81, 187, 188, 189, 357, 357, 357, 191, 
-       357, 357, 194, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       196, 357, 184, 359, 359, 81, 187, 188, 
-       189, 357, 357, 357, 191, 357, 357, 194, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 196, 357, 360, 
-       357, 357, 357, 95, 361, 357, 187, 188, 
-       189, 357, 357, 357, 362, 357, 360, 357, 
-       363, 364, 365, 366, 81, 187, 188, 189, 
-       357, 357, 112, 367, 357, 357, 194, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 196, 357, 368, 364, 
-       369, 369, 81, 187, 188, 189, 357, 357, 
-       357, 367, 357, 357, 194, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 196, 357, 364, 369, 369, 81, 
-       187, 188, 189, 357, 357, 357, 367, 357, 
-       357, 194, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 196, 
-       357, 370, 357, 357, 357, 95, 371, 357, 
-       187, 188, 189, 357, 357, 357, 362, 357, 
-       370, 357, 372, 373, 374, 375, 81, 187, 
-       188, 189, 357, 357, 110, 376, 357, 357, 
-       194, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 196, 357, 
-       377, 373, 378, 378, 81, 187, 188, 189, 
-       357, 357, 357, 376, 357, 357, 194, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 196, 357, 373, 378, 
-       378, 81, 187, 188, 189, 357, 357, 357, 
-       376, 357, 357, 194, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 196, 357, 379, 357, 357, 357, 95, 
-       380, 357, 187, 188, 189, 357, 357, 357, 
-       362, 357, 379, 357, 381, 382, 383, 384, 
-       81, 187, 188, 189, 357, 357, 108, 385, 
-       357, 357, 194, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       196, 357, 386, 382, 387, 387, 81, 187, 
-       188, 189, 357, 357, 357, 385, 357, 357, 
-       194, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 196, 357, 
-       382, 387, 387, 81, 187, 188, 189, 357, 
-       357, 357, 385, 357, 357, 194, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 196, 357, 388, 357, 357, 
-       357, 95, 389, 357, 187, 188, 189, 357, 
-       357, 357, 362, 357, 388, 357, 390, 391, 
-       392, 393, 81, 187, 188, 189, 357, 357, 
-       106, 394, 357, 357, 194, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 196, 357, 395, 391, 396, 396, 
-       81, 187, 188, 189, 357, 357, 357, 394, 
-       357, 357, 194, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       196, 357, 391, 396, 396, 81, 187, 188, 
-       189, 357, 357, 357, 394, 357, 357, 194, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 196, 357, 95, 
-       397, 357, 187, 188, 189, 357, 357, 357, 
-       362, 357, 187, 188, 189, 357, 357, 357, 
-       362, 357, 398, 357, 357, 399, 188, 189, 
-       357, 188, 189, 357, 400, 357, 188, 401, 
-       357, 188, 402, 357, 188, 357, 398, 357, 
-       357, 357, 188, 189, 357, 403, 357, 404, 
-       405, 357, 187, 188, 189, 357, 357, 79, 
-       357, 78, 357, 357, 357, 357, 187, 188, 
-       189, 357, 187, 188, 189, 357, 403, 357, 
-       357, 357, 357, 187, 188, 189, 357, 403, 
-       357, 404, 357, 357, 187, 188, 189, 357, 
-       357, 79, 357, 95, 357, 406, 406, 81, 
-       187, 188, 189, 357, 357, 357, 362, 357, 
-       407, 104, 408, 409, 85, 187, 188, 189, 
-       357, 357, 357, 362, 357, 104, 408, 409, 
-       85, 187, 188, 189, 357, 357, 357, 362, 
-       357, 408, 408, 85, 187, 188, 189, 357, 
-       357, 357, 362, 357, 410, 101, 411, 412, 
-       88, 187, 188, 189, 357, 357, 357, 362, 
-       357, 101, 411, 412, 88, 187, 188, 189, 
-       357, 357, 357, 362, 357, 411, 411, 88, 
-       187, 188, 189, 357, 357, 357, 362, 357, 
-       413, 98, 414, 415, 91, 187, 188, 189, 
-       357, 357, 357, 362, 357, 98, 414, 415, 
-       91, 187, 188, 189, 357, 357, 357, 362, 
-       357, 414, 414, 91, 187, 188, 189, 357, 
-       357, 357, 362, 357, 416, 95, 357, 417, 
-       357, 187, 188, 189, 357, 357, 357, 362, 
-       357, 95, 357, 417, 357, 187, 188, 189, 
-       357, 357, 357, 362, 357, 418, 357, 187, 
-       188, 189, 357, 357, 357, 362, 357, 95, 
-       357, 357, 357, 357, 187, 188, 189, 357, 
-       357, 357, 362, 357, 77, 78, 357, 357, 
-       95, 397, 357, 187, 188, 189, 357, 357, 
-       357, 362, 357, 77, 357, 391, 396, 396, 
-       81, 187, 188, 189, 357, 357, 357, 394, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       196, 357, 391, 396, 396, 81, 187, 188, 
-       189, 357, 357, 357, 394, 357, 390, 391, 
-       396, 396, 81, 187, 188, 189, 357, 357, 
-       357, 394, 357, 357, 194, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 196, 357, 390, 391, 392, 396, 
-       81, 187, 188, 189, 357, 357, 106, 394, 
-       357, 357, 194, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       196, 357, 388, 357, 419, 357, 406, 406, 
-       81, 187, 188, 189, 357, 357, 357, 362, 
-       357, 388, 357, 388, 357, 357, 357, 357, 
-       357, 357, 187, 188, 189, 357, 357, 357, 
-       362, 357, 388, 357, 388, 357, 357, 357, 
-       357, 420, 357, 187, 188, 189, 357, 357, 
-       357, 362, 357, 388, 357, 388, 357, 419, 
-       357, 357, 357, 357, 187, 188, 189, 357, 
-       357, 357, 362, 357, 388, 357, 388, 78, 
-       357, 357, 95, 389, 357, 187, 188, 189, 
-       357, 357, 357, 362, 357, 388, 357, 381, 
-       382, 387, 387, 81, 187, 188, 189, 357, 
-       357, 357, 385, 357, 357, 194, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 196, 357, 381, 382, 383, 
-       387, 81, 187, 188, 189, 357, 357, 108, 
-       385, 357, 357, 194, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 196, 357, 379, 357, 421, 357, 406, 
-       406, 81, 187, 188, 189, 357, 357, 357, 
-       362, 357, 379, 357, 379, 357, 357, 357, 
-       357, 357, 357, 187, 188, 189, 357, 357, 
-       357, 362, 357, 379, 357, 379, 357, 357, 
-       357, 357, 422, 357, 187, 188, 189, 357, 
-       357, 357, 362, 357, 379, 357, 379, 357, 
-       421, 357, 357, 357, 357, 187, 188, 189, 
-       357, 357, 357, 362, 357, 379, 357, 379, 
-       78, 357, 357, 95, 380, 357, 187, 188, 
-       189, 357, 357, 357, 362, 357, 379, 357, 
-       372, 373, 378, 378, 81, 187, 188, 189, 
-       357, 357, 357, 376, 357, 357, 194, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 196, 357, 372, 373, 
-       374, 378, 81, 187, 188, 189, 357, 357, 
-       110, 376, 357, 357, 194, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 196, 357, 370, 357, 423, 357, 
-       406, 406, 81, 187, 188, 189, 357, 357, 
-       357, 362, 357, 370, 357, 370, 357, 357, 
-       357, 357, 357, 357, 187, 188, 189, 357, 
-       357, 357, 362, 357, 370, 357, 370, 357, 
-       357, 357, 357, 424, 357, 187, 188, 189, 
-       357, 357, 357, 362, 357, 370, 357, 370, 
-       357, 423, 357, 357, 357, 357, 187, 188, 
-       189, 357, 357, 357, 362, 357, 370, 357, 
-       370, 78, 357, 357, 95, 371, 357, 187, 
-       188, 189, 357, 357, 357, 362, 357, 370, 
-       357, 363, 364, 369, 369, 81, 187, 188, 
-       189, 357, 357, 357, 367, 357, 357, 194, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 196, 357, 363, 
-       364, 365, 369, 81, 187, 188, 189, 357, 
-       357, 112, 367, 357, 357, 194, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 357, 196, 357, 360, 357, 425, 
-       357, 406, 406, 81, 187, 188, 189, 357, 
-       357, 357, 362, 357, 360, 357, 360, 357, 
-       357, 357, 357, 357, 357, 187, 188, 189, 
-       357, 357, 357, 362, 357, 360, 357, 360, 
-       357, 357, 357, 357, 426, 357, 187, 188, 
-       189, 357, 357, 357, 362, 357, 360, 357, 
-       360, 357, 425, 357, 357, 357, 357, 187, 
-       188, 189, 357, 357, 357, 362, 357, 360, 
-       357, 360, 78, 357, 357, 95, 361, 357, 
-       187, 188, 189, 357, 357, 357, 362, 357, 
-       360, 357, 113, 80, 80, 81, 427, 427, 
-       427, 427, 427, 152, 113, 427, 183, 184, 
-       359, 359, 81, 187, 188, 189, 357, 357, 
-       357, 191, 357, 357, 194, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       357, 357, 196, 357, 113, 80, 80, 81, 
-       427, 427, 427, 427, 427, 427, 113, 427, 
-       429, 430, 431, 432, 119, 433, 434, 435, 
-       428, 428, 151, 436, 428, 428, 437, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 438, 428, 439, 430, 
-       432, 432, 119, 433, 434, 435, 428, 428, 
-       428, 436, 428, 428, 437, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 438, 428, 430, 432, 432, 119, 
-       433, 434, 435, 428, 428, 428, 436, 428, 
-       428, 437, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 438, 
-       428, 440, 428, 428, 428, 132, 441, 428, 
-       433, 434, 435, 428, 428, 428, 442, 428, 
-       440, 428, 443, 444, 445, 446, 119, 433, 
-       434, 435, 428, 428, 149, 447, 428, 428, 
-       437, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 438, 428, 
-       448, 444, 449, 449, 119, 433, 434, 435, 
-       428, 428, 428, 447, 428, 428, 437, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 438, 428, 444, 449, 
-       449, 119, 433, 434, 435, 428, 428, 428, 
-       447, 428, 428, 437, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 438, 428, 450, 428, 428, 428, 132, 
-       451, 428, 433, 434, 435, 428, 428, 428, 
-       442, 428, 450, 428, 452, 453, 454, 455, 
-       119, 433, 434, 435, 428, 428, 147, 456, 
-       428, 428, 437, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       438, 428, 457, 453, 458, 458, 119, 433, 
-       434, 435, 428, 428, 428, 456, 428, 428, 
-       437, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 438, 428, 
-       453, 458, 458, 119, 433, 434, 435, 428, 
-       428, 428, 456, 428, 428, 437, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 438, 428, 459, 428, 428, 
-       428, 132, 460, 428, 433, 434, 435, 428, 
-       428, 428, 442, 428, 459, 428, 461, 462, 
-       463, 464, 119, 433, 434, 435, 428, 428, 
-       145, 465, 428, 428, 437, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 438, 428, 466, 462, 467, 467, 
-       119, 433, 434, 435, 428, 428, 428, 465, 
-       428, 428, 437, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       438, 428, 462, 467, 467, 119, 433, 434, 
-       435, 428, 428, 428, 465, 428, 428, 437, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 438, 428, 468, 
-       428, 428, 428, 132, 469, 428, 433, 434, 
-       435, 428, 428, 428, 442, 428, 468, 428, 
-       470, 471, 472, 473, 119, 433, 434, 435, 
-       428, 428, 143, 474, 428, 428, 437, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 438, 428, 475, 471, 
-       476, 476, 119, 433, 434, 435, 428, 428, 
-       428, 474, 428, 428, 437, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 438, 428, 471, 476, 476, 119, 
-       433, 434, 435, 428, 428, 428, 474, 428, 
-       428, 437, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 438, 
-       428, 132, 477, 428, 433, 434, 435, 428, 
-       428, 428, 442, 428, 433, 434, 435, 428, 
-       428, 428, 442, 428, 478, 428, 428, 479, 
-       434, 435, 428, 434, 435, 428, 480, 428, 
-       434, 481, 428, 434, 482, 428, 434, 428, 
-       478, 428, 428, 428, 434, 435, 428, 483, 
-       428, 484, 485, 428, 433, 434, 435, 428, 
-       428, 117, 428, 116, 428, 428, 428, 428, 
-       433, 434, 435, 428, 433, 434, 435, 428, 
-       483, 428, 428, 428, 428, 433, 434, 435, 
-       428, 483, 428, 484, 428, 428, 433, 434, 
-       435, 428, 428, 117, 428, 132, 428, 486, 
-       486, 119, 433, 434, 435, 428, 428, 428, 
-       442, 428, 487, 141, 488, 489, 122, 433, 
-       434, 435, 428, 428, 428, 442, 428, 141, 
-       488, 489, 122, 433, 434, 435, 428, 428, 
-       428, 442, 428, 488, 488, 122, 433, 434, 
-       435, 428, 428, 428, 442, 428, 490, 138, 
-       491, 492, 125, 433, 434, 435, 428, 428, 
-       428, 442, 428, 138, 491, 492, 125, 433, 
-       434, 435, 428, 428, 428, 442, 428, 491, 
-       491, 125, 433, 434, 435, 428, 428, 428, 
-       442, 428, 493, 135, 494, 495, 128, 433, 
-       434, 435, 428, 428, 428, 442, 428, 135, 
-       494, 495, 128, 433, 434, 435, 428, 428, 
-       428, 442, 428, 494, 494, 128, 433, 434, 
-       435, 428, 428, 428, 442, 428, 496, 132, 
-       428, 497, 428, 433, 434, 435, 428, 428, 
-       428, 442, 428, 132, 428, 497, 428, 433, 
-       434, 435, 428, 428, 428, 442, 428, 498, 
-       428, 433, 434, 435, 428, 428, 428, 442, 
-       428, 132, 428, 428, 428, 428, 433, 434, 
-       435, 428, 428, 428, 442, 428, 115, 116, 
-       428, 428, 132, 477, 428, 433, 434, 435, 
-       428, 428, 428, 442, 428, 115, 428, 471, 
-       476, 476, 119, 433, 434, 435, 428, 428, 
-       428, 474, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 438, 428, 471, 476, 476, 119, 
-       433, 434, 435, 428, 428, 428, 474, 428, 
-       470, 471, 476, 476, 119, 433, 434, 435, 
-       428, 428, 428, 474, 428, 428, 437, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 438, 428, 470, 471, 
-       472, 476, 119, 433, 434, 435, 428, 428, 
-       143, 474, 428, 428, 437, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 438, 428, 468, 428, 499, 428, 
-       486, 486, 119, 433, 434, 435, 428, 428, 
-       428, 442, 428, 468, 428, 468, 428, 428, 
-       428, 428, 428, 428, 433, 434, 435, 428, 
-       428, 428, 442, 428, 468, 428, 468, 428, 
-       428, 428, 428, 500, 428, 433, 434, 435, 
-       428, 428, 428, 442, 428, 468, 428, 468, 
-       428, 499, 428, 428, 428, 428, 433, 434, 
-       435, 428, 428, 428, 442, 428, 468, 428, 
-       468, 116, 428, 428, 132, 469, 428, 433, 
-       434, 435, 428, 428, 428, 442, 428, 468, 
-       428, 461, 462, 467, 467, 119, 433, 434, 
-       435, 428, 428, 428, 465, 428, 428, 437, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 438, 428, 461, 
-       462, 463, 467, 119, 433, 434, 435, 428, 
-       428, 145, 465, 428, 428, 437, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 438, 428, 459, 428, 501, 
-       428, 486, 486, 119, 433, 434, 435, 428, 
-       428, 428, 442, 428, 459, 428, 459, 428, 
-       428, 428, 428, 428, 428, 433, 434, 435, 
-       428, 428, 428, 442, 428, 459, 428, 459, 
-       428, 428, 428, 428, 502, 428, 433, 434, 
-       435, 428, 428, 428, 442, 428, 459, 428, 
-       459, 428, 501, 428, 428, 428, 428, 433, 
-       434, 435, 428, 428, 428, 442, 428, 459, 
-       428, 459, 116, 428, 428, 132, 460, 428, 
-       433, 434, 435, 428, 428, 428, 442, 428, 
-       459, 428, 452, 453, 458, 458, 119, 433, 
-       434, 435, 428, 428, 428, 456, 428, 428, 
-       437, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 438, 428, 
-       452, 453, 454, 458, 119, 433, 434, 435, 
-       428, 428, 147, 456, 428, 428, 437, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 438, 428, 450, 428, 
-       503, 428, 486, 486, 119, 433, 434, 435, 
-       428, 428, 428, 442, 428, 450, 428, 450, 
-       428, 428, 428, 428, 428, 428, 433, 434, 
-       435, 428, 428, 428, 442, 428, 450, 428, 
-       450, 428, 428, 428, 428, 504, 428, 433, 
-       434, 435, 428, 428, 428, 442, 428, 450, 
-       428, 450, 428, 503, 428, 428, 428, 428, 
-       433, 434, 435, 428, 428, 428, 442, 428, 
-       450, 428, 450, 116, 428, 428, 132, 451, 
-       428, 433, 434, 435, 428, 428, 428, 442, 
-       428, 450, 428, 443, 444, 449, 449, 119, 
-       433, 434, 435, 428, 428, 428, 447, 428, 
-       428, 437, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 438, 
-       428, 443, 444, 445, 449, 119, 433, 434, 
-       435, 428, 428, 149, 447, 428, 428, 437, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 438, 428, 440, 
-       428, 505, 428, 486, 486, 119, 433, 434, 
-       435, 428, 428, 428, 442, 428, 440, 428, 
-       440, 428, 428, 428, 428, 428, 428, 433, 
-       434, 435, 428, 428, 428, 442, 428, 440, 
-       428, 440, 428, 428, 428, 428, 506, 428, 
-       433, 434, 435, 428, 428, 428, 442, 428, 
-       440, 428, 440, 428, 505, 428, 428, 428, 
-       428, 433, 434, 435, 428, 428, 428, 442, 
-       428, 440, 428, 440, 116, 428, 428, 132, 
-       441, 428, 433, 434, 435, 428, 428, 428, 
-       442, 428, 440, 428, 429, 430, 432, 432, 
-       119, 433, 434, 435, 428, 428, 428, 436, 
-       428, 428, 437, 428, 428, 428, 428, 428, 
-       428, 428, 428, 428, 428, 428, 428, 428, 
-       438, 428, 181, 182, 183, 184, 507, 359, 
-       81, 187, 188, 189, 190, 190, 152, 191, 
-       357, 181, 194, 357, 357, 357, 357, 357, 
-       357, 357, 357, 357, 357, 357, 357, 357, 
-       196, 357, 198, 508, 200, 201, 5, 202, 
-       203, 204, 197, 197, 37, 205, 197, 197, 
-       206, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 207, 197, 
-       210, 182, 183, 184, 509, 510, 81, 511, 
-       512, 513, 197, 190, 152, 514, 197, 210, 
-       194, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 196, 197, 
-       113, 80, 80, 81, 202, 203, 204, 197, 
-       197, 152, 515, 197, 516, 2, 357, 357, 
-       357, 426, 357, 187, 188, 189, 357, 357, 
-       357, 362, 357, 516, 357, 517, 364, 518, 
-       519, 81, 511, 512, 513, 197, 197, 153, 
-       367, 197, 197, 194, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 196, 197, 520, 364, 369, 369, 81, 
-       511, 512, 513, 197, 197, 197, 367, 197, 
-       197, 194, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 196, 
-       197, 364, 369, 369, 81, 511, 512, 513, 
-       197, 197, 197, 367, 197, 197, 194, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 196, 197, 521, 197, 
-       197, 522, 512, 513, 197, 512, 513, 197, 
-       250, 197, 512, 523, 197, 512, 524, 197, 
-       512, 197, 521, 197, 197, 197, 512, 513, 
-       197, 517, 364, 369, 369, 81, 511, 512, 
-       513, 197, 197, 197, 367, 197, 197, 194, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 197, 197, 196, 197, 517, 
-       364, 518, 369, 81, 511, 512, 513, 197, 
-       197, 153, 367, 197, 197, 194, 197, 197, 
-       197, 197, 197, 197, 197, 197, 197, 197, 
-       197, 197, 197, 196, 197, 210, 197, 275, 
-       113, 525, 525, 155, 202, 203, 204, 197, 
-       197, 197, 515, 197, 210, 197, 526, 179, 
-       527, 528, 157, 511, 512, 513, 197, 197, 
-       197, 529, 197, 179, 527, 528, 157, 511, 
-       512, 513, 197, 197, 197, 529, 197, 527, 
-       527, 157, 511, 512, 513, 197, 197, 197, 
-       529, 197, 530, 176, 531, 532, 160, 511, 
-       512, 513, 197, 197, 197, 529, 197, 176, 
-       531, 532, 160, 511, 512, 513, 197, 197, 
-       197, 529, 197, 531, 531, 160, 511, 512, 
-       513, 197, 197, 197, 529, 197, 533, 173, 
-       534, 535, 163, 511, 512, 513, 197, 197, 
-       197, 529, 197, 173, 534, 535, 163, 511, 
-       512, 513, 197, 197, 197, 529, 197, 534, 
-       534, 163, 511, 512, 513, 197, 197, 197, 
-       529, 197, 536, 170, 197, 537, 197, 511, 
-       512, 513, 197, 197, 197, 529, 197, 170, 
-       197, 537, 197, 511, 512, 513, 197, 197, 
-       197, 529, 197, 511, 512, 513, 197, 197, 
-       197, 529, 197, 538, 197, 539, 540, 197, 
-       511, 512, 513, 197, 197, 167, 197, 166, 
-       197, 197, 197, 197, 511, 512, 513, 197, 
-       511, 512, 513, 197, 538, 197, 197, 197, 
-       197, 511, 512, 513, 197, 538, 197, 539, 
-       197, 197, 511, 512, 513, 197, 197, 167, 
-       197, 516, 166, 357, 357, 95, 361, 357, 
-       187, 188, 189, 357, 357, 357, 362, 357, 
-       516, 357, 542, 541, 541, 541, 541, 543, 
-       544, 545, 541, 543, 544, 545, 541, 546, 
-       541, 541, 547, 544, 545, 541, 544, 545, 
-       541, 548, 541, 544, 549, 541, 544, 550, 
-       541, 544, 541, 546, 541, 541, 541, 544, 
-       545, 541, 0
+       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, 187, 187, 
+       187, 187, 187, 187, 187, 187, 187, 187, 
+       187, 202, 187, 204, 205, 206, 207, 6, 
+       1, 208, 209, 203, 203, 38, 210, 203, 
+       203, 211, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 212, 
+       203, 213, 205, 214, 214, 6, 1, 208, 
+       209, 203, 203, 203, 210, 203, 203, 211, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 212, 203, 205, 
+       214, 214, 6, 1, 208, 209, 203, 203, 
+       203, 210, 203, 203, 211, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 212, 203, 215, 203, 203, 203, 
+       19, 216, 203, 1, 208, 209, 203, 203, 
+       203, 217, 203, 215, 203, 218, 219, 220, 
+       221, 6, 1, 208, 209, 203, 203, 36, 
+       222, 203, 203, 211, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 212, 203, 223, 219, 224, 224, 6, 
+       1, 208, 209, 203, 203, 203, 222, 203, 
+       203, 211, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 212, 
+       203, 219, 224, 224, 6, 1, 208, 209, 
+       203, 203, 203, 222, 203, 203, 211, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 212, 203, 225, 203, 
+       203, 203, 19, 226, 203, 1, 208, 209, 
+       203, 203, 203, 217, 203, 225, 203, 227, 
+       228, 229, 230, 6, 1, 208, 209, 203, 
+       203, 34, 231, 203, 203, 211, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 212, 203, 232, 228, 233, 
+       233, 6, 1, 208, 209, 203, 203, 203, 
+       231, 203, 203, 211, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 212, 203, 228, 233, 233, 6, 1, 
+       208, 209, 203, 203, 203, 231, 203, 203, 
+       211, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 212, 203, 
+       234, 203, 203, 203, 19, 235, 203, 1, 
+       208, 209, 203, 203, 203, 217, 203, 234, 
+       203, 236, 237, 238, 239, 6, 1, 208, 
+       209, 203, 203, 32, 240, 203, 203, 211, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 212, 203, 241, 
+       237, 242, 242, 6, 1, 208, 209, 203, 
+       203, 203, 240, 203, 203, 211, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 212, 203, 237, 242, 242, 
+       6, 1, 208, 209, 203, 203, 203, 240, 
+       203, 203, 211, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       212, 203, 243, 203, 203, 203, 19, 244, 
+       203, 1, 208, 209, 203, 203, 203, 217, 
+       203, 243, 203, 245, 246, 247, 248, 6, 
+       1, 208, 209, 203, 203, 30, 249, 203, 
+       203, 211, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 212, 
+       203, 250, 246, 251, 251, 6, 1, 208, 
+       209, 203, 203, 203, 249, 203, 203, 211, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 212, 203, 246, 
+       251, 251, 6, 1, 208, 209, 203, 203, 
+       203, 249, 203, 203, 211, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 212, 203, 19, 252, 203, 1, 
+       208, 209, 203, 203, 203, 217, 203, 253, 
+       253, 203, 1, 208, 209, 203, 203, 203, 
+       217, 203, 254, 203, 203, 255, 208, 209, 
+       203, 208, 209, 203, 256, 203, 208, 257, 
+       203, 208, 258, 203, 208, 203, 254, 203, 
+       203, 203, 208, 209, 203, 259, 203, 260, 
+       261, 203, 1, 208, 209, 203, 203, 4, 
+       203, 3, 203, 253, 253, 203, 1, 208, 
+       209, 203, 253, 253, 203, 1, 208, 209, 
+       203, 259, 203, 253, 253, 203, 1, 208, 
+       209, 203, 259, 203, 260, 253, 203, 1, 
+       208, 209, 203, 203, 4, 203, 19, 203, 
+       262, 262, 6, 1, 208, 209, 203, 203, 
+       203, 217, 203, 263, 28, 264, 265, 9, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       28, 264, 265, 9, 1, 208, 209, 203, 
+       203, 203, 217, 203, 264, 264, 9, 1, 
+       208, 209, 203, 203, 203, 217, 203, 266, 
+       25, 267, 268, 12, 1, 208, 209, 203, 
+       203, 203, 217, 203, 25, 267, 268, 12, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       267, 267, 12, 1, 208, 209, 203, 203, 
+       203, 217, 203, 269, 22, 270, 271, 15, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       22, 270, 271, 15, 1, 208, 209, 203, 
+       203, 203, 217, 203, 270, 270, 15, 1, 
+       208, 209, 203, 203, 203, 217, 203, 272, 
+       19, 253, 273, 203, 1, 208, 209, 203, 
+       203, 203, 217, 203, 19, 253, 273, 203, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       253, 274, 203, 1, 208, 209, 203, 203, 
+       203, 217, 203, 19, 203, 253, 253, 203, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       2, 3, 203, 203, 19, 252, 203, 1, 
+       208, 209, 203, 203, 203, 217, 203, 2, 
+       203, 246, 251, 251, 6, 1, 208, 209, 
+       203, 203, 203, 249, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 212, 203, 246, 251, 
+       251, 6, 1, 208, 209, 203, 203, 203, 
+       249, 203, 245, 246, 251, 251, 6, 1, 
+       208, 209, 203, 203, 203, 249, 203, 203, 
+       211, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 212, 203, 
+       245, 246, 247, 251, 6, 1, 208, 209, 
+       203, 203, 30, 249, 203, 203, 211, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 212, 203, 243, 203, 
+       275, 203, 262, 262, 6, 1, 208, 209, 
+       203, 203, 203, 217, 203, 243, 203, 243, 
+       203, 203, 203, 253, 253, 203, 1, 208, 
+       209, 203, 203, 203, 217, 203, 243, 203, 
+       243, 203, 203, 203, 253, 276, 203, 1, 
+       208, 209, 203, 203, 203, 217, 203, 243, 
+       203, 243, 203, 275, 203, 253, 253, 203, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       243, 203, 243, 3, 203, 203, 19, 244, 
+       203, 1, 208, 209, 203, 203, 203, 217, 
+       203, 243, 203, 236, 237, 242, 242, 6, 
+       1, 208, 209, 203, 203, 203, 240, 203, 
+       203, 211, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 212, 
+       203, 236, 237, 238, 242, 6, 1, 208, 
+       209, 203, 203, 32, 240, 203, 203, 211, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 212, 203, 234, 
+       203, 277, 203, 262, 262, 6, 1, 208, 
+       209, 203, 203, 203, 217, 203, 234, 203, 
+       234, 203, 203, 203, 253, 253, 203, 1, 
+       208, 209, 203, 203, 203, 217, 203, 234, 
+       203, 234, 203, 203, 203, 253, 278, 203, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       234, 203, 234, 203, 277, 203, 253, 253, 
+       203, 1, 208, 209, 203, 203, 203, 217, 
+       203, 234, 203, 234, 3, 203, 203, 19, 
+       235, 203, 1, 208, 209, 203, 203, 203, 
+       217, 203, 234, 203, 227, 228, 233, 233, 
+       6, 1, 208, 209, 203, 203, 203, 231, 
+       203, 203, 211, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       212, 203, 227, 228, 229, 233, 6, 1, 
+       208, 209, 203, 203, 34, 231, 203, 203, 
+       211, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 212, 203, 
+       225, 203, 279, 203, 262, 262, 6, 1, 
+       208, 209, 203, 203, 203, 217, 203, 225, 
+       203, 225, 203, 203, 203, 253, 253, 203, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       225, 203, 225, 203, 203, 203, 253, 280, 
+       203, 1, 208, 209, 203, 203, 203, 217, 
+       203, 225, 203, 225, 203, 279, 203, 253, 
+       253, 203, 1, 208, 209, 203, 203, 203, 
+       217, 203, 225, 203, 225, 3, 203, 203, 
+       19, 226, 203, 1, 208, 209, 203, 203, 
+       203, 217, 203, 225, 203, 218, 219, 224, 
+       224, 6, 1, 208, 209, 203, 203, 203, 
+       222, 203, 203, 211, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 212, 203, 218, 219, 220, 224, 6, 
+       1, 208, 209, 203, 203, 36, 222, 203, 
+       203, 211, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 212, 
+       203, 215, 203, 281, 203, 262, 262, 6, 
+       1, 208, 209, 203, 203, 203, 217, 203, 
+       215, 203, 215, 203, 203, 203, 253, 253, 
+       203, 1, 208, 209, 203, 203, 203, 217, 
+       203, 215, 203, 215, 203, 203, 203, 253, 
+       282, 203, 1, 208, 209, 203, 203, 203, 
+       217, 203, 215, 203, 215, 203, 281, 203, 
+       253, 253, 203, 1, 208, 209, 203, 203, 
+       203, 217, 203, 215, 203, 215, 3, 203, 
+       203, 19, 216, 203, 1, 208, 209, 203, 
+       203, 203, 217, 203, 215, 203, 204, 205, 
+       214, 214, 6, 1, 208, 209, 203, 203, 
+       203, 210, 203, 203, 211, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 212, 203, 204, 205, 206, 214, 
+       6, 1, 208, 209, 203, 203, 38, 210, 
+       203, 203, 211, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       212, 203, 284, 285, 286, 287, 45, 40, 
+       288, 289, 283, 283, 77, 290, 283, 283, 
+       291, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 292, 283, 
+       293, 285, 294, 287, 45, 40, 288, 289, 
+       283, 283, 283, 290, 283, 283, 291, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 292, 283, 285, 294, 
+       287, 45, 40, 288, 289, 283, 283, 283, 
+       290, 283, 283, 291, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 292, 283, 295, 283, 283, 283, 58, 
+       296, 283, 40, 288, 289, 283, 283, 283, 
+       297, 283, 295, 283, 298, 299, 300, 301, 
+       45, 40, 288, 289, 283, 283, 75, 302, 
+       283, 283, 291, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       292, 283, 303, 299, 304, 304, 45, 40, 
+       288, 289, 283, 283, 283, 302, 283, 283, 
+       291, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 292, 283, 
+       299, 304, 304, 45, 40, 288, 289, 283, 
+       283, 283, 302, 283, 283, 291, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 292, 283, 305, 283, 283, 
+       283, 58, 306, 283, 40, 288, 289, 283, 
+       283, 283, 297, 283, 305, 283, 307, 308, 
+       309, 310, 45, 40, 288, 289, 283, 283, 
+       73, 311, 283, 283, 291, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 292, 283, 312, 308, 313, 313, 
+       45, 40, 288, 289, 283, 283, 283, 311, 
+       283, 283, 291, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       292, 283, 308, 313, 313, 45, 40, 288, 
+       289, 283, 283, 283, 311, 283, 283, 291, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 292, 283, 314, 
+       283, 283, 283, 58, 315, 283, 40, 288, 
+       289, 283, 283, 283, 297, 283, 314, 283, 
+       316, 317, 318, 319, 45, 40, 288, 289, 
+       283, 283, 71, 320, 283, 283, 291, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 292, 283, 321, 317, 
+       322, 322, 45, 40, 288, 289, 283, 283, 
+       283, 320, 283, 283, 291, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 292, 283, 317, 322, 322, 45, 
+       40, 288, 289, 283, 283, 283, 320, 283, 
+       283, 291, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 292, 
+       283, 323, 283, 283, 283, 58, 324, 283, 
+       40, 288, 289, 283, 283, 283, 297, 283, 
+       323, 283, 325, 326, 327, 328, 45, 40, 
+       288, 289, 283, 283, 69, 329, 283, 283, 
+       291, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 292, 283, 
+       330, 326, 331, 331, 45, 40, 288, 289, 
+       283, 283, 283, 329, 283, 283, 291, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 292, 283, 326, 331, 
+       331, 45, 40, 288, 289, 283, 283, 283, 
+       329, 283, 283, 291, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 292, 283, 58, 332, 283, 40, 288, 
+       289, 283, 283, 283, 297, 283, 333, 333, 
+       283, 40, 288, 289, 283, 283, 283, 297, 
+       283, 334, 283, 283, 335, 288, 289, 283, 
+       288, 289, 283, 336, 283, 288, 337, 283, 
+       288, 338, 283, 288, 283, 334, 283, 283, 
+       283, 288, 289, 283, 339, 283, 340, 341, 
+       283, 40, 288, 289, 283, 283, 43, 283, 
+       42, 283, 333, 333, 283, 40, 288, 289, 
+       283, 333, 333, 283, 40, 288, 289, 283, 
+       339, 283, 333, 333, 283, 40, 288, 289, 
+       283, 339, 283, 340, 333, 283, 40, 288, 
+       289, 283, 283, 43, 283, 58, 283, 342, 
+       342, 45, 40, 288, 289, 283, 283, 283, 
+       297, 283, 343, 67, 344, 345, 48, 40, 
+       288, 289, 283, 283, 283, 297, 283, 67, 
+       344, 345, 48, 40, 288, 289, 283, 283, 
+       283, 297, 283, 344, 344, 48, 40, 288, 
+       289, 283, 283, 283, 297, 283, 346, 64, 
+       347, 348, 51, 40, 288, 289, 283, 283, 
+       283, 297, 283, 64, 347, 348, 51, 40, 
+       288, 289, 283, 283, 283, 297, 283, 347, 
+       347, 51, 40, 288, 289, 283, 283, 283, 
+       297, 283, 349, 61, 350, 351, 54, 40, 
+       288, 289, 283, 283, 283, 297, 283, 61, 
+       350, 351, 54, 40, 288, 289, 283, 283, 
+       283, 297, 283, 350, 350, 54, 40, 288, 
+       289, 283, 283, 283, 297, 283, 352, 58, 
+       333, 353, 283, 40, 288, 289, 283, 283, 
+       283, 297, 283, 58, 333, 353, 283, 40, 
+       288, 289, 283, 283, 283, 297, 283, 333, 
+       354, 283, 40, 288, 289, 283, 283, 283, 
+       297, 283, 58, 283, 333, 333, 283, 40, 
+       288, 289, 283, 283, 283, 297, 283, 41, 
+       42, 283, 283, 58, 332, 283, 40, 288, 
+       289, 283, 283, 283, 297, 283, 41, 283, 
+       326, 331, 331, 45, 40, 288, 289, 283, 
+       283, 283, 329, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 292, 283, 326, 331, 331, 
+       45, 40, 288, 289, 283, 283, 283, 329, 
+       283, 325, 326, 331, 331, 45, 40, 288, 
+       289, 283, 283, 283, 329, 283, 283, 291, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 292, 283, 325, 
+       326, 327, 331, 45, 40, 288, 289, 283, 
+       283, 69, 329, 283, 283, 291, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 292, 283, 323, 283, 355, 
+       283, 342, 342, 45, 40, 288, 289, 283, 
+       283, 283, 297, 283, 323, 283, 323, 283, 
+       283, 283, 333, 333, 283, 40, 288, 289, 
+       283, 283, 283, 297, 283, 323, 283, 323, 
+       283, 283, 283, 333, 356, 283, 40, 288, 
+       289, 283, 283, 283, 297, 283, 323, 283, 
+       323, 283, 355, 283, 333, 333, 283, 40, 
+       288, 289, 283, 283, 283, 297, 283, 323, 
+       283, 323, 42, 283, 283, 58, 324, 283, 
+       40, 288, 289, 283, 283, 283, 297, 283, 
+       323, 283, 316, 317, 322, 322, 45, 40, 
+       288, 289, 283, 283, 283, 320, 283, 283, 
+       291, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 292, 283, 
+       316, 317, 318, 322, 45, 40, 288, 289, 
+       283, 283, 71, 320, 283, 283, 291, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 292, 283, 314, 283, 
+       357, 283, 342, 342, 45, 40, 288, 289, 
+       283, 283, 283, 297, 283, 314, 283, 314, 
+       283, 283, 283, 333, 333, 283, 40, 288, 
+       289, 283, 283, 283, 297, 283, 314, 283, 
+       314, 283, 283, 283, 333, 358, 283, 40, 
+       288, 289, 283, 283, 283, 297, 283, 314, 
+       283, 314, 283, 357, 283, 333, 333, 283, 
+       40, 288, 289, 283, 283, 283, 297, 283, 
+       314, 283, 314, 42, 283, 283, 58, 315, 
+       283, 40, 288, 289, 283, 283, 283, 297, 
+       283, 314, 283, 307, 308, 313, 313, 45, 
+       40, 288, 289, 283, 283, 283, 311, 283, 
+       283, 291, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 292, 
+       283, 307, 308, 309, 313, 45, 40, 288, 
+       289, 283, 283, 73, 311, 283, 283, 291, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 292, 283, 305, 
+       283, 359, 283, 342, 342, 45, 40, 288, 
+       289, 283, 283, 283, 297, 283, 305, 283, 
+       305, 283, 283, 283, 333, 333, 283, 40, 
+       288, 289, 283, 283, 283, 297, 283, 305, 
+       283, 305, 283, 283, 283, 333, 360, 283, 
+       40, 288, 289, 283, 283, 283, 297, 283, 
+       305, 283, 305, 283, 359, 283, 333, 333, 
+       283, 40, 288, 289, 283, 283, 283, 297, 
+       283, 305, 283, 305, 42, 283, 283, 58, 
+       306, 283, 40, 288, 289, 283, 283, 283, 
+       297, 283, 305, 283, 298, 299, 304, 304, 
+       45, 40, 288, 289, 283, 283, 283, 302, 
+       283, 283, 291, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       292, 283, 298, 299, 300, 304, 45, 40, 
+       288, 289, 283, 283, 75, 302, 283, 283, 
+       291, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 283, 292, 283, 
+       295, 283, 361, 283, 342, 342, 45, 40, 
+       288, 289, 283, 283, 283, 297, 283, 295, 
+       283, 295, 283, 283, 283, 333, 333, 283, 
+       40, 288, 289, 283, 283, 283, 297, 283, 
+       295, 283, 295, 283, 283, 283, 333, 362, 
+       283, 40, 288, 289, 283, 283, 283, 297, 
+       283, 295, 283, 295, 283, 361, 283, 333, 
+       333, 283, 40, 288, 289, 283, 283, 283, 
+       297, 283, 295, 283, 76, 44, 44, 45, 
+       40, 283, 283, 283, 283, 283, 76, 283, 
+       295, 42, 283, 283, 58, 296, 283, 40, 
+       288, 289, 283, 283, 283, 297, 283, 295, 
+       283, 284, 285, 294, 287, 45, 40, 288, 
+       289, 283, 283, 283, 290, 283, 283, 291, 
+       283, 283, 283, 283, 283, 283, 283, 283, 
+       283, 283, 283, 283, 283, 292, 283, 364, 
+       191, 365, 365, 84, 79, 194, 195, 363, 
+       363, 363, 197, 363, 363, 200, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 202, 363, 191, 365, 365, 
+       84, 79, 194, 195, 363, 363, 363, 197, 
+       363, 363, 200, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       202, 363, 366, 363, 363, 363, 98, 367, 
+       363, 79, 194, 195, 363, 363, 363, 368, 
+       363, 366, 363, 369, 370, 371, 372, 84, 
+       79, 194, 195, 363, 363, 115, 373, 363, 
+       363, 200, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 202, 
+       363, 374, 370, 375, 375, 84, 79, 194, 
+       195, 363, 363, 363, 373, 363, 363, 200, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 202, 363, 370, 
+       375, 375, 84, 79, 194, 195, 363, 363, 
+       363, 373, 363, 363, 200, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 202, 363, 376, 363, 363, 363, 
+       98, 377, 363, 79, 194, 195, 363, 363, 
+       363, 368, 363, 376, 363, 378, 379, 380, 
+       381, 84, 79, 194, 195, 363, 363, 113, 
+       382, 363, 363, 200, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 202, 363, 383, 379, 384, 384, 84, 
+       79, 194, 195, 363, 363, 363, 382, 363, 
+       363, 200, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 202, 
+       363, 379, 384, 384, 84, 79, 194, 195, 
+       363, 363, 363, 382, 363, 363, 200, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 202, 363, 385, 363, 
+       363, 363, 98, 386, 363, 79, 194, 195, 
+       363, 363, 363, 368, 363, 385, 363, 387, 
+       388, 389, 390, 84, 79, 194, 195, 363, 
+       363, 111, 391, 363, 363, 200, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 202, 363, 392, 388, 393, 
+       393, 84, 79, 194, 195, 363, 363, 363, 
+       391, 363, 363, 200, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 202, 363, 388, 393, 393, 84, 79, 
+       194, 195, 363, 363, 363, 391, 363, 363, 
+       200, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 202, 363, 
+       394, 363, 363, 363, 98, 395, 363, 79, 
+       194, 195, 363, 363, 363, 368, 363, 394, 
+       363, 396, 397, 398, 399, 84, 79, 194, 
+       195, 363, 363, 109, 400, 363, 363, 200, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 202, 363, 401, 
+       397, 402, 402, 84, 79, 194, 195, 363, 
+       363, 363, 400, 363, 363, 200, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 202, 363, 397, 402, 402, 
+       84, 79, 194, 195, 363, 363, 363, 400, 
+       363, 363, 200, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       202, 363, 98, 403, 363, 79, 194, 195, 
+       363, 363, 363, 368, 363, 404, 404, 363, 
+       79, 194, 195, 363, 363, 363, 368, 363, 
+       405, 363, 363, 406, 194, 195, 363, 194, 
+       195, 363, 407, 363, 194, 408, 363, 194, 
+       409, 363, 194, 363, 405, 363, 363, 363, 
+       194, 195, 363, 410, 363, 411, 412, 363, 
+       79, 194, 195, 363, 363, 82, 363, 81, 
+       363, 404, 404, 363, 79, 194, 195, 363, 
+       404, 404, 363, 79, 194, 195, 363, 410, 
+       363, 404, 404, 363, 79, 194, 195, 363, 
+       410, 363, 411, 404, 363, 79, 194, 195, 
+       363, 363, 82, 363, 98, 363, 413, 413, 
+       84, 79, 194, 195, 363, 363, 363, 368, 
+       363, 414, 107, 415, 416, 88, 79, 194, 
+       195, 363, 363, 363, 368, 363, 107, 415, 
+       416, 88, 79, 194, 195, 363, 363, 363, 
+       368, 363, 415, 415, 88, 79, 194, 195, 
+       363, 363, 363, 368, 363, 417, 104, 418, 
+       419, 91, 79, 194, 195, 363, 363, 363, 
+       368, 363, 104, 418, 419, 91, 79, 194, 
+       195, 363, 363, 363, 368, 363, 418, 418, 
+       91, 79, 194, 195, 363, 363, 363, 368, 
+       363, 420, 101, 421, 422, 94, 79, 194, 
+       195, 363, 363, 363, 368, 363, 101, 421, 
+       422, 94, 79, 194, 195, 363, 363, 363, 
+       368, 363, 421, 421, 94, 79, 194, 195, 
+       363, 363, 363, 368, 363, 423, 98, 404, 
+       424, 363, 79, 194, 195, 363, 363, 363, 
+       368, 363, 98, 404, 424, 363, 79, 194, 
+       195, 363, 363, 363, 368, 363, 404, 425, 
+       363, 79, 194, 195, 363, 363, 363, 368, 
+       363, 98, 363, 404, 404, 363, 79, 194, 
+       195, 363, 363, 363, 368, 363, 80, 81, 
+       363, 363, 98, 403, 363, 79, 194, 195, 
+       363, 363, 363, 368, 363, 80, 363, 397, 
+       402, 402, 84, 79, 194, 195, 363, 363, 
+       363, 400, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 202, 363, 397, 402, 402, 84, 
+       79, 194, 195, 363, 363, 363, 400, 363, 
+       396, 397, 402, 402, 84, 79, 194, 195, 
+       363, 363, 363, 400, 363, 363, 200, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 202, 363, 396, 397, 
+       398, 402, 84, 79, 194, 195, 363, 363, 
+       109, 400, 363, 363, 200, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 202, 363, 394, 363, 426, 363, 
+       413, 413, 84, 79, 194, 195, 363, 363, 
+       363, 368, 363, 394, 363, 394, 363, 363, 
+       363, 404, 404, 363, 79, 194, 195, 363, 
+       363, 363, 368, 363, 394, 363, 394, 363, 
+       363, 363, 404, 427, 363, 79, 194, 195, 
+       363, 363, 363, 368, 363, 394, 363, 394, 
+       363, 426, 363, 404, 404, 363, 79, 194, 
+       195, 363, 363, 363, 368, 363, 394, 363, 
+       394, 81, 363, 363, 98, 395, 363, 79, 
+       194, 195, 363, 363, 363, 368, 363, 394, 
+       363, 387, 388, 393, 393, 84, 79, 194, 
+       195, 363, 363, 363, 391, 363, 363, 200, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 202, 363, 387, 
+       388, 389, 393, 84, 79, 194, 195, 363, 
+       363, 111, 391, 363, 363, 200, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 202, 363, 385, 363, 428, 
+       363, 413, 413, 84, 79, 194, 195, 363, 
+       363, 363, 368, 363, 385, 363, 385, 363, 
+       363, 363, 404, 404, 363, 79, 194, 195, 
+       363, 363, 363, 368, 363, 385, 363, 385, 
+       363, 363, 363, 404, 429, 363, 79, 194, 
+       195, 363, 363, 363, 368, 363, 385, 363, 
+       385, 363, 428, 363, 404, 404, 363, 79, 
+       194, 195, 363, 363, 363, 368, 363, 385, 
+       363, 385, 81, 363, 363, 98, 386, 363, 
+       79, 194, 195, 363, 363, 363, 368, 363, 
+       385, 363, 378, 379, 384, 384, 84, 79, 
+       194, 195, 363, 363, 363, 382, 363, 363, 
+       200, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 202, 363, 
+       378, 379, 380, 384, 84, 79, 194, 195, 
+       363, 363, 113, 382, 363, 363, 200, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 202, 363, 376, 363, 
+       430, 363, 413, 413, 84, 79, 194, 195, 
+       363, 363, 363, 368, 363, 376, 363, 376, 
+       363, 363, 363, 404, 404, 363, 79, 194, 
+       195, 363, 363, 363, 368, 363, 376, 363, 
+       376, 363, 363, 363, 404, 431, 363, 79, 
+       194, 195, 363, 363, 363, 368, 363, 376, 
+       363, 376, 363, 430, 363, 404, 404, 363, 
+       79, 194, 195, 363, 363, 363, 368, 363, 
+       376, 363, 376, 81, 363, 363, 98, 377, 
+       363, 79, 194, 195, 363, 363, 363, 368, 
+       363, 376, 363, 369, 370, 375, 375, 84, 
+       79, 194, 195, 363, 363, 363, 373, 363, 
+       363, 200, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 202, 
+       363, 369, 370, 371, 375, 84, 79, 194, 
+       195, 363, 363, 115, 373, 363, 363, 200, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 202, 363, 366, 
+       363, 432, 363, 413, 413, 84, 79, 194, 
+       195, 363, 363, 363, 368, 363, 366, 363, 
+       366, 363, 363, 363, 404, 404, 363, 79, 
+       194, 195, 363, 363, 363, 368, 363, 366, 
+       363, 366, 363, 363, 363, 404, 433, 363, 
+       79, 194, 195, 363, 363, 363, 368, 363, 
+       366, 363, 366, 363, 432, 363, 404, 404, 
+       363, 79, 194, 195, 363, 363, 363, 368, 
+       363, 366, 363, 366, 81, 363, 363, 98, 
+       367, 363, 79, 194, 195, 363, 363, 363, 
+       368, 363, 366, 363, 116, 83, 83, 84, 
+       79, 434, 434, 434, 434, 156, 116, 434, 
+       190, 191, 365, 365, 84, 79, 194, 195, 
+       363, 363, 363, 197, 363, 363, 200, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 363, 363, 363, 202, 363, 116, 83, 
+       83, 84, 79, 434, 434, 434, 434, 434, 
+       116, 434, 436, 437, 438, 439, 123, 118, 
+       440, 441, 435, 435, 155, 442, 435, 435, 
+       443, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 444, 435, 
+       445, 437, 439, 439, 123, 118, 440, 441, 
+       435, 435, 435, 442, 435, 435, 443, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 444, 435, 437, 439, 
+       439, 123, 118, 440, 441, 435, 435, 435, 
+       442, 435, 435, 443, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 444, 435, 446, 435, 435, 435, 136, 
+       447, 435, 118, 440, 441, 435, 435, 435, 
+       448, 435, 446, 435, 449, 450, 451, 452, 
+       123, 118, 440, 441, 435, 435, 153, 453, 
+       435, 435, 443, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       444, 435, 454, 450, 455, 455, 123, 118, 
+       440, 441, 435, 435, 435, 453, 435, 435, 
+       443, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 444, 435, 
+       450, 455, 455, 123, 118, 440, 441, 435, 
+       435, 435, 453, 435, 435, 443, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 444, 435, 456, 435, 435, 
+       435, 136, 457, 435, 118, 440, 441, 435, 
+       435, 435, 448, 435, 456, 435, 458, 459, 
+       460, 461, 123, 118, 440, 441, 435, 435, 
+       151, 462, 435, 435, 443, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 444, 435, 463, 459, 464, 464, 
+       123, 118, 440, 441, 435, 435, 435, 462, 
+       435, 435, 443, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       444, 435, 459, 464, 464, 123, 118, 440, 
+       441, 435, 435, 435, 462, 435, 435, 443, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 444, 435, 465, 
+       435, 435, 435, 136, 466, 435, 118, 440, 
+       441, 435, 435, 435, 448, 435, 465, 435, 
+       467, 468, 469, 470, 123, 118, 440, 441, 
+       435, 435, 149, 471, 435, 435, 443, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 444, 435, 472, 468, 
+       473, 473, 123, 118, 440, 441, 435, 435, 
+       435, 471, 435, 435, 443, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 444, 435, 468, 473, 473, 123, 
+       118, 440, 441, 435, 435, 435, 471, 435, 
+       435, 443, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 444, 
+       435, 474, 435, 435, 435, 136, 475, 435, 
+       118, 440, 441, 435, 435, 435, 448, 435, 
+       474, 435, 476, 477, 478, 479, 123, 118, 
+       440, 441, 435, 435, 147, 480, 435, 435, 
+       443, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 444, 435, 
+       481, 477, 482, 482, 123, 118, 440, 441, 
+       435, 435, 435, 480, 435, 435, 443, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 444, 435, 477, 482, 
+       482, 123, 118, 440, 441, 435, 435, 435, 
+       480, 435, 435, 443, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 444, 435, 136, 483, 435, 118, 440, 
+       441, 435, 435, 435, 448, 435, 484, 484, 
+       435, 118, 440, 441, 435, 435, 435, 448, 
+       435, 485, 435, 435, 486, 440, 441, 435, 
+       440, 441, 435, 487, 435, 440, 488, 435, 
+       440, 489, 435, 440, 435, 485, 435, 435, 
+       435, 440, 441, 435, 490, 435, 491, 492, 
+       435, 118, 440, 441, 435, 435, 121, 435, 
+       120, 435, 484, 484, 435, 118, 440, 441, 
+       435, 484, 484, 435, 118, 440, 441, 435, 
+       490, 435, 484, 484, 435, 118, 440, 441, 
+       435, 490, 435, 491, 484, 435, 118, 440, 
+       441, 435, 435, 121, 435, 136, 435, 493, 
+       493, 123, 118, 440, 441, 435, 435, 435, 
+       448, 435, 494, 145, 495, 496, 126, 118, 
+       440, 441, 435, 435, 435, 448, 435, 145, 
+       495, 496, 126, 118, 440, 441, 435, 435, 
+       435, 448, 435, 495, 495, 126, 118, 440, 
+       441, 435, 435, 435, 448, 435, 497, 142, 
+       498, 499, 129, 118, 440, 441, 435, 435, 
+       435, 448, 435, 142, 498, 499, 129, 118, 
+       440, 441, 435, 435, 435, 448, 435, 498, 
+       498, 129, 118, 440, 441, 435, 435, 435, 
+       448, 435, 500, 139, 501, 502, 132, 118, 
+       440, 441, 435, 435, 435, 448, 435, 139, 
+       501, 502, 132, 118, 440, 441, 435, 435, 
+       435, 448, 435, 501, 501, 132, 118, 440, 
+       441, 435, 435, 435, 448, 435, 503, 136, 
+       484, 504, 435, 118, 440, 441, 435, 435, 
+       435, 448, 435, 136, 484, 504, 435, 118, 
+       440, 441, 435, 435, 435, 448, 435, 484, 
+       505, 435, 118, 440, 441, 435, 435, 435, 
+       448, 435, 136, 435, 484, 484, 435, 118, 
+       440, 441, 435, 435, 435, 448, 435, 119, 
+       120, 435, 435, 136, 483, 435, 118, 440, 
+       441, 435, 435, 435, 448, 435, 119, 435, 
+       477, 482, 482, 123, 118, 440, 441, 435, 
+       435, 435, 480, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 444, 435, 477, 482, 482, 
+       123, 118, 440, 441, 435, 435, 435, 480, 
+       435, 476, 477, 482, 482, 123, 118, 440, 
+       441, 435, 435, 435, 480, 435, 435, 443, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 444, 435, 476, 
+       477, 478, 482, 123, 118, 440, 441, 435, 
+       435, 147, 480, 435, 435, 443, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 444, 435, 474, 435, 506, 
+       435, 493, 493, 123, 118, 440, 441, 435, 
+       435, 435, 448, 435, 474, 435, 474, 435, 
+       435, 435, 484, 484, 435, 118, 440, 441, 
+       435, 435, 435, 448, 435, 474, 435, 474, 
+       435, 435, 435, 484, 507, 435, 118, 440, 
+       441, 435, 435, 435, 448, 435, 474, 435, 
+       474, 435, 506, 435, 484, 484, 435, 118, 
+       440, 441, 435, 435, 435, 448, 435, 474, 
+       435, 474, 120, 435, 435, 136, 475, 435, 
+       118, 440, 441, 435, 435, 435, 448, 435, 
+       474, 435, 467, 468, 473, 473, 123, 118, 
+       440, 441, 435, 435, 435, 471, 435, 435, 
+       443, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 444, 435, 
+       467, 468, 469, 473, 123, 118, 440, 441, 
+       435, 435, 149, 471, 435, 435, 443, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 444, 435, 465, 435, 
+       508, 435, 493, 493, 123, 118, 440, 441, 
+       435, 435, 435, 448, 435, 465, 435, 465, 
+       435, 435, 435, 484, 484, 435, 118, 440, 
+       441, 435, 435, 435, 448, 435, 465, 435, 
+       465, 435, 435, 435, 484, 509, 435, 118, 
+       440, 441, 435, 435, 435, 448, 435, 465, 
+       435, 465, 435, 508, 435, 484, 484, 435, 
+       118, 440, 441, 435, 435, 435, 448, 435, 
+       465, 435, 465, 120, 435, 435, 136, 466, 
+       435, 118, 440, 441, 435, 435, 435, 448, 
+       435, 465, 435, 458, 459, 464, 464, 123, 
+       118, 440, 441, 435, 435, 435, 462, 435, 
+       435, 443, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 444, 
+       435, 458, 459, 460, 464, 123, 118, 440, 
+       441, 435, 435, 151, 462, 435, 435, 443, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 444, 435, 456, 
+       435, 510, 435, 493, 493, 123, 118, 440, 
+       441, 435, 435, 435, 448, 435, 456, 435, 
+       456, 435, 435, 435, 484, 484, 435, 118, 
+       440, 441, 435, 435, 435, 448, 435, 456, 
+       435, 456, 435, 435, 435, 484, 511, 435, 
+       118, 440, 441, 435, 435, 435, 448, 435, 
+       456, 435, 456, 435, 510, 435, 484, 484, 
+       435, 118, 440, 441, 435, 435, 435, 448, 
+       435, 456, 435, 456, 120, 435, 435, 136, 
+       457, 435, 118, 440, 441, 435, 435, 435, 
+       448, 435, 456, 435, 449, 450, 455, 455, 
+       123, 118, 440, 441, 435, 435, 435, 453, 
+       435, 435, 443, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       444, 435, 449, 450, 451, 455, 123, 118, 
+       440, 441, 435, 435, 153, 453, 435, 435, 
+       443, 435, 435, 435, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 444, 435, 
+       446, 435, 512, 435, 493, 493, 123, 118, 
+       440, 441, 435, 435, 435, 448, 435, 446, 
+       435, 446, 435, 435, 435, 484, 484, 435, 
+       118, 440, 441, 435, 435, 435, 448, 435, 
+       446, 435, 446, 435, 435, 435, 484, 513, 
+       435, 118, 440, 441, 435, 435, 435, 448, 
+       435, 446, 435, 446, 435, 512, 435, 484, 
+       484, 435, 118, 440, 441, 435, 435, 435, 
+       448, 435, 446, 435, 446, 120, 435, 435, 
+       136, 447, 435, 118, 440, 441, 435, 435, 
+       435, 448, 435, 446, 435, 436, 437, 439, 
+       439, 123, 118, 440, 441, 435, 435, 435, 
+       442, 435, 435, 443, 435, 435, 435, 435, 
+       435, 435, 435, 435, 435, 435, 435, 435, 
+       435, 444, 435, 188, 189, 190, 191, 514, 
+       365, 84, 79, 194, 195, 196, 196, 156, 
+       197, 363, 188, 200, 363, 363, 363, 363, 
+       363, 363, 363, 363, 363, 363, 363, 363, 
+       363, 202, 363, 204, 515, 206, 207, 6, 
+       1, 208, 209, 203, 203, 38, 210, 203, 
+       203, 211, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 212, 
+       203, 215, 189, 190, 191, 516, 517, 84, 
+       157, 518, 519, 203, 196, 156, 520, 203, 
+       215, 200, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 202, 
+       203, 116, 521, 521, 84, 157, 208, 209, 
+       203, 203, 156, 522, 203, 523, 203, 203, 
+       524, 518, 519, 203, 518, 519, 203, 256, 
+       203, 518, 525, 203, 518, 526, 203, 518, 
+       203, 523, 203, 203, 203, 518, 519, 203, 
+       527, 3, 363, 363, 404, 433, 363, 79, 
+       194, 195, 363, 363, 363, 368, 363, 527, 
+       363, 528, 370, 529, 530, 84, 157, 518, 
+       519, 203, 203, 158, 373, 203, 203, 200, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 202, 203, 531, 
+       370, 532, 532, 84, 157, 518, 519, 203, 
+       203, 203, 373, 203, 203, 200, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 202, 203, 370, 532, 532, 
+       84, 157, 518, 519, 203, 203, 203, 373, 
+       203, 203, 200, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       202, 203, 528, 370, 532, 532, 84, 157, 
+       518, 519, 203, 203, 203, 373, 203, 203, 
+       200, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 203, 203, 202, 203, 
+       528, 370, 529, 532, 84, 157, 518, 519, 
+       203, 203, 158, 373, 203, 203, 200, 203, 
+       203, 203, 203, 203, 203, 203, 203, 203, 
+       203, 203, 203, 203, 202, 203, 215, 203, 
+       281, 116, 533, 533, 160, 157, 208, 209, 
+       203, 203, 203, 522, 203, 215, 203, 534, 
+       184, 535, 536, 162, 157, 518, 519, 203, 
+       203, 203, 537, 203, 184, 535, 536, 162, 
+       157, 518, 519, 203, 203, 203, 537, 203, 
+       535, 535, 162, 157, 518, 519, 203, 203, 
+       203, 537, 203, 538, 181, 539, 540, 165, 
+       157, 518, 519, 203, 203, 203, 537, 203, 
+       181, 539, 540, 165, 157, 518, 519, 203, 
+       203, 203, 537, 203, 539, 539, 165, 157, 
+       518, 519, 203, 203, 203, 537, 203, 541, 
+       178, 542, 543, 168, 157, 518, 519, 203, 
+       203, 203, 537, 203, 178, 542, 543, 168, 
+       157, 518, 519, 203, 203, 203, 537, 203, 
+       542, 542, 168, 157, 518, 519, 203, 203, 
+       203, 537, 203, 544, 175, 545, 546, 203, 
+       157, 518, 519, 203, 203, 203, 537, 203, 
+       175, 545, 546, 203, 157, 518, 519, 203, 
+       203, 203, 537, 203, 545, 545, 203, 157, 
+       518, 519, 203, 203, 203, 537, 203, 547, 
+       203, 548, 549, 203, 157, 518, 519, 203, 
+       203, 172, 203, 171, 203, 545, 545, 203, 
+       157, 518, 519, 203, 545, 545, 203, 157, 
+       518, 519, 203, 547, 203, 545, 545, 203, 
+       157, 518, 519, 203, 547, 203, 548, 545, 
+       203, 157, 518, 519, 203, 203, 172, 203, 
+       527, 171, 363, 363, 98, 367, 363, 79, 
+       194, 195, 363, 363, 363, 368, 363, 527, 
+       363, 551, 550, 552, 552, 550, 186, 553, 
+       554, 550, 552, 552, 550, 186, 553, 554, 
+       550, 555, 550, 550, 556, 553, 554, 550, 
+       553, 554, 550, 557, 550, 553, 558, 550, 
+       553, 559, 550, 553, 550, 555, 550, 550, 
+       550, 553, 554, 550, 0
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
 };
 
 static const short _indic_syllable_machine_trans_targs[] = {
-       170, 199, 201, 202, 3, 205, 4, 6, 
-       208, 7, 9, 211, 10, 12, 214, 13, 
-       15, 16, 191, 18, 19, 213, 21, 22, 
-       210, 24, 25, 207, 216, 221, 225, 228, 
-       232, 235, 239, 242, 246, 249, 170, 279, 
-       281, 282, 39, 285, 40, 42, 288, 43, 
-       45, 291, 46, 48, 294, 49, 51, 52, 
-       271, 54, 55, 293, 57, 58, 290, 60, 
-       61, 287, 296, 301, 305, 308, 312, 315, 
-       319, 322, 326, 330, 170, 358, 360, 361, 
-       75, 364, 170, 76, 78, 367, 79, 81, 
-       370, 82, 84, 373, 85, 87, 88, 350, 
-       90, 91, 372, 93, 94, 369, 96, 97, 
-       366, 375, 380, 384, 387, 391, 394, 398, 
-       401, 405, 170, 439, 441, 442, 110, 445, 
-       111, 113, 448, 114, 116, 451, 117, 119, 
-       454, 120, 122, 123, 431, 125, 126, 453, 
-       128, 129, 450, 131, 132, 447, 456, 461, 
-       465, 468, 472, 475, 479, 482, 486, 489, 
-       409, 505, 146, 508, 148, 511, 149, 151, 
-       514, 152, 154, 517, 155, 520, 522, 523, 
-       159, 160, 519, 162, 163, 516, 165, 166, 
-       513, 168, 169, 510, 170, 171, 251, 331, 
-       333, 408, 410, 351, 353, 354, 411, 407, 
-       490, 491, 378, 526, 379, 170, 172, 174, 
-       35, 250, 192, 194, 195, 248, 219, 220, 
-       173, 34, 175, 244, 0, 176, 178, 33, 
-       243, 241, 177, 32, 179, 237, 180, 182, 
-       31, 236, 234, 181, 30, 183, 230, 184, 
-       186, 29, 229, 227, 185, 28, 187, 223, 
-       188, 190, 27, 222, 218, 189, 26, 204, 
-       193, 198, 170, 196, 197, 200, 1, 203, 
-       2, 206, 5, 23, 209, 8, 20, 212, 
-       11, 17, 215, 14, 217, 224, 226, 231, 
-       233, 238, 240, 245, 247, 170, 252, 254, 
-       71, 328, 272, 274, 275, 329, 299, 300, 
-       253, 70, 255, 324, 36, 256, 258, 69, 
-       323, 321, 257, 68, 259, 317, 260, 262, 
-       67, 316, 314, 261, 66, 263, 310, 264, 
-       266, 65, 309, 307, 265, 64, 267, 303, 
-       268, 270, 63, 302, 298, 269, 62, 284, 
-       273, 278, 170, 276, 277, 280, 37, 283, 
-       38, 286, 41, 59, 289, 44, 56, 292, 
-       47, 53, 295, 50, 297, 304, 306, 311, 
-       313, 318, 320, 325, 327, 170, 332, 106, 
-       334, 403, 72, 335, 337, 105, 402, 400, 
-       336, 104, 338, 396, 339, 341, 103, 395, 
-       393, 340, 102, 342, 389, 343, 345, 101, 
-       388, 386, 344, 100, 346, 382, 347, 349, 
-       99, 381, 377, 348, 98, 363, 352, 357, 
-       170, 355, 356, 359, 73, 362, 74, 365, 
-       77, 95, 368, 80, 92, 371, 83, 89, 
-       374, 86, 376, 383, 385, 390, 392, 397, 
-       399, 404, 406, 170, 170, 412, 414, 142, 
-       141, 432, 434, 435, 488, 459, 460, 413, 
-       415, 484, 107, 416, 418, 140, 483, 481, 
-       417, 139, 419, 477, 420, 422, 138, 476, 
-       474, 421, 137, 423, 470, 424, 426, 136, 
-       469, 467, 425, 135, 427, 463, 428, 430, 
-       134, 462, 458, 429, 133, 444, 433, 438, 
-       170, 436, 437, 440, 108, 443, 109, 446, 
-       112, 130, 449, 115, 127, 452, 118, 124, 
-       455, 121, 457, 464, 466, 471, 473, 478, 
-       480, 485, 487, 143, 492, 493, 507, 498, 
-       500, 501, 525, 494, 495, 496, 144, 506, 
-       497, 499, 504, 502, 503, 145, 509, 147, 
-       167, 156, 512, 150, 164, 515, 153, 161, 
-       518, 158, 521, 157, 524, 170, 527, 528, 
-       530, 531, 529, 534, 170, 532, 533
+       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, 229, 233, 
+       236, 240, 243, 247, 250, 254, 257, 178, 
+       280, 287, 289, 290, 41, 293, 42, 44, 
+       296, 45, 47, 299, 48, 50, 302, 51, 
+       53, 54, 279, 56, 57, 301, 59, 60, 
+       298, 62, 63, 295, 304, 309, 313, 316, 
+       320, 323, 327, 330, 334, 338, 178, 359, 
+       366, 368, 369, 78, 372, 178, 79, 81, 
+       375, 82, 84, 378, 85, 87, 381, 88, 
+       90, 91, 358, 93, 94, 380, 96, 97, 
+       377, 99, 100, 374, 383, 388, 392, 395, 
+       399, 402, 406, 409, 413, 178, 440, 447, 
+       449, 450, 114, 453, 115, 117, 456, 118, 
+       120, 459, 121, 123, 462, 124, 126, 127, 
+       439, 129, 130, 461, 132, 133, 458, 135, 
+       136, 455, 464, 469, 473, 476, 480, 483, 
+       487, 490, 494, 497, 417, 502, 513, 152, 
+       516, 154, 519, 155, 157, 522, 158, 160, 
+       525, 161, 528, 530, 531, 166, 167, 527, 
+       169, 170, 524, 172, 173, 521, 175, 176, 
+       518, 178, 536, 178, 179, 259, 339, 341, 
+       416, 418, 361, 362, 419, 415, 498, 499, 
+       386, 534, 387, 178, 180, 182, 36, 258, 
+       202, 203, 256, 227, 228, 181, 35, 183, 
+       252, 1, 184, 186, 34, 251, 249, 185, 
+       33, 187, 245, 188, 190, 32, 244, 242, 
+       189, 31, 191, 238, 192, 194, 30, 237, 
+       235, 193, 29, 195, 231, 196, 198, 28, 
+       230, 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, 232, 234, 239, 241, 246, 
+       248, 253, 255, 178, 260, 262, 73, 336, 
+       282, 283, 337, 307, 308, 261, 72, 263, 
+       332, 38, 264, 266, 71, 331, 329, 265, 
+       70, 267, 325, 268, 270, 69, 324, 322, 
+       269, 68, 271, 318, 272, 274, 67, 317, 
+       315, 273, 66, 275, 311, 276, 278, 65, 
+       310, 306, 277, 64, 292, 37, 281, 286, 
+       178, 284, 285, 288, 39, 291, 40, 294, 
+       43, 61, 297, 46, 58, 300, 49, 55, 
+       303, 52, 305, 312, 314, 319, 321, 326, 
+       328, 333, 335, 178, 340, 109, 342, 411, 
+       75, 343, 345, 108, 410, 408, 344, 107, 
+       346, 404, 347, 349, 106, 403, 401, 348, 
+       105, 350, 397, 351, 353, 104, 396, 394, 
+       352, 103, 354, 390, 355, 357, 102, 389, 
+       385, 356, 101, 371, 74, 360, 365, 178, 
+       363, 364, 367, 76, 370, 77, 373, 80, 
+       98, 376, 83, 95, 379, 86, 92, 382, 
+       89, 384, 391, 393, 398, 400, 405, 407, 
+       412, 414, 178, 178, 420, 422, 146, 145, 
+       442, 443, 496, 467, 468, 421, 423, 492, 
+       111, 424, 426, 144, 491, 489, 425, 143, 
+       427, 485, 428, 430, 142, 484, 482, 429, 
+       141, 431, 478, 432, 434, 140, 477, 475, 
+       433, 139, 435, 471, 436, 438, 138, 470, 
+       466, 437, 137, 452, 110, 441, 446, 178, 
+       444, 445, 448, 112, 451, 113, 454, 116, 
+       134, 457, 119, 131, 460, 122, 128, 463, 
+       125, 465, 472, 474, 479, 481, 486, 488, 
+       493, 495, 147, 500, 501, 515, 504, 505, 
+       533, 148, 509, 503, 508, 506, 507, 510, 
+       511, 150, 514, 512, 149, 151, 517, 153, 
+       174, 163, 520, 156, 171, 523, 159, 168, 
+       526, 162, 165, 529, 164, 532, 178, 535, 
+       177, 538, 539, 537, 542, 178, 540, 541
 };
 
 static const char _indic_syllable_machine_trans_actions[] = {
 };
 
 static const char _indic_syllable_machine_trans_actions[] = {
-       1, 2, 0, 0, 0, 2, 0, 0, 
+       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, 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, 2, 
-       0, 0, 0, 2, 0, 0, 2, 0, 
+       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, 
        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, 4, 2, 0, 0, 
-       0, 2, 5, 0, 0, 2, 0, 0, 
-       2, 0, 0, 2, 0, 0, 0, 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, 
        0, 0, 2, 0, 0, 2, 0, 0, 
        0, 0, 2, 0, 0, 2, 0, 0, 
-       2, 2, 6, 2, 6, 2, 6, 2, 
-       6, 2, 7, 2, 0, 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, 
-       6, 8, 0, 2, 0, 2, 0, 0, 
-       2, 0, 0, 2, 0, 2, 0, 0, 
-       0, 0, 2, 0, 0, 2, 0, 0, 
-       2, 0, 0, 2, 11, 2, 2, 6, 
-       2, 12, 12, 0, 0, 0, 2, 2, 
-       6, 2, 6, 0, 6, 13, 2, 2, 
-       0, 2, 0, 0, 0, 2, 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, 14, 0, 0, 0, 0, 2, 
-       0, 2, 0, 0, 2, 0, 0, 2, 
-       0, 0, 2, 0, 2, 2, 2, 2, 
-       2, 2, 2, 2, 2, 15, 2, 2, 
-       0, 2, 0, 0, 0, 2, 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, 16, 0, 0, 0, 0, 2, 
-       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, 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, 
-       18, 0, 0, 0, 0, 2, 0, 2, 
+       2, 9, 0, 12, 2, 2, 6, 2, 
+       13, 13, 0, 0, 2, 2, 6, 2, 
+       6, 2, 6, 14, 2, 2, 0, 2, 
+       0, 0, 2, 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, 2, 2, 2, 2, 2, 
        0, 0, 2, 0, 0, 2, 0, 0, 
        2, 0, 2, 2, 2, 2, 2, 2, 
-       2, 2, 2, 19, 20, 2, 2, 0, 
-       0, 0, 0, 0, 2, 2, 2, 2, 
-       2, 2, 0, 2, 2, 0, 2, 2, 
+       2, 2, 2, 16, 2, 2, 0, 2, 
+       0, 0, 2, 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, 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, 
-       21, 0, 0, 0, 0, 2, 0, 2, 
+       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, 2, 2, 2, 2, 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, 0, 2, 2, 8, 8, 0, 8, 
-       8, 0, 0, 0, 0, 0, 2, 0, 
+       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, 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, 0, 2, 0, 0, 
        0, 0, 2, 0, 0, 2, 0, 0, 
-       2, 0, 0, 0, 2, 22, 0, 0
-       0, 0, 0, 0, 23, 0, 0
+       2, 0, 0, 2, 0, 2, 23, 2
+       0, 0, 0, 0, 0, 24, 0, 0
 };
 
 static const char _indic_syllable_machine_to_state_actions[] = {
 };
 
 static const char _indic_syllable_machine_to_state_actions[] = {
@@ -1331,7 +1354,8 @@ 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, 9, 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, 0, 0, 0, 0, 
@@ -1401,7 +1425,8 @@ 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, 10, 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, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1454,83 +1479,84 @@ 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, 39, 39, 39, 39, 
-       39, 39, 39, 39, 39, 39, 39, 39, 
-       39, 39, 39, 39, 39, 39, 39, 39, 
-       39, 39, 39, 39, 39, 39, 39, 39, 
-       39, 39, 39, 39, 39, 39, 39, 39, 
-       77, 77, 77, 83, 83, 77, 77, 77, 
-       77, 77, 77, 77, 77, 77, 77, 77, 
-       77, 77, 77, 77, 77, 77, 77, 77, 
-       77, 77, 77, 77, 77, 77, 77, 77, 
-       83, 77, 77, 115, 115, 115, 115, 115, 
-       115, 115, 115, 115, 115, 115, 115, 115, 
-       115, 115, 115, 115, 115, 115, 115, 115, 
-       115, 115, 115, 115, 115, 115, 115, 115, 
-       115, 115, 115, 115, 115, 115, 115, 77, 
+       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, 1, 1, 1, 1, 1, 
        1, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 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, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 278, 278, 278, 278, 278
-       278, 278, 278, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       358, 358, 358, 358, 358, 358, 358, 358
-       428, 358, 428, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 429, 429, 429, 429, 429, 429
-       429, 429, 358, 198, 198, 198, 358, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 198, 198, 198
-       198, 198, 198, 198, 198, 358, 542, 542
-       542, 542, 542, 542, 542, 542, 542
+       1, 186, 0, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 284, 284, 284, 284, 284
+       284, 284, 284, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       364, 364, 364, 364, 364, 364, 364, 364
+       435, 364, 435, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 436, 436, 436, 436, 436, 436
+       436, 436, 364, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 364, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 204, 204, 204
+       204, 204, 204, 204, 204, 364, 551, 551
+       551, 551, 551, 551, 551, 551, 551
 };
 
 };
 
-static const int indic_syllable_machine_start = 170;
-static const int indic_syllable_machine_first_final = 170;
+static const int indic_syllable_machine_start = 178;
+static const int indic_syllable_machine_first_final = 178;
 static const int indic_syllable_machine_error = -1;
 
 static const int indic_syllable_machine_error = -1;
 
-static const int indic_syllable_machine_en_main = 170;
+static const int indic_syllable_machine_en_main = 178;
 
 
 
 
-#line 36 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 36 "hb-ot-shape-complex-indic-machine.rl"
 
 
 
 
 
 
-#line 97 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 97 "hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
 
 
 #define found_syllable(syllable_type) \
@@ -1550,7 +1576,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 1554 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1580 "hb-ot-shape-complex-indic-machine.hh"
        {
        cs = indic_syllable_machine_start;
        ts = 0;
        {
        cs = indic_syllable_machine_start;
        ts = 0;
@@ -1558,7 +1584,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
        act = 0;
        }
 
-#line 118 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 118 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
 
 
   p = 0;
@@ -1567,7 +1593,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 1571 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1597 "hb-ot-shape-complex-indic-machine.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -1577,11 +1603,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 10:
+       case 11:
 #line 1 "NONE"
        {ts = p;}
        break;
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 1585 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1611 "hb-ot-shape-complex-indic-machine.hh"
        }
 
        _keys = _indic_syllable_machine_trans_keys + (cs<<1);
        }
 
        _keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1603,68 +1629,72 @@ _eof_trans:
 #line 1 "NONE"
        {te = p+1;}
        break;
 #line 1 "NONE"
        {te = p+1;}
        break;
-       case 14:
-#line 88 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 15:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (consonant_syllable); }}
        break;
        {te = p+1;{ found_syllable (consonant_syllable); }}
        break;
-       case 16:
-#line 89 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 17:
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (vowel_syllable); }}
        break;
        {te = p+1;{ found_syllable (vowel_syllable); }}
        break;
-       case 21:
-#line 90 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 22:
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (standalone_cluster); }}
        break;
        {te = p+1;{ found_syllable (standalone_cluster); }}
        break;
-       case 23:
-#line 91 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 24:
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (symbol_cluster); }}
        break;
        {te = p+1;{ found_syllable (symbol_cluster); }}
        break;
-       case 18:
-#line 92 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 19:
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
        {te = p+1;{ found_syllable (broken_cluster); }}
        break;
-       case 11:
-#line 93 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 12:
+#line 93 "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 13:
-#line 88 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 14:
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
-       case 15:
-#line 89 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 16:
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (vowel_syllable); }}
        break;
        {te = p;p--;{ found_syllable (vowel_syllable); }}
        break;
-       case 20:
-#line 90 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 21:
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (standalone_cluster); }}
        break;
        {te = p;p--;{ found_syllable (standalone_cluster); }}
        break;
-       case 22:
-#line 91 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 23:
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (symbol_cluster); }}
        break;
        {te = p;p--;{ found_syllable (symbol_cluster); }}
        break;
-       case 17:
-#line 92 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 18:
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
-       case 19:
-#line 93 "../../src/hb-ot-shape-complex-indic-machine.rl"
+       case 20:
+#line 93 "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 88 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 88 "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 89 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 89 "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 90 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 90 "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 91 "hb-ot-shape-complex-indic-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
+       break;
        case 4:
        case 4:
-#line 92 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 92 "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:
@@ -1685,31 +1715,31 @@ _eof_trans:
        case 8:
 #line 1 "NONE"
        {te = p+1;}
        case 8:
 #line 1 "NONE"
        {te = p+1;}
-#line 88 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 88 "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 92 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
        {act = 5;}
        break;
        {act = 5;}
        break;
-       case 12:
+       case 13:
 #line 1 "NONE"
        {te = p+1;}
 #line 1 "NONE"
        {te = p+1;}
-#line 93 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
        {act = 6;}
        break;
        {act = 6;}
        break;
-#line 1704 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1734 "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 9:
+       case 10:
 #line 1 "NONE"
        {ts = 0;}
        break;
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 1713 "../../src/hb-ot-shape-complex-indic-machine.hh.tmp"
+#line 1743 "hb-ot-shape-complex-indic-machine.hh"
        }
 
        if ( ++p != pe )
        }
 
        if ( ++p != pe )
@@ -1725,7 +1755,7 @@ _again:
 
        }
 
 
        }
 
-#line 127 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 127 "hb-ot-shape-complex-indic-machine.rl"
 
 }
 
 
 }
 
index f6768a5..694b235 100644 (file)
@@ -69,7 +69,7 @@ cn = c.ZWJ?.n?;
 forced_rakar = ZWJ H ZWJ Ra;
 symbol = Symbol.N?;
 matra_group = z{0,3}.M.N?.(H | forced_rakar)?;
 forced_rakar = ZWJ H ZWJ Ra;
 symbol = Symbol.N?;
 matra_group = z{0,3}.M.N?.(H | forced_rakar)?;
-syllable_tail = (SM.SM?.ZWNJ?)? A{0,3}? VD{0,2};
+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;
 place_holder = PLACEHOLDER | DOTTEDCIRCLE;
 halant_group = (z?.h.(ZWJ.N?)?);
 final_halant_group = halant_group | h.ZWNJ;
index f58380e..2e159a1 100644 (file)
@@ -861,41 +861,41 @@ hb_indic_get_categories (hb_codepoint_t u)
   switch (u >> 12)
   {
     case 0x0u:
   switch (u >> 12)
   {
     case 0x0u:
-      if (hb_in_range (u, 0x0028u, 0x0040u)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
-      if (hb_in_range (u, 0x00D0u, 0x00D8u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u];
-      if (hb_in_range (u, 0x0900u, 0x0DF8u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
+      if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
+      if (hb_in_range (u, 0x00D0u, 0x00D7u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u];
+      if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
       if (unlikely (u == 0x00A0u)) return _(CP,x);
       break;
 
     case 0x1u:
       if (unlikely (u == 0x00A0u)) return _(CP,x);
       break;
 
     case 0x1u:
-      if (hb_in_range (u, 0x1000u, 0x10A0u)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
-      if (hb_in_range (u, 0x1700u, 0x17F0u)) return indic_table[u - 0x1700u + indic_offset_0x1700u];
-      if (hb_in_range (u, 0x1900u, 0x1AA0u)) return indic_table[u - 0x1900u + indic_offset_0x1900u];
-      if (hb_in_range (u, 0x1B00u, 0x1C50u)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u];
-      if (hb_in_range (u, 0x1CD0u, 0x1CF8u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
+      if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
+      if (hb_in_range (u, 0x1700u, 0x17EFu)) return indic_table[u - 0x1700u + indic_offset_0x1700u];
+      if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return indic_table[u - 0x1900u + indic_offset_0x1900u];
+      if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u];
+      if (hb_in_range (u, 0x1CD0u, 0x1CF7u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
       break;
 
     case 0x2u:
       break;
 
     case 0x2u:
-      if (hb_in_range (u, 0x2008u, 0x2018u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
+      if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
       if (unlikely (u == 0x25CCu)) return _(CP,x);
       break;
 
     case 0xAu:
       if (unlikely (u == 0x25CCu)) return _(CP,x);
       break;
 
     case 0xAu:
-      if (hb_in_range (u, 0xA800u, 0xAAF8u)) return indic_table[u - 0xA800u + indic_offset_0xa800u];
-      if (hb_in_range (u, 0xABC0u, 0xAC00u)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u];
+      if (hb_in_range (u, 0xA800u, 0xAAF7u)) return indic_table[u - 0xA800u + indic_offset_0xa800u];
+      if (hb_in_range (u, 0xABC0u, 0xABFFu)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u];
       break;
 
     case 0x10u:
       break;
 
     case 0x10u:
-      if (hb_in_range (u, 0x10A00u, 0x10A48u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u];
+      if (hb_in_range (u, 0x10A00u, 0x10A47u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u];
       break;
 
     case 0x11u:
       break;
 
     case 0x11u:
-      if (hb_in_range (u, 0x11000u, 0x110C0u)) return indic_table[u - 0x11000u + indic_offset_0x11000u];
-      if (hb_in_range (u, 0x11100u, 0x11238u)) return indic_table[u - 0x11100u + indic_offset_0x11100u];
-      if (hb_in_range (u, 0x112B0u, 0x11378u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u];
-      if (hb_in_range (u, 0x11480u, 0x114E0u)) return indic_table[u - 0x11480u + indic_offset_0x11480u];
-      if (hb_in_range (u, 0x11580u, 0x115C8u)) return indic_table[u - 0x11580u + indic_offset_0x11580u];
-      if (hb_in_range (u, 0x11600u, 0x116D0u)) return indic_table[u - 0x11600u + indic_offset_0x11600u];
+      if (hb_in_range (u, 0x11000u, 0x110BFu)) return indic_table[u - 0x11000u + indic_offset_0x11000u];
+      if (hb_in_range (u, 0x11100u, 0x11237u)) return indic_table[u - 0x11100u + indic_offset_0x11100u];
+      if (hb_in_range (u, 0x112B0u, 0x11377u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u];
+      if (hb_in_range (u, 0x11480u, 0x114DFu)) return indic_table[u - 0x11480u + indic_offset_0x11480u];
+      if (hb_in_range (u, 0x11580u, 0x115C7u)) return indic_table[u - 0x11580u + indic_offset_0x11580u];
+      if (hb_in_range (u, 0x11600u, 0x116CFu)) return indic_table[u - 0x11600u + indic_offset_0x11600u];
       break;
 
     default:
       break;
 
     default:
index bb80d7a..29fdf9a 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.
  *
@@ -32,7 +32,7 @@
 #include "hb-private.hh"
 
 
 #include "hb-private.hh"
 
 
-#line 36 "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[] = {
        1u, 31u, 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, 
 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, 
        3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 
@@ -261,11 +261,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 93 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
 #define found_syllable(syllable_type) \
 
 
 #define found_syllable(syllable_type) \
@@ -285,7 +285,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 "hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 289 "hb-ot-shape-complex-myanmar-machine.hh"
        {
        cs = myanmar_syllable_machine_start;
        ts = 0;
        {
        cs = myanmar_syllable_machine_start;
        ts = 0;
@@ -293,7 +293,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
        act = 0;
        }
 
-#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
   p = 0;
 
 
   p = 0;
@@ -302,7 +302,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 "hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 306 "hb-ot-shape-complex-myanmar-machine.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -316,7 +316,7 @@ _resume:
 #line 1 "NONE"
        {ts = p;}
        break;
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 320 "hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 320 "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 +335,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 85 "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 86 "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 87 "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 88 "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 89 "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 85 "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 88 "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 89 "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 "hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 370 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
 _again:
        }
 
 _again:
@@ -375,7 +375,7 @@ _again:
 #line 1 "NONE"
        {ts = 0;}
        break;
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 379 "hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 379 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
        if ( ++p != pe )
        }
 
        if ( ++p != pe )
@@ -391,7 +391,7 @@ _again:
 
        }
 
 
        }
 
-#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 123 "hb-ot-shape-complex-myanmar-machine.rl"
 
 }
 
 
 }
 
index 9a7afcb..e268933 100644 (file)
@@ -259,6 +259,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
     /* Unicode-4.1 additions */
     case HB_SCRIPT_KHAROSHTHI:
 
     /* Unicode-4.1 additions */
     case HB_SCRIPT_KHAROSHTHI:
+    case HB_SCRIPT_NEW_TAI_LUE:
     case HB_SCRIPT_SYLOTI_NAGRI:
 
     /* Unicode-5.1 additions */
     case HB_SCRIPT_SYLOTI_NAGRI:
 
     /* Unicode-5.1 additions */
@@ -339,7 +340,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
 
     /* Unicode-4.1 additions */
     case HB_SCRIPT_BUGINESE:
 
     /* Unicode-4.1 additions */
     case HB_SCRIPT_BUGINESE:
-    case HB_SCRIPT_NEW_TAI_LUE:
 
     /* Unicode-5.1 additions */
     case HB_SCRIPT_CHAM:
 
     /* Unicode-5.1 additions */
     case HB_SCRIPT_CHAM:
index 86b7ae7..15b862f 100644 (file)
@@ -1,5 +1,5 @@
 
 
-#line 1 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 1 "hb-ot-shape-complex-sea-machine.rl"
 /*
  * Copyright Â© 2011,2012,2013  Google, Inc.
  *
 /*
  * Copyright Â© 2011,2012,2013  Google, Inc.
  *
@@ -32,7 +32,7 @@
 #include "hb-private.hh"
 
 
 #include "hb-private.hh"
 
 
-#line 36 "hb-ot-shape-complex-sea-machine.hh.tmp"
+#line 36 "hb-ot-shape-complex-sea-machine.hh"
 static const unsigned char _sea_syllable_machine_trans_keys[] = {
        1u, 1u, 1u, 1u, 1u, 29u, 3u, 29u, 3u, 29u, 1u, 1u, 0
 };
 static const unsigned char _sea_syllable_machine_trans_keys[] = {
        1u, 1u, 1u, 1u, 1u, 29u, 3u, 29u, 3u, 29u, 1u, 1u, 0
 };
@@ -89,11 +89,11 @@ static const int sea_syllable_machine_error = -1;
 static const int sea_syllable_machine_en_main = 2;
 
 
 static const int sea_syllable_machine_en_main = 2;
 
 
-#line 36 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 36 "hb-ot-shape-complex-sea-machine.rl"
 
 
 
 
 
 
-#line 67 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 67 "hb-ot-shape-complex-sea-machine.rl"
 
 
 #define found_syllable(syllable_type) \
 
 
 #define found_syllable(syllable_type) \
@@ -113,7 +113,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 117 "hb-ot-shape-complex-sea-machine.hh.tmp"
+#line 117 "hb-ot-shape-complex-sea-machine.hh"
        {
        cs = sea_syllable_machine_start;
        ts = 0;
        {
        cs = sea_syllable_machine_start;
        ts = 0;
@@ -121,7 +121,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
        act = 0;
        }
 
-#line 88 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 88 "hb-ot-shape-complex-sea-machine.rl"
 
 
   p = 0;
 
 
   p = 0;
@@ -130,7 +130,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 134 "hb-ot-shape-complex-sea-machine.hh.tmp"
+#line 134 "hb-ot-shape-complex-sea-machine.hh"
        {
        int _slen;
        int _trans;
        {
        int _slen;
        int _trans;
@@ -144,7 +144,7 @@ _resume:
 #line 1 "NONE"
        {ts = p;}
        break;
 #line 1 "NONE"
        {ts = p;}
        break;
-#line 148 "hb-ot-shape-complex-sea-machine.hh.tmp"
+#line 148 "hb-ot-shape-complex-sea-machine.hh"
        }
 
        _keys = _sea_syllable_machine_trans_keys + (cs<<1);
        }
 
        _keys = _sea_syllable_machine_trans_keys + (cs<<1);
@@ -167,30 +167,30 @@ _eof_trans:
        {te = p+1;}
        break;
        case 6:
        {te = p+1;}
        break;
        case 6:
-#line 63 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 63 "hb-ot-shape-complex-sea-machine.rl"
        {te = p+1;{ found_syllable (non_sea_cluster); }}
        break;
        case 7:
        {te = p+1;{ found_syllable (non_sea_cluster); }}
        break;
        case 7:
-#line 61 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 61 "hb-ot-shape-complex-sea-machine.rl"
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
        case 8:
        {te = p;p--;{ found_syllable (consonant_syllable); }}
        break;
        case 8:
-#line 62 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 62 "hb-ot-shape-complex-sea-machine.rl"
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
        case 9:
        {te = p;p--;{ found_syllable (broken_cluster); }}
        break;
        case 9:
-#line 63 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 63 "hb-ot-shape-complex-sea-machine.rl"
        {te = p;p--;{ found_syllable (non_sea_cluster); }}
        break;
        case 1:
        {te = p;p--;{ found_syllable (non_sea_cluster); }}
        break;
        case 1:
-#line 61 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 61 "hb-ot-shape-complex-sea-machine.rl"
        {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
        break;
        case 3:
        {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
        break;
        case 3:
-#line 62 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 62 "hb-ot-shape-complex-sea-machine.rl"
        {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
        break;
        {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
        break;
-#line 194 "hb-ot-shape-complex-sea-machine.hh.tmp"
+#line 194 "hb-ot-shape-complex-sea-machine.hh"
        }
 
 _again:
        }
 
 _again:
@@ -199,7 +199,7 @@ _again:
 #line 1 "NONE"
        {ts = 0;}
        break;
 #line 1 "NONE"
        {ts = 0;}
        break;
-#line 203 "hb-ot-shape-complex-sea-machine.hh.tmp"
+#line 203 "hb-ot-shape-complex-sea-machine.hh"
        }
 
        if ( ++p != pe )
        }
 
        if ( ++p != pe )
@@ -215,7 +215,7 @@ _again:
 
        }
 
 
        }
 
-#line 97 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 97 "hb-ot-shape-complex-sea-machine.rl"
 
 }
 
 
 }
 
index 80d7da8..53274b5 100644 (file)
@@ -441,13 +441,15 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
   OT::hb_apply_context_t c (1, font, buffer);
   c.set_lookup_mask (plan->kern_mask);
   c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
   OT::hb_apply_context_t c (1, font, buffer);
   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;
+  skippy_iter.init (&c);
 
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   hb_glyph_position_t *pos = buffer->pos;
   for (unsigned int idx = 0; idx < count;)
   {
 
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   hb_glyph_position_t *pos = buffer->pos;
   for (unsigned int idx = 0; idx < count;)
   {
-    OT::hb_apply_context_t::skipping_forward_iterator_t skippy_iter (&c, idx, 1);
+    skippy_iter.reset (idx, 1);
     if (!skippy_iter.next ())
     {
       idx++;
     if (!skippy_iter.next ())
     {
       idx++;
index 4287253..8cc64af 100644 (file)
@@ -197,16 +197,17 @@ static inline void
 decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shortest)
 {
   hb_buffer_t * const buffer = c->buffer;
 decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shortest)
 {
   hb_buffer_t * const buffer = c->buffer;
+  hb_codepoint_t u = buffer->cur().codepoint;
   hb_codepoint_t glyph;
 
   /* Kind of a cute waterfall here... */
   hb_codepoint_t glyph;
 
   /* Kind of a cute waterfall here... */
-  if (shortest && c->font->get_glyph (buffer->cur().codepoint, 0, &glyph))
+  if (shortest && c->font->get_glyph (u, 0, &glyph))
     next_char (buffer, glyph);
     next_char (buffer, glyph);
-  else if (decompose (c, shortest, buffer->cur().codepoint))
+  else if (decompose (c, shortest, u))
     skip_char (buffer);
     skip_char (buffer);
-  else if (!shortest && c->font->get_glyph (buffer->cur().codepoint, 0, &glyph))
+  else if (!shortest && c->font->get_glyph (u, 0, &glyph))
     next_char (buffer, glyph);
     next_char (buffer, glyph);
-  else if (decompose_compatibility (c, buffer->cur().codepoint))
+  else if (decompose_compatibility (c, u))
     skip_char (buffer);
   else
     next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
     skip_char (buffer);
   else
     next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
index a0b503a..07adb04 100644 (file)
@@ -676,7 +676,7 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
        pos[i].y_advance = 0;
       }
       else
        pos[i].y_advance = 0;
       }
       else
-       continue; /* Delete it. */
+       continue; /* Delete it. XXX Merge clusters? */
     }
     if (j != i)
     {
     }
     if (j != i)
     {
index 80fd6c4..06b24a8 100644 (file)
 # endif
 #endif
 
 # endif
 #endif
 
-#if (defined(__WIN32__) && !defined(__WINE__)) || defined(_MSC_VER)
-#define snprintf _snprintf
-/* Windows CE only has _strdup, while rest of Windows has both. */
-#define strdup _strdup
-#endif
-
-#ifdef _MSC_VER
-#undef inline
-#define inline __inline
-#endif
-
-#ifdef __STRICT_ANSI__
-#undef inline
-#define inline __inline__
-#endif
-
 #if __GNUC__ >= 3
 #define HB_FUNC __PRETTY_FUNCTION__
 #elif defined(_MSC_VER)
 #if __GNUC__ >= 3
 #define HB_FUNC __PRETTY_FUNCTION__
 #elif defined(_MSC_VER)
 #  ifndef _WIN32_WINNT
 #    define _WIN32_WINNT 0x0600
 #  endif
 #  ifndef _WIN32_WINNT
 #    define _WIN32_WINNT 0x0600
 #  endif
-#  define WIN32_LEAN_AND_MEAN
-#  define STRICT
-#endif
+#  ifndef WIN32_LEAN_AND_MEAN
+#    define WIN32_LEAN_AND_MEAN 1
+#  endif
+#  ifndef STRICT
+#    define STRICT 1
+#  endif
 
 
-#ifdef _WIN32_WCE
-/* Some things not defined on Windows CE. */
-#define MemoryBarrier()
-#define getenv(Name) NULL
-#define setlocale(Category, Locale) "C"
+#  if defined(_WIN32_WCE)
+     /* Some things not defined on Windows CE. */
+#    define getenv(Name) NULL
+#    define setlocale(Category, Locale) "C"
 static int errno = 0; /* Use something better? */
 static int errno = 0; /* Use something better? */
+#  elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP)
+#    define getenv(Name) NULL
+#  endif
+#  if (defined(__WIN32__) && !defined(__WINE__)) || defined(_MSC_VER)
+#    define snprintf _snprintf
+     /* Windows CE only has _strdup, while rest of Windows has both. */
+#    define strdup _strdup
+#  endif
 #endif
 
 #if HAVE_ATEXIT
 #endif
 
 #if HAVE_ATEXIT
@@ -535,47 +529,6 @@ struct hb_lockable_set_t
 };
 
 
 };
 
 
-
-
-/* Big-endian handling */
-
-static inline uint16_t hb_be_uint16 (const uint16_t v)
-{
-  const uint8_t *V = (const uint8_t *) &v;
-  return (V[0] << 8) | V[1];
-}
-
-static inline uint16_t hb_uint16_swap (const uint16_t v)
-{
-  return (v >> 8) | (v << 8);
-}
-
-static inline uint32_t hb_uint32_swap (const uint32_t v)
-{
-  return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16);
-}
-
-/* Note, of the following macros, uint16_get is the one called many many times.
- * If there is any optimizations to be done, it's in that macro.  However, I
- * already confirmed that on my T400 ThinkPad at least, using bswap_16(), which
- * results in a single ror instruction, does NOT speed this up.  In fact, it
- * resulted in a minor slowdown.  At any rate, note that v may not be correctly
- * aligned, so I think the current implementation is optimal.
- */
-
-#define hb_be_uint16_put(v,V)  HB_STMT_START { v[0] = (V>>8); v[1] = (V); } HB_STMT_END
-#define hb_be_uint16_get(v)    (uint16_t) ((v[0] << 8) + v[1])
-#define hb_be_uint16_eq(a,b)   (a[0] == b[0] && a[1] == b[1])
-
-#define hb_be_uint32_put(v,V)  HB_STMT_START { v[0] = (V>>24); v[1] = (V>>16); v[2] = (V>>8); v[3] = (V); } HB_STMT_END
-#define hb_be_uint32_get(v)    (uint32_t) ((v[0] << 24) + (v[1] << 16) + (v[2] << 8) + v[3])
-#define hb_be_uint32_eq(a,b)   (a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
-
-#define hb_be_uint24_put(v,V)  HB_STMT_START { v[0] = (V>>16); v[1] = (V>>8); v[2] = (V); } HB_STMT_END
-#define hb_be_uint24_get(v)    (uint32_t) ((v[0] << 16) + (v[1] << 8) + v[2])
-#define hb_be_uint24_eq(a,b)   (a[0] == b[0] && a[1] == b[1] && a[2] == b[2])
-
-
 /* ASCII tag/character handling */
 
 static inline bool ISALPHA (unsigned char c)
 /* ASCII tag/character handling */
 
 static inline bool ISALPHA (unsigned char c)
@@ -620,6 +573,30 @@ _hb_debug (unsigned int level,
 #define DEBUG_LEVEL_ENABLED(WHAT, LEVEL) (_hb_debug ((LEVEL), HB_DEBUG_##WHAT))
 #define DEBUG_ENABLED(WHAT) (DEBUG_LEVEL_ENABLED (WHAT, 0))
 
 #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,
 template <int max_level> static inline void
 _hb_debug_msg_va (const char *what,
                  const void *obj,
@@ -665,27 +642,13 @@ _hb_debug_msg_va (const char *what,
   } else
     fprintf (stderr, "   " VRBAR LBAR);
 
   } else
     fprintf (stderr, "   " VRBAR LBAR);
 
-  if (func)
-  {
-    unsigned int func_len = strlen (func);
-#ifndef HB_DEBUG_VERBOSE
-    /* 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;
-#endif
-    fprintf (stderr, "%.*s: ", func_len, func);
-  }
+  _hb_print_func (func);
 
   if (message)
 
   if (message)
+  {
+    fprintf (stderr, ": ");
     vfprintf (stderr, message, ap);
     vfprintf (stderr, message, ap);
+  }
 
   fprintf (stderr, "\n");
 }
 
   fprintf (stderr, "\n");
 }
@@ -752,7 +715,9 @@ _hb_debug_msg<0> (const char *what HB_UNUSED,
  */
 
 template <typename T>
  */
 
 template <typename T>
-struct hb_printer_t {};
+struct hb_printer_t {
+  const char *print (const T&) { return "something"; }
+};
 
 template <>
 struct hb_printer_t<bool> {
 
 template <>
 struct hb_printer_t<bool> {
@@ -855,7 +820,7 @@ hb_in_range (T u, T lo, T hi)
   /* The sizeof() is here to force template instantiation.
    * I'm sure there are better ways to do this but can't think of
    * one right now.  Declaring a variable won't work as HB_UNUSED
   /* The sizeof() is here to force template instantiation.
    * I'm sure there are better ways to do this but can't think of
    * one right now.  Declaring a variable won't work as HB_UNUSED
-   * is unsable on some platforms and unused types are less likely
+   * 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);
 
    * to generate a warning than unused variables. */
   ASSERT_STATIC (sizeof (hb_assert_unsigned_t<T>) >= 0);
 
@@ -885,7 +850,7 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
 #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))
 
 
-template <typename T, typename T2> inline void
+template <typename T, typename T2> static inline void
 hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), T2 *array2)
 {
   if (unlikely (!len))
 hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), T2 *array2)
 {
   if (unlikely (!len))
@@ -918,7 +883,7 @@ hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *),
   } while (k);
 }
 
   } while (k);
 }
 
-template <typename T> inline void
+template <typename T> static inline void
 hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
 {
   hb_bubble_sort (array, len, compar, (int *) NULL);
 hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *))
 {
   hb_bubble_sort (array, len, compar, (int *) NULL);
@@ -947,12 +912,12 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o
 
 struct hb_options_t
 {
 
 struct hb_options_t
 {
-  int initialized : 1;
-  int uniscribe_bug_compatible : 1;
+  unsigned int initialized : 1;
+  unsigned int uniscribe_bug_compatible : 1;
 };
 
 union hb_options_union_t {
 };
 
 union hb_options_union_t {
-  int i;
+  unsigned int i;
   hb_options_t opts;
 };
 ASSERT_STATIC (sizeof (int) == sizeof (hb_options_union_t));
   hb_options_t opts;
 };
 ASSERT_STATIC (sizeof (int) == sizeof (hb_options_union_t));
index 705f554..acba4e9 100644 (file)
@@ -145,12 +145,14 @@ typedef hb_set_digest_combiner_t
 
 struct hb_set_t
 {
 
 struct hb_set_t
 {
+  friend struct hb_frozen_set_t;
+
   hb_object_header_t header;
   ASSERT_POD ();
   bool in_error;
 
   inline void init (void) {
   hb_object_header_t header;
   ASSERT_POD ();
   bool in_error;
 
   inline void init (void) {
-    header.init ();
+    hb_object_init (this);
     clear ();
   }
   inline void fini (void) {
     clear ();
   }
   inline void fini (void) {
@@ -326,7 +328,7 @@ struct hb_set_t
   static  const hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
 
   elt_t &elt (hb_codepoint_t g) { return elts[g >> SHIFT]; }
   static  const hb_codepoint_t INVALID = HB_SET_VALUE_INVALID;
 
   elt_t &elt (hb_codepoint_t g) { return elts[g >> SHIFT]; }
-  elt_t elt (hb_codepoint_t g) const { 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 */
   elt_t mask (hb_codepoint_t g) const { return elt_t (1) << (g & MASK); }
 
   elt_t elts[ELTS]; /* XXX 8kb */
@@ -335,6 +337,59 @@ struct hb_set_t
   ASSERT_STATIC (sizeof (elt_t) * 8 * ELTS > MAX_G);
 };
 
   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)
+  {
+    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);
+    const elt_t &max_elt = set.elt (max);
+
+    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))
+    {
+      start = count = 0;
+      return;
+    }
+    memcpy (elts, &min_elt, elts_size);
+  }
+
+  inline void fini (void)
+  {
+    if (elts)
+      free (elts);
+  }
+
+  inline bool has (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;
+};
 
 
 #endif /* HB_SET_PRIVATE_HH */
 
 
 #endif /* HB_SET_PRIVATE_HH */
index 74747f8..9a59c08 100644 (file)
@@ -200,7 +200,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
  * hb_feature_from_string:
  * @str: (array length=len):
  * @len: 
  * hb_feature_from_string:
  * @str: (array length=len):
  * @len: 
- * @feature: (out) (allow-none):
+ * @feature: (out) (optional):
  *
  * 
  *
  *
  * 
  *
@@ -279,11 +279,13 @@ hb_feature_to_string (hb_feature_t *feature,
 
 static const char **static_shaper_list;
 
 
 static const char **static_shaper_list;
 
-static inline
+#ifdef HB_USE_ATEXIT
+static
 void free_static_shaper_list (void)
 {
   free (static_shaper_list);
 }
 void free_static_shaper_list (void)
 {
   free (static_shaper_list);
 }
+#endif
 
 /**
  * hb_shape_list_shapers:
 
 /**
  * hb_shape_list_shapers:
index 29c4493..d1d1146 100644 (file)
@@ -79,10 +79,9 @@ struct hb_shaper_data_t {
        HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *data)
 
 #define HB_SHAPER_DATA_DESTROY(shaper, object) \
        HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA_TYPE (shaper, object) *data)
 
 #define HB_SHAPER_DATA_DESTROY(shaper, object) \
-       if (object->shaper_data.shaper && \
-           object->shaper_data.shaper != HB_SHAPER_DATA_INVALID && \
-           object->shaper_data.shaper != HB_SHAPER_DATA_SUCCEEDED) \
-         HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA (shaper, object));
+    if (HB_SHAPER_DATA_TYPE (shaper, object) *data = HB_SHAPER_DATA (shaper, object)) \
+      if (data != HB_SHAPER_DATA_INVALID && data != HB_SHAPER_DATA_SUCCEEDED) \
+        HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data);
 
 #define HB_SHAPER_DATA_ENSURE_DECLARE(shaper, object) \
 static inline bool \
 
 #define HB_SHAPER_DATA_ENSURE_DECLARE(shaper, object) \
 static inline bool \
index 6ae2601..580b95c 100644 (file)
@@ -40,12 +40,14 @@ static const hb_shaper_pair_t all_shapers[] = {
 
 static const hb_shaper_pair_t *static_shapers;
 
 
 static const hb_shaper_pair_t *static_shapers;
 
-static inline
+#ifdef HB_USE_ATEXIT
+static
 void free_static_shapers (void)
 {
   if (unlikely (static_shapers != all_shapers))
     free ((void *) static_shapers);
 }
 void free_static_shapers (void)
 {
   if (unlikely (static_shapers != all_shapers))
     free ((void *) static_shapers);
 }
+#endif
 
 const hb_shaper_pair_t *
 _hb_shapers_get (void)
 
 const hb_shaper_pair_t *
 _hb_shapers_get (void)
index d59dfb2..fc19006 100644 (file)
@@ -157,7 +157,7 @@ hb_unicode_funcs_get_default (void)
 
 /**
  * hb_unicode_funcs_create: (Xconstructor)
 
 /**
  * hb_unicode_funcs_create: (Xconstructor)
- * @parent: (allow-none):
+ * @parent: (nullable):
  *
  * 
  *
  *
  * 
  *
index 74ae3a3..e7bcad2 100644 (file)
 #endif
 
 
 #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)
+{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
+
+
 typedef HRESULT (WINAPI *SIOT) /*ScriptItemizeOpenType*/(
   const WCHAR *pwcInChars,
   int cInChars,
 typedef HRESULT (WINAPI *SIOT) /*ScriptItemizeOpenType*/(
   const WCHAR *pwcInChars,
   int cInChars,
index 0b798a0..14d3c2e 100644 (file)
 
 #include "hb-private.hh"
 
 
 #include "hb-private.hh"
 
-template <typename T, bool validate=true> struct hb_utf_t;
 
 
-
-/* UTF-8 */
-
-template <>
-struct hb_utf_t<uint8_t, true>
+struct hb_utf8_t
 {
 {
+  typedef uint8_t codepoint_t;
+
   static inline const uint8_t *
   next (const uint8_t *text,
        const uint8_t *end,
   static inline const uint8_t *
   next (const uint8_t *text,
        const uint8_t *end,
@@ -131,11 +128,10 @@ struct hb_utf_t<uint8_t, true>
 };
 
 
 };
 
 
-/* UTF-16 */
-
-template <>
-struct hb_utf_t<uint16_t, true>
+struct hb_utf16_t
 {
 {
+  typedef uint16_t codepoint_t;
+
   static inline const uint16_t *
   next (const uint16_t *text,
        const uint16_t *end,
   static inline const uint16_t *
   next (const uint16_t *text,
        const uint16_t *end,
@@ -204,11 +200,11 @@ struct hb_utf_t<uint16_t, true>
 };
 
 
 };
 
 
-/* UTF-32 */
-
-template <bool validate>
-struct hb_utf_t<uint32_t, validate>
+template <bool validate=true>
+struct hb_utf32_t
 {
 {
+  typedef uint32_t codepoint_t;
+
   static inline const uint32_t *
   next (const uint32_t *text,
        const uint32_t *end HB_UNUSED,
   static inline const uint32_t *
   next (const uint32_t *text,
        const uint32_t *end HB_UNUSED,
@@ -246,4 +242,37 @@ struct hb_utf_t<uint32_t, validate>
 };
 
 
 };
 
 
+struct hb_latin1_t
+{
+  typedef uint8_t codepoint_t;
+
+  static inline const uint8_t *
+  next (const uint8_t *text,
+       const uint8_t *end HB_UNUSED,
+       hb_codepoint_t *unicode,
+       hb_codepoint_t replacement HB_UNUSED)
+  {
+    *unicode = *text++;
+    return text;
+  }
+
+  static inline const uint8_t *
+  prev (const uint8_t *text,
+       const uint8_t *start HB_UNUSED,
+       hb_codepoint_t *unicode,
+       hb_codepoint_t replacement)
+  {
+    *unicode = *--text;
+    return text;
+  }
+
+  static inline unsigned int
+  strlen (const uint8_t *text)
+  {
+    unsigned int l = 0;
+    while (*text++) l++;
+    return l;
+  }
+};
+
 #endif /* HB_UTF_PRIVATE_HH */
 #endif /* HB_UTF_PRIVATE_HH */
index e1a5f61..648a46f 100644 (file)
@@ -38,9 +38,9 @@ HB_BEGIN_DECLS
 
 #define HB_VERSION_MAJOR 0
 #define HB_VERSION_MINOR 9
 
 #define HB_VERSION_MAJOR 0
 #define HB_VERSION_MINOR 9
-#define HB_VERSION_MICRO 35
+#define HB_VERSION_MICRO 40
 
 
-#define HB_VERSION_STRING "0.9.35"
+#define HB_VERSION_STRING "0.9.40"
 
 #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 bbb7e2e..f671331 100644 (file)
@@ -53,6 +53,9 @@ test_blob_empty (void)
   g_assert (hb_blob_is_immutable (hb_blob_get_empty ()));
   g_assert (hb_blob_get_empty () != NULL);
   g_assert (hb_blob_get_empty () == hb_blob_create (NULL, 0, HB_MEMORY_MODE_READONLY, NULL, NULL));
   g_assert (hb_blob_is_immutable (hb_blob_get_empty ()));
   g_assert (hb_blob_get_empty () != NULL);
   g_assert (hb_blob_get_empty () == hb_blob_create (NULL, 0, HB_MEMORY_MODE_READONLY, NULL, NULL));
+  g_assert (hb_blob_get_empty () == hb_blob_create ("asdf", 0, HB_MEMORY_MODE_READONLY, NULL, NULL));
+  g_assert (hb_blob_get_empty () == hb_blob_create (NULL, -1, HB_MEMORY_MODE_READONLY, NULL, NULL));
+  g_assert (hb_blob_get_empty () == hb_blob_create ("asdfg", -1, HB_MEMORY_MODE_READONLY, NULL, NULL));
 
   blob = hb_blob_get_empty ();
   g_assert (blob == hb_blob_get_empty ());
 
   blob = hb_blob_get_empty ();
   g_assert (blob == hb_blob_get_empty ());
index e2dcc98..70bcdd5 100644 (file)
@@ -40,6 +40,7 @@ TESTS = \
        tests/arabic-feature-order.tests \
        tests/context-matching.tests \
        tests/hangul-jamo.tests \
        tests/arabic-feature-order.tests \
        tests/context-matching.tests \
        tests/hangul-jamo.tests \
+       tests/indic-joiner-candrabindu.tests \
        tests/indic-old-spec.tests \
        tests/indic-pref-blocking.tests \
        tests/mongolian-variation-selector.tests \
        tests/indic-old-spec.tests \
        tests/indic-pref-blocking.tests \
        tests/mongolian-variation-selector.tests \
index e5f1224..8e726ff 100644 (file)
@@ -81,8 +81,8 @@ build_triplet = @build@
 host_triplet = @host@
 TESTS = tests/arabic-fallback-shaping.tests \
        tests/arabic-feature-order.tests tests/context-matching.tests \
 host_triplet = @host@
 TESTS = tests/arabic-fallback-shaping.tests \
        tests/arabic-feature-order.tests tests/context-matching.tests \
-       tests/hangul-jamo.tests tests/indic-old-spec.tests \
-       tests/indic-pref-blocking.tests \
+       tests/hangul-jamo.tests tests/indic-joiner-candrabindu.tests \
+       tests/indic-old-spec.tests tests/indic-pref-blocking.tests \
        tests/mongolian-variation-selector.tests \
        tests/zero-width-marks.tests $(am__EXEEXT_1)
 subdir = test/shaping
        tests/mongolian-variation-selector.tests \
        tests/zero-width-marks.tests $(am__EXEEXT_1)
 subdir = test/shaping
diff --git a/test/shaping/fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf b/test/shaping/fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf
new file mode 100644 (file)
index 0000000..8fb2f16
Binary files /dev/null and b/test/shaping/fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf differ
index c51639b..924732d 100644 (file)
@@ -2,6 +2,7 @@
 270b89df543a7e48e206a2d830c0e10e5265c630.ttf
 37033cc5cf37bb223d7355153016b6ccece93b28.ttf
 4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf
 270b89df543a7e48e206a2d830c0e10e5265c630.ttf
 37033cc5cf37bb223d7355153016b6ccece93b28.ttf
 4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf
+5028afb650b1bb718ed2131e872fbcce57828fff.ttf
 57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf
 757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf
 7e14e7883ed152baa158b80e207b66114c823a8b.ttf
 57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf
 757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf
 7e14e7883ed152baa158b80e207b66114c823a8b.ttf
index 7674fdf..a370e5e 100644 (file)
@@ -411,7 +411,7 @@ class Unicode:
        def parse (s):
                s = re.sub (r"0[xX]", " ", s)
                s = re.sub (r"[<+>,;&#\\xXuU\n  ]", " ", s)
        def parse (s):
                s = re.sub (r"0[xX]", " ", s)
                s = re.sub (r"[<+>,;&#\\xXuU\n  ]", " ", s)
-               return [int (x, 16) for x in s.split (' ') if len (x)]
+               return [int (x, 16) for x in s.split ()]
 
        @staticmethod
        def encode (s):
 
        @staticmethod
        def encode (s):
index 0240448..e3eaf3f 100644 (file)
@@ -1 +1 @@
-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@208,0+0|uni0651=2@272,768+0|uni064E=2@944,1216+0|uni0651=2@1008,768+0|uni06440627.fina=2+1470|uni064F=0@576,-32+0|uni0633.init=0+1585]
+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]
index 7c1ef6b..667a1cc 100644 (file)
@@ -1,11 +1,2 @@
-[gid64252=0+920|gid64568=0+0]
-[gid3=0+920|gid4=0+0]
-win/util/hb-view.exe --viewr uniscribe
-[gid64252=0+920|gid64568=0+0]
-[gid3=0+920|gid4=0+0]
-win/util/hb-shape.exe --shaper uniscribe
-win/util/hb-view.exe --viewr uniscribe
-[gid64252=0+920|gid64568=0+0]
-[gid3=0+920|gid4=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]
 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/indic-joiner-candrabindu.tests b/test/shaping/tests/indic-joiner-candrabindu.tests
new file mode 100644 (file)
index 0000000..351e927
--- /dev/null
@@ -0,0 +1,2 @@
+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=1+0|candrabinduorya=1+0]
index 266681c..3f23bab 100644 (file)
@@ -6,6 +6,10 @@ CLEANFILES =
 DISTCLEANFILES =
 MAINTAINERCLEANFILES =
 
 DISTCLEANFILES =
 MAINTAINERCLEANFILES =
 
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
 bin_PROGRAMS =
 
 AM_CPPFLAGS = \
 bin_PROGRAMS =
 
 AM_CPPFLAGS = \
index 4bc79ac..6fecdd0 100644 (file)
@@ -820,6 +820,10 @@ uninstall-am: uninstall-binPROGRAMS
        uninstall-am uninstall-binPROGRAMS
 
 
        uninstall-am uninstall-binPROGRAMS
 
 
+# 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.
 -include $(top_srcdir)/git.mk
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
index 03de7e6..859f9a6 100644 (file)
@@ -110,6 +110,6 @@ struct shape_closure_consumer_t : option_group_t
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  main_font_text_t<shape_closure_consumer_t> driver;
+  main_font_text_t<shape_closure_consumer_t, FONT_SIZE_NONE, 0> driver;
   return driver.main (argc, argv);
 }
   return driver.main (argc, argv);
 }
index 01081ea..f38f387 100644 (file)
@@ -126,6 +126,6 @@ struct output_buffer_t
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  main_font_text_t<shape_consumer_t<output_buffer_t> > driver;
+  main_font_text_t<shape_consumer_t<output_buffer_t>, FONT_SIZE_UPEM, 0> driver;
   return driver.main (argc, argv);
 }
   return driver.main (argc, argv);
 }
index 26fad66..ef75e6d 100644 (file)
 #include "shape-consumer.hh"
 #include "view-cairo.hh"
 
 #include "shape-consumer.hh"
 #include "view-cairo.hh"
 
+#define DEFAULT_FONT_SIZE 256
+#define SUBPIXEL_BITS 8
+
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  main_font_text_t<shape_consumer_t<view_cairo_t> > driver;
+  main_font_text_t<shape_consumer_t<view_cairo_t>, DEFAULT_FONT_SIZE, SUBPIXEL_BITS> driver;
   return driver.main (argc, argv);
 }
   return driver.main (argc, argv);
 }
index 376bf2b..50f9eb4 100644 (file)
@@ -63,10 +63,10 @@ helper_cairo_surface_write_to_ansi_stream (cairo_surface_t  *surface,
    * Find the tight image top/bottom and only print in between. */
 
   /* Use corner color as background color. */
    * Find the tight image top/bottom and only print in between. */
 
   /* Use corner color as background color. */
-  uint32_t bg_color = * (uint32_t *) data;
+  uint32_t bg_color = data ? * (uint32_t *) data : 0;
 
   /* Drop first row while empty */
 
   /* Drop first row while empty */
-  while (height) 
+  while (height)
   {
     unsigned int i;
     for (i = 0; i < width; i++)
   {
     unsigned int i;
     for (i = 0; i < width; i++)
index ee940ae..d576c3f 100644 (file)
@@ -70,8 +70,7 @@ void free_ft_library (void)
 }
 
 cairo_scaled_font_t *
 }
 
 cairo_scaled_font_t *
-helper_cairo_create_scaled_font (const font_options_t *font_opts,
-                                double font_size)
+helper_cairo_create_scaled_font (const font_options_t *font_opts)
 {
   hb_font_t *font = hb_font_reference (font_opts->get_font ());
 
 {
   hb_font_t *font = hb_font_reference (font_opts->get_font ());
 
@@ -105,7 +104,8 @@ helper_cairo_create_scaled_font (const font_options_t *font_opts,
 
   cairo_matrix_init_identity (&ctm);
   cairo_matrix_init_scale (&font_matrix,
 
   cairo_matrix_init_identity (&ctm);
   cairo_matrix_init_scale (&font_matrix,
-                          font_size, font_size);
+                          font_opts->font_size_x,
+                          font_opts->font_size_y);
   font_options = cairo_font_options_create ();
   cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
   cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF);
   font_options = cairo_font_options_create ();
   cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
   cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF);
@@ -423,7 +423,7 @@ helper_cairo_line_from_buffer (helper_cairo_line_t *l,
                               hb_buffer_t         *buffer,
                               const char          *text,
                               unsigned int         text_len,
                               hb_buffer_t         *buffer,
                               const char          *text,
                               unsigned int         text_len,
-                              double               scale,
+                              int                  scale_bits,
                               hb_bool_t            utf8_clusters)
 {
   memset (l, 0, sizeof (*l));
                               hb_bool_t            utf8_clusters)
 {
   memset (l, 0, sizeof (*l));
@@ -456,16 +456,16 @@ helper_cairo_line_from_buffer (helper_cairo_line_t *l,
   for (i = 0; i < (int) l->num_glyphs; i++)
   {
     l->glyphs[i].index = hb_glyph[i].codepoint;
   for (i = 0; i < (int) l->num_glyphs; i++)
   {
     l->glyphs[i].index = hb_glyph[i].codepoint;
-    l->glyphs[i].x = ( hb_position->x_offset + x) * scale;
-    l->glyphs[i].y = (-hb_position->y_offset + y) * scale;
+    l->glyphs[i].x = scalbn ( hb_position->x_offset + x, scale_bits);
+    l->glyphs[i].y = scalbn (-hb_position->y_offset + y, scale_bits);
     x +=  hb_position->x_advance;
     y += -hb_position->y_advance;
 
     hb_position++;
   }
   l->glyphs[i].index = -1;
     x +=  hb_position->x_advance;
     y += -hb_position->y_advance;
 
     hb_position++;
   }
   l->glyphs[i].index = -1;
-  l->glyphs[i].x = x * scale;
-  l->glyphs[i].y = y * scale;
+  l->glyphs[i].x = scalbn (x, scale_bits);
+  l->glyphs[i].y = scalbn (y, scale_bits);
 
   if (l->num_clusters) {
     memset ((void *) l->clusters, 0, l->num_clusters * sizeof (l->clusters[0]));
 
   if (l->num_clusters) {
     memset ((void *) l->clusters, 0, l->num_clusters * sizeof (l->clusters[0]));
index 567777e..ed55a45 100644 (file)
@@ -33,8 +33,7 @@
 
 
 cairo_scaled_font_t *
 
 
 cairo_scaled_font_t *
-helper_cairo_create_scaled_font (const font_options_t *font_opts,
-                                double font_size);
+helper_cairo_create_scaled_font (const font_options_t *font_opts);
 
 extern const char *helper_cairo_supported_formats[];
 
 
 extern const char *helper_cairo_supported_formats[];
 
@@ -76,7 +75,7 @@ helper_cairo_line_from_buffer (helper_cairo_line_t *l,
                               hb_buffer_t         *buffer,
                               const char          *text,
                               unsigned int         text_len,
                               hb_buffer_t         *buffer,
                               const char          *text,
                               unsigned int         text_len,
-                              double               scale,
+                              int                  scale_bits,
                               hb_bool_t            utf8_clusters);
 
 #endif
                               hb_bool_t            utf8_clusters);
 
 #endif
index ac51b2d..628cdf9 100644 (file)
 
 /* main() body for utilities taking font and processing text.*/
 
 
 /* main() body for utilities taking font and processing text.*/
 
-template <typename consumer_t>
+template <typename consumer_t, int default_font_size, int subpixel_bits>
 struct main_font_text_t
 {
   main_font_text_t (void)
                  : options ("[FONT-FILE] [TEXT]"),
 struct main_font_text_t
 {
   main_font_text_t (void)
                  : options ("[FONT-FILE] [TEXT]"),
-                   font_opts (&options),
+                   font_opts (&options, default_font_size, subpixel_bits),
                    input (&options),
                    consumer (&options) {}
 
                    input (&options),
                    consumer (&options) {}
 
index 0adc179..7387a56 100644 (file)
@@ -55,6 +55,7 @@ fail (hb_bool_t suggest_help, const char *format, ...)
   va_list vap;
   va_start (vap, format);
   msg = g_strdup_vprintf (format, vap);
   va_list vap;
   va_start (vap, format);
   msg = g_strdup_vprintf (format, vap);
+  va_end (vap);
   const char *prgname = g_get_prgname ();
   g_printerr ("%s: %s\n", prgname, msg);
   if (suggest_help)
   const char *prgname = g_get_prgname ();
   g_printerr ("%s: %s\n", prgname, msg);
   if (suggest_help)
@@ -264,7 +265,6 @@ view_options_t::add_options (option_parser_t *parser)
     {"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"},
     {"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"},
-    {"font-size",      0, 0, G_OPTION_ARG_DOUBLE,      &this->font_size,               "Font size (default: " G_STRINGIFY(DEFAULT_FONT_SIZE) ")","size"},
     {NULL}
   };
   parser->add_group (entries,
     {NULL}
   };
   parser->add_group (entries,
@@ -349,6 +349,28 @@ shape_options_t::add_options (option_parser_t *parser)
                     this);
 }
 
                     this);
 }
 
+static gboolean
+parse_font_size (const char *name G_GNUC_UNUSED,
+                const char *arg,
+                gpointer    data,
+                GError    **error G_GNUC_UNUSED)
+{
+  font_options_t *font_opts = (font_options_t *) data;
+  if (0 == strcmp (arg, "upem"))
+  {
+    font_opts->font_size_y = font_opts->font_size_x = FONT_SIZE_UPEM;
+    return true;
+  }
+  switch (sscanf (arg, "%lf %lf", &font_opts->font_size_x, &font_opts->font_size_y)) {
+    case 1: font_opts->font_size_y = font_opts->font_size_x;
+    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",
+                  name);
+      return false;
+  }
+}
 void
 font_options_t::add_options (option_parser_t *parser)
 {
 void
 font_options_t::add_options (option_parser_t *parser)
 {
@@ -369,11 +391,22 @@ font_options_t::add_options (option_parser_t *parser)
     parser->free_later (text);
   }
 
     parser->free_later (text);
   }
 
+  char *font_size_text;
+  if (default_font_size == FONT_SIZE_UPEM)
+    font_size_text = (char *) "Font size (default: upem)";
+  else
+  {
+    font_size_text = g_strdup_printf ("Font size (default: %d)", default_font_size);
+    parser->free_later (font_size_text);
+  }
+
   GOptionEntry entries[] =
   {
     {"font-file",      0, 0, G_OPTION_ARG_STRING,      &this->font_file,               "Set font file-name",                   "filename"},
     {"face-index",     0, 0, G_OPTION_ARG_INT,         &this->face_index,              "Set face index (default: 0)",          "index"},
   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-funcs",     0, 0, G_OPTION_ARG_STRING,      &this->font_funcs,              text,                                   "format"},
+    {"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}
   };
   parser->add_group (entries,
     {NULL}
   };
   parser->add_group (entries,
@@ -514,8 +547,14 @@ font_options_t::get_font (void) const
 
   font = hb_font_create (face);
 
 
   font = hb_font_create (face);
 
-  unsigned int upem = hb_face_get_upem (face);
-  hb_font_set_scale (font, upem, upem);
+  if (font_size_x == FONT_SIZE_UPEM)
+    font_size_x = hb_face_get_upem (face);
+  if (font_size_y == FONT_SIZE_UPEM)
+    font_size_y = hb_face_get_upem (face);
+
+  int scale_x = (int) scalbnf (font_size_x, subpixel_bits);
+  int scale_y = (int) scalbnf (font_size_y, subpixel_bits);
+  hb_font_set_scale (font, scale_x, scale_y);
   hb_face_destroy (face);
 
   void (*set_font_funcs) (hb_font_t *) = NULL;
   hb_face_destroy (face);
 
   void (*set_font_funcs) (hb_font_t *) = NULL;
index 223778d..8b9b10e 100644 (file)
@@ -143,7 +143,8 @@ struct option_parser_t
 #define DEFAULT_MARGIN 16
 #define DEFAULT_FORE "#000000"
 #define DEFAULT_BACK "#FFFFFF"
 #define DEFAULT_MARGIN 16
 #define DEFAULT_FORE "#000000"
 #define DEFAULT_BACK "#FFFFFF"
-#define DEFAULT_FONT_SIZE 256
+#define FONT_SIZE_UPEM 0x7FFFFFFF
+#define FONT_SIZE_NONE 0
 
 struct view_options_t : option_group_t
 {
 
 struct view_options_t : option_group_t
 {
@@ -153,7 +154,6 @@ struct view_options_t : option_group_t
     back = DEFAULT_BACK;
     line_space = 0;
     margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
     back = DEFAULT_BACK;
     line_space = 0;
     margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
-    font_size = DEFAULT_FONT_SIZE;
 
     add_options (parser);
   }
 
     add_options (parser);
   }
@@ -167,7 +167,6 @@ struct view_options_t : option_group_t
   struct margin_t {
     double t, r, b, l;
   } margin;
   struct margin_t {
     double t, r, b, l;
   } margin;
-  double font_size;
 };
 
 
 };
 
 
@@ -273,9 +272,14 @@ struct shape_options_t : option_group_t
 
 struct font_options_t : option_group_t
 {
 
 struct font_options_t : option_group_t
 {
-  font_options_t (option_parser_t *parser) {
+  font_options_t (option_parser_t *parser,
+                 int default_font_size_,
+                 unsigned int subpixel_bits_) {
+    default_font_size = default_font_size_;
+    subpixel_bits = subpixel_bits_;
     font_file = NULL;
     face_index = 0;
     font_file = NULL;
     face_index = 0;
+    font_size_x = font_size_y = default_font_size;
     font_funcs = NULL;
 
     font = NULL;
     font_funcs = NULL;
 
     font = NULL;
@@ -292,6 +296,10 @@ struct font_options_t : option_group_t
 
   const char *font_file;
   int face_index;
 
   const char *font_file;
   int face_index;
+  int default_font_size;
+  unsigned int subpixel_bits;
+  mutable double font_size_x;
+  mutable double font_size_y;
   const char *font_funcs;
 
   private:
   const char *font_funcs;
 
   private:
index 666013e..160250e 100644 (file)
@@ -54,7 +54,7 @@ view_cairo_t::get_surface_size (cairo_scaled_font_t *scaled_font,
 void
 view_cairo_t::render (const font_options_t *font_opts)
 {
 void
 view_cairo_t::render (const font_options_t *font_opts)
 {
-  cairo_scaled_font_t *scaled_font = helper_cairo_create_scaled_font (font_opts, view_options.font_size);
+  cairo_scaled_font_t *scaled_font = helper_cairo_create_scaled_font (font_opts);
   double w, h;
   get_surface_size (scaled_font, &w, &h);
   cairo_t *cr = helper_cairo_create_context (w, h, &view_options, &output_options);
   double w, h;
   get_surface_size (scaled_font, &w, &h);
   cairo_t *cr = helper_cairo_create_context (w, h, &view_options, &output_options);
index 9dea06e..cb52373 100644 (file)
@@ -37,7 +37,7 @@ struct view_cairo_t
               : output_options (parser, helper_cairo_supported_formats),
                 view_options (parser),
                 direction (HB_DIRECTION_INVALID),
               : output_options (parser, helper_cairo_supported_formats),
                 view_options (parser),
                 direction (HB_DIRECTION_INVALID),
-                lines (0), scale (1.0) {}
+                lines (0), scale_bits (0) {}
   ~view_cairo_t (void) {
     if (debug)
       cairo_debug_reset_static_data ();
   ~view_cairo_t (void) {
     if (debug)
       cairo_debug_reset_static_data ();
@@ -46,7 +46,7 @@ struct view_cairo_t
   void init (const font_options_t *font_opts)
   {
     lines = g_array_new (false, false, sizeof (helper_cairo_line_t));
   void init (const font_options_t *font_opts)
   {
     lines = g_array_new (false, false, sizeof (helper_cairo_line_t));
-    scale = double (view_options.font_size) / hb_face_get_upem (hb_font_get_face (font_opts->get_font ()));
+    scale_bits = -font_opts->subpixel_bits;
   }
   void new_line (void)
   {
   }
   void new_line (void)
   {
@@ -71,7 +71,7 @@ struct view_cairo_t
   {
     direction = hb_buffer_get_direction (buffer);
     helper_cairo_line_t l;
   {
     direction = hb_buffer_get_direction (buffer);
     helper_cairo_line_t l;
-    helper_cairo_line_from_buffer (&l, buffer, text, text_len, scale, utf8_clusters);
+    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)
     g_array_append_val (lines, l);
   }
   void finish (const font_options_t *font_opts)
@@ -100,7 +100,7 @@ struct view_cairo_t
 
   hb_direction_t direction; // Remove this, make segment_properties accessible
   GArray *lines;
 
   hb_direction_t direction; // Remove this, make segment_properties accessible
   GArray *lines;
-  double scale;
+  int scale_bits;
 };
 
 #endif
 };
 
 #endif