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 += \
-        $(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)
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>
-Date:   Wed Aug 13 12:39:34 2014 -0400
+Date:  Wed Aug 13 12:39:34 2014 -0400
 
     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>
-Date:   Tue Aug 12 19:26:35 2014 -0400
+Date:  Tue Aug 12 19:26:35 2014 -0400
 
     [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>
-Date:   Tue Aug 12 19:17:19 2014 -0400
+Date:  Tue Aug 12 19:17:19 2014 -0400
 
     [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>
-Date:   Tue Aug 12 19:10:33 2014 -0400
+Date:  Tue Aug 12 19:10:33 2014 -0400
 
     [coretext] Minor
 
@@ -37,7 +1924,7 @@ Date:   Tue Aug 12 19:10:33 2014 -0400
 
 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
 
@@ -46,7 +1933,7 @@ Date:   Tue Aug 12 18:57:08 2014 -0400
 
 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!
 
@@ -59,7 +1946,7 @@ Date:   Tue Aug 12 17:15:09 2014 -0400
 
 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
 
@@ -68,7 +1955,7 @@ Date:   Tue Aug 12 17:14:36 2014 -0400
 
 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
 
@@ -77,7 +1964,7 @@ Date:   Tue Aug 12 17:03:27 2014 -0400
 
 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
 
@@ -86,7 +1973,7 @@ Date:   Tue Aug 12 17:02:59 2014 -0400
 
 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
@@ -100,7 +1987,7 @@ Date:   Tue Aug 12 16:50:22 2014 -0400
 
 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
 
@@ -109,7 +1996,7 @@ Date:   Tue Aug 12 16:49:18 2014 -0400
 
 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
 
@@ -120,7 +2007,7 @@ Date:   Tue Aug 12 15:49:47 2014 -0400
 
 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
 
@@ -129,7 +2016,7 @@ Date:   Tue Aug 12 14:25:11 2014 -0400
 
 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
 
@@ -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 +-
- 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>
-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
 
@@ -163,7 +2050,7 @@ Date:   Tue Aug 12 10:32:41 2014 -0400
 
 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
 
@@ -177,7 +2064,7 @@ Date:   Mon Aug 11 23:47:16 2014 -0400
 
 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
 
@@ -188,7 +2075,7 @@ Date:   Mon Aug 11 20:45:12 2014 -0400
 
 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
 
@@ -200,7 +2087,7 @@ Date:   Mon Aug 11 20:02:45 2014 -0400
 
 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
 
@@ -209,7 +2096,7 @@ Date:   Mon Aug 11 20:01:37 2014 -0400
 
 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!
 
@@ -218,7 +2105,7 @@ Date:   Mon Aug 11 19:16:26 2014 -0400
 
 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()
 
@@ -231,13 +2118,13 @@ Date:   Mon Aug 11 18:40:01 2014 -0400
     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>
-Date:   Mon Aug 11 18:23:43 2014 -0400
+Date:  Mon Aug 11 18:23:43 2014 -0400
 
     Minor
 
@@ -246,7 +2133,7 @@ Date:   Mon Aug 11 18:23:43 2014 -0400
 
 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
 
@@ -257,7 +2144,7 @@ Date:   Mon Aug 11 17:46:50 2014 -0400
 
 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
 
@@ -269,7 +2156,7 @@ Date:   Mon Aug 11 17:46:12 2014 -0400
 
 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
 
@@ -281,7 +2168,7 @@ Date:   Mon Aug 11 15:29:18 2014 -0400
 
 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
 
@@ -295,7 +2182,7 @@ Date:   Mon Aug 11 15:11:59 2014 -0400
 
 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
 
@@ -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 +
- 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>
-Date:   Mon Aug 11 13:25:43 2014 -0400
+Date:  Mon Aug 11 13:25:43 2014 -0400
 
     [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>
-Date:   Mon Aug 11 13:42:42 2014 -0400
+Date:  Mon Aug 11 13:42:42 2014 -0400
 
     Minor
 
@@ -331,7 +2218,7 @@ Date:   Mon Aug 11 13:42:42 2014 -0400
 
 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
 
@@ -340,7 +2227,7 @@ Date:   Mon Aug 11 02:04:38 2014 -0400
 
 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
 
@@ -349,7 +2236,7 @@ Date:   Sun Aug 10 19:19:38 2014 -0400
 
 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
 
@@ -360,7 +2247,7 @@ Date:   Sun Aug 10 19:05:25 2014 -0400
 
 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
 
@@ -374,7 +2261,7 @@ Date:   Sun Aug 10 18:59:47 2014 -0400
 
 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
 
@@ -385,7 +2272,7 @@ Date:   Sun Aug 10 18:52:07 2014 -0400
 
 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
 
@@ -399,7 +2286,7 @@ Date:   Sun Aug 10 18:04:50 2014 -0400
 
 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
 
@@ -409,7 +2296,7 @@ Date:   Sun Aug 10 17:42:19 2014 -0400
 
 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
 
@@ -423,7 +2310,7 @@ Date:   Sun Aug 10 17:40:24 2014 -0400
 
 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
 
@@ -432,7 +2319,7 @@ Date:   Fri Apr 18 11:21:08 2014 -0700
 
 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
 
@@ -443,7 +2330,7 @@ Date:   Thu Aug 7 15:38:52 2014 -0400
 
 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
 
@@ -454,17 +2341,17 @@ Date:   Wed Aug 6 13:34:49 2014 -0400
 
     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-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>
-Date:   Tue Aug 5 14:19:01 2014 -0400
+Date:  Tue Aug 5 14:19:01 2014 -0400
 
     [arabic] Fix fallback shaping regression
 
@@ -474,28 +2361,28 @@ Date:   Tue Aug 5 14:19:01 2014 -0400
 
     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
- 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>
-Date:   Sat Aug 2 19:24:55 2014 -0400
+Date:  Sat Aug 2 19:24:55 2014 -0400
 
     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>
-Date:   Sat Aug 2 17:46:38 2014 -0400
+Date:  Sat Aug 2 17:46:38 2014 -0400
 
     [uniscribe] Minor
 
@@ -504,29 +2391,29 @@ Date:   Sat Aug 2 17:46:38 2014 -0400
 
 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.
 
- 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-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>
-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
-    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 +-
@@ -534,7 +2421,7 @@ Date:   Sat Aug 2 16:31:16 2014 -0400
 
 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
 
@@ -544,23 +2431,23 @@ Date:   Sat Aug 2 16:17:44 2014 -0400
     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,
-                          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,
-                           HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
+                          HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
 
       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
@@ -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.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>
-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>
-Date:   Sat Aug 2 14:58:38 2014 -0400
+Date:  Sat Aug 2 14:58:38 2014 -0400
 
     [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>
-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
 
@@ -607,7 +2494,7 @@ Date:   Fri Aug 1 19:05:33 2014 -0400
 
 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
 
@@ -622,7 +2509,7 @@ Date:   Fri Aug 1 16:14:33 2014 -0400
 
 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
 
@@ -633,7 +2520,7 @@ Date:   Fri Aug 1 16:09:31 2014 -0400
 
 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
 
@@ -644,7 +2531,7 @@ Date:   Thu Jul 31 18:21:05 2014 -0400
 
 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
 
@@ -662,14 +2549,14 @@ Date:   Thu Jul 31 11:04:00 2014 -0400
     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>
-Date:   Wed Jul 30 02:15:44 2014 -0400
+Date:  Wed Jul 30 02:15:44 2014 -0400
 
     [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
-    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".
 
@@ -687,8 +2574,8 @@ Date:   Wed Jul 30 02:15:44 2014 -0400
 
     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
  +++++++++++++++++++++++++++++
@@ -696,7 +2583,7 @@ Date:   Wed Jul 30 02:15:44 2014 -0400
 
 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'
 
@@ -704,22 +2591,22 @@ Date:   Thu Jul 31 18:51:37 2014 -0400
 
     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
- 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>
-Date:   Thu Jul 31 18:33:11 2014 -0400
+Date:  Thu Jul 31 18:33:11 2014 -0400
 
     [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>
-Date:   Tue Jul 29 19:47:26 2014 -0400
+Date:  Tue Jul 29 19:47:26 2014 -0400
 
     Minor
 
@@ -737,7 +2624,7 @@ Date:   Tue Jul 29 19:47:26 2014 -0400
 
 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
 
@@ -751,16 +2638,16 @@ Date:   Sat Jul 26 20:34:01 2014 -0400
 
     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
- 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>
-Date:   Sat Jul 26 19:17:44 2014 -0400
+Date:  Sat Jul 26 19:17:44 2014 -0400
 
     Add old-Myanmar shaper
 
@@ -773,30 +2660,30 @@ Date:   Sat Jul 26 19:17:44 2014 -0400
 
     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
- 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>
-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 +
- 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>
-Date:   Fri Jul 25 12:40:56 2014 -0400
+Date:  Fri Jul 25 12:40:56 2014 -0400
 
     Typo
 
@@ -805,7 +2692,7 @@ Date:   Fri Jul 25 12:40:56 2014 -0400
 
 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
 
@@ -814,7 +2701,7 @@ Date:   Fri Jul 25 12:35:03 2014 -0400
 
 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
 
@@ -826,7 +2713,7 @@ Date:   Fri Jul 25 12:30:47 2014 -0400
 
 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
 
@@ -838,7 +2725,7 @@ Date:   Fri Jul 25 12:21:49 2014 -0400
 
 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()
 
@@ -849,7 +2736,7 @@ Date:   Fri Jul 25 12:15:33 2014 -0400
 
 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 '
 
@@ -858,7 +2745,7 @@ Date:   Fri Jul 25 12:04:27 2014 -0400
 
 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
 
@@ -867,7 +2754,7 @@ Date:   Fri Jul 25 12:03:52 2014 -0400
 
 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()
 
@@ -878,7 +2765,7 @@ Date:   Fri Jul 25 12:01:22 2014 -0400
 
 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
 
@@ -889,7 +2776,7 @@ Date:   Fri Jul 25 11:56:01 2014 -0400
 
 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)
 
@@ -898,7 +2785,7 @@ Date:   Fri Jul 25 11:53:46 2014 -0400
 
 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()
 
@@ -909,7 +2796,7 @@ Date:   Fri Jul 25 11:44:35 2014 -0400
 
 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()
 
@@ -918,22 +2805,22 @@ Date:   Fri Jul 25 11:39:55 2014 -0400
 
 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,
-    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-private.hh           | 2 +-
+ src/hb-private.hh          | 2 +-
  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
 
@@ -941,20 +2828,20 @@ Date:   Wed Jul 23 16:48:51 2014 -0400
 
     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
- 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>
-Date:   Wed Jul 23 11:38:49 2014 -0400
+Date:  Wed Jul 23 11:38:49 2014 -0400
 
     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>
-Date:   Tue Jul 22 17:56:43 2014 -0400
+Date:  Tue Jul 22 17:56:43 2014 -0400
 
     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>
-Date:   Tue Jul 22 18:01:46 2014 -0400
+Date:  Tue Jul 22 18:01:46 2014 -0400
 
     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>
-Date:   Tue Jul 22 16:26:27 2014 -0400
+Date:  Tue Jul 22 16:26:27 2014 -0400
 
     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>
-Date:   Mon Jul 21 11:12:54 2014 -0400
+Date:  Mon Jul 21 11:12:54 2014 -0400
 
     [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>
-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
 
@@ -1020,7 +2907,7 @@ Date:   Sun Jul 20 01:17:40 2014 -0400
 
 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
 
@@ -1031,7 +2918,7 @@ Date:   Sat Jul 19 17:31:23 2014 -0400
 
 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
 
@@ -1040,7 +2927,7 @@ Date:   Sat Jul 19 16:52:32 2014 -0400
 
 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
 
@@ -1049,20 +2936,20 @@ Date:   Sat Jul 19 16:37:22 2014 -0400
 
 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 -
- 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>
-Date:   Sat Jul 19 16:10:21 2014 -0400
+Date:  Sat Jul 19 16:10:21 2014 -0400
 
     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>
-Date:   Fri Jul 18 14:42:50 2014 -0400
+Date:  Fri Jul 18 14:42:50 2014 -0400
 
     [test] Remove unused micro-font
 
- .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf        | Bin 81968 ->
+ .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf       | Bin 81968 ->
  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>
-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
 
- .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf        | Bin 0 ->
+ .../9d64156923a1b9fed1e05f74599c16563eca42d9.ttf       | Bin 0 ->
  81968 bytes
- test/shaping/fonts/sha1sum/MANIFEST                     |   2 ++
- .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf        | Bin 0 ->
+ test/shaping/fonts/sha1sum/MANIFEST                    |   2 ++
+ .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf       | Bin 0 ->
  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>
-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
 
@@ -1114,7 +3001,7 @@ Date:   Thu Jul 17 18:22:07 2014 -0400
 
 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
 
@@ -1125,17 +3012,17 @@ Date:   Thu Jul 17 17:13:54 2014 -0400
 
 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
 
- NEWS         | 12 ++++++++++++
+ NEWS        | 12 ++++++++++++
  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'
 
@@ -1144,7 +3031,7 @@ Date:   Thu Jul 17 15:57:37 2014 -0400
 
 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
 
@@ -1153,20 +3040,20 @@ Date:   Thu Jul 17 13:36:09 2014 -0400
 
     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
- test/shaping/fonts/sha1sum/MANIFEST                |   3 ++
+ test/shaping/fonts/sha1sum/MANIFEST               |   3 ++
  .../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>
-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
 
@@ -1175,23 +3062,23 @@ Date:   Thu Jul 17 15:27:46 2014 -0400
 
 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
 
- 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-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>
-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
 
@@ -1203,23 +3090,23 @@ Date:   Thu Jul 17 14:16:38 2014 -0400
 
     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
- .../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>
-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
-    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
 
index fa87114..47aeb97 100644 (file)
@@ -10,6 +10,7 @@ EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        Android.mk \
+       README.python \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -18,6 +19,7 @@ MAINTAINERCLEANFILES = \
        $(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
        $(srcdir)/INSTALL \
        $(srcdir)/ChangeLog \
+       $(srcdir)/gtk-doc.make \
        $(NULL)
 
 
index 61de622..badd4c0 100644 (file)
@@ -371,6 +371,7 @@ EXTRA_DIST = \
        autogen.sh \
        harfbuzz.doap \
        Android.mk \
+       README.python \
        $(NULL)
 
 MAINTAINERCLEANFILES = \
@@ -379,6 +380,7 @@ MAINTAINERCLEANFILES = \
        $(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
        $(srcdir)/INSTALL \
        $(srcdir)/ChangeLog \
+       $(srcdir)/gtk-doc.make \
        $(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
 =====================================
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:
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
 }
 
+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 "*** 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 "*** No autoreconf found, please install it ***"
+       echo "*** No autoreconf (autoconf) found, please install it ***"
        exit 1
 }
 
index 491e7f4..35395c3 100644 (file)
@@ -24,9 +24,6 @@
 /* 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
 
index 84e04c7..1c08cae 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for HarfBuzz 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>.
 #
@@ -591,8 +591,8 @@ MAKEFLAGS=
 # 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/'
 
@@ -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
-\`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]...
 
@@ -1515,7 +1515,7 @@ fi
 
 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
 
@@ -1674,7 +1674,7 @@ fi
 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.
@@ -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.
 
-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 $@
@@ -3270,7 +3270,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='harfbuzz'
- VERSION='0.9.35'
+ VERSION='0.9.40'
 
 
 # Some tools Automake needs.
@@ -16813,8 +16813,8 @@ GIT=${GIT-"${am_missing_run}git"}
 
 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
@@ -18618,6 +18618,7 @@ fi
 
 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
@@ -18628,12 +18629,12 @@ if test -n "$PKG_CONFIG"; then
         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
-  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
@@ -18646,12 +18647,12 @@ if test -n "$PKG_CONFIG"; then
         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
-  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
@@ -18670,9 +18671,9 @@ else
         _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
-               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
@@ -18697,23 +18698,6 @@ if $have_freetype; then
 
 $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=
@@ -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="
-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
@@ -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="\\
-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\\"
 
index b9e82d9..5baad1f 100644 (file)
@@ -1,6 +1,6 @@
 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/])
@@ -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_DEFINE(HAVE_GRAPHITE2, 1, [Have Graphite2 library])
+       AC_DEFINE(HAVE_GRAPHITE2, 1, [Have Graphite2 library])
 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
-       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])
-       _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)
 
index f3ddc22..034926c 100644 (file)
@@ -1 +1,3 @@
 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
 
 
+-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:
index a78200e..1afb91d 100644 (file)
@@ -18,6 +18,8 @@
                     Â <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>
@@ -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-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>
 <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>
index 58329ec..a86abae 100644 (file)
@@ -21,7 +21,7 @@
 </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>
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>
-<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">
-<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 class="since">Since 1.0</p>
 </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">
-<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">
@@ -230,7 +278,7 @@ is.</p>
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -298,7 +346,7 @@ hb_blob_get_data (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </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>
@@ -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">
-<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">
@@ -337,7 +385,7 @@ fails.</p>
 </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>
@@ -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">
-<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>
@@ -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">
-<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">
@@ -379,7 +427,7 @@ hb_blob_get_length (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </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>
@@ -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">
-<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">
@@ -414,7 +462,7 @@ hb_blob_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </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>
@@ -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">
-<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">
@@ -441,7 +489,7 @@ hb_blob_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -493,7 +541,7 @@ hb_blob_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </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>
@@ -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">
-<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">
@@ -548,7 +596,7 @@ is not needed anymore.</p></td>
 </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>
@@ -569,7 +617,7 @@ is not needed anymore.</p></td>
 <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">
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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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>
-<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>
@@ -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">
-<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">
@@ -629,7 +629,7 @@ hb_buffer_allocation_successful (<em class="parameter"><code><a class="link" hre
 </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>
@@ -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">
-<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">
@@ -664,7 +664,7 @@ hb_buffer_create (<em class="parameter"><code><span class="type">void</span></co
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21072704"></a><h4>Returns</h4>
+<a name="idp20501968"></a><h4>Returns</h4>
 <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">
-<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">
@@ -706,7 +706,7 @@ hb_buffer_deserialize_glyphs (<em class="parameter"><code><a class="link" href="
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -754,7 +754,7 @@ hb_buffer_get_content_type (<em class="parameter"><code><a class="link" href="ha
 </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>
@@ -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">
-<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">
@@ -780,7 +780,7 @@ hb_buffer_get_direction (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -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">
-<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>
@@ -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">
-<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">
@@ -818,7 +818,7 @@ hb_buffer_get_flags (<em class="parameter"><code><a class="link" href="harfbuzz-
 </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>
@@ -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">
-<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">
@@ -854,7 +854,7 @@ is valid as long as buffer contents are not modified.</p>
 </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>
@@ -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">
-<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">
@@ -891,7 +891,7 @@ is valid as long as buffer contents are not modified.</p>
 </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>
@@ -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">
-<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">
@@ -918,7 +918,7 @@ hb_buffer_get_language (<em class="parameter"><code><a class="link" href="harfbu
 </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>
@@ -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">
-<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">
@@ -945,7 +945,7 @@ hb_buffer_get_length (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -979,7 +979,7 @@ hb_buffer_get_script (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -1028,7 +1028,7 @@ hb_buffer_get_unicode_funcs (<em class="parameter"><code><a class="link" href="h
 </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>
@@ -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">
-<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">
@@ -1055,7 +1055,7 @@ hb_buffer_get_user_data (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -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 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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -1140,7 +1140,7 @@ hb_buffer_pre_allocate (<em class="parameter"><code><a class="link" href="harfbu
 </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>
@@ -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">
-<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">
@@ -1166,7 +1166,7 @@ hb_buffer_reference (<em class="parameter"><code><a class="link" href="harfbuzz-
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<a name="idp22844320"></a><h4>Returns</h4>
+<a name="idp22471280"></a><h4>Returns</h4>
 <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">
-<a name="idp22852256"></a><h4>Returns</h4>
+<a name="idp22479216"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1307,7 +1307,7 @@ hb_buffer_serialize_glyphs (<em class="parameter"><code><a class="link" href="ha
 </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>
@@ -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">
-<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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -1438,7 +1438,7 @@ hb_buffer_set_length (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -1545,7 +1545,7 @@ hb_buffer_set_user_data (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -1559,7 +1559,7 @@ hb_segment_properties_equal (<em class="parameter"><code>const <a class="link" h
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23057632"></a><h4>Returns</h4>
+<a name="idp22700656"></a><h4>Returns</h4>
 <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">
-<a name="idp23065088"></a><h4>Returns</h4>
+<a name="idp22709792"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1623,7 +1623,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <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">
@@ -1661,7 +1661,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <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">
@@ -1699,7 +1699,7 @@ hb_segment_properties_hash (<em class="parameter"><code>const <a class="link" hr
 <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">
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">
-<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">
@@ -326,7 +326,7 @@ hb_direction_from_string (<em class="parameter"><code>const <span class="type">c
 </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>
@@ -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">
-<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>
@@ -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">
-<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">
@@ -365,7 +365,7 @@ hb_language_from_string (<em class="parameter"><code>const <span class="type">ch
 </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>
@@ -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">
-<a name="idp19036576"></a><h4>Returns</h4>
+<a name="idp17734384"></a><h4>Returns</h4>
 <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">
-<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>
@@ -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">
-<a name="idp19056528"></a><h4>Returns</h4>
+<a name="idp17754336"></a><h4>Returns</h4>
 <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">
-<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">
@@ -426,7 +426,7 @@ hb_script_from_string (<em class="parameter"><code>const <span class="type">char
 </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>
@@ -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">
-<a name="idp19086016"></a><h4>Returns</h4>
+<a name="idp17783824"></a><h4>Returns</h4>
 <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">
-<a name="idp19095136"></a><h4>Returns</h4>
+<a name="idp17792944"></a><h4>Returns</h4>
 <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">
-<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">
@@ -475,7 +475,7 @@ hb_tag_from_string (<em class="parameter"><code>const <span class="type">char</s
 </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>
@@ -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">
-<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">
@@ -581,7 +581,7 @@ hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <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">
@@ -648,7 +648,7 @@ hb_tag_to_string (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 <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">
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">
-<a name="idp19763168"></a><h4>Returns</h4>
+<a name="idp14032320"></a><h4>Returns</h4>
 <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">
-<a name="idp23989600"></a><h4>Returns</h4>
+<a name="idp19308640"></a><h4>Returns</h4>
 <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">
-<a name="idp17669104"></a><h4>Returns</h4>
+<a name="idp20616992"></a><h4>Returns</h4>
 <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">
-<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">
@@ -237,7 +237,7 @@ hb_face_create_for_tables (<em class="parameter"><code><a class="link" href="har
 </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>
@@ -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">
-<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">
@@ -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">
-<a name="idp21412768"></a><h4>Returns</h4>
+<a name="idp22870240"></a><h4>Returns</h4>
 <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">
-<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">
@@ -298,7 +298,7 @@ hb_face_get_glyph_count (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -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">
-<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">
@@ -324,7 +324,7 @@ hb_face_get_index (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </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>
@@ -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">
-<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">
@@ -350,7 +350,7 @@ hb_face_get_upem (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </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>
@@ -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">
-<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">
@@ -377,7 +377,7 @@ hb_face_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </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>
@@ -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">
-<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">
@@ -404,7 +404,7 @@ hb_face_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -452,7 +452,7 @@ hb_face_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </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>
@@ -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">
-<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">
@@ -478,7 +478,7 @@ hb_face_reference_blob (<em class="parameter"><code><a class="link" href="harfbu
 </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>
@@ -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">
-<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">
@@ -506,7 +506,7 @@ hb_face_reference_table (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -606,7 +606,7 @@ hb_face_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </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>
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">
-<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">
@@ -666,7 +666,7 @@ hb_font_create (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fa
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24877744"></a><h4>Returns</h4>
+<a name="idp24665728"></a><h4>Returns</h4>
 <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">
-<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">
@@ -691,7 +691,7 @@ hb_font_create_sub_font (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -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">
-<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">
@@ -727,7 +727,7 @@ hb_font_funcs_create (<em class="parameter"><code><span class="type">void</span>
 <p>
 </p>
 <div class="refsect3">
-<a name="idp24915104"></a><h4>Returns</h4>
+<a name="idp24703088"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<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>
@@ -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">
-<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">
@@ -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">
-<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>
@@ -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">
-<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">
@@ -814,7 +814,7 @@ hb_font_funcs_is_immutable (<em class="parameter"><code><a class="link" href="ha
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -862,7 +862,7 @@ hb_font_funcs_reference (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<a name="idp25299520"></a><h4>Returns</h4>
+<a name="idp25093024"></a><h4>Returns</h4>
 <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">
-<a name="idp25308272"></a><h4>Returns</h4>
+<a name="idp25101776"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1267,7 +1267,7 @@ hb_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </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>
@@ -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">
-<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">
@@ -1304,7 +1304,7 @@ hb_font_get_glyph (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </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>
@@ -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">
-<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">
@@ -1359,7 +1359,7 @@ hb_font_get_glyph_advance_for_direction
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25401296"></a><h4>Returns</h4>
+<a name="idp25194864"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1400,7 +1400,7 @@ hb_font_get_glyph_contour_point (<em class="parameter"><code><a class="link" hre
 </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>
@@ -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">
-<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">
@@ -1444,7 +1444,7 @@ hb_font_get_glyph_contour_point_for_origin
 </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>
@@ -1464,7 +1464,7 @@ hb_font_get_glyph_contour_point_for_origin
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25488288"></a><h4>Returns</h4>
+<a name="idp25281728"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1498,7 +1498,7 @@ hb_font_get_glyph_extents (<em class="parameter"><code><a class="link" href="har
 </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>
@@ -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">
-<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">
@@ -1534,7 +1534,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 </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>
@@ -1551,7 +1551,7 @@ hb_font_get_glyph_extents_for_origin (<em class="parameter"><code><a class="link
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25557120"></a><h4>Returns</h4>
+<a name="idp25350560"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp25587040"></a><h4>Returns</h4>
+<a name="idp25380480"></a><h4>Returns</h4>
 <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">
-<a name="idp25603280"></a><h4>Returns</h4>
+<a name="idp25396720"></a><h4>Returns</h4>
 <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">
-<a name="idp25622080"></a><h4>Returns</h4>
+<a name="idp25415520"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp25641008"></a><h4>Returns</h4>
+<a name="idp25434448"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp25662240"></a><h4>Returns</h4>
+<a name="idp25455680"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp25692592"></a><h4>Returns</h4>
+<a name="idp25486032"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1776,7 +1776,7 @@ hb_font_get_glyph_kerning_for_direction
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25742752"></a><h4>Returns</h4>
+<a name="idp25536256"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1811,7 +1811,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
 </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>
@@ -1829,7 +1829,7 @@ hb_font_get_glyph_name (<em class="parameter"><code><a class="link" href="harfbu
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25788480"></a><h4>Returns</h4>
+<a name="idp25581984"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1885,7 +1885,7 @@ hb_font_get_glyph_origin_for_direction
 <p>
 </p>
 <div class="refsect3">
-<a name="idp25837968"></a><h4>Returns</h4>
+<a name="idp25631472"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp25856896"></a><h4>Returns</h4>
+<a name="idp25650336"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp25878128"></a><h4>Returns</h4>
+<a name="idp25671504"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp25908416"></a><h4>Returns</h4>
+<a name="idp25701856"></a><h4>Returns</h4>
 <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">
-<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">
@@ -2006,7 +2006,7 @@ hb_font_get_parent (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -2106,7 +2106,7 @@ hb_font_get_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </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>
@@ -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">
-<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">
@@ -2148,7 +2148,7 @@ hb_font_glyph_from_string (<em class="parameter"><code><a class="link" href="har
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -2206,7 +2206,7 @@ hb_font_is_immutable (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -2254,7 +2254,7 @@ hb_font_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -2396,7 +2396,7 @@ hb_font_set_user_data (<em class="parameter"><code><a class="link" href="harfbuz
 </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>
@@ -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">
-<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">
@@ -2450,7 +2450,7 @@ hb_font_subtract_glyph_origin_for_direction
 <p>
 </p>
 <div class="refsect3">
-<a name="idp26271920"></a><h4>Returns</h4>
+<a name="idp26065488"></a><h4>Returns</h4>
 <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">
-<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">
@@ -110,7 +110,7 @@ hb_ft_face_create (<em class="parameter"><code><span class="type">FT_Face</span>
 </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>
@@ -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">
-<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>
@@ -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">
-<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">
@@ -150,7 +150,7 @@ hb_ft_font_create (<em class="parameter"><code><span class="type">FT_Face</span>
 </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>
@@ -164,7 +164,7 @@ hb_ft_font_get_face (<em class="parameter"><code><a class="link" href="harfbuzz-
 <p>
 </p>
 <div class="refsect3">
-<a name="idp26520048"></a><h4>Returns</h4>
+<a name="idp26507392"></a><h4>Returns</h4>
 <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">
-<a name="idp17205360"></a><h4>Returns</h4>
+<a name="idp18673488"></a><h4>Returns</h4>
 <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">
-<a name="idp15952992"></a><h4>Returns</h4>
+<a name="idp19415904"></a><h4>Returns</h4>
 <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">
-<a name="idp17801872"></a><h4>Returns</h4>
+<a name="idp16666160"></a><h4>Returns</h4>
 <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">
-<a name="idp9994096"></a><h4>Returns</h4>
+<a name="idp14441472"></a><h4>Returns</h4>
 <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">
-<a name="idp18663728"></a><h4>Returns</h4>
+<a name="idp23104224"></a><h4>Returns</h4>
 <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">
-<a name="idp14261024"></a><h4>Returns</h4>
+<a name="idp14126544"></a><h4>Returns</h4>
 <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">
-<a name="idp24211888"></a><h4>Returns</h4>
+<a name="idp20698224"></a><h4>Returns</h4>
 <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">
-<a name="idp14646672"></a><h4>Returns</h4>
+<a name="idp16604368"></a><h4>Returns</h4>
 <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">
-<a name="idp23755552"></a><h4>Returns</h4>
+<a name="idp26122576"></a><h4>Returns</h4>
 <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">
-<a name="idp23771216"></a><h4>Returns</h4>
+<a name="idp26138240"></a><h4>Returns</h4>
 <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">
-<a name="idp23781312"></a><h4>Returns</h4>
+<a name="idp26148336"></a><h4>Returns</h4>
 <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">
-<a name="idp23808736"></a><h4>Returns</h4>
+<a name="idp26175760"></a><h4>Returns</h4>
 <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">
-<a name="idp23826208"></a><h4>Returns</h4>
+<a name="idp26193232"></a><h4>Returns</h4>
 <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">
-<a name="idp23842928"></a><h4>Returns</h4>
+<a name="idp26209952"></a><h4>Returns</h4>
 <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">
-<a name="idp23851360"></a><h4>Returns</h4>
+<a name="idp26218384"></a><h4>Returns</h4>
 <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">
-<a name="idp23859792"></a><h4>Returns</h4>
+<a name="idp26226816"></a><h4>Returns</h4>
 <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">
-<a name="idp23868224"></a><h4>Returns</h4>
+<a name="idp26235248"></a><h4>Returns</h4>
 <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">
-<a name="idp23885344"></a><h4>Returns</h4>
+<a name="idp26252368"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
@@ -480,7 +480,7 @@ hb_ot_layout_language_get_feature_indexes
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23904336"></a><h4>Returns</h4>
+<a name="idp26271360"></a><h4>Returns</h4>
 <p></p>
 </div>
 </div>
@@ -499,7 +499,7 @@ hb_ot_layout_language_get_feature_tags
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23923344"></a><h4>Returns</h4>
+<a name="idp26290368"></a><h4>Returns</h4>
 <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">
-<a name="idp23980784"></a><h4>Returns</h4>
+<a name="idp26347808"></a><h4>Returns</h4>
 <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">
-<a name="idp24314880"></a><h4>Returns</h4>
+<a name="idp23893888"></a><h4>Returns</h4>
 <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">
-<a name="idp24331840"></a><h4>Returns</h4>
+<a name="idp23910848"></a><h4>Returns</h4>
 <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">
-<a name="idp24347152"></a><h4>Returns</h4>
+<a name="idp23926160"></a><h4>Returns</h4>
 <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">
-<a name="idp24360656"></a><h4>Returns</h4>
+<a name="idp23939664"></a><h4>Returns</h4>
 <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">
-<a name="idp24375904"></a><h4>Returns</h4>
+<a name="idp23954912"></a><h4>Returns</h4>
 <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">
-<a name="idp24391392"></a><h4>Returns</h4>
+<a name="idp23970400"></a><h4>Returns</h4>
 <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">
-<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">
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">
-<a name="idp17314176"></a><h4>Returns</h4>
+<a name="idp16597424"></a><h4>Returns</h4>
 <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">
-<a name="idp17962528"></a><h4>Returns</h4>
+<a name="idp15287904"></a><h4>Returns</h4>
 <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">
-<a name="idp20744864"></a><h4>Returns</h4>
+<a name="idp14593888"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -353,7 +353,7 @@ hb_set_allocation_successful (<em class="parameter"><code>const <a class="link"
 </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>
@@ -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">
-<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">
@@ -388,7 +388,7 @@ hb_set_create (<em class="parameter"><code><span class="type">void</span></code>
 <p>
 </p>
 <div class="refsect3">
-<a name="idp23552176"></a><h4>Returns</h4>
+<a name="idp23231984"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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>
@@ -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">
-<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">
@@ -495,7 +495,7 @@ hb_set_get_max (<em class="parameter"><code>const <a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -523,7 +523,7 @@ hb_set_get_min (<em class="parameter"><code>const <a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -551,7 +551,7 @@ hb_set_get_population (<em class="parameter"><code>const <a class="link" href="h
 </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>
@@ -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">
-<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">
@@ -579,7 +579,7 @@ hb_set_get_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -607,7 +607,7 @@ hb_set_has (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb-
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -678,7 +678,7 @@ hb_set_is_empty (<em class="parameter"><code>const <a class="link" href="harfbuz
 </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>
@@ -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">
-<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">
@@ -705,7 +705,7 @@ hb_set_is_equal (<em class="parameter"><code>const <a class="link" href="harfbuz
 </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>
@@ -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">
-<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">
@@ -739,7 +739,7 @@ hb_set_next (<em class="parameter"><code>const <a class="link" href="harfbuzz-hb
 </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>
@@ -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">
-<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">
@@ -784,7 +784,7 @@ are greater than current value of <em class="parameter"><code>last</code></em>
 </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>
@@ -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">
-<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">
@@ -811,7 +811,7 @@ hb_set_reference (<em class="parameter"><code><a class="link" href="harfbuzz-hb-
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -873,7 +873,7 @@ hb_set_set_user_data (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
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">
-<a name="idp19672080"></a><h4>Returns</h4>
+<a name="idp14878704"></a><h4>Returns</h4>
 <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">
-<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">
@@ -187,7 +187,7 @@ hb_shape_plan_create_cached (<em class="parameter"><code><a class="link" href="h
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -257,7 +257,7 @@ hb_shape_plan_execute (<em class="parameter"><code><a class="link" href="harfbuz
 </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>
@@ -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">
-<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>
@@ -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">
-<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">
@@ -295,7 +295,7 @@ hb_shape_plan_get_shaper (<em class="parameter"><code><a class="link" href="harf
 </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>
@@ -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">
-<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">
@@ -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">
-<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>
@@ -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">
-<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">
@@ -350,7 +350,7 @@ hb_shape_plan_reference (<em class="parameter"><code><a class="link" href="harfb
 </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>
@@ -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">
-<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">
@@ -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">
-<a name="idp24097632"></a><h4>Returns</h4>
+<a name="idp23615840"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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>
-<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">
-<a name="idp15995600"></a><h4>Returns</h4>
+<a name="idp17491264"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -245,7 +245,7 @@ hb_shape_full (<em class="parameter"><code><a class="link" href="harfbuzz-hb-fon
 </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>
@@ -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">
-<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>
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">
-<a name="idp19818576"></a><h4>Returns</h4>
+<a name="idp19583296"></a><h4>Returns</h4>
 <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">
-<a name="idp19831776"></a><h4>Returns</h4>
+<a name="idp19596496"></a><h4>Returns</h4>
 <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">
-<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">
@@ -405,7 +405,7 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
 </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>
@@ -422,7 +422,7 @@ hb_unicode_compose (<em class="parameter"><code><a class="link" href="harfbuzz-h
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19874288"></a><h4>Returns</h4>
+<a name="idp19639008"></a><h4>Returns</h4>
 <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">
-<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">
@@ -462,7 +462,7 @@ hb_unicode_decompose (<em class="parameter"><code><a class="link" href="harfbuzz
 </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>
@@ -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">
-<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">
@@ -497,7 +497,7 @@ hb_unicode_decompose_compatibility (<em class="parameter"><code><a class="link"
 </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>
@@ -514,7 +514,7 @@ hb_unicode_decompose_compatibility (<em class="parameter"><code><a class="link"
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19945264"></a><h4>Returns</h4>
+<a name="idp19709984"></a><h4>Returns</h4>
 <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">
-<a name="idp19955504"></a><h4>Returns</h4>
+<a name="idp19720224"></a><h4>Returns</h4>
 <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">
-<a name="idp19963936"></a><h4>Returns</h4>
+<a name="idp19728656"></a><h4>Returns</h4>
 <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">
-<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">
@@ -573,7 +573,7 @@ hb_unicode_funcs_get_default (<em class="parameter"><code><span class="type">voi
 <p>
 </p>
 <div class="refsect3">
-<a name="idp19987856"></a><h4>Returns</h4>
+<a name="idp19752576"></a><h4>Returns</h4>
 <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">
-<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>
@@ -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">
-<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">
@@ -610,7 +610,7 @@ hb_unicode_funcs_get_parent (<em class="parameter"><code><a class="link" href="h
 </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>
@@ -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">
-<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">
@@ -637,7 +637,7 @@ hb_unicode_funcs_get_user_data (<em class="parameter"><code><a class="link" href
 </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>
@@ -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">
-<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">
@@ -664,7 +664,7 @@ hb_unicode_funcs_is_immutable (<em class="parameter"><code><a class="link" href=
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -712,7 +712,7 @@ hb_unicode_funcs_reference (<em class="parameter"><code><a class="link" href="ha
 </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>
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -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">
-<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">
@@ -947,7 +947,7 @@ hb_unicode_funcs_set_user_data (<em class="parameter"><code><a class="link" href
 </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>
@@ -961,7 +961,7 @@ hb_unicode_general_category (<em class="parameter"><code><a class="link" href="h
 <p>
 </p>
 <div class="refsect3">
-<a name="idp21756896"></a><h4>Returns</h4>
+<a name="idp21171920"></a><h4>Returns</h4>
 <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">
-<a name="idp21768192"></a><h4>Returns</h4>
+<a name="idp21183216"></a><h4>Returns</h4>
 <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">
-<a name="idp21777952"></a><h4>Returns</h4>
+<a name="idp21191760"></a><h4>Returns</h4>
 <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">
-<a name="idp21791664"></a><h4>Returns</h4>
+<a name="idp21203056"></a><h4>Returns</h4>
 <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">
-<a name="idp21801936"></a><h4>Returns</h4>
+<a name="idp21211600"></a><h4>Returns</h4>
 <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">
-<a name="idp21815648"></a><h4>Returns</h4>
+<a name="idp21222896"></a><h4>Returns</h4>
 <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">
-<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">
@@ -1352,7 +1352,7 @@ hb_unicode_script (<em class="parameter"><code><a class="link" href="harfbuzz-hb
 <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">
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">
-<a name="idp18176784"></a><h4>Returns</h4>
+<a name="idp26513136"></a><h4>Returns</h4>
 <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">
-<a name="idp19749248"></a><h4>Returns</h4>
+<a name="idp15442704"></a><h4>Returns</h4>
 <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">
-<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">
@@ -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">
-<a name="idp21398048"></a><h4>Returns</h4>
+<a name="idp14950384"></a><h4>Returns</h4>
 <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>
-<pre class="programlisting">#define HB_VERSION_MICRO 35
+<pre class="programlisting">#define HB_VERSION_MICRO 40
 </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>
-<pre class="programlisting">#define HB_VERSION_STRING "0.9.35"
+<pre class="programlisting">#define HB_VERSION_STRING "0.9.40"
 </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="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"/>
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">
-      for HarfBuzz 0.9.35
+      for HarfBuzz 0.9.40
 .
       
     </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="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-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">
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 =
 
+# Convenience targets:
+lib: libharfbuzz.la
+
 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 $^ | \
-       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 \
@@ -251,8 +254,8 @@ EXTRA_DIST += \
                -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)
 
@@ -265,8 +268,9 @@ harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
        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 = \
@@ -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
-       $(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
-       $(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 += \
-       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)
+BUILT_SOURCES += $(RAGEL_GENERATED)
 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)
-.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 \
index 703d994..bd923e6 100644 (file)
@@ -861,11 +861,7 @@ top_srcdir = @top_srcdir@
 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 \
@@ -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)
-MAINTAINERCLEANFILES = 
+MAINTAINERCLEANFILES = $(RAGEL_GENERATED)
 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) \
@@ -943,6 +936,14 @@ GENERATORS = \
        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)
@@ -1014,7 +1015,7 @@ all: $(BUILT_SOURCES)
        $(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 \
@@ -2223,12 +2224,18 @@ uninstall-am: uninstall-binPROGRAMS uninstall-girDATA \
        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@    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) \
@@ -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' \
-       "$<" \
-       > "$@.tmp" && mv "$@.tmp" "$@" || ( $(RM) "$@.tmp"; false )
+       "$<" > "$@" \
+       || ($(RM) "$@"; false)
 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; \
-       ) >"$@.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
-       $(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
-       $(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
-.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)
 
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
 
-       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
 
index e7e0e29..27deb42 100755 (executable)
@@ -17,14 +17,14 @@ fi
 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
+       tested=true
 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
-       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
index e000b01..b2bf43f 100755 (executable)
@@ -16,11 +16,17 @@ fi
 
 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/[.].*//'`
 
+       # 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"
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
-               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]])
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.
@@ -102,7 +102,10 @@ hb_blob_create (const char        *data,
 {
   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 ();
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.
  *
@@ -32,7 +32,7 @@
 #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, 
@@ -435,7 +435,7 @@ static const int deserialize_json_error = 0;
 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
@@ -459,15 +459,15 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer,
 
   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;
        }
 
-#line 471 "hb-buffer-deserialize-json.hh.tmp"
+#line 471 "hb-buffer-deserialize-json.hh"
        {
        int _slen;
        int _trans;
@@ -493,14 +493,14 @@ _resume:
 
        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:
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -510,13 +510,13 @@ _resume:
 }
        break;
        case 2:
-#line 51 "../../src/hb-buffer-deserialize-json.rl"
+#line 51 "hb-buffer-deserialize-json.rl"
        {
        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,
@@ -525,33 +525,33 @@ _resume:
 }
        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:
-#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:
-#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:
-#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:
-#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:
-#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:
-#line 62 "../../src/hb-buffer-deserialize-json.rl"
+#line 62 "hb-buffer-deserialize-json.rl"
        { 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)
@@ -561,9 +561,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -573,9 +573,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -585,9 +585,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -597,9 +597,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -609,9 +609,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-json.rl"
+#line 43 "hb-buffer-deserialize-json.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -620,7 +620,7 @@ _resume:
        *end_ptr = p;
 }
        break;
-#line 624 "hb-buffer-deserialize-json.hh.tmp"
+#line 624 "hb-buffer-deserialize-json.hh"
        }
 
 _again:
@@ -632,7 +632,7 @@ _again:
        _out: {}
        }
 
-#line 125 "../../src/hb-buffer-deserialize-json.rl"
+#line 125 "hb-buffer-deserialize-json.rl"
 
 
   *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;
-  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;
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.
  *
@@ -32,7 +32,7 @@
 #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, 
@@ -312,7 +312,7 @@ static const int deserialize_text_error = 0;
 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
@@ -339,12 +339,12 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer,
   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;
        }
 
-#line 348 "hb-buffer-deserialize-text.hh.tmp"
+#line 348 "hb-buffer-deserialize-text.hh"
        {
        int _slen;
        int _trans;
@@ -370,13 +370,13 @@ _resume:
 
        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:
-#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,
@@ -385,41 +385,41 @@ _resume:
 }
        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:
-#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:
-#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:
-#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:
-#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 ));
 }
