diff options
author | Youngbok Shin <youngb.shin@samsung.com> | 2015-11-03 20:24:15 +0900 |
---|---|---|
committer | Youngbok Shin <youngb.shin@samsung.com> | 2015-11-03 20:49:45 +0900 |
commit | 4b524cd9449699e546a0991326d12ee2c915fab3 (patch) | |
tree | e6ce432188d6fe2b0b4bee6ddad34e7977c26a44 | |
parent | 4a63fee1394ef6d952890db5d6cf4b664f19da2e (diff) | |
download | harfbuzz-4b524cd9449699e546a0991326d12ee2c915fab3.tar.gz harfbuzz-4b524cd9449699e546a0991326d12ee2c915fab3.tar.bz2 harfbuzz-4b524cd9449699e546a0991326d12ee2c915fab3.zip |
Imported Upstream version 0.9.40upstream/0.9.40
Change-Id: Ifcc6c10a445fb0c0cc5bfee7638d67eb05a63a4c
119 files changed, 5682 insertions, 3197 deletions
@@ -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) @@ -1,16 +1,1903 @@ +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 diff --git a/Makefile.am b/Makefile.am index fa87114..47aeb97 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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) diff --git a/Makefile.in b/Makefile.in index 61de622..badd4c0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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) @@ -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 ===================================== @@ -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 index 0000000..eabdf5b --- /dev/null +++ b/README.python @@ -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. @@ -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 } diff --git a/config.h.in b/config.h.in index 491e7f4..35395c3 100644 --- a/config.h.in +++ b/config.h.in @@ -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 @@ -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\\" diff --git a/configure.ac b/configure.ac index b9e82d9..5baad1f 100644 --- a/configure.ac +++ b/configure.ac @@ -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) diff --git a/docs/Makefile.am b/docs/Makefile.am index f3ddc22..034926c 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -1 +1,3 @@ SUBDIRS = reference + +-include $(top_srcdir)/git.mk diff --git a/docs/Makefile.in b/docs/Makefile.in index 615c464..f8fe860 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -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: diff --git a/docs/reference/html/annotation-glossary.html b/docs/reference/html/annotation-glossary.html index a78200e..1afb91d 100644 --- a/docs/reference/html/annotation-glossary.html +++ b/docs/reference/html/annotation-glossary.html @@ -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> @@ -48,6 +47,10 @@ <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> diff --git a/docs/reference/html/ch01.html b/docs/reference/html/ch01.html index 58329ec..a86abae 100644 --- a/docs/reference/html/ch01.html +++ b/docs/reference/html/ch01.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-blob.html b/docs/reference/html/harfbuzz-hb-blob.html index 00f828d..b7f9a12 100644 --- a/docs/reference/html/harfbuzz-hb-blob.html +++ b/docs/reference/html/harfbuzz-hb-blob.html @@ -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"> diff --git a/docs/reference/html/harfbuzz-hb-buffer.html b/docs/reference/html/harfbuzz-hb-buffer.html index a4214dd..0c32fc8 100644 --- a/docs/reference/html/harfbuzz-hb-buffer.html +++ b/docs/reference/html/harfbuzz-hb-buffer.html @@ -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"> diff --git a/docs/reference/html/harfbuzz-hb-common.html b/docs/reference/html/harfbuzz-hb-common.html index 47aedb6..e2b1a8b 100644 --- a/docs/reference/html/harfbuzz-hb-common.html +++ b/docs/reference/html/harfbuzz-hb-common.html @@ -311,7 +311,7 @@ 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"> diff --git a/docs/reference/html/harfbuzz-hb-coretext.html b/docs/reference/html/harfbuzz-hb-coretext.html index 939d711..8d3ab15 100644 --- a/docs/reference/html/harfbuzz-hb-coretext.html +++ b/docs/reference/html/harfbuzz-hb-coretext.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-face.html b/docs/reference/html/harfbuzz-hb-face.html index 4a2f856..dc31c55 100644 --- a/docs/reference/html/harfbuzz-hb-face.html +++ b/docs/reference/html/harfbuzz-hb-face.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-font.html b/docs/reference/html/harfbuzz-hb-font.html index 2f91181..9596d54 100644 --- a/docs/reference/html/harfbuzz-hb-font.html +++ b/docs/reference/html/harfbuzz-hb-font.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-ft.html b/docs/reference/html/harfbuzz-hb-ft.html index 5194725..910af86 100644 --- a/docs/reference/html/harfbuzz-hb-ft.html +++ b/docs/reference/html/harfbuzz-hb-ft.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-glib.html b/docs/reference/html/harfbuzz-hb-glib.html index d8ebd68..03ab919 100644 --- a/docs/reference/html/harfbuzz-hb-glib.html +++ b/docs/reference/html/harfbuzz-hb-glib.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-graphite2.html b/docs/reference/html/harfbuzz-hb-graphite2.html index cc51db9..2c57cac 100644 --- a/docs/reference/html/harfbuzz-hb-graphite2.html +++ b/docs/reference/html/harfbuzz-hb-graphite2.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-icu.html b/docs/reference/html/harfbuzz-hb-icu.html index 77c031c..307aeb2 100644 --- a/docs/reference/html/harfbuzz-hb-icu.html +++ b/docs/reference/html/harfbuzz-hb-icu.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-ot-layout.html b/docs/reference/html/harfbuzz-hb-ot-layout.html index 32a2663..d7231db 100644 --- a/docs/reference/html/harfbuzz-hb-ot-layout.html +++ b/docs/reference/html/harfbuzz-hb-ot-layout.html @@ -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"> diff --git a/docs/reference/html/harfbuzz-hb-ot-tag.html b/docs/reference/html/harfbuzz-hb-ot-tag.html index e909d29..058623f 100644 --- a/docs/reference/html/harfbuzz-hb-ot-tag.html +++ b/docs/reference/html/harfbuzz-hb-ot-tag.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-set.html b/docs/reference/html/harfbuzz-hb-set.html index 3663879..87ce9bf 100644 --- a/docs/reference/html/harfbuzz-hb-set.html +++ b/docs/reference/html/harfbuzz-hb-set.html @@ -292,7 +292,7 @@ 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"> diff --git a/docs/reference/html/harfbuzz-hb-shape-plan.html b/docs/reference/html/harfbuzz-hb-shape-plan.html index 0fd311f..d612552 100644 --- a/docs/reference/html/harfbuzz-hb-shape-plan.html +++ b/docs/reference/html/harfbuzz-hb-shape-plan.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-shape.html b/docs/reference/html/harfbuzz-hb-shape.html index 288025d..c055347 100644 --- a/docs/reference/html/harfbuzz-hb-shape.html +++ b/docs/reference/html/harfbuzz-hb-shape.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-unicode.html b/docs/reference/html/harfbuzz-hb-unicode.html index a5ee566..91358b2 100644 --- a/docs/reference/html/harfbuzz-hb-unicode.html +++ b/docs/reference/html/harfbuzz-hb-unicode.html @@ -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"> diff --git a/docs/reference/html/harfbuzz-hb-uniscribe.html b/docs/reference/html/harfbuzz-hb-uniscribe.html index eb90c9f..3b9645a 100644 --- a/docs/reference/html/harfbuzz-hb-uniscribe.html +++ b/docs/reference/html/harfbuzz-hb-uniscribe.html @@ -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> diff --git a/docs/reference/html/harfbuzz-hb-version.html b/docs/reference/html/harfbuzz-hb-version.html index a20d726..3438e91 100644 --- a/docs/reference/html/harfbuzz-hb-version.html +++ b/docs/reference/html/harfbuzz-hb-version.html @@ -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> diff --git a/docs/reference/html/harfbuzz.devhelp2 b/docs/reference/html/harfbuzz.devhelp2 index 4fdf9d4..10bb40c 100644 --- a/docs/reference/html/harfbuzz.devhelp2 +++ b/docs/reference/html/harfbuzz.devhelp2 @@ -156,7 +156,7 @@ <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"/> diff --git a/docs/reference/html/index.html b/docs/reference/html/index.html index d5cc2bb..772db71 100644 --- a/docs/reference/html/index.html +++ b/docs/reference/html/index.html @@ -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> diff --git a/docs/reference/html/index.sgml b/docs/reference/html/index.sgml index e9d29e0..7b469b5 100644 --- a/docs/reference/html/index.sgml +++ b/docs/reference/html/index.sgml @@ -485,10 +485,10 @@ <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"> diff --git a/docs/reference/version.xml b/docs/reference/version.xml index 8e99e29..f81283f 100644 --- a/docs/reference/version.xml +++ b/docs/reference/version.xml @@ -1 +1 @@ -0.9.35 +0.9.40 diff --git a/src/Makefile.am b/src/Makefile.am index ba07ac5..c99967f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/Makefile.in b/src/Makefile.in index 703d994..bd923e6 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -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) diff --git a/src/check-defs.sh b/src/check-defs.sh index 357347f..65a2467 100755 --- a/src/check-defs.sh +++ b/src/check-defs.sh @@ -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 diff --git a/src/check-libstdc++.sh b/src/check-libstdc++.sh index e7e0e29..27deb42 100755 --- a/src/check-libstdc++.sh +++ b/src/check-libstdc++.sh @@ -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" diff --git a/src/check-static-inits.sh b/src/check-static-inits.sh index 83d02c8..1446fa7 100755 --- a/src/check-static-inits.sh +++ b/src/check-static-inits.sh @@ -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 diff --git a/src/check-symbols.sh b/src/check-symbols.sh index e000b01..b2bf43f 100755 --- a/src/check-symbols.sh +++ b/src/check-symbols.sh @@ -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" diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py index 4fb76f4..f5716bd 100755 --- a/src/gen-indic-table.py +++ b/src/gen-indic-table.py @@ -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]]) diff --git a/src/hb-blob.cc b/src/hb-blob.cc index b82b4b2..8759a25 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -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 (); diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh index dead700..3f626bd 100644 --- a/src/hb-buffer-deserialize-json.hh +++ b/src/hb-buffer-deserialize-json.hh @@ -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; diff --git a/src/hb-buffer-deserialize-json.rl b/src/hb-buffer-deserialize-json.rl index 7351b2a..91b350f 100644 --- a/src/hb-buffer-deserialize-json.rl +++ b/src/hb-buffer-deserialize-json.rl @@ -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; diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh index a38efe3..7a46ab2 100644 --- a/src/hb-buffer-deserialize-text.hh +++ b/src/hb-buffer-deserialize-text.hh @@ -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; diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 74ae273..b9fe263 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -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); } diff --git a/src/hb-buffer.h b/src/hb-buffer.h index 7b0c920..e5b46d8 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -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, diff --git a/src/hb-common.cc b/src/hb-common.cc index a6a5144..05a1f9c 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -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; diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 9097cce..4a45175 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -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, ¬def, 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 diff --git a/src/hb-face-private.hh b/src/hb-face-private.hh index 6520d3d..c4266ff 100644 --- a/src/hb-face-private.hh +++ b/src/hb-face-private.hh @@ -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); diff --git a/src/hb-ft.cc b/src/hb-ft.cc index 16bf51f..322f93a 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -51,6 +51,13 @@ * 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; diff --git a/src/hb-ft.h b/src/hb-ft.h index 696251e..92f4b36 100644 --- a/src/hb-ft.h +++ b/src/hb-ft.h @@ -34,19 +34,76 @@ 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. */ diff --git a/src/hb-glib.cc b/src/hb-glib.cc index af43cab..61dff5e 100644 --- a/src/hb-glib.cc +++ b/src/hb-glib.cc @@ -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); +} diff --git a/src/hb-glib.h b/src/hb-glib.h index 63a9d33..1a8f42e 100644 --- a/src/hb-glib.h +++ b/src/hb-glib.h @@ -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 diff --git a/src/hb-icu.cc b/src/hb-icu.cc index 86c8b5c..24cec9d 100644 --- a/src/hb-icu.cc +++ b/src/hb-icu.cc @@ -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); } - - diff --git a/src/hb-mutex-private.hh b/src/hb-mutex-private.hh index 6281201..a8ea39c 100644 --- a/src/hb-mutex-private.hh +++ b/src/hb-mutex-private.hh @@ -47,7 +47,11 @@ #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) diff --git a/src/hb-object-private.hh b/src/hb-object-private.hh index 8a9ae34..7bd0f16 100644 --- a/src/hb-object-private.hh +++ b/src/hb-object-private.hh @@ -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); } diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh index 57db59d..178bc7c 100644 --- a/src/hb-open-file-private.hh +++ b/src/hb-open-file-private.hh @@ -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) { diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 475187b..75a0f56 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -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); diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index d531411..0482312 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -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) && diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index c9890c5..2af2f54 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -35,17 +35,128 @@ #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; } diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh index ec4e8c9..268f133 100644 --- a/src/hb-ot-head-table.hh +++ b/src/hb-ot-head-table.hh @@ -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)); } diff --git a/src/hb-ot-hhea-table.hh b/src/hb-ot-hhea-table.hh index d433200..992fe55 100644 --- a/src/hb-ot-hhea-table.hh +++ b/src/hb-ot-hhea-table.hh @@ -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 */ diff --git a/src/hb-ot-hmtx-table.hh b/src/hb-ot-hmtx-table.hh index e918e3b..a0e3855 100644 --- a/src/hb-ot-hmtx-table.hh +++ b/src/hb-ot-hmtx-table.hh @@ -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 */ diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh index abd063c..3db7f57 100644 --- a/src/hb-ot-layout-common-private.hh +++ b/src/hb-ot-layout-common-private.hh @@ -37,6 +37,12 @@ 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 ())); } diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index 84a5e79..7a6c04d 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -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) && diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 8e2860c..d88f787 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -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; } diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 2b421a9..ebe4c9e 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -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; } diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 546ff4b..cbc6840 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -37,12 +37,6 @@ 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) && diff --git a/src/hb-ot-layout-jstf-table.hh b/src/hb-ot-layout-jstf-table.hh index 67a6df5..739dfd9 100644 --- a/src/hb-ot-layout-jstf-table.hh +++ b/src/hb-ot-layout-jstf-table.hh @@ -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)); diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh index ae7daa6..47fecd2 100644 --- a/src/hb-ot-layout-private.hh +++ b/src/hb-ot-layout-private.hh @@ -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; }; diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 661d90e..b1e69e8 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -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> diff --git a/src/hb-ot-maxp-table.hh b/src/hb-ot-maxp-table.hh index b1f8328..0d9a0fa 100644 --- a/src/hb-ot-maxp-table.hh +++ b/src/hb-ot-maxp-table.hh @@ -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))); diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh index 31d9fac..21450c6 100644 --- a/src/hb-ot-name-table.hh +++ b/src/hb-ot-name-table.hh @@ -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) && diff --git a/src/hb-ot-shape-complex-arabic-fallback.hh b/src/hb-ot-shape-complex-arabic-fallback.hh index e5b7ed4..a77f24e 100644 --- a/src/hb-ot-shape-complex-arabic-fallback.hh +++ b/src/hb-ot-shape-complex-arabic-fallback.hh @@ -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]); } diff --git a/src/hb-ot-shape-complex-arabic-win1256.hh b/src/hb-ot-shape-complex-arabic-win1256.hh index 63ed3f8..8edd3ba 100644 --- a/src/hb-ot-shape-complex-arabic-win1256.hh +++ b/src/hb-ot-shape-complex-arabic-win1256.hh @@ -133,7 +133,6 @@ */ #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 diff --git a/src/hb-ot-shape-complex-indic-machine.hh b/src/hb-ot-shape-complex-indic-machine.hh index 5fbdcc8..f652d4f 100644 --- a/src/hb-ot-shape-complex-indic-machine.hh +++ b/src/hb-ot-shape-complex-indic-machine.hh @@ -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. * @@ -32,1281 +32,1304 @@ #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" } diff --git a/src/hb-ot-shape-complex-indic-machine.rl b/src/hb-ot-shape-complex-indic-machine.rl index f6768a5..694b235 100644 --- a/src/hb-ot-shape-complex-indic-machine.rl +++ b/src/hb-ot-shape-complex-indic-machine.rl @@ -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; diff --git a/src/hb-ot-shape-complex-indic-table.cc b/src/hb-ot-shape-complex-indic-table.cc index f58380e..2e159a1 100644 --- a/src/hb-ot-shape-complex-indic-table.cc +++ b/src/hb-ot-shape-complex-indic-table.cc @@ -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: diff --git a/src/hb-ot-shape-complex-myanmar-machine.hh b/src/hb-ot-shape-complex-myanmar-machine.hh index bb80d7a..29fdf9a 100644 --- a/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/src/hb-ot-shape-complex-myanmar-machine.hh @@ -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" } diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh index 9a7afcb..e268933 100644 --- a/src/hb-ot-shape-complex-private.hh +++ b/src/hb-ot-shape-complex-private.hh @@ -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: diff --git a/src/hb-ot-shape-complex-sea-machine.hh b/src/hb-ot-shape-complex-sea-machine.hh index 86b7ae7..15b862f 100644 --- a/src/hb-ot-shape-complex-sea-machine.hh +++ b/src/hb-ot-shape-complex-sea-machine.hh @@ -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" } diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index 80d7da8..53274b5 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -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++; diff --git a/src/hb-ot-shape-normalize.cc b/src/hb-ot-shape-normalize.cc index 4287253..8cc64af 100644 --- a/src/hb-ot-shape-normalize.cc +++ b/src/hb-ot-shape-normalize.cc @@ -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. */ diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index a0b503a..07adb04 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -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) { diff --git a/src/hb-private.hh b/src/hb-private.hh index 80fd6c4..06b24a8 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -94,22 +94,6 @@ # 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) @@ -128,16 +112,26 @@ # 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)); diff --git a/src/hb-set-private.hh b/src/hb-set-private.hh index 705f554..acba4e9 100644 --- a/src/hb-set-private.hh +++ b/src/hb-set-private.hh @@ -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 */ diff --git a/src/hb-shape.cc b/src/hb-shape.cc index 74747f8..9a59c08 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -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: diff --git a/src/hb-shaper-private.hh b/src/hb-shaper-private.hh index 29c4493..d1d1146 100644 --- a/src/hb-shaper-private.hh +++ b/src/hb-shaper-private.hh @@ -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 \ diff --git a/src/hb-shaper.cc b/src/hb-shaper.cc index 6ae2601..580b95c 100644 --- a/src/hb-shaper.cc +++ b/src/hb-shaper.cc @@ -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) diff --git a/src/hb-unicode.cc b/src/hb-unicode.cc index d59dfb2..fc19006 100644 --- a/src/hb-unicode.cc +++ b/src/hb-unicode.cc @@ -157,7 +157,7 @@ hb_unicode_funcs_get_default (void) /** * hb_unicode_funcs_create: (Xconstructor) - * @parent: (allow-none): + * @parent: (nullable): * * * diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 74ae3a3..e7bcad2 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -43,6 +43,12 @@ #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, diff --git a/src/hb-utf-private.hh b/src/hb-utf-private.hh index 0b798a0..14d3c2e 100644 --- a/src/hb-utf-private.hh +++ b/src/hb-utf-private.hh @@ -29,14 +29,11 @@ #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 */ diff --git a/src/hb-version.h b/src/hb-version.h index e1a5f61..648a46f 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -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) <= \ diff --git a/test/api/test-blob.c b/test/api/test-blob.c index bbb7e2e..f671331 100644 --- a/test/api/test-blob.c +++ b/test/api/test-blob.c @@ -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 ()); diff --git a/test/shaping/Makefile.am b/test/shaping/Makefile.am index e2dcc98..70bcdd5 100644 --- a/test/shaping/Makefile.am +++ b/test/shaping/Makefile.am @@ -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 \ diff --git a/test/shaping/Makefile.in b/test/shaping/Makefile.in index e5f1224..8e726ff 100644 --- a/test/shaping/Makefile.in +++ b/test/shaping/Makefile.in @@ -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 Binary files differnew file mode 100644 index 0000000..8fb2f16 --- /dev/null +++ b/test/shaping/fonts/sha1sum/5028afb650b1bb718ed2131e872fbcce57828fff.ttf diff --git a/test/shaping/fonts/sha1sum/MANIFEST b/test/shaping/fonts/sha1sum/MANIFEST index c51639b..924732d 100644 --- a/test/shaping/fonts/sha1sum/MANIFEST +++ b/test/shaping/fonts/sha1sum/MANIFEST @@ -2,6 +2,7 @@ 270b89df543a7e48e206a2d830c0e10e5265c630.ttf 37033cc5cf37bb223d7355153016b6ccece93b28.ttf 4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf +5028afb650b1bb718ed2131e872fbcce57828fff.ttf 57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf 757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf 7e14e7883ed152baa158b80e207b66114c823a8b.ttf diff --git a/test/shaping/hb_test_tools.py b/test/shaping/hb_test_tools.py index 7674fdf..a370e5e 100644 --- a/test/shaping/hb_test_tools.py +++ b/test/shaping/hb_test_tools.py @@ -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): diff --git a/test/shaping/tests/arabic-fallback-shaping.tests b/test/shaping/tests/arabic-fallback-shaping.tests index 0240448..e3eaf3f 100644 --- a/test/shaping/tests/arabic-fallback-shaping.tests +++ b/test/shaping/tests/arabic-fallback-shaping.tests @@ -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] diff --git a/test/shaping/tests/hangul-jamo.tests b/test/shaping/tests/hangul-jamo.tests index 7c1ef6b..667a1cc 100644 --- a/test/shaping/tests/hangul-jamo.tests +++ b/test/shaping/tests/hangul-jamo.tests @@ -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 index 0000000..351e927 --- /dev/null +++ b/test/shaping/tests/indic-joiner-candrabindu.tests @@ -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] diff --git a/util/Makefile.am b/util/Makefile.am index 266681c..3f23bab 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -6,6 +6,10 @@ CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = +# Convenience targets: +lib: + @$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src lib + bin_PROGRAMS = AM_CPPFLAGS = \ diff --git a/util/Makefile.in b/util/Makefile.in index 4bc79ac..6fecdd0 100644 --- a/util/Makefile.in +++ b/util/Makefile.in @@ -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. diff --git a/util/hb-ot-shape-closure.cc b/util/hb-ot-shape-closure.cc index 03de7e6..859f9a6 100644 --- a/util/hb-ot-shape-closure.cc +++ b/util/hb-ot-shape-closure.cc @@ -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); } diff --git a/util/hb-shape.cc b/util/hb-shape.cc index 01081ea..f38f387 100644 --- a/util/hb-shape.cc +++ b/util/hb-shape.cc @@ -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); } diff --git a/util/hb-view.cc b/util/hb-view.cc index 26fad66..ef75e6d 100644 --- a/util/hb-view.cc +++ b/util/hb-view.cc @@ -29,9 +29,12 @@ #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); } diff --git a/util/helper-cairo-ansi.cc b/util/helper-cairo-ansi.cc index 376bf2b..50f9eb4 100644 --- a/util/helper-cairo-ansi.cc +++ b/util/helper-cairo-ansi.cc @@ -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++) diff --git a/util/helper-cairo.cc b/util/helper-cairo.cc index ee940ae..d576c3f 100644 --- a/util/helper-cairo.cc +++ b/util/helper-cairo.cc @@ -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])); diff --git a/util/helper-cairo.hh b/util/helper-cairo.hh index 567777e..ed55a45 100644 --- a/util/helper-cairo.hh +++ b/util/helper-cairo.hh @@ -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 diff --git a/util/main-font-text.hh b/util/main-font-text.hh index ac51b2d..628cdf9 100644 --- a/util/main-font-text.hh +++ b/util/main-font-text.hh @@ -31,12 +31,12 @@ /* 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) {} diff --git a/util/options.cc b/util/options.cc index 0adc179..7387a56 100644 --- a/util/options.cc +++ b/util/options.cc @@ -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; diff --git a/util/options.hh b/util/options.hh index 223778d..8b9b10e 100644 --- a/util/options.hh +++ b/util/options.hh @@ -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: diff --git a/util/view-cairo.cc b/util/view-cairo.cc index 666013e..160250e 100644 --- a/util/view-cairo.cc +++ b/util/view-cairo.cc @@ -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); diff --git a/util/view-cairo.hh b/util/view-cairo.hh index 9dea06e..cb52373 100644 --- a/util/view-cairo.hh +++ b/util/view-cairo.hh @@ -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 |