-#line 51 "../../src/hb-buffer-deserialize-text.rl"
+#line 51 "hb-buffer-deserialize-text.rl"
        {
        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;
 }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -429,9 +429,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -441,9 +441,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -453,9 +453,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -465,9 +465,9 @@ _resume:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -476,7 +476,7 @@ _resume:
        *end_ptr = p;
 }
        break;
-#line 480 "hb-buffer-deserialize-text.hh.tmp"
+#line 480 "hb-buffer-deserialize-text.hh"
        }
 
 _again:
@@ -489,14 +489,14 @@ _again:
        {
        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;
 }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -506,9 +506,9 @@ _again:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -518,9 +518,9 @@ _again:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -530,9 +530,9 @@ _again:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -542,9 +542,9 @@ _again:
 }
        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; }
-#line 43 "../../src/hb-buffer-deserialize-text.rl"
+#line 43 "hb-buffer-deserialize-text.rl"
        {
        buffer->add_info (info);
        if (buffer->in_error)
@@ -553,14 +553,14 @@ _again:
        *end_ptr = p;
 }
        break;
-#line 557 "hb-buffer-deserialize-text.hh.tmp"
+#line 557 "hb-buffer-deserialize-text.hh"
        }
        }
 
        _out: {}
        }
 
-#line 119 "../../src/hb-buffer-deserialize-text.rl"
+#line 119 "hb-buffer-deserialize-text.rl"
 
 
   *end_ptr = p;
index 74ae273..b9fe263 100644 (file)
@@ -443,7 +443,7 @@ hb_buffer_t::reverse_range (unsigned int start,
 {
   unsigned int i, j;
 
-  if (start == end - 1)
+  if (end - start < 2)
     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;
   }
 
-  if (pos) {
+  if (have_positions) {
     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 ();
 }
 
-template <bool validate, typename T>
+template <typename utf_t>
 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)
 {
-  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 ||
@@ -1400,7 +1400,7 @@ hb_buffer_add_utf (hb_buffer_t  *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: 
@@ -1416,7 +1416,7 @@ hb_buffer_add_utf8 (hb_buffer_t  *buffer,
                    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)
 {
-  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)
 {
-  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)
 {
-  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);
 
+/* 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,
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 inline
+static
 void free_langs (void)
 {
   while (langs) {
@@ -265,6 +265,7 @@ retry:
   *lang = key;
 
   if (!hb_atomic_ptr_cmpexch (&langs, first_lang, lang)) {
+    lang->finish ();
     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_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language);
+    (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, 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;
+  CGFloat x_mult, y_mult; /* From CT space to HB space. */
 };
 
 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);
 
-  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);
@@ -327,7 +338,7 @@ struct range_record_t {
 #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;
@@ -776,6 +787,7 @@ retry:
 
     buffer->len = 0;
     uint32_t status_and = ~0, status_or = 0;
+    double advances_so_far = 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);
+      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,
@@ -860,8 +876,14 @@ retry:
            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++)
@@ -875,19 +897,22 @@ retry:
                   * for this one. */
                  continue;
              }
+             if (buffer->unicode->is_default_ignorable (ch))
+               continue;
 
              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);
+         advances_so_far += run_advance;
          continue;
        }
       }
@@ -917,7 +942,7 @@ retry:
   scratch_size = scratch_size_saved; \
   scratch = scratch_saved;
 
-      {
+      { /* Setup glyphs */
         SCRATCH_SAVE();
        const CGGlyph* glyphs = USE_PTR ? CTRunGetGlyphsPtr (run) : NULL;
        if (!glyphs) {
@@ -941,6 +966,11 @@ retry:
        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) {
@@ -948,33 +978,42 @@ retry:
          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;
+       CGFloat x_mult = font_data->x_mult, y_mult = font_data->y_mult;
        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++)
          {
-           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
        {
-         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++)
          {
-           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();
+       advances_so_far += run_advance;
       }
 #undef SCRATCH_RESTORE
 #undef SCRATCH_SAVE
index 6520d3d..c4266ff 100644 (file)
@@ -66,7 +66,7 @@ struct hb_face_t {
   {
     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);
index 16bf51f..322f93a 100644 (file)
  *     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?
@@ -70,12 +77,10 @@ hb_ft_get_glyph (hb_font_t *font HB_UNUSED,
 {
   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;
   }
-#endif
 
   *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 (font->x_scale < 0)
+    v = -v;
+
   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 (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;
@@ -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;
-  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;
@@ -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);
 
+  if (font->x_scale < 0)
+    *x = -*x;
+  if (font->y_scale < 0)
+    *y = -*y;
+
   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;
-  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;
@@ -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,
-                          /* 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);
@@ -358,6 +370,22 @@ hb_ft_face_create (FT_Face           ft_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)
 {
@@ -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));
+#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);
+#endif
 
   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;
 
-static inline
+#ifdef HB_USE_ATEXIT
+static
 void free_ft_library (void)
 {
   FT_Done_FreeType (ft_library);
 }
+#endif
 
 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);
 
-  assert (font->y_scale >= 0);
   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
+  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;
index 696251e..92f4b36 100644 (file)
 
 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);
 
+/* 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);
 
+/* 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);
 
+/* 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. */
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);
 }
 
+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_blob_t *
+hb_glib_blob_create (GBytes *gbytes);
+
 
 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(). */
-    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);
 }
-
-
index 6281201..a8ea39c 100644 (file)
 #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)
+#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)
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
 {
-  /* TODO Add tracing. */
-
   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}
 
-  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 ();
 };
@@ -179,32 +114,56 @@ struct hb_object_header_t
 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)
 {
-  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>
+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)
 {
-  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);
-  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->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,
@@ -213,14 +172,18 @@ static inline bool hb_object_set_user_data (Type               *obj,
                                            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)
 {
-  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
 {
-  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));
   }
@@ -102,7 +103,8 @@ typedef struct OffsetTable
   }
 
   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));
   }
@@ -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 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));
   }
@@ -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) {
@@ -197,6 +201,8 @@ struct TTCHeader
 
 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 */
@@ -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) {
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;
+  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; }
-  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)
   {
@@ -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);
+    assert (this->start <= this->end); /* Must not overflow. */
     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));
@@ -205,7 +209,7 @@ struct hb_sanitize_context_t
 
   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);
 
@@ -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;
+    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,
-       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);
+    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>
@@ -255,21 +262,20 @@ struct hb_sanitize_context_t
     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");
 
-    return TRACE_RETURN (this->writable);
+    return this->writable;
   }
 
   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)) {
-      obj->set (v);
+      const_cast<Type *> (obj)->set (v);
       return true;
     }
     return false;
@@ -297,7 +303,7 @@ struct Sanitizer
     c->init (blob);
 
   retry:
-    DEBUG_MSG_FUNC (SANITIZE, blob, "start");
+    DEBUG_MSG_FUNC (SANITIZE, c->start, "start");
 
     c->start_processing ();
 
@@ -311,13 +317,13 @@ struct Sanitizer
     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) {
-         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;
        }
       }
@@ -330,7 +336,7 @@ struct Sanitizer
        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;
        }
       }
@@ -338,7 +344,7 @@ struct Sanitizer
 
     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 {
@@ -533,31 +539,55 @@ template <typename Type>
 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>
-struct BEInt<Type, 4>
+struct BEInt<Type, 3>
 {
   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>
-struct BEInt<Type, 3>
+struct BEInt<Type, 4>
 {
   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 */
@@ -566,12 +596,19 @@ struct IntType
 {
   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); }
-  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)));
   }
@@ -598,7 +635,8 @@ typedef USHORT UFWORD;
  * 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)));
   }
@@ -622,7 +660,10 @@ struct Tag : ULONG
 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 {
@@ -671,7 +712,8 @@ struct FixedVersion
 {
   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));
   }
@@ -699,33 +741,35 @@ struct OffsetTo : Offset<OffsetType>
     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;
   }
 
-  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);
-    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>
-  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);
-    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 */
-  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));
@@ -790,7 +834,8 @@ struct ArrayOf
     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);
 
@@ -805,7 +850,8 @@ struct ArrayOf
 
     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;
@@ -815,7 +861,8 @@ struct ArrayOf
     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;
@@ -836,7 +883,8 @@ struct ArrayOf
   }
 
   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));
   }
@@ -862,12 +910,14 @@ struct OffsetListOf : OffsetArrayOf<Type>
     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>
-  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));
   }
@@ -901,12 +951,14 @@ struct HeadlessArrayOf
     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);
   }
 
-  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);
 
index d531411..0482312 100644 (file)
@@ -51,7 +51,8 @@ struct CmapSubtableFormat0
     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));
   }
@@ -125,7 +126,7 @@ struct CmapSubtableFormat4
     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)))
@@ -183,7 +184,8 @@ struct CmapSubtableLongGroup
     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));
   }
@@ -210,7 +212,8 @@ struct CmapSubtableTrimmed
     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));
   }
@@ -242,7 +245,8 @@ struct CmapSubtableLongSegmented
     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));
   }
@@ -288,7 +292,8 @@ struct UnicodeValueRange
     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));
   }
@@ -309,7 +314,8 @@ struct UVSMapping
     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));
   }
@@ -348,7 +354,8 @@ struct VariationSelectorRecord
     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) &&
@@ -373,7 +380,8 @@ struct CmapSubtableFormat14
     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));
@@ -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) {
@@ -461,7 +470,8 @@ struct EncodingRecord
     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));
@@ -496,7 +506,8 @@ struct cmap
     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) &&
index c9890c5..2af2f54 100644 (file)
 #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
 {
-  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_face_t *face = font->face;
 
   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;
 }
@@ -104,8 +181,9 @@ _hb_ot_font_create (hb_font_t *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);
 }
@@ -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;
-
-  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
@@ -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;
-
-  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
@@ -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)
 {
-  /* 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
@@ -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)
 {
+  /* OpenType doesn't have vertical-kerning other than GPOS. */
   return 0;
 }
 
index ec4e8c9..268f133 100644 (file)
@@ -45,13 +45,15 @@ struct 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;
   }
 
-  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));
   }
index d433200..992fe55 100644 (file)
@@ -35,61 +35,67 @@ namespace OT {
 
 /*
  * 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_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. */
-  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 -
-                                        * (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
-                                        * 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
-                                        * 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. */
-  USHORT       numberOfHMetrics;       /* Number of hMetric entries in 'hmtx'
-                                        * table */
+  USHORT       numberOfLongMetrics;    /* Number of LongMetric entries in metric
+                                        * table. */
   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 */
 
index e918e3b..a0e3855 100644 (file)
@@ -35,24 +35,30 @@ namespace OT {
 
 /*
  * 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_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);
 };
 
-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... */
@@ -60,7 +66,7 @@ struct hmtx
   }
 
   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
@@ -68,23 +74,29 @@ struct hmtx
                                         * 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'
-                                        * 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
-                                        * font to vary the left side bearing
+                                        * font to vary the side bearing
                                         * 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 */
 
index abd063c..3db7f57 100644 (file)
 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
@@ -63,9 +69,10 @@ struct Record
 
   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));
@@ -121,7 +128,8 @@ struct RecordListOf : RecordArrayOf<Type>
   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));
   }
@@ -134,7 +142,8 @@ struct RangeRecord
     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));
   }
@@ -199,7 +208,8 @@ struct LangSys
   }
 
   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));
   }
@@ -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,
-                       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));
   }
@@ -260,7 +271,8 @@ typedef RecordListOf<Script> ScriptList;
 /* 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);
 
@@ -371,7 +383,8 @@ struct FeatureParamsSize
 /* 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. */
@@ -404,7 +417,8 @@ struct FeatureParamsStylisticSet
 /* 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));
@@ -444,7 +458,8 @@ struct FeatureParamsCharacterVariants
 
 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));
@@ -486,7 +501,8 @@ struct Feature
   { 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);
@@ -561,6 +577,17 @@ struct Lookup
 {
   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
@@ -577,6 +604,20 @@ struct Lookup
     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,
@@ -595,18 +636,20 @@ struct Lookup
     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)
     {
-      USHORT &markFilteringSet = StructAfter<USHORT> (subTable);
+      const USHORT &markFilteringSet = StructAfter<USHORT> (subTable);
       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<> >
@@ -651,7 +694,8 @@ struct CoverageFormat1
     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));
   }
@@ -737,7 +781,8 @@ struct CoverageFormat2
     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));
   }
@@ -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) {
@@ -938,12 +984,14 @@ struct ClassDefFormat1
   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;
   }
 
-  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));
   }
@@ -994,12 +1042,13 @@ struct ClassDefFormat2
   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;
   }
 
-  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));
   }
@@ -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) {
@@ -1148,7 +1198,8 @@ struct Device
     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 ()));
   }
index 84a5e79..7a6c04d 100644 (file)
@@ -71,7 +71,8 @@ struct AttachList
     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));
   }
@@ -101,7 +102,8 @@ struct CaretValueFormat1
     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));
   }
@@ -127,7 +129,8 @@ struct CaretValueFormat2
       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));
   }
@@ -150,7 +153,8 @@ struct CaretValueFormat3
            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));
   }
@@ -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) {
@@ -219,7 +224,8 @@ struct LigGlyph
     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));
   }
@@ -253,7 +259,8 @@ struct LigCaretList
     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));
   }
@@ -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 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));
   }
@@ -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) {
@@ -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 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) &&
index 8e2860c..d88f787 100644 (file)
@@ -146,7 +146,8 @@ struct ValueFormat : USHORT
   }
 
   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++;
@@ -177,12 +178,14 @@ struct ValueFormat : USHORT
     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)));
   }
 
-  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 ();
 
@@ -200,7 +203,8 @@ struct ValueFormat : USHORT
   }
 
   /* 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);
@@ -225,7 +229,8 @@ struct AnchorFormat1
       *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));
   }
@@ -254,7 +259,8 @@ struct AnchorFormat2
       *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));
   }
@@ -282,7 +288,8 @@ struct AnchorFormat3
        *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));
   }
@@ -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) {
@@ -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);
-    *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;
-    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++)
-      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>
-               matrix[VAR];            /* Matrix of offsets to Anchor tables--
+               matrixZ[VAR];           /* Matrix of offsets to Anchor tables--
                                         * 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;
 
-  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));
   }
@@ -421,7 +431,8 @@ struct MarkArray : ArrayOf<MarkRecord>      /* Array of MarkRecords--in Coverage orde
     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));
   }
@@ -457,9 +468,12 @@ struct SinglePosFormat1
     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) && 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:
@@ -506,9 +520,12 @@ struct SinglePosFormat2
     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) && 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:
@@ -530,7 +547,8 @@ struct SinglePos
   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));
@@ -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 */
@@ -583,7 +591,7 @@ struct PairSet
     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++)
     {
@@ -602,12 +610,24 @@ struct PairSet
     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;
-    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());
@@ -618,36 +638,36 @@ struct PairSet
        buffer->idx = pos;
        return TRACE_RETURN (true);
       }
-      record = &StructAtOffset<PairValueRecord> (record, record_size);
     }
 
     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 */
   };
 
-  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)
-       && 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;
-    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 */
-  USHORT       array[VAR];             /* Array of PairValueRecords--ordered
+  USHORT       arrayZ[VAR];            /* Array of PairValueRecords--ordered
                                         * by GlyphID of the second glyph */
   public:
-  DEFINE_SIZE_ARRAY (2, array);
+  DEFINE_SIZE_ARRAY (2, arrayZ);
 };
 
 struct PairPosFormat1
@@ -670,18 +690,18 @@ struct PairPosFormat1
   {
     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);
 
+    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));
   }
 
-  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 ();
@@ -741,12 +761,11 @@ struct PairPosFormat2
   {
     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);
 
+    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 ();
@@ -770,7 +789,8 @@ struct PairPosFormat2
     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)
@@ -822,7 +842,8 @@ struct PairPos
   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));
@@ -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 */
@@ -853,7 +864,8 @@ struct EntryExitRecord
 {
   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));
   }
@@ -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);
 
-    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);
 
+    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)];
@@ -967,7 +978,8 @@ struct CursivePosFormat1
     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));
   }
@@ -989,22 +1001,14 @@ struct CursivePos
   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 ());
     }
   }
 
-  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 */
@@ -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 */
-    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);
@@ -1058,7 +1063,8 @@ struct MarkBasePosFormat1
     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));
@@ -1088,22 +1094,14 @@ struct MarkBasePos
   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 ());
     }
   }
 
-  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 */
@@ -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 */
-    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);
 
@@ -1178,7 +1177,8 @@ struct MarkLigPosFormat1
     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));
@@ -1209,22 +1209,14 @@ struct MarkLigPos
   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 ());
     }
   }
 
-  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 */
@@ -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 */
-    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);
 
@@ -1295,7 +1288,8 @@ struct MarkMarkPosFormat1
     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)
@@ -1328,22 +1322,14 @@ struct MarkMarkPos
   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 ());
     }
   }
 
-  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 */
@@ -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
   {
-    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));
@@ -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 {
-  struct {
-    USHORT             sub_format;
-  } header;
+  USHORT               sub_format;
   SinglePos            single;
   PairPos              pair;
   CursivePos           cursive;
@@ -1436,48 +1404,37 @@ struct PosLookupSubTable
   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
-  { return this+CastR<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; }
+  { return Lookup::get_subtable<PosLookupSubTable> (i); }
 
   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);
-    c->set_recurse_func (NULL);
     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);
@@ -1487,23 +1444,14 @@ struct PosLookup : Lookup
 
   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);
-    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);
 
-  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);
-    OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
+    const OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
     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);
-  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;
 }
 
index 2b421a9..ebe4c9e 100644 (file)
@@ -97,7 +97,8 @@ struct SingleSubstFormat1
     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));
   }
@@ -173,7 +174,8 @@ struct SingleSubstFormat2
     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));
   }
@@ -200,7 +202,7 @@ struct SingleSubst
     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 */
@@ -222,7 +224,8 @@ struct SingleSubst
   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));
@@ -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 */
@@ -312,7 +305,8 @@ struct Sequence
     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));
   }
@@ -384,7 +378,8 @@ struct MultipleSubstFormat1
     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));
   }
@@ -422,22 +417,14 @@ struct MultipleSubst
   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 ());
     }
   }
 
-  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 */
@@ -535,7 +522,8 @@ struct AlternateSubstFormat1
     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));
   }
@@ -573,22 +561,14 @@ struct AlternateSubst
   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 ());
     }
   }
 
-  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 */
@@ -686,7 +666,8 @@ struct Ligature
   }
 
   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));
   }
@@ -764,7 +745,8 @@ struct LigatureSet
     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));
   }
@@ -848,7 +830,8 @@ struct LigatureSubstFormat1
     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));
   }
@@ -889,22 +872,14 @@ struct LigatureSubst
   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 ());
     }
   }
 
-  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 */
@@ -1017,14 +992,15 @@ struct ReverseChainSingleSubstFormat1
     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);
-    OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
     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));
   }
 
@@ -1053,22 +1029,14 @@ struct ReverseChainSingleSubst
   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 ());
     }
   }
 
-  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 */
@@ -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
   {
-    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));
@@ -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 {
-  struct {
-    USHORT                     sub_format;
-  } header;
+  USHORT                       sub_format;
   SingleSubst                  single;
   MultipleSubst                        multiple;
   AlternateSubst               alternate;
@@ -1146,14 +1097,14 @@ struct SubstLookupSubTable
   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
-  { 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; }
@@ -1166,6 +1117,12 @@ struct SubstLookup : Lookup
     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);
@@ -1183,39 +1140,24 @@ struct SubstLookup : Lookup
   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);
-    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));
   }
 
-  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)
-  { 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,
@@ -1274,24 +1216,14 @@ struct SubstLookup : Lookup
 
   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);
-    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))
     {
@@ -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);
 
-  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);
-    OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
+    const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
     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))
-    return CastR<ExtensionSubst> (get_subtable<SubstLookupSubTable>()).is_reverse ();
+    return CastR<ExtensionSubst> (get_subtable<LookupSubTable>()).is_reverse ();
   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);
-  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;
 }
 
index 546ff4b..cbc6840 100644 (file)
 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
@@ -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);
+  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; }
@@ -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;
+  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; }
@@ -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);
+  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; }
@@ -168,6 +168,10 @@ struct hb_collect_glyphs_context_t
     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;
@@ -181,6 +185,8 @@ struct hb_collect_glyphs_context_t
     input  = old_input;
     after  = old_after;
 
+    recursed_lookups.add (lookup_index);
+
     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 recursed_lookups;
   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),
+                             recursed_lookups (),
                              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; }
 };
 
 
 
-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"; }
-  static const unsigned int max_debug_depth = 0;
+  static const unsigned int max_debug_depth = HB_DEBUG_GET_COVERAGE;
   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); }
+  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) {}
 
+  set_t *set;
   unsigned int debug_depth;
 };
 
@@ -241,61 +270,6 @@ struct hb_get_coverage_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) :
@@ -371,29 +345,24 @@ struct hb_apply_context_t
     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);
-      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[])
@@ -402,12 +371,21 @@ struct hb_apply_context_t
       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 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];
@@ -431,53 +409,10 @@ struct hb_apply_context_t
       }
       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);
-      while (!has_no_chance ())
+      while (idx >= num_items)
       {
        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;
+    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,
@@ -722,9 +724,9 @@ static inline bool match_input (hb_apply_context_t *c,
 
   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);
-  if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
 
   /*
    * 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);
 
-  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);
-  if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
 
   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);
 
-  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);
-  if (skippy_iter.has_no_chance ()) return TRACE_RETURN (false);
 
   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
 {
-  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));
   }
@@ -1117,9 +1120,9 @@ struct Rule
   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,
-                           inputCount, input,
+                           inputCount, inputZ,
                            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);
-    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,
-                                  inputCount, input,
+                                  inputCount, inputZ,
                                   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);
-    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);
-    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:
-  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)
-       && c->check_range (input,
-                          input[0].static_size * inputCount
+       && c->check_range (inputZ,
+                          inputZ[0].static_size * inputCount
                           + lookupRecordX[0].static_size * lookupCount);
   }
 
@@ -1163,12 +1167,12 @@ struct Rule
                                         * 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:
-  DEFINE_SIZE_ARRAY2 (4, input, lookupRecordX);
+  DEFINE_SIZE_ARRAY2 (4, inputZ, lookupRecordX);
 };
 
 struct RuleSet
@@ -1213,7 +1217,8 @@ struct RuleSet
     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));
   }
@@ -1295,7 +1300,8 @@ struct ContextFormat1
     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));
   }
@@ -1387,7 +1393,8 @@ struct ContextFormat2
     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));
   }
@@ -1413,16 +1420,16 @@ struct ContextFormat3
   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;
 
-    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,
-                           glyphCount, (const USHORT *) (coverage + 1),
+                           glyphCount, (const USHORT *) (coverageZ + 1),
                            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);
-    (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,
-                                  glyphCount, (const USHORT *) (coverage + 1),
+                                  glyphCount, (const USHORT *) (coverageZ + 1),
                                   lookupCount, lookupRecord,
                                   lookup_context);
   }
@@ -1448,41 +1455,43 @@ struct ContextFormat3
   {
     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
     };
-    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
   {
-    return this+coverage[0];
+    return this+coverageZ[0];
   }
 
   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);
 
-    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
     };
-    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;
-    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++)
-      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));
   }
 
@@ -1492,12 +1501,12 @@ struct ContextFormat3
                                         * 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:
-  DEFINE_SIZE_ARRAY2 (6, coverage, lookupRecordX);
+  DEFINE_SIZE_ARRAY2 (6, coverageZ, lookupRecordX);
 };
 
 struct Context
@@ -1505,7 +1514,8 @@ struct Context
   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));
@@ -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 */
@@ -1706,14 +1705,15 @@ struct ChainRule
                                                     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);
-    HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
+    const HeadlessArrayOf<USHORT> &input = StructAfter<HeadlessArrayOf<USHORT> > (backtrack);
     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);
-    ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     return TRACE_RETURN (lookup.sanitize (c));
   }
 
@@ -1775,7 +1775,8 @@ struct ChainRuleSet
     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));
   }
@@ -1854,7 +1855,8 @@ struct ChainContextFormat1
     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));
   }
@@ -1964,7 +1966,8 @@ struct ChainContextFormat2
     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) &&
@@ -2085,14 +2088,16 @@ struct ChainContextFormat3
                                                     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);
-    OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
     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);
-    ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
+    const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     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
   {
-    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));
@@ -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 */
@@ -2152,14 +2147,32 @@ struct ChainContext
 };
 
 
+template <typename T>
 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);
-    return TRACE_RETURN (c->check_struct (this));
+    return TRACE_RETURN (c->check_struct (this) && extensionOffset != 0);
   }
 
   protected:
@@ -2183,49 +2196,30 @@ struct Extension
     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
   {
-    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
   {
-    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) {
-    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 */
-  ExtensionFormat1     format1;
+  ExtensionFormat1<T>  format1;
   } u;
 };
 
@@ -2270,7 +2264,8 @@ struct GSUBGPOS
   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) &&
index 67a6df5..739dfd9 100644 (file)
@@ -54,7 +54,8 @@ typedef OffsetListOf<PosLookup> JstfMax;
 
 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) &&
@@ -123,7 +124,8 @@ struct JstfPriority
 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));
   }
@@ -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,
-                       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) &&
@@ -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 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));
index ae7daa6..47fecd2 100644 (file)
@@ -126,11 +126,15 @@ struct hb_ot_layout_lookup_accelerator_t
     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;
 };
 
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++)
-    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++)
-    layout->gpos_accels[i].fini (layout->gpos->get_lookup (i));
+    layout->gpos_accels[i].fini ();
 
   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);
 
-  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
@@ -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
+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)
 {
-  bool ret = false;
   hb_buffer_t *buffer = c->buffer;
 
   if (unlikely (!buffer->len || !c->lookup_mask))
-    return false;
+    return;
 
   c->set_lookup (lookup);
 
@@ -859,21 +916,20 @@ apply_string (OT::hb_apply_context_t *c,
       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
-        assert (!buffer->has_separate_output ());
+       assert (!buffer->has_separate_output ());
     }
   }
   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;
-    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>
index b1f8328..0d9a0fa 100644 (file)
@@ -43,11 +43,13 @@ struct 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;
   }
 
-  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)));
index 31d9fac..21450c6 100644 (file)
@@ -56,7 +56,8 @@ struct NameRecord
     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));
@@ -101,7 +102,7 @@ struct name
   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;
@@ -110,7 +111,8 @@ struct name
     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) &&
index e5b7ed4..a77f24e 100644 (file)
@@ -207,7 +207,7 @@ struct arabic_fallback_plan_t
 
 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
 
@@ -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])
     {
-      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]);
     }
index 63ed3f8..8edd3ba 100644 (file)
  */
 
 #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) \
@@ -313,8 +312,11 @@ OT_TABLE_END
 /*
  * Include a second time to get the table data...
  */
+#if 0
+#include "hb-private.hh" /* Make check-includes.sh happy. */
+#endif
 #ifdef OT_MEASURE
-#include __FILE__
+#include "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.
  *
 #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[] = {
-       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, 
-       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, 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, 
-       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, 
-       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, 
-       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, 
-       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, 
-       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, 
-       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, 
-       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, 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, 
-       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, 
-       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, 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[] = {
-       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, 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, 
-       29, 28, 16, 29, 29, 28, 10, 7
+       29, 28, 16, 29, 29, 28, 10, 10
        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, 
-       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, 
-       29, 28, 16, 29, 29, 28, 10, 7
+       29, 28, 16, 29, 29, 28, 10, 10
        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, 
-       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, 
-       28, 16, 29, 29, 28, 10, 7, 6, 
+       28, 16, 29, 29, 28, 10, 10, 6, 
        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, 
-       29, 28, 16, 29, 29, 28, 10, 7
+       29, 28, 16, 29, 29, 28, 10, 10
        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, 
-       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, 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[] = {
-       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[] = {
-       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[] = {
-       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[] = {
-       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, 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, 
-       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, 
-       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, 
-       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, 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, 
-       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, 
-       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[] = {
@@ -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, 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, 
@@ -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, 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, 
@@ -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, 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, 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_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) \
@@ -1550,7 +1576,7 @@ find_syllables (hb_buffer_t *buffer)
   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;
@@ -1558,7 +1584,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
-#line 118 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 118 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
@@ -1567,7 +1593,7 @@ find_syllables (hb_buffer_t *buffer)
   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;
@@ -1577,11 +1603,11 @@ find_syllables (hb_buffer_t *buffer)
                goto _test_eof;
 _resume:
        switch ( _indic_syllable_machine_from_state_actions[cs] ) {
-       case 10:
+       case 11:
 #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);
@@ -1603,68 +1629,72 @@ _eof_trans:
 #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;
-       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;
-       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;
-       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;
-       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;
-       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;
-       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;
-       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;
-       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;
-       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;
-       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;
-       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:
-#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:
-#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:
-#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;
+       case 9:
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
+       {{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
+       break;
        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:
@@ -1685,31 +1715,31 @@ _eof_trans:
        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;}
-#line 92 "../../src/hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
        {act = 5;}
        break;
-       case 12:
+       case 13:
 #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;
-#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] ) {
-       case 9:
+       case 10:
 #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 )
@@ -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)?;
-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;
index f58380e..2e159a1 100644 (file)
@@ -861,41 +861,41 @@ hb_indic_get_categories (hb_codepoint_t u)
   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 (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:
-      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 (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:
-      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:
-      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:
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.
  *
@@ -32,7 +32,7 @@
 #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, 
@@ -261,11 +261,11 @@ static const int myanmar_syllable_machine_error = -1;
 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) \
@@ -285,7 +285,7 @@ find_syllables (hb_buffer_t *buffer)
   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;
@@ -293,7 +293,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
-#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
+#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
   p = 0;
@@ -302,7 +302,7 @@ find_syllables (hb_buffer_t *buffer)
   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;
@@ -316,7 +316,7 @@ _resume:
 #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);
@@ -335,38 +335,38 @@ _eof_trans:
 
        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:
-#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:
-#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:
-#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:
-#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:
-#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:
-#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:
-#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;
-#line 370 "hb-ot-shape-complex-myanmar-machine.hh.tmp"
+#line 370 "hb-ot-shape-complex-myanmar-machine.hh"
        }
 
 _again:
@@ -375,7 +375,7 @@ _again:
 #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 )
@@ -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:
+    case HB_SCRIPT_NEW_TAI_LUE:
     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:
-    case HB_SCRIPT_NEW_TAI_LUE:
 
     /* 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.
  *
@@ -32,7 +32,7 @@
 #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
 };
@@ -89,11 +89,11 @@ static const int sea_syllable_machine_error = -1;
 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) \
@@ -113,7 +113,7 @@ find_syllables (hb_buffer_t *buffer)
   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;
@@ -121,7 +121,7 @@ find_syllables (hb_buffer_t *buffer)
        act = 0;
        }
 
-#line 88 "../../src/hb-ot-shape-complex-sea-machine.rl"
+#line 88 "hb-ot-shape-complex-sea-machine.rl"
 
 
   p = 0;
@@ -130,7 +130,7 @@ find_syllables (hb_buffer_t *buffer)
   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;
@@ -144,7 +144,7 @@ _resume:
 #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);
@@ -167,30 +167,30 @@ _eof_trans:
        {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:
-#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:
-#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:
-#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:
-#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:
-#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;
-#line 194 "hb-ot-shape-complex-sea-machine.hh.tmp"
+#line 194 "hb-ot-shape-complex-sea-machine.hh"
        }
 
 _again:
@@ -199,7 +199,7 @@ _again:
 #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 )
@@ -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::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;)
   {
-    OT::hb_apply_context_t::skipping_forward_iterator_t skippy_iter (&c, idx, 1);
+    skippy_iter.reset (idx, 1);
     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;
+  hb_codepoint_t u = buffer->cur().codepoint;
   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);
-  else if (decompose (c, shortest, buffer->cur().codepoint))
+  else if (decompose (c, shortest, u))
     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);
-  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. */
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
-       continue; /* Delete it. */
+       continue; /* Delete it. XXX Merge clusters? */
     }
     if (j != i)
     {
index 80fd6c4..06b24a8 100644 (file)
 # 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)
 #  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? */
+#  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
@@ -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)
@@ -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))
 
+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,
@@ -665,27 +642,13 @@ _hb_debug_msg_va (const char *what,
   } 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)
+  {
+    fprintf (stderr, ": ");
     vfprintf (stderr, message, ap);
+  }
 
   fprintf (stderr, "\n");
 }
@@ -752,7 +715,9 @@ _hb_debug_msg<0> (const char *what HB_UNUSED,
  */
 
 template <typename T>
-struct hb_printer_t {};
+struct hb_printer_t {
+  const char *print (const T&) { return "something"; }
+};
 
 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
-   * 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);
 
@@ -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))
 
 
-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))
@@ -918,7 +883,7 @@ hb_bubble_sort (T *array, unsigned int len, int(*compar)(const T *, const T *),
   } 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);
@@ -947,12 +912,12 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o
 
 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 {
-  int i;
+  unsigned int i;
   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
 {
+  friend struct hb_frozen_set_t;
+
   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) {
@@ -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]; }
-  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 */
@@ -335,6 +337,59 @@ struct hb_set_t
   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 */
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: 
- * @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 inline
+#ifdef HB_USE_ATEXIT
+static
 void free_static_shaper_list (void)
 {
   free (static_shaper_list);
 }
+#endif
 
 /**
  * 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) \
-       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 \
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 inline
+#ifdef HB_USE_ATEXIT
+static
 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)
index d59dfb2..fc19006 100644 (file)
@@ -157,7 +157,7 @@ hb_unicode_funcs_get_default (void)
 
 /**
  * hb_unicode_funcs_create: (Xconstructor)
- * @parent: (allow-none):
+ * @parent: (nullable):
  *
  * 
  *
index 74ae3a3..e7bcad2 100644 (file)
 #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,
index 0b798a0..14d3c2e 100644 (file)
 
 #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,
@@ -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,
@@ -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,
@@ -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 */
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_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) <= \
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_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 ());
index e2dcc98..70bcdd5 100644 (file)
@@ -40,6 +40,7 @@ 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 \
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 \
-       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
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
+5028afb650b1bb718ed2131e872fbcce57828fff.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)
-               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):
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]
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 =
 
+# Convenience targets:
+lib:
+       @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib
+
 bin_PROGRAMS =
 
 AM_CPPFLAGS = \
index 4bc79ac..6fecdd0 100644 (file)
@@ -820,6 +820,10 @@ 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.
index 03de7e6..859f9a6 100644 (file)
@@ -110,6 +110,6 @@ struct shape_closure_consumer_t : option_group_t
 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);
 }
index 01081ea..f38f387 100644 (file)
@@ -126,6 +126,6 @@ struct output_buffer_t
 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);
 }
index 26fad66..ef75e6d 100644 (file)
 #include "shape-consumer.hh"
 #include "view-cairo.hh"
 
+#define DEFAULT_FONT_SIZE 256
+#define SUBPIXEL_BITS 8
+
 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);
 }
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. */
-  uint32_t bg_color = * (uint32_t *) data;
+  uint32_t bg_color = data ? * (uint32_t *) data : 0;
 
   /* Drop first row while empty */
-  while (height) 
+  while (height)
   {
     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 *
-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 ());
 
@@ -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,
-                          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);
@@ -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,
-                              double               scale,
+                              int                  scale_bits,
                               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;
-    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;
-  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]));
index 567777e..ed55a45 100644 (file)
@@ -33,8 +33,7 @@
 
 
 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[];
 
@@ -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,
-                              double               scale,
+                              int                  scale_bits,
                               hb_bool_t            utf8_clusters);
 
 #endif
index ac51b2d..628cdf9 100644 (file)
 
 /* 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]"),
-                   font_opts (&options),
+                   font_opts (&options, default_font_size, subpixel_bits),
                    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_end (vap);
   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"},
-    {"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,
@@ -349,6 +349,28 @@ shape_options_t::add_options (option_parser_t *parser)
                     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)
 {
@@ -369,11 +391,22 @@ font_options_t::add_options (option_parser_t *parser)
     parser->free_later (text);
   }
 
+  char *font_size_text;
+  if (default_font_size == FONT_SIZE_UPEM)
+    font_size_text = (char *) "Font size (default: upem)";
+  else
+  {
+    font_size_text = g_strdup_printf ("Font size (default: %d)", default_font_size);
+    parser->free_later (font_size_text);
+  }
+
   GOptionEntry entries[] =
   {
     {"font-file",      0, 0, G_OPTION_ARG_STRING,      &this->font_file,               "Set font file-name",                   "filename"},
     {"face-index",     0, 0, G_OPTION_ARG_INT,         &this->face_index,              "Set face index (default: 0)",          "index"},
-    {"font-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,
@@ -514,8 +547,14 @@ font_options_t::get_font (void) const
 
   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;
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_FONT_SIZE 256
+#define FONT_SIZE_UPEM 0x7FFFFFFF
+#define FONT_SIZE_NONE 0
 
 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;
-    font_size = DEFAULT_FONT_SIZE;
 
     add_options (parser);
   }
@@ -167,7 +167,6 @@ struct view_options_t : option_group_t
   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
 {
-  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_size_x = font_size_y = default_font_size;
     font_funcs = NULL;
 
     font = NULL;
@@ -292,6 +296,10 @@ struct font_options_t : option_group_t
 
   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:
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)
 {
-  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);
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),
-                lines (0), scale (1.0) {}
+                lines (0), scale_bits (0) {}
   ~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));
-    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)
   {
@@ -71,7 +71,7 @@ struct view_cairo_t
   {
     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)
@@ -100,7 +100,7 @@ struct view_cairo_t
 
   hb_direction_t direction; // Remove this, make segment_properties accessible
   GArray *lines;
-  double scale;
+  int scale_bits;
 };
 
 #endif