diff options
177 files changed, 23695 insertions, 6352 deletions
diff --git a/Build/source/libs/README b/Build/source/libs/README index ba78e3c5cdf..7f2de168f37 100644 --- a/Build/source/libs/README +++ b/Build/source/libs/README @@ -25,7 +25,7 @@ graphite2 1.3.13 - checked 21dec18 http://sourceforge.net/projects/silgraphite/files/graphite2/ (requires C++11) -harfbuzz 2.4.0 - checked 03may19 +harfbuzz 2.5.0 - checked 25may19 http://www.freedesktop.org/software/harfbuzz/release/ icu 63.1 - checked 8jan19 diff --git a/Build/source/libs/harfbuzz/ChangeLog b/Build/source/libs/harfbuzz/ChangeLog index d76d3e84aef..315d263dba0 100644 --- a/Build/source/libs/harfbuzz/ChangeLog +++ b/Build/source/libs/harfbuzz/ChangeLog @@ -1,3 +1,8 @@ +2019-05-25 Akira Kakuto <kakuto@w32tex.org> + + Import harfbuzz-2.5.0. + * version.ac, configure.ac, Makefile.am: Adjusted. + 2019-05-03 Akira Kakuto <kakuto@w32tex.org> Import harfbuzz-2.4.0. diff --git a/Build/source/libs/harfbuzz/Makefile.am b/Build/source/libs/harfbuzz/Makefile.am index 5009540af52..e28b73ac7ae 100644 --- a/Build/source/libs/harfbuzz/Makefile.am +++ b/Build/source/libs/harfbuzz/Makefile.am @@ -31,6 +31,7 @@ AM_CPPFLAGS = -DHB_NO_MT -DHB_NO_UNICODE_FUNCS -DHAVE_FALLBACK=1 \ -I$(top_srcdir)/$(HARFBUZZ_SRC) libharfbuzz_dependencies = libharfbuzz_a_SOURCES = \ + @HARFBUZZ_TREE@/src/hb-algs.hh \ @HARFBUZZ_TREE@/src/hb-atomic.hh \ @HARFBUZZ_TREE@/src/hb-blob.hh \ @HARFBUZZ_TREE@/src/hb-blob.cc \ @@ -44,8 +45,9 @@ libharfbuzz_a_SOURCES = \ @HARFBUZZ_TREE@/src/hb-cff1-interp-cs.hh \ @HARFBUZZ_TREE@/src/hb-cff2-interp-cs.hh \ @HARFBUZZ_TREE@/src/hb-common.cc \ + @HARFBUZZ_TREE@/src/hb-config.hh \ @HARFBUZZ_TREE@/src/hb-debug.hh \ - @HARFBUZZ_TREE@/src/hb-dsalgs.hh \ + @HARFBUZZ_TREE@/src/hb-dispatch.hh \ @HARFBUZZ_TREE@/src/hb-face.hh \ @HARFBUZZ_TREE@/src/hb-face.cc \ @HARFBUZZ_TREE@/src/hb-font.hh \ @@ -55,6 +57,7 @@ libharfbuzz_a_SOURCES = \ @HARFBUZZ_TREE@/src/hb-map.hh \ @HARFBUZZ_TREE@/src/hb-map.cc \ @HARFBUZZ_TREE@/src/hb-machinery.hh \ + @HARFBUZZ_TREE@/src/hb-meta.hh \ @HARFBUZZ_TREE@/src/hb-mutex.hh \ @HARFBUZZ_TREE@/src/hb-null.hh \ @HARFBUZZ_TREE@/src/hb-object.hh \ @@ -77,17 +80,20 @@ libharfbuzz_a_SOURCES = \ @HARFBUZZ_TREE@/src/hb-ot-hmtx-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-name-language-static.hh \ @HARFBUZZ_TREE@/src/hb-ot-name-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-stat-table.hh \ - @HARFBUZZ_TREE@/src/hb-ot-name-language.cc \ @HARFBUZZ_TREE@/src/hb-ot-name-language.hh \ @HARFBUZZ_TREE@/src/hb-ot-name.cc \ @HARFBUZZ_TREE@/src/hb-ot-os2-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-os2-unicode-ranges.hh \ + @HARFBUZZ_TREE@/src/hb-pool.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-macroman.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-tag.cc \ @HARFBUZZ_TREE@/src/hb-ot-tag-table.hh \ + @HARFBUZZ_TREE@/src/hb-sanitize.hh \ + @HARFBUZZ_TREE@/src/hb-serialize.hh \ @HARFBUZZ_TREE@/src/hb-set-digest.hh \ @HARFBUZZ_TREE@/src/hb-set.hh \ @HARFBUZZ_TREE@/src/hb-set.cc \ @@ -108,6 +114,8 @@ libharfbuzz_a_SOURCES = \ @HARFBUZZ_TREE@/src/hb-subset-cff2.hh \ @HARFBUZZ_TREE@/src/hb-subset-input.hh \ @HARFBUZZ_TREE@/src/hb-subset.hh \ + @HARFBUZZ_TREE@/src/hb-ucd-table.hh \ + @HARFBUZZ_TREE@/src/hb-ucd.cc \ @HARFBUZZ_TREE@/src/hb-unicode.hh \ @HARFBUZZ_TREE@/src/hb-unicode.cc \ @HARFBUZZ_TREE@/src/hb-unicode-emoji-table.hh \ diff --git a/Build/source/libs/harfbuzz/Makefile.in b/Build/source/libs/harfbuzz/Makefile.in index acd3995cd80..900050ef928 100644 --- a/Build/source/libs/harfbuzz/Makefile.in +++ b/Build/source/libs/harfbuzz/Makefile.in @@ -130,7 +130,6 @@ am_libharfbuzz_a_OBJECTS = @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-cff1-table.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-cff2-table.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-face.$(OBJEXT) \ - @HARFBUZZ_TREE@/src/hb-ot-name-language.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-name.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-tag.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-set.$(OBJEXT) \ @@ -141,6 +140,7 @@ am_libharfbuzz_a_OBJECTS = @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-subset-cff-common.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-subset-cff1.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-subset-cff2.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-ucd.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-unicode.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-warning.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-fallback-shape.$(OBJEXT) \ @@ -214,7 +214,6 @@ am__depfiles_remade = ./$(DEPDIR)/hbtest-dummy.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po \ - @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po \ @@ -241,6 +240,7 @@ am__depfiles_remade = ./$(DEPDIR)/hbtest-dummy.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff-common.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff1.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff2.Po \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ucd.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-unicode.Po \ @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-warning.Po am__mv = mv -f @@ -714,7 +714,8 @@ AM_CPPFLAGS = -DHB_NO_MT -DHB_NO_UNICODE_FUNCS -DHAVE_FALLBACK=1 \ -I$(top_srcdir)/$(HARFBUZZ_SRC) $(ICU_INCLUDES) \ $(GRAPHITE2_INCLUDES) libharfbuzz_dependencies = $(ICU_DEPEND) $(GRAPHITE2_DEPEND) -libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic.hh \ +libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-algs.hh \ + @HARFBUZZ_TREE@/src/hb-atomic.hh \ @HARFBUZZ_TREE@/src/hb-blob.hh @HARFBUZZ_TREE@/src/hb-blob.cc \ @HARFBUZZ_TREE@/src/hb-buffer.hh \ @HARFBUZZ_TREE@/src/hb-buffer-serialize.cc \ @@ -726,14 +727,16 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic.hh \ @HARFBUZZ_TREE@/src/hb-cff1-interp-cs.hh \ @HARFBUZZ_TREE@/src/hb-cff2-interp-cs.hh \ @HARFBUZZ_TREE@/src/hb-common.cc \ + @HARFBUZZ_TREE@/src/hb-config.hh \ @HARFBUZZ_TREE@/src/hb-debug.hh \ - @HARFBUZZ_TREE@/src/hb-dsalgs.hh \ + @HARFBUZZ_TREE@/src/hb-dispatch.hh \ @HARFBUZZ_TREE@/src/hb-face.hh @HARFBUZZ_TREE@/src/hb-face.cc \ @HARFBUZZ_TREE@/src/hb-font.hh @HARFBUZZ_TREE@/src/hb-font.cc \ @HARFBUZZ_TREE@/src/hb-iter.hh @HARFBUZZ_TREE@/src/hb-kern.hh \ @HARFBUZZ_TREE@/src/hb-map.hh @HARFBUZZ_TREE@/src/hb-map.cc \ @HARFBUZZ_TREE@/src/hb-machinery.hh \ - @HARFBUZZ_TREE@/src/hb-mutex.hh @HARFBUZZ_TREE@/src/hb-null.hh \ + @HARFBUZZ_TREE@/src/hb-meta.hh @HARFBUZZ_TREE@/src/hb-mutex.hh \ + @HARFBUZZ_TREE@/src/hb-null.hh \ @HARFBUZZ_TREE@/src/hb-object.hh \ @HARFBUZZ_TREE@/src/hb-open-file.hh \ @HARFBUZZ_TREE@/src/hb-open-type.hh \ @@ -754,17 +757,20 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic.hh \ @HARFBUZZ_TREE@/src/hb-ot-hmtx-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-name-language-static.hh \ @HARFBUZZ_TREE@/src/hb-ot-name-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-stat-table.hh \ - @HARFBUZZ_TREE@/src/hb-ot-name-language.cc \ @HARFBUZZ_TREE@/src/hb-ot-name-language.hh \ @HARFBUZZ_TREE@/src/hb-ot-name.cc \ @HARFBUZZ_TREE@/src/hb-ot-os2-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-os2-unicode-ranges.hh \ + @HARFBUZZ_TREE@/src/hb-pool.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-macroman.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-tag.cc \ @HARFBUZZ_TREE@/src/hb-ot-tag-table.hh \ + @HARFBUZZ_TREE@/src/hb-sanitize.hh \ + @HARFBUZZ_TREE@/src/hb-serialize.hh \ @HARFBUZZ_TREE@/src/hb-set-digest.hh \ @HARFBUZZ_TREE@/src/hb-set.hh @HARFBUZZ_TREE@/src/hb-set.cc \ @HARFBUZZ_TREE@/src/hb-shape.cc \ @@ -784,6 +790,8 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic.hh \ @HARFBUZZ_TREE@/src/hb-subset-cff2.hh \ @HARFBUZZ_TREE@/src/hb-subset-input.hh \ @HARFBUZZ_TREE@/src/hb-subset.hh \ + @HARFBUZZ_TREE@/src/hb-ucd-table.hh \ + @HARFBUZZ_TREE@/src/hb-ucd.cc \ @HARFBUZZ_TREE@/src/hb-unicode.hh \ @HARFBUZZ_TREE@/src/hb-unicode.cc \ @HARFBUZZ_TREE@/src/hb-unicode-emoji-table.hh \ @@ -983,9 +991,6 @@ clean-noinstLIBRARIES: @HARFBUZZ_TREE@/src/hb-ot-face.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) -@HARFBUZZ_TREE@/src/hb-ot-name-language.$(OBJEXT): \ - @HARFBUZZ_TREE@/src/$(am__dirstamp) \ - @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @HARFBUZZ_TREE@/src/hb-ot-name.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @@ -1016,6 +1021,9 @@ clean-noinstLIBRARIES: @HARFBUZZ_TREE@/src/hb-subset-cff2.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/hb-ucd.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @HARFBUZZ_TREE@/src/hb-unicode.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @@ -1139,7 +1147,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po@am__quote@ # am--include-marker @@ -1166,6 +1173,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff-common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff2.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ucd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-unicode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-warning.Po@am__quote@ # am--include-marker @@ -1781,7 +1789,6 @@ distclean: distclean-recursive -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po - -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po @@ -1808,6 +1815,7 @@ distclean: distclean-recursive -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff-common.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff1.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff2.Po + -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ucd.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-unicode.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-warning.Po -rm -f Makefile @@ -1879,7 +1887,6 @@ maintainer-clean: maintainer-clean-recursive -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po - -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po @@ -1906,6 +1913,7 @@ maintainer-clean: maintainer-clean-recursive -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff-common.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff1.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-cff2.Po + -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ucd.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-unicode.Po -rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-warning.Po -rm -f Makefile diff --git a/Build/source/libs/harfbuzz/TLpatches/ChangeLog b/Build/source/libs/harfbuzz/TLpatches/ChangeLog index ad95b735643..ff7a392febb 100644 --- a/Build/source/libs/harfbuzz/TLpatches/ChangeLog +++ b/Build/source/libs/harfbuzz/TLpatches/ChangeLog @@ -1,3 +1,8 @@ +2019-05-25 Akira Kakuto <kakuto@w32tex.org> + + Imported harfbuzz-2.5.0 source tree from: + http://www.freedesktop.org/software/harfbuzz/release/ + 2019-05-03 Akira Kakuto <kakuto@w32tex.org> Imported harfbuzz-2.4.0 source tree from: diff --git a/Build/source/libs/harfbuzz/TLpatches/TL-Changes b/Build/source/libs/harfbuzz/TLpatches/TL-Changes index bdca8db77d7..429e2373692 100644 --- a/Build/source/libs/harfbuzz/TLpatches/TL-Changes +++ b/Build/source/libs/harfbuzz/TLpatches/TL-Changes @@ -1,4 +1,4 @@ -Changes applied to the harfbuzz-2.4.0/ tree as obtained from: +Changes applied to the harfbuzz-2.5.0/ tree as obtained from: http://www.freedesktop.org/software/harfbuzz/release/ Removed: @@ -24,4 +24,3 @@ Removed unused dirs: m4 test util - src/hb-ucdn diff --git a/Build/source/libs/harfbuzz/config.h.in b/Build/source/libs/harfbuzz/config.h.in index a5ee4ba9b1c..4f06c459ed1 100644 --- a/Build/source/libs/harfbuzz/config.h.in +++ b/Build/source/libs/harfbuzz/config.h.in @@ -106,9 +106,6 @@ /* Define to 1 if you have the <sys/types.h> header file. */ #undef HAVE_SYS_TYPES_H -/* Use UCDN Unicode functions */ -#undef HAVE_UCDN - /* Use Uniscribe backend */ #undef HAVE_UNISCRIBE diff --git a/Build/source/libs/harfbuzz/configure b/Build/source/libs/harfbuzz/configure index f4e42f0a06d..b7428439795 100755 --- a/Build/source/libs/harfbuzz/configure +++ b/Build/source/libs/harfbuzz/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 2.4.0. +# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 2.5.0. # # Report bugs to <tex-k@tug.org>. # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='harfbuzz (TeX Live)' PACKAGE_TARNAME='harfbuzz--tex-live-' -PACKAGE_VERSION='2.4.0' -PACKAGE_STRING='harfbuzz (TeX Live) 2.4.0' +PACKAGE_VERSION='2.5.0' +PACKAGE_STRING='harfbuzz (TeX Live) 2.5.0' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' @@ -1317,7 +1317,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 (TeX Live) 2.4.0 to adapt to many kinds of systems. +\`configure' configures harfbuzz (TeX Live) 2.5.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1388,7 +1388,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of harfbuzz (TeX Live) 2.4.0:";; + short | recursive ) echo "Configuration of harfbuzz (TeX Live) 2.5.0:";; esac cat <<\_ACEOF @@ -1495,7 +1495,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -harfbuzz (TeX Live) configure 2.4.0 +harfbuzz (TeX Live) configure 2.5.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2131,7 +2131,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 (TeX Live) $as_me 2.4.0, which was +It was created by harfbuzz (TeX Live) $as_me 2.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -4055,7 +4055,7 @@ fi # Define the identity of the package. PACKAGE='harfbuzz--tex-live-' - VERSION='2.4.0' + VERSION='2.5.0' # Some tools Automake needs. @@ -4248,9 +4248,9 @@ WARNING_CFLAGS=$kpse_cv_warning_cflags HB_VERSION_MAJOR=2 -HB_VERSION_MINOR=4 +HB_VERSION_MINOR=5 HB_VERSION_MICRO=0 -HB_VERSION=2.4.0 +HB_VERSION=2.5.0 ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -7567,9 +7567,6 @@ else $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h -$as_echo "#define HAVE_UCDN 1" >>confdefs.h - - $as_echo "#define HAVE_GLIB 1" >>confdefs.h @@ -8155,7 +8152,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 (TeX Live) $as_me 2.4.0, which was +This file was extended by harfbuzz (TeX Live) $as_me 2.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -8221,7 +8218,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 (TeX Live) config.status 2.4.0 +harfbuzz (TeX Live) config.status 2.5.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/Build/source/libs/harfbuzz/configure.ac b/Build/source/libs/harfbuzz/configure.ac index 3ec6766731b..936bbebf319 100644 --- a/Build/source/libs/harfbuzz/configure.ac +++ b/Build/source/libs/harfbuzz/configure.ac @@ -90,7 +90,6 @@ if :; then else dnl add all these to config.h.in but do not define them in config.h AC_DEFINE([HAVE_PTHREAD], 1, [Use POSIX threads]) - AC_DEFINE([HAVE_UCDN], 1, [Use UCDN Unicode functions]) AC_DEFINE([HAVE_GLIB], 1, [Use glib2 library]) AC_DEFINE([HAVE_GTHREAD], 1, [Use gthread2 library]) AC_DEFINE([HAVE_GOBJECT], 1, [Use gobject2 library]) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/AUTHORS b/Build/source/libs/harfbuzz/harfbuzz-src/AUTHORS index 0763761bbf8..83c0c66f99e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/AUTHORS +++ b/Build/source/libs/harfbuzz/harfbuzz-src/AUTHORS @@ -1,11 +1,14 @@ Behdad Esfahbod +David Corbett David Turner Ebrahim Byagowi +Garret Rieger Jonathan Kew Khaled Hosny Lars Knoll Martin Hosken Owen Taylor +Roderick Sheeter Roozbeh Pournader Simon Hausmann Werner Lemberg diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt index f64f96d1cae..4ffabad1063 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt +++ b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt @@ -35,7 +35,6 @@ endif () ## HarfBuzz build configurations option(HB_HAVE_FREETYPE "Enable freetype interop helpers" OFF) option(HB_HAVE_GRAPHITE2 "Enable Graphite2 complementary shaper" OFF) -option(HB_BUILTIN_UCDN "Use HarfBuzz provided UCDN" ON) option(HB_HAVE_GLIB "Enable glib unicode functions" OFF) option(HB_HAVE_ICU "Enable icu unicode functions" OFF) if (APPLE) @@ -70,7 +69,6 @@ option(HB_CHECK OFF "Do a configuration suitable for testing (shared library and if (HB_CHECK) set (BUILD_SHARED_LIBS ON) set (HB_BUILD_UTILS ON) - set (HB_BUILTIN_UCDN ON) set (HB_HAVE_ICU) set (HB_HAVE_GLIB ON) #set (HB_HAVE_GOBJECT ON) @@ -160,7 +158,6 @@ endfunction () file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES) file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES) -file(READ ${PROJECT_SOURCE_DIR}/src/hb-ucdn/Makefile.sources UCDNSOURCES) extract_make_variable(HB_BASE_sources ${SRCSOURCES}) add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/") @@ -191,9 +188,6 @@ add_prefix_to_list(HB_SUBSET_CLI_sources "${PROJECT_SOURCE_DIR}/util/") extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES}) add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/") -extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES}) -add_prefix_to_list(LIBHB_UCDN_sources "${PROJECT_SOURCE_DIR}/src/hb-ucdn/") - file(READ configure.ac CONFIGUREAC) string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC}) @@ -295,14 +289,6 @@ if (HB_HAVE_GRAPHITE2) mark_as_advanced(GRAPHITE2_INCLUDE_DIR GRAPHITE2_LIBRARY) endif () -if (HB_BUILTIN_UCDN) - include_directories(src/hb-ucdn) - add_definitions(-DHAVE_UCDN) - - list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ucdn.cc) - list(APPEND project_extra_sources ${LIBHB_UCDN_sources}) -endif () - if (HB_HAVE_GLIB) add_definitions(-DHAVE_GLIB) @@ -844,7 +830,7 @@ endif () if (HB_BUILD_TESTS) ## src/ executables - foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges) + foreach (prog main test test-gsub-would-substitute test-gpos-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges) set (prog_name ${prog}) if (${prog_name} STREQUAL "test") # test can not be used as a valid executable name on cmake, lets special case it diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog index 1ee02ddf736..384e51a917e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog +++ b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog @@ -1,3 +1,7067 @@ +commit 5fd3ece5237ac6a4ee95b2665b5e20102ed176bb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 24 15:56:15 2019 -0400 + + 2.5.0 + + Makefile.am | 2 +- + NEWS | 14 ++++++++++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 4 files changed, 18 insertions(+), 4 deletions(-) + +commit 1da089179b9bd06f071f967d128819e85998b809 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 24 15:41:34 2019 -0400 + + Put back Since: tags for hb_color_get_* + + src/hb-common.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit e1a5ce6aa661251e998df7b3612a1d5d39e28827 +Author: Qunxin Liu <qxliu@google.com> +Date: Fri May 24 10:58:52 2019 -0700 + + Fix fuzzer crash testcase + + Add a check for stringOffSet(uint16) overflow, + return early if overflow happens + + src/hb-ot-name-table.hh | 2 +- + ...estcase-minimized-hb-subset-fuzzer-5077547978588160 | Bin 0 -> 339602 bytes + ...estcase-minimized-hb-subset-fuzzer-5761434614497280 | Bin 0 -> 532 bytes + 3 files changed, 1 insertion(+), 1 deletion(-) + +commit d100ccad02b038719472b2cc733940ffb0374cd1 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Sun May 19 10:01:20 2019 -0400 + + [use] Allow multiple FMs in a cluster + + src/gen-use-table.py | 12 +- + src/hb-ot-shape-complex-use-machine.hh | 567 ++++++++++++++++----------------- + src/hb-ot-shape-complex-use-machine.rl | 14 +- + src/hb-ot-shape-complex-use-table.cc | 38 ++- + src/hb-ot-shape-complex-use.hh | 11 +- + 5 files changed, 315 insertions(+), 327 deletions(-) + +commit 487879e013758aef2c7f824033a40cd56361d240 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 24 12:37:53 2019 -0400 + + Don't compile in UCD if HB_NO_UCD defined + + src/hb-ucd.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 1fffe51a295b6106a442bed8107d305c325bef05 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 24 10:52:09 2019 -0400 + + [blob] Shuffle + + src/hb-blob.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 96de94768b08287325be8947255917502368c337 +Merge: c96c6b28 1197bef2 +Author: rsheeter <rsheeter@google.com> +Date: Fri May 24 11:22:41 2019 -0700 + + Merge pull request #1722 from googlefonts/glyf + + [subset] Use iterators in glyf/loca subsetting + +commit 1197bef26c63ee896bea3fab5788635cb0fc9d18 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri May 24 10:52:49 2019 -0700 + + [subset] Per code review, use hb_array to avoid duplicated type name + + src/hb-ot-glyf-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e66253283385aa67eb9c5ab627139a56f9ae5a71 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri May 24 10:39:56 2019 -0700 + + [subset] Cppcheck complaints + + test/api/hb-test.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 13b3cd307e7dedea3b419fb06d81a008e49ccff6 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri May 24 10:10:12 2019 -0700 + + [subset] Address @behdad review feedback + + src/hb-ot-glyf-table.hh | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit c96c6b287ff1d96da6a50a8cb3f641fe8705e5f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 23 21:37:17 2019 -0400 + + One more + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b567d4ea14cc6ec0e8efc64a4993a9b0461adb20 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 23 21:36:42 2019 -0400 + + Fix build after UCDN -> UCD + + CMakeLists.txt | 14 -------------- + configure.ac | 18 +----------------- + docs/usermanual-install-harfbuzz.xml | 34 ++++++++-------------------------- + 3 files changed, 9 insertions(+), 57 deletions(-) + +commit 226ab06ec110f4cbd56b39ce0d05d349dfec35b9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 23 20:39:04 2019 -0400 + + [ucd] Add URL to dependencies + + src/gen-ucd-table.py | 3 +++ + 1 file changed, 3 insertions(+) + +commit 65392b734e38668b870b1ffcbfb4b42ec289ef58 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 22 16:21:21 2019 -0400 + + [ucdn] Replace UCDN with a new UCD implementation + + UCDN was ~120kb of data. New implementatoin is 69kb in default builds, + and 49kb if built with HB_OPTIMIZE_SIZE or __OPTIMIZE_SIZE__. The + latter automatically enabled if built with -Os or -Oz. + + There's room to shave off another 10kb or 20kb. That will follow later. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/Makefile.am | 11 - + src/Makefile.sources | 5 +- + src/gen-ucd-table.py | 11 +- + src/hb-algs.hh | 8 + + src/hb-ot-layout.cc | 76 +- + src/hb-ucd-table.hh | 5160 +++++++++++++++++++++++++++++++++++++ + src/hb-ucd.cc | 209 ++ + src/hb-ucdn.cc | 272 -- + src/hb-ucdn/COPYING | 13 - + src/hb-ucdn/Makefile.am | 16 - + src/hb-ucdn/Makefile.sources | 7 - + src/hb-ucdn/README | 40 - + src/hb-ucdn/ucdn.c | 361 --- + src/hb-ucdn/ucdn.h | 472 ---- + src/hb-ucdn/ucdn_db.h | 5790 ------------------------------------------ + src/hb-unicode.cc | 8 +- + 16 files changed, 5427 insertions(+), 7032 deletions(-) + +commit 12c59f6c40401c8221facc5d0aed63f510a77dd7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 23 13:33:21 2019 -0400 + + [deprecated] Minor + + src/hb-deprecated.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 36dee9221f8de3a2a6a23f0548460aab4982b594 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 22 15:51:53 2019 -0400 + + [gen-ucd] Rename + + src/Makefile.am | 1 + + src/{gen-ucd.py => gen-ucd-table.py} | 0 + 2 files changed, 1 insertion(+) + +commit 831c213501fc38229755be7958b2952fe0cdff0e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 22 15:46:19 2019 -0400 + + [gen-ucd] Minor + + src/gen-ucd.py | 30 +++++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +commit 15a9e32b566fbf6f4a2c6fd488d8cc3865234b17 +Merge: 993d81b9 ff7fc6d4 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu May 23 11:02:15 2019 +0430 + + Merge pull request #1723 from googlefonts/drop_tables + + [subset] Add morx, mort, kern, and kernx to the default layout tables… + +commit ff7fc6d488f37e3faaca4986cde35836f013b03f +Author: Garret Rieger <grieger@google.com> +Date: Wed May 22 17:36:16 2019 -0700 + + [subset] Add morx, mort, kern, and kernx to the default layout tables drop list. + + src/hb-subset-input.cc | 4 ++++ + src/hb-subset.cc | 4 ++++ + 2 files changed, 8 insertions(+) + +commit 993d81b9c57f2e27d80d276953b0430821129425 +Author: Qunxin Liu <qxliu@google.com> +Date: Tue May 14 13:55:11 2019 -0700 + + [subset] Add one ttf file with fvar/STAT tables to integration test + Ignore gvar/MVAR/HVAR table + add support for --nameIDs=* option + + src/hb-ot-cmap-table.hh | 27 +++++++++++++++++---- + src/hb-ot-stat-table.hh | 2 +- + src/hb-subset-input.cc | 1 + + src/hb-subset-plan.cc | 6 +---- + test/api/hb-subset-test.h | 2 +- + .../Comfortaa-Regular-new.default.61,62,63.ttf | Bin 0 -> 6492 bytes + .../basics/Comfortaa-Regular-new.default.61,63.ttf | Bin 0 -> 6316 bytes + .../basics/Comfortaa-Regular-new.default.61.ttf | Bin 0 -> 6148 bytes + .../basics/Comfortaa-Regular-new.default.62.ttf | Bin 0 -> 6088 bytes + .../basics/Comfortaa-Regular-new.default.63.ttf | Bin 0 -> 6068 bytes + ...Regular-new.drop-hints-retain-gids.61,62,63.ttf | Bin 0 -> 3284 bytes + ...aa-Regular-new.drop-hints-retain-gids.61,63.ttf | Bin 0 -> 3164 bytes + ...ortaa-Regular-new.drop-hints-retain-gids.61.ttf | Bin 0 -> 2868 bytes + ...ortaa-Regular-new.drop-hints-retain-gids.62.ttf | Bin 0 -> 3020 bytes + ...ortaa-Regular-new.drop-hints-retain-gids.63.ttf | Bin 0 -> 3024 bytes + .../Comfortaa-Regular-new.drop-hints.61,62,63.ttf | Bin 0 -> 1952 bytes + .../Comfortaa-Regular-new.drop-hints.61,63.ttf | Bin 0 -> 1832 bytes + .../basics/Comfortaa-Regular-new.drop-hints.61.ttf | Bin 0 -> 1704 bytes + .../basics/Comfortaa-Regular-new.drop-hints.62.ttf | Bin 0 -> 1688 bytes + .../basics/Comfortaa-Regular-new.drop-hints.63.ttf | Bin 0 -> 1688 bytes + .../Comfortaa-Regular-new.name-ids.61,62,63.ttf | Bin 0 -> 6236 bytes + .../Comfortaa-Regular-new.name-ids.61,63.ttf | Bin 0 -> 6060 bytes + .../basics/Comfortaa-Regular-new.name-ids.61.ttf | Bin 0 -> 5892 bytes + .../basics/Comfortaa-Regular-new.name-ids.62.ttf | Bin 0 -> 5832 bytes + .../basics/Comfortaa-Regular-new.name-ids.63.ttf | Bin 0 -> 5812 bytes + .../Comfortaa-Regular-new.retain-gids.61,62,63.ttf | Bin 0 -> 7824 bytes + .../Comfortaa-Regular-new.retain-gids.61,63.ttf | Bin 0 -> 7648 bytes + .../Comfortaa-Regular-new.retain-gids.61.ttf | Bin 0 -> 7312 bytes + .../Comfortaa-Regular-new.retain-gids.62.ttf | Bin 0 -> 7420 bytes + .../Comfortaa-Regular-new.retain-gids.63.ttf | Bin 0 -> 7404 bytes + ...eSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 3784 -> 2384 bytes + .../SourceSansPro-Regular.default.61,62,63.otf | Bin 3496 -> 2096 bytes + ...ourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 3612 -> 2212 bytes + ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33516 -> 32124 bytes + ...Regular.desubroutinize-retain-gids.61,62,63.otf | Bin 31080 -> 29688 bytes + ...r.desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34708 -> 33316 bytes + ...o-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 3640 -> 2240 bytes + ...urceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 3400 -> 2000 bytes + ...nsPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3596 -> 2196 bytes + ...subroutinize-retain-gids.1FC,21,41,20,62,63.otf | Bin 33352 -> 31960 bytes + ...p-hints-desubroutinize-retain-gids.61,62,63.otf | Bin 30956 -> 29564 bytes + ...s-desubroutinize-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34560 -> 33168 bytes + ...rop-hints-desubroutinize.1FC,21,41,20,62,63.otf | Bin 3480 -> 2080 bytes + ...-Regular.drop-hints-desubroutinize.61,62,63.otf | Bin 3288 -> 1876 bytes + ...ar.drop-hints-desubroutinize.D7,D8,D9,DA,DE.otf | Bin 3448 -> 2048 bytes + ...r.drop-hints-retain-gids.1FC,21,41,20,62,63.otf | Bin 33448 -> 32052 bytes + ...Pro-Regular.drop-hints-retain-gids.61,62,63.otf | Bin 31028 -> 29632 bytes + ...gular.drop-hints-retain-gids.D7,D8,D9,DA,DE.otf | Bin 34576 -> 33180 bytes + ...nsPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3564 -> 2164 bytes + .../SourceSansPro-Regular.drop-hints.61,62,63.otf | Bin 3340 -> 1940 bytes + ...ceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 3464 -> 2064 bytes + ...sPro-Regular.retain-gids.1FC,21,41,20,62,63.otf | Bin 33668 -> 32276 bytes + .../SourceSansPro-Regular.retain-gids.61,62,63.otf | Bin 31180 -> 29788 bytes + ...eSansPro-Regular.retain-gids.D7,D8,D9,DA,DE.otf | Bin 34724 -> 33332 bytes + .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf | Bin 3772 -> 3164 bytes + .../full-font/Roboto-Regular.default.61,62,63.ttf | Bin 3368 -> 2760 bytes + .../Roboto-Regular.default.D7,D8,D9,DA,DE.ttf | Bin 3732 -> 3124 bytes + ...oboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 2224 -> 1616 bytes + .../Roboto-Regular.drop-hints.61,62,63.ttf | Bin 2016 -> 1408 bytes + .../Roboto-Regular.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 2252 -> 1644 bytes + ...gular.default.3042,3044,3046,3048,304A,304B.ttf | Bin 3112 -> 2684 bytes + ...gular.default.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 3356 -> 2928 bytes + .../Mplus1p-Regular.default.61,63,65,6B.ttf | Bin 2656 -> 2228 bytes + ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3652 -> 3224 bytes + .../japanese/Mplus1p-Regular.default.660E.ttf | Bin 2396 -> 1968 bytes + ...ar.drop-hints.3042,3044,3046,3048,304A,304B.ttf | Bin 2384 -> 1956 bytes + ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.ttf | Bin 2628 -> 2200 bytes + .../Mplus1p-Regular.drop-hints.61,63,65,6B.ttf | Bin 1928 -> 1500 bytes + ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 2924 -> 2496 bytes + .../japanese/Mplus1p-Regular.drop-hints.660E.ttf | Bin 1668 -> 1240 bytes + test/subset/data/fonts/Comfortaa-Regular-new.ttf | Bin 0 -> 230316 bytes + test/subset/data/tests/basics.tests | 1 + + test/subset/generate-expected-outputs.py | 3 +-- + test/subset/run-tests.py | 3 ++- + util/options-subset.cc | 23 +++++++++++++++--- + 75 files changed, 50 insertions(+), 18 deletions(-) + +commit 58ce477ac170969430310750b78dcb5f9e3b06a3 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue May 21 20:22:40 2019 -0700 + + [subset] Report failure more often + + src/hb-ot-glyf-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 51a0129f7322e97825455df4eb6eecfea14980f5 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue May 21 20:12:19 2019 -0700 + + [subset] Thar be comparison of integers of different signs + + test/api/hb-test.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14e3b0cf41d9657c39f1f921f7e09a1418fa3278 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue May 21 20:09:36 2019 -0700 + + [subset] Code review feedback + + src/hb-ot-glyf-table.hh | 53 +++++++++++++++++++++++++------------------------ + 1 file changed, 27 insertions(+), 26 deletions(-) + +commit a03ed95e7d50b9dd947e8982c7730de969795b05 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 21 16:43:14 2019 -0400 + + [gen-ucd] Generate decomposition tables + + Code is ugly. Ugh. + + src/gen-ucd.py | 40 ++++++++++++++++++++-------------------- + 1 file changed, 20 insertions(+), 20 deletions(-) + +commit 8a48c88fa9fe047a83ba4a45dbd6399412ca3302 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 21 13:02:54 2019 -0400 + + [gen-ucd] Comment + + src/gen-ucd.py | 4 ++++ + 1 file changed, 4 insertions(+) + +commit b71d353cee89a6654810f75e7a1d7fd156b76faa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 17:33:55 2019 -0400 + + [gen-ucd] Remove some code + + src/gen-ucd.py | 7 ------- + 1 file changed, 7 deletions(-) + +commit 4ea44112b5163591ce0b086e0d13ec368f4f6ddc +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue May 21 13:07:43 2019 -0700 + + [subset] Remove missed reference to hb-subset-glyf, was deleted + + src/Makefile.sources | 1 - + 1 file changed, 1 deletion(-) + +commit b928de91a755788fd0fad9fa0f5f03c5670ac6a3 +Author: Garret Rieger <grieger@google.com> +Date: Tue May 21 11:23:26 2019 -0700 + + [subset] Add test/subset/data/expected/layout to dist list. + + test/subset/data/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 0af9de13b78ddd35f58ee02ce8ffeffd99509ec5 +Author: Garret Rieger <grieger@google.com> +Date: Mon May 20 15:04:20 2019 -0700 + + [subset] For gsub subsetting only consider glyphs reachable via gsub closure. + + src/hb-ot-layout-gsub-table.hh | 4 +-- + src/hb-subset-plan.cc | 55 ++++++++++++++++++++---------------------- + src/hb-subset-plan.hh | 10 ++++++++ + 3 files changed, 38 insertions(+), 31 deletions(-) + +commit c740c8636b48b1790bba42445a301e8e1cf8f749 +Author: Garret Rieger <grieger@google.com> +Date: Thu May 16 10:57:33 2019 -0700 + + [subset] Add integration tests for SingleSubst. + + test/subset/data/Makefile.sources | 1 + + ...ular.smallcaps.keep-layout-retain-gids.41,42,43.ttf | Bin 0 -> 6780 bytes + ...Regular.smallcaps.keep-layout-retain-gids.41,43.ttf | Bin 0 -> 6396 bytes + ...to-Regular.smallcaps.keep-layout-retain-gids.41.ttf | Bin 0 -> 6032 bytes + ...to-Regular.smallcaps.keep-layout-retain-gids.43.ttf | Bin 0 -> 6088 bytes + ...Regular.smallcaps.keep-layout-retain-gids.CA,CB.ttf | Bin 0 -> 7932 bytes + .../Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf | Bin 0 -> 2972 bytes + .../Roboto-Regular.smallcaps.keep-layout.41,43.ttf | Bin 0 -> 2572 bytes + .../layout/Roboto-Regular.smallcaps.keep-layout.41.ttf | Bin 0 -> 2196 bytes + .../layout/Roboto-Regular.smallcaps.keep-layout.43.ttf | Bin 0 -> 2268 bytes + .../Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf | Bin 0 -> 2612 bytes + test/subset/data/fonts/Roboto-Regular.smallcaps.ttf | Bin 0 -> 131632 bytes + test/subset/data/profiles/keep-layout-retain-gids.txt | 2 ++ + test/subset/data/profiles/keep-layout.txt | 1 + + test/subset/data/tests/full-font.tests | 1 - + test/subset/data/tests/layout.tests | 13 +++++++++++++ + test/subset/generate-expected-outputs.py | 3 ++- + 17 files changed, 19 insertions(+), 2 deletions(-) + +commit 349d692b0ee45330220fd3ec9267979d73acd149 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue May 21 12:38:53 2019 -0700 + + [subset] Iter in and out for loca + + src/hb-ot-glyf-table.hh | 31 ++++++++++++++++--------------- + test/api/hb-test.h | 7 ++----- + 2 files changed, 18 insertions(+), 20 deletions(-) + +commit 95445d79be0a79e6e2d384d46819730146d397d8 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue May 21 11:14:31 2019 -0700 + + [subset] Write loca using more idiomatic harfbuzzese + + src/hb-ot-glyf-table.hh | 35 +++++++++++++++++++---------------- + 1 file changed, 19 insertions(+), 16 deletions(-) + +commit d1b12a546561a78ae3c3e9d6bffa057caf82dbee +Merge: 3a43603e f49a5bec +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon May 20 21:29:54 2019 -0700 + + Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf + +commit 3a43603ecea2c349f58396e103a52948776681e0 +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon May 20 20:40:55 2019 -0700 + + [subset] Fix memory leak caused by failure to cleanup glyf accelerator + + src/hb-ot-glyf-table.hh | 42 ++++++++++++++++++++++++++---------------- + 1 file changed, 26 insertions(+), 16 deletions(-) + +commit 5cedda5e4a3f726168b87d357aee723e6fd919cd +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu May 16 19:16:52 2019 -0700 + + [subset] Fix null pointer deref, tidy up a bit + + src/hb-ot-glyf-table.hh | 282 +++++++++++++++++++++++++------------------- + test/api/test-subset-glyf.c | 18 +-- + 2 files changed, 167 insertions(+), 133 deletions(-) + +commit 8a84b540c7b850c1fb30d5bc1ffdeb43033be173 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu May 16 19:14:16 2019 -0700 + + [subset] Tests passing using iterator based glyf + + src/hb-ot-glyf-table.hh | 117 +++++++++++++++++++++++++++++++------------- + test/api/test-subset-glyf.c | 4 +- + 2 files changed, 86 insertions(+), 35 deletions(-) + +commit 82bbec306376d61b6700461c4038c6789e60a998 +Merge: 9d09ac13 b7be5931 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu May 16 15:14:01 2019 -0700 + + Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf + +commit 9d09ac13a114967576284d0b006a0ac7965d928a +Author: rsheeter <rsheeter@google.com> +Date: Sat May 11 23:16:40 2019 -0700 + + [subset] Tweak hint stripping + + src/hb-ot-glyf-table.hh | 46 +++++++++++++++++++++++++++++++++------------- + 1 file changed, 33 insertions(+), 13 deletions(-) + +commit 3a4c928fcfce5a8c7a56907b9945e87b0ce8e327 +Author: rsheeter <rsheeter@google.com> +Date: Sat May 11 22:06:46 2019 -0700 + + [subset] Fix glyf tests except hint stripping & local test asan + + src/hb-ot-glyf-table.hh | 93 +++++++++++++++++++++++++++++++++------------ + test/api/hb-subset-test.h | 2 +- + test/api/hb-test.h | 13 +++++++ + test/api/test-subset-glyf.c | 8 ++-- + 4 files changed, 86 insertions(+), 30 deletions(-) + +commit b77dde8f138442935e5ca99460a520a4117d6dd2 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri May 10 16:52:19 2019 -0700 + + [subset] Destroy blob + + src/hb-ot-glyf-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 14db6512f8dca80a575f468708949346b005834a +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri May 10 09:32:43 2019 -0700 + + [subset] Correct flipped use short computation + + src/hb-ot-glyf-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ab3fe5de2bbe10fdc13711537f824b62d091f995 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu May 9 22:12:20 2019 -0700 + + [subset] Glyf by iter now runs but fails tests + + src/hb-ot-glyf-table.hh | 88 +++++++++++++++++++++++++++++++++---------------- + 1 file changed, 59 insertions(+), 29 deletions(-) + +commit f8de063b48c243d551c8892bdd2a799606fda3f4 +Merge: 0d7fef2d 8f174870 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu May 9 20:02:38 2019 -0700 + + Merge branch 'glyf' of github.com:googlefonts/harfbuzz into glyf + +commit 0d7fef2d50bba714815c0c13f3b3dd6464710a1d +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 16:52:00 2019 -0700 + + [subset] Dinner time, checkpoint + + src/hb-ot-glyf-table.hh | 97 +++++++++++++++++++++++++++++-------------------- + 1 file changed, 58 insertions(+), 39 deletions(-) + +commit 240bc86e3a0b177ee84ec9c60723304a0cf4c405 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 14:59:03 2019 -0700 + + [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out. + + src/Makefile.sources | 2 - + src/hb-ot-glyf-table.hh | 9 +- + src/hb-subset-glyf.cc | 346 ------------------------------------------------ + src/hb-subset-glyf.hh | 40 ------ + src/hb-subset.cc | 1 - + 5 files changed, 6 insertions(+), 392 deletions(-) + +commit 02d4d4f3e67dcc37915bc386d506bb272455ff1e +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 14:43:18 2019 -0700 + + [subset] Starting to sketch glyf as iter + + src/hb-ot-glyf-table.hh | 60 ++++++++++++++++++++++++++++++++++++------------- + src/hb-subset-plan.hh | 2 ++ + src/hb-subset.cc | 2 +- + 3 files changed, 47 insertions(+), 17 deletions(-) + +commit 8f174870e9eed4c47463fdb0d4fe3e22a6f5fdc8 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 16:52:00 2019 -0700 + + [subset] Dinner time, checkpoint + + src/hb-ot-glyf-table.hh | 97 +++++++++++++++++++++++++++++-------------------- + 1 file changed, 58 insertions(+), 39 deletions(-) + +commit 723d054dcb6ad44e9eab4dc8cc55f8d480d2ff16 +Merge: ed727d4b e2a51ff7 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 16:45:35 2019 -0700 + + Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf + +commit ed727d4bb74860c126675e94f87f65ff7874dbb6 +Merge: fb9bff95 e8b45c19 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 16:39:45 2019 -0700 + + Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf + +commit fb9bff955a9356b053c5c9bcd7aa9101edb55767 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 14:59:03 2019 -0700 + + [subset] Remove subset-glyf; want everything to point to new iter-based edition. Some of the code will resurface as impl builds out. + + src/Makefile.sources | 2 - + src/hb-ot-glyf-table.hh | 9 +- + src/hb-subset-glyf.cc | 346 ------------------------------------------------ + src/hb-subset-glyf.hh | 40 ------ + src/hb-subset.cc | 1 - + 5 files changed, 6 insertions(+), 392 deletions(-) + +commit f9b089b695edc89023e3d62700ae68d5648f8494 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 14:43:18 2019 -0700 + + [subset] Starting to sketch glyf as iter + + src/hb-ot-glyf-table.hh | 60 ++++++++++++++++++++++++++++++++++++------------- + src/hb-subset-plan.hh | 2 ++ + src/hb-subset.cc | 2 +- + 3 files changed, 47 insertions(+), 17 deletions(-) + +commit f49a5bec9fc241c098be5a49233aa83cd5dc098e +Author: rsheeter <rsheeter@google.com> +Date: Mon May 20 20:45:11 2019 -0700 + + [docs] Tweak fuzzer doc + + TESTING.md | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 1aadd1449c65c50d5f35191f43136841c64ad399 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 17:29:13 2019 -0400 + + [gen-ucd] Generate script order table + + src/gen-ucd.py | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit be8de188671c04ddd8ec4d7af38b313322189136 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 17:17:38 2019 -0400 + + [gen-ucd] Start adding script-order + + src/gen-ucd.py | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 4a0eb066fdceb0cab48107f17670d6943ec0d61e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 16:57:04 2019 -0400 + + [gen-ucd] Add gc order + + src/gen-ucd.py | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit d1f9b2f961c71e5218ee359e8fb20cfbdb894c7e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 15:47:49 2019 -0400 + + [gen-ucd] Flesh out a bit more + + src/gen-ucd.py | 52 ++++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 40 insertions(+), 12 deletions(-) + +commit d6de4659aa7edb991507f8838dc566874e5b6a61 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 15:33:23 2019 -0400 + + Add HB_OPTIMIZE_SIZE + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 0ff3618c2d841d16cce9ba2d73321048e7ca6a2d +Author: Garret Rieger <grieger@google.com> +Date: Fri May 17 15:30:01 2019 -0700 + + [subset] Use hb_subset_input_t inside of subset_options_t so that input defaults are shared between the library and cli. + + src/hb-subset-input.cc | 42 ++++++++----- + src/hb-subset-input.hh | 7 +-- + src/hb-subset-plan.cc | 3 +- + src/hb-subset-plan.hh | 1 - + src/hb-subset.cc | 23 +------ + src/hb-subset.h | 6 -- + test/api/test-subset-glyf.c | 8 ++- + test/fuzzing/hb-subset-fuzzer.cc | 8 ++- + util/Makefile.am | 5 +- + util/Makefile.sources | 1 + + util/hb-subset.cc | 9 +-- + util/options-subset.cc | 127 +++++++++++++++++++++++++++++++++++++++ + util/options.cc | 101 ------------------------------- + util/options.hh | 20 ++---- + 14 files changed, 182 insertions(+), 179 deletions(-) + +commit 67064294a0c521550f5277b51b8c7e5d6bb27e68 +Author: Garret Rieger <grieger@google.com> +Date: Thu May 16 15:13:39 2019 -0700 + + [subset] Add drop-tables option to hb-subset util. + + util/hb-subset.cc | 1 + + util/options.cc | 45 ++++++++++++++++++++++++++++++++++++++++++--- + util/options.hh | 3 +++ + 3 files changed, 46 insertions(+), 3 deletions(-) + +commit 3be0ffe45d1ba32ddd8d3af25ff2c420be85da76 +Author: Garret Rieger <grieger@google.com> +Date: Thu May 16 11:29:15 2019 -0700 + + [subset] Add drop tables to subset input. + + src/hb-subset-input.cc | 8 +++++ + src/hb-subset-input.hh | 1 + + src/hb-subset-plan.cc | 3 ++ + src/hb-subset-plan.hh | 5 ++- + src/hb-subset.cc | 3 ++ + src/hb-subset.h | 3 ++ + test/api/Makefile.am | 2 ++ + test/api/test-subset-drop-tables.c | 71 ++++++++++++++++++++++++++++++++++++++ + 8 files changed, 95 insertions(+), 1 deletion(-) + +commit 0ca7ad4352eff357cbb5cc1dfe62aa15b440de84 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 11:39:07 2019 -0400 + + [cff] Fix unlikely invocations + + src/hb-ot-cff-common.hh | 8 ++++---- + src/hb-ot-cff1-table.hh | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 9ef241cd409b7ad4eeb8259cbf1a7a01358a766e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 11:38:02 2019 -0400 + + [test] Add one more + + ...-testcase-minimized-hb-subset-fuzzer-5634197349203968 | Bin 0 -> 5791 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 3efb7af7e28061f8cd138eb2ed5261bf521abc63 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 20 11:37:16 2019 -0400 + + [STAT] Fix sanitize condition + + Oops! + + Fixes https://oss-fuzz.com/testcase-detail/5696825891225600 + + src/hb-ot-stat-table.hh | 2 +- + ...zz-testcase-minimized-hb-subset-fuzzer-5696825891225600 | Bin 0 -> 69 bytes + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit e66eb21a46b2374bfb51f86ed9f5eec35ba87a61 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat May 18 07:44:48 2019 -0700 + + Don't set _POSIX_C_SOURCE in NetBSD + + According to a harfbuzz package patch on NetBSD project + https://github.com/NetBSD/pkgsrc/blob/trunk/fonts/harfbuzz/patches/patch-src_hb-blob.cc + + src/hb-blob.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 08c3648c6e18a0969a64284337dbd5b435d40f37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 17 16:21:34 2019 -0700 + + Oops, fix include + + src/hb-set.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 24958b8868a8003936e872d8fda873c52d528bcf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 17 16:20:36 2019 -0700 + + [set] Use StructAtOffsetUnaligned + + src/hb-set.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a0febbac439ac4cc58af674f676e473d2f6d726f +Author: rsheeter <rsheeter@google.com> +Date: Thu May 16 15:58:49 2019 -0700 + + Update TESTING.md + + TESTING.md | 5 +++++ + 1 file changed, 5 insertions(+) + +commit b7be59311f27112791e9b9c6356464e1c3ff92c1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 16 13:32:56 2019 -0700 + + Fix msan issue + + The fact that HB_AUTO_RETURN will return rvalue-references for rvalues + is very disturbing. + + Even apart from that, I'm totally lost re any hb_move needs or + hb_forward'ing to functions/templates where the type is fixed by + explicitly specifying template parameters. + + ==1==ERROR: AddressSanitizer: stack-use-after-return on address 0x7f6ad65e51e0 at pc 0x0000005da240 bp 0x7ffc104ab670 sp 0x7ffc104ab668 + READ of size 4 at 0x7f6ad65e51e0 thread T0 + SCARINESS: 55 (4-byte-read-stack-use-after-return) + #0 0x5da23f in bool OT::Coverage::serialize<hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>) harfbuzz/src/hb-ot-layout-common.hh:1055:16 + #1 0x5d88f9 in bool OT::SingleSubstFormat1::serialize<hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, (void*)0>(hb_serialize_context_t*, hb_map_iter_t<hb_map_iter_t<hb_filter_iter_t<OT::Coverage::iter_t, hb_set_t const&, $_7&, (void*)0>, OT::SingleSubstFormat1::subset(hb_subset_context_t*) const::'lambda'(unsigned int), (hb_function_sortedness_t)1, (void*)0>, $_20&, (hb_function_sortedness_t)1, (void*)0>, unsigned int) harfbuzz/src/hb-ot-layout-gsub-table.hh:98:9 + + src/hb-algs.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit bcd3ffc948f63f59a709923a3ba6dc9d591aae6b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 16 13:22:09 2019 -0700 + + Whitespace + + src/hb-ot-layout-gsub-table.hh | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 05bc5f96fb0818531404174b71c6ff497d5e2738 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 16 13:05:58 2019 -0700 + + [subset] Remove extra iteration + + src/hb-ot-layout-gsub-table.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 6555f209586886a4b2562412363cf152d7837d5c +Author: Garret Rieger <grieger@google.com> +Date: Wed May 15 09:42:38 2019 -0700 + + [subset] Truncate empty gids at the end in retain-gids mode. + + src/hb-subset-plan.cc | 8 ++++--- + test/api/fonts/Roboto-Regular.a.retaingids.ttf | Bin 0 -> 2068 bytes + .../SourceHanSans-Regular.41,4C2E.retaingids.otf | Bin 2736 -> 2656 bytes + test/api/test-subset-glyf.c | 25 +++++++++++++++++++++ + ...oboto-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 744 -> 732 bytes + ...oboto-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 712 -> 704 bytes + .../basics/Roboto-Regular.abc.retain-gids.61.ttf | Bin 1808 -> 1792 bytes + .../basics/Roboto-Regular.abc.retain-gids.62.ttf | Bin 1756 -> 1748 bytes + 8 files changed, 30 insertions(+), 3 deletions(-) + +commit 2376867649f97d25e4319f45845525ec207887f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 21:57:26 2019 -0700 + + Use hb_map(hb_add(this)) to dereference OffsetTo<>'s + + src/hb-ot-layout-gsub-table.hh | 30 ++++++++++++++------- + src/hb-ot-layout-gsubgpos.hh | 60 ++++++++++++++++++++++++++++-------------- + src/hb-ot-stat-table.hh | 2 +- + 3 files changed, 61 insertions(+), 31 deletions(-) + +commit 6f51e5552477125480f764a6af763dad9f8e3e1b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 21:41:12 2019 -0700 + + [algs] Rename hb_bind to hb_partial + + Since our API is the invers of what std::bind is, and closer to Python + functools.partial(). + + src/hb-algs.hh | 12 ++++++------ + src/test-algs.cc | 6 +++--- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit 0888e7bc86454020db45f78ee1136d6f3a1b9527 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 21:36:42 2019 -0700 + + [algs] Change hb_bind parameter number to be from one + + To match std:;bind, even though our interfaces are very different. + + src/hb-algs.hh | 24 +++++++++++++----------- + src/test-algs.cc | 6 +++--- + 2 files changed, 16 insertions(+), 14 deletions(-) + +commit dfa5e4297147b52f0ed2f569c9b90a0c68c003c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 21:18:14 2019 -0700 + + Add back symmetric OffsetTo<>::friend operator+ + + Finally seems to be working now. + + src/hb-open-type.hh | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit a06a236891611da9db601ddbc2b1513380ad12e6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 21:12:22 2019 -0700 + + [algs] Partialize all operators + + src/hb-algs.hh | 66 +++++++++++++++++++++++++++++++++++--------------------- + src/test-algs.cc | 4 ++-- + 2 files changed, 44 insertions(+), 26 deletions(-) + +commit edc69ec935511d1993240fb68b54b2cfd6afa888 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 21:09:56 2019 -0700 + + [algs] Rewrite bind API + + And add a partialization API use example to hb_add() + + src/hb-algs.hh | 45 ++++++++++++++++++++------------------------- + src/test-algs.cc | 9 ++++++--- + 2 files changed, 26 insertions(+), 28 deletions(-) + +commit 16a3540ea4257a19b9bfd9d5300a280e18b423a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 20:48:20 2019 -0700 + + [algs] Add hb_bind0 and hb_bind1 + + src/hb-algs.hh | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/test-algs.cc | 7 +++++++ + 2 files changed, 61 insertions(+) + +commit d214b07883a626f3ecebb027797e8bb994e174a4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 19:07:39 2019 -0700 + + Fix clang build + + Ugh. + + In file included from hb-ot-face.cc:41: + ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument + hb_requires (hb_is_sorted_source_of (Iterator, + ^ + ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' + define hb_requires(Cond) hb_enable_if((Cond)) + ^ + ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' + define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr + ^ + ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here + hb_requires (hb_is_sorted_source_of (Iterator, + ^ + ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' + define hb_requires(Cond) hb_enable_if((Cond)) + ^ + ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' + define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr + ^ + + src/hb-ot-layout-gsub-table.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 371b55c7a0c718fcaca0330edfeacf610797cf7a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 18:54:07 2019 -0700 + + Fix clang build + + In file included from hb-ot-face.cc:41: + ./hb-ot-layout-gsub-table.hh:293:7: error: template parameter redefines default argument + hb_requires (hb_is_sorted_source_of (Iterator, + ^ + ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' + define hb_requires(Cond) hb_enable_if((Cond)) + ^ + ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' + define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr + ^ + ./hb-ot-layout-gsub-table.hh:40:5: note: previous default template argument defined here + hb_requires (hb_is_sorted_source_of (Iterator, + ^ + ./hb-meta.hh:59:27: note: expanded from macro 'hb_requires' + define hb_requires(Cond) hb_enable_if((Cond)) + ^ + ./hb-meta.hh:57:67: note: expanded from macro 'hb_enable_if' + define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr + ^ + 1 error generated. + + src/hb-ot-layout-gsub-table.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 243a5a6af2565937705d6bc20e65a62b686bb664 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 19:03:59 2019 -0700 + + [algs] Remove pair copy constructor + + Use default. + + src/hb-algs.hh | 1 - + src/test-algs.cc | 1 + + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit f92d188d7703184d04e8f205ae46ca3081d3e048 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 18:52:57 2019 -0700 + + Whitespace + + src/hb-ot-layout-gsub-table.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 962f95cf802404dafadf2f999772d3f9fc949d63 +Author: Garret Rieger <grieger@google.com> +Date: Thu May 9 13:04:11 2019 -0700 + + [subset] Switch SingleSubst to use iterators in serialize. + + src/hb-ot-layout-common.hh | 6 +-- + src/hb-ot-layout-gsub-table.hh | 97 +++++++++++++++++++++++++----------------- + 2 files changed, 62 insertions(+), 41 deletions(-) + +commit 78d35f0e780dd811ae103c96f3b1060d49046a7a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 18:15:05 2019 -0700 + + Reduce captures of lambdas + + src/hb-ot-hdmx-table.hh | 4 ++-- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 29 +++++++++++++++-------------- + src/hb-ot-layout-gsubgpos.hh | 12 ++++++------ + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-stat-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 4 ++-- + src/hb-subset-plan.cc | 2 +- + src/test-iter.cc | 4 ++-- + 9 files changed, 31 insertions(+), 30 deletions(-) + +commit 5266ca86b633b84850492b7982334fb63271ccbc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 17:59:00 2019 -0700 + + Fix tests + + Oops. + + src/test-algs.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 5da8a3a90db5e5ccaaf68de2ac312108af911821 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 17:11:18 2019 -0700 + + Remove variadic form of hb_min/hb_max + + Unused, and why here and not in other functions... + + src/hb-algs.hh | 22 ++-------------------- + 1 file changed, 2 insertions(+), 20 deletions(-) + +commit e5cfe9d582d86281eda2bcb85d3d1cbd4afbb5bb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 16:59:36 2019 -0700 + + Add arithmetic operators + + src/hb-algs.hh | 44 ++++++++++++++++++++++++++++++-------------- + 1 file changed, 30 insertions(+), 14 deletions(-) + +commit f7a458510d9c34d1c52579985ded5082ad0f3458 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 16:49:35 2019 -0700 + + Add hb_bitwise_* ops + + src/hb-algs.hh | 56 +++++++++++++++++++++++++++++++++++--------------------- + src/hb-set.hh | 14 +++++++------- + 2 files changed, 42 insertions(+), 28 deletions(-) + +commit d822e0a16f914ec6a7e629d21ed972d009a88561 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 16:30:08 2019 -0700 + + [array] Adjust operator!= + + See comments. + + src/hb-array.hh | 7 ++++++- + src/hb-vector.hh | 1 + + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit 203ea58bf67b3df3e376f94cdfb37382dd3858a0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 16:14:40 2019 -0700 + + More adjustment to OffsetTo<>::friend opeator+ + + Let's see if I break any bots. But yeah, it wasn't accepting a + non-const pointer. It just happens that we don't use that in the + code it seems. + + src/hb-open-type.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit ebf47a95f29dd959319feb7f8728f7c0162a181e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 15:14:26 2019 -0700 + + [iter] Simplify operator!= of iterator filters + + Both to save ops, and also because lambdas don't implement operator!=, + so this was failing in range-based for loop if a lambda was passed to + hb_map() or hb_filter(). Just check end-condition assuming that we + are comparing to .end() or iterators that are otherwise derived from + current iterator. Ie. don't compare things that are expected to be + in common. + + src/hb-iter.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit d3e1d5044f23a2dc910f4253c3f4976bf08f93ab +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 14:25:54 2019 -0700 + + Add all pair_t comparison operators + + src/hb-algs.hh | 5 +++++ + 1 file changed, 5 insertions(+) + +commit f244224dbb5ee8929af109a0c4e23d2d993c8df8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 14:19:20 2019 -0700 + + [iter] Use default operators instead of redefining empty ones + + src/hb-iter.hh | 26 +++++++++++++++----------- + 1 file changed, 15 insertions(+), 11 deletions(-) + +commit 125c45ed368ae61a74e2c558b9c884cfde6295e1 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Wed May 15 17:02:32 2019 -0400 + + Convert Consonant_Initial_Postfixed to CONS_MED + + src/gen-use-table.py | 6 +++--- + src/hb-ot-shape-complex-use-table.cc | 2 +- + .../fonts/fd565cabd5208d345d0ed4fda7ae742917d846a5.ttf | Bin 0 -> 1056 bytes + test/shaping/data/in-house/tests/use-syllable.tests | 1 + + 4 files changed, 5 insertions(+), 4 deletions(-) + +commit 99ca956c131563b57d490b1ec3c8de920645e53f +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Wed May 15 16:29:51 2019 -0400 + + Fix record-test.sh on machines without sha1sum + + test/shaping/record-test.sh | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit e2767e438c56b8ee0bc2f2040c10b13b34d37f95 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed May 15 13:14:09 2019 +0430 + + [ci][test] Ignore other gcov symbols also + + To fix https://travis-ci.org/harfbuzz/harfbuzz/jobs/532693197 + + src/check-symbols.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 397cbbd5ff25c9796ecd56b8270e83de1eb322ac +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed May 15 13:03:28 2019 +0430 + + [ci][travis] Update its distribution + + It may break things, lets see + + .travis.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 763ea4224bf612f3efb80d5744d1e8852682683e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 01:15:11 2019 -0700 + + Another try + + src/hb-open-type.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit e1b2edb04af7bd2b4eecb59392f75abcc72cd8a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 01:12:04 2019 -0700 + + Completely revert the thing back + + src/hb-open-type.hh | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +commit c58eeb5fb35ec6a8d0a4394fd83cb2571cd5af4f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 01:10:31 2019 -0700 + + Another try at fix + + Fails locally. Trying to understand. Sigh + + src/hb-open-type.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 004edf3bdac77564d39516b51b0666de60e65ece +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 01:02:50 2019 -0700 + + Ugh. How was the Travis bot happy before, but isn't now?! :( + + src/hb-open-type.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit e01c7b1648dbbb76966b3bd4437bcf7699e77c35 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 00:52:17 2019 -0700 + + Move OffsetTo operator+ back out of class + + Apparently there's different overload resolution rules that apply, at + least with some (older?) version of gcc. + + hb-ot-name-table.hh: In member function ‘void OT::name::accelerator_t::init(hb_face_t*)’: + hb-ot-name-table.hh:244:62: error: ambiguous overload for ‘operator+’ (operand types are ‘hb_blob_ptr_t<OT::name>’ and ‘OT::NNOffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> > > {aka const OT::OffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> >, OT::IntType<short unsigned int, 2u>, false>}’) + this->pool = (const char *) (const void *) (this->table+this->table->stringOffset); + ^ + hb-ot-name-table.hh:244:62: note: candidates are: + hb-ot-name-table.hh:244:62: note: operator+(const C*, long int) <built-in> + hb-ot-name-table.hh:244:62: note: operator+(const char*, long int) <built-in> + + src/hb-open-type.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit b213042f87dd736bad7a852fe98269f84cbff493 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 00:50:48 2019 -0700 + + Revert "Revert symmetric OffsetTo overloads" + + This reverts commit 01912efb74fc554a81c8cfe572145ce45b8fa58b. + + Actually this didn't break things. Fixing + + src/hb-open-type.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 01912efb74fc554a81c8cfe572145ce45b8fa58b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 00:42:47 2019 -0700 + + Revert symmetric OffsetTo overloads + + Reverts 57f65ae9355004044325dd6441cde761bca5e0a3 + + Caused ambiguous-overload on some gcc... + + src/hb-open-type.hh | 4 ---- + 1 file changed, 4 deletions(-) + +commit d0df996cdc249a245c9dad1fa6503213c84dbcd2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 15 00:32:41 2019 -0700 + + Use implicit lambda return type + + src/hb-array.hh | 4 ++-- + src/hb-ot-layout-gsub-table.hh | 8 ++++---- + src/hb-ot-layout-gsubgpos.hh | 18 +++++++++--------- + src/hb-ot-stat-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 4 ++-- + src/test-iter.cc | 8 ++++---- + src/test-meta.cc | 1 - + 7 files changed, 22 insertions(+), 23 deletions(-) + +commit 57f65ae9355004044325dd6441cde761bca5e0a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 14 22:52:59 2019 -0700 + + Add symmetric friend operator+ for OffsetTo + + src/hb-open-type.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 71208e5047c71108dec7361fd7c3e594c8b6c2d8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 14 22:51:59 2019 -0700 + + Move OffsetTo<> deref operators in-class as friends + + src/hb-open-type.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit e6d6f4b96dd5517406265093cd57834c00850d41 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 14 22:45:03 2019 -0700 + + Whitespace + + src/hb-ot-stat-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 889dc1eb06a80ea9be4223a19011e47a52abebdd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 14 22:28:07 2019 -0700 + + [iter] Remove sort categorization + + See comments. + + src/hb-array.hh | 2 +- + src/hb-iter.hh | 48 ++++++++++++++++++++++++++++++---------------- + src/hb-ot-layout-common.hh | 2 +- + src/hb-set.hh | 2 +- + 4 files changed, 35 insertions(+), 19 deletions(-) + +commit b4eff38397c2a4e475f426df38e040dddf94a4fa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 14 09:07:20 2019 -0700 + + Start of gen-ucd.py, to replace UCDN + + src/gen-ucd.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 46 insertions(+) + +commit 02e5e5d939be36d8f108029601a1ce1f533e5ccb +Author: Qunxin Liu <qxliu@google.com> +Date: Mon May 13 09:38:42 2019 -0700 + + [subset] retian nameids from STAT and fvar tables + + src/hb-ot-stat-table.hh | 76 +++++++++++++++++++++++++++++++++++++++++---- + src/hb-ot-var-fvar-table.hh | 21 +++++++++++++ + src/hb-subset-plan.cc | 26 ++++++++++++++++ + 3 files changed, 117 insertions(+), 6 deletions(-) + +commit ff7995200e706f3161b9fc5c27bb950e3d87e8e2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 14 07:44:03 2019 -0700 + + Hopefully last warning fix + + src/hb-subset-cff2.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d1baf99697d215584b2ecb8d2d38ba5b9045955c +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue May 14 16:16:46 2019 +0430 + + [ci] add HB_TINY to asmjs builder + + .circleci/config.yml | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit 9e7c9c3adb33b06610951be38f3c820342333092 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue May 14 15:58:51 2019 +0430 + + Fix -Wunused-function on HB_NO_SHAPE_AAT + + We should add a bot for it + Part of #1652 + + src/hb-ot-shape.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit c73d7ba75d4556d9b8e05b10d6572f74f4814f7a +Author: Dominik Röttsches <drott@chromium.org> +Date: Tue May 14 13:26:18 2019 +0300 + + Fix building with HB_NO_SUBSET_LAYOUT + + Fixes an unused function warning when building with HB_NO_SUBSET_LAYOUT + as part of the Chrome build. + + src/hb-subset-plan.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit f39934983f459c992e27075cd2c45ac0025183d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 14 00:13:21 2019 -0700 + + [ucdn] Fix Hangul composition + + https://github.com/grigorig/ucdn/issues/23 + + src/hb-ucdn/ucdn.c | 3 ++- + test/api/test-unicode.c | 4 ++++ + 2 files changed, 6 insertions(+), 1 deletion(-) + +commit b2ab15a78c219016e20389582716e0ac0ee8aeb5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 23:47:28 2019 -0700 + + Fix more warnings + + src/hb-ot-cff1-table.hh | 8 ++++---- + src/hb-subset-cff1.cc | 4 ++-- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 42ae468a8a76e1e4e6a8121eec5dc118f52086ee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 23:43:45 2019 -0700 + + [config] Add NDEBUG and HB_NDEBUG + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 10 ++++++++++ + src/hb.hh | 10 ---------- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit 0a01deb76fa582afa83da70a09478299d8080827 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 18:04:09 2019 -0700 + + One more warning fix + + No idea where these appear from... + + src/hb-ot-cff-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f76e9f2ede76a189d48ddd4f2275442d8e849815 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 17:39:46 2019 -0700 + + [icu] Comment + + src/hb-icu.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 70fe9e73555f3354238f7cda5ff0f0c0b75e1d62 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 17:35:02 2019 -0700 + + Fix moreeeeeeeeeee + + src/hb-icu.cc | 28 +++++++++++++++------------- + src/hb-subset-plan.cc | 2 +- + 2 files changed, 16 insertions(+), 14 deletions(-) + +commit 68e12e68f813bfd22dda040463d042cc06b958ec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 17:28:59 2019 -0700 + + Fix more semi-colon issues + + src/hb-coretext.cc | 4 ++-- + src/hb-directwrite.cc | 4 ++-- + src/hb-graphite2.cc | 4 ++-- + src/hb-uniscribe.cc | 4 ++-- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit 4d3cf2adb669c345cc43832d11689271995e160a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 17:25:07 2019 -0700 + + [iter] Fix zip iterator sortedness classification logic + + src/hb-iter.hh | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit c572732f29787d1cf7ff39b8160b3935d4b13ba4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 15:41:09 2019 -0700 + + Fix more excess semi-colon errors + + src/hb-common.cc | 2 +- + src/hb-ot-name.cc | 4 ++-- + src/hb-ot-shape-complex-indic.hh | 2 +- + src/hb-ot-shape-complex-khmer.hh | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +commit 513762849a683914fc266a17ddf38f133cccf072 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 15:36:14 2019 -0700 + + [iter] Track strictly-sorted iterators + + This make output of hb_enumerate() sorted regardless of input iterator. + + src/hb-array.hh | 2 +- + src/hb-iter.hh | 30 +++++++++++++++++++++--------- + src/hb-ot-layout-common.hh | 2 +- + src/hb-set.hh | 2 +- + 4 files changed, 24 insertions(+), 12 deletions(-) + +commit 7e02063f3202712b4e5fbddac0354adadb924f72 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 15:26:00 2019 -0700 + + [iter] Minor + + src/hb-iter.hh | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit a5fb44a8cbbaad194ddf6d02a6b6c98b0b637149 +Author: Garret Rieger <grieger@google.com> +Date: Mon May 13 14:57:40 2019 -0700 + + [subset] Fix shadowed 'groups' param in cmap. + + src/hb-ot-cmap-table.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 73943bdf21a96f4e12cb9efd8458a2711de0d870 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 14:48:31 2019 -0700 + + Adjust uniscribe_bug_compatible mode + + More correct behavior. We were commenting out some legit conditions + before. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape-complex-indic.cc | 10 ++-------- + 1 file changed, 2 insertions(+), 8 deletions(-) + +commit 809c58708359bcc22bb1273069886f2cbf68be65 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 14:45:51 2019 -0700 + + [config] Better compile away morx/kerx/trak + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape.cc | 38 ++++++++++++++------------------------ + src/hb-ot-shape.hh | 12 +++++++++++- + 2 files changed, 25 insertions(+), 25 deletions(-) + +commit b1d3e54bd3c881794b05831e811b1a77a7d427c5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 14:35:04 2019 -0700 + + [indic] Don't constrain how many C, M, ... occur + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1709 + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape-complex-indic-machine.hh | 1225 ++++++++---------------------- + src/hb-ot-shape-complex-indic-machine.rl | 8 +- + 2 files changed, 305 insertions(+), 928 deletions(-) + +commit 148d88368013ba9bf70a7dd275b1a0f9c64fd45c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 14:33:06 2019 -0700 + + [test] Don't call deprecated API + + test/api/test-font.c | 3 --- + test/api/test-shape.c | 16 ++-------------- + 2 files changed, 2 insertions(+), 17 deletions(-) + +commit a487fc33248ea2f934ff4cb857cb556065c11841 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 14:16:33 2019 -0700 + + Another extra semi-colon + + src/hb-ot-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8461ade7832110d28001dc641342d3f9461e03b0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 14:10:48 2019 -0700 + + Revert "[ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018" + + This reverts commit 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1708 + + src/hb-buffer-deserialize-json.hh | 1051 ++++++----- + src/hb-buffer-deserialize-text.hh | 1009 ++++++----- + src/hb-ot-shape-complex-indic-machine.hh | 2678 ++++++++++++---------------- + src/hb-ot-shape-complex-khmer-machine.hh | 709 ++++---- + src/hb-ot-shape-complex-myanmar-machine.hh | 820 ++++----- + src/hb-ot-shape-complex-use-machine.hh | 1144 ++++++------ + 6 files changed, 3452 insertions(+), 3959 deletions(-) + +commit 52c15b053aec06d351404a4c15609384946b26e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 14:10:28 2019 -0700 + + Revert "[ragel] Switch to -T1 output instead of -F1" + + This reverts commit ae8719eb596485ebff07dd5016256015cd0cf86b. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1708 + + src/Makefile.am | 2 +- + src/hb-buffer-deserialize-json.hh | 381 ++- + src/hb-buffer-deserialize-text.hh | 308 +-- + src/hb-ot-shape-complex-indic-machine.hh | 3527 +++++++--------------------- + src/hb-ot-shape-complex-khmer-machine.hh | 396 +--- + src/hb-ot-shape-complex-myanmar-machine.hh | 742 ++---- + src/hb-ot-shape-complex-use-machine.hh | 1011 ++------ + 7 files changed, 1658 insertions(+), 4709 deletions(-) + +commit e98f0ddd6373f64ef4b542daa36b5841399170af +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 13:53:06 2019 -0700 + + Fix extra semi-colon + + src/hb-iter.hh | 2 +- + src/hb.hh | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit ae8719eb596485ebff07dd5016256015cd0cf86b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 13 12:27:10 2019 -0700 + + [ragel] Switch to -T1 output instead of -F1 + + Fedora upgraded to ragel 7, which is buggy if char is signed. + Switching to -G2 output fails with sign-compare error: + + ../../src/hb-buffer-deserialize-json.hh:107:12: error: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘const char’ [-Werror=sign-compare] + if ( 9u <= ( (*( p))) && ( (*( p))) <= 13u ) { + ~~~^~~~~~~~~~~~~ + + Switching to -T1 for now. It actually results in smaller code, + at the expense of some binary searching instead of flat tables. + In the not distant future, we might actually generate two different + outputs and choose between depending on size-optimize options. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1708 + + src/Makefile.am | 2 +- + src/hb-buffer-deserialize-json.hh | 381 ++-- + src/hb-buffer-deserialize-text.hh | 308 ++- + src/hb-ot-shape-complex-indic-machine.hh | 3401 +++++++++++++++++++++------- + src/hb-ot-shape-complex-khmer-machine.hh | 396 +++- + src/hb-ot-shape-complex-myanmar-machine.hh | 742 ++++-- + src/hb-ot-shape-complex-use-machine.hh | 1011 ++++++--- + 7 files changed, 4646 insertions(+), 1595 deletions(-) + +commit df3f36f0bb7aeed0554843f24f6542852e40f6cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 20:56:36 2019 -0700 + + Minor + + src/gen-os2-unicode-ranges.py | 2 ++ + 1 file changed, 2 insertions(+) + +commit ccc88e98f34453100830d6408fdabfe90e6b47b8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 16:12:06 2019 -0700 + + Fix MSVC build + + src/hb-ot-shape-complex-indic.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f8f9cb93b7166b0d8c816610596da486443c7391 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 15:56:25 2019 -0700 + + [config] Define HB_NO_SUBSET_LAYOUT in HB_LEAN + + Assumning subsetter would be used for printing-like uses in that case, + which don't need GSUB/GPOS. + + src/hb-config.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a1394a28fc4b3d15ef45481f3147f0685d343acb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 15:47:46 2019 -0700 + + [config] Add HB_NO_UNISCRIBE_BUG_COMPATIBLE + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 4 ++++ + src/hb-ot-shape-complex-indic.cc | 24 ++++++++++++++++++------ + 2 files changed, 22 insertions(+), 6 deletions(-) + +commit dba1ac1b0e8f5f96974fc1119b318ae6127daa82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 15:33:31 2019 -0700 + + [config] Disable buffer serialize routines in HB_TINY + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-buffer-serialize.cc | 14 +++++++++++++- + src/hb-config.hh | 1 + + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit 3d9be2ad5036aaf02b69095faaf9c18705c2c5bc +Merge: a20db496 1a850abd +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sun May 12 20:03:29 2019 +0100 + + Merge pull request #1665 from n8willis/docs-gtkdoc-colormath + + [Docs] Add gtk-doc comments for OT color and OT math + +commit a20db496f090abc5b937857b7c5f077161b6ffe4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 11:08:45 2019 -0700 + + Fix builds + + src/hb-subset-plan.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8694d6082901661e90e2ffcf732e9985a215063f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 11:05:24 2019 -0700 + + [config] Enable HB_NO_MT in HB_TINY + + Now that user can override it if needed... + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7f6fca4ef78cf3c9384bf835def14219b2ce8791 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 12 10:29:47 2019 -0700 + + Force-disable CFF code under disabling conditions + + Subsetter size goes down from 190kb to 119kb. Main library about 7kb. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-cff1-table.cc | 4 ++++ + src/hb-ot-cff2-table.cc | 4 ++++ + src/hb-subset-cff1.cc | 4 ++++ + src/hb-subset-cff2.cc | 4 ++++ + 4 files changed, 16 insertions(+) + +commit 5249eee43748db32b40ad2602b3243d2491642b3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 16:12:07 2019 -0700 + + [config] Allow overriding chosen config + + src/hb-config.hh | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 30c059a978c91fcd38d47f1ac4a03295f887a7da +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat May 11 18:48:41 2019 -0400 + + [test] minor, fix -Weverything bot + + test/fuzzing/main.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 25531a30394c451a7a2aee77928e0a550015b803 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat May 11 19:50:42 2019 +0000 + + [test] minor + + style fix and add return statement + + test/fuzzing/main.cc | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 1a850abd66999707b6f4795050e748fc879b92ef +Merge: 8a544171 a6048e4c +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 20:16:57 2019 +0100 + + Merge branch 'master' into docs-gtkdoc-colormath + +commit 8a544171d15bb36c15ca7bf679643b2b14f94b45 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sat May 11 20:11:49 2019 +0100 + + Corrections to OT Color gtk-doc comments. + + src/hb-ot-color.cc | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 301f5091f6663cc8a1fff848bf5285aa15cc0598 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sat May 11 20:11:36 2019 +0100 + + Corrections to OT Math gtk-doc comments. + + src/hb-ot-math.cc | 33 +++++++++++++++++++++++---------- + 1 file changed, 23 insertions(+), 10 deletions(-) + +commit a6048e4cd013987ecb846e0683a7cf6f0caa65f9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 12:11:22 2019 -0700 + + Fix build + + src/hb-ot-font.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 32d3c06b61f2f4252f4403b55c6ba07fbb572149 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 11:59:18 2019 -0700 + + Disable sbix if no-color or no-ot-font-bitmap + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-font.cc | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit 606841b07017ac80dea2fc5ada25b5976f2f9192 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 11:54:30 2019 -0700 + + [iter] Check for more before forwarding/rewinding past ends + + src/hb-iter.hh | 4 ++-- + src/test-iter.cc | 6 ++---- + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit c1c122e7b3f60dc7b5a224c68d2acb106fda8b49 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Sat May 11 11:38:06 2019 -0400 + + [iter] Fix filter rewinding + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b854d4ff46602104343201361919f30169144cf1 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Fri May 10 22:51:49 2019 -0400 + + [array] Fix rewinding + + src/hb-array.hh | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +commit 76e80c5ca5e820e955438e4c727929ddd99e695e +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 19:51:24 2019 +0100 + + Update src/hb-ot-color.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 79126df3070f00193fe3caefe9deb62c4520e048 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 11:23:31 2019 -0700 + + [iter] Add hb_map_sorted() and hb_map_retains_sorting() + + src/hb-iter.hh | 38 +++++++++++++++++++++++++++++++------- + 1 file changed, 31 insertions(+), 7 deletions(-) + +commit bcd81932f0bcb2258276ae313709780e90e9b0f6 +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 14:10:32 2019 +0100 + + Update src/hb-ot-math.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-math.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ddc6dd42f753a20204898e41cc711b0100638330 +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 14:10:11 2019 +0100 + + Update src/hb-ot-math.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-math.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 46e05ecca16e561a0ff4ca60bb064f480374590a +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 14:09:52 2019 +0100 + + Update src/hb-ot-color.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6d9870b4799f20a6c58a2c071713e56aa93b0221 +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 14:09:26 2019 +0100 + + Update src/hb-ot-color.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 12ea4a24c40c7ac28d058e9721479347951e3482 +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 14:08:40 2019 +0100 + + Update src/hb-ot-color.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3535f2d31efe1ebe44ba63f980882ba23cdcde3b +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 14:07:38 2019 +0100 + + Update src/hb-ot-color.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 12d2c472fe8ec3268a4b39a57603dcc734ab7b88 +Author: n8willis <n8willis@users.noreply.github.com> +Date: Sat May 11 14:06:56 2019 +0100 + + Update src/hb-ot-color.cc + + Co-Authored-By: Khaled Hosny <khaledhosny@eglug.org> + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7f45ce42dbf11366e904f48db45cf5405e4e94df +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 01:28:31 2019 -0700 + + [config] Rename + + src/hb-config.hh | 2 +- + src/hb-ot-layout.cc | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 0e78d4ddaec5f29d6652cc4185cbcca98c3a2927 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 01:27:50 2019 -0700 + + [config] Add HB_NO_NAME + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 6 +++++- + src/hb-ot-name.cc | 20 ++++++++++++++++++++ + 2 files changed, 25 insertions(+), 1 deletion(-) + +commit 1fc077211771c752768f63f178116d2b8f2f7d03 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 01:24:23 2019 -0700 + + [config] HB_NO_OT_NAME_LANGUAGE AAT + + src/hb-config.hh | 4 ++-- + src/hb-ot-name-language-static.hh | 3 +++ + src/hb-ot-name-table.hh | 4 +++- + 3 files changed, 8 insertions(+), 3 deletions(-) + +commit 4381bb2de7a554a148302836b86a5d73264abeae +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 01:14:04 2019 -0700 + + [config] Comment + + src/hb-config.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 9c921e6c32ab5ac4c524f554b7a7841eeeb0908f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 01:08:51 2019 -0700 + + [config] Enable HB_NO_NAME_TABLE_AAT + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 81b79dfc397599182f43d63bf9346eee28e2d220 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:53:52 2019 -0700 + + [config] Add HB_NO_COLOR to HB_LEAN + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 1 + + src/hb-ot-color.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++---- + src/hb-ot-color.h | 2 +- + src/hb-ot-layout.h | 2 +- + 4 files changed, 48 insertions(+), 6 deletions(-) + +commit b63a8e173cbc5a81f2ca4a0a82f20b9dafaedb30 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:47:20 2019 -0700 + + [config Add HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS to LEAN + + Already I don't like the inflexibility of this approach :(. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 42a21284778f3203d96133f74b0f846cd1567958 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:44:22 2019 -0700 + + [config] Disbale getenv() and atexit() if HB_LEAN + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit fca27860417812d51e40f040de97c10177b1250e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:37:01 2019 -0700 + + [config] Make HB_DISABLE_DEPRECATED actually compile + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 7 +++++++ + src/hb-font.cc | 8 ++++++++ + src/hb-font.hh | 12 ++++++++++-- + src/hb-graphite2.cc | 2 ++ + src/hb-icu.cc | 2 +- + src/hb-ot-layout.cc | 7 ++++++- + src/hb-ot-shape-fallback.cc | 4 ++++ + src/hb-ot-tag.cc | 4 ++++ + src/hb-ot-var-fvar-table.hh | 6 ++++++ + src/hb-ot-var.cc | 2 ++ + src/hb-set.cc | 2 ++ + src/hb-unicode.cc | 6 ++++++ + src/hb-unicode.hh | 10 +++++++--- + 13 files changed, 65 insertions(+), 7 deletions(-) + +commit 5a48611ccd045de5782ad2fd5f6718357fe232a2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:19:03 2019 -0700 + + [config] Add HB_NO_OT_LAYOUT_UNUSED + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 1 + + src/hb-ot-layout.cc | 12 ++++++++++++ + 2 files changed, 13 insertions(+) + +commit 771f1b21d1d7128440d6b4488705456d43dbc0e7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:16:18 2019 -0700 + + [config] Adjust + + src/hb-config.hh | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 484f6e8215038006a945da67d245f14db3eeeb2e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:13:35 2019 -0700 + + [config] Add HB_LEAN + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 5 +++++ + src/hb-ot-math.cc | 40 ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 45 insertions(+) + +commit 0bfd14c0ed2f95f00d0b94d396c777399afa4d68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:06:57 2019 -0700 + + [config] Fix tests + + src/hb-config.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 784df8eba1aaf20d2db464f8b3ea0984f7ea1308 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat May 11 00:04:59 2019 -0700 + + [config] Flesh out more + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-config.hh | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit 799c6a5081e5058260199eeeb2091ee2c1dfefff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:55:22 2019 -0700 + + [config] Add some + + src/hb-aat-layout.cc | 26 +++++++++++++------------- + src/hb-aat-map.cc | 4 ++-- + src/hb-config.hh | 18 ++++++++++++++++++ + src/hb-ot-kern-table.hh | 14 +++++++------- + src/hb-ot-shape.cc | 22 +++++++++++----------- + 5 files changed, 51 insertions(+), 33 deletions(-) + +commit e6582de12f1af9ab5e3122d762a3e12438a66b6b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:53:38 2019 -0700 + + Add hb-config.hh + + src/Makefile.sources | 1 + + src/hb-config.hh | 36 ++++++++++++++++++++++++++++++++++++ + src/hb.hh | 7 ++++--- + 3 files changed, 41 insertions(+), 3 deletions(-) + +commit d43af339e7a7f5dab1690703a78d2690baefbd59 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:46:22 2019 -0700 + + [subset] More HB_NO_SUBSET_LAYOUT + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-subset-plan.cc | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 31c591d69f6a7605088883db59149e83c80d019c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:39:53 2019 -0700 + + [cff] Prune more code if HB_NO_OT_FONT_CFF + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-cff1-table.cc | 5 +++++ + src/hb-ot-cff2-table.cc | 5 +++++ + 2 files changed, 10 insertions(+) + +commit 5ea8ad5c48f9baabc4ccf81dce4aee1067c401f6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:36:42 2019 -0700 + + [subset] Add HB_NO_SUBSET_CFF + + Doesn't fully prune all the relevant code. To be fixed later. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-subset.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2c93f0dee31b2277567ccbee041539732b9bd26d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:31:05 2019 -0700 + + Add HB_NO_AAT + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-aat-layout.cc | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-map.cc | 8 +++++++ + src/hb-ot-kern-table.hh | 14 ++++++++++++ + src/hb-ot-shape.cc | 28 +++++++++++++++++++++++- + 4 files changed, 107 insertions(+), 1 deletion(-) + +commit 62dfe7aea23c95f4550543085071990e20ee4d54 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:17:15 2019 -0700 + + [cff] Minor + + src/hb-subset-cff1.cc | 2 +- + src/hb-subset-cff2.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 227d85e138d4c785c2d658e225ed35f5acd1235f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 23:15:58 2019 -0700 + + Minor + + src/hb-atomic.hh | 2 +- + src/hb-debug.hh | 2 +- + src/hb-font.cc | 2 +- + src/hb-ot-font.cc | 4 ++-- + src/hb-ot-layout.cc | 6 +++--- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-shape-complex-arabic.cc | 2 +- + src/hb-ot-shape-complex-hebrew.cc | 2 +- + src/hb-ot-shape-complex-thai.cc | 2 +- + src/hb-ot-shape-complex-vowel-constraints.cc | 2 +- + src/hb-ot-shape-fallback.cc | 6 +++--- + src/hb-subset.cc | 4 ++-- + src/hb-warning.cc | 4 ++-- + src/hb.hh | 10 +++++----- + 14 files changed, 25 insertions(+), 25 deletions(-) + +commit 9bfe22af6113ee8cd24cb9ee091f0841c27bbf98 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 22:44:19 2019 -0700 + + [sanitize] Fix previous commit + + src/hb-open-type.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 4dcf65328f04a11594fc190fd7e976afa54455e9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 22:23:24 2019 -0700 + + [sanitize] Simplify + + src/hb-open-type.hh | 45 ++++++++++----------------------------------- + 1 file changed, 10 insertions(+), 35 deletions(-) + +commit 23168c3981f7c80883663fa69c608caee98d3d99 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 22:11:51 2019 -0700 + + [sanitize] Use hb_is_trivially_copyable() + + src/hb-open-type.hh | 64 +++++++---------------------------------------------- + 1 file changed, 8 insertions(+), 56 deletions(-) + +commit 0ff7954f9f09f80654ac91c16712154744a0dd2d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 22:04:40 2019 -0700 + + [meta] Add hb_is_trivial + + src/hb-meta.hh | 7 +++++++ + src/test-meta.cc | 4 ++++ + 2 files changed, 11 insertions(+) + +commit 7162a97bca6e0dde3d277701a3bf15688deef61d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 22:03:03 2019 -0700 + + [meta] Add hb_is_trivially_copyable() + + src/hb-meta.hh | 11 +++++++++++ + src/test-meta.cc | 4 ++++ + 2 files changed, 15 insertions(+) + +commit f2398f34c019a55d4f0e1a7031961714afadf2b3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 21:59:57 2019 -0700 + + [meta] Add is_trivially_destructible + + src/hb-meta.hh | 6 +++--- + src/test-meta.cc | 7 +++++-- + 2 files changed, 8 insertions(+), 5 deletions(-) + +commit 72cb5b8e52b7103c18adcb82cbcd4b91a2c85474 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 21:50:15 2019 -0700 + + Remove accidentally included include + + src/test-meta.cc | 3 --- + 1 file changed, 3 deletions(-) + +commit 086772e409759e8f1edd0e34f6f25374e51e9e10 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 21:49:25 2019 -0700 + + [meta] Add is_destructible + + src/hb-meta.hh | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit b14745278ad16fe7f4e838b685029e3fdda516ca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 21:42:59 2019 -0700 + + [met]a Add is_constructible, ... + + src/hb-meta.hh | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/test-meta.cc | 23 ++++++++++++++++++ + 2 files changed, 96 insertions(+) + +commit 19e08a146712dacd11359370c91a7bad55bc6f62 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 21:25:07 2019 -0700 + + [iter] Adjust source_of/sink_of + + src/hb-iter.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c0485e32a320e17dd0634b2cc8b4dd8c4fdc65e0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 21:03:14 2019 -0700 + + Use hb_void_t<> the way it's supposed to be used + + src/hb-null.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 40fb36a39de5dd3ee9a4c84f1f76205b6bb68660 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 21:01:19 2019 -0700 + + [meta] Minor + + src/hb-meta.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit f9a96a0a97f59a0b31ee0f901d1c21dde6b3cfaf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:56:16 2019 -0700 + + [meta] More rewrites + + src/hb-meta.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 5252677e53ff4473701172bbbd4e953ac6b08e6f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:49:52 2019 -0700 + + [meta] Rewrite hb_int_min/max + + src/hb-meta.hh | 44 ++++++++++++++++++++++---------------------- + 1 file changed, 22 insertions(+), 22 deletions(-) + +commit caa3f92e91062ff78b657aec23569b099de48640 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:43:51 2019 -0700 + + [meta] void_tt -> void_t + + src/hb-meta.hh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 7df3ecfb4069d275cd277c71165962bb5769364a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:43:26 2019 -0700 + + [meta] hb_void_t -> hb_empty_t + + src/hb-debug.hh | 6 +++--- + src/hb-meta.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 18 +++++++++--------- + 4 files changed, 14 insertions(+), 14 deletions(-) + +commit 149c3db8a2d41894b5d65f4c4b7c20757f6de6dd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:34:52 2019 -0700 + + [meta] Minor + + src/hb-meta.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 707ff5b59d3903b60312a028f2ba5d74c18db101 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:31:20 2019 -0700 + + Minor + + src/hb-meta.hh | 5 ----- + src/hb-open-type.hh | 2 +- + 2 files changed, 1 insertion(+), 6 deletions(-) + +commit ce300f4fb68a25d46d165e8b0a4825482c83a966 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:26:29 2019 -0700 + + [meta] Rewrite is_signed, add is_unsigned + + src/hb-meta.hh | 29 ++++++++++++----------------- + 1 file changed, 12 insertions(+), 17 deletions(-) + +commit e939d88bd72e0db0ebe357649b7a0fa3447c0bf4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:20:51 2019 -0700 + + [meta] Rewrite is_integral / is_floating_point, add is_arithmetic + + src/hb-meta.hh | 49 +++++++++++++++++++++++++++++++------------------ + 1 file changed, 31 insertions(+), 18 deletions(-) + +commit c3a456a26e8e5f8bc483b326f1928e9c603a7216 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:17:30 2019 -0700 + + [meta] Rewrite is_cr_convertible + + src/hb-meta.hh | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +commit b4ad6af9c4ec30c462078bd93ae12653619c5fea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:15:03 2019 -0700 + + [meta] Rewrite is_base_of + + src/hb-meta.hh | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 5a171ed3a69313e10df6e42a03affb5e8bfe8e95 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:11:29 2019 -0700 + + [null] Modernize template work + + src/hb-null.hh | 19 ++++++------------- + 1 file changed, 6 insertions(+), 13 deletions(-) + +commit 61d150c916d181cc3f333d0378108e08210370ad +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:06:31 2019 -0700 + + [meta] Add integral_constant, true_t -> true_type, false_t -> false_type + + src/hb-iter.hh | 20 ++++++++++---------- + src/hb-meta.hh | 17 ++++++++--------- + src/hb-null.hh | 4 ++-- + 3 files changed, 20 insertions(+), 21 deletions(-) + +commit 38e3a8bd531ef3d35ca0fbcfad09db3f83345038 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 20:03:14 2019 -0700 + + [meta] bool_tt -> bool_constant + + src/hb-meta.hh | 6 +++--- + src/hb-null.hh | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 3919ca41b5e657764c7f75dfdc21cf8ca20bd66f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 19:56:36 2019 -0700 + + [meta] Add is_floating_point + + src/hb-meta.hh | 33 +++++++++++++++++++-------------- + 1 file changed, 19 insertions(+), 14 deletions(-) + +commit 25bb7e005d96c367731fd8d129d764d101b1200f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 19:49:26 2019 -0700 + + [meta] Add is_signed for floating point types + + src/hb-meta.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit e0315b4aadb3fbc6b618de56d643471e8d1f7859 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 19:48:02 2019 -0700 + + [meta] is_integer -> is_integral + + src/hb-algs.hh | 2 +- + src/hb-map.hh | 4 ++-- + src/hb-meta.hh | 26 +++++++++++++------------- + 3 files changed, 16 insertions(+), 16 deletions(-) + +commit 9574de7a3e763b9c5eacf65b4b8c148724c00b82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 19:29:32 2019 -0700 + + [meta] Add add_const, add_pointer, add_lvalue_reference, add_rvalue_reference + + src/hb-meta.hh | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 2fb3a8327ab35248a0c7877c48422718cfbe375d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 18:40:29 2019 -0700 + + [vector] Simplify arrayZ + + Was turned into function when we had static ones and wanted to be + move-safe... Not the case anymore. + + src/hb-coretext.cc | 2 +- + src/hb-ot-cff-common.hh | 2 +- + src/hb-uniscribe.cc | 10 +++---- + src/hb-vector.hh | 71 ++++++++++++++++++++++--------------------------- + 4 files changed, 39 insertions(+), 46 deletions(-) + +commit 4d67743ffd99ed9f2278ab21adfac7eb314c0df0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 16:35:31 2019 -0700 + + [subset] Use more auto typing + + src/hb-ot-layout-common.hh | 8 ++++---- + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 4 ++-- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit a27a31b9ee2601a05575cb581dc227caa73742c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 16:26:19 2019 -0700 + + Minor + + src/hb-ot-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2ade0086286963ae2c65d44b94e63cb3836ce36b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 16:21:03 2019 -0700 + + [serialize] More rewrite + + src/hb-ot-layout-common.hh | 42 ++++++++++++++++++++++++------------------ + 1 file changed, 24 insertions(+), 18 deletions(-) + +commit 99ed6e29d86bbf391c12ee1f980b8af9dc35615e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 16:07:51 2019 -0700 + + [serialize] Fix a TODO + + src/hb-ot-layout-common.hh | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit d8a49b53e3676ad742bdb8edf0ec3ca6f7a7cac9 +Author: rsheeter <rsheeter@google.com> +Date: Fri May 10 16:52:43 2019 -0700 + + Update TESTING.md + + TESTING.md | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 25a5b287f220802728cd3312692f368c45d22862 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 16:01:39 2019 -0700 + + Fix sanitize fail of extension sublookups + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=960331 + + src/hb-ot-layout-common.hh | 10 ++++++++-- + src/hb-sanitize.hh | 2 ++ + ...uzz-testcase-minimized-harfbuzz_fuzzer-5702671124791296 | Bin 0 -> 94 bytes + 3 files changed, 10 insertions(+), 2 deletions(-) + +commit 9c0c3589f31106d1898f8922cc9a2e18cb054989 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 13:56:50 2019 -0700 + + Minor + + src/hb-ot-layout-common.hh | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit 5d773ec60029e1a6edec45c27ea918d9be4ea806 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 13:53:15 2019 -0700 + + Minor + + src/hb-ot-layout-gsubgpos.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ac737f8c9e7cbc81cdb5a0542a2494671f236895 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 13:51:12 2019 -0700 + + Minor again + + src/hb-ot-layout-gsubgpos.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5d4437fad0f99508ebd5c026a3d927f5d649615e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 13:43:29 2019 -0700 + + Minor + + src/hb-ot-layout-common.hh | 1 - + 1 file changed, 1 deletion(-) + +commit cd9bc732a75c716121a86e39ab588d2e0af58eba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 13:17:41 2019 -0700 + + [gsubgpos] Minor + + src/hb-ot-layout-gsubgpos.hh | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit 6d63e27ca41b12ba2e8fb22fd6bc44417651c518 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 11:53:02 2019 -0700 + + Generate tarball in .xz instead of .bz2 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1662 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1d870cce68f7033f6d3967ce4e9ba622a6fafe79 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 11:32:59 2019 -0700 + + Fix bot + + Any way to catch these? + + src/test-meta.cc | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 30e4ae6bd19bf297b029205b5f86c1a0ae14943d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 11:26:39 2019 -0700 + + [meta] Add hb_is_base_of + + src/hb-meta.hh | 7 +++++++ + src/test-meta.cc | 16 ++++++++++++++++ + 2 files changed, 23 insertions(+) + +commit 98974ac16f5caf282c9c7cf0c417b494efd6af1d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 10 11:18:52 2019 -0700 + + [iter] Adjust is_source_of / is_sink_of + + There are two cases that we accept. Encode both. + + src/hb-iter.hh | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 1b58bf22ca70908bb578910757795ee32d48b65a +Author: rsheeter <rsheeter@google.com> +Date: Thu May 9 20:06:29 2019 -0700 + + Update TESTING.md + + TESTING.md | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit ed972d5d73ba0592e1ba92426adf2a8f67acf9c9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 16:58:28 2019 -0700 + + [iter] Rewrite test functions + + Notably, add hb_is_source_of(,) and hb_is_sink_of(,) to replace most + uses of hb_is_iterator_of(,). + + src/hb-iter.hh | 65 +++++++++++++++++++++++++++++----------------- + src/hb-open-type.hh | 7 +++-- + src/hb-ot-layout-common.hh | 6 ++--- + src/hb-ot-name-table.hh | 2 +- + src/test-iter.cc | 2 +- + 5 files changed, 49 insertions(+), 33 deletions(-) + +commit 42901d7af91b4c5cffee9752f653447e4f4bd4f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 16:22:08 2019 -0700 + + Minor + + src/hb-meta.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 322627ae1daa16f62f7a91c3c3ed02eb5b708ca5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 16:08:10 2019 -0700 + + Whitespace + + src/hb-array.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 489f3c35bddb22cfe40c45d3a5c1cb6d88ccaf1f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 15:39:32 2019 -0700 + + Fix bot + + src/test-meta.cc | 70 ++++++++++++++++++++++++++++---------------------------- + 1 file changed, 35 insertions(+), 35 deletions(-) + +commit 790315e0dbc0ce796f0081a60953f74bd3fbdb63 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 15:31:24 2019 -0700 + + [algs] Implement implicit casting between compatible pair types + + src/hb-algs.hh | 5 +++++ + src/test-algs.cc | 3 +++ + 2 files changed, 8 insertions(+) + +commit 69d9114b5372c1fcea5f20e75a187158c31c52f8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 15:24:14 2019 -0700 + + [meta] Rewrite hb_is_cr_converitble + + src/hb-meta.hh | 22 ++++++++++------------ + 1 file changed, 10 insertions(+), 12 deletions(-) + +commit ceda1f03b7b06248ffd056eb7b2400088bb4a121 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 15:19:42 2019 -0700 + + Fix compile + + NameRecord is not copy-constructible, so should be iterator of + const-reference. + + src/hb-meta.hh | 2 -- + src/hb-ot-name-table.hh | 2 +- + src/test-meta.cc | 12 ++++++++++++ + 3 files changed, 13 insertions(+), 3 deletions(-) + +commit 3686c3b65c017cf8689b67db440b4cddd399538b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 15:09:07 2019 -0700 + + Adjust is_cr_convertible + + If To is const& then From doesn't need to be &. + + src/hb-meta.hh | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 726002a6a615e2d213186d402cca4e8d7e7a7f58 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 14:53:02 2019 -0700 + + [iter] Make hb_is_iterator_of() check is_convertible + + Instead of is_cr_convertible. + + src/hb-array.hh | 8 ++++---- + src/hb-iter.hh | 2 +- + src/hb-meta.hh | 8 ++++---- + 3 files changed, 9 insertions(+), 9 deletions(-) + +commit 70a49f2e4a9ab05fe04d1949bbf7a128d14a1284 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 14:35:15 2019 -0700 + + [meta] Add hb_conditional<> and hb_is_convertible() + + src/Makefile.am | 6 ++++- + src/hb-meta.hh | 56 +++++++++++++++++++++++++++++++++++++-------- + src/test-meta.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 121 insertions(+), 11 deletions(-) + +commit 5e3cbed048b19ee579277ab4c56167a15d13104e +Author: Garret Rieger <grieger@google.com> +Date: Wed May 8 16:33:03 2019 -0700 + + [subset] Switch building of glyph maps in subset plan to use iterators. + + src/hb-algs.hh | 4 +--- + src/hb-subset-plan.cc | 52 +++++++++++++++++++++++++-------------------------- + 2 files changed, 27 insertions(+), 29 deletions(-) + +commit 971020eca7c5d576816b93431607f1e63e9584a4 +Author: Garret Rieger <grieger@google.com> +Date: Wed May 8 16:31:52 2019 -0700 + + Add sink support for hb_hashmap_t and a reverse call to hb_pair_t. + + src/hb-algs.hh | 5 +++++ + src/hb-map.hh | 4 ++++ + 2 files changed, 9 insertions(+) + +commit 98eec3dd5f527cc562d98784429db0c7269e82a8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 13:15:36 2019 -0700 + + Add hb_pair_t(,) macro as alternative to hb_pair_t<,> + + Just so it's easier to use it in other macros. + + src/hb-algs.hh | 1 + + 1 file changed, 1 insertion(+) + +commit c9b287a867d6130a0cc745d7fd3ccfa4dcb4c32e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 12:43:57 2019 -0700 + + Add hb_lidentity(), and rename hb_rvalue() to hb_ridentity() + + src/hb-algs.hh | 13 ++++++++++++- + src/hb-map.hh | 4 ++-- + src/test-iter.cc | 2 +- + 3 files changed, 15 insertions(+), 4 deletions(-) + +commit 00195a22ce5198345cb39825a45863cef7d8f7fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 12:14:36 2019 -0700 + + [hdmx] Adjust to hb_iota() behavior change + + Use hb_range() instead. + + src/hb-ot-hdmx-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4f2ad75a839708de71e7341f23c2d4b72059fc58 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 12:07:45 2019 -0700 + + [enumerate] Fix hb_enumerate() len for step=0 + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5da3c9c33f02010a3fc57cf0e1d07955af681e7c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:30:31 2019 -0700 + + [iter] Fix hb_zip() end condition + + We should compare-equal to end if either iterator's end reaches, + not if both reach at the same time. Fixes infinite-loop in test + which was happening after hb_enumerate() switched to using hb_zip(). + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 57a5256fbcef6e5d29fc40cf019cc4b2c29c9dcf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:30:27 2019 -0700 + + [iter] Minor + + src/hb-iter.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 12dd56f8573cb86169580d5ac31b986208805c03 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:25:02 2019 -0700 + + [iter] Minor + + src/hb-iter.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 57d545932f539d06c52862310ecdfe79c143bb6b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:23:41 2019 -0700 + + [test-iter] Don't walk past end + + That's not legal. + + src/test-iter.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 46837910e628248edc09e45e212532a3493905da +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:20:41 2019 -0700 + + [iter] Allow negative step in hb_iota() + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 087327af1eac8c3a16115904557cbf3ab0f28072 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:14:06 2019 -0700 + + [iter] Minor + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 64f0899a9f5e5aff65c5a78fa796ceae6f35c008 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:10:31 2019 -0700 + + [iter] Bug fix + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5d263556b95047bced88e4a6252178d2fc0f9a19 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:08:25 2019 -0700 + + [iter] Fix + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2c24ea37b1ef63f79fcc24752dd180ce53540eda +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:07:38 2019 -0700 + + [iter] Take start value in hb_enumerate() + + Also rewrite it via composition. + + src/hb-iter.hh | 61 ++++++++++++-------------------------------------------- + src/test-iter.cc | 1 + + 2 files changed, 14 insertions(+), 48 deletions(-) + +commit 7675d0d3a6cc13ade1a2047019ef7fac8c373a3c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:02:56 2019 -0700 + + [iter] Add hb_range() + + hb_range() is like Python range. hb_iota() has slightly different API. + Ie. it takes a start, instead of end. + + src/hb-iter.hh | 29 ++++++++++++++++++----------- + src/test-iter.cc | 19 +++++++++++-------- + 2 files changed, 29 insertions(+), 19 deletions(-) + +commit 05867d9f5315c7e4f49e5873a5aba6bba7121f04 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 11:00:43 2019 -0700 + + [meta] Add hb_int_max() + + src/hb-meta.hh | 91 ++++++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 56 insertions(+), 35 deletions(-) + +commit 71537f93e0ce27121012bf1e81270b6b03b22224 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 9 10:46:49 2019 -0700 + + [iota] end -> end_ to not shadow + + src/hb-iter.hh | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 6bc82579100992e3f04c11f36b9c2f0014d880f2 +Merge: 34764454 6d9a86ae +Author: n8willis <n8willis@users.noreply.github.com> +Date: Thu May 9 14:39:05 2019 +0100 + + Merge pull request #1680 from n8willis/usermanual-obj + + Usermanual: object-model chapter + +commit 3476445420d0e6432c09710b6667205453799129 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 21:14:01 2019 -0700 + + Remove unnecessary template keyword + + Should fix MSVC. + + src/hb-array.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2a51ff7264940312197184318f5ad4ec971492f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 16:41:39 2019 -0700 + + Remove unused var + + src/hb-open-type.hh | 1 - + 1 file changed, 1 deletion(-) + +commit e8b45c19330d8718cd6d7aef0ca2db0539a53294 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 16:37:38 2019 -0700 + + [array] Add .copy() + + src/hb-array.hh | 11 +++++++++++ + src/hb-open-type.hh | 10 ++++------ + src/hb-serialize.hh | 2 +- + 3 files changed, 16 insertions(+), 7 deletions(-) + +commit afb013f350b0022ae6c05f140aeba23d5de34101 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 16:16:43 2019 -0700 + + Fix msan issue + + hb_identity returns rvalue-reference if input is rvalue. That, can leak + the reference and cause in bad access to temporaries after they are + destructed. This is unfortunately unfixable given the desired + transparency of hb_identity :(. Just don't use it with hb_map(). + + src/test-iter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4c94bc63d914fac7e11940eb165b6cf1039ba5a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 15:57:33 2019 -0700 + + Move hb_invoke() back to hb-algs.hh + + src/hb-algs.hh | 32 ++++++++++++++++++++++++++++++++ + src/hb-meta.hh | 32 -------------------------------- + 2 files changed, 32 insertions(+), 32 deletions(-) + +commit b710176ce28e863a01797987d7ce37d19aaf2fd3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 15:46:51 2019 -0700 + + [hdmx] Touch up + + src/hb-ot-hdmx-table.hh | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +commit e8ef0e627c493af700e254bdd2767f8955f2d03f +Author: Garret Rieger <grieger@google.com> +Date: Tue May 7 17:23:02 2019 -0700 + + [subset] WIP convert hdmx subsetting to use iterators. + + src/hb-ot-hdmx-table.hh | 121 +++++++++++++++++++------------------------- + test/api/test-subset-hdmx.c | 23 --------- + 2 files changed, 51 insertions(+), 93 deletions(-) + +commit d5decf9bf77db914b67ffc446379df621516e362 +Author: Garret Rieger <grieger@google.com> +Date: Tue May 7 15:47:38 2019 -0700 + + [subset] Move hdmx to subset2. + + src/hb-ot-hdmx-table.hh | 36 ++++++------------------------------ + src/hb-subset.cc | 2 +- + 2 files changed, 7 insertions(+), 31 deletions(-) + +commit 27b2093009745b6c30663605f45ac95deb1562cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 15:32:57 2019 -0700 + + [map] Return rvalues from keys()/values() + + src/hb-algs.hh | 7 +++++++ + src/hb-map.hh | 2 ++ + 2 files changed, 9 insertions(+) + +commit 372c5b97bfa3b744de1d017cf662607eb8a2fa6e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 15:28:39 2019 -0700 + + [map] Fix bots + + Older compilers don't like calling iter() from return-type decltype() + + ../src/hb-map.hh:226:12: error: cannot call member function 'decltype ((((+ hb_array(((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::items, (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask ? (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask + 1) : 0))) | hb_filter((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: is_real))) | hb_map((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: get_pair)))) hb_hashmap_t<K, V, kINVALID, vINVALID>::iter() const [with K = const hb_serialize_context_t::object_t*; V = unsigned int; K kINVALID = 0u; V vINVALID = 0u; decltype ((((+ hb_array(((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::items, (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask ? (((const hb_hashmap_t<K, V, kINVALID, vINVALID>*)this)->hb_hashmap_t<K, V, kINVALID, vINVALID>::mask + 1) : 0))) | hb_filter((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: is_real))) | hb_map((& hb_hashmap_t<K, V, kINVALID, vINVALID>::item_t:: get_pair)))) = hb_map_iter_t<hb_filter_iter_t<hb_array_t<hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t>, bool (hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t::*)() const, const<anonymous struct>&, 0u>, hb_pair_t<const hb_serialize_context_t::object_t*, unsigned int> (hb_hashmap_t<const hb_serialize_context_t::object_t*, unsigned int, 0u, 0u>::item_t::*)() const, 0u>]' without object + + iter() + ^ + ../src/hb-meta.hh:58:41: note: in definition of macro 'HB_AUTO_RETURN' + #define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); } + ^ + + src/hb-map.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit a30482718491e3455365167e1c85981c8c0f542b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 15:08:10 2019 -0700 + + [map] Add .values() iterator + + src/hb-map.hh | 6 +++++- + src/test-iter.cc | 8 ++++++++ + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit 3c69505b3a7850b68a931849a2badb84b6b36d51 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 15:05:10 2019 -0700 + + [map] Fix iter + + src/hb-map.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5ceaafa5de8dff51fe91f7008a12ec9c304a1376 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 14:59:25 2019 -0700 + + [algs] Fix identity return type + + src/hb-algs.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit f5705d7656817cbfdbc4479b1cb0be3af6f4abdf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 14:46:55 2019 -0700 + + Whitespace + + src/hb-map.hh | 10 +++++----- + src/test-iter.cc | 11 +++++++---- + 2 files changed, 12 insertions(+), 9 deletions(-) + +commit a17f0fa3a10a25959561582ae63ef2e5208647e2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 14:44:11 2019 -0700 + + [meta] Capture rvalue-references in is_reference / remove_reference + + src/hb-meta.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 7166bd563447a64eda05c66668bd4a178292bd79 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 14:24:57 2019 -0700 + + Minor + + src/hb-open-type.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b827181ba1f539c990e1bd8fdd3559f1589c8d28 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 13:51:11 2019 -0700 + + [map] tweak test-iter.cc + + src/hb-map.hh | 1 - + src/test-iter.cc | 2 +- + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit 492af0f1bf1d7198b474fda2faca451908af267f +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 12:47:18 2019 -0700 + + [map] add keys() + + src/hb-map.hh | 9 ++++++++- + src/test-iter.cc | 4 ++++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit ba60512813caafc2006b26214e95bbfe1c0e460a +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 12:09:10 2019 -0700 + + [map] add a test for iteration + + src/hb-map.hh | 2 +- + src/test-iter.cc | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 183b8094b577dcb7f40b7fcd64b60d405845897a +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 11:40:31 2019 -0700 + + [map] add iteration + + src/hb-map.hh | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit df237d2fe78086ad16bdbd2cc60639ae9ce909d6 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed May 8 14:17:14 2019 -0700 + + [test] Add https://crbug.com/oss-fuzz/14641 testcase + + As 503748d fix + + ...-testcase-minimized-hb-subset-fuzzer-5676773460672512 | Bin 0 -> 2172 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 02ae2591d930563cec8c3c63086afb0a3a12c4aa +Author: Michiharu Ariza <ariza@adobe.com> +Date: Wed May 8 13:44:03 2019 -0700 + + initialize return param subr_num in popSubrNum + + also snake_cased popSubrtNum and other surrounding function names + + src/hb-cff-interp-cs-common.hh | 15 ++++++++------- + src/hb-subset-cff1.cc | 4 ++-- + src/hb-subset-cff2.cc | 4 ++-- + 3 files changed, 12 insertions(+), 11 deletions(-) + +commit 503748d8a80dd5db450c8c4dc109f2b97049d989 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 12:45:02 2019 -0700 + + [name] Sanitize records for reals + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14641 + + src/hb-ot-name-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5875d775e1253c0e14b900539c28c2de881da7aa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 12:25:34 2019 -0700 + + [iter] Rename hb_iter_t() to hb_iter_type<> and add hb_item_type<> + + src/hb-iter.hh | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit bad16066392e4dbdd8490a4b1c70d1dcddcc8ec8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 12:11:52 2019 -0700 + + [map] Make .has() optionally return value + + src/hb-map.hh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 750d5af48e38627c3c84a2f3857a7ee602221e24 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 12:01:55 2019 -0700 + + Make compiler happy with -Og + + src/hb-cff-interp-cs-common.hh | 2 +- + src/hb-ot-cmap-table.hh | 6 +++--- + src/hb-ot-glyf-table.hh | 2 +- + src/hb-subset-glyf.cc | 4 ++-- + 4 files changed, 7 insertions(+), 7 deletions(-) + +commit cdb61eb0431d426f7152f975e89ee3ba4431083f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 11:00:18 2019 -0700 + + [iter] Accept pointer in hb_iter() and hb_iter_t() + + src/hb-iter.hh | 4 ++-- + src/test-iter.cc | 3 +++ + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit c93eeba9b21cb8f8ba64ebaf284bf9c8a8544886 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 10:56:09 2019 -0700 + + [iter] Accept pointer in hb_map() + + src/hb-iter.hh | 4 ++-- + src/test-iter.cc | 7 ++++++- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 4c9e0c37a34e8355d752af39507b310f473bffa5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 10:40:39 2019 -0700 + + [serialize] LangSys subset->copy + + src/hb-ot-layout-common.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 50dc3e7d9f4f290c7353313c5e5f888cb7c4846d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 10:35:02 2019 -0700 + + Add hb_iota() + + src/hb-iter.hh | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ + src/test-iter.cc | 10 ++++++++++ + 2 files changed, 61 insertions(+) + +commit aa4ac13f0be34bba66b00d04fd7806c474ff59c0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 10:02:30 2019 -0700 + + [iter] Actually fix previous commit + + The iter objects shouldn't not be const. D'oh. + + src/hb-iter.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit a66598e0306fe80063c5d6a678bbca4a931bc4d4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 09:56:29 2019 -0700 + + [iter] For ref-qualified variants + + src/hb-iter.hh | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit fa576ce1874fd886688bf3f16b714d86aebb07ec +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 09:53:58 2019 -0700 + + Update README.md + + README.md | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit d109c9e767ff3198d51e23a7ac8931d0bc4d5d72 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 09:53:29 2019 -0700 + + Update README.md + + README.md | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4063181791d6b3efb35e7c748dee12273e64ebd4 +Author: rsheeter <rsheeter@google.com> +Date: Wed May 8 09:47:34 2019 -0700 + + [docs] add fuzzer instructions (courtesy of Garret) + + TESTING.md | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 00946ca3aa45f109c455871ce89c5872fd243624 +Author: Roderick Sheeter <rsheeter@rsheeter-macbookpro2.roam.corp.google.com> +Date: Wed May 8 09:42:35 2019 -0700 + + [docs] add sample commands for test exec + + README.md | 4 ++++ + TESTING.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 51 insertions(+) + +commit 8479eb5955c93cbc8951d0319b2fe43ff19cc403 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 09:48:55 2019 -0700 + + [iter] Fix hb_sink() to accept rvalue + + src/hb-iter.hh | 2 +- + src/test-iter.cc | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 710d459acac88fd784d4ead0ba75b9aa623c48d4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 09:33:09 2019 -0700 + + [iter] Default predicates to hb_identity instead of hb_bool + + The bool conversion happens after predicate is called automatically. + + src/hb-iter.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit fe14a4000a58528878bcc75fde0972de2b779316 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 09:32:19 2019 -0700 + + Adjust hb_all/any/none + + src/hb-iter.hh | 18 +++++++++--------- + src/test-iter.cc | 10 ++++++---- + 2 files changed, 15 insertions(+), 13 deletions(-) + +commit 4a101d8ffccd6f907f16ef190125ded5e27e0d8b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 09:16:33 2019 -0700 + + Add hb_match + + src/hb-algs.hh | 30 +++++++++++++++++++++++++++++- + 1 file changed, 29 insertions(+), 1 deletion(-) + +commit 26adefd9eaf4bc1d80b1ffececf0d86f3308f9ee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 09:14:44 2019 -0700 + + [algs] Try f[v] in hb_get() as last resort + + src/hb-algs.hh | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 0601a19d38b2b0fc5dd36fd821af634a49322ebf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed May 8 07:47:36 2019 -0700 + + Fix a few more double-pomotion errors + + src/hb-coretext.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 2ba984fcbbef4561d35c3a2c502610c38b26f4fb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 23:28:22 2019 -0700 + + Fix signed comparison on 32bit + + src/hb-sanitize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dfc57802450360f06026668b7b61495aaa2d1943 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 23:26:09 2019 -0700 + + Fix more double-promotion errors + + WHy do only some of the clang bots catch this I have no idea :(. + + src/hb-aat-layout-trak-table.hh | 4 ++-- + src/hb-font.hh | 2 +- + src/hb-open-type.hh | 4 ++-- + src/hb-ot-color-cbdt-table.hh | 12 ++++++------ + src/hb-ot-color-sbix-table.hh | 10 +++++----- + src/hb-ot-layout-gpos-table.hh | 20 ++++++++++---------- + 6 files changed, 26 insertions(+), 26 deletions(-) + +commit c2c9d204fa5c2189e369726276a1c0e92e09a9ce +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 23:13:38 2019 -0700 + + Fix double-promotion warnings + + Make it an error. + + src/hb-ot-var-fvar-table.hh | 12 ++++++------ + src/hb.hh | 1 + + 2 files changed, 7 insertions(+), 6 deletions(-) + +commit 2c7093ed01f417828d5521d983eae63042363197 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 23:10:59 2019 -0700 + + More tests + + src/test-algs.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 56d2d0294b836ea1e2dea9e242ae72c99387d00a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 23:08:49 2019 -0700 + + [algs] Sprinkle hb_min/max with hb-forward salad + + Let's see if fixes MSVC fail. Though, the error doesn't make sense to me. + + hb-blob.cc + c:\projects\harfbuzz\src\hb-algs.hh(166): error C2440: 'return': cannot convert from 'unsigned int' to 'unsigned int &&' [C:\projects\harfbuzz\build\harfbuzz.vcxproj] + c:\projects\harfbuzz\src\hb-algs.hh(166): note: You cannot bind an lvalue to an rvalue reference + c:\projects\harfbuzz\src\hb-algs.hh(174): note: see reference to function template instantiation 'T &&<unnamed-type-hb_min>::impl<T,unsigned int&>(T &&,T2) const' being compiled + with + [ + T=unsigned int, + T2=unsigned int & + ] + + src/hb-algs.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit bdbfdc92b58d5c9f8654e430075dab543d1ba394 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 22:52:43 2019 -0700 + + [iter] Add value and projection to hb_all/any/none + + Allows for eg, checking all values equal 2: hb_all (it, 2). + + src/hb-iter.hh | 24 ++++++++++++++++++------ + src/test-iter.cc | 10 +++++++++- + 2 files changed, 27 insertions(+), 7 deletions(-) + +commit cf61acb9eaa2bb3fe479a9050116b4b96934e3ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 22:45:01 2019 -0700 + + [iter] Accept rvalues to hb_enumerate() + + src/hb-iter.hh | 2 +- + src/test-iter.cc | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit e8bd5fc3fa2cc5c5f8f254629553902aed3496ba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 22:29:40 2019 -0700 + + [meta] Move hb_invoke from algs to meta + + src/hb-algs.hh | 31 ------------------------------- + src/hb-meta.hh | 32 ++++++++++++++++++++++++++++++++ + 2 files changed, 32 insertions(+), 31 deletions(-) + +commit af571dbffc12e6bb7a3146762d12bb4ac3f19bdc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 21:39:20 2019 -0700 + + [meta] Replace most hb_enable_if with hb_requires + + They do absolutely same thing. hb_requires is to encode constraints, + whereas hb_enable_if is for more conditional enabling. + + src/hb-iter.hh | 63 +++++++++++++++++++++------------------------- + src/hb-open-type.hh | 6 ++--- + src/hb-ot-layout-common.hh | 6 ++--- + src/test-iter.cc | 6 ++--- + 4 files changed, 37 insertions(+), 44 deletions(-) + +commit 6fa1f38070e710b2f80a836bd633b6ab33e1bc80 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 21:33:26 2019 -0700 + + [algs] Accept varargs in hb_min/max + + src/hb-algs.hh | 24 +++++++++++++++++++++--- + src/test-algs.cc | 8 ++++++++ + 2 files changed, 29 insertions(+), 3 deletions(-) + +commit 1ad07080c3ea7f6a1b3cb247529ec0c78575a6d3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 21:00:23 2019 -0700 + + Rename + + src/hb-algs.hh | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 83e3eabd84e2b53c696768d1357a6a259bcd3576 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 20:58:43 2019 -0700 + + Whitespace + + src/hb-aat-layout-common.hh | 2 +- + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-algs.hh | 6 +++--- + src/hb-dispatch.hh | 2 +- + src/hb-open-type.hh | 18 +++++++++--------- + src/hb-ot-kern-table.hh | 4 ++-- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 16 ++++++++-------- + src/hb-ot-layout-gsub-table.hh | 14 +++++++------- + src/hb-ot-layout-gsubgpos.hh | 8 ++++---- + src/hb-sanitize.hh | 6 +++--- + src/hb-serialize.hh | 12 ++++++------ + src/hb-subset.hh | 6 +++--- + 14 files changed, 50 insertions(+), 50 deletions(-) + +commit 2b9402a86a4e37e6386f8028bdf3789ae262a4c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 20:55:33 2019 -0700 + + Use universal references in hb_min/max + + src/hb-algs.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 41248cce0e32653227a83eb4e42ccf793f040fc2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 20:54:31 2019 -0700 + + Remove MIN/MAX in favor of hb_min/hb_max + + src/hb-aat-layout-common.hh | 8 ++++---- + src/hb-aat-layout-feat-table.hh | 2 +- + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 18 +++++++++--------- + src/hb-algs.hh | 14 +++++--------- + src/hb-array.hh | 4 ++-- + src/hb-blob.cc | 2 +- + src/hb-buffer-serialize.cc | 32 ++++++++++++++++---------------- + src/hb-buffer.cc | 4 ++-- + src/hb-buffer.hh | 2 +- + src/hb-common.cc | 20 ++++++++++---------- + src/hb-coretext.cc | 6 +++--- + src/hb-debug.hh | 2 +- + src/hb-directwrite.cc | 2 +- + src/hb-ft.cc | 2 +- + src/hb-iter.hh | 2 +- + src/hb-open-file.hh | 2 +- + src/hb-open-type.hh | 2 +- + src/hb-ot-cmap-table.hh | 8 ++++---- + src/hb-ot-color-cbdt-table.hh | 6 +++--- + src/hb-ot-color-cpal-table.hh | 2 +- + src/hb-ot-color-sbix-table.hh | 2 +- + src/hb-ot-glyf-table.hh | 14 +++++++------- + src/hb-ot-hmtx-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 4 ++-- + src/hb-ot-layout-gsubgpos.hh | 6 +++--- + src/hb-ot-layout.cc | 2 +- + src/hb-ot-map.cc | 8 ++++---- + src/hb-ot-post-table.hh | 2 +- + src/hb-ot-shape-complex-indic.cc | 8 ++++---- + src/hb-ot-shape-complex-use.cc | 2 +- + src/hb-ot-shape.cc | 4 ++-- + src/hb-ot-tag.cc | 2 +- + src/hb-ot-var-avar-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 18 +++++++++--------- + src/hb-sanitize.hh | 4 ++-- + src/hb-uniscribe.cc | 2 +- + 38 files changed, 111 insertions(+), 115 deletions(-) + +commit 5c0f62adc969696b46c1ceb57cd3c2fa408eb94f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 17:23:46 2019 -0700 + + [serializer] Accept pointer & reference in more methods + + src/hb-serialize.hh | 39 ++++++++++++++++++++++++--------------- + 1 file changed, 24 insertions(+), 15 deletions(-) + +commit 839618de3b3da285e8753b6ca6d767e9a483bfde +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 17:21:27 2019 -0700 + + [serializer] Minor + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 035b818e34bbd2d5c1f65328c9847c845d74d919 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 17:21:18 2019 -0700 + + [meta] Fix addressof() + + src/hb-meta.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7654ebe3a51c98b4d3bf6fb11779024f1c770962 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 16:53:03 2019 -0700 + + Whitespace + + src/hb-algs.hh | 30 ++++++++++++++++++++---------- + src/hb-iter.hh | 39 ++++++++++++++++++++++++++------------- + src/hb-meta.hh | 11 ++++++----- + 3 files changed, 52 insertions(+), 28 deletions(-) + +commit 95426ea983bde01fadf4681926cb77e3b3c0d40a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 15:56:51 2019 -0700 + + Add comment + + src/hb-open-type.hh | 1 + + 1 file changed, 1 insertion(+) + +commit e33ad252222481a6078a8bb423505e713b081313 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 15:46:24 2019 -0700 + + [serialize] FeatureVariations subset->copy + + src/hb-ot-layout-common.hh | 6 +++--- + src/hb-ot-layout-gsubgpos.hh | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit fa8c4ba81175f671c3f39f1586d0a1d9067d9f89 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 14:26:03 2019 -0700 + + Minor + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c09d6c58e99dba50f29a569e4c53916b5b507ef1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 14:09:00 2019 -0700 + + [iter] Require lvalue in operators that return reference + + src/hb-iter.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 52f6c04c1e0eab2aaa0c7d817b212c01ba993fe9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 13:45:48 2019 -0700 + + Minor + + src/hb-serialize.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7c037bd2be2e794dfd882b806f684ad74c56dbb8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 13:37:43 2019 -0700 + + [name] Clean up some more + + src/hb-meta.hh | 2 ++ + src/hb-ot-name-table.hh | 30 ++++++++++++++---------------- + 2 files changed, 16 insertions(+), 16 deletions(-) + +commit f982b9d9f8d6b61efd2a3e89cc3d34923c1914b0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 13:29:01 2019 -0700 + + [name] Clean up serialize() API + + src/hb-ot-name-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 59ee61fddc76cd18f19f351bca7dd293eb610333 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 13:26:15 2019 -0700 + + [name] Use iterators more + + src/hb-ot-name-table.hh | 46 +++++++++++++++------------------------------- + src/hb-subset-plan.cc | 3 +++ + 2 files changed, 18 insertions(+), 31 deletions(-) + +commit 2eb7e0e0e923d096d2598133cacd6e5ee04a6a04 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 12:45:38 2019 -0700 + + [serialize] Minor + + src/hb-serialize.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 1c81cff2d3f9df2c18ffbdfff02ed418560480c1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:51:10 2019 -0700 + + Fix signed-comparison error on 32bit + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 938de315756e08bd2b5fa816c7951640e5835b2e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:47:02 2019 -0700 + + Comment + + src/hb-subset-glyf.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 159fe962e90dd3b758ad10046b9d75cf87c1d4f3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:46:11 2019 -0700 + + [doc] Make header search more resilient + + How stupid to scan all files... Sigh. + + docs/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9b05db33b54e6e5f0b4658f4c06e7fe563f8923b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:39:44 2019 -0700 + + [ragel] Regenerate ragel-generated files using ragel 7.0.0.11 May 2018 + + src/hb-buffer-deserialize-json.hh | 1051 +++++------ + src/hb-buffer-deserialize-text.hh | 1009 +++++------ + src/hb-ot-shape-complex-indic-machine.hh | 2678 ++++++++++++++++------------ + src/hb-ot-shape-complex-khmer-machine.hh | 709 ++++---- + src/hb-ot-shape-complex-myanmar-machine.hh | 820 +++++---- + src/hb-ot-shape-complex-use-machine.hh | 1144 ++++++------ + 6 files changed, 3959 insertions(+), 3452 deletions(-) + +commit 521262b236dacf7b2b64e0a1d3c79d6a10b07063 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:08:08 2019 -0700 + + [subset] Add TODO + + src/hb-subset.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit e6a622b5b202533d64f83e71d7ff8a8104d46e26 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:06:43 2019 -0700 + + [serialize] Enable bias assertion + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 530ddbbc320bd24b4902ee6d49bf80242a591794 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:05:51 2019 -0700 + + [serialize] Use range-based loop + + src/hb-serialize.hh | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit 0987c4204fae66f80224c6f01d9c5dc3abe809e0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 11:01:02 2019 -0700 + + [name] Remove dead code + + src/hb-ot-name-table.hh | 88 +------------------------------------------------ + 1 file changed, 1 insertion(+), 87 deletions(-) + +commit 5ac4ab686809be9352e91bc3213e1edf3ba66a93 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:29:07 2019 -0700 + + [subset] fix for name table serializing with new serializer machinery + + src/hb-ot-name-table.hh | 8 ++++++-- + test/api/fonts/nameID.expected.ttf | Bin 170696 -> 2388 bytes + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit c548fcedc404c03442c042059a71194d97d23bb6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:29:07 2019 -0700 + + [WIP] [name] Port to fancy serializer machinery + + src/hb-ot-name-table.hh | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit fa2d97161f8b7de3d7a70e06d41b6f7e154012ad +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 00:34:50 2019 -0700 + + Remove use of deprecated implicit copy/move assignment operators + + By removing custom copy constructor. + + src/hb-meta.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 45f5e56236912359d0ac72310dcdba9259cfee66 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 00:33:32 2019 -0700 + + Warn on -Wdeprecated + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit c3e0eafc80481f8c16516fdae1841c563e7253d4 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue May 7 12:04:00 2019 +0430 + + [ci] Upgrade Ubuntu 17.10 bots to 19.04 + + .circleci/config.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8903040fcd09e7d7ad5112ac2a583718bb85795d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 00:13:11 2019 -0700 + + Actually make it work + + src/hb-iter.hh | 2 ++ + src/hb-meta.hh | 6 ++++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 025eaa3c81214cdb20f2f588bab665512d21507c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 00:05:37 2019 -0700 + + [iter] Make filter/map copyable + + src/hb-iter.hh | 18 +++++++++--------- + src/test-iter.cc | 4 ++-- + 2 files changed, 11 insertions(+), 11 deletions(-) + +commit 03a68165d8296ed5cc0eb2434500381419409e79 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue May 7 00:03:35 2019 -0700 + + [meta] Add hb_reference_wrapper<> + + Functionality kinda superset of std:: counterpart. + + src/hb-meta.hh | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit 0bf86d9c5dcb0de206b38c3cf1824d2254376f37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 6 23:39:26 2019 -0700 + + Whitespace + + src/hb-meta.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 72eb91deb9eb7a08e38e100a3234518651fe4cb8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 6 23:39:13 2019 -0700 + + Add hb_ref() + + Unused. + + src/hb-meta.hh | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 240f57e58d3b0161feb90621d5db9e2fc4d99b27 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 6 23:17:39 2019 -0700 + + Rename hb_deref_pointer() to hb_deref() + + src/hb-algs.hh | 12 ++++++------ + src/hb-map.hh | 2 +- + src/hb-meta.hh | 2 +- + src/hb-serialize.hh | 2 +- + 4 files changed, 9 insertions(+), 9 deletions(-) + +commit 0b1ca5a13b6921cb4d00f8651bb99fc7c7037ec2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 6 23:04:32 2019 -0700 + + [iter] Adjust hb_filter + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4c2fd05ca5fa34303b986c34948b512d770ab8fe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 6 19:57:15 2019 -0700 + + [iter] Implement range-based for loops + + Part of https://github.com/harfbuzz/harfbuzz/issues/1648 + + src/hb-array.hh | 6 ++++ + src/hb-iter.hh | 74 ++++++++++++++++++++++++++++++++++++++++++++-- + src/hb-ot-layout-common.hh | 14 +++++++++ + src/hb-set.hh | 3 ++ + src/test-iter.cc | 28 ++++++++++++++---- + 5 files changed, 118 insertions(+), 7 deletions(-) + +commit e261dc3a4043230ae1b4f56e2cc7d3133b7da4ca +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue May 7 01:24:55 2019 +0430 + + Ignore -Wc++11-compat as we require C++11 actually + + pollutes gcc bots logs https://circleci.com/gh/harfbuzz/harfbuzz/85395 + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 9f9890e9e82c620e733d123f421f7c63d91ce8e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon May 6 12:16:51 2019 -0700 + + Remove HB_NO_OPTIONS in favor of HB_NO_GETENV + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-debug.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 36bb24f7b4dbbe171b945639bac749c46785e17c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 5 10:14:17 2019 -0700 + + [dispatch] Forward arguments in all dispatch multiplexers + + src/hb-aat-layout-kerx-table.hh | 14 ++++----- + src/hb-aat-layout-morx-table.hh | 14 ++++----- + src/hb-ot-kern-table.hh | 16 +++++----- + src/hb-ot-layout-common.hh | 6 ++-- + src/hb-ot-layout-gpos-table.hh | 68 ++++++++++++++++++++--------------------- + src/hb-ot-layout-gsub-table.hh | 58 +++++++++++++++++------------------ + src/hb-ot-layout-gsubgpos.hh | 32 +++++++++---------- + 7 files changed, 104 insertions(+), 104 deletions(-) + +commit c14efb8e68e31fb7537bcfe5eea779c0830a0b0c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 5 09:54:58 2019 -0700 + + Fix previous commit + + Priority should be given to specific over dispatch. Broke sanitize before. + This fixes it, by moving prioritization to the context implementation, since + the correct priority cannot be done in the dispatch implementation. Done + for subset and sanitize only, which need it. + + src/hb-aat-layout-common.hh | 2 +- + src/hb-dispatch.hh | 10 +--------- + src/hb-ot-layout-gsubgpos.hh | 14 +++++++------- + src/hb-sanitize.hh | 16 +++++++++++++--- + src/hb-subset.hh | 15 ++++++++++++--- + 5 files changed, 34 insertions(+), 23 deletions(-) + +commit b10f65933a77434bf8d68058793037f38a8ed5a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 5 09:23:35 2019 -0700 + + [dispatch] Use functionality from previous commit + + To remove a couple of unwanted wrapper methods + + src/hb-dispatch.hh | 15 +++++++++------ + src/hb-open-type.hh | 10 +++++----- + src/hb-ot-layout-gpos-table.hh | 6 ------ + src/hb-ot-layout-gsub-table.hh | 6 ------ + src/hb-sanitize.hh | 5 +++-- + src/hb-subset.hh | 5 +++-- + 6 files changed, 20 insertions(+), 27 deletions(-) + +commit ac350c92fd6b04845c6240a5f3b77ceaf29e51d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun May 5 09:10:46 2019 -0700 + + [dispatch] Try obj.dispatch(c) before trying c->dispatch(obj) + + src/hb-aat-layout-common.hh | 2 +- + src/hb-dispatch.hh | 13 +++++++++++++ + src/hb-ot-layout-gsubgpos.hh | 14 +++++++------- + src/hb-sanitize.hh | 2 +- + src/hb-subset.hh | 4 ++-- + 5 files changed, 24 insertions(+), 11 deletions(-) + +commit 0d5fd168f8e3c1202358a82161a28e407149b1b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri May 3 10:37:32 2019 -0700 + + Revert "[WIP] [name] Port to fancy serializer machinery" + + This reverts commit c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4. + + Don't know how it got to master! + + src/hb-ot-name-table.hh | 18 +++++++----------- + 1 file changed, 7 insertions(+), 11 deletions(-) + +commit 72e3eba8f87e2a8b145a4f98e24499f0aafe099b +Author: Cody Planteen <planteen@gmail.com> +Date: Thu May 2 13:03:15 2019 -0600 + + Add configuration option HB_NO_GETENV to disable use of getenv() + + src/hb.hh | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit c7f366fbbb208d0a9103ac4ee4ac00ff726c31e4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:29:07 2019 -0700 + + [WIP] [name] Port to fancy serializer machinery + + src/hb-ot-name-table.hh | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit 8855af38a8497d7788924d368baa9eeae4916940 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:26:06 2019 -0700 + + [name] Add NameRecord::copy() + + src/hb-ot-name-table.hh | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 097bb3f0af391dbb5d498df548b769f165f35c8a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:25:00 2019 -0700 + + [name] Minor changes + + src/hb-ot-name-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 431b6e1c449582619169722e16b472e872b02d58 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:22:32 2019 -0700 + + [serialize] Disable assertion for now + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8a32c9eecbdc907415195eca9ebad47c8acf2df5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:20:18 2019 -0700 + + [serialize] Misc getting copy() to work + + src/hb-open-type.hh | 16 +++++++++------- + src/hb-serialize.hh | 26 ++++++++++++++++---------- + 2 files changed, 25 insertions(+), 17 deletions(-) + +commit 7d497a3a92973d4cec14888b932091f49de1d190 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:20:03 2019 -0700 + + [debug] Allow return_trace() to return any type + + src/hb-debug.hh | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit 49b1c763a0459d586b7f0aa86eadd13d21b24867 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 16:19:34 2019 -0700 + + [test] Run "fonttools ttx" instead of "ttx" + + test/subset/run-tests.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 91176d5b778b44172591e82ba84127e5eff1372d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 15:12:07 2019 -0700 + + [serialize] Check offset base is within (possibly end of) object + + src/hb-serialize.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 0f1a6ce8268b197732aab40069bbda57eddac2e0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 15:03:41 2019 -0700 + + [name] Fix format of susbetted table to 0 + + src/hb-ot-name-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 87810fc958e28d0c5e05097b1b3fe78d962fdc62 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 14:45:57 2019 -0700 + + [name] Use variable forwarding to simplify sanitize() + + src/hb-ot-name-table.hh | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit bf91b418b0e988619c230156f5f062c5d2802dd8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 14:42:37 2019 -0700 + + [name] + + src/hb-ot-name-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 998b0b68ac2eafd1d5bca51b3723fa753e4db7c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 14:39:52 2019 -0700 + + [serializer] Add copy() to (Unsized)ArrayOf + + src/hb-open-type.hh | 41 +++++++++++++++++++++++++++++++++++++++++ + src/hb-serialize.hh | 4 ++-- + 2 files changed, 43 insertions(+), 2 deletions(-) + +commit 88a41472404a8e7754e1099ca4a5b2146dae5298 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 14:22:31 2019 -0700 + + [serializer] Accept exact type in serialize_subset/copy() + + src/hb-open-type.hh | 12 ++++++------ + src/hb-ot-layout-common.hh | 33 ++------------------------------- + src/hb-ot-layout-gpos-table.hh | 6 ++++++ + src/hb-ot-layout-gsub-table.hh | 6 ++++++ + 4 files changed, 20 insertions(+), 37 deletions(-) + +commit 88fdeeecc0ef57e41219d92c90f35f13cbd3a35e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 14:14:33 2019 -0700 + + [serialize] Take arguments in copy() + + src/hb-open-type.hh | 6 +++--- + src/hb-serialize.hh | 10 ++++++---- + 2 files changed, 9 insertions(+), 7 deletions(-) + +commit 273ed6127bd9471fd11b3c1c7f232638f1ff1dba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 14:04:51 2019 -0700 + + [serializer] Add serialize_copy() + + src/hb-open-type.hh | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit bf22338f49fb1711f7cbcad2d9949d7962cdc0bc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu May 2 13:51:52 2019 -0700 + + Remove dead code + + src/hb-algs.hh | 3 --- + 1 file changed, 3 deletions(-) + +commit 14e1fabc41a9a5ead3d91d560773050469982f54 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Wed May 1 21:29:06 2019 -0400 + + Sync gen-vowel-constraints.py with current output + + src/gen-vowel-constraints.py | 3 +++ + 1 file changed, 3 insertions(+) + +commit 026ab825c8e41980e286be911cc6fbb958dd7cd3 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Wed May 1 16:15:58 2019 -0400 + + Add dotted circles to more broken clusters + + src/gen-use-table.py | 9 + + src/hb-ot-shape-complex-myanmar-machine.hh | 196 +++++----- + src/hb-ot-shape-complex-myanmar-machine.rl | 4 +- + src/hb-ot-shape-complex-use-machine.hh | 602 +++++++++++++++-------------- + src/hb-ot-shape-complex-use-machine.rl | 11 +- + src/hb-ot-shape-complex-use-table.cc | 2 +- + 6 files changed, 433 insertions(+), 391 deletions(-) + +commit 92588782d7a45e0c023c5f48cbd19b11cfa8f0d2 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 30 13:05:10 2019 -0700 + + Remove space between right angle brackets now that we have C++11 (#1689) + + src/hb-aat-layout-ankr-table.hh | 2 +- + src/hb-aat-layout-common.hh | 14 +++---- + src/hb-aat-layout-just-table.hh | 4 +- + src/hb-aat-layout-kerx-table.hh | 14 +++---- + src/hb-aat-layout-lcar-table.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 14 +++---- + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-aat-ltag-table.hh | 2 +- + src/hb-cff-interp-cs-common.hh | 2 +- + src/hb-cff1-interp-cs.hh | 2 +- + src/hb-cff2-interp-cs.hh | 2 +- + src/hb-iter.hh | 4 +- + src/hb-null.hh | 8 ++-- + src/hb-open-file.hh | 8 ++-- + src/hb-open-type.hh | 8 ++-- + src/hb-ot-color-cbdt-table.hh | 2 +- + src/hb-ot-color-colr-table.hh | 4 +- + src/hb-ot-color-cpal-table.hh | 8 ++-- + src/hb-ot-color-sbix-table.hh | 2 +- + src/hb-ot-color-svg-table.hh | 4 +- + src/hb-ot-kern-table.hh | 6 +-- + src/hb-ot-layout-base-table.hh | 2 +- + src/hb-ot-layout-common.hh | 10 ++--- + src/hb-ot-layout-gdef-table.hh | 4 +- + src/hb-ot-layout-gpos-table.hh | 6 +-- + src/hb-ot-layout-gsub-table.hh | 18 ++++----- + src/hb-ot-layout-gsubgpos.hh | 86 ++++++++++++++++++++--------------------- + src/hb-ot-math-table.hh | 2 +- + src/hb-ot-name-table.hh | 10 ++--- + src/hb-ot-stat-table.hh | 4 +- + src/hb-subset-cff1.cc | 2 +- + src/test-iter.cc | 10 ++--- + 32 files changed, 134 insertions(+), 134 deletions(-) + +commit f27fdca4aa438ec366ee17370fbc9fdeb962c397 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 30 13:01:04 2019 -0700 + + [doc] Add documentation to hb_color_get_* and hb_directwrite_face_* (#1690) + + src/hb-common.cc | 12 ++++++++---- + src/hb-directwrite.cc | 8 ++++++-- + 2 files changed, 14 insertions(+), 6 deletions(-) + +commit fe4a0ac707802b5bb36787723f8d55a58c2946a5 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Tue Apr 30 13:35:50 2019 -0400 + + Fix some dead links + + src/gen-os2-unicode-ranges.py | 2 +- + src/gen-use-table.py | 6 +++--- + src/hb-ot-shape-complex-myanmar.hh | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 6d9a86ae7535ea8e3c108a49c6da877a78cdac26 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Tue Apr 30 16:09:01 2019 +0100 + + [Docs] Usermanual; fixes to Object Model chapter + + docs/usermanual-object-model.xml | 35 ++++++++++++++++++++++------------- + 1 file changed, 22 insertions(+), 13 deletions(-) + +commit 9542bdd0ed2d581cdb4bd950ac3cd7e3bf899478 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Apr 29 14:52:28 2019 -0700 + + Add color channels getters ABI (#1513) + + So can be used with language wrappers + + src/hb-common.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-common.h | 40 +++++++++++----------------------------- + 2 files changed, 64 insertions(+), 29 deletions(-) + +commit e200d165a4e8a5f901165c705d617b6e457ec595 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 30 02:10:50 2019 +0430 + + [ci] Remove crosscompile-notest-freebsd9 bot + + It was testing an old version of freebsd and now it's image is gone. + We really like to test the environment. + + .circleci/config.yml | 10 ---------- + 1 file changed, 10 deletions(-) + +commit 4aa546b70ad7b11154b901e67f98c1ec6bc5c364 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Mon Apr 29 14:16:51 2019 -0400 + + Allow some Balinese Po & So as aksara modre bases + + src/gen-use-table.py | 10 ++++++++-- + src/hb-ot-shape-complex-use-table.cc | 4 ++-- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit 6d6edc8b25395c87477181a647a8e6d02f2cad4f +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Apr 28 11:54:07 2019 -0700 + + [valgrind] Use libtool and support run-subset-fuzzer-tests (#1668) + + test/fuzzing/Makefile.am | 4 +- + test/fuzzing/run-shape-fuzzer-tests.py | 28 ++++++------ + test/fuzzing/run-subset-fuzzer-tests.py | 75 ++++++++++++++++++++++++++++++--- + 3 files changed, 85 insertions(+), 22 deletions(-) + +commit 62c6e170728303f4225aaa25523675fc260ae1ab +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Apr 28 10:55:07 2019 -0700 + + [test] Add crbug.com/oss-fuzz/14474 testcase + + Fixed at 6977a95f + + ...testcase-minimized-hb-subset-fuzzer-5716947896893440 | Bin 0 -> 65833 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 6977a95fed8a35d6e915ed3fc3a3ea8709f3d4a4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 27 10:05:25 2019 -0700 + + [subset] Don't crash if subsetting GSUB/GPOS fails + + Fixes fuzzer issue. + + src/hb-subset.cc | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +commit 2b051e7aa147c78cfbf953b6f0eb18c25b732eb2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Apr 27 10:01:11 2019 -0700 + + [subset] Check error after calling serializer end + + src/hb-subset.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 750b65e9a980efc13e50ea5d0388ecf06e7a93b1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 26 17:14:25 2019 -0700 + + [meta] Add hb_type_identity<> + + To block template argument deduction. + + src/hb-meta.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 8c8922a019eb1ceb8beffc05ca638ee0ca25b565 +Author: Qunxin Liu <qxliu@google.com> +Date: Thu Apr 25 09:17:58 2019 -0700 + + [subset] Updates due to changes in resolve_links() on master branch + + src/Makefile.sources | 1 + + src/hb-ot-name-table.hh | 7 +++++-- + src/hb-static.cc | 3 +-- + 3 files changed, 7 insertions(+), 4 deletions(-) + +commit 2f6ec35344db08d0c892152bc7a7eaa67e7c03f0 +Author: Garret Rieger <grieger@google.com> +Date: Wed Apr 24 15:15:36 2019 -0700 + + Move implementations of hb-ot-name-language.cc into a hb-static.cc + + src/hb-aat-layout.hh | 1 - + src/hb-ot-name-language-static.hh | 462 ++++++++++++++++++++++++++++++++++++++ + src/hb-ot-name-language.hh | 432 +---------------------------------- + src/hb-static.cc | 2 + + 4 files changed, 468 insertions(+), 429 deletions(-) + +commit 19afd25004487cfaa7b487b1768b4dae1ab37296 +Author: Qunxin Liu <qxliu@google.com> +Date: Wed Apr 24 14:02:29 2019 -0700 + + [subset] Update to use _subset2() for name table + + src/hb-ot-name-table.hh | 47 ++++++++++------------------------------------- + src/hb-subset.cc | 4 ++-- + 2 files changed, 12 insertions(+), 39 deletions(-) + +commit 1ca4b5c77012ed586413f39e730b03bf965e1305 +Author: Qunxin Liu <qxliu@google.com> +Date: Mon Apr 22 11:31:23 2019 -0700 + + [subset] Add unit test for str de-dup + Also move the implementation of some methods from the .cc to the .hh + + src/Makefile.sources | 1 - + src/hb-aat-layout.cc | 8 - + src/hb-aat-layout.hh | 9 +- + src/hb-ot-name-language.cc | 457 --------------------------------- + src/hb-ot-name-language.hh | 432 ++++++++++++++++++++++++++++++- + test/api/fonts/nameID.dup.expected.ttf | Bin 0 -> 2340 bytes + test/api/fonts/nameID.dup.origin.ttf | Bin 0 -> 170680 bytes + test/api/test-subset-nameids.c | 21 ++ + 8 files changed, 456 insertions(+), 472 deletions(-) + +commit 9ad14f56b6cf2a345104b3a897b52a1f4c0f33a5 +Author: Qunxin Liu <qxliu@google.com> +Date: Tue Apr 16 11:20:58 2019 -0700 + + [subset] update name table subsetting with new serializer + + src/hb-ot-name-table.hh | 126 ++++++++++++++++++++++++++++-------------------- + 1 file changed, 75 insertions(+), 51 deletions(-) + +commit 6faac8df83bb59f08e5d329e76435ba438b2ea54 +Author: Qunxin Liu <qxliu@google.com> +Date: Wed Apr 10 16:38:35 2019 -0700 + + [subset] Subsetting Name Table Step 4 + Add unit test and integration test + + test/api/Makefile.am | 2 + + test/api/fonts/nameID.expected.ttf | Bin 0 -> 170696 bytes + test/api/fonts/nameID.origin.ttf | Bin 0 -> 170976 bytes + test/api/hb-subset-test.h | 9 ++++ + test/api/test-subset-nameids.c | 58 +++++++++++++++++++++ + .../Roboto-Regular.abc.name-ids.61,62,63.ttf | Bin 0 -> 2168 bytes + .../basics/Roboto-Regular.abc.name-ids.61,63.ttf | Bin 0 -> 1988 bytes + .../basics/Roboto-Regular.abc.name-ids.61.ttf | Bin 0 -> 1792 bytes + .../basics/Roboto-Regular.abc.name-ids.62.ttf | Bin 0 -> 1740 bytes + .../basics/Roboto-Regular.abc.name-ids.63.ttf | Bin 0 -> 1716 bytes + test/subset/data/profiles/name-ids.txt | 1 + + test/subset/data/tests/basics.tests | 1 + + 12 files changed, 71 insertions(+) + +commit e501ea143d1e63974903cdb41932c50f4222ff4e +Author: Qunxin Liu <qxliu@google.com> +Date: Fri Apr 5 10:05:55 2019 -0700 + + [subset] Subset name table step 3, add --nameids option to guide the + selection of which name records to keep in the subset method. + + src/hb-ot-name-table.hh | 28 ++++++++++++++++------------ + src/hb-subset-input.cc | 8 ++++++++ + src/hb-subset-input.hh | 3 ++- + src/hb-subset-plan.cc | 10 ++++++---- + src/hb-subset-plan.hh | 3 +++ + src/hb-subset.h | 3 +++ + util/hb-subset.cc | 1 + + util/options.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ + util/options.hh | 8 ++++++++ + 9 files changed, 92 insertions(+), 17 deletions(-) + +commit 2637a81615c80443911a603cbd161ade525c79f1 +Author: Qunxin Liu <qxliu@google.com> +Date: Tue Apr 2 13:38:27 2019 -0700 + + [subset] subset name table step 2, add implementation for collecting subset + elements and serialize method + + src/hb-ot-name-table.hh | 131 ++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 109 insertions(+), 22 deletions(-) + +commit 408c1daeb4ff86d2204ed1bdd059513357ada392 +Author: Qunxin Liu <qxliu@google.com> +Date: Fri Mar 29 10:34:32 2019 -0700 + + [subset] subset name table step 1, write out table unmodified, use accelerator to access + string + + src/hb-ot-name-table.hh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset.cc | 4 ++++ + 2 files changed, 57 insertions(+) + +commit 3a7f5bdd18314676425ec811199767a5f8e65a40 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 26 14:40:01 2019 -0700 + + Rewrite hb_is_signed() + + src/hb-meta.hh | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +commit 73c82f2301a52cf2111296b34691bc898a7a6363 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 26 13:16:48 2019 -0700 + + [iter] Fix hb_is_iterator_of() to actually check item type + + src/hb-iter.hh | 20 +++++++++----------- + 1 file changed, 9 insertions(+), 11 deletions(-) + +commit c51f15ddfcae8578483693b761b81ceaebf05f2a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 26 13:03:41 2019 -0700 + + [array] Adjust hb_sorted_array_t copy constructor/assignment to match hb_array_t + + src/hb-array.hh | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit b2758c360cc08d7a0334aae11845d0c5d50c46af +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 26 12:58:06 2019 -0700 + + [array] Use hb_is_cr_convertible_to() + + src/hb-array.hh | 14 ++------------ + 1 file changed, 2 insertions(+), 12 deletions(-) + +commit 8ecae793aa79056a312d3c8518106cfeca42390e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 26 12:57:56 2019 -0700 + + [meta] Add hb_is_cr_convertible_to() + + src/hb-meta.hh | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 52bb0346d319c322f117567a096fafa1bc804e26 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 26 12:52:28 2019 -0700 + + [meta] Add hb_decay<> + + src/hb-meta.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 474f3587cd18fdaf86b2068647fa03b107557d8c +Author: Michiharu Ariza <ariza@adobe.com> +Date: Fri Apr 26 10:12:38 2019 -0700 + + copy retain_gids from input to plan + + src/hb-subset-plan.cc | 1 + + src/hb-subset-plan.hh | 1 + + 2 files changed, 2 insertions(+) + +commit 3fc066314ac19005ea8157a6541412cfd24abbc2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 16:41:57 2019 -0700 + + Another try at fixing cmake build + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c69f02784ac53a7fd13eee559559b38d8224ef59 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 16:31:37 2019 -0700 + + Fix sign-compare error on 32-bit systems + + src/hb-open-type.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f2d20dd9d3b52f434f5fe9dbef82bd95eb499edf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 15:08:27 2019 -0700 + + [THANKS] Add Ivan Kuckir <https://photopea.com/> + + https://github.com/harfbuzz/harfbuzz/issues/1633#issuecomment-485764140 + + THANKS | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0ca358f21a2a6e86a3d5c145a70bb84ab6e2db32 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 16:36:29 2019 -0400 + + Try fixing cmake build + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 59a8fa53533b10b9c25458d9ba2d68b7b01c3ff0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 12:19:13 2019 -0400 + + [iter] Add tests for casting to hb_iter_t<> base class for hb_sorted_array_t<> + + Something's phishy about hb_sorted_array_t<>. Can't get it work nicely with + change I'm making. Ugh.. + + src/test-iter.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 714307cc437f375f128e17e5ab01eba0c57aaf01 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:56:12 2019 -0400 + + [iter] Remove fixed TODO + + src/hb-iter.hh | 3 --- + 1 file changed, 3 deletions(-) + +commit 22da12318a3e9fd9955f24fd0092de1a4a1a940d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:53:16 2019 -0400 + + [map] Fix TODO + + src/hb-map.hh | 6 ++---- + src/hb-meta.hh | 6 ++++++ + src/hb-ot-cff1-table.cc | 1 - + src/hb-ot-cff2-table.cc | 1 - + src/hb.hh | 3 +-- + 5 files changed, 9 insertions(+), 8 deletions(-) + +commit 4c6136e976af4f7332f703f5a7625505ffc296b6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:44:24 2019 -0400 + + [mutex] Remove TODO + + src/hb-mutex.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 0268db11965d022883d5ef2ef828c0635165b7bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:43:40 2019 -0400 + + [map] Use hb_invoke() with pointer-to-method + + src/hb-algs.hh | 5 ++++- + src/hb-map.hh | 4 ++-- + src/test-algs.cc | 8 ++++++++ + 3 files changed, 14 insertions(+), 3 deletions(-) + +commit 8f79a5750e8982f9ab73c0dc6a8534dffef74610 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:32:49 2019 -0400 + + [algs] Add more hb_forward<>()'s + + src/hb-algs.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 42526d1697e2449fa23741f84721dcf2ce688af7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:24:33 2019 -0400 + + [serialize] Fix SingleSubstFormat1 failure + + src/hb-ot-layout-gsub-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 6cc9707c9c0885a3133b7844f615cdcdaeccec18 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:22:06 2019 -0400 + + [serialize] Rename + + src/hb-serialize.hh | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 085793d6cd35a1590a66712f39260030367490db +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:15:59 2019 -0400 + + Remove wrong TODOs + + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-shape-complex-indic.cc | 1 - + src/hb-ot-shape-complex-khmer.cc | 4 ++-- + src/hb-ot-shape-complex-myanmar.cc | 3 ++- + src/hb-ot-shape-complex-use.cc | 4 ++-- + 5 files changed, 7 insertions(+), 7 deletions(-) + +commit 915b9ea5f48d56df21419761477b2d4ba2843b54 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:07:19 2019 -0400 + + [serialize] Add c->check_assign() + + To check for assignment overflows. + + src/hb-open-type.hh | 7 +++---- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-serialize.hh | 20 +++++++++++++------- + 3 files changed, 17 insertions(+), 12 deletions(-) + +commit 00a00bc1f23c681d64fbd4df33582ec0165e337a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 10:01:30 2019 -0400 + + Fix two TODOs + + src/hb-ot-layout-gsub-table.hh | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit 11ab889a8d743304c8ec17920e209a514f46739d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 09:55:24 2019 -0400 + + Rename a few test programs + + src/Makefile.am | 24 +++++++++++----------- + ...est-size-params.cc => test-gpos-size-params.cc} | 0 + ...substitute.cc => test-gsub-would-substitute.cc} | 0 + src/{test-name-table.cc => test-ot-name.cc} | 0 + 4 files changed, 12 insertions(+), 12 deletions(-) + +commit 12017db0bfe62e7777e1ab6ba5b14729dcd4c351 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 09:24:38 2019 -0400 + + Move test code around + + src/test-algs.cc | 8 ++++++++ + src/test-iter.cc | 9 --------- + 2 files changed, 8 insertions(+), 9 deletions(-) + +commit 27377a7e287dd39e3f7caad5c1e0691ae381ccf8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 09:22:14 2019 -0400 + + Rely on variadic parameter pack more + + src/hb-open-type.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 3ad20c38ade76aca8aed024014977ecb5f2b636e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 24 09:09:00 2019 -0400 + + [serialize] Fix a few overflow TODO items + + src/hb-open-type.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 175bdad8bff5b0e9732ab1fb97617a9293680fd4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 23 23:57:11 2019 -0400 + + One more variadic parameter pack use + + src/hb-aat-layout-common.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 441cca235477a5399af214c9ac85320d4de69f0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 23 23:49:21 2019 -0400 + + Use hb_forward() when forwarding parameter pack + + src/hb-open-type.hh | 32 ++++++++++++++++---------------- + src/hb-serialize.hh | 3 ++- + 2 files changed, 18 insertions(+), 17 deletions(-) + +commit 20f3134789f65b10f301c4635c9f80c2dda0fb97 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 23 12:58:52 2019 -0400 + + Use variadic templates in OffsetTo<> and various ArrayOf<>s + + src/hb-open-type.hh | 145 ++++++++++++++++++---------------------------------- + 1 file changed, 49 insertions(+), 96 deletions(-) + +commit aa6692cb0079bbe1e003f211a321e8fe6a18ea94 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Tue Apr 23 17:56:44 2019 +0100 + + Usermanual: update Makefile SGML list. Again. + + docs/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 98c54cdef8b0615a95382bdba4ecd008789f8c9e +Author: Nathan Willis <nwillis@glyphography.com> +Date: Tue Apr 23 17:48:42 2019 +0100 + + Usermanual: add chapter on object model. + + docs/harfbuzz-docs.xml | 1 + + docs/usermanual-object-model.xml | 249 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 250 insertions(+) + +commit 64ca2ffa4c88b961dcbd9d06be8ac7dd80ad8182 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 23 01:10:46 2019 -0700 + + Fix clang's -Wmain complain (#1678) + + src/test-iter.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 7c218351ab45c41e48147b2196393357f7b551d4 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 23 12:40:29 2019 +0430 + + .editorconfig, minor + + still doesn't work with vscode + + .editorconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 25dd88efc6521b972babe1067c0de1b9d4f5dbe5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 22 17:45:23 2019 -0400 + + Err, fix hb_invoke() variadic + + src/hb-algs.hh | 6 +++--- + src/test-iter.cc | 5 ++++- + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit c862a532df0bc3ce0b47f3fde9bf1dd300ff8bee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 22 17:32:19 2019 -0400 + + Add variadic arguments to hb_invoke() + + src/hb-algs.hh | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 9c724e48a2f5d61c31c79f0b4660f08e5d07db10 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 22 15:37:10 2019 -0400 + + [serializer] Add err_propagaged_error() + + src/hb-serialize.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit ae8da4b61b4cc3b55242b85fe7c63393d65bd6cf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 22 15:25:11 2019 -0400 + + Minor + + src/hb-iter.hh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 24da1d08603a7fe262ae88d687986efc0343956f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 22 15:20:25 2019 -0400 + + Use variadic template args for propagate_error() + + Let's see if bots happy. + + Not sure where else we can use these. Mm. Maybe in hb_invoke(). + + src/hb-serialize.hh | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 9bab398462fa598047f34fd6d23e07a91305b1b3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 22 15:16:35 2019 -0400 + + Simplify propagate_error() + + src/hb-serialize.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit ecac94ca763e80d217ba5db429745e8882b38464 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 21 12:27:32 2019 -0400 + + [docs] Remove fdo repo + + Has not been updated. + + docs/harfbuzz-docs.xml | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit 8ed7655be89c658219ab702e34a79734ba0efb73 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Apr 21 12:25:19 2019 -0400 + + Update AUTHORS / COPYING + + AUTHORS | 3 +++ + COPYING | 3 ++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit a464cbeecea73aeaa03c262f49fed8584057d9bb +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Apr 19 12:14:09 2019 -0700 + + Revert "Add harfbuzzjs build configuration (#1636)" (#1675) + + This reverts commit 694cb1beeefe1c54b2e613d2d566a21e248a2c9c. + + CMakeLists.txt | 35 ----------------------------------- + 1 file changed, 35 deletions(-) + +commit 694cb1beeefe1c54b2e613d2d566a21e248a2c9c +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Apr 19 07:51:04 2019 -0700 + + Add harfbuzzjs build configuration (#1636) + + CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +commit 42f4bd6b801f96fc33a365db8ab6390e74cef05a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 18 19:04:59 2019 -0400 + + Minor warning fix again + + src/hb-ot-map.cc | 20 ++++++++++---------- + test/api/test-ot-face.c | 2 +- + 2 files changed, 11 insertions(+), 11 deletions(-) + +commit 267fb9c7163e61c9cdbafbb16005bc659ec5a4a2 +Author: Michiharu Ariza <ariza@adobe.com> +Date: Thu Apr 18 15:17:10 2019 -0700 + + add spaces + + src/hb-ot-cff1-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ba0386060d92dffcde2d14f9e523a46ea8713de2 +Author: Michiharu Ariza <ariza@adobe.com> +Date: Thu Apr 18 14:53:35 2019 -0700 + + fix oss-fuzz issue 14345 + + src/hb-ot-cff1-table.hh | 3 ++- + ...testcase-minimized-hb-subset-fuzzer-5923632099885056 | Bin 0 -> 25847 bytes + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 63a2108480cca2d9c1a2f61d6642d70496f1a5e3 +Author: Michiharu Ariza <ariza@adobe.com> +Date: Thu Apr 18 13:54:58 2019 -0700 + + silence MVC warnings 3rd attempt + + src/hb-ot-cff1-table.cc | 5 +++-- + src/hb-ot-cff2-table.cc | 9 +++++---- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 705dde57fe7bd5aafe93f284db2aa809aad932dc +Author: Michiharu Ariza <ariza@adobe.com> +Date: Thu Apr 18 11:32:10 2019 -0700 + + silence MVC warnings 2nd attempt + + src/hb-ot-cff1-table.cc | 4 ++-- + src/hb-ot-cff2-table.cc | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit dd4c37529bcecee33d43015a852a3fcf9e978b7f +Author: Michiharu Ariza <ariza@adobe.com> +Date: Thu Apr 18 10:38:57 2019 -0700 + + silence MVC warnings + + src/hb-cff-interp-common.hh | 2 +- + src/hb-ot-cff1-table.cc | 4 ++-- + src/hb-ot-cff2-table.cc | 8 ++++---- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit 518e6e07f29d9bb7e532313fb0af6177d8022ea5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 18 12:21:25 2019 -0400 + + Minor + + src/hb-ot-map.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 91d958acc08cb99ddd3b656922e13497b9d1595d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 18 10:04:10 2019 -0400 + + [array] Simplify copy assignment/constructor + + To fix bogus MSVC warnings: + + c:\projects\harfbuzz\src\hb-array.hh(189): warning C4521: 'hb_array_t<Type>': multiple copy constructors specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj] + c:\projects\harfbuzz\src\hb-array.hh(189): warning C4522: 'hb_array_t<Type>': multiple assignment operators specified [C:\projects\harfbuzz\build\harfbuzz.vcxproj] + + src/hb-array.hh | 29 +++++++++++++++++++---------- + 1 file changed, 19 insertions(+), 10 deletions(-) + +commit 693d91cd49fda3e728b59e6885bea8d7b01958ef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 17 17:59:39 2019 -0400 + + [serialize] Fix offset calculation + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit db0c9a1485ae6ca7ca9af38a43504f1ae4ea09c8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 17 17:58:13 2019 -0400 + + [subset] Assert offsets are zero during relocation + + If they're not, it's a bug in our subsetting logic somewhere. So check. + + src/hb-serialize.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit efbba7ad26dda5930f5d1bd5292304835432f504 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 17 11:00:08 2019 -0400 + + [serializer] Add copy() + + Calls obj.copy() or obj.operator=() in that order. + + src/hb-serialize.hh | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit c67a0d581fcc50df5563c23060b4fcd9dac4c87c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 17 10:20:02 2019 -0400 + + Add HB_RETURN + + src/hb-algs.hh | 13 ++++++------- + src/hb-meta.hh | 34 ++++++++++++++++++++-------------- + 2 files changed, 26 insertions(+), 21 deletions(-) + +commit 6745a600bfec13b3f5468b3d31bab7d82b1e61ce +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Tue Apr 16 17:29:34 2019 -0400 + + Comment out ot_languages where fallback suffices + + src/gen-tag-table.py | 15 +- + src/hb-ot-tag-table.hh | 443 +++++++++++++++++++++++++------------------------ + src/hb-ot-tag.cc | 19 ++- + test/api/test-ot-tag.c | 5 +- + 4 files changed, 255 insertions(+), 227 deletions(-) + +commit 5daeff3e68e4e202effb152f52702a044c09f386 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Wed Apr 17 09:11:44 2019 -0400 + + Fix "hb_script_" doc typo + + src/hb-common.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6916b77863cd5ce492a274eb85f196f2152fbb96 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 18:33:51 2019 -0400 + + One more auto return type + + src/hb-iter.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5b33427f2c4d596a12f05ffebebfd68655fd63eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 18:28:17 2019 -0400 + + Rename HB_AUTO_RETURN_EXPR to HB_AUTO_RETURN + + src/hb-algs.hh | 34 +++++++++++++++++----------------- + src/hb-meta.hh | 8 ++++---- + 2 files changed, 21 insertions(+), 21 deletions(-) + +commit da293b0e59a0d6c47e9b3a7807115a168a0a5c94 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 18:27:25 2019 -0400 + + Use HB_AUTO_RETURN_EXPR in hb_min/max + + src/hb-algs.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 0241a40f2aff43aba045fb7de4a2c3e5f1e9626a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 18:26:30 2019 -0400 + + Use auto return type for hb_first/hb_second + + src/hb-algs.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fe30fcd228ff95be1f169f580b30184c8511d1c3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 17:34:06 2019 -0400 + + Use hb_deref_pointer() to reduce number of overloads + + src/hb-algs.hh | 27 ++++++++++----------------- + src/hb-meta.hh | 36 +++++++++++++++++++----------------- + 2 files changed, 29 insertions(+), 34 deletions(-) + +commit c918a6706fa759696569ad6dcaae03fed76306bc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 17:28:18 2019 -0400 + + Properly prioritize hb_hash() + + src/hb-algs.hh | 46 +++++++++++++++++++++++----------------------- + 1 file changed, 23 insertions(+), 23 deletions(-) + +commit 75fd845a4abccc2596f0e1fe2294f936199e61f3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 17:22:29 2019 -0400 + + Move around + + src/hb-algs.hh | 25 ++++++++++++------------- + 1 file changed, 12 insertions(+), 13 deletions(-) + +commit 973717175d46d62471772318bb0b607070c53ec7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 16:50:07 2019 -0400 + + Fix priorities + + src/hb-algs.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 54ece299bcb3436763cc4f3b6b0ca11de8133b28 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 16:45:53 2019 -0400 + + Use type aliasing for meta-functions, ie. those returning a type + + src/hb-algs.hh | 3 ++- + src/hb-array.hh | 6 +++--- + src/hb-atomic.hh | 2 +- + src/hb-blob.hh | 2 +- + src/hb-common.cc | 2 +- + src/hb-ft.cc | 2 +- + src/hb-iter.hh | 2 +- + src/hb-meta.hh | 12 ++++++------ + src/hb-null.hh | 6 +++--- + 9 files changed, 19 insertions(+), 18 deletions(-) + +commit 1ce11b44375dae74e8984ace1db4f08c51ac9c38 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Tue Apr 16 10:04:45 2019 -0400 + + Reduce LangTag from 3 language system tags to 1 + + src/gen-tag-table.py | 13 +- + src/hb-ot-tag-table.hh | 2078 ++++++++++++++++++++++++------------------------ + src/hb-ot-tag.cc | 22 +- + 3 files changed, 1053 insertions(+), 1060 deletions(-) + +commit 155e92f25908830bef192304a2039853f6f5d4b5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 11:35:09 2019 -0400 + + Reduce NullPool size + + src/hb-null.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4fc2d2d7248171c386c39630aa2612f240669a58 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 11:24:42 2019 -0400 + + [meta] Flesh out hb_invoke() + + src/hb-algs.hh | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit e03d9395aa79a29d731607bfd46533b700dc1a37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 11:20:16 2019 -0400 + + Comment + + src/hb-algs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b8e763fd7140b3e298863e04053ec0f3c73a6a70 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 10:50:22 2019 -0400 + + [meta] Add hb_invoke() + + src/hb-algs.hh | 34 ++++++++++++++++++++++++++++++++-- + src/hb-iter.hh | 2 +- + 2 files changed, 33 insertions(+), 3 deletions(-) + +commit a3fcb9a370ad7a3c205342f831d8529c81660466 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 10:45:20 2019 -0400 + + [meta] Add HB_AUTO_RETURN_EXPR, HB_VOID_RETURN_EXPR, hb_priority, hb_has(), hb_get() + + The first three based on range-v3. + + src/hb-algs.hh | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-iter.hh | 7 ++++--- + src/hb-meta.hh | 32 +++++++++++++++----------------- + src/hb.hh | 2 +- + 4 files changed, 66 insertions(+), 21 deletions(-) + +commit ff68be31bf2ea82bf6bfcc6f993fb6806a895f97 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 16 09:59:08 2019 -0400 + + Add hb_void_tt<> ala std::void_t + + src/hb-meta.hh | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 89fea21697adfbba5057dd1d69c9806ee86e5ca8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 17:36:09 2019 -0400 + + Fix copyright + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b7384c89e2685cec1b6761c918ec7d91e8ae3af8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 16:53:10 2019 -0400 + + [fuzzing] Run valgrind with --leak-check=full + + test/fuzzing/run-shape-fuzzer-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3ff66c00292b20325b0d991dfd5eee80284cb9a8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 16:52:21 2019 -0400 + + [fuzzing] Fail if valgrind is requested but not found + + test/fuzzing/run-shape-fuzzer-tests.py | 3 +++ + 1 file changed, 3 insertions(+) + +commit 07776b60965d503dfb7fb5c611397e40759b0bdc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 16:43:34 2019 -0400 + + More tweaks to previous commit + + Delete assignment operator of OffsetTo<> instead of Offset<>. + + In simple ArrayOf<>::sanitize() assert that Type has assignment operator. + Ideally we should SFINAE this and fallback to calling Type::sanitize() + if assignment operator is not available. But we don't have a case of + that in the codebase. + + src/hb-open-file.hh | 4 ++-- + src/hb-open-type.hh | 16 +++++++++++----- + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit 699de689e9aa2246ba9207c07140ccd564f5ec20 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 16:00:20 2019 -0400 + + Delete default assignment operator Offset<> + + src/hb-open-type.hh | 3 +++ + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-layout-common.hh | 14 +++++++------- + 3 files changed, 11 insertions(+), 8 deletions(-) + +commit 02d864aa26359b7f057e2aa81404309e17180d47 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 15:39:03 2019 -0400 + + Add HB_FUNCOBJ() + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1651 + + src/hb-algs.hh | 28 +++++++++++++++------------- + src/hb-iter.hh | 56 ++++++++++++++++++++++++++++---------------------------- + src/hb-meta.hh | 22 +++++++++++++--------- + src/hb.hh | 7 +++++++ + 4 files changed, 63 insertions(+), 50 deletions(-) + +commit 60be1450ad04612a6c2a6116036dbf3e436018de +Author: Nathan Willis <nwillis@glyphography.com> +Date: Mon Apr 15 18:05:14 2019 +0100 + + [Usermanual]: fix Tamil error in Why-do-I-need-a-shaping-engine section. + + docs/usermanual-what-is-harfbuzz.xml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 38b1d0b9b2e798dd808a816a397323ed7ba697ab +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 12:44:31 2019 -0400 + + Move static const to post-struct for a function object + + Just sending this to bots to see if all happy, then turn it into macro and + apply everywhere. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1651 + + src/hb-algs.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 19e800c9d881ec016ab2e5fcaadab55ab5188398 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 12:07:00 2019 -0400 + + Ugh. Another try, to unbreak gcc this time! + + Jenga. + + src/hb-subset.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 3a88f55c15b625a0ad10fbfadf4562bcbb41ae53 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 11:59:57 2019 -0400 + + Move location of HB_UNUSED to make MSVC happy + + src/hb-subset.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1ae265888e144328dbf1df796d379bf742c4151a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 15 11:31:40 2019 -0400 + + Fix gcc warning + + src/hb-array.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c0ea37b557f53b50094042f11fe2611b1b30d725 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Apr 15 00:34:04 2019 +0430 + + [ci] Fix macOS glib issue + + .circleci/config.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ad126036643e44a98c4c42d2a2a4a3b4a3649937 +Merge: 341b70a3 47e538a3 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sun Apr 14 15:42:42 2019 +0100 + + Merge branch 'master' of https://github.com/harfbuzz/harfbuzz + +commit cd9889cac3ac3b271f7335f3e94acc4667a59b40 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sun Apr 14 15:33:56 2019 +0100 + + Docs: update and extended GTK-Doc comments for hb-ot-math. + + src/hb-ot-math.cc | 133 ++++++++++++++++++++++++++++++++---------------------- + src/hb-ot-math.h | 21 +++++++++ + 2 files changed, 99 insertions(+), 55 deletions(-) + +commit 3f74b7a14bffb8e91cd98edd0c3ddf0b0ddc169a +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sun Apr 14 15:20:56 2019 +0100 + + Docs: Regularize GTK-Doc comments for hb-ot-color. + + src/hb-ot-color.cc | 136 ++++++++++++++++++++++++++++++----------------------- + src/hb-ot-color.h | 6 +-- + 2 files changed, 80 insertions(+), 62 deletions(-) + +commit 47e538a35f9072e5775a65e2bf110ae895818321 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 22:50:22 2019 -0400 + + Add HB_NO_SUBSET_LAYOUT + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-subset.cc | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit a98e4068e76d50bd9562d85a452b56e681f1d62b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 22:42:44 2019 -0400 + + Revert "Hide symbols in hb-iter" + + This reverts commit 98f14c4cdb837a962083a6702f401d41b4c1ec5c. + + Same as previous commit. + + src/hb-iter.hh | 88 +++++++++++++++++++++++++++++----------------------------- + 1 file changed, 44 insertions(+), 44 deletions(-) + +commit dab92bdd4623aa7dac8eb00b14131566d75d095e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 22:39:38 2019 -0400 + + Revert "Hide more symbols" + + This reverts commit 2e86d50915cf1a791da9acb95245aa820a3d70f4. + + I think the setup that caused me to do this is faulty and not hiding inlines. + + src/hb-blob.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 98f14c4cdb837a962083a6702f401d41b4c1ec5c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 18:11:18 2019 -0400 + + Hide symbols in hb-iter + + Painful. All template methods need to be explicitly hidden :(. + + Maybe we should switch to -fvisibility=hidden pragma. + + A LOT more to go. + + src/hb-iter.hh | 88 +++++++++++++++++++++++++++++----------------------------- + 1 file changed, 44 insertions(+), 44 deletions(-) + +commit 2e86d50915cf1a791da9acb95245aa820a3d70f4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 18:07:42 2019 -0400 + + Hide more symbols + + Exposed by: + + $ make -j5 CPPFLAGS="-O0" CXXFLAGS=-flto=thin LDFLAGS=-lc++ && ./check-symbols.sh + + src/hb-blob.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit caa20e4ef9dff61a86312daec5d5a1df27d95ff7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 17:59:18 2019 -0400 + + Hide a few more symbols + + Exposed by: + + $ make CPPFLAGS=-O0 + + src/hb-array.hh | 4 ++-- + src/hb-meta.hh | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 95df00aec1996d521acdff6deff063ba98214fb9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 17:50:03 2019 -0400 + + Hide a few static methods + + Looks like static methods that do not get inlined end up exported. + We have a lot more. Need to protect all at some point. Wish there + was an easier way, like the visibility flag we pass that automatically + hides all inline methods. + + Was exposed by check-symbols.sh when compiling on OS X 10.14 with: + + $ make CPPFLAGS=-Oz CXXFLAGS=-flto=thin LDFLAGS=-lc++ + + src/hb-aat-layout.hh | 2 +- + src/hb-aat-map.hh | 2 +- + src/hb-array.hh | 2 +- + src/hb-coretext.cc | 4 ++-- + src/hb-open-file.hh | 2 +- + src/hb-open-type.hh | 3 ++- + src/hb-ot-cmap-table.hh | 14 +++++++------- + src/hb-ot-layout-base-table.hh | 6 +++--- + src/hb-ot-layout-gpos-table.hh | 8 ++++---- + src/hb-ot-layout-gsub-table.hh | 8 ++++---- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-map.hh | 4 ++-- + src/hb-uniscribe.cc | 4 ++-- + 13 files changed, 31 insertions(+), 30 deletions(-) + +commit 2f4be4ba54b539fbadc31fc53bdcfca81d7db77a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 16:21:58 2019 -0400 + + Add HB_NO_OPTIONS + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-debug.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 079d2dcbb2607cda3daa497199090c5813a51de5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 15:00:37 2019 -0400 + + Add HB_NO_NAME_TABLE_AAT + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-name-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 60a58aa61c09cafd12c432fdc1f7325f2a6d44bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 14:58:53 2019 -0400 + + Add HB_NO_OT_FONT_BITMAP + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-font.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 160c4d8b2d9f6c205b713236f043081e6dd532ee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 14:57:49 2019 -0400 + + Add HB_NO_OT_FONT_CFF + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-font.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 35f3b97fac3b106d345a06a4970f6adce182797b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 10:16:12 2019 -0400 + + Add HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape-complex-hebrew.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 414c5de26b34c0c53f6f4b5f00ddc8e1a3b62ac2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 10:12:11 2019 -0400 + + Add HB_NO_OT_SHAPE_FALLBACK + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape-fallback.cc | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit fe0018f7ef804acefa729e888f5a9935e571079d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 09:35:29 2019 -0400 + + Add HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape-complex-thai.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 9ddbfa006d752f6ddd3610ff968f84cf18dec031 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Apr 12 09:33:25 2019 -0400 + + Add HB_NO_OT_LAYOUT_BLACKLIST + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-layout.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 571fad4cf17d90434562d1b6f5d08b6f27343c7a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 11 17:54:38 2019 -0400 + + Add HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape-complex-vowel-constraints.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3db227265bc0790ffd718bf265d245c78598a49d +Author: Nathan Willis <nwillis@glyphography.com> +Date: Tue Apr 2 18:49:40 2019 +0100 + + Update gtk-doc annotations for inout counts on various getter functions. + + src/hb-ot-layout.cc | 122 ++++++++++++++++++++++++++++++---------------------- + 1 file changed, 70 insertions(+), 52 deletions(-) + +commit c08ddbd91b7f0fffe761638a2ee4893304b012db +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sun Mar 24 15:07:07 2019 +0000 + + [Docs] Minor edits to gtk-doc inline comment review. + + src/hb-ot-layout.cc | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +commit af5230bce39020cf6fc87ee5e21cca3ba201a417 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Mon Mar 18 14:03:16 2019 +0000 + + [Docs] Minor; fix formatting for gtk-doc multiple-annotations. + + src/hb-ot-layout.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 6c0a1e8cd67144d20c8b5fcad23953910eeeea51 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sun Mar 17 14:50:47 2019 +0000 + + [Docs] Annotate gtk-doc formatting with some un-annotated (out)s. + + src/hb-ot-layout.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 5122805c740961d4fdfbff440ed68792b63d50ed +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sun Mar 17 14:43:06 2019 +0000 + + [Docs] Fix gtk-doc formatting for (out) and (inout). + + src/hb-ot-layout.cc | 108 ++++++++++++++++++++++++++-------------------------- + 1 file changed, 54 insertions(+), 54 deletions(-) + +commit d3178aa52ae822ac6af606027ac8150ded0a2966 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sun Mar 17 14:27:27 2019 +0000 + + [Docs] Fix gtk-doc references to 'kern' table functions, clarifying that GPOS is not examined. + + src/hb-ot-layout.cc | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 3449031fad9dff7acedde7dceb0e47db708fc025 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sat Mar 16 15:38:08 2019 +0000 + + [Docs] Add inline gtk-doc documentation of GDEF glyph classes. + + src/hb-ot-layout.h | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 930f6fc3da04ce1897e65862fccb03afa9d3a780 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Sat Mar 16 15:10:21 2019 +0000 + + [Docs] Add inlind gtk-doc comments for hb-ot-layout functions. + + src/hb-ot-layout.cc | 456 +++++++++++++++++++++++++++++++++++++++++++++++++++- + src/hb-ot-layout.h | 11 ++ + 2 files changed, 462 insertions(+), 5 deletions(-) + +commit b52c0e54b9855a1f3d400e4dbcd0372520f2c2fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 11 11:20:10 2019 -0400 + + Use injected class name to simplify macros + + src/hb-open-type.hh | 10 +++++----- + src/hb.hh | 14 -------------- + 2 files changed, 5 insertions(+), 19 deletions(-) + +commit baf1e79075b0f917b79484446cd2ca47b58f50aa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 11 11:18:04 2019 -0400 + + [C++11] Use deleted methods + + src/hb.hh | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit 824fd342d5d66584a5ed88951e05975f33c55617 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Apr 11 11:16:01 2019 -0400 + + Rename a few macros + + src/hb-map.hh | 2 +- + src/hb-open-type.hh | 10 +++++----- + src/hb-set.hh | 2 +- + src/hb.hh | 12 ++++++------ + 4 files changed, 13 insertions(+), 13 deletions(-) + +commit edfc6be4a0362efa5c1d39f4792a28b5726c3ce5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 10 15:53:48 2019 -0400 + + [arabic] Disable fallback shaping if HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK defined + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-ot-shape-complex-arabic-fallback.hh | 1 - + src/hb-ot-shape-complex-arabic.cc | 4 ++++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 4d31662b5da20790f6f860cec8f5fdabf48210f0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 10 15:40:03 2019 -0400 + + Don't install ot-font funcs on new fonts if HB_NO_OT_FONT defined + + Currently linker cannot GC hb-ot-font completely because we install + it on fonts by default. Don't do that if HB_NO_OT_FONT defined. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-font.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit b111b3de020cde6fb0686efc224cace4608f2e45 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 10 15:38:15 2019 -0400 + + Don't use any default unicode funcs if HB_NO_UNICODE_FUNCS is defined + + Part of https://github.com/harfbuzz/harfbuzz/issues/1652 + + src/hb-unicode.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c5509be93a351177724f2891dd5e9ddb02553452 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 8 14:50:58 2019 -0400 + + [coretext] Fix unused-variable error + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1659 + + src/hb-coretext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4c19aa26204d0dc2f08b6e4a824e9088301f68d8 +Author: Maks Naumov <maksqwe1@ukr.net> +Date: Fri Apr 5 21:46:27 2019 +0300 + + Fix MSVC C4068 warning (#1656) + + src/hb-blob.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e44b83aac0443bd23df15b505a3d638883621b0e +Author: Michiharu Ariza <ariza@adobe.com> +Date: Fri Apr 5 10:15:08 2019 -0700 + + replace test font SourceHanSans with its subet + + ...gular.default.3042,3044,3046,3048,304A,304B.otf | Bin 6356 -> 0 bytes + ...gular.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6564 -> 0 bytes + .../SourceHanSans-Regular.default.61,63,65,6B.otf | Bin 5532 -> 0 bytes + ...gular.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6780 -> 0 bytes + .../SourceHanSans-Regular.default.660E.otf | Bin 5248 -> 0 bytes + ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 537992 -> 0 bytes + ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 692312 -> 0 bytes + ...ular.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 531624 -> 0 bytes + ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 692496 -> 0 bytes + ...ans-Regular.desubroutinize-retain-gids.660E.otf | Bin 613836 -> 0 bytes + ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 6272 -> 0 bytes + ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6456 -> 0 bytes + ...eHanSans-Regular.desubroutinize.61,63,65,6B.otf | Bin 5460 -> 0 bytes + ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6572 -> 0 bytes + .../SourceHanSans-Regular.desubroutinize.660E.otf | Bin 5224 -> 0 bytes + ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 537424 -> 0 bytes + ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 691692 -> 0 bytes + ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 531124 -> 0 bytes + ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 691808 -> 0 bytes + ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 613348 -> 0 bytes + ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 6096 -> 0 bytes + ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6204 -> 0 bytes + ...gular.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 5344 -> 0 bytes + ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6268 -> 0 bytes + ...Sans-Regular.drop-hints-desubroutinize.660E.otf | Bin 5120 -> 0 bytes + ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 537492 -> 0 bytes + ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 691788 -> 0 bytes + ...-Regular.drop-hints-retain-gids.61,63,65,6B.otf | Bin 531164 -> 0 bytes + ...-Regular.drop-hints-retain-gids.61,63,65,6B.ttx | 393879 ------------------ + ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 692008 -> 0 bytes + ...HanSans-Regular.drop-hints-retain-gids.660E.otf | Bin 613368 -> 0 bytes + ...ar.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 6164 -> 0 bytes + ...ar.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6300 -> 0 bytes + ...ourceHanSans-Regular.drop-hints.61,63,65,6B.otf | Bin 5376 -> 0 bytes + ...ar.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6472 -> 0 bytes + .../SourceHanSans-Regular.drop-hints.660E.otf | Bin 5140 -> 0 bytes + ...r.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 538076 -> 0 bytes + ...r.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 692420 -> 0 bytes + ...urceHanSans-Regular.retain-gids.61,63,65,6B.otf | Bin 531704 -> 0 bytes + ...r.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 692700 -> 0 bytes + .../SourceHanSans-Regular.retain-gids.660E.otf | Bin 613860 -> 0 bytes + ...ubset.default.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 3028 bytes + ...ubset.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 3240 bytes + ...eHanSans-Regular_subset.default.61,63,65,6B.otf | Bin 0 -> 2200 bytes + ...ubset.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 3460 bytes + .../SourceHanSans-Regular_subset.default.660E.otf | Bin 0 -> 1920 bytes + ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 90956 bytes + ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 125820 bytes + ...bset.desubroutinize-retain-gids.61,63,65,6B.otf | Bin 0 -> 88392 bytes + ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 126004 bytes + ...ular_subset.desubroutinize-retain-gids.660E.otf | Bin 0 -> 103780 bytes + ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 2952 bytes + ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 3136 bytes + ...s-Regular_subset.desubroutinize.61,63,65,6B.otf | Bin 0 -> 2132 bytes + ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 3256 bytes + ...eHanSans-Regular_subset.desubroutinize.660E.otf | Bin 0 -> 1896 bytes + ...e-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 90656 bytes + ...e-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 125468 bytes + ...ints-desubroutinize-retain-gids.61,63,65,6B.otf | Bin 0 -> 88156 bytes + ...e-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 125584 bytes + ....drop-hints-desubroutinize-retain-gids.660E.otf | Bin 0 -> 103556 bytes + ...esubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 2792 bytes + ...esubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 2896 bytes + ...ubset.drop-hints-desubroutinize.61,63,65,6B.otf | Bin 0 -> 2028 bytes + ...esubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 2964 bytes + ...gular_subset.drop-hints-desubroutinize.660E.otf | Bin 0 -> 1804 bytes + ...s-retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 90724 bytes + ...s-retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 125560 bytes + ...r_subset.drop-hints-retain-gids.61,63,65,6B.otf | Bin 0 -> 88196 bytes + ...s-retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 125780 bytes + ...-Regular_subset.drop-hints-retain-gids.660E.otf | Bin 0 -> 103572 bytes + ...et.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 2848 bytes + ...et.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 2988 bytes + ...nSans-Regular_subset.drop-hints.61,63,65,6B.otf | Bin 0 -> 2060 bytes + ...et.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 3164 bytes + ...ourceHanSans-Regular_subset.drop-hints.660E.otf | Bin 0 -> 1824 bytes + ...t.retain-gids.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> 91040 bytes + ...t.retain-gids.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> 125924 bytes + ...Sans-Regular_subset.retain-gids.61,63,65,6B.otf | Bin 0 -> 88468 bytes + ...t.retain-gids.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> 126208 bytes + ...urceHanSans-Regular_subset.retain-gids.660E.otf | Bin 0 -> 103800 bytes + test/subset/data/fonts/SourceHanSans-Regular.otf | Bin 16427580 -> 0 bytes + .../data/fonts/SourceHanSans-Regular_subset.otf | Bin 0 -> 2707728 bytes + test/subset/data/tests/cff-japanese.tests | 2 +- + 84 files changed, 1 insertion(+), 393880 deletions(-) + +commit a96d003d6ec4212fadad4f5b9058c9f8b07bcf89 +Author: Maks Naumov <maksqwe1@ukr.net> +Date: Fri Apr 5 12:29:56 2019 +0300 + + Fix MSVC C4138 warning (#1657) + + src/hb-ot-cff-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c68eb7002f1c2b847d955797e27f5403199e3d9d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 16:24:12 2019 -0700 + + Minor + + src/hb-ot-layout-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 85adf4ad5c76172514f281bfbe3850ef35473cc7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 16:06:55 2019 -0700 + + [GDEF] Don't assume glyphlist is sorted + + As was hit by the fuzzer. + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14032 + + src/hb-ot-layout-common.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ecabdffc61cb0b71424f4845aeda8cd0a6d25a29 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 16:06:34 2019 -0700 + + [algs] Add hb_min() and hb_max() + + src/hb-algs.hh | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 7b863142ceb82fc2fd23802f19f7379aa2f152e5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 15:48:27 2019 -0700 + + [serialize] Make putting breakpoint on out-of-memory easier + + src/hb-serialize.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 2bd275023405b6a669d59ad4cdcb2e8cb410d593 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 15:31:53 2019 -0700 + + [iter] Tweak SFINAE again + + Don't think we need hb_is_same(). + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f02ebc89ec89e78a348f9b67d613a2024feabc18 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 15:23:06 2019 -0700 + + [array] Add compy assignment operator since copy constructor is explicit + + src/hb-array.hh | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 20a73da2c9227a0f9bc943a3d766eedeb5bed3b3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 14:32:15 2019 -0700 + + [array] Add default copy constructor + + MSVC seems to need it. + + src/hb-array.hh | 1 + + 1 file changed, 1 insertion(+) + +commit d419a9a4376de7b2ae1dec7df09f8d034cc2d039 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 14:18:19 2019 -0700 + + [iter] Use different SFINAE scheme to make MSVC happy + + From Orvid King: TLDR; MSVC has some issues using sizeof(declval<T>()) for + SFINAE of templated types, so I just used SFINAE in a different context where + MSVC doesn't have the issue. + + src/hb-iter.hh | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +commit 2778df7972f537192b51cd0719adf2ab4d1f3397 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Apr 3 14:15:01 2019 -0700 + + [meta] Add hb_is_same() + + src/hb-meta.hh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 6215fb8e68bdf69f4af9f7f4959ad55a70723774 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 23:10:03 2019 -0700 + + [serialize] Actually reclaim storage from duplicate objects + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3305a2cad24f878f5d8773c2acae491ebd5a9059 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 22:42:22 2019 -0700 + + [serialize] Port to use object pool + + Tested, but feels fragile :(. + + src/hb-pool.hh | 5 +- + src/hb-serialize.hh | 141 ++++++++++++++++++++++++++++++++-------------------- + 2 files changed, 91 insertions(+), 55 deletions(-) + +commit 5efbc01174127bede4d533866acac239e5a0cfd5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 22:41:06 2019 -0700 + + [pool] Uses memset() instead of assigning Null() + + Assignment is invalid on invalid object. + + src/hb-pool.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 434d78bf91ac5204ffbf2144f199eb7a0f65c421 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 21:46:40 2019 -0700 + + Add hb_pool_t<> for pooled memory allocation + + src/Makefile.sources | 1 + + src/hb-pool.hh | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 99 insertions(+) + +commit 8e4df1a152f3916613594fa1bac308efdb61d512 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 20:20:53 2019 -0700 + + [serialize] Disable packed_map again + + Ugh. Need to think of something else. + + src/hb-serialize.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 31c1a83899147310b27bd40fac755c629cb59cef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 20:17:27 2019 -0700 + + [map] Protect more against pointer deref + + src/hb-map.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 5bffa9e375fe294718452ad51e4c5ff017a046b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 20:13:16 2019 -0700 + + More + + src/hb-map.hh | 5 +++++ + src/hb-set.hh | 9 ++++++++- + src/hb-vector.hh | 8 ++++---- + 3 files changed, 17 insertions(+), 5 deletions(-) + +commit 5b66b033fd2cd9c95284d283f08d6789c7ec985d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 19:27:02 2019 -0700 + + [serialize] Fix hb_hashmap_t<> for pointers and use in packed_map + + src/hb-array.hh | 12 +++++++++++- + src/hb-map.hh | 22 ++++++++++++++-------- + src/hb-serialize.hh | 8 +++----- + src/hb-vector.hh | 1 + + 4 files changed, 29 insertions(+), 14 deletions(-) + +commit 42ab32cbbaf8b403c351953f091c0fbe8464c4cb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 18:41:33 2019 -0700 + + [iter] Remove passing pointer to hb_iter() + + While doable with hb_deref_pointer() as well, we also would then + need to do it in a ton of places. Not worth it / messy. + + src/hb-array.hh | 2 +- + src/hb-iter.hh | 5 ----- + src/test-iter.cc | 3 --- + 3 files changed, 1 insertion(+), 9 deletions(-) + +commit d0da547b3741323493398eed8975a76f4a5742c2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 18:22:39 2019 -0700 + + [array] Use dagger for hashing array + + Also switch to better mixing. + + src/hb-array.hh | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit b6f29bf14153cac51b218e3aaba9e1b3aa747a8c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 18:12:01 2019 -0700 + + [iter] Accept pointers in hb_iter() + + No idea how to avoid dupicating code. Was hoping hb_deref_pointer() + would do it, but looks like a pointer can't bind to a universal + reference T&&. Humm. + + src/hb-iter.hh | 5 +++++ + src/test-iter.cc | 3 +++ + 2 files changed, 8 insertions(+) + +commit fc24bb9046e7e39d52a245bdc3480a30095cb6ee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 17:49:52 2019 -0700 + + [serialize] Towards maintaining packed_map + + src/hb-serialize.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit aa2293a55eaa39f4e77b60851bbdee56b1120225 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 17:42:10 2019 -0700 + + [serialize] Minor + + src/hb-open-type.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit e42b82c828ecec6f534040dae5518e04643b5f10 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 17:21:54 2019 -0700 + + [serialize] Handle non-nullable offsets + + src/hb-open-type.hh | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit e04518bafc66224887bf7f478e1affb54bc7acd0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 17:20:04 2019 -0700 + + [serialize] Movce empty-object handling earlier + + src/hb-serialize.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7f73c9744e6c0e8dd37a208b75a4bc299bccbd4d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 17:12:24 2019 -0700 + + [serialize] Minor + + src/hb-open-type.hh | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +commit 5a3de4f4f8791139d2c04a66244001aba192ef6b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Apr 2 16:53:05 2019 -0700 + + [serialize] Allow offset links that have base offset from the object base + + Rarely used, but used, in name table or similar constructs. + + src/hb-serialize.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit edad6b2c450e22e67ae86c5f2328cca3c29aaad2 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Apr 3 00:48:59 2019 +0430 + + [test][iter] minor, fix double promotion warning + + src/test-iter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 062f5d6e7aa061358eb5874a8f3a3f3bd6e9f16f +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 2 20:27:00 2019 +0430 + + [test] minor, c style comments + + src/test-iter.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit afdbf960d6147ec607ddb2c780d3a83068f61357 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 2 20:25:06 2019 +0430 + + [iter][test] Add another test for hb_reduce + + Different initial and accumulator types + + src/test-iter.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit bfa02bef4546f448e048288c1162988c8c39322a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 21:36:13 2019 -0700 + + [serialize] Switch to tetris-packing + + src/hb-open-type.hh | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit f0ea3ac17bef98409d302b9f285e94015e069823 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 21:36:03 2019 -0700 + + [serialize] Fix linking + + src/hb-serialize.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7c0e2054e0799ed89cdc5de8c1416d009c0029b5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 21:32:29 2019 -0700 + + [serialize] Minor + + src/hb-serialize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 64d0f0893812fa1cb2746071d8b021560969526d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 16:50:28 2019 -0700 + + [cmap] Minor + + src/hb-ot-cmap-table.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 2e675cc7b50b5a57ceddf799d63811801ffcfe94 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 16:45:50 2019 -0700 + + [subset] Call serialize start/end around it + + To be cleaned up. + + src/hb-subset.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit abe33c6149719eb371c5f2b0d8c143550938129e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 16:45:40 2019 -0700 + + [serialize] Assert stack + + src/hb-serialize.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 72e9b2c16cd1bc183226ca0aa8a58a5b1222573d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 16:17:30 2019 -0700 + + [serialize] Add add_link() to add link + + src/hb-serialize.hh | 26 +++++++++++++++++++++++--- + 1 file changed, 23 insertions(+), 3 deletions(-) + +commit 74addbecac3b8be699ac90b3853970f6c7efd0eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Apr 1 14:17:09 2019 -0700 + + [serialize] Add default template type to push() + + src/hb-serialize.hh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit b8642087e6c2ec96dc70fcef617128b6ce353a7e +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Apr 2 00:30:06 2019 +0430 + + [iter] hb_reduce, accumulator with a different type + + src/hb-iter.hh | 22 ++++++++++++---------- + src/test-iter.cc | 26 +++++++++++++++++++++++++- + 2 files changed, 37 insertions(+), 11 deletions(-) + +commit e526414c759ebca82f1071cdeafe1160bcaa9637 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Mar 31 12:41:58 2019 +0430 + + [iter] Implement hb_reduce + + src/hb-iter.hh | 28 ++++++++++++++++++++++++++++ + src/test-iter.cc | 5 +++++ + 2 files changed, 33 insertions(+) + +commit f3aca6aa267f7687a0406c7c545aefb5eed300b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Mar 31 21:37:14 2019 -0700 + + [serialize] Implement linking + + Untested! + + src/hb-serialize.hh | 29 +++++++++++++++++++++++++++-- + 1 file changed, 27 insertions(+), 2 deletions(-) + +commit 17f0cfa7ea3a5f0946d8800b98c1582c05dad853 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Mar 31 21:34:19 2019 -0700 + + Move BEInt to hb.hh + + I knows... + + src/hb-machinery.hh | 88 ---------------------------------------------------- + src/hb.hh | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 89 insertions(+), 88 deletions(-) + +commit 78fc43f2930064cd6cf4229c1e4cb76edb8ed7f6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Mar 31 19:17:07 2019 -0700 + + [iter] Fix up build, ouch + + Yeah, some things not very clear... + + src/hb-iter.hh | 8 ++++++-- + src/test-iter.cc | 4 ++-- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit e5d6fe9782a9fcde0786392c075c6c0b85c24829 +Author: Jonathan Kew <jfkthame@gmail.com> +Date: Sun Mar 31 19:17:32 2019 +0100 + + Don't skip setting the .end field of the first range + + Fixes a bug in CoverageFormat2::serialize whereby the first range + was not serialized correctly if it consists of only a single glyph ID. + This broke shaping of U+0626 in the Arabic fallback shaper, because it + is not found in the coverage table of the 'init' and 'medi' lookups. + + Also fix similar bug in ClassDefFormat2::serialize, noted during code + inspection (I haven't observed a case that was actually affected by + this, but it looks broken). + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1504 + + src/hb-ot-layout-common.hh | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 8a8d45b924cdb4343b4b11a7ef14e2d1fabb6f82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Mar 31 19:00:09 2019 -0700 + + [iter] Adjust hb_copy() and use it + + Untested. + + src/hb-iter.hh | 11 ++++------- + src/hb-vector.hh | 4 ++-- + 2 files changed, 6 insertions(+), 9 deletions(-) + +commit ba4b7be45523e88c26f763f8a329cc43c13b98a1 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Mar 31 01:32:30 2019 -0700 + + Remove coretext_aat shaper (#1581) + + coretext_aat was a temporary shaper to redirect shaping of AAT fonts + to CoreText and leaving the rest for HarfBuzz. As HarfBuzz now supports + AAT and Chrome now actually ships that on a stable version on macOS, + we no longer care about such use-case. If a client really wants 100% + metrics compatibility with CoreText better to use it directly or through + our API. Replicating the same behavior still is possible using + hb_shape_full, something we don't care or like to offer anymore. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1478 + + src/hb-coretext.cc | 56 --------------------------------------------------- + src/hb-shaper-list.hh | 4 ---- + 2 files changed, 60 deletions(-) + +commit d6005b49b32410543a8dfa93ce2a213223cf8f01 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:49:56 2019 -0700 + + [serialize] Start implementing linking + + src/hb-serialize.hh | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit 313b3057c335da6baa4cd447bac95812992413b9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:46:35 2019 -0700 + + [serializer] Implement dedup! + + src/hb-serialize.hh | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +commit b189bbc48fb4b7c251d30b26a57ad84d1cb6dbe4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:41:48 2019 -0700 + + Implement hashing of objects + + Should be improved for hb_bytes_t. + + src/hb-algs.hh | 2 +- + src/hb-array.hh | 13 +++++++++++++ + src/hb-serialize.hh | 5 +++++ + src/hb-vector.hh | 5 +++++ + 4 files changed, 24 insertions(+), 1 deletion(-) + +commit d6b28057a5cc636138cd453947d3a2008f18729f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:31:51 2019 -0700 + + Fix hb_hash(pointer) + + src/hb-algs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d74dc3ef65a159fe585e906deccdb32b570433aa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:26:37 2019 -0700 + + [serialize] Don't insert empty object into tree + + src/hb-serialize.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 7fd82283263f8caded4870d6e12f74c7e660fa8d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:16:20 2019 -0700 + + [serialize] Towards maintaining hashmap + + src/hb-algs.hh | 2 +- + src/hb-serialize.hh | 16 ++++++++++++++-- + src/hb-vector.hh | 1 + + 3 files changed, 16 insertions(+), 3 deletions(-) + +commit f254f45a1e6b1de6d83c97033773d20408772763 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:05:51 2019 -0700 + + [serialize] Only pack main object if there are other objects + + Avoids a memmove for tables that don't use the object packing mechanism. + + src/hb-serialize.hh | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 946d446f9b795f657d56ca443edbc0b77d660a50 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:03:55 2019 -0700 + + [serialize] Copy both sides of the buffer + + src/hb-serialize.hh | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 8512dc565d310e9fd80d831282736284cc3ecd2e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 19:01:23 2019 -0700 + + [serialize] Simplify copy + + src/hb-serialize.hh | 22 +++++++--------------- + 1 file changed, 7 insertions(+), 15 deletions(-) + +commit 0b1fe7b716628f7b7b4098da9ef544e1518008f5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:48:26 2019 -0700 + + [serializer] Unbreak for now + + src/hb-serialize.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 10f062234eb7c762a36cf750e75fe6f74ee89a3d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:44:01 2019 -0700 + + [map] Shuffle fini code + + src/hb-map.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e6b78003efbe02ba4542cadcc13bc1dd0b1d57b0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:33:30 2019 -0700 + + [vector] Add move semantics + + src/hb-vector.hh | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 4c4d3c3ed55a8f1eea20593c08322e61fe1cdd3c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:30:50 2019 -0700 + + [vector] Add some move and forwarding + + src/hb-serialize.hh | 2 +- + src/hb-vector.hh | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 7c9ceabcef426ca6fc54b70db9dd8cb63937710b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:19:36 2019 -0700 + + [meta] Add hb_move and hb_forward ala std:: + + src/hb-meta.hh | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit 9a19b885f9136b0b7cdfa04679274cd4b6d16188 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:14:30 2019 -0700 + + [serialize] Flesh out packing + + src/hb-serialize.hh | 58 +++++++++++++++++++++++++++++++---------------------- + 1 file changed, 34 insertions(+), 24 deletions(-) + +commit 357c7c611cc20f86c646bd2d392c243140f92d34 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:13:57 2019 -0700 + + [vector] Add copy constructor and assignment operator + + src/hb-vector.hh | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit 6f69c9d26fa53cd8a2331395bbc146bfc85fd1e3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 18:00:03 2019 -0700 + + [serialize] Minor + + src/hb-serialize.hh | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit a43290192beedc6335efc3841c05ec7fa54e8871 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 17:51:26 2019 -0700 + + [serialize] Add packed_map + + src/hb-map.hh | 7 +++++++ + src/hb-serialize.hh | 24 +++++++++++++++++++++--- + 2 files changed, 28 insertions(+), 3 deletions(-) + +commit bed150bd2e8d61950ea17d1b5a4bf4705801c1cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 17:26:35 2019 -0700 + + [serialize] Start fleshing out object stack + + src/hb-serialize.hh | 91 ++++++++++++++++++++++++++++++++++++++--------------- + src/hb-vector.hh | 9 ++++-- + 2 files changed, 72 insertions(+), 28 deletions(-) + +commit 63c35651893b2a1c555f728012e9ad36c0f84145 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 17:12:40 2019 -0700 + + [serialize] Simplify propagate_error() + + src/hb-serialize.hh | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit dbe9ba6711c6d35374de645097babfd81bc295b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 17:10:59 2019 -0700 + + [serialize] Add object_t, link_t, and snapshot_t + + src/hb-serialize.hh | 32 +++++++++++++++++++++++++++++++- + 1 file changed, 31 insertions(+), 1 deletion(-) + +commit 38d57b9a66008c9722125d4d677d759a910cf2a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 16:38:06 2019 -0700 + + [map] Add another TODO item + + src/hb-map.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7fd940f899da4948d2c61ed497c1face42776187 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 16:29:19 2019 -0700 + + [map] Add TODO + + src/hb-map.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 6dcf7c4017619c782dbc8bd2c584bb33df96fc83 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 15:08:39 2019 -0700 + + [serialize] Add unused 'tail' + + src/hb-serialize.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit fe05e48086be9ed685b8a6ca4af966660744bc0f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 15:06:25 2019 -0700 + + [serialize] Add ran_out_of_room + + src/hb-serialize.hh | 8 +++++++- + src/hb-subset.cc | 7 ++++++- + 2 files changed, 13 insertions(+), 2 deletions(-) + +commit a7c63cd8f8475c6de7fd5bb6444bf5d24082a191 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 14:59:40 2019 -0700 + + Split sanitize and dispatch into their own files + + src/Makefile.sources | 2 + + src/hb-dispatch.hh | 50 +++++++ + src/hb-machinery.hh | 369 +----------------------------------------------- + src/hb-sanitize.hh | 388 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 442 insertions(+), 367 deletions(-) + +commit be66b575fc15dbbe82cf1a7fa0b58020e86cffdc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 14:53:54 2019 -0700 + + Move serializer to hb-serialize.hh + + src/Makefile.sources | 1 + + src/hb-machinery.hh | 164 +----------------------------------------- + src/hb-serialize.hh | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 198 insertions(+), 163 deletions(-) + +commit bb22462f292995a724bf20363adf52d3a8357a97 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 14:46:54 2019 -0700 + + Whitespace + + src/hb-machinery.hh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit ef33b5d1f6d3ec21e15ad74ca2524a117f594e06 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 14:39:21 2019 -0700 + + [map] Deref pointers before equality check + + src/hb-map.hh | 6 ++++-- + src/hb-meta.hh | 4 ++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit c98f51da719d1792bf23b53a9a345926056bf34d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 14:30:22 2019 -0700 + + [map] Templatize hb_map_t + + Template name is hb_hashmap_t<K,V>. + + src/hb-map.hh | 65 ++++++++++++++++++++++++++++++++++------------------------- + 1 file changed, 37 insertions(+), 28 deletions(-) + +commit 4b7f4dbc0cf58d87f4c91f059734e91e4d988480 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Mar 30 13:48:32 2019 -0700 + + Add hb_deref_pointer() + + src/hb-algs.hh | 18 +++++++++++++----- + src/hb-meta.hh | 8 ++++++++ + 2 files changed, 21 insertions(+), 5 deletions(-) + +commit e5306927994e8e412dea5dd960b8b3ed4ca848eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 23:31:07 2019 -0700 + + [iter] Fix bug in hb_any() and hb_none() + + src/hb-iter.hh | 4 ++-- + src/hb-ot-layout-gsubgpos.hh | 12 ++++++------ + src/test-iter.cc | 2 +- + 3 files changed, 9 insertions(+), 9 deletions(-) + +commit f505b5d5c9c05741a933b4b986503e1697bbdfdb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:55:02 2019 -0700 + + [iter] Port remaining "for (auto" instances to daggers + + src/hb-ot-layout-gsubgpos.hh | 35 +++++++++++++++++++++++------------ + 1 file changed, 23 insertions(+), 12 deletions(-) + +commit 668d2d562fec797d779c6d6a43eb6e1c7cfbc07a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:48:38 2019 -0700 + + [iter] One more dagger + + src/hb-ot-layout-gsubgpos.hh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit d51452500f909803a346f26c71cf4b3f84f619bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:48:12 2019 -0700 + + [iter] Remove more wrong &&'s + + Sigh... + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 05f2130a1c479afe7982e8ddcfb3d83af9960e5b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:40:13 2019 -0700 + + [iter] More daggers + + src/hb-ot-layout-gsubgpos.hh | 110 +++++++++++++++++++++++++------------------ + 1 file changed, 64 insertions(+), 46 deletions(-) + +commit 22ec4c3aa5aa41b7aa2a89290851ddd386273579 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:27:46 2019 -0700 + + [iter] More daggers + + src/hb-ot-layout-gsubgpos.hh | 55 ++++++++++++++++++++++++++------------------ + 1 file changed, 33 insertions(+), 22 deletions(-) + +commit 688069bbfb40d69fb141371633cd499d91324cc2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:17:31 2019 -0700 + + [iter] One more dagger + + src/hb-ot-layout-gsub-table.hh | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +commit 90b60bd6909ffc6d0bff3e6901057439460407ca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:12:42 2019 -0700 + + Remove HB_DEBUG_WOULD_APPLY + + Not that useful. + + src/hb-debug.hh | 15 +--------- + src/hb-ot-layout-gsub-table.hh | 49 ++++++++++---------------------- + src/hb-ot-layout-gsubgpos.hh | 64 ++++++++++++++++++------------------------ + 3 files changed, 43 insertions(+), 85 deletions(-) + +commit 4d28267e59406cc85761131b84c5b2b4c65c6b35 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 22:04:15 2019 -0700 + + [iter] Port more to daggers + + src/hb-ot-layout-gsub-table.hh | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 9d8c72042b4a023b55cb39779407fdecaf098af1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:59:28 2019 -0700 + + Whitespace + + src/hb-ot-layout-gpos-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 418e9d07e2120f806852312f4c74204fa085a6cc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:57:26 2019 -0700 + + Simplify code + + src/hb-ot-layout-gsub-table.hh | 20 +++----------------- + 1 file changed, 3 insertions(+), 17 deletions(-) + +commit f5ef8a7347656ad5f5bb8cec5f9a3de262a79411 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:57:17 2019 -0700 + + [iter] Port one more function to dagger + + src/hb-ot-layout-gpos-table.hh | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit bcab098c8f35ac4bef6618d949a7bf1d95869fa5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:49:18 2019 -0700 + + [iter] Port more code to daggers + + src/hb-ot-layout-gsub-table.hh | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit 4c75158e1803e73d6126f715aa4b22ebe30aa7c7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:46:13 2019 -0700 + + [iter] Port two more functions to daggers + + src/hb-ot-layout-gsub-table.hh | 29 +++++++++++++++++------------ + 1 file changed, 17 insertions(+), 12 deletions(-) + +commit e70ccbe9edd4d5e033df4afa728b3593ba9f78af +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:45:49 2019 -0700 + + Fix pair signature + + Oh well. Again, who does fully understand what is right??? + + src/hb-algs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6237b47f0c59fd3913b19b23800cdf83eaa01fb6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:36:49 2019 -0700 + + [iter] Add hb_unzip() + + src/hb-iter.hh | 38 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +commit f1dad91eb3ce9dcdedbb4a0d6e34517db0154a84 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:17:08 2019 -0700 + + Whitespace + + src/hb-ot-layout-gsub-table.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 896b31670d07cbe276feff1db249b64faa5c552c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:16:30 2019 -0700 + + [iter] Port two more loops to dagger + + src/hb-ot-layout-gsub-table.hh | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 8e34cb251a9b22d6fbc637fd2f25965beb260270 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:14:20 2019 -0700 + + [iter] Remove unneeded && + + Next commit needs this. I never fully get this, sigh. + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 12a4c0441ff13e56bb87f53eab45930c2a6142ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 21:06:10 2019 -0700 + + Whitespace + + src/hb-ot-layout-gsub-table.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 4c38a9f6011a9b1dd6c4fc98620e23decc340322 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 20:23:07 2019 -0700 + + Remove hb_assign() + + Not needed anymore. We just use operator= now. + + src/hb-iter.hh | 2 +- + src/hb-machinery.hh | 2 +- + src/hb-null.hh | 13 ------------- + src/hb-open-type.hh | 2 +- + 4 files changed, 3 insertions(+), 16 deletions(-) + +commit b986c6a321f7d997eba0a9308b651966644bf336 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 20:17:46 2019 -0700 + + [C++11] Remove IntType::set() in favor of operator= + + src/hb-cff-interp-common.hh | 4 +- + src/hb-ft.cc | 2 +- + src/hb-null.hh | 6 --- + src/hb-open-file.hh | 14 +++--- + src/hb-open-type.hh | 43 +++++++++++------ + src/hb-ot-cff-common.hh | 24 +++++----- + src/hb-ot-cff1-table.hh | 32 ++++++------- + src/hb-ot-cmap-table.hh | 77 +++++++++++++++--------------- + src/hb-ot-glyf-table.hh | 2 +- + src/hb-ot-hdmx-table.hh | 12 ++--- + src/hb-ot-hmtx-table.hh | 8 ++-- + src/hb-ot-layout-common.hh | 44 ++++++++--------- + src/hb-ot-layout-gdef-table.hh | 8 ++-- + src/hb-ot-layout-gsub-table.hh | 18 +++---- + src/hb-ot-maxp-table.hh | 16 +++---- + src/hb-ot-os2-table.hh | 10 ++-- + src/hb-ot-post-table.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 10 ++-- + src/hb-ot-vorg-table.hh | 12 ++--- + src/hb-subset-cff-common.cc | 12 ++--- + src/hb-subset-cff-common.hh | 2 +- + src/hb-subset-cff1.cc | 10 ++-- + src/hb-subset-cff2.cc | 8 ++-- + src/hb-subset-glyf.cc | 8 ++-- + src/hb-uniscribe.cc | 22 ++++----- + 25 files changed, 206 insertions(+), 200 deletions(-) + +commit 58ad357951a732f05d9680573d00a4764171a9dd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 20:05:19 2019 -0700 + + [vector] Accept all types in push(...) + + Let assignment operator worry about conversion. + + src/hb-vector.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 489faf826ca16e9bc89515869ebaf52653450b54 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 20:01:37 2019 -0700 + + [C++11] Use type aliases for template partial instantiations + + src/hb-open-type.hh | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +commit 4fd02f6ee58ebf7b4ecf0526328938c5bd74a180 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 17:57:59 2019 -0700 + + Remove unused line + + src/hb-machinery.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 9a5b15dc1eda4f34496bb942d78f0df4e975b469 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 17:57:24 2019 -0700 + + [C++11] Replace BEInt.set() with operator= + + src/hb-machinery.hh | 15 +++++++++++---- + src/hb-open-type.hh | 8 ++++---- + 2 files changed, 15 insertions(+), 8 deletions(-) + +commit 0aa59b1de34ddebc242cca3ebddde6859269f5f1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 17:49:55 2019 -0700 + + [C++11] Add operator= to IntType<> + + Now that we require C++11 we can do this. + + src/hb-open-type.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eca466e6b1a3e29532af92a2d30b2555c0fafbfc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 15:59:04 2019 -0700 + + Err. Fixup C++11 polyfill removal + + Fixes 1d75db19fb5df139b9648ff3f5e6184a5c554345 + + src/hb.hh | 27 +++++++++++++++++++++------ + 1 file changed, 21 insertions(+), 6 deletions(-) + +commit 3f36c89f2ea16e293f8af7e7f549ebcd7247ea97 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 15:22:46 2019 -0700 + + Inline explicit_operator macro + + Now that we require C++11, no need to macro. + + src/hb-iter.hh | 2 +- + src/hb-machinery.hh | 2 +- + src/hb-open-type.hh | 2 +- + src/hb-vector.hh | 6 +++--- + src/hb.hh | 5 ----- + 5 files changed, 6 insertions(+), 11 deletions(-) + +commit 1d75db19fb5df139b9648ff3f5e6184a5c554345 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 15:20:34 2019 -0700 + + Remove C++<11 polyfill + + Leaving hb-atomic.hh as is since harmless and other projects might + copy from that file. + + src/hb.hh | 81 --------------------------------------------------------------- + 1 file changed, 81 deletions(-) + +commit 8e7887ca5f8a2822345bdcbdc873c73a31c81177 +Merge: 7929b0f0 90aebc6c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 14:37:04 2019 -0700 + + Merge branch 'master' into iter + +commit 90aebc6cf1aaca281ce51cb8e23831d7167cdcd3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 14:30:02 2019 -0700 + + Update RELEASING + + RELEASING.md | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 7929b0f07e87a77687ea50205e6e4013c9264f85 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 14:14:55 2019 -0700 + + [ci] Fix build + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b292772e6ef15728dd66329e637265748df0efe1 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Mar 29 13:00:56 2019 -0700 + + [dwrite] A new API, hb_directwrite_face_get_font_face (#1600) + + Can be useful when using HarfBuzz for font loading and shaping + but using DirectWrite for rendering. + + docs/harfbuzz-sections.txt | 10 ++++++++-- + src/hb-directwrite.cc | 34 ++++++++++++++++++++++++++++++---- + src/hb-directwrite.h | 3 +++ + 3 files changed, 41 insertions(+), 6 deletions(-) + +commit 59f36f36820f6e6fb1d3b6da26d6b5ee7588c42f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 10:55:12 2019 -0700 + + Replace REPLACEME's left out of 2.4.0 + + https://github.com/harfbuzz/harfbuzz/issues/1641 + + src/hb-common.h | 2 +- + src/hb-directwrite.cc | 2 +- + src/hb-subset-input.cc | 4 ++-- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit fe570bc043ca2c6be71b18f7401c8f06e73527e0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 10:51:38 2019 -0700 + + [docs] Remove unexisting section + + docs/harfbuzz-docs.xml | 1 - + 1 file changed, 1 deletion(-) + +commit 443db2a24624b63c49fa3ad9a10d3b4c523af1ce +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Mar 29 10:46:44 2019 -0700 + + [iter] Remove hb_len() + + Not planning on using it. So remove. Can add later if needed. + + src/hb-iter.hh | 8 -------- + src/test-iter.cc | 2 -- + 2 files changed, 10 deletions(-) + +commit bdd5a9c48d644b660f8fcac16902a576cc7ff443 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 28 21:58:07 2019 -0700 + + Add hb_hash() + + I don't like the hb_remove_reference() hack, but necessary. + + src/hb-algs.hh | 17 +++++++++++++++++ + src/hb-map.hh | 10 +--------- + src/hb.hh | 2 +- + 3 files changed, 19 insertions(+), 10 deletions(-) + +commit 343e6063dcd512164a999f1d12bae50877392a82 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 28 21:44:12 2019 -0700 + + Add hb_is_integer(T) + + src/hb-meta.hh | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit f639b9a8eab369bee6e36b3e60b585b4f720e77e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 28 21:34:47 2019 -0700 + + [iter] Add hb_len() function-object + + src/hb-iter.hh | 8 ++++++++ + src/test-iter.cc | 2 ++ + 2 files changed, 10 insertions(+) + +commit a030ce4ff83e0948e4f865accc5670e8b5e78dde +Merge: 11456b2d d6fc1d49 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Mar 28 21:26:50 2019 -0700 + + Merge branch 'master' into iter + commit d6fc1d49aa099104a889c96bc9087c21d8fc0960 Author: Behdad Esfahbod <behdad@behdad.org> Date: Thu Mar 28 21:21:26 2019 -0700 @@ -539,6 +7603,60 @@ Date: Tue Feb 19 02:23:58 2019 +0200 src/hb-common.cc | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) +commit 11456b2d9c1c567d1ad6496a3056154b69cafa21 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Fri Feb 15 16:58:43 2019 -0800 + + WHitespace + + src/hb-ot-layout-gsubgpos.hh | 4 ---- + 1 file changed, 4 deletions(-) + +commit 77060bcda229dc237d3952fbf5da59709cd81e05 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Fri Feb 15 16:55:08 2019 -0800 + + [iter] Add hb_all, hb_any, hb_none + + src/hb-iter.hh | 46 +++++++++++++++++++++++++++++++++++++++++++++- + src/test-iter.cc | 2 ++ + 2 files changed, 47 insertions(+), 1 deletion(-) + +commit 72dd5e34e0fc2902857c39cd4609d40b71fa4736 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Fri Feb 15 16:11:32 2019 -0800 + + [iter] Make hb_iter() into function-object + + src/hb-iter.hh | 28 +++++++++++++++++++--------- + 1 file changed, 19 insertions(+), 9 deletions(-) + +commit 98be7bd77ada32e58dad76897cefcf1d99538d2b +Author: Behdad Esfahbod <behdad@fb.com> +Date: Fri Feb 15 16:09:29 2019 -0800 + + [iter] Make hb_map into function-object + + src/hb-iter.hh | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit c1e5ba81fe4888143c1cf4a3deb3597875580c6d +Merge: b8b3b3e3 3da79dd5 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Fri Feb 15 16:06:03 2019 -0800 + + Merge remote-tracking branch 'origin/master' into iter + +commit b8b3b3e38b08ee7bb8d44481dd25febcee693554 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Fri Feb 15 16:05:36 2019 -0800 + + [iter] Add hb_enumerate() and use it + + src/hb-iter.hh | 39 +++++++++++++++++++++++++++++++++++++-- + src/hb-ot-layout-gsubgpos.hh | 32 ++++++++++++-------------------- + 2 files changed, 49 insertions(+), 22 deletions(-) + commit 3da79dd5b92b89fbf062cbe591e6b1ba83083aec Merge: 50005501 d8a68728 Author: Behdad Esfahbod <behdad@behdad.org> @@ -580,6 +7698,130 @@ Date: Fri Feb 15 19:23:46 2019 +0100 src/hb-atomic.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) +commit 1558a43342e2c5649cf48cb5860ac8a7aa9faf1d +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 20:46:13 2019 -0800 + + [test] Minor + + src/test-algs.cc | 1 + + 1 file changed, 1 insertion(+) + +commit fa373584def11c97d8a7db00d9abc04851ca9480 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 20:15:07 2019 -0800 + + [algs] Test pair more + + src/test-algs.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0d7af5fb02723d8f4e8ad93848e9abe384174b36 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 19:37:57 2019 -0800 + + [algs] Use universal references for hb_pair() + + Such that it carries lvalues inside. + + src/Makefile.am | 6 +++++- + src/hb-algs.hh | 2 +- + src/test-algs.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 51 insertions(+), 2 deletions(-) + +commit 5b99c92d4c6e294bb328113308e5c9cd23b3ed67 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 17:10:04 2019 -0800 + + [iter] Use more + + src/hb-iter.hh | 4 ++-- + src/hb-ot-layout-gsubgpos.hh | 10 ++++------ + 2 files changed, 6 insertions(+), 8 deletions(-) + +commit 72c1b59588bec30322abfa4de04b53e93122b25b +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 15:43:20 2019 -0800 + + [iter] Use in more places + + src/hb-ot-layout-gsubgpos.hh | 48 ++++++++++++++++++-------------------------- + 1 file changed, 20 insertions(+), 28 deletions(-) + +commit 40cce41eaeac731334251cccaa124407e6bffccb +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 15:14:37 2019 -0800 + + [iter] Use in a couple more intersects() calls + + src/hb-ot-layout-gsubgpos.hh | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit bafdf1829d15e658df55eabc0548e9ca71d18b1b +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 15:13:16 2019 -0800 + + [iter] Use in a couple more closure() calls + + src/hb-ot-layout-gsubgpos.hh | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit fa35d3fd81c1ddb847cdd83556f817db9ef7f35b +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 14:04:05 2019 -0800 + + [iter] Add hb_drain + + src/hb-iter.hh | 11 +++++++++++ + src/test-iter.cc | 7 ++++++- + 2 files changed, 17 insertions(+), 1 deletion(-) + +commit f4cfd6b6adbe0a87fe565a29b6cd600cf86f65dd +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 13:45:52 2019 -0800 + + [iter] A couple more hb_apply() + lambda uses + + src/hb-ot-layout-gsub-table.hh | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 7514a49f217c42ae0c895755e305f1d5b75c759d +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 13:16:33 2019 -0800 + + [iter] Use hb_apply() with lambda functions in a few places + + src/hb-ot-layout-gsub-table.hh | 30 +++++++++++++++++------------- + 1 file changed, 17 insertions(+), 13 deletions(-) + +commit 0670e1a6f5d9938d30d5d0674ea10752d4a58114 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 11:53:40 2019 -0800 + + [iter] Remove excess use of universal references + + Every time I have to study these to understand why a change is right.. + + src/hb-iter.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 773d75637c36426b96be43f1188c68d77ac4ba47 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 11:40:22 2019 -0800 + + [iter] Add hb_apply() + + src/hb-iter.hh | 30 ++++++++++++++++++++++++++++++ + src/test-iter.cc | 3 +++ + 2 files changed, 33 insertions(+) + +commit 5b725784e53a96ba4d983184a2670aba2aa0fd9c +Merge: 00db9409 28f77361 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 11:34:55 2019 -0800 + + Merge branch 'master' into iter + commit 28f77361322886360743fdbffd388c9482cf4257 Author: Behdad Esfahbod <behdad@fb.com> Date: Thu Feb 14 11:34:28 2019 -0800 @@ -591,6 +7833,98 @@ Date: Thu Feb 14 11:34:28 2019 -0800 .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) +commit 00db94095d53bd5e954be31caa428a3fd8f5f4c2 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 11:10:13 2019 -0800 + + [iter] Make hb_filter() a function-object + + src/hb-iter.hh | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit aa4c3212628f6861f1ef3ecb9eb5205b5780ac91 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 11:07:12 2019 -0800 + + [iter] Make hb_zip() a function-object + + src/hb-iter.hh | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit f8fcfb263e197c27015eeea56761b2dc8138da91 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 11:03:29 2019 -0800 + + [iter] Accept pointers to hb_sink() + + src/hb-iter.hh | 4 ++++ + src/hb-ot-layout-gsub-table.hh | 6 +++--- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit b530573ad9b30e06d5cecfd107941c573cd5d999 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 11:00:10 2019 -0800 + + [iter] Make hb_sink function-object + + src/hb-iter.hh | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit bb139cb8d0e4339042c5d0d0f192e13707c2bda4 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 10:51:47 2019 -0800 + + [iter] Back to dagger formatting for pipelines + + src/hb-ot-layout-gsub-table.hh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 5fa52e62b1744347970c42f42bbcd8d2e82d6c60 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 10:51:02 2019 -0800 + + [iter] Accept iterator, not iterable, in hb_sink()() + + src/hb-iter.hh | 8 ++++---- + src/test-iter.cc | 1 + + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 0f292ea85f54b3496fe87e6466acf43b76f57dcd +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 10:49:31 2019 -0800 + + [iter] Accept iterator, not iterable, in hb_filter()() + + src/hb-iter.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 345bfbb207b4d1174ee0ec41cf35cdc2e14936ff +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 10:48:20 2019 -0800 + + [iter] Accept iterator, not iterable, in hb_map()() + + src/hb-iter.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 16cc313dcd7d4ddf16451cadc118aeb680101384 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 10:40:05 2019 -0800 + + [iter] Use hb_sink() + + src/hb-ot-layout-gsub-table.hh | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit b702a0cbf8abae4622a99adf3a3b6adda3d9f2c1 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Thu Feb 14 10:39:58 2019 -0800 + + [iter] Add hb_sink() + + src/hb-iter.hh | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + commit 1cb1d5d7fb74e9f42dc8361dcdf669ed479d595d Merge: 8a568a88 d5287e1b Author: Michiharu Ariza <ariza@adobe.com> @@ -605,6 +7939,29 @@ Date: Thu Feb 14 10:08:16 2019 -0800 Merge branch 'master' into cff-retain-gids +commit 9e7383d124f1f1422f542720c76b4ee9605bda8b +Author: Behdad Esfahbod <behdad@fb.com> +Date: Wed Feb 13 23:54:36 2019 -0800 + + [CI] Disable cmake-oracledeveloperstudio bot + + Weird error: + + "/root/project/src/hb-iter.hh", line 277: Error: Type name expected instead of "decltype()". + "/root/project/src/hb-iter.hh", line 278: Error: Invalid type while substituting into Iter::item_t. + "/root/project/src/hb-iter.hh", line 317: Error: Type name expected instead of "decltype()". + "/root/project/src/hb-iter.hh", line 318: Error: Invalid type while substituting into Iter::item_t. + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4103252323b15a821f0a912b580c2107211b918f +Merge: f1b89344 d5287e1b +Author: Behdad Esfahbod <behdad@fb.com> +Date: Wed Feb 13 23:46:43 2019 -0800 + + Merge branch 'master' into iter + commit d5287e1ba40638be5d48178ce3d64557b622b01f Author: Behdad Esfahbod <behdad@fb.com> Date: Wed Feb 13 23:46:17 2019 -0800 @@ -614,6 +7971,40 @@ Date: Wed Feb 13 23:46:17 2019 -0800 .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) +commit f1b8934400137fe832909730ad86d73595612e9e +Author: Behdad Esfahbod <behdad@fb.com> +Date: Wed Feb 13 23:30:21 2019 -0800 + + [CI] Remove macos-notest-ios bot + + Not sure what ancient compiler it is (gcc 4.2?), but didn't like hb_zip SFINAE + apparently: + + In file included from /Users/distiller/project/src/hb-aat-layout.cc:28: + In file included from /Users/distiller/project/src/hb-open-type.hh:32: + In file included from /Users/distiller/project/src/hb.hh:642: + /Users/distiller/project/src/hb-iter.hh:364:1: note: candidate template ignored: substitution failure [with A = OT::Coverage, B = OT::OffsetArrayOf<OT::ChainRuleSet>]: non-type template argument does not refer to any declaration + hb_zip (const A& a, const B &b) + ^ + In file included from /Users/distiller/project/src/hb-aat-layout.cc:37: + In file included from /Users/distiller/project/src/hb-aat-layout-kerx-table.hh:31: + In file included from /Users/distiller/project/src/hb-kern.hh:32: + /Users/distiller/project/src/hb-ot-layout-gpos-table.hh:725:20: error: no matching function for call to 'hb_zip' + for (auto it = hb_zip (this+coverage, pairSet) + ^~~~~~ + + Not going to try to appease. + + .circleci/config.yml | 13 ------------- + 1 file changed, 13 deletions(-) + +commit 7d2376de336c7fc14d69e01add02115335f92db8 +Merge: 2d940946 890d0ee7 +Author: Behdad Esfahbod <behdad@fb.com> +Date: Wed Feb 13 22:08:54 2019 -0800 + + Merge branch 'master' into iter + commit 890d0ee77fecd6aa4f19b663bb2897735a0d4c0b Author: Ebrahim Byagowi <ebrahim@gnu.org> Date: Thu Feb 14 00:27:01 2019 +0330 @@ -1080,6 +8471,29 @@ Date: Thu Jan 31 12:54:36 2019 -0800 Merge branch 'master' into cff-more-arrayof-fixes +commit 2d940946d5af0e3869a2324b6e36ca8ea3698c48 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 16:03:16 2019 -0800 + + [iter] Fix mystery crash + + Fuzzer caught it: + + ==14==ERROR: AddressSanitizer: stack-use-after-return on address 0x7fca2ed7a3e0 at pc 0x0000006057aa bp 0x7ffc3290f1d0 sp 0x7ffc3290f1c8 + READ of size 4 at 0x7fca2ed7a3e0 thread T0 + SCARINESS: 55 (4-byte-read-stack-use-after-return) + #0 0x6057a9 in OT::SingleSubstFormat2::subset(hb_subset_context_t*) const /src/harfbuzz/src/./hb-ot-layout-gsub-table.hh:194:40 + #1 0x5ff921 in hb_subset_context_t::return_t OT::SingleSubst::dispatch<hb_subset_context_t>(hb_subset_context_t*) const /src/harfbuzz/src/./hb-ot-layout-gsub-table.hh:256:13 + + I can't reproduce locally, but many of the bots are failing because of this + as well. + + It's a pity that operator-> must return pointer. Ugh. Why?! + + src/hb-iter.hh | 4 ++++ + src/hb-ot-layout-gsub-table.hh | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + commit d14d2c20b05c5acf0a6f9c6dc36a7b8d8966153e Merge: acf5f0a3 dc04261a Author: Behdad Esfahbod <behdad@behdad.org> @@ -1099,6 +8513,13 @@ Date: Wed Jan 30 15:23:19 2019 -0800 test/fuzzing/hb-subset-fuzzer.cc | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) +commit 2e675d49f2f705a5b5d95574a5336d5e670a0fba +Merge: ede117dc acf5f0a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 15:10:43 2019 -0800 + + Merge branch 'master' into iter + commit acf5f0a3aff0e128509b0979f629edf0596fcee5 Author: Behdad Esfahbod <behdad@behdad.org> Date: Wed Jan 30 15:10:23 2019 -0800 @@ -1108,6 +8529,22 @@ Date: Wed Jan 30 15:10:23 2019 -0800 configure.ac | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) +commit ede117dc40d547cd457a420c9f7c9829cdb5f307 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 15:10:23 2019 -0800 + + [configure] Fix up + + configure.ac | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit cbe2118c588622070612ba7ac7eae7496a092e3c +Merge: 8b46c2d9 6b834c1c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 15:07:09 2019 -0800 + + Merge branch 'master' into iter + commit 6b834c1c76b867ef32747202a755255d2f360f1e Author: Behdad Esfahbod <behdad@behdad.org> Date: Wed Jan 30 15:06:22 2019 -0800 @@ -1117,6 +8554,52 @@ Date: Wed Jan 30 15:06:22 2019 -0800 configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) +commit 8b46c2d933b546a88799b08f4a74fd1285518ed5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 15:06:22 2019 -0800 + + [configure] Print compiler version info in report + + configure.ac | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 4aa4eedfd5633ee84d37469c9625d12856dbc575 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 15:02:29 2019 -0800 + + [ci] Switch clang-O3-O0 bot to Ubuntu image + + https://github.com/harfbuzz/harfbuzz/issues/1566 + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7c292c0853140540f13f73d43ef7f7e0746e5f28 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 14:54:23 2019 -0800 + + [iter] Warning fix + + Not sure why I don't get it, but this warning: + + warning: base class ‘struct hb_iter_fallback_mixin_t<hb_array_t<const OT::UVSMapping>, const OT::UVSMapping&>’ should be explicitly initialized in the copy constructor [-Wextra] + + src/hb-iter.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit a84b0145ea799c9452ecb97713689247955d30ff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 30 14:42:48 2019 -0800 + + [ci] Disable -Wunused-template on -Weverything bot + + ./hb-algs.hh:37:3: error: unused function template 'operator()' [-Werror,-Wunused-template] + operator () (const T& v) const { return v; } + ^ + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + commit d983c529b66b530715e9c813c69e699b1d8029d3 Merge: 55d1d7c8 e6ffcc59 Author: Behdad Esfahbod <behdad@behdad.org> @@ -1137,6 +8620,63 @@ Date: Wed Jan 30 13:54:15 2019 -0800 src/hb-version.h | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) +commit e799004e9f6821864b955a09673544d92e8b45e6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 17:15:12 2019 -0800 + + [iter] Whitespace + + src/hb-iter.hh | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +commit 849a0f1758b67eb3b4d864047b9df671e76404a5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 17:10:19 2019 -0800 + + [iter] Add hb_iter_with_fallback_t instead + + src/hb-array.hh | 5 +---- + src/hb-iter.hh | 29 +++++++++++++---------------- + src/hb-ot-layout-common.hh | 5 +---- + src/hb-set.hh | 5 +---- + src/test-iter.cc | 5 +---- + 5 files changed, 17 insertions(+), 32 deletions(-) + +commit 4d40ed9d1a7a4f18af6710a1b8ba90257b8456a0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 13:55:23 2019 -0800 + + [iter] Add hb_iter_with_mixin_t<> + + src/hb-array.hh | 5 +++-- + src/hb-iter.hh | 18 ++++++++++++++++-- + src/hb-ot-layout-common.hh | 5 +++-- + src/hb-set.hh | 5 +++-- + src/test-iter.cc | 5 +++-- + 5 files changed, 28 insertions(+), 10 deletions(-) + +commit 6521d5b201cb8df5a3c2657b4da703cf52472f81 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 13:44:39 2019 -0800 + + [iter] Export operator << / >> + + src/hb-iter.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 84a25d79c649776a299526c087bf369a9705f89e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 29 13:39:19 2019 -0800 + + [iter] Rename + + src/hb-array.hh | 2 +- + src/hb-iter.hh | 12 ++++++------ + src/hb-ot-layout-common.hh | 2 +- + src/hb-set.hh | 2 +- + src/test-iter.cc | 2 +- + 5 files changed, 10 insertions(+), 10 deletions(-) + commit e6ffcc5904ab88143cad0c7a7a4c990147af278b Author: Garret Rieger <grieger@google.com> Date: Mon Jan 28 18:12:19 2019 -0800 @@ -1350,6 +8890,46 @@ Date: Tue Jan 29 12:19:57 2019 -0800 Merge branch 'master' into cff-more-arrayof-fixes +commit e75b22039f4129b5057f4b175c9e9d79634b1728 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:26:23 2019 -0500 + + Move hb_addressof() to hb-meta.hh + + src/hb-algs.hh | 12 ------------ + src/hb-iter.hh | 1 - + src/hb-meta.hh | 14 +++++++++++++- + src/hb.hh | 2 +- + 4 files changed, 14 insertions(+), 15 deletions(-) + +commit 6cf25c2971aa9a7471b1cc00176ef36e9acacad4 +Merge: 71157a45 fe532923 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:23:28 2019 -0500 + + Merge branch 'master' into iter + +commit 71157a4520ae5cdbbeb197a979ae02b484856686 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:20:12 2019 -0500 + + [meta] Remove _ft struct names + + Using decltype() instead. + + src/hb-algs.hh | 8 ++++---- + src/hb-iter.hh | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 9103bd056fadd73eab2531f632790920ce602f18 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 21:16:51 2019 -0500 + + [pair] Use decltype + + src/hb-algs.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + commit fe532923101586e316b300d419a337d357cd93da Author: Behdad Esfahbod <behdad@behdad.org> Date: Mon Jan 28 20:47:58 2019 -0500 @@ -1384,6 +8964,53 @@ Date: Mon Jan 28 20:38:15 2019 -0500 README.md | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 19 deletions(-) +commit a30e13469e6d3ec6ff412211722d26f70a97e261 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 16:39:01 2019 -0500 + + [iter] Add operator << to set / vector + + src/hb-set.hh | 3 +++ + src/hb-vector.hh | 3 +++ + 2 files changed, 6 insertions(+) + +commit d438e610420d931a203b31332cf74d7e0f9dd3f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 16:34:04 2019 -0500 + + [iter] Fix operator() impls + + src/hb-map.hh | 5 +++-- + src/hb-ot-layout-common.hh | 8 +++++--- + src/hb-set.hh | 3 ++- + 3 files changed, 10 insertions(+), 6 deletions(-) + +commit 57795bc8dd6a9ee894c2abb8633c271876b5f596 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 16:23:12 2019 -0500 + + [iter] Add operator>> and operator<< + + src/hb-iter.hh | 4 ++++ + src/test-iter.cc | 4 ++++ + 2 files changed, 8 insertions(+) + +commit 8bd96be9940ca73e45138172f9f4178190566225 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 16:17:36 2019 -0500 + + [iter] Use auto c = C.iter() internally + + src/hb-iter.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 073fa4ac5aff4ee72bbb38676bd351b5aa1ec167 +Merge: d592bd16 9a1df82e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 14:35:41 2019 -0500 + + Merge branch 'master' into iter + commit 9a1df82e3f13fbd4488ee9955814bbb5d0957074 Author: Behdad Esfahbod <behdad@behdad.org> Date: Mon Jan 28 14:15:18 2019 -0500 @@ -1422,6 +9049,153 @@ Date: Mon Jan 28 14:09:45 2019 -0500 src/hb.hh | 3 +++ 1 file changed, 3 insertions(+) +commit d592bd16cd6c5ad1ee351d90d213ee2a1ea71b05 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 28 13:41:40 2019 -0500 + + Try fixing MSVC build + + src/hb-algs.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 0363ce650b6085f62e66aff4639aa203fa17d419 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 27 01:03:56 2019 +0100 + + [iter] Accept C arrays in hb_iter() + + src/hb-array.hh | 4 +--- + src/hb-iter.hh | 11 +++++++++++ + src/test-iter.cc | 5 ++++- + 3 files changed, 16 insertions(+), 4 deletions(-) + +commit b62e7f9223a6369768bde2500efe1bd1d27a0ea2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 27 00:51:43 2019 +0100 + + [test] Test unary operator+ + + "Test" as in compiles.. + + src/test-iter.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 778c96b8d7b86ae2a0fe944f499fa4a57c12e365 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 27 00:50:54 2019 +0100 + + [iter] Fix hb_iter() + + src/hb-algs.hh | 4 ---- + src/hb-iter.hh | 10 +++++++--- + src/test-iter.cc | 2 +- + 3 files changed, 8 insertions(+), 8 deletions(-) + +commit 2f5b1a9104e5f4a14aa77a2f4c3c6e1c2837500c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 27 00:49:37 2019 +0100 + + [iter] Add unary operator+ that returns a copy + + src/hb-iter.hh | 1 + + src/test-iter.cc | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit fbab07f9b3dac90ce2136506f72879335193fc02 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 27 00:44:45 2019 +0100 + + [iter] Add hb_bool() and make hb_filter default to it for predicate + + src/hb-algs.hh | 6 ++++++ + src/hb-iter.hh | 4 ++-- + src/test-iter.cc | 10 +++++++++- + 3 files changed, 17 insertions(+), 3 deletions(-) + +commit 313d63e240736bfe7c312133fe8c09ccff428d52 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 22:58:26 2019 +0100 + + [meta] Back to using _ft suffix for function-object types + + Seprate namespace, cleaner, more clear. + + src/hb-algs.hh | 6 +++--- + src/hb-iter.hh | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 2aff6d9625673062b1129e2af5b7d029f7622e71 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 22:54:25 2019 +0100 + + [iter] Test that default-constructed iterators are empty + + src/test-iter.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit f35e7eabf10d99c2a4ddab054cf89f3da359e7a8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 22:50:00 2019 +0100 + + pragma GCC diagnostic error "-Winjected-class-name" + + See 6b6783e1588ebe5772a1edc19552219e9d931bda + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 509353357c220a3a60910b70b3a90ea8fa6a14a8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 22:47:35 2019 +0100 + + [iter] Use hb_declval() instead of Null() to get instance + + I had used Null to make one of the bots happy before. Not going + to bend to such demands anymore.. + + src/hb-iter.hh | 3 +-- + src/hb.hh | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 6b6783e1588ebe5772a1edc19552219e9d931bda +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 22:44:09 2019 +0100 + + [iter/meta] Fix build on newer clang + + The mystery failure had to do with SFINAE failure because the template + function involved was accessing ::iter_t of a type that was also named iter_t. + In this context, apparently: + + warning: ISO C++ specifies that qualified reference to 'iter_t' is a + constructor name rather than a type in this context, despite preceding 'typename' keyword + [-Winjected-class-name] + + We use a new macro, also called hb_iter_t(), to get iterator type of + a type. This uses declval/hb_decltype, and has the added benefit + that it returns correct type for const vs non-const objects, if they + have different iterators. + + src/hb-iter.hh | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +commit 5adb113bafb2cf10ea768ff7a15ad4e6a1270a29 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 22:15:59 2019 +0100 + + [meta] Mark function-objects as const + + src/hb-algs.hh | 6 +++--- + src/hb-iter.hh | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit ac90f17c552e5264ad0a9d17c50fac9008d6ebe7 +Merge: 090fe56d 60022ecc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 26 14:05:39 2019 +0100 + + Merge branch 'master' into iter + commit 60022ecced202760daa7f75516bba6a4689a49de Author: Behdad Esfahbod <behdad@behdad.org> Date: Sat Jan 26 14:04:51 2019 +0100 @@ -1451,6 +9225,13 @@ Date: Fri Jan 25 16:08:25 2019 +0100 src/hb-set-digest.hh | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) +commit 090fe56dc6ef5f7afa297f2cb200418a520a2026 +Merge: 21c0713a 06358ae9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 25 15:34:03 2019 +0100 + + Merge branch 'master' into iter + commit 06358ae9746ae72c0917e8a5f294d14fd695f380 Author: Behdad Esfahbod <behdad@behdad.org> Date: Fri Jan 25 15:11:47 2019 +0100 @@ -2030,6 +9811,1306 @@ Date: Mon Jan 21 04:47:05 2019 +0000 docs/usermanual-install-harfbuzz.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) +commit 21c0713a1cf4b42b5dfa8fb9bdf1c1935a481b00 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 21:24:51 2019 -0800 + + Whitespace + + src/hb-ot-layout-gsub-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 934d3fa2a7d5d47da7030f43ea7ca7234625fc7e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 21:00:13 2019 -0800 + + Use more iter pipelines + + src/hb-ot-layout-gpos-table.hh | 9 +++++---- + src/hb-ot-layout-gsubgpos.hh | 32 ++++++++++++++++++-------------- + 2 files changed, 23 insertions(+), 18 deletions(-) + +commit 420d8ac350590d776832dc7b353d997857cd7b45 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 20:58:25 2019 -0800 + + [algs] Add hb_iter() + + Makes it nicer in pipelines. + + src/hb-algs.hh | 4 ++++ + src/hb-ot-layout-gsub-table.hh | 6 +++--- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 54ec48ea20d7d7d9e62bca12265e2f26383f9bc1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 20:54:21 2019 -0800 + + Use iter pipelines more + + src/hb-ot-layout-gsub-table.hh | 81 +++++++++++++++++++++++------------------- + 1 file changed, 44 insertions(+), 37 deletions(-) + +commit 83cecd80d93a1e09231b8deaa6ecf8cd44875dfd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 19:49:13 2019 -0800 + + [iter] Default projection to identity + + src/hb-algs.hh | 6 +++--- + src/hb-iter.hh | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit a699c6b17cf2d272ac445838e82db6b0017cdbd7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 19:42:41 2019 -0800 + + [algs] Add hb_identity + + src/hb-algs.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 463cfb426ff94b78b8e44f1c5662931b948beca7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 16:19:40 2019 -0800 + + Fix unused-variable warnings + + inline variables are not C++11, so mark them unused... + + src/hb-algs.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f4cbb1ee0c7e1c2911c3676936e1bb571f6b255f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 13:28:00 2019 -0800 + + WIP + + src/hb-ot-layout-gsub-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 471e96e55d3366a6ad723fe88c9aa895921c048f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 12:42:01 2019 -0800 + + [iter] Use forwarding references + + src/hb-iter.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 528ea66f24c326d7361663a145bd9b8081c7c5c2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 12:36:17 2019 -0800 + + [algs] Fix hb_first() / hb_second() + + src/hb-algs.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 343f5a4bfcf528ed8f5239fae9ddfca64b998fde +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 12:35:45 2019 -0800 + + [iter] Misc fixes to get piping almost work + + src/hb-iter.hh | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 7cedf7f64c2be0d16771dba73fd370325f7b66a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 12:22:14 2019 -0800 + + Change hb_first() and hb_second() to function objects + + src/hb-algs.hh | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit f35568d603df6409e4f867acf2f58794560f6649 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 11:32:33 2019 -0800 + + [iter] Add hb_filter() + + Untested. + + src/hb-iter.hh | 39 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 39 insertions(+) + +commit 1733e4702c4f4f8058e69500008d050cf9df0318 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 11:15:49 2019 -0800 + + [iter] Add hb_map() + + Untested. + + src/hb-iter.hh | 43 ++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 42 insertions(+), 1 deletion(-) + +commit f7fcc476418099e2b89c52068ac81280a95bf76f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 11:00:32 2019 -0800 + + [iter] Make hb_zip() take const references + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ede1a71b31f49a6dc247ac0491b78508346e9932 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 10:45:53 2019 -0800 + + Minor rename + + src/hb-ot-layout-gsub-table.hh | 12 ++++++------ + src/hb-ot-layout-gsubgpos.hh | 6 +++--- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit 93551669c5a41ee11a156ef60a9f80dc328430b9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 10:18:49 2019 -0800 + + Remove unused Coverage::iter_t::get_coverage() + + src/hb-ot-layout-common.hh | 11 ----------- + 1 file changed, 11 deletions(-) + +commit af2067e87b06995a9cc9154baab2a5bc4f3f6955 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 10:17:33 2019 -0800 + + Use hb_zip() moooore + + src/hb-ot-layout-gsub-table.hh | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit 0d1fdf939de13bb1994bc8f70da7f9f511b7e5be +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 10:06:48 2019 -0800 + + Use hb_zip() some mooore + + src/hb-ot-layout-gpos-table.hh | 13 +++------ + src/hb-ot-layout-gsub-table.hh | 64 +++++++++++------------------------------- + 2 files changed, 21 insertions(+), 56 deletions(-) + +commit af6c1902356c937bc47ad8c37ab6f037b5810b67 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 10:01:28 2019 -0800 + + Use hb_zip() some moore + + src/hb-ot-layout-gsubgpos.hh | 52 ++++++++++++-------------------------------- + 1 file changed, 14 insertions(+), 38 deletions(-) + +commit 83ad0b6d0f3e7656f78611e89d7ebb939cd8e713 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 09:57:36 2019 -0800 + + Use hb_zip() some more + + src/hb-ot-layout-gsub-table.hh | 36 ++++++++++-------------------------- + 1 file changed, 10 insertions(+), 26 deletions(-) + +commit f0dd0656b8d2038ae6aa8d0a39d17130ddc8f16f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 09:52:10 2019 -0800 + + Use hb_zip() some + + src/hb-ot-layout-gsub-table.hh | 20 +++++--------------- + 1 file changed, 5 insertions(+), 15 deletions(-) + +commit 200cdb721bfb125cd462437ccbcc40554560c4d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 09:49:12 2019 -0800 + + [iter] Rename hb_zip_t to hb_zip_iter_t + + src/hb-iter.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 3290c181c17db33991cd1b79eca49f70d2601ce0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 09:08:15 2019 -0800 + + [algs] Whitespace + + src/hb-algs.hh | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit 014c50292b471de0167b65fdc0eb446245438b84 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 09:07:01 2019 -0800 + + [iter] Move code + + src/hb-iter.hh | 47 ++++++++++++++++++++++++++++------------------- + 1 file changed, 28 insertions(+), 19 deletions(-) + +commit 6e3ad650d1b864742084c6254d020734f09cb396 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 09:05:01 2019 -0800 + + Rename hb-dsalgs to hb-algs + + src/Makefile.sources | 2 +- + src/{hb-dsalgs.hh => hb-algs.hh} | 6 +++--- + src/hb-array.hh | 2 +- + src/hb-debug.hh | 2 +- + src/hb-iter.hh | 2 +- + src/hb.hh | 8 ++++---- + 6 files changed, 11 insertions(+), 11 deletions(-) + +commit f27607580e4d13e8ddf721df971a7d5062c54fb2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 09:03:21 2019 -0800 + + [algs] Add hb_first() and hb_second() + + src/hb-dsalgs.hh | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit a7de144df342f30b3d6f9e61c3fe3d1348ab222d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 08:39:25 2019 -0800 + + Implement uniform map interface + + Coverage, ClassDef, hb_set_t, and hb_map_t implement. + + src/hb-map.hh | 13 +++++++------ + src/hb-ot-layout-common.hh | 14 ++++++++++++-- + src/hb-set.hh | 17 ++++++++++++----- + 3 files changed, 31 insertions(+), 13 deletions(-) + +commit 7987095e64e52b509661828aeadabe0b27bba0d0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 01:02:38 2019 -0800 + + [meta] Remove hb_enable_if_t + + It was only used for C++<11 which does not allow default parameters + in function templates. Looks like we cannot support <11 anyway, so, + start cleaning up. + + src/hb-iter.hh | 18 +++++++++--------- + src/hb-meta.hh | 1 - + src/hb-open-type.hh | 14 ++++++-------- + src/hb-ot-layout-common.hh | 21 +++++++++------------ + src/test-iter.cc | 12 ++++++------ + 5 files changed, 30 insertions(+), 36 deletions(-) + +commit 15a69284369ce739e79bf288a55c4c3010313144 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 00:36:47 2019 -0800 + + [iter] Implement operator-> unconditionally + + The right condition to check for would have been "is_struct", which + we don't have. + + src/hb-iter.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 8f52a827e7d93abf3ef6159fd00f7c85c6d46793 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 00:36:26 2019 -0800 + + Allow rvalues in hb_addressof() + + src/hb-dsalgs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a4ea0d368015b91df8d4c164a8838c45943562dc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 00:32:11 2019 -0800 + + [iter] Change from const_iter_t/iter_t to iter_t/writer_t + + src/hb-open-type.hh | 26 ++++++++++++-------------- + src/hb-vector.hh | 13 ++++++------- + 2 files changed, 18 insertions(+), 21 deletions(-) + +commit 7798e4fcc34edca5c7d5d2fe7abd09a0540f0fea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 9 00:25:53 2019 -0800 + + [iter] Change Coverage iterator to only return glyph-id + + src/hb-ot-layout-common.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 84e5d002290eb2f58392743bc841fa7def7fc96d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 23:57:16 2019 -0800 + + [iter] Add hb_zip() + + src/hb-iter.hh | 34 ++++++++++++++++++++++++++++++++++ + src/test-iter.cc | 2 ++ + 2 files changed, 36 insertions(+) + +commit 636786ecaf18c52d4c337d009434b22e868ab796 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 23:48:35 2019 -0800 + + [iter] Rename __item_type__ to __item_t__ + + src/hb-array.hh | 2 +- + src/hb-iter.hh | 4 ++-- + src/hb-ot-layout-common.hh | 4 ++-- + src/hb-set.hh | 2 +- + src/test-iter.cc | 2 +- + 5 files changed, 7 insertions(+), 7 deletions(-) + +commit 6caf76f4a8b5e232a87b84dc5e357dddef63d00b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 23:28:05 2019 -0800 + + Tighten Coverage iteration + + src/hb-ot-layout-common.hh | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit ff3a7ce1e75b020c2d536200beb5610ed054e097 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 23:20:23 2019 -0800 + + [subset] Minor + + src/hb-ot-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42bf80e578a1b7f4023b3edeea7de103a3c7d7be +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 19:13:17 2019 -0800 + + [iter] More semicolon + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f78f837ef17591144d6b22ae3cc71c49458253ff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 16:38:08 2019 -0800 + + [iter] Use aliasing using for types + + Fix ambiguity of hb_sorted_array_t::item_t with gcc. No idea if that's a gcc bug + or what spec requires, but using aliasing using seems to fix it. It probably breaks + our non-C++11 bots, in which case I have to condition the change. Testing. + + src/hb-iter.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3fc03e42ce73021c4573729a637d19346f7e5f44 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 16:33:31 2019 -0800 + + [iter] Use static_assert with hb_is_random_access_iterator() + + Both, checks constexpr'ness, and fixes build with cra**y implementations + of assert() macro: + + test-iter.cc:108:11: error: too many arguments provided to function-like macro invocation + assert (hb_is_random_access_iterator (array_iter_t<int>)); + ^ + ./hb-iter.hh:186:42: note: expanded from macro 'hb_is_random_access_iterator' + hb_is_random_access_iterator_of (Iter, typename Iter::item_t) + ^ + /usr/include/x86_64-linux-gnu/sys/cdefs.h:89:9: note: macro '__STRING' defined here + \#define __STRING(x) #x + ^ + test-iter.cc:108:3: error: use of undeclared identifier '__STRING' + assert (hb_is_random_access_iterator (array_iter_t<int>)); + ^ + /usr/include/assert.h:91:21: note: expanded from macro 'assert' + : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION)) + ^ + + src/test-iter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6af9c5f18eaf51f2d7e564d23d9b09219af9d700 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 16:27:37 2019 -0800 + + [iter] Remove stray semicolons + + src/hb-iter.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 74ca7b580c284d6fe3bf7067a19a2095102e72d1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 13:48:42 2019 -0800 + + [OT] Implement operator[] for Coverage and ClassDef + + src/hb-ot-layout-common.hh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 6c548b6657d419e013969f9a456418e46bef0b30 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 13:43:49 2019 -0800 + + [iter] Add TODO + + src/hb-iter.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 362d4e7cc324bf99b087aa34a4fae6898e50674f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 13:41:30 2019 -0800 + + [iter] Implement for OT::ArrayOf / OT::SortedArrayOf + + src/hb-open-type.hh | 36 ++++++++++++++++++++++++------------ + 1 file changed, 24 insertions(+), 12 deletions(-) + +commit 2f837a365c0986c2f925624d9c00ede8cd9e7669 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 13:05:01 2019 -0800 + + [SortedArrayOf] Fix sub_array() return type + + src/hb-open-type.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 54c30e949e7d0a80c19cb8a12c300d62425683a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 13:00:06 2019 -0800 + + [iter] Constrain hb_fill() and hb_copy() + + src/hb-iter.hh | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit dc0a98cbe7be25a38220eda19ee06b19bf2d130d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 12:57:01 2019 -0800 + + [iter] Add TODO + + src/hb-iter.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2658e40ffb66dba6e2e5525d6ee4792fe1ea1dd1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 12:53:02 2019 -0800 + + [iter] Add hb_is_random_access_iterator() + + src/hb-iter.hh | 10 +++++++--- + src/test-iter.cc | 2 ++ + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit 445364d80a06007de5ac4c0fca9bb0b846f25c9c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 12:42:15 2019 -0800 + + [iter] Rename hb_is_[sorted_]iterator() -> hb_is_[sorted_]iterator_of() + + src/hb-iter.hh | 15 +++++++++------ + src/hb-open-type.hh | 4 ++-- + src/hb-ot-layout-common.hh | 6 +++--- + src/test-iter.cc | 2 +- + 4 files changed, 15 insertions(+), 12 deletions(-) + +commit a6c013b1bf1f828f1eea7db801f2efb9a1486773 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 14:27:51 2019 -0500 + + [meta] Add hb_declval() macro + + src/hb-iter.hh | 2 +- + src/hb-meta.hh | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit adc5910a63f209e35133c59f4466443844c9a18a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 14:26:41 2019 -0500 + + [iter] Syntax + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ca6adcd1ad35932aeac4d46a191809b010636b3d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 8 14:23:12 2019 -0500 + + [iter] Test hb_is_iterable / hb_is_iterator + + src/test-iter.cc | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 8237809f065f41653a12c95885e3b76409c42f36 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 22:00:45 2019 -0500 + + [serialize] Make SortedArrayOf:;serialize() take sorted-iterator + + src/hb-open-type.hh | 17 +++++++++++++++++ + src/hb-ot-cmap-table.hh | 18 +++++++++--------- + 2 files changed, 26 insertions(+), 9 deletions(-) + +commit 47333c8a304c6f57f848b5f60eea8ec85ffe2b33 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 21:38:49 2019 -0500 + + [iter] Fix operator-> + + src/hb-iter.hh | 3 ++- + src/test-iter.cc | 3 +++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 177a8af380738e5be598952adbf275503bb3f5bc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 20:20:44 2019 -0500 + + [array] SFINAE fun + + src/hb-array.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8414f167879c1af8ce5c80a15ba1aec2f7e436a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 19:41:52 2019 -0500 + + [meta] Rename + + src/hb-meta.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 8e0a58e1b3f338098d2384f2e6e0b4ad08d6c042 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 19:03:53 2019 -0500 + + [array] Remove construction that was removing constness + + src/hb-array.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 85969e357a34691cc42c88490fc7e341175783dd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 18:59:26 2019 -0500 + + [iter] Fix test + + src/test-iter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit da4996183693b4acecf245c58b58d6040d92a1bf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 18:36:14 2019 -0500 + + [iter] Remove comment + + src/hb-iter.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 815cde9fa3465828030ca1ed4f32ca1df72c1f37 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 18:33:04 2019 -0500 + + [iter] Use is_sorted_iterator + + src/hb-aat-map.hh | 2 +- + src/hb-array.hh | 4 +++ + src/hb-meta.hh | 23 +++++++++------- + src/hb-ot-layout-common.hh | 8 +++--- + src/hb-ot-layout-gsub-table.hh | 42 +++++++++++++++--------------- + src/hb-ot-map.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 4 +-- + src/hb-set.hh | 2 +- + src/hb-vector.hh | 32 ++++++++++++++--------- + 9 files changed, 66 insertions(+), 53 deletions(-) + +commit ed4336680d3fc080f99c7dd67db48c55bcd7a020 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 7 17:24:23 2019 -0500 + + [iter] Handhold hb_is_iterator() type deduction + + by partial-instantiating on Iter. + + src/hb-iter.hh | 18 +++++++++++------- + 1 file changed, 11 insertions(+), 7 deletions(-) + +commit cb5011d364904452a625cfc0485f5a713f472d07 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 4 11:22:32 2019 -0500 + + Revert "[iter] Add hb_iter_of_t<>" + + This reverts commit d6cbe96e2fc7bc8f1c10e631b52b1ef31ff9a6f5. + + Isn't useful, as duplicate inheritance of same type results in ambiguity + errors... + + src/hb-iter.hh | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit c132cda9d98286f002d2f5b27d1d00bf80b42a9c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 2 17:00:01 2019 -0500 + + [iter] Fix warnings + + src/hb-iter.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit c9d8a07e30d05b870c3d2374853adba019601b02 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 2 16:43:52 2019 -0500 + + [iter] Add hb_iter_of_t<> + + src/hb-iter.hh | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit b5d6fe1a452c72dd47d20c03a563321771330acc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 2 16:20:40 2019 -0500 + + [iter] Remove hb_sorted_iter_t + + Not enforcing it using type hierarchy. + + src/hb-array.hh | 6 ++++-- + src/hb-iter.hh | 26 ++++---------------------- + src/hb-ot-layout-common.hh | 3 ++- + src/hb-set.hh | 3 ++- + 4 files changed, 12 insertions(+), 26 deletions(-) + +commit 255085bd599cb108779d467690b372263f304dcb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 2 16:14:00 2019 -0500 + + [iter] Const correctness + + src/hb-open-type.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 415f3f4320c80d47e03fe9594a917fb2964b1144 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Dec 31 13:37:13 2018 -0500 + + Add operator= to IntType, commented out + + https://github.com/harfbuzz/harfbuzz/pull/1510 + + src/hb-open-type.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 183be8f452862aaf0cdedb28d54ec114d67745b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 20:58:25 2018 -0500 + + [iter] Minor + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6cd96ba1aca99b6eb31f8402d02c565dd4e96e03 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 20:51:31 2018 -0500 + + [iter] Make is_random_access_iterator a constant + + We cannot rely on constexpr functions... + + src/hb-array.hh | 2 +- + src/hb-iter.hh | 11 ++++------- + src/test-iter.cc | 2 +- + 3 files changed, 6 insertions(+), 9 deletions(-) + +commit a685bfe8fc93ac1886a708687ea6fa7aa0b7c8c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 20:24:21 2018 -0500 + + Separate GlyphID from HBUINT16 + + For stricter enforcement. + + src/hb-dsalgs.hh | 8 ++++---- + src/hb-open-type.hh | 2 +- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 8 ++++++-- + 4 files changed, 12 insertions(+), 8 deletions(-) + +commit 8ac64d00907756333d5917db4b627619420f9260 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 20:06:12 2018 -0500 + + [iter] Fix sorted_iter iter class + + src/hb-array.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 93615b9598f6b5e514384327b30acfd6bd8cfcfb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 19:12:06 2018 -0500 + + [iter/meta] Add hb_is_sorted_iterator() + + src/hb-iter.hh | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit 92f25db1e86c7b79962a2eb735cd3596c302f71f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 19:10:26 2018 -0500 + + [iter] Remove stale comment + + src/hb-iter.hh | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 40c24fd4a623c5f570e657f22fb4e88cba48b02b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 19:06:47 2018 -0500 + + [iter] Port Coverage towards iter_t instead of array_t specifics + + src/hb-ot-layout-common.hh | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit d552b6818c21efe9eae8b9cd72d5199dadd3724f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 18:54:07 2018 -0500 + + [meta] Move typename around + + We'll see if bots like. + + src/hb-atomic.hh | 2 +- + src/hb-blob.hh | 2 +- + src/hb-iter.hh | 2 +- + src/hb-meta.hh | 6 +++--- + src/hb-null.hh | 6 +++--- + 5 files changed, 9 insertions(+), 9 deletions(-) + +commit f64ea8fc65b0dacc2ac3b1de97c92488b6e1b6fa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 18:49:34 2018 -0500 + + [meta] Move code around + + src/hb-atomic.hh | 1 + + src/hb-meta.hh | 10 ++++++++++ + src/hb.hh | 14 +------------- + 3 files changed, 12 insertions(+), 13 deletions(-) + +commit aa2ab4f0617c50de2501722205d3d0eaaf808ff4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 18:47:47 2018 -0500 + + [iter] WHitespace + + src/hb-iter.hh | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 851fbb23ea552bc639269670949a9937236d96d5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 18:45:50 2018 -0500 + + [iter] Port Coverage::serialize to hb_is_iterator + + src/hb-open-type.hh | 2 +- + src/hb-ot-layout-common.hh | 18 ++++++++++++------ + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit 06a44e2e537303ab8ed1fb761bf3885eb433a718 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 18:42:14 2018 -0500 + + [iter/meta] Match hb_is_iterator<> using SFINAE + + By specifying Item type, which is desirable. + + src/hb-iter.hh | 28 +++++++++++----------------- + src/hb-open-type.hh | 2 +- + 2 files changed, 12 insertions(+), 18 deletions(-) + +commit bcb913efb484e971d8a76ac1a897a1724bdad58b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 17:54:24 2018 -0500 + + Minor + + src/hb-ot-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa1ae3d465fd627ea99c5eb597b85cffe04c1e34 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 12:01:13 2018 -0500 + + Use C++11 when available + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dc0f98298eca6520efd6e05d34f9aa7847979203 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 11:22:16 2018 -0500 + + [ci] Remove unused config for gcc 4.2 + + [skip ci] + + .circleci/config.yml | 25 ------------------------- + 1 file changed, 25 deletions(-) + +commit eaa9023634282bed5955a068f9f92b8ef1733c39 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 11:16:14 2018 -0500 + + [ci] Disable other gcc 4.2 bot + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 859a880b083c67e767162c394e08c46367078b0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 02:11:03 2018 -0500 + + [iter] Add back operator + + + Too ugly to remove.. + + src/hb-iter.hh | 6 +++--- + src/test-iter.cc | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 076faf7c1803238f135034579935e6b8f10c774c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 30 01:40:08 2018 -0500 + + [iter] Disable operator + + + To see if it makes bots happy... This is frustrating. + + src/hb-iter.hh | 5 +++-- + src/test-iter.cc | 5 +++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit a46874f1ab4b2470784c9ef688c7a8e00592165f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 21:23:26 2018 -0500 + + [iter] Revert back uses of C++11 auto type deduction + + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 26 +++++++++++++------------- + src/hb-ot-layout-gsubgpos.hh | 8 ++++---- + 3 files changed, 18 insertions(+), 18 deletions(-) + +commit 0828db8444d4b6922469770ca1b432356512db18 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 21:22:26 2018 -0500 + + [iter] Rename + + src/hb-ot-layout-common.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 037f735efdc77ae9c8a24527da5d9805163180a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 21:09:15 2018 -0500 + + [iter] Remove friend operator +, hoping to fix some bots + + src/hb-iter.hh | 1 - + src/test-iter.cc | 1 - + 2 files changed, 2 deletions(-) + +commit cb27918d0a104c5f3884013a7dc7c99f3e3e3378 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 20:16:44 2018 -0500 + + Use Null() instead of declval(), hoping to fix some bots + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3d22900f6251b4386d8a7dfd7e2118dd75f12763 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 20:01:57 2018 -0500 + + [meta] Don't use template default arguments for functions + + That's a C++11 extension apparently... + + src/hb-meta.hh | 2 +- + src/hb-open-type.hh | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit b89d20dd9f7e0b4fad3f6c8803c73d2ace34c340 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 16:41:04 2018 -0500 + + [meta] Fix unused-function-template warning + + src/hb-meta.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df138da2e67ce72bec13e656e3146b21b4600c14 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 16:29:48 2018 -0500 + + [iter/meta] Implement is_iterator + + Removes use of auto type deduction again, which was not supported on many bots. + + src/hb-iter.hh | 42 +++++++++++++++++++++++++++++++++++++++--- + src/hb-meta.hh | 4 ++-- + src/hb-open-type.hh | 13 +++++++------ + 3 files changed, 48 insertions(+), 11 deletions(-) + +commit 8570da1d741bbe6becbfd27d7bce3b2a6b78dae7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 14:40:30 2018 -0500 + + [meta] Minor + + src/hb-iter.hh | 4 ++-- + src/hb-null.hh | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 442f4a58919b8e997daf5465b948975ecbe7e3df +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 14:34:00 2018 -0500 + + [meta] Move more code here + + src/hb-dsalgs.hh | 20 -------------------- + src/hb-meta.hh | 31 +++++++++++++++++++++++++++++++ + src/hb-open-type.hh | 6 +----- + 3 files changed, 32 insertions(+), 25 deletions(-) + +commit 8c6cbbdfa326d6edee4a4b5f33971ad1ecfbcd2c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Dec 28 14:29:09 2018 -0500 + + [iter/meta] Add hb_is_iterable + + src/hb-iter.hh | 26 +++++++++++++++++++++++--- + src/hb-meta.hh | 15 ++++++++++----- + src/hb-null.hh | 17 ++++++++--------- + src/hb-open-type.hh | 6 ++++-- + src/hb.hh | 2 +- + 5 files changed, 46 insertions(+), 20 deletions(-) + +commit 576d5e242028b492c2a8bbe56edeaa484b8a886a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 18:39:39 2018 -0500 + + Don't use delegating constructors + + Not all C++11 features are created equal when it comes to support... + + src/hb-dsalgs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e32bf3976686c01fe9804086a8ca48aa0069b392 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 17:38:26 2018 -0500 + + [meta] Add enable_if + + src/hb-meta.hh | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit e76a3cae0fd8cb1e716f4e55f4abbb57af49b10f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 17:23:12 2018 -0500 + + Add hb-meta.hh for meta-programming + + src/Makefile.sources | 1 + + src/hb-dsalgs.hh | 4 ---- + src/hb-iter.hh | 1 + + src/hb-meta.hh | 40 ++++++++++++++++++++++++++++++++++++++++ + src/hb.hh | 3 ++- + 5 files changed, 44 insertions(+), 5 deletions(-) + +commit 5ec11ce13a6bf4479205f3cf2a9cc96342df7f60 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 17:17:28 2018 -0500 + + [iter] Clarify readonly vs lvalue iterators + + lvalue iterators must declare __item_type__ as a reference. + + src/hb-array.hh | 6 +++--- + src/hb-iter.hh | 11 ++++++----- + src/hb-set.hh | 6 +++--- + src/test-iter.cc | 6 ++++-- + 4 files changed, 16 insertions(+), 13 deletions(-) + +commit 2cbf5bf3a959402a7f69b328469232b7050bae01 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 16:55:18 2018 -0500 + + [iter] Test OT::Coverage iter + + src/hb-dsalgs.hh | 6 +++++- + src/hb-ot-layout-common.hh | 6 +++--- + src/test-iter.cc | 9 ++++++++- + 3 files changed, 16 insertions(+), 5 deletions(-) + +commit fd75d29f0f317c4fb36b093c8fabf2a7dcd28042 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 16:29:22 2018 -0500 + + [iter] Streamline vector iterators + + src/hb-vector.hh | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +commit 570473a345a73ab05ea8e8acf88cfba9b90a81a4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 13:29:51 2018 -0500 + + [iter] Make hb_sorted_array_t work as iter + + Ugly, but does the job. + + src/hb-array.hh | 6 ++++-- + src/hb-iter.hh | 18 ++++++++++++++++++ + src/test-iter.cc | 2 ++ + 3 files changed, 24 insertions(+), 2 deletions(-) + +commit d6024794fb072647d8233b184c25da5def26c435 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 09:56:41 2018 -0500 + + Change hb_void_t implementation + + src/hb-dsalgs.hh | 3 +-- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 12 ++++++------ + 3 files changed, 8 insertions(+), 9 deletions(-) + +commit cde31988c26043a47e4599bf7e0d88ea67fc333f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Dec 27 09:39:34 2018 -0500 + + [iter] Mark Coverage iterator sorted + + src/hb-ot-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 49161d411f30d06bc920f4153f5925944895cdbc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 22:50:33 2018 -0500 + + [subset] Take iterator in ArrayOf serialize + + Still not satisfied with how I can enforce iterators only, but + seems to work for now. + + src/hb-open-type.hh | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit e16884248f80c52cd29e39a9b27b15422d76b0f1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 22:27:23 2018 -0500 + + [iter] Port Coverage iterator to hb_iter_t + + src/hb-ot-layout-common.hh | 12 +++++++++--- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 26 +++++++++++++------------- + src/hb-ot-layout-gsubgpos.hh | 8 ++++---- + 4 files changed, 27 insertions(+), 21 deletions(-) + +commit c68bca0f953f5b7b7e15780f65a8e3da24917800 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 22:21:58 2018 -0500 + + Add hb_pair_t<> and hb_pair() + + src/hb-dsalgs.hh | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit 8303a9b011eb2ab710371b9bd7d75693c7639bc1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 22:08:54 2018 -0500 + + [Coverage] Ensure increasing coverage in iteration + + src/hb-ot-layout-common.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 50cd26d3941156daefb1d9ba7f514049eed04b16 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 22:05:25 2018 -0500 + + [Coverage] Mark iterator methods const + + src/hb-ot-layout-common.hh | 25 ++++++++++++------------- + 1 file changed, 12 insertions(+), 13 deletions(-) + +commit 9df1a6eba77e8b7319fc7724e41ceaeda70c2590 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 20:28:41 2018 -0500 + + [iter] Use operator bool in a few places + + src/hb-ot-layout-common.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 7788ac14a408e038fae9da4299fad69158c7b465 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 20:06:10 2018 -0500 + + [iter] Remove redundant methods + + src/hb-iter.hh | 44 +++++++++++++++++--------------------------- + 1 file changed, 17 insertions(+), 27 deletions(-) + +commit 3dea9affdaa063c01d67d6697df1f16c62f55c9a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 19:56:37 2018 -0500 + + [iter] Test default-constructability + + src/test-iter.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 743ff09368f223c56beeda9b72b0520766130322 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 19:54:52 2018 -0500 + + [iter] Implement friend opeator + (int, iter) + + src/hb-iter.hh | 1 + + src/test-iter.cc | 1 + + 2 files changed, 2 insertions(+) + +commit 6dc4a1c9b1f6aa38bca094d251154f9e51049d4d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 19:49:13 2018 -0500 + + [iter] Remove const_iter + + src/hb-iter.hh | 2 -- + src/hb-set.hh | 14 ++++++-------- + src/hb-vector.hh | 6 +++--- + 3 files changed, 9 insertions(+), 13 deletions(-) + +commit d12b80c05a2673c4e4bf2337e2cd4f3100e9f88b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 19:15:21 2018 -0500 + + [ci] Disable macos-llvm-gcc-4.2 again + + Not C++11. + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f2b56af3ef721ce3961bea7d2ee8b6dba6f3fbf2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 19:14:39 2018 -0500 + + [iter] Remove hack for older compilers + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2ea79e0340c01d58ebeeaab9d31ffdd64250a24b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 19:01:46 2018 -0500 + + [iter] Minor + + src/test-iter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fb053b633351afe2012ece0874a8ac15d504a15c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 19:01:30 2018 -0500 + + [iter] Rename random_access() to constexpr is_random_access() + + src/hb-iter.hh | 4 ++-- + src/test-iter.cc | 2 ++ + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 2790aad28ce58acf0077e02921332120325edb4c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 18:58:42 2018 -0500 + + [iter] Add operator -> + + src/hb-iter.hh | 2 ++ + src/hb.hh | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit d3976b7e63559b87ef34abc62acf5033f3369197 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 18:54:27 2018 -0500 + + [iter] Make them work, mostly + + src/hb-iter.hh | 11 ++++++++--- + src/hb-set.hh | 18 ++++++++++-------- + src/test-iter.cc | 25 +++++++++++++++++++++++++ + 3 files changed, 43 insertions(+), 11 deletions(-) + +commit 959bb58bdda8e78690789441e07cf22a99113c53 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 26 18:54:15 2018 -0500 + + [vector] Add iterator + + src/hb-vector.hh | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 6fc6a141e6d68955310d15c91f6e3d061f7221fb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 20 20:09:10 2019 -0500 + + Remove wrongly added files + + test/api/test-ot-extents-cff | Bin 8574336 -> 0 bytes + .../test-ot-extents-cff.dSYM/Contents/Info.plist | 20 -------------------- + .../Contents/Resources/DWARF/test-ot-extents-cff | Bin 7650053 -> 0 bytes + 3 files changed, 20 deletions(-) + +commit dd7c628ed122f858be9ad08c184c87ff31f2ec2d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 20 19:51:08 2019 -0500 + + Use enum for class constant + + src/hb-cff-interp-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cf7edf52c3cb38989af20b196a69bf099a1681d6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 20 19:49:59 2019 -0500 + + [CFF] Use enum for tableTag + + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit bd1318b8ccf08d5f9241851dbb689c7dac717f0a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 20 19:47:52 2019 -0500 + + Use static constexpr for large class constants + + src/hb-map.hh | 2 +- + src/hb-set.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + commit 043b610fa698ed247347dfaa042f032f3fd3f572 Author: Behdad Esfahbod <behdad@behdad.org> Date: Sat Jan 19 09:20:46 2019 -0500 @@ -21462,6 +30543,15 @@ Date: Thu Sep 27 16:54:23 2018 -0400 src/hb-cache.hh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) +commit 341b70a3b47ef3ceeb81e715937d6b2305258060 +Merge: bbf2a095 9e9a36ee +Author: n8willis <n8willis@users.noreply.github.com> +Date: Thu Sep 27 11:15:22 2018 -0500 + + Merge pull request #1 from harfbuzz/master + + Resync with upstream + commit 9e9a36ee651502b69717895385387951a2d0802a Author: Volker Krause <vkrause@kde.org> Date: Thu Sep 27 16:33:49 2018 +0200 @@ -28073,6 +37163,15 @@ Date: Fri Jun 22 15:29:34 2018 -0700 ...testcase-minimized-hb-subset-fuzzer-5750092395970560 | Bin 0 -> 72435 bytes 1 file changed, 0 insertions(+), 0 deletions(-) +commit bbf2a09549a88bd52ac3db89a0ae93f3b71b3e37 +Merge: 8db058d2 35ce8f31 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Mon Jun 25 13:02:11 2018 -0500 + + Merge branch 'master' of http://github.com/behdad/harfbuzz + + Catching up. + commit 35ce8f31d37cf7c2a1f8265d36ba4c2c9a3efb2c Author: Ebrahim Byagowi <ebrahim@gnu.org> Date: Mon Jun 25 22:23:43 2018 +0430 @@ -40295,6 +49394,15 @@ Date: Tue Dec 5 17:43:09 2017 +0000 src/hb-ot-shape-complex-indic.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) +commit 8db058d20c1b7efce33157c676d4aee97591deb1 +Author: Nathan Willis <nwillis@glyphography.com> +Date: Tue Dec 5 17:43:09 2017 +0000 + + Indic: always hyphenate pre-base-reordering, for clarity. + + src/hb-ot-shape-complex-indic.cc | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + commit be59f3cbf4e3269ea05d5a707cdae04a32e097ce Author: Behdad Esfahbod <behdad@behdad.org> Date: Tue Dec 5 09:01:28 2017 -0800 diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am b/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am index f9f6e36306f..a66e2c8280e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am +++ b/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am @@ -71,7 +71,7 @@ dist-clear-sticky-bits: chmod -R a-s $(distdir) -tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.bz2 +tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.xz sha256_file = $(tar_file).sha256 gpg_file = $(sha256_file).asc $(sha256_file): $(tar_file) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS index f3e424fbcdf..752ebf78eb5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS +++ b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS @@ -1,3 +1,17 @@ +Overview of changes leading to 2.5.0 +Friday, May 24, 2019 +==================================== +- This release does not include much functional changes, but includes major internal + code-base changes. We now require C++11. Support for gcc 4.8 and earlier has been + dropped. +- New hb-config.hh facility for compiling smaller library for embedded and web usecases. +- New Unicode Character Databse implementation that is half the size of previously-used + UCDN. +- Subsetter improvements. +- Improved documentation, thanks to Nathan Willis. +- Misc shaping fixes. + + Overview of changes leading to 2.4.0 Monday, March 25, 2019 ==================================== diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/README b/Build/source/libs/harfbuzz/harfbuzz-src/README index fd93be84fe8..ce0a04d1f09 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/README +++ b/Build/source/libs/harfbuzz/harfbuzz-src/README @@ -13,6 +13,10 @@ For bug reports, mailing list, and other information please visit: http://harfbuzz.org/ -For license information, see the file COPYING. +For license information, see [COPYING](COPYING). + +For build information, see [BUILD.md](BUILD.md). + +For test execution, see [TESTING.md](TESTING.md). Documentation: https://harfbuzz.github.io diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md b/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md index 1fd8365453d..5dcce58847c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md +++ b/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md @@ -33,13 +33,14 @@ HarfBuzz release walk-through checklist: That's what happened to 2.0.0 going out with 1.8.0 hb-version.h... So, that's a clue. -7. "make release-files". Enter your GPG password. This creates a sha256 hash - and signs it. - -8. Now that you have release files, commit NEWS, configure.ac, and src/hb-version.h, +7. Now that you have release files, commit NEWS, configure.ac, and src/hb-version.h, as well as any REPLACEME changes you made. The commit message is simply the release number. Eg. "1.4.7" +8. "make dist" again to get a tarball with your new commit in the ChangeLog. Then + "make release-files". Enter your GPG password. This creates a sha256 hash + and signs it. Check the size of the three resulting files. + 9. Tag the release and sign it: Eg. "git tag -s 1.4.7 -m 1.4.7". Enter your GPG password again. diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/THANKS b/Build/source/libs/harfbuzz/harfbuzz-src/THANKS index 940cfde5c39..88cb7e9ea12 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/THANKS +++ b/Build/source/libs/harfbuzz/harfbuzz-src/THANKS @@ -1,6 +1,6 @@ Bradley Grainger -Khaled Hosny Kenichi Ishibashi +Ivan Kuckir <https://photopea.com/> Ryan Lortie Jeff Muizelaar suzuki toshiya diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in index 7faa9fdd3a6..0dca65fc120 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in +++ b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in @@ -15,6 +15,9 @@ /* Have Core Text backend */ #undef HAVE_CORETEXT +/* define if the compiler supports basic C++11 syntax */ +#undef HAVE_CXX11 + /* Define to 1 if you have the declaration of `round', and to 0 if you don't. */ #undef HAVE_DECL_ROUND @@ -136,9 +139,6 @@ /* Define to 1 if you have the <sys/types.h> header file. */ #undef HAVE_SYS_TYPES_H -/* Have UCDN Unicode functions */ -#undef HAVE_UCDN - /* Have Uniscribe library */ #undef HAVE_UNISCRIBE diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac b/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac index b51ac4a93b2..e53928a8fdd 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac +++ b/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [2.4.0], + [2.5.0], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) @@ -9,7 +9,7 @@ AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src/harfbuzz.pc.in]) AC_CONFIG_HEADERS([config.h]) -AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability]) +AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-xz no-dist-gzip -Wall no-define color-tests -Wno-portability]) AM_SILENT_RULES([yes]) AX_CODE_COVERAGE @@ -23,7 +23,7 @@ AC_PROG_CC AC_PROG_CC_C99 AM_PROG_CC_C_O AC_PROG_CXX -dnl AX_CXX_COMPILE_STDCXX(11, noext, optional) +AX_CXX_COMPILE_STDCXX(11,, optional) AC_SYS_LARGEFILE PKG_PROG_PKG_CONFIG([0.20]) AM_MISSING_PROG([RAGEL], [ragel]) @@ -300,21 +300,6 @@ AM_CONDITIONAL(HAVE_ICU_BUILTIN, $have_icu && test "x$with_icu" = "xbuiltin") dnl =========================================================================== -AC_ARG_WITH(ucdn, - [AS_HELP_STRING([--with-ucdn=@<:@yes/no@:>@], - [Use builtin UCDN library @<:@default=yes@:>@])],, - [with_ucdn=yes]) -have_ucdn=false -if test "x$with_ucdn" = "xyes"; then - have_ucdn=true -fi -if $have_ucdn; then - AC_DEFINE(HAVE_UCDN, 1, [Have UCDN Unicode functions]) -fi -AM_CONDITIONAL(HAVE_UCDN, $have_ucdn) - -dnl ========================================================================== - AC_ARG_WITH(graphite2, [AS_HELP_STRING([--with-graphite2=@<:@yes/no/auto@:>@], [Use the graphite2 library @<:@default=no@:>@])],, @@ -497,7 +482,6 @@ AC_CONFIG_FILES([ Makefile src/Makefile src/harfbuzz-config.cmake -src/hb-ucdn/Makefile util/Makefile test/Makefile test/api/Makefile @@ -525,7 +509,7 @@ AC_MSG_NOTICE([ Build configuration: Unicode callbacks (you want at least one): - Builtin (UCDN): ${have_ucdn} + Builtin true Glib: ${have_glib} ICU: ${have_icu} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am index 4a130e1524c..d126c40172d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am @@ -87,17 +87,6 @@ HBSOURCES += $(HB_CORETEXT_sources) HBHEADERS += $(HB_CORETEXT_headers) endif -if HAVE_UCDN -SUBDIRS += hb-ucdn -HBCFLAGS += -I$(srcdir)/hb-ucdn -HBLIBS += hb-ucdn/libhb-ucdn.la -HBSOURCES += $(HB_UCDN_sources) -hb-ucdn/libhb-ucdn.la: ucdn -ucdn: - @$(MAKE) $(AM_MAKEFLAGS) -C hb-ucdn -endif -DIST_SUBDIRS += hb-ucdn - BUILT_SOURCES += \ hb-version.h @@ -258,6 +247,7 @@ GENERATORS = \ gen-indic-table.py \ gen-os2-unicode-ranges.py \ gen-tag-table.py \ + gen-ucd-table.py \ gen-use-table.py \ gen-vowel-constraints.py \ $(NULL) @@ -310,9 +300,9 @@ noinst_PROGRAMS = \ main \ test \ test-buffer-serialize \ - test-name-table \ - test-size-params \ - test-would-substitute \ + test-ot-name \ + test-gpos-size-params \ + test-gsub-would-substitute \ $(NULL) bin_PROGRAMS = @@ -328,17 +318,17 @@ test_buffer_serialize_SOURCES = test-buffer-serialize.cc test_buffer_serialize_CPPFLAGS = $(HBCFLAGS) test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS) -test_name_table_SOURCES = test-name-table.cc -test_name_table_CPPFLAGS = $(HBCFLAGS) -test_name_table_LDADD = libharfbuzz.la $(HBLIBS) +test_ot_name_SOURCES = test-ot-name.cc +test_ot_name_CPPFLAGS = $(HBCFLAGS) +test_ot_name_LDADD = libharfbuzz.la $(HBLIBS) -test_size_params_SOURCES = test-size-params.cc -test_size_params_CPPFLAGS = $(HBCFLAGS) -test_size_params_LDADD = libharfbuzz.la $(HBLIBS) +test_gpos_size_params_SOURCES = test-gpos-size-params.cc +test_gpos_size_params_CPPFLAGS = $(HBCFLAGS) +test_gpos_size_params_LDADD = libharfbuzz.la $(HBLIBS) -test_would_substitute_SOURCES = test-would-substitute.cc -test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) -test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) +test_gsub_would_substitute_SOURCES = test-gsub-would-substitute.cc +test_gsub_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) +test_gsub_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) if HAVE_FREETYPE if HAVE_CAIRO_FT @@ -384,16 +374,24 @@ dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc dump_use_data_CPPFLAGS = $(HBCFLAGS) dump_use_data_LDADD = libharfbuzz.la $(HBLIBS) -COMPILED_TESTS = test-iter test-ot-tag test-unicode-ranges +COMPILED_TESTS = test-algs test-iter test-meta test-ot-tag test-unicode-ranges COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS) check_PROGRAMS += $(COMPILED_TESTS) TESTS += $(COMPILED_TESTS) +test_algs_SOURCES = test-algs.cc hb-static.cc +test_algs_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_algs_LDADD = $(COMPILED_TESTS_LDADD) + test_iter_SOURCES = test-iter.cc hb-static.cc test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_iter_LDADD = $(COMPILED_TESTS_LDADD) +test_meta_SOURCES = test-meta.cc hb-static.cc +test_meta_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_meta_LDADD = $(COMPILED_TESTS_LDADD) + test_ot_tag_SOURCES = hb-ot-tag.cc test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources index 0da4abe05b1..70983f1356d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources @@ -16,6 +16,7 @@ HB_BASE_sources = \ hb-aat-ltag-table.hh \ hb-aat-map.cc \ hb-aat-map.hh \ + hb-algs.hh \ hb-array.hh \ hb-atomic.hh \ hb-blob.cc \ @@ -30,8 +31,9 @@ HB_BASE_sources = \ hb-cff1-interp-cs.hh \ hb-cff2-interp-cs.hh \ hb-common.cc \ + hb-config.hh \ hb-debug.hh \ - hb-dsalgs.hh \ + hb-dispatch.hh \ hb-face.cc \ hb-face.hh \ hb-font.cc \ @@ -41,6 +43,7 @@ HB_BASE_sources = \ hb-machinery.hh \ hb-map.cc \ hb-map.hh \ + hb-meta.hh \ hb-mutex.hh \ hb-null.hh \ hb-object.hh \ @@ -82,7 +85,7 @@ HB_BASE_sources = \ hb-ot-math-table.hh \ hb-ot-math.cc \ hb-ot-maxp-table.hh \ - hb-ot-name-language.cc \ + hb-ot-name-language-static.hh \ hb-ot-name-language.hh \ hb-ot-name-table.hh \ hb-ot-name.cc \ @@ -127,6 +130,9 @@ HB_BASE_sources = \ hb-ot-var-mvar-table.hh \ hb-ot-var.cc \ hb-ot-vorg-table.hh \ + hb-pool.hh \ + hb-sanitize.hh \ + hb-serialize.hh \ hb-set-digest.hh \ hb-set.cc \ hb-set.hh \ @@ -139,6 +145,8 @@ HB_BASE_sources = \ hb-shaper.hh \ hb-static.cc \ hb-string-array.hh \ + hb-ucd-table.hh \ + hb-ucd.cc \ hb-unicode-emoji-table.hh \ hb-unicode.cc \ hb-unicode.hh \ @@ -218,9 +226,6 @@ HB_DIRECTWRITE_headers = hb-directwrite.h HB_UNISCRIBE_sources = hb-uniscribe.cc HB_UNISCRIBE_headers = hb-uniscribe.h -# Additional supplemental sources -HB_UCDN_sources = hb-ucdn.cc - # Sources for libharfbuzz-gobject and libharfbuzz-icu HB_ICU_sources = hb-icu.cc HB_ICU_headers = hb-icu.h @@ -236,9 +241,6 @@ HB_SUBSET_sources = \ hb-subset-cff1.hh \ hb-subset-cff2.cc \ hb-subset-cff2.hh \ - hb-subset-glyf.cc \ - hb-subset-glyf.hh \ - hb-subset-glyf.hh \ hb-subset-input.cc \ hb-subset-input.hh \ hb-subset-plan.cc \ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh index 423d1861393..f181b631212 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh @@ -7,7 +7,7 @@ test -z "$srcdir" && srcdir=. test -z "$libs" && libs=.libs stat=0 -IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_flush\|llvm_.*' +IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_.*\|llvm_.*' if which nm 2>/dev/null >/dev/null; then : diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-os2-unicode-ranges.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-os2-unicode-ranges.py index 8cf59858802..515f4ca1492 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-os2-unicode-ranges.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-os2-unicode-ranges.py @@ -1,8 +1,10 @@ +#!/usr/bin/python + # -*- coding: utf-8 -*- # Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh # Input is a tab seperated list of unicode ranges from the otspec -# (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ulunicoderange1). +# (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ur). from __future__ import print_function, division, absolute_import diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py index 13004629d2b..49f5b30bbe5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py @@ -895,20 +895,18 @@ def language_name_intersection (a, b): def get_matching_language_name (intersection, candidates): return next (iter (c for c in candidates if not intersection.isdisjoint (get_variant_set (c)))) -maximum_tags = 0 +def same_tag (bcp_47_tag, ot_tags): + return len (bcp_47_tag) == 3 and len (ot_tags) == 1 and bcp_47_tag == ot_tags[0].lower () + for language, tags in sorted (ot.from_bcp_47.items ()): if language == '' or '-' in language: continue - print (' {\"%s\",\t{' % language, end='') - maximum_tags = max (maximum_tags, len (tags)) - tag_count = len (tags) + commented_out = same_tag (language, tags) for i, tag in enumerate (tags, start=1): - if i > 1: - print ('\t\t ', end='') - print (hb_tag (tag), end='') - if i == tag_count: - print ('}}', end='') - print (',\t/* ', end='') + print ('%s{\"%s\",\t%s},' % ('/*' if commented_out else ' ', language, hb_tag (tag)), end='') + if commented_out: + print ('*/', end='') + print ('\t/* ', end='') bcp_47_name = bcp_47.names.get (language, '') bcp_47_name_candidates = bcp_47_name.split ('\n') intersection = language_name_intersection (bcp_47_name, ot.names[tag]) @@ -923,8 +921,6 @@ for language, tags in sorted (ot.from_bcp_47.items ()): print ('};') print () -print ('static_assert (HB_OT_MAX_TAGS_PER_LANGUAGE == %iu, "");' % maximum_tags) -print () print ('/**') print (' * hb_ot_tags_from_complex_language:') @@ -1051,7 +1047,8 @@ print (' * @tag: A language tag.') print (' *') print (' * Converts @tag to a BCP 47 language tag if it is ambiguous (it corresponds to') print (' * many language tags) and the best tag is not the alphabetically first, or if') -print (' * the best tag consists of multiple subtags.') +print (' * the best tag consists of multiple subtags, or if the best tag does not appear') +print (' * in #ot_languages.') print (' *') print (' * Return value: The #hb_language_t corresponding to the BCP 47 language tag,') print (' * or #HB_LANGUAGE_INVALID if @tag is not ambiguous.') @@ -1102,7 +1099,8 @@ def verify_disambiguation_dict (): '%s is not a valid disambiguation for %s' % (disambiguation[ot_tag], ot_tag)) elif ot_tag not in disambiguation: disambiguation[ot_tag] = macrolanguages[0] - if disambiguation[ot_tag] == sorted (primary_tags)[0] and '-' not in disambiguation[ot_tag]: + different_primary_tags = sorted (t for t in primary_tags if not same_tag (t, ot.from_bcp_47.get (t))) + if different_primary_tags and disambiguation[ot_tag] == different_primary_tags[0] and '-' not in disambiguation[ot_tag]: del disambiguation[ot_tag] for ot_tag in disambiguation.keys (): expect (ot_tag in ot.to_bcp_47, 'unknown OT tag: %s' % ot_tag) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-ucd-table.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-ucd-table.py new file mode 100644 index 00000000000..3d5b8d26cc3 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-ucd-table.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python + +from __future__ import print_function, division, absolute_import + +import io, os.path, sys, re + +if len (sys.argv) != 2: + print("usage: ./gen-ucd-table ucd.nonunihan.grouped.xml", file=sys.stderr) + sys.exit(1) + + +# https://github.com/harfbuzz/packtab +# https://github.com/harfbuzz/youseedy +import youseedy, packTab + +ucdxml = youseedy.load_ucdxml(sys.argv[1]) +ucd = youseedy.ucdxml_get_repertoire(ucdxml) + + +gc = [u['gc'] for u in ucd] +ccc = [int(u['ccc']) for u in ucd] +bmg = [int(v, 16) - int(u) if v else 0 for u,v in enumerate(u['bmg'] for u in ucd)] +#gc_ccc_non0 = set((cat,klass) for cat,klass in zip(gc,ccc) if klass) +#gc_bmg_non0 = set((cat,mirr) for cat,mirr in zip(gc, bmg) if mirr) + +sc = [u['sc'] for u in ucd] + +dm = {i:tuple(int(v, 16) for v in u['dm'].split()) for i,u in enumerate(ucd) + if u['dm'] != '#' and u['dt'] == 'can' and not (0xAC00 <= i < 0xAC00+11172)} +ce = {i for i,u in enumerate(ucd) if u['Comp_Ex'] == 'Y'} + +assert not any(v for v in dm.values() if len(v) not in (1,2)) +dm1 = sorted(set(v for v in dm.values() if len(v) == 1)) +dm1_array = ['0x%04Xu' % v for v in dm1] +dm1_order = {v:i+1 for i,v in enumerate(dm1)} +dm2 = sorted((v, i) for i,v in dm.items() if len(v) == 2) +dm2 = [("HB_CODEPOINT_ENCODE3 (0x%04Xu, 0x%04Xu, 0x%04Xu)" % + (v+(i if i not in ce and not ccc[i] else 0,)), v) + for v,i in dm2] +dm2_array = [s for s,v in dm2] +l = 1 + len(dm1_array) +dm2_order = {v[1]:i+l for i,v in enumerate(dm2)} +dm_order = {None: 0} +dm_order.update(dm1_order) +dm_order.update(dm2_order) + +gc_order = packTab.AutoMapping() +for _ in ('Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', + 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', + 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs',): + gc_order[_] + +sc_order = packTab.AutoMapping() +sc_array = [] +sc_re = re.compile(" (HB_SCRIPT_[_A-Z]*).*HB_TAG [(]'(.)','(.)','(.)','(.)'[)]") +for line in open('hb-common.h'): + m = sc_re.search (line) + if not m: continue + name = m.group(1) + tag = ''.join(m.group(i) for i in range(2, 6)) + i = sc_order[tag] + assert i == len(sc_array) + sc_array.append(name) + +# TODO Currently if gc_order or sc_order do not capture all values, we get in +# trouble because they silently add new values. We should be able to "freeze" +# them, or just do the mapping ourselves. + +DEFAULT = 1 +COMPACT = 3 + + +print("/* == Start of generated table == */") +print("/*") +print(" * The following table is generated by running:") +print(" *") +print(" * ./gen-ucd-table.py ucd.nonunihan.grouped.xml") +print(" *") +print(" * on file with this description:", ucdxml.description) +print(" */") +print() +print("#ifndef HB_UCD_TABLE_HH") +print("#define HB_UCD_TABLE_HH") +print() + +print() +print('#include "hb.hh"') +print() + +code = packTab.Code('_hb_ucd') +sc_array, _, _ = code.addArray('hb_script_t', 'sc_map', sc_array) +dm1_array, _, _ = code.addArray('hb_codepoint_t', 'dm1_map', dm1_array) +dm2_array, _, _ = code.addArray('uint64_t', 'dm2_map', dm2_array) +code.print_c(linkage='static inline') + +for compression in (DEFAULT, COMPACT): + print() + if compression == DEFAULT: + print('#ifndef HB_OPTIMIZE_SIZE') + else: + print('#else') + print() + + code = packTab.Code('_hb_ucd') + + packTab.pack_table(gc, 'Cn', mapping=gc_order, compression=compression).genCode(code, 'gc') + packTab.pack_table(ccc, 0, compression=compression).genCode(code, 'ccc') + packTab.pack_table(bmg, 0, compression=compression).genCode(code, 'bmg') + packTab.pack_table(sc, 'Zzzz', mapping=sc_order, compression=compression).genCode(code, 'sc') + packTab.pack_table(dm, None, mapping=dm_order, compression=compression).genCode(code, 'dm') + + code.print_c(linkage='static inline') + + + if compression != DEFAULT: + print() + print('#endif') + print() + +print() +print("#endif /* HB_UCD_TABLE_HH */") +print() +print("/* == End of generated table == */") diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py index 029e66e53a4..c86bdbbdca5 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py @@ -47,8 +47,22 @@ defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block') # TODO Characters that are not in Unicode Indic files, but used in USE data[0][0x034F] = defaults[0] +data[0][0x1B61] = defaults[0] +data[0][0x1B63] = defaults[0] +data[0][0x1B64] = defaults[0] +data[0][0x1B65] = defaults[0] +data[0][0x1B66] = defaults[0] +data[0][0x1B67] = defaults[0] +data[0][0x1B69] = defaults[0] +data[0][0x1B6A] = defaults[0] data[0][0x2060] = defaults[0] -# TODO https://github.com/roozbehp/unicode-data/issues/9 +# TODO https://github.com/harfbuzz/harfbuzz/pull/1685 +data[0][0x1B5B] = 'Consonant_Placeholder' +data[0][0x1B5C] = 'Consonant_Placeholder' +data[0][0x1B5F] = 'Consonant_Placeholder' +data[0][0x1B62] = 'Consonant_Placeholder' +data[0][0x1B68] = 'Consonant_Placeholder' +# TODO https://github.com/harfbuzz/harfbuzz/issues/1035 data[0][0x11C44] = 'Consonant_Placeholder' data[0][0x11C45] = 'Consonant_Placeholder' # TODO https://github.com/harfbuzz/harfbuzz/pull/1399 @@ -171,7 +185,7 @@ def is_BASE(U, UISC, UGC): def is_BASE_IND(U, UISC, UGC): #SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po) return (UISC in [Consonant_Dead, Modifying_Letter] or - (UGC == Po and not U in [0x104B, 0x104E, 0x2022, 0x111C8, 0x11A3F, 0x11A45, 0x11C44, 0x11C45]) or + (UGC == Po and not U in [0x104B, 0x104E, 0x1B5B, 0x1B5C, 0x1B5F, 0x2022, 0x111C8, 0x11A3F, 0x11A45, 0x11C44, 0x11C45]) or False # SPEC-DRAFT-OUTDATED! U == 0x002D ) def is_BASE_NUM(U, UISC, UGC): @@ -183,15 +197,15 @@ def is_BASE_OTHER(U, UISC, UGC): def is_CGJ(U, UISC, UGC): return U == 0x034F def is_CONS_FINAL(U, UISC, UGC): - # Consonant_Initial_Postfixed is new in Unicode 11; not in the spec. return ((UISC == Consonant_Final and UGC != Lo) or - UISC == Consonant_Initial_Postfixed or UISC == Consonant_Succeeding_Repha) def is_CONS_FINAL_MOD(U, UISC, UGC): #SPEC-DRAFT return UISC in [Consonant_Final_Modifier, Syllable_Modifier] return UISC == Syllable_Modifier def is_CONS_MED(U, UISC, UGC): - return UISC == Consonant_Medial and UGC != Lo + # Consonant_Initial_Postfixed is new in Unicode 11; not in the spec. + return (UISC == Consonant_Medial and UGC != Lo or + UISC == Consonant_Initial_Postfixed) def is_CONS_MOD(U, UISC, UGC): return UISC in [Nukta, Gemination_Mark, Consonant_Killer] def is_CONS_SUB(U, UISC, UGC): @@ -216,6 +230,7 @@ def is_Word_Joiner(U, UISC, UGC): def is_OTHER(U, UISC, UGC): #SPEC-OUTDATED return UGC == Zs # or any other SCRIPT_COMMON characters return (UISC == Other + and not is_SYM(U, UISC, UGC) and not is_SYM_MOD(U, UISC, UGC) and not is_CGJ(U, UISC, UGC) and not is_Word_Joiner(U, UISC, UGC) @@ -228,17 +243,17 @@ def is_REPHA(U, UISC, UGC): def is_SYM(U, UISC, UGC): if U == 0x25CC: return False #SPEC-DRAFT #SPEC-DRAFT return UGC in [So, Sc] or UISC == Symbol_Letter - return UGC in [So, Sc] + return UGC in [So, Sc] and U not in [0x1B62, 0x1B68] def is_SYM_MOD(U, UISC, UGC): return U in [0x1B6B, 0x1B6C, 0x1B6D, 0x1B6E, 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73] def is_VARIATION_SELECTOR(U, UISC, UGC): return 0xFE00 <= U <= 0xFE0F def is_VOWEL(U, UISC, UGC): - # https://github.com/roozbehp/unicode-data/issues/6 + # https://github.com/harfbuzz/harfbuzz/issues/376 return (UISC == Pure_Killer or (UGC != Lo and UISC in [Vowel, Vowel_Dependent] and U not in [0xAA29])) def is_VOWEL_MOD(U, UISC, UGC): - # https://github.com/roozbehp/unicode-data/issues/6 + # https://github.com/harfbuzz/harfbuzz/issues/376 return (UISC in [Tone_Mark, Cantillation_Mark, Register_Shifter, Visarga] or (UGC != Lo and (UISC == Bindu or U in [0xAA29]))) @@ -305,7 +320,11 @@ use_positions = { 'H': None, 'HVM': None, 'B': None, - 'FM': None, + 'FM': { + 'Abv': [Top], + 'Blw': [Bottom], + 'Pst': [Not_Applicable], + }, 'SUB': None, } @@ -344,15 +363,9 @@ def map_to_use(data): # the nasalization marks, maybe only for U+1CE9..U+1CF1. if U == 0x1CED: UISC = Tone_Mark - # TODO: https://github.com/harfbuzz/harfbuzz/issues/525 - if U == 0x1A7F: UISC = Consonant_Final - # TODO: https://github.com/harfbuzz/harfbuzz/issues/1105 if U == 0x11134: UISC = Gemination_Mark - # TODO: https://github.com/harfbuzz/harfbuzz/pull/1399 - if U == 0x111C9: UISC = Consonant_Final - values = [k for k,v in items if v(U,UISC,UGC)] assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values) USE = values[0] diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py index afb21d92834..1340d97dc77 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py @@ -180,6 +180,9 @@ print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB print ('\t\t\t\t hb_buffer_t *buffer,') print ('\t\t\t\t hb_font_t *font HB_UNUSED)') print ('{') +print ('#if defined(HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS)') +print (' return;') +print ('#endif') print (' if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)') print (' return;') print () diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh index 4087b8c1f02..ef988841a94 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh @@ -83,7 +83,7 @@ struct ankr protected: HBUINT16 version; /* Version number (set to zero) */ HBUINT16 flags; /* Flags (currently unused; set to zero) */ - LOffsetTo<Lookup<NNOffsetTo<GlyphAnchors> > > + LOffsetTo<Lookup<NNOffsetTo<GlyphAnchors>>> lookupTable; /* Offset to the table's lookup table */ LNNOffsetTo<HBUINT8> anchorData; /* Offset to the glyph data table */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh index 2508276c2d0..a8c4b763762 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh @@ -125,7 +125,7 @@ struct LookupFormat2 protected: HBUINT16 format; /* Format identifier--format = 2 */ - VarSizedBinSearchArrayOf<LookupSegmentSingle<T> > + VarSizedBinSearchArrayOf<LookupSegmentSingle<T>> segments; /* The actual segments. These must already be sorted, * according to the first word in each one (the last * glyph in each segment). */ @@ -153,18 +153,18 @@ struct LookupSegmentArray first <= last && valuesZ.sanitize (c, base, last - first + 1)); } - template <typename T2> - bool sanitize (hb_sanitize_context_t *c, const void *base, T2 user_data) const + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && first <= last && - valuesZ.sanitize (c, base, last - first + 1, user_data)); + valuesZ.sanitize (c, base, last - first + 1, hb_forward<Ts> (ds)...)); } GlyphID last; /* Last GlyphID in this segment */ GlyphID first; /* First GlyphID in this segment */ - NNOffsetTo<UnsizedArrayOf<T> > + NNOffsetTo<UnsizedArrayOf<T>> valuesZ; /* A 16-bit offset from the start of * the table to the data. */ public: @@ -196,7 +196,7 @@ struct LookupFormat4 protected: HBUINT16 format; /* Format identifier--format = 4 */ - VarSizedBinSearchArrayOf<LookupSegmentArray<T> > + VarSizedBinSearchArrayOf<LookupSegmentArray<T>> segments; /* The actual segments. These must already be sorted, * according to the first word in each one (the last * glyph in each segment). */ @@ -253,7 +253,7 @@ struct LookupFormat6 protected: HBUINT16 format; /* Format identifier--format = 6 */ - VarSizedBinSearchArrayOf<LookupSingle<T> > + VarSizedBinSearchArrayOf<LookupSingle<T>> entries; /* The actual entries, sorted by glyph index. */ public: DEFINE_SIZE_ARRAY (8, entries); @@ -419,7 +419,7 @@ struct Lookup /* Ugly hand-coded null objects for template Lookup<> :(. */ extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2]; template <typename T> -struct Null<AAT::Lookup<T> > { +struct Null<AAT::Lookup<T>> { static AAT::Lookup<T> const & get_null () { return *reinterpret_cast<const AAT::Lookup<T> *> (_hb_Null_AAT_Lookup); } }; @@ -510,7 +510,7 @@ struct StateTable const Entry<Extra> &get_entry (int state, unsigned int klass) const { if (unlikely (klass >= nClasses)) - klass = StateTable<Types, Entry<Extra> >::CLASS_OUT_OF_BOUNDS; + klass = StateTable<Types, Entry<Extra>>::CLASS_OUT_OF_BOUNDS; const HBUSHORT *states = (this+stateArrayTable).arrayZ; const Entry<Extra> *entries = (this+entryTable).arrayZ; @@ -576,7 +576,7 @@ struct StateTable if (unlikely (stop > states)) return_trace (false); for (const HBUSHORT *p = states; stop < p; p--) - num_entries = MAX<unsigned int> (num_entries, *(p - 1) + 1); + num_entries = hb_max (num_entries, *(p - 1) + 1); state_neg = min_state; } } @@ -597,7 +597,7 @@ struct StateTable if (unlikely (stop < states)) return_trace (false); for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++) - num_entries = MAX<unsigned int> (num_entries, *p + 1); + num_entries = hb_max (num_entries, *p + 1); state_pos = max_state + 1; } } @@ -611,8 +611,8 @@ struct StateTable for (const Entry<Extra> *p = &entries[entry]; p < stop; p++) { int newState = new_state (p->newState); - min_state = MIN (min_state, newState); - max_state = MAX (max_state, newState); + min_state = hb_min (min_state, newState); + max_state = hb_max (max_state, newState); } entry = num_entries; } @@ -631,7 +631,7 @@ struct StateTable classTable; /* Offset to the class table. */ NNOffsetTo<UnsizedArrayOf<HBUSHORT>, HBUINT> stateArrayTable;/* Offset to the state array. */ - NNOffsetTo<UnsizedArrayOf<Entry<Extra> >, HBUINT> + NNOffsetTo<UnsizedArrayOf<Entry<Extra>>, HBUINT> entryTable; /* Offset to the entry array. */ public: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh index ab23ee05693..a20ef864023 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh @@ -165,7 +165,7 @@ struct feat unsigned int feature_count = featureNameCount; if (count && *count) { - unsigned int len = MIN (feature_count - start_offset, *count); + unsigned int len = hb_min (feature_count - start_offset, *count); for (unsigned int i = 0; i < len; i++) features[i] = namesZ[i + start_offset].get_feature_type (); *count = len; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh index d53f8f19eff..e15c946a2db 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-just-table.hh @@ -309,7 +309,7 @@ struct WidthDeltaPair public: DEFINE_SIZE_STATIC (24); }; - + typedef OT::LArrayOf<WidthDeltaPair> WidthDeltaCluster; struct JustificationCategory @@ -371,7 +371,7 @@ struct JustificationHeader * of postcompensation subtable (set to zero if none). * * The postcompensation subtable, if present in the font. */ - Lookup<OffsetTo<WidthDeltaCluster> > + Lookup<OffsetTo<WidthDeltaCluster>> lookupTable; /* Lookup table associating glyphs with width delta * clusters. See the description of Width Delta Clusters * table for details on how to interpret the lookup values. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh index a64c8073819..cec63ac6d1d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh @@ -251,7 +251,7 @@ struct KerxSubTableFormat1 if (Format1EntryT::performAction (entry) && depth) { - unsigned int tuple_count = MAX (1u, table->header.tuple_count ()); + unsigned int tuple_count = hb_max (1u, table->header.tuple_count ()); unsigned int kern_idx = Format1EntryT::kernActionIndex (entry); kern_idx = Types::byteOffsetToIndex (kern_idx, &table->machine, kernAction.arrayZ); @@ -712,18 +712,18 @@ struct KerxSubTableFormat6 { struct Long { - LNNOffsetTo<Lookup<HBUINT32> > rowIndexTable; - LNNOffsetTo<Lookup<HBUINT32> > columnIndexTable; - LNNOffsetTo<UnsizedArrayOf<FWORD32> > array; + LNNOffsetTo<Lookup<HBUINT32>> rowIndexTable; + LNNOffsetTo<Lookup<HBUINT32>> columnIndexTable; + LNNOffsetTo<UnsizedArrayOf<FWORD32>> array; } l; struct Short { - LNNOffsetTo<Lookup<HBUINT16> > rowIndexTable; - LNNOffsetTo<Lookup<HBUINT16> > columnIndexTable; - LNNOffsetTo<UnsizedArrayOf<FWORD> > array; + LNNOffsetTo<Lookup<HBUINT16>> rowIndexTable; + LNNOffsetTo<Lookup<HBUINT16>> columnIndexTable; + LNNOffsetTo<UnsizedArrayOf<FWORD>> array; } s; } u; - LNNOffsetTo<UnsizedArrayOf<FWORD> > vector; + LNNOffsetTo<UnsizedArrayOf<FWORD>> vector; public: DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 24); }; @@ -771,17 +771,17 @@ struct KerxSubTable unsigned int get_size () const { return u.header.length; } unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { - case 0: return_trace (c->dispatch (u.format0)); - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); - case 4: return_trace (c->dispatch (u.format4)); - case 6: return_trace (c->dispatch (u.format6)); + case 0: return_trace (c->dispatch (u.format0, hb_forward<Ts> (ds)...)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...)); + case 4: return_trace (c->dispatch (u.format4, hb_forward<Ts> (ds)...)); + case 6: return_trace (c->dispatch (u.format6, hb_forward<Ts> (ds)...)); default: return_trace (c->default_return_value ()); } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-lcar-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-lcar-table.hh index 4be799fbca2..cd96d034dd9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-lcar-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-lcar-table.hh @@ -81,7 +81,7 @@ struct lcar protected: FixedVersion<>version; /* Version number of the ligature caret table */ HBUINT16 format; /* Format of the ligature caret table. */ - Lookup<OffsetTo<LigCaretClassEntry> > + Lookup<OffsetTo<LigCaretClassEntry>> lookup; /* data Lookup table associating glyphs */ public: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh index 4a1d959efec..81d78972a22 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh @@ -88,7 +88,7 @@ struct RearrangementSubtable start = buffer->idx; if (flags & MarkLast) - end = MIN (buffer->idx + 1, buffer->len); + end = hb_min (buffer->idx + 1, buffer->len); if ((flags & Verb) && start < end) { @@ -117,14 +117,14 @@ struct RearrangementSubtable }; unsigned int m = map[flags & Verb]; - unsigned int l = MIN<unsigned int> (2, m >> 4); - unsigned int r = MIN<unsigned int> (2, m & 0x0F); + unsigned int l = hb_min (2u, m >> 4); + unsigned int r = hb_min (2u, m & 0x0F); bool reverse_l = 3 == (m >> 4); bool reverse_r = 3 == (m & 0x0F); if (end - start >= l + r) { - buffer->merge_clusters (start, MIN (buffer->idx + 1, buffer->len)); + buffer->merge_clusters (start, hb_min (buffer->idx + 1, buffer->len)); buffer->merge_clusters (start, end); hb_glyph_info_t *info = buffer->info; @@ -261,13 +261,13 @@ struct ContextualSubtable } if (replacement) { - buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len)); + buffer->unsafe_to_break (mark, hb_min (buffer->idx + 1, buffer->len)); buffer->info[mark].codepoint = *replacement; ret = true; } replacement = nullptr; - unsigned int idx = MIN (buffer->idx, buffer->len - 1); + unsigned int idx = hb_min (buffer->idx, buffer->len - 1); if (Types::extended) { if (entry.data.currentIndex != 0xFFFF) @@ -337,9 +337,9 @@ struct ContextualSubtable const EntryData &data = entries[i].data; if (data.markIndex != 0xFFFF) - num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex); + num_lookups = hb_max (num_lookups, 1 + data.markIndex); if (data.currentIndex != 0xFFFF) - num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex); + num_lookups = hb_max (num_lookups, 1 + data.currentIndex); } return_trace (substitutionTables.sanitize (c, this, num_lookups)); @@ -744,7 +744,7 @@ struct InsertionSubtable buffer->move_to (end + count); - buffer->unsafe_to_break_from_outbuffer (mark, MIN (buffer->idx + 1, buffer->len)); + buffer->unsafe_to_break_from_outbuffer (mark, hb_min (buffer->idx + 1, buffer->len)); } if (flags & SetMark) @@ -883,17 +883,17 @@ struct ChainSubtable Insertion = 5 }; - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { - case Rearrangement: return_trace (c->dispatch (u.rearrangement)); - case Contextual: return_trace (c->dispatch (u.contextual)); - case Ligature: return_trace (c->dispatch (u.ligature)); - case Noncontextual: return_trace (c->dispatch (u.noncontextual)); - case Insertion: return_trace (c->dispatch (u.insertion)); + case Rearrangement: return_trace (c->dispatch (u.rearrangement, hb_forward<Ts> (ds)...)); + case Contextual: return_trace (c->dispatch (u.contextual, hb_forward<Ts> (ds)...)); + case Ligature: return_trace (c->dispatch (u.ligature, hb_forward<Ts> (ds)...)); + case Noncontextual: return_trace (c->dispatch (u.noncontextual, hb_forward<Ts> (ds)...)); + case Insertion: return_trace (c->dispatch (u.insertion, hb_forward<Ts> (ds)...)); default: return_trace (c->default_return_value ()); } } @@ -969,7 +969,7 @@ struct Chain void apply (hb_aat_apply_context_t *c, hb_mask_t flags) const { - const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types> > (featureZ.as_array (featureCount)); + const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types>> (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { @@ -1031,7 +1031,7 @@ struct Chain if (unlikely (!c->buffer->successful)) return; skip: - subtable = &StructAfter<ChainSubtable<Types> > (*subtable); + subtable = &StructAfter<ChainSubtable<Types>> (*subtable); c->set_lookup_index (c->lookup_index + 1); } } @@ -1049,13 +1049,13 @@ struct Chain if (!c->check_array (featureZ.arrayZ, featureCount)) return_trace (false); - const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types> > (featureZ.as_array (featureCount)); + const ChainSubtable<Types> *subtable = &StructAfter<ChainSubtable<Types>> (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { if (!subtable->sanitize (c)) return_trace (false); - subtable = &StructAfter<ChainSubtable<Types> > (*subtable); + subtable = &StructAfter<ChainSubtable<Types>> (*subtable); } return_trace (true); @@ -1095,7 +1095,7 @@ struct mortmorx for (unsigned int i = 0; i < count; i++) { map->chain_flags.push (chain->compile_flags (mapper)); - chain = &StructAfter<Chain<Types> > (*chain); + chain = &StructAfter<Chain<Types>> (*chain); } } @@ -1109,7 +1109,7 @@ struct mortmorx { chain->apply (c, c->plan->aat_map.chain_flags[i]); if (unlikely (!c->buffer->successful)) return; - chain = &StructAfter<Chain<Types> > (*chain); + chain = &StructAfter<Chain<Types>> (*chain); } } @@ -1125,7 +1125,7 @@ struct mortmorx { if (!chain->sanitize (c, version)) return_trace (false); - chain = &StructAfter<Chain<Types> > (*chain); + chain = &StructAfter<Chain<Types>> (*chain); } return_trace (true); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh index 0c8e4558ffc..2eace2aa044 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh @@ -66,7 +66,7 @@ struct TrackTableEntry NameID trackNameID; /* The 'name' table index for this track. * (a short word or phrase like "loose" * or "very tight") */ - NNOffsetTo<UnsizedArrayOf<FWORD> > + NNOffsetTo<UnsizedArrayOf<FWORD>> valuesZ; /* Offset from start of tracking table to * per-size tracking values for this track. */ @@ -133,8 +133,8 @@ struct TrackData if (size_table[size_index].to_float () >= csspx) break; - return round (interpolate_at (size_index ? size_index - 1 : 0, csspx, - *trackTableEntry, base)); + return roundf (interpolate_at (size_index ? size_index - 1 : 0, csspx, + *trackTableEntry, base)); } bool sanitize (hb_sanitize_context_t *c, const void *base) const diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc index 5168a9c85ff..22cbd733883 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc @@ -135,6 +135,10 @@ static const hb_aat_feature_mapping_t feature_mappings[] = const hb_aat_feature_mapping_t * hb_aat_layout_find_feature_mapping (hb_tag_t tag) { +#ifdef HB_NO_SHAPE_AAT + return nullptr; +#endif + return (const hb_aat_feature_mapping_t *) bsearch (&tag, feature_mappings, ARRAY_LENGTH (feature_mappings), @@ -147,6 +151,8 @@ hb_aat_layout_find_feature_mapping (hb_tag_t tag) * hb_aat_apply_context_t */ +/* Note: This context is used for kerning, even without AAT. */ + AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, hb_font_t *font_, hb_buffer_t *buffer_, @@ -183,6 +189,10 @@ void hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_aat_map_t *map) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + const AAT::morx& morx = *mapper->face->table.morx; if (morx.has_data ()) { @@ -209,6 +219,10 @@ hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, hb_bool_t hb_aat_layout_has_substitution (hb_face_t *face) { +#ifdef HB_NO_SHAPE_AAT + return false; +#endif + return face->table.morx->has_data () || face->table.mort->has_data (); } @@ -218,6 +232,10 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + hb_blob_t *morx_blob = font->face->table.morx.get_blob (); const AAT::morx& morx = *morx_blob->as<AAT::morx> (); if (morx.has_data ()) @@ -240,6 +258,10 @@ hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, void hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; hb_glyph_position_t *pos = buffer->pos; @@ -257,6 +279,10 @@ is_deleted_glyph (const hb_glyph_info_t *info) void hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph); } @@ -270,6 +296,10 @@ hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) hb_bool_t hb_aat_layout_has_positioning (hb_face_t *face) { +#ifdef HB_NO_SHAPE_AAT + return false; +#endif + return face->table.kerx->has_data (); } @@ -278,6 +308,10 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + hb_blob_t *kerx_blob = font->face->table.kerx.get_blob (); const AAT::kerx& kerx = *kerx_blob->as<AAT::kerx> (); @@ -297,6 +331,10 @@ hb_aat_layout_position (const hb_ot_shape_plan_t *plan, hb_bool_t hb_aat_layout_has_tracking (hb_face_t *face) { +#ifdef HB_NO_SHAPE_AAT + return false; +#endif + return face->table.trak->has_data (); } @@ -305,20 +343,16 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + const AAT::trak& trak = *font->face->table.trak; AAT::hb_aat_apply_context_t c (plan, font, buffer); trak.apply (&c); } - -hb_language_t -_hb_aat_language_get (hb_face_t *face, - unsigned int i) -{ - return face->table.ltag->get_language (i); -} - /** * hb_aat_layout_get_feature_types: * @face: a face object @@ -336,6 +370,12 @@ hb_aat_layout_get_feature_types (hb_face_t *face, unsigned int *feature_count, /* IN/OUT. May be NULL. */ hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */) { +#ifdef HB_NO_SHAPE_AAT + if (feature_count) + *feature_count = 0; + return 0; +#endif + return face->table.feat->get_feature_types (start_offset, feature_count, features); } @@ -352,6 +392,10 @@ hb_ot_name_id_t hb_aat_layout_feature_type_get_name_id (hb_face_t *face, hb_aat_layout_feature_type_t feature_type) { +#ifdef HB_NO_SHAPE_AAT + return HB_OT_NAME_ID_INVALID; +#endif + return face->table.feat->get_feature_name_id (feature_type); } @@ -380,5 +424,11 @@ hb_aat_layout_feature_type_get_selector_infos (hb_face_t hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ unsigned int *default_index /* OUT. May be NULL. */) { +#ifdef HB_NO_SHAPE_AAT + if (selector_count) + *selector_count = 0; + return 0; +#endif + return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh index 8346d9f00b5..9a0e4468f0b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh @@ -30,7 +30,7 @@ #include "hb.hh" #include "hb-ot-shape.hh" - +#include "hb-aat-ltag-table.hh" struct hb_aat_feature_mapping_t { @@ -39,7 +39,7 @@ struct hb_aat_feature_mapping_t hb_aat_layout_feature_selector_t selectorToEnable; hb_aat_layout_feature_selector_t selectorToDisable; - static int cmp (const void *key_, const void *entry_) + HB_INTERNAL static int cmp (const void *key_, const void *entry_) { hb_tag_t key = * (unsigned int *) key_; const hb_aat_feature_mapping_t * entry = (const hb_aat_feature_mapping_t *) entry_; @@ -77,9 +77,13 @@ hb_aat_layout_track (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -HB_INTERNAL hb_language_t + +inline hb_language_t _hb_aat_language_get (hb_face_t *face, - unsigned int i); + unsigned int i) +{ + return face->table.ltag->get_language (i); +} #endif /* HB_AAT_LAYOUT_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.hh index 6f34a0095a0..711f9aa6c18 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.hh @@ -50,7 +50,7 @@ struct FTStringRange } protected: - NNOffsetTo<UnsizedArrayOf<HBUINT8> > + NNOffsetTo<UnsizedArrayOf<HBUINT8>> tag; /* Offset from the start of the table to * the beginning of the string */ HBUINT16 length; /* String length (in bytes) */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc index 98c5d7fe4d7..d57ee849da4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc @@ -34,6 +34,10 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, unsigned int value) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + if (tag == HB_TAG ('a','a','l','t')) { feature_info_t *info = features.push(); @@ -53,6 +57,10 @@ void hb_aat_map_builder_t::add_feature (hb_tag_t tag, void hb_aat_map_builder_t::compile (hb_aat_map_t &m) { +#ifdef HB_NO_SHAPE_AAT + return; +#endif + /* Sort features and merge duplicates */ if (features.length) { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh index 3d5ad0e642f..984a59cca5b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh @@ -66,7 +66,7 @@ struct hb_aat_map_builder_t hb_aat_layout_feature_selector_t setting; unsigned seq; /* For stable sorting only. */ - static int cmp (const void *pa, const void *pb) + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const feature_info_t *a = (const feature_info_t *) pa; const feature_info_t *b = (const feature_info_t *) pb; @@ -84,7 +84,7 @@ struct hb_aat_map_builder_t hb_face_t *face; public: - hb_vector_t<feature_info_t> features; + hb_sorted_vector_t<feature_info_t> features; }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh index 0da244f0ae3..007db9e40c5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh @@ -1,5 +1,6 @@ /* * Copyright © 2017 Google, Inc. + * Copyright © 2019 Google, Inc. * * This is part of HarfBuzz, a text shaping library. * @@ -22,18 +23,307 @@ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Google Author(s): Behdad Esfahbod + * Facebook Author(s): Behdad Esfahbod */ -#ifndef HB_DSALGS_HH -#define HB_DSALGS_HH +#ifndef HB_ALGS_HH +#define HB_ALGS_HH #include "hb.hh" +#include "hb-meta.hh" #include "hb-null.hh" -/* Void! For when we need a expression-type of void. */ -typedef const struct _hb_void_t *hb_void_t; -#define HB_VOID ((const _hb_void_t *) nullptr) +/* Encodes three unsigned integers in one 64-bit number. If the inputs have more than 21 bits, + * values will be truncated / overlap, and might not decode exactly. */ +#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z)) +#define HB_CODEPOINT_DECODE3_1(v) ((hb_codepoint_t) ((v) >> 42)) +#define HB_CODEPOINT_DECODE3_2(v) ((hb_codepoint_t) ((v) >> 21) & 0x1FFFFFu) +#define HB_CODEPOINT_DECODE3_3(v) ((hb_codepoint_t) (v) & 0x1FFFFFu) + + +struct +{ + /* Note. This is dangerous in that if it's passed an rvalue, it returns rvalue-reference. */ + template <typename T> auto + operator () (T&& v) const HB_AUTO_RETURN ( hb_forward<T> (v) ) +} +HB_FUNCOBJ (hb_identity); +struct +{ + /* Like identity(), but only retains lvalue-references. Rvalues are returned as rvalues. */ + template <typename T> T& + operator () (T& v) const { return v; } + + template <typename T> hb_remove_reference<T> + operator () (T&& v) const { return v; } +} +HB_FUNCOBJ (hb_lidentity); +struct +{ + /* Like identity(), but always returns rvalue. */ + template <typename T> hb_remove_reference<T> + operator () (T&& v) const { return v; } +} +HB_FUNCOBJ (hb_ridentity); + +struct +{ + template <typename T> bool + operator () (T&& v) const { return bool (hb_forward<T> (v)); } +} +HB_FUNCOBJ (hb_bool); + +struct +{ + private: + template <typename T> auto + impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ()) + + template <typename T, + hb_enable_if (hb_is_integral (T))> auto + impl (const T& v, hb_priority<0>) const HB_AUTO_RETURN + ( + /* Knuth's multiplicative method: */ + (uint32_t) v * 2654435761u + ) + + public: + + template <typename T> auto + operator () (const T& v) const HB_RETURN (uint32_t, impl (v, hb_prioritize)) +} +HB_FUNCOBJ (hb_hash); + + +struct +{ + private: + + /* Pointer-to-member-function. */ + template <typename Appl, typename T, typename ...Ts> auto + impl (Appl&& a, hb_priority<2>, T &&v, Ts&&... ds) const HB_AUTO_RETURN + ((hb_deref (hb_forward<T> (v)).*hb_forward<Appl> (a)) (hb_forward<Ts> (ds)...)) + + /* Pointer-to-member. */ + template <typename Appl, typename T> auto + impl (Appl&& a, hb_priority<1>, T &&v) const HB_AUTO_RETURN + ((hb_deref (hb_forward<T> (v))).*hb_forward<Appl> (a)) + + /* Operator(). */ + template <typename Appl, typename ...Ts> auto + impl (Appl&& a, hb_priority<0>, Ts&&... ds) const HB_AUTO_RETURN + (hb_deref (hb_forward<Appl> (a)) (hb_forward<Ts> (ds)...)) + + public: + + template <typename Appl, typename ...Ts> auto + operator () (Appl&& a, Ts&&... ds) const HB_AUTO_RETURN + ( + impl (hb_forward<Appl> (a), + hb_prioritize, + hb_forward<Ts> (ds)...) + ) +} +HB_FUNCOBJ (hb_invoke); + +template <unsigned Pos, typename Appl, typename V> +struct hb_partial_t +{ + hb_partial_t (Appl a, V v) : a (a), v (v) {} + + static_assert (Pos > 0, ""); + + template <typename ...Ts, + unsigned P = Pos, + hb_enable_if (P == 1)> auto + operator () (Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), + hb_declval (V), + hb_declval (Ts)...)) + { + return hb_invoke (hb_forward<Appl> (a), + hb_forward<V> (v), + hb_forward<Ts> (ds)...); + } + template <typename T0, typename ...Ts, + unsigned P = Pos, + hb_enable_if (P == 2)> auto + operator () (T0&& d0, Ts&& ...ds) -> decltype (hb_invoke (hb_declval (Appl), + hb_declval (T0), + hb_declval (V), + hb_declval (Ts)...)) + { + return hb_invoke (hb_forward<Appl> (a), + hb_forward<T0> (d0), + hb_forward<V> (v), + hb_forward<Ts> (ds)...); + } + + private: + hb_reference_wrapper<Appl> a; + V v; +}; +template <unsigned Pos=1, typename Appl, typename V> +auto hb_partial (Appl&& a, V&& v) HB_AUTO_RETURN +(( hb_partial_t<Pos, Appl, V> (a, v) )) + +#define HB_PARTIALIZE(Pos) \ + template <typename _T> \ + auto operator () (_T&& _v) const HB_AUTO_RETURN (hb_partial<Pos> (this, hb_forward<_T> (_v))) \ + static_assert (true, "") + + +struct +{ + private: + + template <typename Pred, typename Val> auto + impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN + (hb_deref (hb_forward<Pred> (p)).has (hb_forward<Val> (v))) + + template <typename Pred, typename Val> auto + impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN + ( + hb_invoke (hb_forward<Pred> (p), + hb_forward<Val> (v)) + ) + + public: + + template <typename Pred, typename Val> auto + operator () (Pred&& p, Val &&v) const HB_RETURN (bool, + impl (hb_forward<Pred> (p), + hb_forward<Val> (v), + hb_prioritize) + ) +} +HB_FUNCOBJ (hb_has); + +struct +{ + private: + + template <typename Pred, typename Val> auto + impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN + ( + hb_has (hb_forward<Pred> (p), + hb_forward<Val> (v)) + ) + + template <typename Pred, typename Val> auto + impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN + ( + hb_forward<Pred> (p) == hb_forward<Val> (v) + ) + + public: + + template <typename Pred, typename Val> auto + operator () (Pred&& p, Val &&v) const HB_RETURN (bool, + impl (hb_forward<Pred> (p), + hb_forward<Val> (v), + hb_prioritize) + ) +} +HB_FUNCOBJ (hb_match); + +struct +{ + private: + + template <typename Proj, typename Val> auto + impl (Proj&& f, Val &&v, hb_priority<2>) const HB_AUTO_RETURN + (hb_deref (hb_forward<Proj> (f)).get (hb_forward<Val> (v))) + + template <typename Proj, typename Val> auto + impl (Proj&& f, Val &&v, hb_priority<1>) const HB_AUTO_RETURN + ( + hb_invoke (hb_forward<Proj> (f), + hb_forward<Val> (v)) + ) + + template <typename Proj, typename Val> auto + impl (Proj&& f, Val &&v, hb_priority<0>) const HB_AUTO_RETURN + ( + hb_forward<Proj> (f)[hb_forward<Val> (v)] + ) + + public: + + template <typename Proj, typename Val> auto + operator () (Proj&& f, Val &&v) const HB_AUTO_RETURN + ( + impl (hb_forward<Proj> (f), + hb_forward<Val> (v), + hb_prioritize) + ) +} +HB_FUNCOBJ (hb_get); + + +template <typename T1, typename T2> +struct hb_pair_t +{ + typedef T1 first_t; + typedef T2 second_t; + typedef hb_pair_t<T1, T2> pair_t; + + hb_pair_t (T1 a, T2 b) : first (a), second (b) {} + + template <typename Q1, typename Q2, + hb_enable_if (hb_is_convertible (T1, Q1) && + hb_is_convertible (T2, T2))> + operator hb_pair_t<Q1, Q2> () { return hb_pair_t<Q1, Q2> (first, second); } + + hb_pair_t<T1, T2> reverse () const + { return hb_pair_t<T1, T2> (second, first); } + + bool operator == (const pair_t& o) const { return first == o.first && second == o.second; } + bool operator != (const pair_t& o) const { return !(*this == o); } + bool operator < (const pair_t& o) const { return first < o.first || (first == o.first && second < o.second); } + bool operator >= (const pair_t& o) const { return !(*this < o); } + bool operator > (const pair_t& o) const { return first > o.first || (first == o.first && second > o.second); } + bool operator <= (const pair_t& o) const { return !(*this > o); } + + T1 first; + T2 second; +}; +#define hb_pair_t(T1,T2) hb_pair_t<T1, T2> +template <typename T1, typename T2> static inline hb_pair_t<T1, T2> +hb_pair (T1&& a, T2&& b) { return hb_pair_t<T1, T2> (a, b); } + +struct +{ + template <typename Pair> typename Pair::first_t + operator () (const Pair& pair) const { return pair.first; } +} +HB_FUNCOBJ (hb_first); + +struct +{ + template <typename Pair> typename Pair::second_t + operator () (const Pair& pair) const { return pair.second; } +} +HB_FUNCOBJ (hb_second); + +/* Note. In min/max impl, we can use hb_type_identity<T> for second argument. + * However, that would silently convert between different-signedness integers. + * Instead we accept two different types, such that compiler can err if + * comparing integers of different signedness. */ +struct +{ + template <typename T, typename T2> auto + operator () (T&& a, T2&& b) const HB_AUTO_RETURN + (hb_forward<T> (a) <= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b)) +} +HB_FUNCOBJ (hb_min); +struct +{ + template <typename T, typename T2> auto + operator () (T&& a, T2&& b) const HB_AUTO_RETURN + (hb_forward<T> (a) >= hb_forward<T2> (b) ? hb_forward<T> (a) : hb_forward<T2> (b)) +} +HB_FUNCOBJ (hb_max); /* @@ -233,18 +523,6 @@ hb_ctz (T v) * Tiny stuff. */ -template <typename T> -static inline T* hb_addressof (T& arg) -{ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-align" - /* https://en.cppreference.com/w/cpp/memory/addressof */ - return reinterpret_cast<T*>( - &const_cast<char&>( - reinterpret_cast<const volatile char&>(arg))); -#pragma GCC diagnostic pop -} - /* ASCII tag/character handling */ static inline bool ISALPHA (unsigned char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); } @@ -257,14 +535,6 @@ static inline unsigned char TOUPPER (unsigned char c) static inline unsigned char TOLOWER (unsigned char c) { return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; } -#undef MIN -template <typename Type> -static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; } - -#undef MAX -template <typename Type> -static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; } - static inline unsigned int DIV_CEIL (const unsigned int a, unsigned int b) { return (a + (b - 1)) / b; } @@ -298,17 +568,6 @@ hb_ceil_to_4 (unsigned int v) return ((v - 1) | 3) + 1; } -template <typename T> struct hb_is_signed; -/* https://github.com/harfbuzz/harfbuzz/issues/1535 */ -template <> struct hb_is_signed<int8_t> { enum { value = true }; }; -template <> struct hb_is_signed<int16_t> { enum { value = true }; }; -template <> struct hb_is_signed<int32_t> { enum { value = true }; }; -template <> struct hb_is_signed<int64_t> { enum { value = true }; }; -template <> struct hb_is_signed<uint8_t> { enum { value = false }; }; -template <> struct hb_is_signed<uint16_t> { enum { value = false }; }; -template <> struct hb_is_signed<uint32_t> { enum { value = false }; }; -template <> struct hb_is_signed<uint64_t> { enum { value = false }; }; - template <typename T> static inline bool hb_in_range (T u, T lo, T hi) { @@ -482,16 +741,17 @@ static inline void sort_r_simple(void *base, size_t nel, size_t w, } } -static inline void hb_sort_r(void *base, size_t nel, size_t width, - int (*compar)(const void *_a, const void *_b, void *_arg), - void *arg) +static inline void +hb_sort_r (void *base, size_t nel, size_t width, + int (*compar)(const void *_a, const void *_b, void *_arg), + void *arg) { sort_r_simple(base, nel, width, compar, arg); } -template <typename T, typename T2> static inline void -hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), T2 *array2) +template <typename T, typename T2, typename T3> static inline void +hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *), T3 *array2) { for (unsigned int i = 1; i < len; i++) { @@ -508,8 +768,8 @@ hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), } if (array2) { - T2 t = array2[i]; - memmove (&array2[j + 1], &array2[j], (i - j) * sizeof (T2)); + T3 t = array2[i]; + memmove (&array2[j + 1], &array2[j], (i - j) * sizeof (T3)); array2[j] = t; } } @@ -526,7 +786,7 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o { /* Pain because we don't know whether s is nul-terminated. */ char buf[64]; - len = MIN (ARRAY_LENGTH (buf) - 1, len); + len = hb_min (ARRAY_LENGTH (buf) - 1, len); strncpy (buf, s, len); buf[len] = '\0'; @@ -540,30 +800,83 @@ hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *o } -struct HbOpOr -{ - static constexpr bool passthru_left = true; - static constexpr bool passthru_right = true; - template <typename T> static void process (T &o, const T &a, const T &b) { o = a | b; } -}; -struct HbOpAnd -{ +/* Operators. */ + +struct hb_bitwise_and +{ HB_PARTIALIZE(2); static constexpr bool passthru_left = false; static constexpr bool passthru_right = false; - template <typename T> static void process (T &o, const T &a, const T &b) { o = a & b; } -}; -struct HbOpMinus -{ + template <typename T> auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b) +} +HB_FUNCOBJ (hb_bitwise_and); +struct hb_bitwise_or +{ HB_PARTIALIZE(2); static constexpr bool passthru_left = true; - static constexpr bool passthru_right = false; - template <typename T> static void process (T &o, const T &a, const T &b) { o = a & ~b; } -}; -struct HbOpXor -{ + static constexpr bool passthru_right = true; + template <typename T> auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b) +} +HB_FUNCOBJ (hb_bitwise_or); +struct hb_bitwise_xor +{ HB_PARTIALIZE(2); static constexpr bool passthru_left = true; static constexpr bool passthru_right = true; - template <typename T> static void process (T &o, const T &a, const T &b) { o = a ^ b; } -}; + template <typename T> auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b) +} +HB_FUNCOBJ (hb_bitwise_xor); +struct hb_bitwise_sub +{ HB_PARTIALIZE(2); + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = false; + template <typename T> auto + operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b) +} +HB_FUNCOBJ (hb_bitwise_sub); + +struct +{ HB_PARTIALIZE(2); + template <typename T, typename T2> auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a + b) +} +HB_FUNCOBJ (hb_add); +struct +{ HB_PARTIALIZE(2); + template <typename T, typename T2> auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a - b) +} +HB_FUNCOBJ (hb_sub); +struct +{ HB_PARTIALIZE(2); + template <typename T, typename T2> auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a * b) +} +HB_FUNCOBJ (hb_mul); +struct +{ HB_PARTIALIZE(2); + template <typename T, typename T2> auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a / b) +} +HB_FUNCOBJ (hb_div); +struct +{ HB_PARTIALIZE(2); + template <typename T, typename T2> auto + operator () (const T &a, const T2 &b) const HB_AUTO_RETURN (a % b) +} +HB_FUNCOBJ (hb_mod); +struct +{ + template <typename T> auto + operator () (const T &a) const HB_AUTO_RETURN (+a) +} +HB_FUNCOBJ (hb_pos); +struct +{ + template <typename T> auto + operator () (const T &a) const HB_AUTO_RETURN (-a) +} +HB_FUNCOBJ (hb_neg); /* Compiler-assisted vectorization. */ @@ -579,26 +892,26 @@ struct hb_vector_size_t void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); } - template <class Op> - hb_vector_size_t process (const hb_vector_size_t &o) const + template <typename Op> + hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const { hb_vector_size_t r; #if HB_VECTOR_SIZE if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) - Op::process (r.u.vec[i], u.vec[i], o.u.vec[i]); + r.u.vec[i] = op (u.vec[i], o.u.vec[i]); else #endif for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) - Op::process (r.u.v[i], u.v[i], o.u.v[i]); + r.u.v[i] = op (u.v[i], o.u.v[i]); return r; } hb_vector_size_t operator | (const hb_vector_size_t &o) const - { return process<HbOpOr> (o); } + { return process (hb_bitwise_or, o); } hb_vector_size_t operator & (const hb_vector_size_t &o) const - { return process<HbOpAnd> (o); } + { return process (hb_bitwise_and, o); } hb_vector_size_t operator ^ (const hb_vector_size_t &o) const - { return process<HbOpXor> (o); } + { return process (hb_bitwise_xor, o); } hb_vector_size_t operator ~ () const { hb_vector_size_t r; @@ -624,4 +937,4 @@ struct hb_vector_size_t }; -#endif /* HB_DSALGS_HH */ +#endif /* HB_ALGS_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh index 52b775e9569..587000cd428 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh @@ -28,7 +28,7 @@ #define HB_ARRAY_HH #include "hb.hh" -#include "hb-dsalgs.hh" +#include "hb-algs.hh" #include "hb-iter.hh" #include "hb-null.hh" @@ -37,22 +37,31 @@ template <typename Type> struct hb_sorted_array_t; template <typename Type> -struct hb_array_t : - hb_iter_t<hb_array_t<Type>, Type>, - hb_iter_mixin_t<hb_array_t<Type>, Type> +struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&> { /* * Constructors. */ - hb_array_t () : arrayZ (nullptr), length (0) {} - hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {} - template <unsigned int length_> hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} + hb_array_t () : arrayZ (nullptr), length (0), backwards_length (0) {} + hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_), backwards_length (0) {} + template <unsigned int length_> + hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_), backwards_length (0) {} + template <typename U, + hb_enable_if (hb_is_cr_convertible(U, Type))> + hb_array_t (const hb_array_t<U> &o) : + hb_iter_with_fallback_t<hb_array_t<Type>, Type&> (), + arrayZ (o.arrayZ), length (o.length), backwards_length (o.backwards_length) {} + template <typename U, + hb_enable_if (hb_is_cr_convertible(U, Type))> + hb_array_t& operator = (const hb_array_t<U> &o) + { arrayZ = o.arrayZ; length = o.length; backwards_length = o.backwards_length; return *this; } /* * Iterator implementation. */ - typedef Type __item_type__; + typedef Type& __item_t__; + static constexpr bool is_random_access_iterator = true; Type& __item_at__ (unsigned i) const { if (unlikely (i >= length)) return CrapOrNull (Type); @@ -63,16 +72,25 @@ struct hb_array_t : if (unlikely (n > length)) n = length; length -= n; + backwards_length += n; arrayZ += n; } void __rewind__ (unsigned n) { - if (unlikely (n > length)) - n = length; - length -= n; + if (unlikely (n > backwards_length)) + n = backwards_length; + length += n; + backwards_length -= n; + arrayZ -= n; } unsigned __len__ () const { return length; } - bool __random_access__ () const { return true; } + /* Ouch. The operator== compares the contents of the array. For range-based for loops, + * it's best if we can just compare arrayZ, though comparing contents is still fast, + * but also would require that Type has operator==. As such, we optimize this operator + * for range-based for loop and just compare arrayZ. No need to compare length, as we + * assume we're only compared to .end(). */ + bool operator != (const hb_array_t& o) const + { return arrayZ != o.arrayZ; } /* Extra operators. */ @@ -80,6 +98,9 @@ struct hb_array_t : operator hb_array_t<const Type> () { return hb_array_t<const Type> (arrayZ, length); } template <typename T> operator T * () const { return arrayZ; } + HB_INTERNAL bool operator == (const hb_array_t &o) const; + HB_INTERNAL uint32_t hash () const; + /* * Compare, Sort, and Search. */ @@ -91,7 +112,7 @@ struct hb_array_t : return (int) a.length - (int) length; return hb_memcmp (a.arrayZ, arrayZ, get_size ()); } - static int cmp (const void *pa, const void *pb) + HB_INTERNAL static int cmp (const void *pa, const void *pb) { hb_array_t<Type> *a = (hb_array_t<Type> *) pa; hb_array_t<Type> *b = (hb_array_t<Type> *) pb; @@ -131,7 +152,7 @@ struct hb_array_t : } void qsort (unsigned int start, unsigned int end) { - end = MIN (end, length); + end = hb_min (end, length); assert (start <= end); if (likely (start < end)) ::qsort (arrayZ + start, end - start, this->item_size, Type::cmp); @@ -154,7 +175,7 @@ struct hb_array_t : else count -= start_offset; if (seg_count) - count = *seg_count = MIN (count, *seg_count); + count = *seg_count = hb_min (count, *seg_count); return hb_array_t<Type> (arrayZ + start_offset, count); } hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const @@ -164,6 +185,17 @@ struct hb_array_t : void free () { ::free ((void *) arrayZ); arrayZ = nullptr; length = 0; } + template <typename hb_serialize_context_t> + hb_array_t copy (hb_serialize_context_t *c) const + { + TRACE_SERIALIZE (this); + auto* out = c->start_embed (arrayZ); + if (unlikely (!c->extend_size (out, get_size ()))) return_trace (hb_array_t ()); + for (unsigned i = 0; i < length; i++) + out[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ + return_trace (hb_array_t (out, length)); + } + template <typename hb_sanitize_context_t> bool sanitize (hb_sanitize_context_t *c) const { return c->check_array (arrayZ, length); } @@ -175,6 +207,7 @@ struct hb_array_t : public: Type *arrayZ; unsigned int length; + unsigned int backwards_length; }; template <typename T> inline hb_array_t<T> hb_array (T *array, unsigned int length) @@ -183,7 +216,6 @@ template <typename T, unsigned int length_> inline hb_array_t<T> hb_array (T (&array_)[length_]) { return hb_array_t<T> (array_); } - enum hb_bfind_not_found_t { HB_BFIND_NOT_FOUND_DONT_STORE, @@ -193,14 +225,32 @@ enum hb_bfind_not_found_t template <typename Type> struct hb_sorted_array_t : - hb_sorted_iter_t<hb_sorted_array_t<Type>, Type>, - hb_array_t<Type>, - hb_iter_mixin_t<hb_sorted_array_t<Type>, Type> + hb_iter_t<hb_sorted_array_t<Type>, Type&>, + hb_array_t<Type> { + typedef hb_iter_t<hb_sorted_array_t<Type>, Type&> iter_base_t; + HB_ITER_USING (iter_base_t); + static constexpr bool is_random_access_iterator = true; + static constexpr bool is_sorted_iterator = true; + hb_sorted_array_t () : hb_array_t<Type> () {} - hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {} hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {} - template <unsigned int length_> hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {} + template <unsigned int length_> + hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {} + + template <typename U, + hb_enable_if (hb_is_cr_convertible(U, Type))> + hb_sorted_array_t (const hb_array_t<U> &o) : + hb_iter_t<hb_sorted_array_t<Type>, Type&> (), + hb_array_t<Type> (o) {} + template <typename U, + hb_enable_if (hb_is_cr_convertible(U, Type))> + hb_sorted_array_t& operator = (const hb_array_t<U> &o) + { hb_array_t<Type> (*this) = o; return *this; } + + /* Iterator implementation. */ + bool operator != (const hb_sorted_array_t& o) const + { return this->arrayZ != o.arrayZ || this->length != o.length; } hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const { return hb_sorted_array_t<Type> (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); } @@ -269,9 +319,30 @@ template <typename T, unsigned int length_> inline hb_sorted_array_t<T> hb_sorted_array (T (&array_)[length_]) { return hb_sorted_array_t<T> (array_); } +template <typename T> +bool hb_array_t<T>::operator == (const hb_array_t<T> &o) const +{ + return length == o.length && + + hb_zip (*this, o) + | hb_map ([] (hb_pair_t<T&, T&> &&_) { return _.first == _.second; }) + | hb_all + ; +} +template <typename T> +uint32_t hb_array_t<T>::hash () const +{ + return + + hb_iter (*this) + | hb_map (hb_hash) + | hb_reduce ([] (uint32_t a, uint32_t b) { return a * 31 + b; }, 0) + ; +} typedef hb_array_t<const char> hb_bytes_t; typedef hb_array_t<const unsigned char> hb_ubytes_t; +/* TODO Specialize opeator==/hash() for hb_bytes_t and hb_ubytes_t. */ +//template <> +//uint32_t hb_array_t<const char>::hash () const { return 0; } #endif /* HB_ARRAY_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh index f9afd4fff0e..a82ce6cf3c7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh @@ -33,6 +33,7 @@ #define HB_ATOMIC_HH #include "hb.hh" +#include "hb-meta.hh" /* @@ -106,7 +107,7 @@ _hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N) static inline void _hb_memory_barrier () { -#if !defined(MemoryBarrier) +#ifndef MemoryBarrier /* MinGW has a convoluted history of supporting MemoryBarrier. */ LONG dummy = 0; InterlockedExchange (&dummy, 1); @@ -282,7 +283,7 @@ struct hb_atomic_int_t template <typename P> struct hb_atomic_ptr_t { - typedef typename hb_remove_pointer (P) T; + typedef hb_remove_pointer<P> T; void init (T* v_ = nullptr) { set_relaxed (v_); } void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc index bcf381e1aa4..5783fb2947f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc @@ -30,7 +30,7 @@ * http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html * https://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */ -#ifndef _POSIX_C_SOURCE +#if !defined(_POSIX_C_SOURCE) && !defined(_MSC_VER) && !defined(__NetBSD__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-macros" #define _POSIX_C_SOURCE 200809L @@ -155,7 +155,7 @@ hb_blob_create_sub_blob (hb_blob_t *parent, hb_blob_make_immutable (parent); blob = hb_blob_create (parent->data + offset, - MIN (length, parent->length - offset), + hb_min (length, parent->length - offset), HB_MEMORY_MODE_READONLY, hb_blob_reference (parent), _hb_blob_destroy); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h index d1d9134ac27..f80e9af2d9e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h @@ -71,6 +71,9 @@ hb_blob_create (const char *data, void *user_data, hb_destroy_func_t destroy); +HB_EXTERN hb_blob_t * +hb_blob_create_from_file (const char *file_name); + /* Always creates with MEMORY_MODE_READONLY. * Even if the parent blob is writable, we don't * want the user of the sub-blob to be able to @@ -123,9 +126,6 @@ hb_blob_get_data (hb_blob_t *blob, unsigned int *length); HB_EXTERN char * hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length); -HB_EXTERN hb_blob_t * -hb_blob_create_from_file (const char *file_name); - HB_END_DECLS #endif /* HB_BLOB_H */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh index 4ea13f81370..cff492fa05a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh @@ -81,7 +81,7 @@ struct hb_blob_t template <typename P> struct hb_blob_ptr_t { - typedef typename hb_remove_pointer (P) T; + typedef hb_remove_pointer<P> T; hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {} hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc index 6e265e84c6c..d3732fd02d6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc @@ -28,8 +28,10 @@ static const char *serialize_formats[] = { +#ifndef HB_NO_BUFFER_SERIALIZE "text", "json", +#endif nullptr }; @@ -85,10 +87,12 @@ hb_buffer_serialize_format_from_string (const char *str, int len) const char * hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format) { - switch (format) + switch ((unsigned) format) { +#ifndef HB_NO_BUFFER_SERIALIZE case HB_BUFFER_SERIALIZE_FORMAT_TEXT: return serialize_formats[0]; case HB_BUFFER_SERIALIZE_FORMAT_JSON: return serialize_formats[1]; +#endif default: case HB_BUFFER_SERIALIZE_FORMAT_INVALID: return nullptr; } @@ -138,34 +142,34 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, *p++ = '"'; } else - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"cl\":%u", info[i].cluster)); } if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) { - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", x+pos[i].x_offset, y+pos[i].y_offset)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", pos[i].x_advance, pos[i].y_advance)); } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) { if (info[i].mask & HB_GLYPH_FLAG_DEFINED) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"fl\":%u", info[i].mask & HB_GLYPH_FLAG_DEFINED)); } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS) { hb_glyph_extents_t extents; hb_font_get_glyph_extents(font, info[i].codepoint, &extents); - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d", extents.x_bearing, extents.y_bearing)); - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d", + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d", extents.width, extents.height)); } @@ -224,37 +228,37 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, p += strlen (p); } else - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%u", info[i].codepoint)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS)) { - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "=%u", info[i].cluster)); } if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) { if (x+pos[i].x_offset || y+pos[i].y_offset) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset)); if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) { *p++ = '+'; - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); if (pos[i].y_advance) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); } } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) { if (info[i].mask & HB_GLYPH_FLAG_DEFINED) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED)); } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS) { hb_glyph_extents_t extents; hb_font_get_glyph_extents(font, info[i].codepoint, &extents); - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height)); + p += hb_max (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height)); } unsigned int l = p - b; @@ -344,6 +348,10 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer, if (buf_size) *buf = '\0'; +#ifdef HB_NO_BUFFER_SERIALIZE + return 0; +#endif + assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); @@ -380,7 +388,7 @@ static hb_bool_t parse_uint (const char *pp, const char *end, uint32_t *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); strncpy (buf, pp, len); buf[len] = '\0'; @@ -401,7 +409,7 @@ static hb_bool_t parse_int (const char *pp, const char *end, int32_t *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - pp)); strncpy (buf, pp, len); buf[len] = '\0'; @@ -449,6 +457,10 @@ hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, end_ptr = &end; *end_ptr = buf; +#ifdef HB_NO_BUFFER_SERIALIZE + return false; +#endif + assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc index 2dc02e9d657..d95404f5ca2 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc @@ -524,7 +524,7 @@ hb_buffer_t::merge_clusters_impl (unsigned int start, unsigned int cluster = info[start].cluster; for (unsigned int i = start + 1; i < end; i++) - cluster = MIN<unsigned int> (cluster, info[i].cluster); + cluster = hb_min (cluster, info[i].cluster); /* Extend end */ while (end < len && info[end - 1].cluster == info[end].cluster) @@ -555,7 +555,7 @@ hb_buffer_t::merge_out_clusters (unsigned int start, unsigned int cluster = out_info[start].cluster; for (unsigned int i = start + 1; i < end; i++) - cluster = MIN<unsigned int> (cluster, out_info[i].cluster); + cluster = hb_min (cluster, out_info[i].cluster); /* Extend start */ while (start && out_info[start - 1].cluster == out_info[start].cluster) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh index 330f88bacc9..b2b190ace7a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh @@ -379,7 +379,7 @@ struct hb_buffer_t unsigned int cluster) const { for (unsigned int i = start; i < end; i++) - cluster = MIN<unsigned int> (cluster, infos[i].cluster); + cluster = hb_min (cluster, infos[i].cluster); return cluster; } void diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-common.hh index 72e9e06c818..c5157c78337 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-common.hh @@ -272,11 +272,11 @@ struct UnsizedByteStr : UnsizedArrayOf <HBUINT8> HBUINT8 *p = c->allocate_size<HBUINT8> (1); if (unlikely (p == nullptr)) return_trace (false); - p->set (intOp); + *p = intOp; INTTYPE *ip = c->allocate_size<INTTYPE> (INTTYPE::static_size); if (unlikely (ip == nullptr)) return_trace (false); - ip->set ((unsigned int)value); + *ip = (unsigned int) value; return_trace (true); } @@ -691,7 +691,7 @@ struct opset_t case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1: case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3: - env.argStack.push_int ((int16_t)(-(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108)); + env.argStack.push_int ((-(int16_t)(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108)); env.str_ref.inc (); break; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh index 283bdf14afe..61bdba5f519 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff-interp-cs-common.hh @@ -147,8 +147,9 @@ struct cs_interp_env_t : interp_env_t<ARG> return callStack.in_error () || SUPER::in_error (); } - bool popSubrNum (const biased_subrs_t<SUBRS>& biasedSubrs, unsigned int &subr_num) + bool pop_subr_num (const biased_subrs_t<SUBRS>& biasedSubrs, unsigned int &subr_num) { + subr_num = 0; int n = SUPER::argStack.pop_int (); n += biasedSubrs.get_bias (); if (unlikely ((n < 0) || ((unsigned int)n >= biasedSubrs.get_count ()))) @@ -158,11 +159,11 @@ struct cs_interp_env_t : interp_env_t<ARG> return true; } - void callSubr (const biased_subrs_t<SUBRS>& biasedSubrs, cs_type_t type) + void call_subr (const biased_subrs_t<SUBRS>& biasedSubrs, cs_type_t type) { - unsigned int subr_num; + unsigned int subr_num = 0; - if (unlikely (!popSubrNum (biasedSubrs, subr_num) + if (unlikely (!pop_subr_num (biasedSubrs, subr_num) || callStack.get_count () >= kMaxCallLimit)) { SUPER::set_error (); @@ -175,7 +176,7 @@ struct cs_interp_env_t : interp_env_t<ARG> SUPER::str_ref = context.str_ref; } - void returnFromSubr () + void return_from_subr () { if (unlikely (SUPER::str_ref.in_error ())) SUPER::set_error (); @@ -246,7 +247,7 @@ struct path_procs_null_t static void flex1 (ENV &env, PARAM& param) {} }; -template <typename ARG, typename OPSET, typename ENV, typename PARAM, typename PATH=path_procs_null_t<ENV, PARAM> > +template <typename ARG, typename OPSET, typename ENV, typename PARAM, typename PATH=path_procs_null_t<ENV, PARAM>> struct cs_opset_t : opset_t<ARG> { static void process_op (op_code_t op, ENV &env, PARAM& param) @@ -254,7 +255,7 @@ struct cs_opset_t : opset_t<ARG> switch (op) { case OpCode_return: - env.returnFromSubr (); + env.return_from_subr (); break; case OpCode_endchar: OPSET::check_width (op, env, param); @@ -267,11 +268,11 @@ struct cs_opset_t : opset_t<ARG> break; case OpCode_callsubr: - env.callSubr (env.localSubrs, CSType_LocalSubr); + env.call_subr (env.localSubrs, CSType_LocalSubr); break; case OpCode_callgsubr: - env.callSubr (env.globalSubrs, CSType_GlobalSubr); + env.call_subr (env.globalSubrs, CSType_GlobalSubr); break; case OpCode_hstem: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff1-interp-cs.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff1-interp-cs.hh index c7209ed804d..cc528564c4a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff1-interp-cs.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff1-interp-cs.hh @@ -81,7 +81,7 @@ struct cff1_cs_interp_env_t : cs_interp_env_t<number_t, CFF1Subrs> typedef cs_interp_env_t<number_t, CFF1Subrs> SUPER; }; -template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff1_cs_interp_env_t, PARAM> > +template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff1_cs_interp_env_t, PARAM>> struct cff1_cs_opset_t : cs_opset_t<number_t, OPSET, cff1_cs_interp_env_t, PARAM, PATH> { /* PostScript-originated legacy opcodes (OpCode_add etc) are unsupported */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff2-interp-cs.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff2-interp-cs.hh index 49e5ee7397e..1faf2083100 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff2-interp-cs.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-cff2-interp-cs.hh @@ -193,7 +193,7 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<blend_arg_t, CFF2Subrs> typedef cs_interp_env_t<blend_arg_t, CFF2Subrs> SUPER; }; -template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff2_cs_interp_env_t, PARAM> > +template <typename OPSET, typename PARAM, typename PATH=path_procs_null_t<cff2_cs_interp_env_t, PARAM>> struct cff2_cs_opset_t : cs_opset_t<blend_arg_t, OPSET, cff2_cs_interp_env_t, PARAM, PATH> { static void process_op (op_code_t op, cff2_cs_interp_env_t &env, PARAM& param) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc index ab93bf42772..71791dba1d6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc @@ -67,7 +67,7 @@ _hb_options_init () p = c + strlen (c); #define OPTION(name, symbol) \ - if (0 == strncmp (c, name, p - c) && strlen (name) == p - c) u.opts.symbol = true; + if (0 == strncmp (c, name, p - c) && strlen (name) == p - c) do { u.opts.symbol = true; } while (0) OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible); OPTION ("aat", aat); @@ -356,7 +356,7 @@ hb_language_from_string (const char *str, int len) { /* NUL-terminate it. */ char strbuf[64]; - len = MIN (len, (int) sizeof (strbuf) - 1); + len = hb_min (len, (int) sizeof (strbuf) - 1); memcpy (strbuf, str, len); strbuf[len] = '\0'; item = lang_find_or_insert (strbuf); @@ -488,7 +488,7 @@ hb_script_from_string (const char *str, int len) /** * hb_script_to_iso15924_tag: - * @script: an #hb_script_ to convert. + * @script: an #hb_script_t to convert. * * See hb_script_from_iso15924_tag(). * @@ -720,7 +720,7 @@ static bool parse_uint (const char **pp, const char *end, unsigned int *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); strncpy (buf, *pp, len); buf[len] = '\0'; @@ -744,7 +744,7 @@ static bool parse_uint32 (const char **pp, const char *end, uint32_t *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); strncpy (buf, *pp, len); buf[len] = '\0'; @@ -783,7 +783,7 @@ parse_uint32 (const char **pp, const char *end, uint32_t *pv) static void free_static_C_locale (); #endif -static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (HB_LOCALE_T), +static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<HB_LOCALE_T>, hb_C_locale_lazy_loader_t> { static HB_LOCALE_T create () @@ -825,7 +825,7 @@ static bool parse_float (const char **pp, const char *end, float *pv) { char buf[32]; - unsigned int len = MIN (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); + unsigned int len = hb_min (ARRAY_LENGTH (buf) - 1, (unsigned int) (end - *pp)); strncpy (buf, *pp, len); buf[len] = '\0'; @@ -1071,21 +1071,21 @@ hb_feature_to_string (hb_feature_t *feature, { s[len++] = '['; if (feature->start) - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start)); + len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start)); if (feature->end != feature->start + 1) { s[len++] = ':'; if (feature->end != (unsigned int) -1) - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end)); + len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end)); } s[len++] = ']'; } if (feature->value > 1) { s[len++] = '='; - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value)); + len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value)); } assert (len < ARRAY_LENGTH (s)); - len = MIN (len, size - 1); + len = hb_min (len, size - 1); memcpy (buf, s, len); buf[len] = '\0'; } @@ -1152,14 +1152,71 @@ hb_variation_to_string (hb_variation_t *variation, while (len && s[len - 1] == ' ') len--; s[len++] = '='; - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value)); + len += hb_max (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value)); assert (len < ARRAY_LENGTH (s)); - len = MIN (len, size - 1); + len = hb_min (len, size - 1); memcpy (buf, s, len); buf[len] = '\0'; } +/** + * hb_color_get_alpha: + * color: a #hb_color_t we are interested in its channels. + * + * Return value: Alpha channel value of the given color + * + * Since: 2.1.0 + */ +uint8_t +(hb_color_get_alpha) (hb_color_t color) +{ + return hb_color_get_alpha (color); +} + +/** + * hb_color_get_red: + * color: a #hb_color_t we are interested in its channels. + * + * Return value: Red channel value of the given color + * + * Since: 2.1.0 + */ +uint8_t +(hb_color_get_red) (hb_color_t color) +{ + return hb_color_get_red (color); +} + +/** + * hb_color_get_green: + * color: a #hb_color_t we are interested in its channels. + * + * Return value: Green channel value of the given color + * + * Since: 2.1.0 + */ +uint8_t +(hb_color_get_green) (hb_color_t color) +{ + return hb_color_get_green (color); +} + +/** + * hb_color_get_blue: + * color: a #hb_color_t we are interested in its channels. + * + * Return value: Blue channel value of the given color + * + * Since: 2.1.0 + */ +uint8_t +(hb_color_get_blue) (hb_color_t color) +{ + return hb_color_get_blue (color); +} + + /* If there is no visibility control, then hb-static.cc will NOT * define anything. Instead, we get it to define one set in here * only, so only libharfbuzz.so defines them, not other libs. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h index fbabd71c8c7..edd9ffb86a4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h @@ -358,7 +358,7 @@ typedef enum /*11.0*/HB_SCRIPT_SOGDIAN = HB_TAG ('S','o','g','d'), /* - * Since REPLACEME + * Since 2.4.0 */ /*12.0*/HB_SCRIPT_ELYMAIC = HB_TAG ('E','l','y','m'), /*12.0*/HB_SCRIPT_NANDINAGARI = HB_TAG ('N','a','n','d'), @@ -467,39 +467,21 @@ typedef uint32_t hb_color_t; #define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a))) -/** - * hb_color_get_alpha: - * - * - * - * Since: 2.1.0 - */ +HB_EXTERN uint8_t +hb_color_get_alpha (hb_color_t color); #define hb_color_get_alpha(color) ((color) & 0xFF) -/** - * hb_color_get_red: - * - * - * - * Since: 2.1.0 - */ + +HB_EXTERN uint8_t +hb_color_get_red (hb_color_t color); #define hb_color_get_red(color) (((color) >> 8) & 0xFF) -/** - * hb_color_get_green: - * - * - * - * Since: 2.1.0 - */ + +HB_EXTERN uint8_t +hb_color_get_green (hb_color_t color); #define hb_color_get_green(color) (((color) >> 16) & 0xFF) -/** - * hb_color_get_blue: - * - * - * - * Since: 2.1.0 - */ -#define hb_color_get_blue(color) (((color) >> 24) & 0xFF) +HB_EXTERN uint8_t +hb_color_get_blue (hb_color_t color); +#define hb_color_get_blue(color) (((color) >> 24) & 0xFF) HB_END_DECLS diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh new file mode 100644 index 00000000000..fd5a7134192 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-config.hh @@ -0,0 +1,130 @@ +/* + * Copyright © 2019 Facebook, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Facebook Author(s): Behdad Esfahbod + */ + +#ifndef HB_CONFIG_HH +#define HB_CONFIG_HH + +#if 0 /* Make test happy. */ +#include "hb.hh" +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + + +#ifdef HB_TINY +#define HB_LEAN +#define HB_MINI +#define HB_NO_MT +#ifndef NDEBUG +#define NDEBUG +#endif +#ifndef __OPTIMIZE_SIZE__ +#define __OPTIMIZE_SIZE__ +#endif +#endif + +#ifdef HB_LEAN +#define HB_DISABLE_DEPRECATED +#define HB_NDEBUG +#define HB_NO_ATEXIT +#define HB_NO_BUFFER_SERIALIZE +#define HB_NO_BITMAP +#define HB_NO_CFF +#define HB_NO_COLOR +#define HB_NO_GETENV +#define HB_NO_LAYOUT_UNUSED +#define HB_NO_MATH +#define HB_NO_NAME +#define HB_NO_SUBSET_LAYOUT +#endif + +#ifdef HB_MINI +#define HB_NO_AAT +#define HB_NO_LEGACY +#endif + +/* Closure. */ + +#ifdef HB_DISABLE_DEPRECATED +#define HB_IF_NOT_DEPRECATED(x) +#else +#define HB_IF_NOT_DEPRECATED(x) x +#endif + +#ifdef HB_NO_AAT +#define HB_NO_OT_NAME_LANGUAGE_AAT +#define HB_NO_SHAPE_AAT +#endif + +#ifdef HB_NO_BITMAP +#define HB_NO_OT_FONT_BITMAP +#endif + +#ifdef HB_NO_CFF +#define HB_NO_OT_FONT_CFF +#define HB_NO_SUBSET_CFF +#endif + +#ifdef HB_NO_GETENV +#define HB_NO_UNISCRIBE_BUG_COMPATIBLE +#endif + +#ifdef HB_NO_LEGACY +#define HB_NO_OT_LAYOUT_BLACKLIST +#define HB_NO_OT_SHAPE_FALLBACK +#endif + +#ifdef HB_NO_NAME +#define HB_NO_OT_NAME_LANGUAGE +#endif + +#ifdef HB_NO_OT_SHAPE_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK +#define HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS +#endif + +#ifdef NDEBUG +#ifndef HB_NDEBUG +#define HB_NDEBUG +#endif +#endif + +#ifdef __OPTIMIZE_SIZE__ +#ifndef HB_OPTIMIZE_SIZE +#define HB_OPTIMIZE_SIZE +#endif +#endif + +#ifdef HAVE_CONFIG_OVERRIDE_H +#include "config-override.h" +#endif + + +#endif /* HB_CONFIG_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc index 5989306784c..85993d1964e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc @@ -55,13 +55,13 @@ coretext_font_size_from_ptem (float ptem) * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html */ ptem *= 96.f / 72.f; - return ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem; + return (CGFloat) (ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem); } static float coretext_font_size_to_ptem (CGFloat size) { - size *= 72.f / 96.f; - return size <= 0.f ? 0 : size; + size *= 72. / 96.; + return size <= 0 ? 0 : size; } static void @@ -410,7 +410,7 @@ struct active_feature_t { feature_record_t rec; unsigned int order; - static int cmp (const void *pa, const void *pb) { + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const active_feature_t *a = (const active_feature_t *) pa; const active_feature_t *b = (const active_feature_t *) pb; return a->rec.feature < b->rec.feature ? -1 : a->rec.feature > b->rec.feature ? 1 : @@ -428,7 +428,7 @@ struct feature_event_t { bool start; active_feature_t feature; - static int cmp (const void *pa, const void *pb) { + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const feature_event_t *a = (const feature_event_t *) pa; const feature_event_t *b = (const feature_event_t *) pb; return a->index < b->index ? -1 : a->index > b->index ? 1 : @@ -598,7 +598,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } else { active_feature_t *feature = active_features.find (&event->feature); if (feature) - active_features.remove (feature - active_features.arrayZ ()); + active_features.remove (feature - active_features.arrayZ); } } } @@ -608,7 +608,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, #define ALLOCATE_ARRAY(Type, name, len, on_no_room) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ if (unlikely (_consumed > scratch_size)) \ { \ @@ -617,7 +617,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) ALLOCATE_ARRAY (UniChar, pchars, buffer->len * 2, /*nothing*/); unsigned int chars_len = 0; @@ -771,7 +771,7 @@ resize_and_retry: feature.start < chars_len && feature.start < feature.end) { CFRange feature_range = CFRangeMake (feature.start, - MIN (feature.end, chars_len) - feature.start); + hb_min (feature.end, chars_len) - feature.start); if (feature.value) CFAttributedStringRemoveAttribute (attr_string, feature_range, kCTKernAttributeName); else @@ -1069,7 +1069,7 @@ resize_and_retry: if (false) { /* Make sure all runs had the expected direction. */ - bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); + HB_UNUSED bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); assert (bool (status_and & kCTRunStatusRightToLeft) == backward); assert (bool (status_or & kCTRunStatusRightToLeft) == backward); } @@ -1116,7 +1116,7 @@ resize_and_retry: unsigned int cluster = info[count - 1].cluster; for (unsigned int i = count - 1; i > 0; i--) { - cluster = MIN (cluster, info[i - 1].cluster); + cluster = hb_min (cluster, info[i - 1].cluster); info[i - 1].cluster = cluster; } } @@ -1125,7 +1125,7 @@ resize_and_retry: unsigned int cluster = info[0].cluster; for (unsigned int i = 1; i < count; i++) { - cluster = MIN (cluster, info[i].cluster); + cluster = hb_min (cluster, info[i].cluster); info[i].cluster = cluster; } } @@ -1148,59 +1148,3 @@ fail: return ret; } - - -/* - * AAT shaper - */ - -/* - * shaper face data - */ - -struct hb_coretext_aat_face_data_t {}; - -hb_coretext_aat_face_data_t * -_hb_coretext_aat_shaper_face_data_create (hb_face_t *face) -{ - return hb_aat_layout_has_substitution (face) || hb_aat_layout_has_positioning (face) ? - (hb_coretext_aat_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr; -} - -void -_hb_coretext_aat_shaper_face_data_destroy (hb_coretext_aat_face_data_t *data HB_UNUSED) -{ -} - - -/* - * shaper font data - */ - -struct hb_coretext_aat_font_data_t {}; - -hb_coretext_aat_font_data_t * -_hb_coretext_aat_shaper_font_data_create (hb_font_t *font) -{ - return font->data.coretext ? (hb_coretext_aat_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr; -} - -void -_hb_coretext_aat_shaper_font_data_destroy (hb_coretext_aat_font_data_t *data HB_UNUSED) -{ -} - - -/* - * shaper - */ - -hb_bool_t -_hb_coretext_aat_shape (hb_shape_plan_t *shape_plan, - hb_font_t *font, - hb_buffer_t *buffer, - const hb_feature_t *features, - unsigned int num_features) -{ - return _hb_coretext_shape (shape_plan, font, buffer, features, num_features); -} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh index d7d0165a91f..e6d06e3102b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh @@ -29,7 +29,7 @@ #include "hb.hh" #include "hb-atomic.hh" -#include "hb-dsalgs.hh" +#include "hb-algs.hh" #ifndef HB_DEBUG @@ -63,6 +63,9 @@ extern HB_INTERNAL hb_atomic_int_t _hb_options; static inline hb_options_t hb_options () { +#ifdef HB_NO_GETENV + return hb_options_t (); +#endif /* Make a local copy, so we can access bitfield threadsafely. */ hb_options_union_t u; u.i = _hb_options.get_relaxed (); @@ -158,7 +161,7 @@ _hb_debug_msg_va (const char *what, VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR; fprintf (stderr, "%2u %s" VRBAR "%s", level, - bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level), + bars + sizeof (bars) - 1 - hb_min ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level), level_dir ? (level_dir > 0 ? DLBAR : ULBAR) : LBAR); } else fprintf (stderr, " " VRBAR LBAR); @@ -246,8 +249,8 @@ struct hb_printer_t<bool> { }; template <> -struct hb_printer_t<hb_void_t> { - const char *print (hb_void_t) { return ""; } +struct hb_printer_t<hb_empty_t> { + const char *print (hb_empty_t) { return ""; } }; @@ -263,7 +266,7 @@ static inline void _hb_warn_no_return (bool returned) } } template <> -/*static*/ inline void _hb_warn_no_return<hb_void_t> (bool returned HB_UNUSED) +/*static*/ inline void _hb_warn_no_return<hb_empty_t> (bool returned HB_UNUSED) {} template <int max_level, typename ret_t> @@ -327,18 +330,20 @@ struct hb_auto_trace_t<0, ret_t> const char *message, ...) HB_PRINTF_FUNC(6, 7) {} - ret_t ret (ret_t v, - const char *func HB_UNUSED = nullptr, - unsigned int line HB_UNUSED = 0) { return v; } + template <typename T> + T ret (T&& v, + const char *func HB_UNUSED = nullptr, + unsigned int line HB_UNUSED = 0) { return hb_forward<T> (v); } }; /* For disabled tracing; optimize out everything. * https://github.com/harfbuzz/harfbuzz/pull/605 */ template <typename ret_t> struct hb_no_trace_t { - ret_t ret (ret_t v, - const char *func HB_UNUSED = "", - unsigned int line HB_UNUSED = 0) { return v; } + template <typename T> + T ret (T&& v, + const char *func HB_UNUSED = nullptr, + unsigned int line HB_UNUSED = 0) { return hb_forward<T> (v); } }; #define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__) @@ -437,25 +442,12 @@ struct hb_no_trace_t { #define TRACE_SUBSET(this) hb_no_trace_t<bool> trace #endif -#ifndef HB_DEBUG_WOULD_APPLY -#define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0) -#endif -#if HB_DEBUG_WOULD_APPLY -#define TRACE_WOULD_APPLY(this) \ - hb_auto_trace_t<HB_DEBUG_WOULD_APPLY, bool> trace \ - (&c->debug_depth, c->get_name (), this, HB_FUNC, \ - "%d glyphs", c->len); -#else -#define TRACE_WOULD_APPLY(this) hb_no_trace_t<bool> trace -#endif - #ifndef HB_DEBUG_DISPATCH #define HB_DEBUG_DISPATCH ( \ HB_DEBUG_APPLY + \ HB_DEBUG_SANITIZE + \ HB_DEBUG_SERIALIZE + \ - HB_DEBUG_SUBSET + \ - HB_DEBUG_WOULD_APPLY + \ + HB_DEBUG_SUBSET + \ 0) #endif #if HB_DEBUG_DISPATCH diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h index 4a5e702ffca..026a62c74e5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h @@ -63,7 +63,7 @@ typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t *glyph, void *user_data); -HB_EXTERN HB_DEPRECATED_FOR(hb_font_funcs_set_nominal_glyph_func or hb_font_funcs_set_variation_glyph_func) void +HB_EXTERN HB_DEPRECATED_FOR(hb_font_funcs_set_nominal_glyph_func and hb_font_funcs_set_variation_glyph_func) void hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_func_t func, void *user_data, hb_destroy_func_t destroy); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc index 137cd56c868..057ae3305f9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc @@ -530,12 +530,12 @@ _hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, hb_buffer_t::scratch_buffer_t *scratch = buffer->get_scratch_buffer (&scratch_size); #define ALLOCATE_ARRAY(Type, name, len) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ assert (_consumed <= scratch_size); \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) #define utf16_index() var1.u32 @@ -778,7 +778,7 @@ retry_getglyphs: { uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index ()]]; - *p = MIN (*p, buffer->info[i].cluster); + *p = hb_min (*p, buffer->info[i].cluster); } for (unsigned int i = 1; i < glyphCount; i++) if (vis_clusters[i] == (uint32_t) -1) @@ -846,10 +846,23 @@ _hb_directwrite_shape (hb_shape_plan_t *shape_plan, features, num_features, 0); } -/* - * Public [experimental] API - */ - +/** + * hb_directwrite_shape_experimental_width: + * Experimental API to test DirectWrite's justification algorithm. + * + * It inserts Kashida at wrong order so don't use the API ever. + * + * It doesn't work with cygwin/msys due to header bugs so one + * should use MSVC toolchain in order to use it for now. + * + * @font: + * @buffer: + * @features: + * @num_features: + * @width: + * + * Since: 1.4.2 + **/ hb_bool_t hb_directwrite_shape_experimental_width (hb_font_t *font, hb_buffer_t *buffer, @@ -917,8 +930,11 @@ _hb_directwrite_font_release (void *data) /** * hb_directwrite_face_create: - * @font_face: - * Since: REPLACEME + * @font_face: a DirectWrite IDWriteFontFace object. + * + * Return value: #hb_face_t object corresponding to the given input + * + * Since: 2.4.0 **/ hb_face_t * hb_directwrite_face_create (IDWriteFontFace *font_face) @@ -928,3 +944,17 @@ hb_directwrite_face_create (IDWriteFontFace *font_face) return hb_face_create_for_tables (reference_table, font_face, _hb_directwrite_font_release); } + +/** +* hb_directwrite_face_get_font_face: +* @face: a #hb_face_t object +* +* Return value: DirectWrite IDWriteFontFace object corresponding to the given input +* +* Since: REPLACEME +**/ +IDWriteFontFace * +hb_directwrite_face_get_font_face (hb_face_t *face) +{ + return face->data.directwrite->fontFace; +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.h index 09776fd09a3..de813d069f2 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.h @@ -37,6 +37,9 @@ hb_directwrite_shape_experimental_width (hb_font_t *font, hb_buffer_t *buffer, HB_EXTERN hb_face_t * hb_directwrite_face_create (IDWriteFontFace *font_face); +HB_EXTERN IDWriteFontFace * +hb_directwrite_face_get_font_face (hb_face_t *face); + HB_END_DECLS #endif /* HB_DIRECTWRITE_H */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dispatch.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dispatch.hh new file mode 100644 index 00000000000..be4a90f4f39 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dispatch.hh @@ -0,0 +1,58 @@ +/* + * Copyright © 2007,2008,2009,2010 Red Hat, Inc. + * Copyright © 2012,2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_DISPATCH_HH +#define HB_DISPATCH_HH + +#include "hb.hh" + +/* + * Dispatch + */ + +template <typename Context, typename Return, unsigned int MaxDebugDepth> +struct hb_dispatch_context_t +{ + private: + /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ + const Context* thiz () const { return static_cast<const Context *> (this); } + Context* thiz () { return static_cast< Context *> (this); } + public: + static constexpr unsigned max_debug_depth = MaxDebugDepth; + typedef Return return_t; + template <typename T, typename F> + bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } + template <typename T, typename ...Ts> + return_t dispatch (const T &obj, Ts&&... ds) + { return obj.dispatch (thiz (), hb_forward<Ts> (ds)...); } + static return_t no_dispatch_return_value () { return Context::default_return_value (); } + static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } +}; + + +#endif /* HB_DISPATCH_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc index 817a1a7b0ea..19ee353eb9f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc @@ -336,6 +336,7 @@ hb_font_get_glyph_v_origin_default (hb_font_t *font, return ret; } +#ifndef HB_DISABLE_DEPRECATED static hb_position_t hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, @@ -373,6 +374,7 @@ hb_font_get_glyph_v_kerning_default (hb_font_t *font, { return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph)); } +#endif static hb_bool_t hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, @@ -925,6 +927,7 @@ hb_font_get_glyph_v_origin (hb_font_t *font, return font->get_glyph_v_origin (glyph, x, y); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_h_kerning: * @font: a font. @@ -964,6 +967,7 @@ hb_font_get_glyph_v_kerning (hb_font_t *font, { return font->get_glyph_v_kerning (top_glyph, bottom_glyph); } +#endif /** * hb_font_get_glyph_extents: @@ -1173,6 +1177,7 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, return font->subtract_glyph_origin_for_direction (glyph, direction, x, y); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_kerning_for_direction: * @font: a font. @@ -1195,6 +1200,7 @@ hb_font_get_glyph_kerning_for_direction (hb_font_t *font, { return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y); } +#endif /** * hb_font_get_glyph_extents_for_origin: @@ -1347,8 +1353,10 @@ hb_font_create (hb_face_t *face) { hb_font_t *font = _hb_font_create (face); +#ifndef HB_NO_OT_FONT /* Install our in-house, very lightweight, funcs. */ hb_ot_font_set_funcs (font); +#endif return font; } @@ -1914,6 +1922,7 @@ hb_font_get_var_coords_normalized (hb_font_t *font, } +#ifndef HB_DISABLE_DEPRECATED /* * Deprecated get_glyph_func(): */ @@ -2036,3 +2045,4 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, trampoline, trampoline_destroy); } +#endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh index aaa0fd91cac..95551bfd2bb 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh @@ -51,8 +51,8 @@ HB_FONT_FUNC_IMPLEMENT (glyph_v_advances) \ HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \ HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \ - HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \ - HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \ + HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning)) \ + HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning)) \ HB_FONT_FUNC_IMPLEMENT (glyph_extents) \ HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \ HB_FONT_FUNC_IMPLEMENT (glyph_name) \ @@ -304,17 +304,25 @@ struct hb_font_t hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) { +#ifdef HB_DISABLE_DEPRECATED + return 0; +#else return klass->get.f.glyph_h_kerning (this, user_data, left_glyph, right_glyph, klass->user_data.glyph_h_kerning); +#endif } hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph) { +#ifdef HB_DISABLE_DEPRECATED + return 0; +#else return klass->get.f.glyph_v_kerning (this, user_data, top_glyph, bottom_glyph, klass->user_data.glyph_v_kerning); +#endif } hb_bool_t get_glyph_extents (hb_codepoint_t glyph, @@ -607,7 +615,7 @@ struct hb_font_t return (hb_position_t) (scaled / upem); } hb_position_t em_scalef (float v, int scale) - { return (hb_position_t) round (v * scale / face->get_upem ()); } + { return (hb_position_t) roundf (v * scale / face->get_upem ()); } float em_fscale (int16_t v, int scale) { return (float) v * scale / face->get_upem (); } }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc index 1900f30bce2..d70c38a7aef 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc @@ -96,7 +96,7 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref) ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING; - ft_font->cached_x_scale.set (0); + ft_font->cached_x_scale.set_relaxed (0); ft_font->advance_cache.init (); return ft_font; @@ -439,7 +439,7 @@ hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED, else { /* Make a nul-terminated version. */ char buf[128]; - len = MIN (len, (int) sizeof (buf) - 1); + len = hb_min (len, (int) sizeof (buf) - 1); strncpy (buf, name, len); buf[len] = '\0'; *glyph = FT_Get_Name_Index (ft_face, buf); @@ -748,7 +748,7 @@ hb_ft_font_create_referenced (FT_Face ft_face) static void free_static_ft_library (); #endif -static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (FT_Library), +static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>, hb_ft_library_lazy_loader_t> { static FT_Library create () diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc index fdb545342df..f799f8b227e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc @@ -202,6 +202,7 @@ _hb_graphite2_shaper_font_data_destroy (hb_graphite2_font_data_t *data HB_UNUSED { } +#ifndef HB_DISABLE_DEPRECATED /** * hb_graphite2_font_get_gr_font: * @@ -213,6 +214,7 @@ hb_graphite2_font_get_gr_font (hb_font_t *font HB_UNUSED) { return nullptr; } +#endif /* @@ -308,12 +310,12 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, #define ALLOCATE_ARRAY(Type, name, len) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ assert (_consumed <= scratch_size); \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) ALLOCATE_ARRAY (hb_graphite2_cluster_t, clusters, buffer->len); ALLOCATE_ARRAY (hb_codepoint_t, gids, glyph_count); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc index c26c91d484a..399829a81bf 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc @@ -49,6 +49,9 @@ * Functions for using HarfBuzz with the ICU library to provide Unicode data. **/ +/* ICU doesn't do-while(0) around their statements. Ugh! + * https://unicode-org.atlassian.net/browse/CLDR-13027 */ +#define HB_ICU_STMT(S) do { S } while (0) hb_script_t hb_icu_script_to_script (UScriptCode script) @@ -183,9 +186,9 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = 0; err = false; - U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err); + HB_ICU_STMT (U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err)); if (err) return false; - U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err); + HB_ICU_STMT (U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err)); if (err) return false; icu_err = U_ZERO_ERROR; @@ -193,7 +196,7 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, if (U_FAILURE (icu_err)) return false; if (u_countChar32 (normalized, len) == 1) { - U16_GET_UNSAFE (normalized, 0, *ab); + HB_ICU_STMT (U16_GET_UNSAFE (normalized, 0, *ab)); ret = true; } else { ret = false; @@ -221,13 +224,13 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = u_countChar32 (decomposed, len); if (len == 1) { - U16_GET_UNSAFE (decomposed, 0, *a); + HB_ICU_STMT (U16_GET_UNSAFE (decomposed, 0, *a)); *b = 0; return *a != ab; } else if (len == 2) { len =0; - U16_NEXT_UNSAFE (decomposed, len, *a); - U16_NEXT_UNSAFE (decomposed, len, *b); + HB_ICU_STMT (U16_NEXT_UNSAFE (decomposed, len, *a)); + HB_ICU_STMT (U16_NEXT_UNSAFE (decomposed, len, *b)); } return true; } @@ -236,7 +239,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, /* We don't ifdef-out the fallback code such that compiler always * sees it and makes sure it's compilable. */ - UChar utf16[2], normalized[2 * HB_UNICODE_MAX_DECOMPOSITION_LEN + 1]; + UChar utf16[2], normalized[2 * 19/*HB_UNICODE_MAX_DECOMPOSITION_LEN*/ + 1]; unsigned int len; hb_bool_t ret, err; UErrorCode icu_err; @@ -247,7 +250,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = 0; err = false; - U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err); + HB_ICU_STMT (U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err)); if (err) return false; icu_err = U_ZERO_ERROR; @@ -258,13 +261,13 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, len = u_countChar32 (normalized, len); if (len == 1) { - U16_GET_UNSAFE (normalized, 0, *a); + HB_ICU_STMT (U16_GET_UNSAFE (normalized, 0, *a)); *b = 0; ret = *a != ab; } else if (len == 2) { len =0; - U16_NEXT_UNSAFE (normalized, len, *a); - U16_NEXT_UNSAFE (normalized, len, *b); + HB_ICU_STMT (U16_NEXT_UNSAFE (normalized, len, *a)); + HB_ICU_STMT (U16_NEXT_UNSAFE (normalized, len, *b)); /* Here's the ugly part: if ab decomposes to a single character and * that character decomposes again, we have to detect that and undo @@ -275,7 +278,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, if (U_FAILURE (icu_err)) return false; hb_codepoint_t c; - U16_GET_UNSAFE (recomposed, 0, c); + HB_ICU_STMT (U16_GET_UNSAFE (recomposed, 0, c)); if (c != *a && c != ab) { *a = c; *b = 0; @@ -284,7 +287,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, } else { /* If decomposed to more than two characters, take the last one, * and recompose the rest to get the first component. */ - U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */ + HB_ICU_STMT (U16_PREV_UNSAFE (normalized, len, *b)); /* Changes len in-place. */ UChar recomposed[18 * 2]; icu_err = U_ZERO_ERROR; len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err); @@ -293,7 +296,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, /* We expect that recomposed has exactly one character now. */ if (unlikely (u_countChar32 (recomposed, len) != 1)) return false; - U16_GET_UNSAFE (recomposed, 0, *a); + HB_ICU_STMT (U16_GET_UNSAFE (recomposed, 0, *a)); ret = true; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh index c4ab26dc063..5df433375c8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh @@ -1,5 +1,6 @@ /* * Copyright © 2018 Google, Inc. + * Copyright © 2019 Facebook, Inc. * * This is part of HarfBuzz, a text shaping library. * @@ -22,13 +23,15 @@ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Google Author(s): Behdad Esfahbod + * Facebook Author(s): Behdad Esfahbod */ #ifndef HB_ITER_HH #define HB_ITER_HH #include "hb.hh" -#include "hb-null.hh" +#include "hb-algs.hh" +#include "hb-meta.hh" /* Unified iterator object. @@ -39,16 +42,32 @@ * copied by value. If the collection / object being iterated on * is writable, then the iterator returns lvalues, otherwise it * returns rvalues. + * + * TODO Document more. + * + * If iterator implementation implements operator!=, then can be + * used in range-based for loop. That comes free if the iterator + * is random-access. Otherwise, the range-based for loop incurs + * one traversal to find end(), which can be avoided if written + * as a while-style for loop, or if iterator implements a faster + * __end__() method. + * TODO When opting in for C++17, address this by changing return + * type of .end()? + */ + +/* + * Base classes for iterators. */ /* Base class for all iterators. */ -template <typename Iter, typename Item = typename Iter::__item_type__> +template <typename iter_t, typename Item = typename iter_t::__item_t__> struct hb_iter_t { - typedef Iter iter_t; - typedef iter_t const_iter_t; typedef Item item_t; static constexpr unsigned item_size = hb_static_size (Item); + static constexpr bool is_iterator = true; + static constexpr bool is_random_access_iterator = false; + static constexpr bool is_sorted_iterator = false; private: /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ @@ -56,53 +75,110 @@ struct hb_iter_t iter_t* thiz () { return static_cast< iter_t *> (this); } public: - /* Operators. */ - operator iter_t () { return iter(); } - explicit_operator bool () const { return more (); } - item_t& operator * () const { return item (); } - item_t& operator [] (signed i) const { return item_at ((unsigned) i); } - iter_t& operator += (unsigned count) { forward (count); return *thiz(); } - iter_t& operator ++ () { next (); return *thiz(); } - iter_t& operator -= (unsigned count) { rewind (count); return *thiz(); } - iter_t& operator -- () { prev (); return *thiz(); } - iter_t operator + (unsigned count) { iter_t c (*thiz()); c += count; return c; } - iter_t operator ++ (int) { iter_t c (*thiz()); ++*thiz(); return c; } - iter_t operator - (unsigned count) { iter_t c (*thiz()); c -= count; return c; } - iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; } + /* TODO: + * Port operators below to use hb_enable_if to sniff which method implements + * an operator and use it, and remove hb_iter_fallback_mixin_t completely. */ - /* Methods. */ + /* Operators. */ iter_t iter () const { return *thiz(); } - const_iter_t const_iter () const { return iter (); } - item_t& item () const { return thiz()->__item__ (); } - item_t& item_at (unsigned i) const { return thiz()->__item_at__ (i); } - bool more () const { return thiz()->__more__ (); } + iter_t operator + () const { return *thiz(); } + iter_t begin () const { return *thiz(); } + iter_t end () const { return thiz()->__end__ (); } + explicit operator bool () const { return thiz()->__more__ (); } unsigned len () const { return thiz()->__len__ (); } - void next () { thiz()->__next__ (); } - void forward (unsigned n) { thiz()->__forward__ (n); } - void prev () { thiz()->__prev__ (); } - void rewind (unsigned n) { thiz()->__rewind__ (n); } - bool random_access () const { return thiz()->__random_access__ (); } + /* The following can only be enabled if item_t is reference type. Otherwise + * it will be returning pointer to temporary rvalue. + * TODO Use a wrapper return type to fix for non-reference type. */ + template <typename T = item_t, + hb_enable_if (hb_is_reference (T))> + hb_remove_reference<item_t>* operator -> () const { return hb_addressof (**thiz()); } + item_t operator * () const { return thiz()->__item__ (); } + item_t operator * () { return thiz()->__item__ (); } + item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); } + item_t operator [] (unsigned i) { return thiz()->__item_at__ (i); } + iter_t& operator += (unsigned count) & { thiz()->__forward__ (count); return *thiz(); } + iter_t operator += (unsigned count) && { thiz()->__forward__ (count); return *thiz(); } + iter_t& operator ++ () & { thiz()->__next__ (); return *thiz(); } + iter_t operator ++ () && { thiz()->__next__ (); return *thiz(); } + iter_t& operator -= (unsigned count) & { thiz()->__rewind__ (count); return *thiz(); } + iter_t operator -= (unsigned count) && { thiz()->__rewind__ (count); return *thiz(); } + iter_t& operator -- () & { thiz()->__prev__ (); return *thiz(); } + iter_t operator -- () && { thiz()->__prev__ (); return *thiz(); } + iter_t operator + (unsigned count) const { auto c = thiz()->iter (); c += count; return c; } + friend iter_t operator + (unsigned count, const iter_t &it) { return it + count; } + iter_t operator ++ (int) { iter_t c (*thiz()); ++*thiz(); return c; } + iter_t operator - (unsigned count) const { auto c = thiz()->iter (); c -= count; return c; } + iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; } + template <typename T> + iter_t& operator >> (T &v) & { v = **thiz(); ++*thiz(); return *thiz(); } + template <typename T> + iter_t operator >> (T &v) && { v = **thiz(); ++*thiz(); return *thiz(); } + template <typename T> + iter_t& operator << (const T v) & { **thiz() = v; ++*thiz(); return *thiz(); } + template <typename T> + iter_t operator << (const T v) && { **thiz() = v; ++*thiz(); return *thiz(); } protected: - hb_iter_t () {} - hb_iter_t (const hb_iter_t &o HB_UNUSED) {} - void operator = (const hb_iter_t &o HB_UNUSED) {} + hb_iter_t () = default; + hb_iter_t (const hb_iter_t &o HB_UNUSED) = default; + hb_iter_t (hb_iter_t &&o HB_UNUSED) = default; + hb_iter_t& operator = (const hb_iter_t &o HB_UNUSED) = default; + hb_iter_t& operator = (hb_iter_t &&o HB_UNUSED) = default; }; -/* Base class for sorted iterators. Does not enforce anything. - * Just for class taxonomy and requirements. */ -template <typename Iter, typename Item = typename Iter::__item_type__> -struct hb_sorted_iter_t : hb_iter_t<Iter, Item> +#define HB_ITER_USING(Name) \ + using item_t = typename Name::item_t; \ + using Name::begin; \ + using Name::end; \ + using Name::item_size; \ + using Name::is_iterator; \ + using Name::iter; \ + using Name::operator bool; \ + using Name::len; \ + using Name::operator ->; \ + using Name::operator *; \ + using Name::operator []; \ + using Name::operator +=; \ + using Name::operator ++; \ + using Name::operator -=; \ + using Name::operator --; \ + using Name::operator +; \ + using Name::operator -; \ + using Name::operator >>; \ + using Name::operator <<; \ + static_assert (true, "") + +/* Returns iterator / item type of a type. */ +template <typename Iterable> +using hb_iter_type = decltype (hb_deref (hb_declval (Iterable)).iter ()); +template <typename Iterable> +using hb_item_type = decltype (*hb_deref (hb_declval (Iterable)).iter ()); + + +template <typename> struct hb_array_t; + +struct { - protected: - hb_sorted_iter_t () {} - hb_sorted_iter_t (const hb_sorted_iter_t &o) : hb_iter_t<Iter, Item> (o) {} - void operator = (const hb_sorted_iter_t &o HB_UNUSED) {} -}; + template <typename T> hb_iter_type<T> + operator () (T&& c) const + { return hb_deref (hb_forward<T> (c)).iter (); } + + /* Specialization for C arrays. */ + + template <typename Type> inline hb_array_t<Type> + operator () (Type *array, unsigned int length) const + { return hb_array_t<Type> (array, length); } + + template <typename Type, unsigned int length> hb_array_t<Type> + operator () (Type (&array)[length]) const + { return hb_array_t<Type> (array, length); } + +} +HB_FUNCOBJ (hb_iter); /* Mixin to fill in what the subclass doesn't provide. */ -template <typename iter_t, typename item_t = typename iter_t::__item_type__> -struct hb_iter_mixin_t +template <typename iter_t, typename item_t = typename iter_t::__item_t__> +struct hb_iter_fallback_mixin_t { private: /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ @@ -111,42 +187,645 @@ struct hb_iter_mixin_t public: /* Access: Implement __item__(), or __item_at__() if random-access. */ - item_t& __item__ () const { return thiz()->item_at (0); } - item_t& __item_at__ (unsigned i) const { return *(thiz() + i); } + item_t __item__ () const { return (*thiz())[0]; } + item_t __item_at__ (unsigned i) const { return *(*thiz() + i); } /* Termination: Implement __more__(), or __len__() if random-access. */ - bool __more__ () const { return thiz()->__len__ (); } + bool __more__ () const { return bool (thiz()->len ()); } unsigned __len__ () const - { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; }; return l; } + { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; } return l; } /* Advancing: Implement __next__(), or __forward__() if random-access. */ - void __next__ () { thiz()->forward (1); } - void __forward__ (unsigned n) { while (n--) thiz()->next (); } + void __next__ () { *thiz() += 1; } + void __forward__ (unsigned n) { while (*thiz() && n--) ++*thiz(); } /* Rewinding: Implement __prev__() or __rewind__() if bidirectional. */ - void __prev__ () { thiz()->rewind (1); } - void __rewind__ (unsigned n) { while (n--) thiz()->prev (); } + void __prev__ () { *thiz() -= 1; } + void __rewind__ (unsigned n) { while (*thiz() && n--) --*thiz(); } + + /* Range-based for: Implement __end__() if can be done faster, + * and operator!=. */ + iter_t __end__ () const + { + if (thiz()->is_random_access_iterator) + return *thiz() + thiz()->len (); + /* Above expression loops twice. Following loops once. */ + auto it = *thiz(); + while (it) ++it; + return it; + } + + protected: + hb_iter_fallback_mixin_t () = default; + hb_iter_fallback_mixin_t (const hb_iter_fallback_mixin_t &o HB_UNUSED) = default; + hb_iter_fallback_mixin_t (hb_iter_fallback_mixin_t &&o HB_UNUSED) = default; + hb_iter_fallback_mixin_t& operator = (const hb_iter_fallback_mixin_t &o HB_UNUSED) = default; + hb_iter_fallback_mixin_t& operator = (hb_iter_fallback_mixin_t &&o HB_UNUSED) = default; +}; + +template <typename iter_t, typename item_t = typename iter_t::__item_t__> +struct hb_iter_with_fallback_t : + hb_iter_t<iter_t, item_t>, + hb_iter_fallback_mixin_t<iter_t, item_t> +{ + protected: + hb_iter_with_fallback_t () = default; + hb_iter_with_fallback_t (const hb_iter_with_fallback_t &o HB_UNUSED) = default; + hb_iter_with_fallback_t (hb_iter_with_fallback_t &&o HB_UNUSED) = default; + hb_iter_with_fallback_t& operator = (const hb_iter_with_fallback_t &o HB_UNUSED) = default; + hb_iter_with_fallback_t& operator = (hb_iter_with_fallback_t &&o HB_UNUSED) = default; +}; + +/* + * Meta-programming predicates. + */ + +/* hb_is_iterator() / hb_is_iterator_of() */ + +template<typename Iter, typename Item> +struct hb_is_iterator_of +{ + template <typename Item2 = Item> + static hb_true_type impl (hb_priority<2>, hb_iter_t<Iter, hb_type_identity<Item2>> *); + static hb_false_type impl (hb_priority<0>, const void *); + + public: + static constexpr bool value = decltype (impl (hb_prioritize, hb_declval (Iter*)))::value; +}; +#define hb_is_iterator_of(Iter, Item) hb_is_iterator_of<Iter, Item>::value +#define hb_is_iterator(Iter) hb_is_iterator_of (Iter, typename Iter::item_t) + +/* hb_is_iterable() */ + +template <typename T> +struct hb_is_iterable +{ + private: + + template <typename U> + static auto impl (hb_priority<1>) -> decltype (hb_declval (U).iter (), hb_true_type ()); + + template <typename> + static hb_false_type impl (hb_priority<0>); + + public: + static constexpr bool value = decltype (impl<T> (hb_prioritize))::value; +}; +#define hb_is_iterable(Iterable) hb_is_iterable<Iterable>::value + +/* hb_is_source_of() / hb_is_sink_of() */ + +template<typename Iter, typename Item> +struct hb_is_source_of +{ + private: + template <typename Iter2 = Iter, + hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference<hb_add_const<Item>>))> + static hb_true_type impl (hb_priority<2>); + template <typename Iter2 = Iter> + static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) >> hb_declval (Item &), hb_true_type ()); + static hb_false_type impl (hb_priority<0>); + + public: + static constexpr bool value = decltype (impl (hb_prioritize))::value; +}; +#define hb_is_source_of(Iter, Item) hb_is_source_of<Iter, Item>::value + +template<typename Iter, typename Item> +struct hb_is_sink_of +{ + private: + template <typename Iter2 = Iter, + hb_enable_if (hb_is_convertible (typename Iter2::item_t, hb_add_lvalue_reference<Item>))> + static hb_true_type impl (hb_priority<2>); + template <typename Iter2 = Iter> + static auto impl (hb_priority<1>) -> decltype (hb_declval (Iter2) << hb_declval (Item), hb_true_type ()); + static hb_false_type impl (hb_priority<0>); + + public: + static constexpr bool value = decltype (impl (hb_prioritize))::value; +}; +#define hb_is_sink_of(Iter, Item) hb_is_sink_of<Iter, Item>::value + +/* This is commonly used, so define: */ +#define hb_is_sorted_source_of(Iter, Item) \ + (hb_is_source_of(Iter, Item) && Iter::is_sorted_iterator) + + +/* Range-based 'for' for iterables. */ + +template <typename Iterable, + hb_requires (hb_is_iterable (Iterable))> +static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ()) + +template <typename Iterable, + hb_requires (hb_is_iterable (Iterable))> +static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ()) + +/* begin()/end() are NOT looked up non-ADL. So each namespace must declare them. + * Do it for namespace OT. */ +namespace OT { + +template <typename Iterable, + hb_requires (hb_is_iterable (Iterable))> +static inline auto begin (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).begin ()) + +template <typename Iterable, + hb_requires (hb_is_iterable (Iterable))> +static inline auto end (Iterable&& iterable) HB_AUTO_RETURN (hb_iter (iterable).end ()) + +} + + +/* + * Adaptors, combiners, etc. + */ + +template <typename Lhs, typename Rhs, + hb_requires (hb_is_iterator (Lhs))> +static inline auto +operator | (Lhs&& lhs, Rhs&& rhs) HB_AUTO_RETURN (hb_forward<Rhs> (rhs) (hb_forward<Lhs> (lhs))) + +/* hb_map(), hb_filter(), hb_reduce() */ + +enum class hb_function_sortedness_t { + NOT_SORTED, + RETAINS_SORTING, + SORTED, +}; + +template <typename Iter, typename Proj, hb_function_sortedness_t Sorted, + hb_requires (hb_is_iterator (Iter))> +struct hb_map_iter_t : + hb_iter_t<hb_map_iter_t<Iter, Proj, Sorted>, + decltype (hb_get (hb_declval (Proj), *hb_declval (Iter)))> +{ + hb_map_iter_t (const Iter& it, Proj f_) : it (it), f (f_) {} + + typedef decltype (hb_get (hb_declval (Proj), *hb_declval (Iter))) __item_t__; + static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; + static constexpr bool is_sorted_iterator = + Sorted == hb_function_sortedness_t::SORTED ? true : + Sorted == hb_function_sortedness_t::RETAINS_SORTING ? Iter::is_sorted_iterator : + false; + __item_t__ __item__ () const { return hb_get (f.get (), *it); } + __item_t__ __item_at__ (unsigned i) const { return hb_get (f.get (), it[i]); } + bool __more__ () const { return bool (it); } + unsigned __len__ () const { return it.len (); } + void __next__ () { ++it; } + void __forward__ (unsigned n) { it += n; } + void __prev__ () { --it; } + void __rewind__ (unsigned n) { it -= n; } + hb_map_iter_t __end__ () const { return hb_map_iter_t (it.end (), f); } + bool operator != (const hb_map_iter_t& o) const + { return it != o.it; } + + private: + Iter it; + hb_reference_wrapper<Proj> f; +}; + +template <typename Proj, hb_function_sortedness_t Sorted> +struct hb_map_iter_factory_t +{ + hb_map_iter_factory_t (Proj f) : f (f) {} + + template <typename Iter, + hb_requires (hb_is_iterator (Iter))> + hb_map_iter_t<Iter, Proj, Sorted> + operator () (Iter it) + { return hb_map_iter_t<Iter, Proj, Sorted> (it, f); } + + private: + Proj f; +}; +struct +{ + template <typename Proj> + hb_map_iter_factory_t<Proj, hb_function_sortedness_t::NOT_SORTED> + operator () (Proj&& f) const + { return hb_map_iter_factory_t<Proj, hb_function_sortedness_t::NOT_SORTED> (f); } +} +HB_FUNCOBJ (hb_map); +struct +{ + template <typename Proj> + hb_map_iter_factory_t<Proj, hb_function_sortedness_t::RETAINS_SORTING> + operator () (Proj&& f) const + { return hb_map_iter_factory_t<Proj, hb_function_sortedness_t::RETAINS_SORTING> (f); } +} +HB_FUNCOBJ (hb_map_retains_sorting); +struct +{ + template <typename Proj> + hb_map_iter_factory_t<Proj, hb_function_sortedness_t::SORTED> + operator () (Proj&& f) const + { return hb_map_iter_factory_t<Proj, hb_function_sortedness_t::SORTED> (f); } +} +HB_FUNCOBJ (hb_map_sorted); + +template <typename Iter, typename Pred, typename Proj, + hb_requires (hb_is_iterator (Iter))> +struct hb_filter_iter_t : + hb_iter_with_fallback_t<hb_filter_iter_t<Iter, Pred, Proj>, + typename Iter::item_t> +{ + hb_filter_iter_t (const Iter& it_, Pred p_, Proj f_) : it (it_), p (p_), f (f_) + { while (it && !hb_has (p.get (), hb_get (f.get (), *it))) ++it; } + + typedef typename Iter::item_t __item_t__; + static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; + __item_t__ __item__ () const { return *it; } + bool __more__ () const { return bool (it); } + void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } + void __prev__ () { do --it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } + hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it.end (), p, f); } + bool operator != (const hb_filter_iter_t& o) const + { return it != o.it; } + + private: + Iter it; + hb_reference_wrapper<Pred> p; + hb_reference_wrapper<Proj> f; +}; +template <typename Pred, typename Proj> +struct hb_filter_iter_factory_t +{ + hb_filter_iter_factory_t (Pred p, Proj f) : p (p), f (f) {} + + template <typename Iter, + hb_requires (hb_is_iterator (Iter))> + hb_filter_iter_t<Iter, Pred, Proj> + operator () (Iter it) + { return hb_filter_iter_t<Iter, Pred, Proj> (it, p, f); } + + private: + Pred p; + Proj f; +}; +struct +{ + template <typename Pred = decltype ((hb_identity)), + typename Proj = decltype ((hb_identity))> + hb_filter_iter_factory_t<Pred, Proj> + operator () (Pred&& p = hb_identity, Proj&& f = hb_identity) const + { return hb_filter_iter_factory_t<Pred, Proj> (p, f); } +} +HB_FUNCOBJ (hb_filter); + +template <typename Redu, typename InitT> +struct hb_reduce_t +{ + hb_reduce_t (Redu r, InitT init_value) : r (r), init_value (init_value) {} + + template <typename Iter, + hb_requires (hb_is_iterator (Iter)), + typename AccuT = decltype (hb_declval (Redu) (hb_declval (InitT), hb_declval (typename Iter::item_t)))> + AccuT + operator () (Iter it) + { + AccuT value = init_value; + for (; it; ++it) + value = r (value, *it); + return value; + } + + private: + Redu r; + InitT init_value; +}; +struct +{ + template <typename Redu, typename InitT> + hb_reduce_t<Redu, InitT> + operator () (Redu&& r, InitT init_value) const + { return hb_reduce_t<Redu, InitT> (r, init_value); } +} +HB_FUNCOBJ (hb_reduce); + - /* Random access: Return true if item_at(), len(), forward() are fast. */ - bool __random_access__ () const { return false; } +/* hb_zip() */ + +template <typename A, typename B> +struct hb_zip_iter_t : + hb_iter_t<hb_zip_iter_t<A, B>, + hb_pair_t<typename A::item_t, typename B::item_t>> +{ + hb_zip_iter_t () {} + hb_zip_iter_t (const A& a, const B& b) : a (a), b (b) {} + + typedef hb_pair_t<typename A::item_t, typename B::item_t> __item_t__; + static constexpr bool is_random_access_iterator = + A::is_random_access_iterator && + B::is_random_access_iterator; + /* Note. The following categorization is only valid if A is strictly sorted, + * ie. does NOT have duplicates. Previously I tried to categorize sortedness + * more granularly, see commits: + * + * 513762849a683914fc266a17ddf38f133cccf072 + * 4d3cf2adb669c345cc43832d11689271995e160a + * + * However, that was not enough, since hb_sorted_array_t, hb_sorted_vector_t, + * SortedArrayOf, etc all needed to be updated to add more variants. At that + * point I saw it not worth the effort, and instead we now deem all sorted + * collections as essentially strictly-sorted for the purposes of zip. + * + * The above assumption is not as bad as it sounds. Our "sorted" comes with + * no guarantees. It's just a contract, put in place to help you remember, + * and think about, whether an iterator you receive is expected to be + * sorted or not. As such, it's not perfect by definition, and should not + * be treated so. The inaccuracy here just errs in the direction of being + * more permissive, so your code compiles instead of erring on the side of + * marking your zipped iterator unsorted in which case your code won't + * compile. + * + * This semantical limitation does NOT affect logic in any other place I + * know of as of this writing. + */ + static constexpr bool is_sorted_iterator = A::is_sorted_iterator; + + __item_t__ __item__ () const { return __item_t__ (*a, *b); } + __item_t__ __item_at__ (unsigned i) const { return __item_t__ (a[i], b[i]); } + bool __more__ () const { return bool (a) && bool (b); } + unsigned __len__ () const { return hb_min (a.len (), b.len ()); } + void __next__ () { ++a; ++b; } + void __forward__ (unsigned n) { a += n; b += n; } + void __prev__ () { --a; --b; } + void __rewind__ (unsigned n) { a -= n; b -= n; } + hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a.end (), b.end ()); } + /* Note, we should stop if ANY of the iters reaches end. As such two compare + * unequal if both items are unequal, NOT if either is unequal. */ + bool operator != (const hb_zip_iter_t& o) const + { return a != o.a && b != o.b; } + + private: + A a; + B b; +}; +struct +{ + template <typename A, typename B, + hb_requires (hb_is_iterable (A) && hb_is_iterable (B))> + hb_zip_iter_t<hb_iter_type<A>, hb_iter_type<B>> + operator () (A&& a, B&& b) const + { return hb_zip_iter_t<hb_iter_type<A>, hb_iter_type<B>> (hb_iter (a), hb_iter (b)); } +} +HB_FUNCOBJ (hb_zip); + +/* hb_apply() */ + +template <typename Appl> +struct hb_apply_t +{ + hb_apply_t (Appl a) : a (a) {} + + template <typename Iter, + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) + { + for (; it; ++it) + (void) hb_invoke (a, *it); + } + + private: + Appl a; }; +struct +{ + template <typename Appl> hb_apply_t<Appl> + operator () (Appl&& a) const + { return hb_apply_t<Appl> (a); } + + template <typename Appl> hb_apply_t<Appl&> + operator () (Appl *a) const + { return hb_apply_t<Appl&> (*a); } +} +HB_FUNCOBJ (hb_apply); +/* hb_iota()/hb_range() */ -/* Functions operating on iterators or iteratables. */ +template <typename T, typename S> +struct hb_counter_iter_t : + hb_iter_t<hb_counter_iter_t<T, S>, T> +{ + hb_counter_iter_t (T start, T end_, S step) : v (start), end_ (end_for (start, end_, step)), step (step) {} + + typedef T __item_t__; + static constexpr bool is_random_access_iterator = true; + static constexpr bool is_sorted_iterator = true; + __item_t__ __item__ () const { return +v; } + __item_t__ __item_at__ (unsigned j) const { return v + j * step; } + bool __more__ () const { return v != end_; } + unsigned __len__ () const { return !step ? UINT_MAX : (end_ - v) / step; } + void __next__ () { v += step; } + void __forward__ (unsigned n) { v += n * step; } + void __prev__ () { v -= step; } + void __rewind__ (unsigned n) { v -= n * step; } + hb_counter_iter_t __end__ () const { return hb_counter_iter_t (end_, end_, step); } + bool operator != (const hb_counter_iter_t& o) const + { return v != o.v; } + + private: + static inline T end_for (T start, T end_, S step) + { + if (!step) + return end_; + auto res = (end_ - start) % step; + if (!res) + return end_; + end_ += step - res; + return end_; + } + + private: + T v; + T end_; + S step; +}; +struct +{ + template <typename T = unsigned, typename S = unsigned> hb_counter_iter_t<T, S> + operator () (T start = 0u, S&& step = 1u) const + { return hb_counter_iter_t<T, S> (start, step >= 0 ? hb_int_max (T) : hb_int_min (T), step); } +} +HB_FUNCOBJ (hb_iota); +struct +{ + template <typename T = unsigned> hb_counter_iter_t<T, unsigned> + operator () (T end = (unsigned) -1) const + { return hb_counter_iter_t<T, unsigned> (0, end, 1u); } + + template <typename T, typename S = unsigned> hb_counter_iter_t<T, S> + operator () (T start, T end, S&& step = 1u) const + { return hb_counter_iter_t<T, S> (start, end, step); } +} +HB_FUNCOBJ (hb_range); + +/* hb_enumerate */ + +struct +{ + template <typename Iterable, + typename Index = unsigned, + hb_requires (hb_is_iterable (Iterable))> + auto operator () (Iterable&& it, Index start = 0u) const HB_AUTO_RETURN + ( hb_zip (hb_iota (start), it) ) +} +HB_FUNCOBJ (hb_enumerate); + + +/* hb_sink() */ + +template <typename Sink> +struct hb_sink_t +{ + hb_sink_t (Sink s) : s (s) {} + + template <typename Iter, + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) + { + for (; it; ++it) + s << *it; + } + + private: + Sink s; +}; +struct +{ + template <typename Sink> hb_sink_t<Sink> + operator () (Sink&& s) const + { return hb_sink_t<Sink> (s); } + + template <typename Sink> hb_sink_t<Sink&> + operator () (Sink *s) const + { return hb_sink_t<Sink&> (*s); } +} +HB_FUNCOBJ (hb_sink); + +/* hb-drain: hb_sink to void / blackhole / /dev/null. */ + +struct +{ + template <typename Iter, + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) const + { + for (; it; ++it) + (void) *it; + } +} +HB_FUNCOBJ (hb_drain); + +/* hb_unzip(): unzip and sink to two sinks. */ + +template <typename Sink1, typename Sink2> +struct hb_unzip_t +{ + hb_unzip_t (Sink1 s1, Sink2 s2) : s1 (s1), s2 (s2) {} + + template <typename Iter, + hb_requires (hb_is_iterator (Iter))> + void operator () (Iter it) + { + for (; it; ++it) + { + const auto &v = *it; + s1 << v.first; + s2 << v.second; + } + } + + private: + Sink1 s1; + Sink2 s2; +}; +struct +{ + template <typename Sink1, typename Sink2> hb_unzip_t<Sink1, Sink2> + operator () (Sink1&& s1, Sink2&& s2) const + { return hb_unzip_t<Sink1, Sink2> (s1, s2); } + + template <typename Sink1, typename Sink2> hb_unzip_t<Sink1&, Sink2&> + operator () (Sink1 *s1, Sink2 *s2) const + { return hb_unzip_t<Sink1&, Sink2&> (*s1, *s2); } +} +HB_FUNCOBJ (hb_unzip); + + +/* hb-all, hb-any, hb-none. */ + +struct +{ + template <typename Iterable, + typename Pred = decltype ((hb_identity)), + typename Proj = decltype ((hb_identity)), + hb_requires (hb_is_iterable (Iterable))> + bool operator () (Iterable&& c, + Pred&& p = hb_identity, + Proj&& f = hb_identity) const + { + for (auto it = hb_iter (c); it; ++it) + if (!hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it))) + return false; + return true; + } +} +HB_FUNCOBJ (hb_all); +struct +{ + template <typename Iterable, + typename Pred = decltype ((hb_identity)), + typename Proj = decltype ((hb_identity)), + hb_requires (hb_is_iterable (Iterable))> + bool operator () (Iterable&& c, + Pred&& p = hb_identity, + Proj&& f = hb_identity) const + { + for (auto it = hb_iter (c); it; ++it) + if (hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it))) + return true; + return false; + } +} +HB_FUNCOBJ (hb_any); +struct +{ + template <typename Iterable, + typename Pred = decltype ((hb_identity)), + typename Proj = decltype ((hb_identity)), + hb_requires (hb_is_iterable (Iterable))> + bool operator () (Iterable&& c, + Pred&& p = hb_identity, + Proj&& f = hb_identity) const + { + for (auto it = hb_iter (c); it; ++it) + if (hb_match (hb_forward<Pred> (p), hb_get (hb_forward<Proj> (f), *it))) + return false; + return true; + } +} +HB_FUNCOBJ (hb_none); + +/* + * Algorithms operating on iterators. + */ -template <typename C, typename V> inline void -hb_fill (const C& c, const V &v) +template <typename C, typename V, + hb_requires (hb_is_iterable (C))> +inline void +hb_fill (C& c, const V &v) { - for (typename C::iter_t i (c); i; i++) - hb_assign (*i, v); + for (auto i = hb_iter (c); i; i++) + *i = v; } -template <typename S, typename D> inline bool -hb_copy (hb_iter_t<D> &id, hb_iter_t<S> &is) +template <typename S, typename D> +inline void +hb_copy (S&& is, D&& id) { - for (; id && is; ++id, ++is) - *id = *is; - return !is; + hb_iter (is) | hb_sink (id); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh index ffa423d2fe4..5a2087e4aa9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh @@ -32,8 +32,9 @@ #include "hb.hh" #include "hb-blob.hh" -#include "hb-array.hh" -#include "hb-vector.hh" +#include "hb-dispatch.hh" +#include "hb-sanitize.hh" +#include "hb-serialize.hh" /* @@ -143,617 +144,6 @@ static inline Type& StructAfter(TObject &X) DEFINE_SIZE_ARRAY(size, array) -/* - * Dispatch - */ - -template <typename Context, typename Return, unsigned int MaxDebugDepth> -struct hb_dispatch_context_t -{ - static constexpr unsigned max_debug_depth = MaxDebugDepth; - typedef Return return_t; - template <typename T, typename F> - bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } - static return_t no_dispatch_return_value () { return Context::default_return_value (); } - static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } -}; - - -/* - * Sanitize - * - * - * === Introduction === - * - * The sanitize machinery is at the core of our zero-cost font loading. We - * mmap() font file into memory and create a blob out of it. Font subtables - * are returned as a readonly sub-blob of the main font blob. These table - * blobs are then sanitized before use, to ensure invalid memory access does - * not happen. The toplevel sanitize API use is like, eg. to load the 'head' - * table: - * - * hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<OT::head> (face); - * - * The blob then can be converted to a head table struct with: - * - * const head *head_table = head_blob->as<head> (); - * - * What the reference_table does is, to call hb_face_reference_table() to load - * the table blob, sanitize it and return either the sanitized blob, or empty - * blob if sanitization failed. The blob->as() function returns the null - * object of its template type argument if the blob is empty. Otherwise, it - * just casts the blob contents to the desired type. - * - * Sanitizing a blob of data with a type T works as follows (with minor - * simplification): - * - * - Cast blob content to T*, call sanitize() method of it, - * - If sanitize succeeded, return blob. - * - Otherwise, if blob is not writable, try making it writable, - * or copy if cannot be made writable in-place, - * - Call sanitize() again. Return blob if sanitize succeeded. - * - Return empty blob otherwise. - * - * - * === The sanitize() contract === - * - * The sanitize() method of each object type shall return true if it's safe to - * call other methods of the object, and false otherwise. - * - * Note that what sanitize() checks for might align with what the specification - * describes as valid table data, but does not have to be. In particular, we - * do NOT want to be pedantic and concern ourselves with validity checks that - * are irrelevant to our use of the table. On the contrary, we want to be - * lenient with error handling and accept invalid data to the extent that it - * does not impose extra burden on us. - * - * Based on the sanitize contract, one can see that what we check for depends - * on how we use the data in other table methods. Ie. if other table methods - * assume that offsets do NOT point out of the table data block, then that's - * something sanitize() must check for (GSUB/GPOS/GDEF/etc work this way). On - * the other hand, if other methods do such checks themselves, then sanitize() - * does not have to bother with them (glyf/local work this way). The choice - * depends on the table structure and sanitize() performance. For example, to - * check glyf/loca offsets in sanitize() would cost O(num-glyphs). We try hard - * to avoid such costs during font loading. By postponing such checks to the - * actual glyph loading, we reduce the sanitize cost to O(1) and total runtime - * cost to O(used-glyphs). As such, this is preferred. - * - * The same argument can be made re GSUB/GPOS/GDEF, but there, the table - * structure is so complicated that by checking all offsets at sanitize() time, - * we make the code much simpler in other methods, as offsets and referenced - * objects do not need to be validated at each use site. - */ - -/* This limits sanitizing time on really broken fonts. */ -#ifndef HB_SANITIZE_MAX_EDITS -#define HB_SANITIZE_MAX_EDITS 32 -#endif -#ifndef HB_SANITIZE_MAX_OPS_FACTOR -#define HB_SANITIZE_MAX_OPS_FACTOR 8 -#endif -#ifndef HB_SANITIZE_MAX_OPS_MIN -#define HB_SANITIZE_MAX_OPS_MIN 16384 -#endif -#ifndef HB_SANITIZE_MAX_OPS_MAX -#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF -#endif - -struct hb_sanitize_context_t : - hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE> -{ - hb_sanitize_context_t () : - debug_depth (0), - start (nullptr), end (nullptr), - max_ops (0), - writable (false), edit_count (0), - blob (nullptr), - num_glyphs (65536), - num_glyphs_set (false) {} - - const char *get_name () { return "SANITIZE"; } - template <typename T, typename F> - bool may_dispatch (const T *obj HB_UNUSED, const F *format) - { return format->sanitize (this); } - template <typename T> - return_t dispatch (const T &obj) { return obj.sanitize (this); } - static return_t default_return_value () { return true; } - static return_t no_dispatch_return_value () { return false; } - bool stop_sublookup_iteration (const return_t r) const { return !r; } - - void init (hb_blob_t *b) - { - this->blob = hb_blob_reference (b); - this->writable = false; - } - - void set_num_glyphs (unsigned int num_glyphs_) - { - num_glyphs = num_glyphs_; - num_glyphs_set = true; - } - unsigned int get_num_glyphs () { return num_glyphs; } - - void set_max_ops (int max_ops_) { max_ops = max_ops_; } - - template <typename T> - void set_object (const T *obj) - { - reset_object (); - - if (!obj) return; - - const char *obj_start = (const char *) obj; - if (unlikely (obj_start < this->start || this->end <= obj_start)) - this->start = this->end = nullptr; - else - { - this->start = obj_start; - this->end = obj_start + MIN<uintptr_t> (this->end - obj_start, obj->get_size ()); - } - } - - void reset_object () - { - this->start = this->blob->data; - this->end = this->start + this->blob->length; - assert (this->start <= this->end); /* Must not overflow. */ - } - - void start_processing () - { - reset_object (); - this->max_ops = MAX ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR, - (unsigned) HB_SANITIZE_MAX_OPS_MIN); - this->edit_count = 0; - this->debug_depth = 0; - - DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1, - "start [%p..%p] (%lu bytes)", - this->start, this->end, - (unsigned long) (this->end - this->start)); - } - - void end_processing () - { - DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1, - "end [%p..%p] %u edit requests", - this->start, this->end, this->edit_count); - - hb_blob_destroy (this->blob); - this->blob = nullptr; - this->start = this->end = nullptr; - } - - bool check_range (const void *base, - unsigned int len) const - { - const char *p = (const char *) base; - bool ok = !len || - (this->start <= p && - p <= this->end && - (unsigned int) (this->end - p) >= len && - this->max_ops-- > 0); - - 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, - ok ? "OK" : "OUT-OF-RANGE"); - - return likely (ok); - } - - template <typename T> - bool check_range (const T *base, - unsigned int a, - unsigned int b) const - { - return !hb_unsigned_mul_overflows (a, b) && - this->check_range (base, a * b); - } - - template <typename T> - bool check_range (const T *base, - unsigned int a, - unsigned int b, - unsigned int c) const - { - return !hb_unsigned_mul_overflows (a, b) && - this->check_range (base, a * b, c); - } - - template <typename T> - bool check_array (const T *base, unsigned int len) const - { - return this->check_range (base, len, hb_static_size (T)); - } - - template <typename T> - bool check_array (const T *base, - unsigned int a, - unsigned int b) const - { - return this->check_range (base, a, b, hb_static_size (T)); - } - - template <typename Type> - bool check_struct (const Type *obj) const - { return likely (this->check_range (obj, obj->min_size)); } - - bool may_edit (const void *base, unsigned int len) - { - if (this->edit_count >= HB_SANITIZE_MAX_EDITS) - return false; - - const char *p = (const char *) base; - this->edit_count++; - - 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 this->writable; - } - - template <typename Type, typename ValueType> - bool try_set (const Type *obj, const ValueType &v) - { - if (this->may_edit (obj, hb_static_size (Type))) - { - hb_assign (* const_cast<Type *> (obj), v); - return true; - } - return false; - } - - template <typename Type> - hb_blob_t *sanitize_blob (hb_blob_t *blob) - { - bool sane; - - init (blob); - - retry: - DEBUG_MSG_FUNC (SANITIZE, start, "start"); - - start_processing (); - - if (unlikely (!start)) - { - end_processing (); - return blob; - } - - Type *t = CastP<Type> (const_cast<char *> (start)); - - sane = t->sanitize (this); - if (sane) - { - if (edit_count) - { - DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %d edits; going for second round", edit_count); - - /* sanitize again to ensure no toe-stepping */ - edit_count = 0; - sane = t->sanitize (this); - if (edit_count) { - DEBUG_MSG_FUNC (SANITIZE, start, "requested %d edits in second round; FAILLING", edit_count); - sane = false; - } - } - } - else - { - if (edit_count && !writable) { - start = hb_blob_get_data_writable (blob, nullptr); - end = start + blob->length; - - if (start) - { - writable = true; - /* ok, we made it writable by relocating. try again */ - DEBUG_MSG_FUNC (SANITIZE, start, "retry"); - goto retry; - } - } - } - - end_processing (); - - DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED"); - if (sane) - { - hb_blob_make_immutable (blob); - return blob; - } - else - { - hb_blob_destroy (blob); - return hb_blob_get_empty (); - } - } - - template <typename Type> - hb_blob_t *reference_table (const hb_face_t *face, hb_tag_t tableTag = Type::tableTag) - { - if (!num_glyphs_set) - set_num_glyphs (hb_face_get_glyph_count (face)); - return sanitize_blob<Type> (hb_face_reference_table (face, tableTag)); - } - - mutable unsigned int debug_depth; - const char *start, *end; - mutable int max_ops; - private: - bool writable; - unsigned int edit_count; - hb_blob_t *blob; - unsigned int num_glyphs; - bool num_glyphs_set; -}; - -struct hb_sanitize_with_object_t -{ - template <typename T> - hb_sanitize_with_object_t (hb_sanitize_context_t *c, - const T& obj) : c (c) - { c->set_object (obj); } - ~hb_sanitize_with_object_t () - { c->reset_object (); } - - private: - hb_sanitize_context_t *c; -}; - - -/* - * Serialize - */ - -struct hb_serialize_context_t -{ - hb_serialize_context_t (void *start_, unsigned int size) - { - this->start = (char *) start_; - this->end = this->start + size; - reset (); - } - - bool in_error () const { return !this->successful; } - - void reset () - { - this->successful = true; - this->head = this->start; - this->debug_depth = 0; - } - - bool propagate_error (bool e) - { return this->successful = this->successful && e; } - template <typename T> bool propagate_error (const T &obj) - { return this->successful = this->successful && !obj.in_error (); } - template <typename T> bool propagate_error (const T *obj) - { return this->successful = this->successful && !obj->in_error (); } - template <typename T1, typename T2> bool propagate_error (T1 &o1, T2 &o2) - { return propagate_error (o1) && propagate_error (o2); } - template <typename T1, typename T2> bool propagate_error (T1 *o1, T2 *o2) - { return propagate_error (o1) && propagate_error (o2); } - template <typename T1, typename T2, typename T3> - bool propagate_error (T1 &o1, T2 &o2, T3 &o3) - { return propagate_error (o1) && propagate_error (o2, o3); } - template <typename T1, typename T2, typename T3> - bool propagate_error (T1 *o1, T2 *o2, T3 *o3) - { return propagate_error (o1) && propagate_error (o2, o3); } - - /* To be called around main operation. */ - template <typename Type> - Type *start_serialize () - { - DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1, - "start [%p..%p] (%lu bytes)", - this->start, this->end, - (unsigned long) (this->end - this->start)); - - return start_embed<Type> (); - } - void end_serialize () - { - DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, -1, - "end [%p..%p] serialized %d bytes; %s", - this->start, this->end, - (int) (this->head - this->start), - this->successful ? "successful" : "UNSUCCESSFUL"); - } - - unsigned int length () const { return this->head - this->start; } - - void align (unsigned int alignment) - { - unsigned int l = length () % alignment; - if (l) - allocate_size<void> (alignment - l); - } - - template <typename Type> - Type *start_embed (const Type *_ HB_UNUSED = nullptr) const - { - Type *ret = reinterpret_cast<Type *> (this->head); - return ret; - } - - template <typename Type> - Type *allocate_size (unsigned int size) - { - if (unlikely (!this->successful || this->end - this->head < ptrdiff_t (size))) { - this->successful = false; - return nullptr; - } - memset (this->head, 0, size); - char *ret = this->head; - this->head += size; - return reinterpret_cast<Type *> (ret); - } - - template <typename Type> - Type *allocate_min () - { - return this->allocate_size<Type> (Type::min_size); - } - - template <typename Type> - Type *embed (const Type &obj) - { - unsigned int size = obj.get_size (); - Type *ret = this->allocate_size<Type> (size); - if (unlikely (!ret)) return nullptr; - memcpy (ret, &obj, size); - return ret; - } - template <typename Type> - hb_serialize_context_t &operator << (const Type &obj) { embed (obj); return *this; } - - template <typename Type> - Type *extend_size (Type &obj, unsigned int size) - { - assert (this->start <= (char *) &obj); - assert ((char *) &obj <= this->head); - assert ((char *) &obj + size >= this->head); - if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return nullptr; - return reinterpret_cast<Type *> (&obj); - } - - template <typename Type> - Type *extend_min (Type &obj) { return extend_size (obj, obj.min_size); } - - template <typename Type> - Type *extend (Type &obj) { return extend_size (obj, obj.get_size ()); } - - /* Output routines. */ - template <typename Type> - Type *copy () const - { - assert (this->successful); - unsigned int len = this->head - this->start; - void *p = malloc (len); - if (p) - memcpy (p, this->start, len); - return reinterpret_cast<Type *> (p); - } - hb_bytes_t copy_bytes () const - { - assert (this->successful); - unsigned int len = this->head - this->start; - void *p = malloc (len); - if (p) - memcpy (p, this->start, len); - else - return hb_bytes_t (); - return hb_bytes_t ((char *) p, len); - } - hb_blob_t *copy_blob () const - { - assert (this->successful); - return hb_blob_create (this->start, - this->head - this->start, - HB_MEMORY_MODE_DUPLICATE, - nullptr, nullptr); - } - - public: - unsigned int debug_depth; - char *start, *end, *head; - bool successful; -}; - - - -/* - * Big-endian integers. - */ - -template <typename Type, int Bytes> struct BEInt; - -template <typename Type> -struct BEInt<Type, 1> -{ - public: - void set (Type V) { v = V; } - operator Type () const { return v; } - private: uint8_t v; -}; -template <typename Type> -struct BEInt<Type, 2> -{ - public: - void set (Type V) - { - v[0] = (V >> 8) & 0xFF; - v[1] = (V ) & 0xFF; - } - operator Type () const - { -#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \ - defined(__BYTE_ORDER) && \ - (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN) - /* Spoon-feed the compiler a big-endian integer with alignment 1. - * https://github.com/harfbuzz/harfbuzz/pull/1398 */ - struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; -#if __BYTE_ORDER == __LITTLE_ENDIAN - return __builtin_bswap16 (((packed_uint16_t *) this)->v); -#else /* __BYTE_ORDER == __BIG_ENDIAN */ - return ((packed_uint16_t *) this)->v; -#endif -#endif - return (v[0] << 8) - + (v[1] ); - } - private: uint8_t v[2]; -}; -template <typename Type> -struct BEInt<Type, 3> -{ - public: - void set (Type V) - { - v[0] = (V >> 16) & 0xFF; - v[1] = (V >> 8) & 0xFF; - v[2] = (V ) & 0xFF; - } - operator Type () const - { - return (v[0] << 16) - + (v[1] << 8) - + (v[2] ); - } - private: uint8_t v[3]; -}; -template <typename Type> -struct BEInt<Type, 4> -{ - public: - typedef Type type; - void set (Type V) - { - v[0] = (V >> 24) & 0xFF; - v[1] = (V >> 16) & 0xFF; - v[2] = (V >> 8) & 0xFF; - v[3] = (V ) & 0xFF; - } - operator Type () const - { - return (v[0] << 24) - + (v[1] << 16) - + (v[2] << 8) - + (v[3] ); - } - private: uint8_t v[4]; -}; - /* * Lazy loaders. @@ -816,7 +206,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData> const Returned * operator -> () const { return get (); } const Returned & operator * () const { return *get (); } - explicit_operator bool () const + explicit operator bool () const { return get_stored () != Funcs::get_null (); } template <typename C> operator const C * () const { return get (); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh index f7156e51a04..26e4930a5f7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh @@ -30,31 +30,39 @@ #include "hb.hh" -template <typename T> -inline uint32_t Hash (const T &v) -{ - /* Knuth's multiplicative method: */ - return (uint32_t) v * 2654435761u; -} - - /* - * hb_map_t + * hb_hashmap_t */ -struct hb_map_t +template <typename K, typename V, + K kINVALID = hb_is_pointer (K) ? 0 : hb_is_signed (K) ? hb_int_min (K) : (K) -1, + V vINVALID = hb_is_pointer (V) ? 0 : hb_is_signed (V) ? hb_int_min (V) : (V) -1> +struct hb_hashmap_t { - HB_NO_COPY_ASSIGN (hb_map_t); - hb_map_t () { init (); } - ~hb_map_t () { fini (); } + HB_DELETE_COPY_ASSIGN (hb_hashmap_t); + hb_hashmap_t () { init (); } + ~hb_hashmap_t () { fini (); } + + static_assert (hb_is_integral (K) || hb_is_pointer (K), ""); + static_assert (hb_is_integral (V) || hb_is_pointer (V), ""); + /* TODO If key type is a pointer, keep hash in item_t and use to: + * 1. avoid rehashing when resizing table, and + * 2. compare hash before comparing keys, for speed. + */ struct item_t { - hb_codepoint_t key; - hb_codepoint_t value; + K key; + V value; + + void clear () { key = kINVALID; value = vINVALID; } - bool is_unused () const { return key == INVALID; } - bool is_tombstone () const { return key != INVALID && value == INVALID; } + bool operator == (K o) { return hb_deref (key) == hb_deref (o); } + bool operator == (const item_t &o) { return *this == o.key; } + bool is_unused () const { return key == kINVALID; } + bool is_tombstone () const { return key != kINVALID && value == vINVALID; } + bool is_real () const { return key != kINVALID && value != vINVALID; } + hb_pair_t<K, V> get_pair() const { return hb_pair_t<K, V> (key, value); } }; hb_object_header_t header; @@ -82,14 +90,22 @@ struct hb_map_t { free (items); items = nullptr; + population = occupancy = 0; } void fini () { - population = occupancy = 0; hb_object_fini (this); fini_shallow (); } + void reset () + { + if (unlikely (hb_object_is_immutable (this))) + return; + successful = true; + clear (); + } + bool in_error () const { return !successful; } bool resize () @@ -104,7 +120,9 @@ struct hb_map_t successful = false; return false; } - memset (new_items, 0xFF, (size_t) new_size * sizeof (item_t)); + + hb_iter (new_items, new_size) + | hb_apply (&item_t::clear) + ; unsigned int old_size = mask + 1; item_t *old_items = items; @@ -118,7 +136,7 @@ struct hb_map_t /* Insert back old items. */ if (old_items) for (unsigned int i = 0; i < old_size; i++) - if (old_items[i].key != INVALID && old_items[i].value != INVALID) + if (old_items[i].is_real ()) set (old_items[i].key, old_items[i].value); free (old_items); @@ -126,14 +144,14 @@ struct hb_map_t return true; } - void set (hb_codepoint_t key, hb_codepoint_t value) + void set (K key, V value) { if (unlikely (!successful)) return; - if (unlikely (key == INVALID)) return; + if (unlikely (key == kINVALID)) return; if ((occupancy + occupancy / 2) >= mask && !resize ()) return; unsigned int i = bucket_for (key); - if (value == INVALID && items[i].key != key) + if (value == vINVALID && items[i].key != key) return; /* Trying to delete non-existent key. */ if (!items[i].is_unused ()) @@ -151,26 +169,37 @@ struct hb_map_t population++; } - hb_codepoint_t get (hb_codepoint_t key) const + V get (K key) const { - if (unlikely (!items)) return INVALID; + if (unlikely (!items)) return vINVALID; unsigned int i = bucket_for (key); - return items[i].key == key ? items[i].value : INVALID; + return items[i].is_real () && items[i] == key ? items[i].value : vINVALID; } - void del (hb_codepoint_t key) { set (key, INVALID); } + void del (K key) { set (key, vINVALID); } - bool has (hb_codepoint_t key) const - { return get (key) != INVALID; } - - hb_codepoint_t operator [] (unsigned int key) const - { return get (key); } - - static constexpr hb_codepoint_t INVALID = HB_MAP_VALUE_INVALID; + /* Has interface. */ + static constexpr V SENTINEL = vINVALID; + typedef V value_t; + value_t operator [] (K k) const { return get (k); } + bool has (K k, V *vp = nullptr) const + { + V v = (*this)[k]; + if (vp) *vp = v; + return v != SENTINEL; + } + /* Projection. */ + V operator () (K k) const { return get (k); } void clear () { - if (items) memset (items, 0xFF, ((size_t) mask + 1) * sizeof (item_t)); + if (unlikely (hb_object_is_immutable (this))) + return; + if (items) + + hb_iter (items, mask + 1) + | hb_apply (&item_t::clear) + ; + population = occupancy = 0; } @@ -178,22 +207,50 @@ struct hb_map_t unsigned int get_population () const { return population; } + /* + * Iterator + */ + auto iter () const HB_AUTO_RETURN + ( + + hb_array (items, mask ? mask + 1 : 0) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::get_pair) + ) + auto keys () const HB_AUTO_RETURN + ( + + hb_array (items, mask ? mask + 1 : 0) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::key) + | hb_map (hb_ridentity) + ) + auto values () const HB_AUTO_RETURN + ( + + hb_array (items, mask ? mask + 1 : 0) + | hb_filter (&item_t::is_real) + | hb_map (&item_t::value) + | hb_map (hb_ridentity) + ) + + /* Sink interface. */ + hb_hashmap_t<K, V, kINVALID, vINVALID>& operator << (const hb_pair_t<K, V>& v) + { set (v.first, v.second); return *this; } + protected: - unsigned int bucket_for (hb_codepoint_t key) const + unsigned int bucket_for (K key) const { - unsigned int i = Hash (key) % prime; + unsigned int i = hb_hash (key) % prime; unsigned int step = 0; - unsigned int tombstone = INVALID; + unsigned int tombstone = (unsigned) -1; while (!items[i].is_unused ()) { - if (items[i].key == key) - return i; - if (tombstone == INVALID && items[i].is_tombstone ()) - tombstone = i; + if (items[i] == key) + return i; + if (tombstone == (unsigned) -1 && items[i].is_tombstone ()) + tombstone = i; i = (i + ++step) & mask; } - return tombstone == INVALID ? i : tombstone; + return tombstone == (unsigned) -1 ? i : tombstone; } static unsigned int prime_for (unsigned int shift) @@ -248,5 +305,14 @@ struct hb_map_t } }; +/* + * hb_map_t + */ + +struct hb_map_t : hb_hashmap_t<hb_codepoint_t, + hb_codepoint_t, + HB_MAP_VALUE_INVALID, + HB_MAP_VALUE_INVALID> {}; + #endif /* HB_MAP_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh new file mode 100644 index 00000000000..df8ebd17503 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh @@ -0,0 +1,400 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_META_HH +#define HB_META_HH + +#include "hb.hh" + + +/* + * C++ template meta-programming & fundamentals used with them. + */ + +/* Void! For when we need a expression-type of void. */ +struct hb_empty_t {}; + +/* https://en.cppreference.com/w/cpp/types/void_t */ +template<typename... Ts> struct _hb_void_t { typedef void type; }; +template<typename... Ts> using hb_void_t = typename _hb_void_t<Ts...>::type; + +template<typename Head, typename... Ts> struct _hb_head_t { typedef Head type; }; +template<typename... Ts> using hb_head_t = typename _hb_head_t<Ts...>::type; + +template <typename T, T v> struct hb_integral_constant { static constexpr T value = v; }; +template <bool b> using hb_bool_constant = hb_integral_constant<bool, b>; +using hb_true_type = hb_bool_constant<true>; +using hb_false_type = hb_bool_constant<false>; + + +/* Basic type SFINAE. */ + +template <bool B, typename T = void> struct hb_enable_if {}; +template <typename T> struct hb_enable_if<true, T> { typedef T type; }; +#define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr +/* Concepts/Requires alias: */ +#define hb_requires(Cond) hb_enable_if((Cond)) + +template <typename T, typename T2> struct hb_is_same : hb_false_type {}; +template <typename T> struct hb_is_same<T, T> : hb_true_type {}; +#define hb_is_same(T, T2) hb_is_same<T, T2>::value + +/* Function overloading SFINAE and priority. */ + +#define HB_RETURN(Ret, E) -> hb_head_t<Ret, decltype ((E))> { return (E); } +#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); } +#define HB_VOID_RETURN(E) -> hb_void_t<decltype ((E))> { (E); } + +template <unsigned Pri> struct hb_priority : hb_priority<Pri - 1> {}; +template <> struct hb_priority<0> {}; +#define hb_prioritize hb_priority<16> () + +#define HB_FUNCOBJ(x) static_const x HB_UNUSED + + +template <typename T> struct hb_type_identity_t { typedef T type; }; +template <typename T> using hb_type_identity = typename hb_type_identity_t<T>::type; + +struct +{ + template <typename T> + T* operator () (T& arg) const + { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" + /* https://en.cppreference.com/w/cpp/memory/addressof */ + return reinterpret_cast<T*> ( + &const_cast<char&> ( + reinterpret_cast<const volatile char&> (arg))); +#pragma GCC diagnostic pop + } +} +HB_FUNCOBJ (hb_addressof); + +template <typename T> static inline T hb_declval (); +#define hb_declval(T) (hb_declval<T> ()) + +template <typename T> struct hb_match_const : hb_type_identity_t<T>, hb_bool_constant<false>{}; +template <typename T> struct hb_match_const<const T> : hb_type_identity_t<T>, hb_bool_constant<true> {}; +template <typename T> using hb_remove_const = typename hb_match_const<T>::type; +template <typename T> using hb_add_const = const T; +#define hb_is_const(T) hb_match_const<T>::value +template <typename T> struct hb_match_reference : hb_type_identity_t<T>, hb_bool_constant<false>{}; +template <typename T> struct hb_match_reference<T &> : hb_type_identity_t<T>, hb_bool_constant<true> {}; +template <typename T> struct hb_match_reference<T &&> : hb_type_identity_t<T>, hb_bool_constant<true> {}; +template <typename T> using hb_remove_reference = typename hb_match_reference<T>::type; +template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<1>) -> hb_type_identity<T&>; +template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<0>) -> hb_type_identity<T>; +template <typename T> using hb_add_lvalue_reference = decltype (_hb_try_add_lvalue_reference<T> (hb_prioritize)); +template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<1>) -> hb_type_identity<T&&>; +template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<0>) -> hb_type_identity<T>; +template <typename T> using hb_add_rvalue_reference = decltype (_hb_try_add_rvalue_reference<T> (hb_prioritize)); +#define hb_is_reference(T) hb_match_reference<T>::value +template <typename T> struct hb_match_pointer : hb_type_identity_t<T>, hb_bool_constant<false>{}; +template <typename T> struct hb_match_pointer<T *> : hb_type_identity_t<T>, hb_bool_constant<true> {}; +template <typename T> using hb_remove_pointer = typename hb_match_pointer<T>::type; +template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<hb_remove_reference<T>*>; +template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<T>; +template <typename T> using hb_add_pointer = decltype (_hb_try_add_pointer<T> (hb_prioritize)); +#define hb_is_pointer(T) hb_match_pointer<T>::value + + +/* TODO Add feature-parity to std::decay. */ +template <typename T> using hb_decay = hb_remove_const<hb_remove_reference<T>>; + + +template<bool B, class T, class F> +struct _hb_conditional { typedef T type; }; +template<class T, class F> +struct _hb_conditional<false, T, F> { typedef F type; }; +template<bool B, class T, class F> +using hb_conditional = typename _hb_conditional<B, T, F>::type; + + +template <typename From, typename To> +struct hb_is_convertible +{ + private: + static constexpr bool from_void = hb_is_same (void, hb_decay<From>); + static constexpr bool to_void = hb_is_same (void, hb_decay<To> ); + static constexpr bool either_void = from_void || to_void; + static constexpr bool both_void = from_void && to_void; + + static hb_true_type impl2 (hb_conditional<to_void, int, To>); + + template <typename T> + static auto impl (hb_priority<1>) -> decltype (impl2 (hb_declval (T))); + template <typename T> + static hb_false_type impl (hb_priority<0>); + public: + static constexpr bool value = both_void || + (!either_void && + decltype (impl<hb_conditional<from_void, int, From>> (hb_prioritize))::value); +}; +#define hb_is_convertible(From,To) hb_is_convertible<From, To>::value + +template <typename Base, typename Derived> +using hb_is_base_of = hb_is_convertible<hb_decay<Derived> *, hb_decay<Base> *>; +#define hb_is_base_of(Base,Derived) hb_is_base_of<Base, Derived>::value + +template <typename From, typename To> +using hb_is_cr_convertible = hb_bool_constant< + hb_is_same (hb_decay<From>, hb_decay<To>) && + (!hb_is_const (From) || hb_is_const (To)) && + (!hb_is_reference (To) || hb_is_const (To) || hb_is_reference (To)) +>; +#define hb_is_cr_convertible(From,To) hb_is_cr_convertible<From, To>::value + +/* std::move and std::forward */ + +template <typename T> +static hb_remove_reference<T>&& hb_move (T&& t) { return (hb_remove_reference<T>&&) (t); } + +template <typename T> +static T&& hb_forward (hb_remove_reference<T>& t) { return (T&&) t; } +template <typename T> +static T&& hb_forward (hb_remove_reference<T>&& t) { return (T&&) t; } + +struct +{ + template <typename T> auto + operator () (T&& v) const HB_AUTO_RETURN (hb_forward<T> (v)) + + template <typename T> auto + operator () (T *v) const HB_AUTO_RETURN (*v) +} +HB_FUNCOBJ (hb_deref); + +struct +{ + template <typename T> auto + operator () (T&& v) const HB_AUTO_RETURN (hb_forward<T> (v)) + + template <typename T> auto + operator () (T& v) const HB_AUTO_RETURN (hb_addressof (v)) +} +HB_FUNCOBJ (hb_ref); + +template <typename T> +struct hb_reference_wrapper +{ + hb_reference_wrapper (T v) : v (v) {} + bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } + bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } + operator T () const { return v; } + T get () const { return v; } + T v; +}; +template <typename T> +struct hb_reference_wrapper<T&> +{ + hb_reference_wrapper (T& v) : v (hb_addressof (v)) {} + bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } + bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } + operator T& () const { return *v; } + T& get () const { return *v; } + T* v; +}; + + +template <typename T> +using hb_is_integral = hb_bool_constant< + hb_is_same (hb_decay<T>, char) || + hb_is_same (hb_decay<T>, signed char) || + hb_is_same (hb_decay<T>, unsigned char) || + hb_is_same (hb_decay<T>, signed int) || + hb_is_same (hb_decay<T>, unsigned int) || + hb_is_same (hb_decay<T>, signed short) || + hb_is_same (hb_decay<T>, unsigned short) || + hb_is_same (hb_decay<T>, signed long) || + hb_is_same (hb_decay<T>, unsigned long) || + hb_is_same (hb_decay<T>, signed long long) || + hb_is_same (hb_decay<T>, unsigned long long) || + false +>; +#define hb_is_integral(T) hb_is_integral<T>::value +template <typename T> +using hb_is_floating_point = hb_bool_constant< + hb_is_same (hb_decay<T>, float) || + hb_is_same (hb_decay<T>, double) || + hb_is_same (hb_decay<T>, long double) || + false +>; +#define hb_is_floating_point(T) hb_is_floating_point<T>::value +template <typename T> +using hb_is_arithmetic = hb_bool_constant< + hb_is_integral (T) || + hb_is_floating_point (T) || + false +>; +#define hb_is_arithmetic(T) hb_is_arithmetic<T>::value + + +template <typename T> +using hb_is_signed = hb_conditional<hb_is_arithmetic (T), + hb_bool_constant<(T) -1 < (T) 0>, + hb_false_type>; +#define hb_is_signed(T) hb_is_signed<T>::value +template <typename T> +using hb_is_unsigned = hb_conditional<hb_is_arithmetic (T), + hb_bool_constant<(T) 0 < (T) -1>, + hb_false_type>; +#define hb_is_unsigned(T) hb_is_unsigned<T>::value + +template <typename T> struct hb_int_min; +template <> struct hb_int_min<char> : hb_integral_constant<char, CHAR_MIN> {}; +template <> struct hb_int_min<signed char> : hb_integral_constant<signed char, SCHAR_MIN> {}; +template <> struct hb_int_min<unsigned char> : hb_integral_constant<unsigned char, 0> {}; +template <> struct hb_int_min<signed short> : hb_integral_constant<signed short, SHRT_MIN> {}; +template <> struct hb_int_min<unsigned short> : hb_integral_constant<unsigned short, 0> {}; +template <> struct hb_int_min<signed int> : hb_integral_constant<signed int, INT_MIN> {}; +template <> struct hb_int_min<unsigned int> : hb_integral_constant<unsigned int, 0> {}; +template <> struct hb_int_min<signed long> : hb_integral_constant<signed long, LONG_MIN> {}; +template <> struct hb_int_min<unsigned long> : hb_integral_constant<unsigned long, 0> {}; +template <> struct hb_int_min<signed long long> : hb_integral_constant<signed long long, LLONG_MIN> {}; +template <> struct hb_int_min<unsigned long long> : hb_integral_constant<unsigned long long, 0> {}; +#define hb_int_min(T) hb_int_min<T>::value +template <typename T> struct hb_int_max; +template <> struct hb_int_max<char> : hb_integral_constant<char, CHAR_MAX> {}; +template <> struct hb_int_max<signed char> : hb_integral_constant<signed char, SCHAR_MAX> {}; +template <> struct hb_int_max<unsigned char> : hb_integral_constant<unsigned char, UCHAR_MAX> {}; +template <> struct hb_int_max<signed short> : hb_integral_constant<signed short, SHRT_MAX> {}; +template <> struct hb_int_max<unsigned short> : hb_integral_constant<unsigned short, USHRT_MAX> {}; +template <> struct hb_int_max<signed int> : hb_integral_constant<signed int, INT_MAX> {}; +template <> struct hb_int_max<unsigned int> : hb_integral_constant<unsigned int, UINT_MAX> {}; +template <> struct hb_int_max<signed long> : hb_integral_constant<signed long, LONG_MAX> {}; +template <> struct hb_int_max<unsigned long> : hb_integral_constant<unsigned long, ULONG_MAX> {}; +template <> struct hb_int_max<signed long long> : hb_integral_constant<signed long long, LLONG_MAX> {}; +template <> struct hb_int_max<unsigned long long> : hb_integral_constant<unsigned long long, ULLONG_MAX> {}; +#define hb_int_max(T) hb_int_max<T>::value + + + +template <typename T, typename> +struct _hb_is_destructible : hb_false_type {}; +template <typename T> +struct _hb_is_destructible<T, hb_void_t<decltype (hb_declval (T).~T ())>> : hb_true_type {}; +template <typename T> +using hb_is_destructible = _hb_is_destructible<T, void>; +#define hb_is_destructible(T) hb_is_destructible<T>::value + +template <typename T, typename, typename ...Ts> +struct _hb_is_constructible : hb_false_type {}; +template <typename T, typename ...Ts> +struct _hb_is_constructible<T, hb_void_t<decltype (T (hb_declval (Ts)...))>, Ts...> : hb_true_type {}; +template <typename T, typename ...Ts> +using hb_is_constructible = _hb_is_constructible<T, void, Ts...>; +#define hb_is_constructible(...) hb_is_constructible<__VA_ARGS__>::value + +template <typename T> +using hb_is_default_constructible = hb_is_constructible<T>; +#define hb_is_default_constructible(T) hb_is_default_constructible<T>::value + +template <typename T> +using hb_is_copy_constructible = hb_is_constructible<T, hb_add_lvalue_reference<hb_add_const<T>>>; +#define hb_is_copy_constructible(T) hb_is_copy_constructible<T>::value + +template <typename T> +using hb_is_move_constructible = hb_is_constructible<T, hb_add_rvalue_reference<hb_add_const<T>>>; +#define hb_is_move_constructible(T) hb_is_move_constructible<T>::value + +template <typename T, typename U, typename> +struct _hb_is_assignable : hb_false_type {}; +template <typename T, typename U> +struct _hb_is_assignable<T, U, hb_void_t<decltype (hb_declval (T) = hb_declval (U))>> : hb_true_type {}; +template <typename T, typename U> +using hb_is_assignable = _hb_is_assignable<T, U, void>; +#define hb_is_assignable(T,U) hb_is_assignable<T, U>::value + +template <typename T> +using hb_is_copy_assignable = hb_is_assignable<hb_add_lvalue_reference<T>, + hb_add_lvalue_reference<hb_add_const<T>>>; +#define hb_is_copy_assignable(T) hb_is_copy_assignable<T>::value + +template <typename T> +using hb_is_move_assignable = hb_is_assignable<hb_add_lvalue_reference<T>, + hb_add_rvalue_reference<T>>; +#define hb_is_move_assignable(T) hb_is_move_assignable<T>::value + +/* Trivial versions. */ + +template <typename T> union hb_trivial { T value; }; + +/* Don't know how to do the following. */ +template <typename T> +using hb_is_trivially_destructible= hb_is_destructible<hb_trivial<T>>; +#define hb_is_trivially_destructible(T) hb_is_trivially_destructible<T>::value + +/* Don't know how to do the following. */ +//template <typename T, typename ...Ts> +//using hb_is_trivially_constructible= hb_is_constructible<hb_trivial<T>, hb_trivial<Ts>...>; +//#define hb_is_trivially_constructible(...) hb_is_trivially_constructible<__VA_ARGS__>::value + +template <typename T> +using hb_is_trivially_default_constructible= hb_is_default_constructible<hb_trivial<T>>; +#define hb_is_trivially_default_constructible(T) hb_is_trivially_default_constructible<T>::value + +template <typename T> +using hb_is_trivially_copy_constructible= hb_is_copy_constructible<hb_trivial<T>>; +#define hb_is_trivially_copy_constructible(T) hb_is_trivially_copy_constructible<T>::value + +template <typename T> +using hb_is_trivially_move_constructible= hb_is_move_constructible<hb_trivial<T>>; +#define hb_is_trivially_move_constructible(T) hb_is_trivially_move_constructible<T>::value + +/* Don't know how to do the following. */ +//template <typename T, typename U> +//using hb_is_trivially_assignable= hb_is_assignable<hb_trivial<T>, hb_trivial<U>>; +//#define hb_is_trivially_assignable(T,U) hb_is_trivially_assignable<T, U>::value + +template <typename T> +using hb_is_trivially_copy_assignable= hb_is_copy_assignable<hb_trivial<T>>; +#define hb_is_trivially_copy_assignable(T) hb_is_trivially_copy_assignable<T>::value + +template <typename T> +using hb_is_trivially_move_assignable= hb_is_move_assignable<hb_trivial<T>>; +#define hb_is_trivially_move_assignable(T) hb_is_trivially_move_assignable<T>::value + +template <typename T> +using hb_is_trivially_copyable= hb_bool_constant< + hb_is_trivially_destructible (T) && + (!hb_is_move_assignable (T) || hb_is_trivially_move_assignable (T)) && + (!hb_is_move_constructible (T) || hb_is_trivially_move_constructible (T)) && + (!hb_is_copy_assignable (T) || hb_is_trivially_copy_assignable (T)) && + (!hb_is_copy_constructible (T) || hb_is_trivially_copy_constructible (T)) && + true +>; +#define hb_is_trivially_copyable(T) hb_is_trivially_copyable<T>::value + +template <typename T> +using hb_is_trivial= hb_bool_constant< + hb_is_trivially_copyable (T) && + hb_is_trivially_default_constructible (T) +>; +#define hb_is_trivial(T) hb_is_trivial<T>::value + + +#endif /* HB_META_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh index 35f1fded1ef..a760e731796 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh @@ -127,8 +127,6 @@ typedef int hb_mutex_impl_t; struct hb_mutex_t { - /* TODO Add tracing. */ - hb_mutex_impl_t m; void init () { hb_mutex_impl_init (&m); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh index baddd99b5c4..674b4dffcd1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh @@ -28,6 +28,7 @@ #define HB_NULL_HH #include "hb.hh" +#include "hb-meta.hh" /* @@ -36,7 +37,7 @@ /* Global nul-content Null pool. Enlarge as necessary. */ -#define HB_NULL_POOL_SIZE 9880 +#define HB_NULL_POOL_SIZE 384 /* Use SFINAE to sniff whether T has min_size; in which case return T::null_size, * otherwise return sizeof(T). */ @@ -45,18 +46,13 @@ * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol */ -template<bool> struct _hb_bool_type {}; - -template <typename T, typename B> -struct _hb_null_size -{ enum { value = sizeof (T) }; }; +template <typename T, typename> +struct _hb_null_size : hb_integral_constant<unsigned, sizeof (T)> {}; template <typename T> -struct _hb_null_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> > -{ enum { value = T::null_size }; }; +struct _hb_null_size<T, hb_void_t<decltype (T::min_size)>> : hb_integral_constant<unsigned, T::null_size> {}; template <typename T> -struct hb_null_size -{ enum { value = _hb_null_size<T, _hb_bool_type<true> >::value }; }; +using hb_null_size = _hb_null_size<T, void>; #define hb_null_size(T) hb_null_size<T>::value /* These doesn't belong here, but since is copy/paste from above, put it here. */ @@ -64,38 +60,15 @@ struct hb_null_size /* hb_static_size (T) * Returns T::static_size if T::min_size is defined, or sizeof (T) otherwise. */ -template <typename T, typename B> -struct _hb_static_size -{ enum { value = sizeof (T) }; }; +template <typename T, typename> +struct _hb_static_size : hb_integral_constant<unsigned, sizeof (T)> {}; template <typename T> -struct _hb_static_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> > -{ enum { value = T::static_size }; }; - +struct _hb_static_size<T, hb_void_t<decltype (T::min_size)>> : hb_integral_constant<unsigned, T::static_size> {}; template <typename T> -struct hb_static_size -{ enum { value = _hb_static_size<T, _hb_bool_type<true> >::value }; }; +using hb_static_size = _hb_static_size<T, void>; #define hb_static_size(T) hb_static_size<T>::value -/* hb_assign (obj, value) - * Calls obj.set (value) if obj.min_size is defined and value has different type - * from obj, or obj = v otherwise. */ - -template <typename T, typename V, typename B> -struct _hb_assign -{ static inline void value (T &o, const V v) { o = v; } }; -template <typename T, typename V> -struct _hb_assign<T, V, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> > -{ static inline void value (T &o, const V v) { o.set (v); } }; -template <typename T> -struct _hb_assign<T, T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> > -{ static inline void value (T &o, const T v) { o = v; } }; - -template <typename T, typename V> -static inline void hb_assign (T &o, const V v) -{ _hb_assign<T, V, _hb_bool_type<true> >::value (o, v); } - - /* * Null() */ @@ -115,7 +88,7 @@ struct Null { template <typename QType> struct NullHelper { - typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type; + typedef hb_remove_const<hb_remove_reference<QType>> Type; static const Type & get_null () { return Null<Type>::get_null (); } }; #define Null(Type) NullHelper<Type>::get_null () @@ -168,7 +141,7 @@ static inline Type& Crap () { template <typename QType> struct CrapHelper { - typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type; + typedef hb_remove_const<hb_remove_reference<QType>> Type; static Type & get_crap () { return Crap<Type> (); } }; #define Crap(Type) CrapHelper<Type>::get_crap () @@ -191,7 +164,7 @@ struct CrapOrNullHelper<const Type> { template <typename P> struct hb_nonnull_ptr_t { - typedef typename hb_remove_pointer (P) T; + typedef hb_remove_pointer<P> T; hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {} T * operator = (T *v_) { return v = v_; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh index 32a223cdf34..5318c7fca99 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh @@ -56,7 +56,7 @@ typedef struct TableRecord { int cmp (Tag t) const { return -t.cmp (tag); } - static int cmp (const void *pa, const void *pb) + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const TableRecord *a = (const TableRecord *) pa; const TableRecord *b = (const TableRecord *) pb; @@ -86,15 +86,15 @@ typedef struct OffsetTable const TableRecord& get_table (unsigned int i) const { return tables[i]; } unsigned int get_table_tags (unsigned int start_offset, - unsigned int *table_count, /* IN/OUT */ - hb_tag_t *table_tags /* OUT */) const + unsigned int *table_count, /* IN/OUT */ + hb_tag_t *table_tags /* OUT */) const { if (table_count) { if (start_offset >= tables.len) *table_count = 0; else - *table_count = MIN<unsigned int> (*table_count, tables.len - start_offset); + *table_count = hb_min (*table_count, tables.len - start_offset); const TableRecord *sub_tables = tables.arrayZ + start_offset; unsigned int count = *table_count; @@ -106,7 +106,7 @@ typedef struct OffsetTable bool find_table_index (hb_tag_t tag, unsigned int *table_index) const { Tag t; - t.set (tag); + t = tag; return tables.bfind (t, table_index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX); } const TableRecord& get_table_by_tag (hb_tag_t tag) const @@ -127,7 +127,7 @@ typedef struct OffsetTable /* Alloc 12 for the OTHeader. */ if (unlikely (!c->extend_min (*this))) return_trace (false); /* Write sfntVersion (bytes 0..3). */ - sfnt_version.set (sfnt_tag); + sfnt_version = sfnt_tag; /* Take space for numTables, searchRange, entrySelector, RangeShift * and the TableRecords themselves. */ if (unlikely (!tables.serialize (c, items.length))) return_trace (false); @@ -140,8 +140,8 @@ typedef struct OffsetTable { TableRecord &rec = tables.arrayZ[i]; hb_blob_t *blob = items[i].blob; - rec.tag.set (items[i].tag); - rec.length.set (hb_blob_get_length (blob)); + rec.tag = items[i].tag; + rec.length = hb_blob_get_length (blob); rec.offset.serialize (c, this); /* Allocate room for the table and copy it. */ @@ -159,7 +159,7 @@ typedef struct OffsetTable { head *h = (head *) start; checksum_adjustment = &h->checkSumAdjustment; - checksum_adjustment->set (0); + *checksum_adjustment = 0; } rec.checkSum.set_for_data (start, end - start); @@ -177,10 +177,10 @@ typedef struct OffsetTable for (unsigned int i = 0; i < items.length; i++) { TableRecord &rec = tables.arrayZ[i]; - checksum.set (checksum + rec.checkSum); + checksum = checksum + rec.checkSum; } - checksum_adjustment->set (0xB1B0AFBAu - checksum); + *checksum_adjustment = 0xB1B0AFBAu - checksum; } return_trace (true); @@ -222,7 +222,7 @@ struct TTCHeaderVersion1 Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ FixedVersion<>version; /* Version of the TTC Header (1.0), * 0x00010000u */ - LArrayOf<LOffsetTo<OffsetTable> > + LArrayOf<LOffsetTo<OffsetTable>> table; /* Array of offsets to the OffsetTable for each font * from the beginning of the file */ public: @@ -334,7 +334,7 @@ struct ResourceTypeRecord protected: Tag tag; /* Resource type. */ HBUINT16 resCountM1; /* Number of resources minus 1. */ - NNOffsetTo<UnsizedArrayOf<ResourceRecord> > + NNOffsetTo<UnsizedArrayOf<ResourceRecord>> resourcesZ; /* Offset from beginning of resource type list * to reference item list for this type. */ public: @@ -390,7 +390,7 @@ struct ResourceMap HBUINT32 reserved1; /* Reserved for handle to next resource map */ HBUINT16 resreved2; /* Reserved for file reference number */ HBUINT16 attrs; /* Resource fork attribute */ - NNOffsetTo<ArrayOfM1<ResourceTypeRecord> > + NNOffsetTo<ArrayOfM1<ResourceTypeRecord>> typeList; /* Offset from beginning of map to * resource type list */ Offset16 nameList; /* Offset from beginning of map to @@ -422,7 +422,7 @@ struct ResourceForkHeader } protected: - LNNOffsetTo<UnsizedArrayOf<HBUINT8> > + LNNOffsetTo<UnsizedArrayOf<HBUINT8>> data; /* Offset from beginning of resource fork * to resource data */ LNNOffsetTo<ResourceMap > diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh index 6abb898626c..896f7a0155f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh @@ -52,22 +52,19 @@ namespace OT { * Int types */ -template <bool is_signed> struct hb_signedness_int; -template <> struct hb_signedness_int<false> { typedef unsigned int value; }; -template <> struct hb_signedness_int<true> { typedef signed int value; }; - /* Integer types in big-endian order and no alignment requirement */ template <typename Type, unsigned int Size> struct IntType { typedef Type type; - typedef typename hb_signedness_int<hb_is_signed<Type>::value>::value wide_type; + typedef hb_conditional<hb_is_signed (Type), signed, unsigned> wide_type; - void set (wide_type i) { v.set (i); } + IntType<Type, Size>& operator = (wide_type i) { v = i; return *this; } operator wide_type () const { return v; } bool operator == (const IntType<Type,Size> &o) const { return (Type) v == (Type) o.v; } bool operator != (const IntType<Type,Size> &o) const { return !(*this == o); } - static int cmp (const IntType<Type,Size> *a, const IntType<Type,Size> *b) { return b->cmp (*a); } + HB_INTERNAL static int cmp (const IntType<Type,Size> *a, const IntType<Type,Size> *b) + { return b->cmp (*a); } template <typename Type2> int cmp (Type2 a) const { @@ -110,9 +107,10 @@ typedef HBUINT16 UFWORD; /* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */ struct F2DOT14 : HBINT16 { + F2DOT14& operator = (uint16_t i ) { HBINT16::operator= (i); return *this; } // 16384 means 1<<14 float to_float () const { return ((int32_t) v) / 16384.f; } - void set_float (float f) { v.set (round (f * 16384.f)); } + void set_float (float f) { v = roundf (f * 16384.f); } public: DEFINE_SIZE_STATIC (2); }; @@ -120,9 +118,10 @@ struct F2DOT14 : HBINT16 /* 32-bit signed fixed-point number (16.16). */ struct Fixed : HBINT32 { + Fixed& operator = (uint32_t i) { HBINT32::operator= (i); return *this; } // 65536 means 1<<16 float to_float () const { return ((int32_t) v) / 65536.f; } - void set_float (float f) { v.set (round (f * 65536.f)); } + void set_float (float f) { v = roundf (f * 65536.f); } public: DEFINE_SIZE_STATIC (4); }; @@ -147,6 +146,7 @@ struct LONGDATETIME * system, feature, or baseline */ struct Tag : HBUINT32 { + Tag& operator = (uint32_t i) { HBUINT32::operator= (i); return *this; } /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */ operator const char* () const { return reinterpret_cast<const char *> (&this->v); } operator char* () { return reinterpret_cast<char *> (&this->v); } @@ -155,11 +155,15 @@ struct Tag : HBUINT32 }; /* Glyph index number, same as uint16 (length = 16 bits) */ -typedef HBUINT16 GlyphID; +struct GlyphID : HBUINT16 +{ + GlyphID& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; } +}; /* Script/language-system/feature index */ struct Index : HBUINT16 { static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFu; + Index& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; } }; DECLARE_NULL_NAMESPACE_BYTES (OT, Index); @@ -169,6 +173,8 @@ typedef Index NameID; template <typename Type, bool has_null=true> struct Offset : Type { + Offset& operator = (typename Type::type i) { Type::operator= (i); return *this; } + typedef Type type; bool is_null () const { return has_null && 0 == *this; } @@ -176,7 +182,7 @@ struct Offset : Type void *serialize (hb_serialize_context_t *c, const void *base) { void *t = c->start_embed<void> (); - this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */ + c->check_assign (*this, (unsigned) ((char *) t - (char *) base)); return t; } @@ -191,6 +197,8 @@ typedef Offset<HBUINT32> Offset32; /* CheckSum */ struct CheckSum : HBUINT32 { + CheckSum& operator = (uint32_t i) { HBUINT32::operator= (i); return *this; } + /* This is reference implementation from the spec. */ static uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length) { @@ -205,7 +213,7 @@ struct CheckSum : HBUINT32 /* Note: data should be 4byte aligned and have 4byte padding at the end. */ void set_for_data (const void *data, unsigned int length) - { set (CalcTableChecksum ((const HBUINT32 *) data, length)); } + { *this = CalcTableChecksum ((const HBUINT32 *) data, length); } public: DEFINE_SIZE_STATIC (4); @@ -255,6 +263,11 @@ struct _hb_has_null<Type, true> template <typename Type, typename OffsetType=HBUINT16, bool has_null=true> struct OffsetTo : Offset<OffsetType, has_null> { + HB_DELETE_COPY_ASSIGN (OffsetTo); + OffsetTo () = default; + + OffsetTo& operator = (typename OffsetType::type i) { OffsetType::operator= (i); return *this; } + const Type& operator () (const void *base) const { if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null (); @@ -266,22 +279,60 @@ struct OffsetTo : Offset<OffsetType, has_null> return StructAtOffset<Type> (base, *this); } + template <typename Base, + hb_enable_if (hb_is_convertible (const Base, const void *))> + friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); } + template <typename Base, + hb_enable_if (hb_is_convertible (const Base, const void *))> + friend const Type& operator + (const OffsetTo &offset, const Base &base) { return offset ((const void *) base); } + template <typename Base, + hb_enable_if (hb_is_convertible (Base, void *))> + friend Type& operator + (Base &&base, OffsetTo &offset) { return offset ((void *) base); } + template <typename Base, + hb_enable_if (hb_is_convertible (Base, void *))> + friend Type& operator + (OffsetTo &offset, Base &&base) { return offset ((void *) base); } + Type& serialize (hb_serialize_context_t *c, const void *base) { return * (Type *) Offset<OffsetType>::serialize (c, base); } - template <typename T> - void serialize_subset (hb_subset_context_t *c, const T &src, const void *base) + template <typename ...Ts> + bool serialize_subset (hb_subset_context_t *c, const Type &src, const void *base, Ts&&... ds) { - if (&src == &Null (T)) - { - this->set (0); - return; - } - serialize (c->serializer, base); - if (!src.subset (c)) - this->set (0); + *this = 0; + if (has_null && &src == _hb_has_null<Type, has_null>::get_null ()) + return false; + + auto *s = c->serializer; + + s->push (); + + bool ret = c->dispatch (src, hb_forward<Ts> (ds)...); + + if (ret || !has_null) + s->add_link (*this, s->pop_pack (), base); + else + s->pop_discard (); + + return ret; + } + + /* TODO: Somehow merge this with previous function into a serialize_dispatch(). */ + template <typename ...Ts> + bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts&&... ds) + { + *this = 0; + if (has_null && &src == _hb_has_null<Type, has_null>::get_null ()) + return false; + + c->push (); + + bool ret = c->copy (src, hb_forward<Ts> (ds)...); + + c->add_link (*this, c->pop_pack (), base); + + return ret; } bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const @@ -293,39 +344,13 @@ struct OffsetTo : Offset<OffsetType, has_null> return_trace (true); } - bool sanitize (hb_sanitize_context_t *c, const void *base) const + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const { TRACE_SANITIZE (this); return_trace (sanitize_shallow (c, base) && (this->is_null () || - StructAtOffset<Type> (base, *this).sanitize (c) || - neuter (c))); - } - template <typename T1> - bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1) const - { - TRACE_SANITIZE (this); - return_trace (sanitize_shallow (c, base) && - (this->is_null () || - StructAtOffset<Type> (base, *this).sanitize (c, d1) || - neuter (c))); - } - template <typename T1, typename T2> - bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2) const - { - TRACE_SANITIZE (this); - return_trace (sanitize_shallow (c, base) && - (this->is_null () || - StructAtOffset<Type> (base, *this).sanitize (c, d1, d2) || - neuter (c))); - } - template <typename T1, typename T2, typename T3> - bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2, T3 d3) const - { - TRACE_SANITIZE (this); - return_trace (sanitize_shallow (c, base) && - (this->is_null () || - StructAtOffset<Type> (base, *this).sanitize (c, d1, d2, d3) || + c->dispatch (StructAtOffset<Type> (base, *this), hb_forward<Ts> (ds)...) || neuter (c))); } @@ -338,14 +363,12 @@ struct OffsetTo : Offset<OffsetType, has_null> DEFINE_SIZE_STATIC (sizeof (OffsetType)); }; /* Partial specializations. */ -template <typename Type, bool has_null=true> struct LOffsetTo : OffsetTo<Type, HBUINT32, has_null> {}; -template <typename Type, typename OffsetType=HBUINT16 > struct NNOffsetTo : OffsetTo<Type, OffsetType, false> {}; -template <typename Type > struct LNNOffsetTo : OffsetTo<Type, HBUINT32, false> {}; - -template <typename Base, typename OffsetType, bool has_null, typename Type> -static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); } -template <typename Base, typename OffsetType, bool has_null, typename Type> -static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); } +template <typename Type, bool has_null=true> +using LOffsetTo = OffsetTo<Type, HBUINT32, has_null>; +template <typename Type, typename OffsetType=HBUINT16> +using NNOffsetTo = OffsetTo<Type, OffsetType, false>; +template <typename Type> +using LNNOffsetTo = LOffsetTo<Type, false>; /* @@ -358,7 +381,7 @@ struct UnsizedArrayOf typedef Type item_t; static constexpr unsigned item_size = hb_static_size (Type); - HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (UnsizedArrayOf, Type); + HB_DELETE_CREATE_COPY_ASSIGN (UnsizedArrayOf); const Type& operator [] (int i_) const { @@ -397,38 +420,42 @@ struct UnsizedArrayOf void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1) { as_array (len).qsort (start, end); } - bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + bool serialize (hb_serialize_context_t *c, unsigned int items_len) { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c, count))) return_trace (false); - - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize(), ie. they do not - * reference other structs via offsets. - */ - (void) (false && arrayZ[0].sanitize (c)); - + TRACE_SERIALIZE (this); + if (unlikely (!c->extend (*this, items_len))) return_trace (false); return_trace (true); } - bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base) const + template <typename Iterator, + hb_requires (hb_is_source_of (Iterator, Type))> + bool serialize (hb_serialize_context_t *c, Iterator items) { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c, count))) return_trace (false); - for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, base))) - return_trace (false); + TRACE_SERIALIZE (this); + unsigned count = items.len (); + if (unlikely (!serialize (c, count))) return_trace (false); + /* TODO Umm. Just exhaust the iterator instead? Being extra + * cautious right now.. */ + for (unsigned i = 0; i < count; i++, ++items) + arrayZ[i] = *items; return_trace (true); } - template <typename T> - bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base, T user_data) const + + UnsizedArrayOf* copy (hb_serialize_context_t *c, unsigned count) const + { + TRACE_SERIALIZE (this); + auto *out = c->start_embed (this); + if (unlikely (!as_array (count).copy (c))) return_trace (nullptr); + return_trace (out); + } + + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c, count))) return_trace (false); + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, base, user_data))) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...))) return_trace (false); return_trace (true); } @@ -447,7 +474,7 @@ struct UnsizedArrayOf /* Unsized array of offset's */ template <typename Type, typename OffsetType, bool has_null=true> -struct UnsizedOffsetArrayOf : UnsizedArrayOf<OffsetTo<Type, OffsetType, has_null> > {}; +using UnsizedOffsetArrayOf = UnsizedArrayOf<OffsetTo<Type, OffsetType, has_null>>; /* Unsized array of offsets relative to the beginning of the array itself. */ template <typename Type, typename OffsetType, bool has_null=true> @@ -468,17 +495,12 @@ struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType, has_null> return this+*p; } - - bool sanitize (hb_sanitize_context_t *c, unsigned int count) const - { - TRACE_SANITIZE (this); - return_trace ((UnsizedOffsetArrayOf<Type, OffsetType, has_null>::sanitize (c, count, this))); - } - template <typename T> - bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const { TRACE_SANITIZE (this); - return_trace ((UnsizedOffsetArrayOf<Type, OffsetType, has_null>::sanitize (c, count, this, user_data))); + return_trace ((UnsizedOffsetArrayOf<Type, OffsetType, has_null> + ::sanitize (c, count, this, hb_forward<Ts> (ds)...))); } }; @@ -514,7 +536,7 @@ struct ArrayOf typedef Type item_t; static constexpr unsigned item_size = hb_static_size (Type); - HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType); + HB_DELETE_CREATE_COPY_ASSIGN (ArrayOf); const Type& operator [] (int i_) const { @@ -532,12 +554,18 @@ struct ArrayOf unsigned int get_size () const { return len.static_size + len * Type::static_size; } - hb_array_t<Type> as_array () - { return hb_array (arrayZ, len); } - hb_array_t<const Type> as_array () const - { return hb_array (arrayZ, len); } - operator hb_array_t<Type> (void) { return as_array (); } - operator hb_array_t<const Type> (void) const { return as_array (); } + explicit operator bool () const { return len; } + + hb_array_t< Type> as_array () { return hb_array (arrayZ, len); } + hb_array_t<const Type> as_array () const { return hb_array (arrayZ, len); } + + /* Iterator. */ + typedef hb_array_t<const Type> iter_t; + typedef hb_array_t< Type> writer_t; + iter_t iter () const { return as_array (); } + writer_t writer () { return as_array (); } + operator iter_t () const { return iter (); } + operator writer_t () { return writer (); } hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const { return as_array ().sub_array (start_offset, count);} @@ -552,54 +580,43 @@ struct ArrayOf { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - len.set (items_len); /* TODO(serialize) Overflow? */ + c->check_assign (len, items_len); if (unlikely (!c->extend (*this))) return_trace (false); return_trace (true); } - template <typename T> - bool serialize (hb_serialize_context_t *c, hb_array_t<const T> items) + template <typename Iterator, + hb_requires (hb_is_source_of (Iterator, Type))> + bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); - if (unlikely (!serialize (c, items.length))) return_trace (false); - for (unsigned int i = 0; i < items.length; i++) - hb_assign (arrayZ[i], items[i]); + unsigned count = items.len (); + if (unlikely (!serialize (c, count))) return_trace (false); + /* TODO Umm. Just exhaust the iterator instead? Being extra + * cautious right now.. */ + for (unsigned i = 0; i < count; i++, ++items) + arrayZ[i] = *items; return_trace (true); } - bool sanitize (hb_sanitize_context_t *c) const + ArrayOf* copy (hb_serialize_context_t *c) const { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c))) return_trace (false); - - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize(), ie. they do not - * reference other structs via offsets. - */ - (void) (false && arrayZ[0].sanitize (c)); - - return_trace (true); - } - bool sanitize (hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c))) return_trace (false); - unsigned int count = len; - for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, base))) - return_trace (false); - return_trace (true); + TRACE_SERIALIZE (this); + auto *out = c->start_embed (this); + if (unlikely (!c->extend_min (out))) return_trace (nullptr); + c->check_assign (out->len, len); + if (unlikely (!as_array ().copy (c))) return_trace (nullptr); + return_trace (out); } - template <typename T> - bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const + + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); unsigned int count = len; for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, base, user_data))) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...))) return_trace (false); return_trace (true); } @@ -626,16 +643,17 @@ struct ArrayOf public: DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); }; -template <typename Type> struct LArrayOf : ArrayOf<Type, HBUINT32> {}; -typedef ArrayOf<HBUINT8, HBUINT8> PString; +template <typename Type> +using LArrayOf = ArrayOf<Type, HBUINT32>; +using PString = ArrayOf<HBUINT8, HBUINT8>; /* Array of Offset's */ template <typename Type> -struct OffsetArrayOf : ArrayOf<OffsetTo<Type, HBUINT16> > {}; +using OffsetArrayOf = ArrayOf<OffsetTo<Type, HBUINT16>>; template <typename Type> -struct LOffsetArrayOf : ArrayOf<OffsetTo<Type, HBUINT32> > {}; +using LOffsetArrayOf = ArrayOf<OffsetTo<Type, HBUINT32>>; template <typename Type> -struct LOffsetLArrayOf : ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT32> {}; +using LOffsetLArrayOf = ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT32>; /* Array of offsets relative to the beginning of the array itself. */ template <typename Type> @@ -665,16 +683,11 @@ struct OffsetListOf : OffsetArrayOf<Type> return_trace (true); } - bool sanitize (hb_sanitize_context_t *c) const + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); - return_trace (OffsetArrayOf<Type>::sanitize (c, this)); - } - template <typename T> - bool sanitize (hb_sanitize_context_t *c, T user_data) const - { - TRACE_SANITIZE (this); - return_trace (OffsetArrayOf<Type>::sanitize (c, this, user_data)); + return_trace (OffsetArrayOf<Type>::sanitize (c, this, hb_forward<Ts> (ds)...)); } }; @@ -684,7 +697,7 @@ struct HeadlessArrayOf { static constexpr unsigned item_size = Type::static_size; - HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (HeadlessArrayOf, Type, LenType); + HB_DELETE_CREATE_COPY_ASSIGN (HeadlessArrayOf); const Type& operator [] (int i_) const { @@ -706,27 +719,23 @@ struct HeadlessArrayOf { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - lenP1.set (items.length + 1); /* TODO(serialize) Overflow? */ + c->check_assign (lenP1, items.length + 1); if (unlikely (!c->extend (*this))) return_trace (false); for (unsigned int i = 0; i < items.length; i++) arrayZ[i] = items[i]; return_trace (true); } - bool sanitize (hb_sanitize_context_t *c) const + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); - - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize(), ie. they do not - * reference other structs via offsets. - */ - (void) (false && arrayZ[0].sanitize (c)); - + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); + unsigned int count = lenP1 ? lenP1 - 1 : 0; + for (unsigned int i = 0; i < count; i++) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...))) + return_trace (false); return_trace (true); } @@ -749,7 +758,7 @@ struct HeadlessArrayOf template <typename Type, typename LenType=HBUINT16> struct ArrayOfM1 { - HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOfM1, Type, LenType); + HB_DELETE_CREATE_COPY_ASSIGN (ArrayOfM1); const Type& operator [] (int i_) const { @@ -766,14 +775,14 @@ struct ArrayOfM1 unsigned int get_size () const { return lenM1.static_size + (lenM1 + 1) * Type::static_size; } - template <typename T> - bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); unsigned int count = lenM1 + 1; for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, base, user_data))) + if (unlikely (!c->dispatch (arrayZ[i], hb_forward<Ts> (ds)...))) return_trace (false); return_trace (true); } @@ -797,22 +806,41 @@ struct ArrayOfM1 template <typename Type, typename LenType=HBUINT16> struct SortedArrayOf : ArrayOf<Type, LenType> { - hb_sorted_array_t<Type> as_array () - { return hb_sorted_array (this->arrayZ, this->len); } - hb_sorted_array_t<const Type> as_array () const - { return hb_sorted_array (this->arrayZ, this->len); } - operator hb_sorted_array_t<Type> () { return as_array (); } - operator hb_sorted_array_t<const Type> () const { return as_array (); } - - hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const + hb_sorted_array_t< Type> as_array () { return hb_sorted_array (this->arrayZ, this->len); } + hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->len); } + + /* Iterator. */ + typedef hb_sorted_array_t<const Type> iter_t; + typedef hb_sorted_array_t< Type> writer_t; + iter_t iter () const { return as_array (); } + writer_t writer () { return as_array (); } + operator iter_t () const { return iter (); } + operator writer_t () { return writer (); } + + hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const { return as_array ().sub_array (start_offset, count);} - hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const + hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const { return as_array ().sub_array (start_offset, count);} - hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count) + hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int count) { return as_array ().sub_array (start_offset, count);} - hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) + hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) { return as_array ().sub_array (start_offset, count);} + bool serialize (hb_serialize_context_t *c, unsigned int items_len) + { + TRACE_SERIALIZE (this); + bool ret = ArrayOf<Type, LenType>::serialize (c, items_len); + return_trace (ret); + } + template <typename Iterator, + hb_requires (hb_is_sorted_source_of (Iterator, Type))> + bool serialize (hb_serialize_context_t *c, Iterator items) + { + TRACE_SERIALIZE (this); + bool ret = ArrayOf<Type, LenType>::serialize (c, items); + return_trace (ret); + } + template <typename T> Type &bsearch (const T &x, Type ¬_found = Crap (Type)) { return *as_array ().bsearch (x, ¬_found); } @@ -841,15 +869,16 @@ struct BinSearchHeader return_trace (c->check_struct (this)); } - void set (unsigned int v) + BinSearchHeader& operator = (unsigned int v) { - len.set (v); + len = v; assert (len == v); - entrySelector.set (MAX (1u, hb_bit_storage (v)) - 1); - searchRange.set (16 * (1u << entrySelector)); - rangeShift.set (v * 16 > searchRange - ? 16 * v - searchRange - : 0); + entrySelector = hb_max (1u, hb_bit_storage (v)) - 1; + searchRange = 16 * (1u << entrySelector); + rangeShift = v * 16 > searchRange + ? 16 * v - searchRange + : 0; + return *this; } protected: @@ -863,7 +892,7 @@ struct BinSearchHeader }; template <typename Type, typename LenType=HBUINT16> -struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader<LenType> > {}; +using BinSearchArrayOf = SortedArrayOf<Type, BinSearchHeader<LenType>>; struct VarSizedBinSearchHeader @@ -893,7 +922,7 @@ struct VarSizedBinSearchArrayOf { static constexpr unsigned item_size = Type::static_size; - HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (VarSizedBinSearchArrayOf, Type); + HB_DELETE_CREATE_COPY_ASSIGN (VarSizedBinSearchArrayOf); bool last_is_terminator () const { @@ -928,40 +957,15 @@ struct VarSizedBinSearchArrayOf unsigned int get_size () const { return header.static_size + header.nUnits * header.unitSize; } - bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c))) return_trace (false); - - /* Note: for structs that do not reference other structs, - * we do not need to call their sanitize() as we already did - * a bound check on the aggregate array size. We just include - * a small unreachable expression to make sure the structs - * pointed to do have a simple sanitize(), ie. they do not - * reference other structs via offsets. - */ - (void) (false && StructAtOffset<Type> (&bytesZ, 0).sanitize (c)); - - return_trace (true); - } - bool sanitize (hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c))) return_trace (false); - unsigned int count = get_length (); - for (unsigned int i = 0; i < count; i++) - if (unlikely (!(*this)[i].sanitize (c, base))) - return_trace (false); - return_trace (true); - } - template <typename T> - bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const + template <typename ...Ts> + bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); if (unlikely (!sanitize_shallow (c))) return_trace (false); + if (!sizeof... (Ts) && hb_is_trivially_copyable (Type)) return_trace (true); unsigned int count = get_length (); for (unsigned int i = 0; i < count; i++) - if (unlikely (!(*this)[i].sanitize (c, base, user_data))) + if (unlikely (!(*this)[i].sanitize (c, hb_forward<Ts> (ds)...))) return_trace (false); return_trace (true); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh index 61e615cf0fb..ddec517a166 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh @@ -97,12 +97,12 @@ struct CFFIndex unsigned int offset_array_size () const { return calculate_offset_array_size (offSize, count); } - static unsigned int calculate_serialized_size (unsigned int offSize, unsigned int count, unsigned int dataSize) + static unsigned int calculate_serialized_size (unsigned int offSize_, unsigned int count, unsigned int dataSize) { if (count == 0) return COUNT::static_size; else - return min_size + calculate_offset_array_size (offSize, count) + dataSize; + return min_size + calculate_offset_array_size (offSize_, count) + dataSize; } bool serialize (hb_serialize_context_t *c, const CFFIndex &src) @@ -124,15 +124,15 @@ struct CFFIndex { COUNT *dest = c->allocate_min<COUNT> (); if (unlikely (dest == nullptr)) return_trace (false); - dest->set (0); + *dest = 0; } else { /* serialize CFFIndex header */ if (unlikely (!c->extend_min (*this))) return_trace (false); - this->count.set (byteArray.length); - this->offSize.set (offSize_); - if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (byteArray.length + 1)))) + this->count = byteArray.length; + this->offSize = offSize_; + if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (byteArray.length + 1)))) return_trace (false); /* serialize indices */ @@ -167,7 +167,7 @@ struct CFFIndex byteArray.resize (buffArray.length); for (unsigned int i = 0; i < byteArray.length; i++) { - byteArray[i] = byte_str_t (buffArray[i].arrayZ (), buffArray[i].length); + byteArray[i] = byte_str_t (buffArray[i].arrayZ, buffArray[i].length); } bool result = this->serialize (c, offSize_, byteArray); byteArray.fini (); @@ -181,7 +181,7 @@ struct CFFIndex for (; size; size--) { --p; - p->set (offset & 0xFF); + *p = offset & 0xFF; offset >>= 8; } } @@ -275,9 +275,9 @@ struct CFFIndexOf : CFFIndex<COUNT> TRACE_SERIALIZE (this); /* serialize CFFIndex header */ if (unlikely (!c->extend_min (*this))) return_trace (false); - this->count.set (dataArrayLen); - this->offSize.set (offSize_); - if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1)))) + this->count = dataArrayLen; + this->offSize = offSize_; + if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1)))) return_trace (false); /* serialize indices */ @@ -376,11 +376,11 @@ struct Dict : UnsizedByteStr if (unlikely (p == nullptr)) return_trace (false); if (Is_OpCode_ESC (op)) { - p->set (OpCode_escape); + *p = OpCode_escape; op = Unmake_OpCode_ESC (op); p++; } - p->set (op); + *p = op; return_trace (true); } @@ -477,9 +477,9 @@ struct FDArray : CFFIndexOf<COUNT, FontDict> { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - this->count.set (fontDicts.length); - this->offSize.set (offSize_); - if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (fontDicts.length + 1)))) + this->count = fontDicts.length; + this->offSize = offSize_; + if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (fontDicts.length + 1)))) return_trace (false); /* serialize font dict offsets */ @@ -514,9 +514,9 @@ struct FDArray : CFFIndexOf<COUNT, FontDict> { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - this->count.set (fdCount); - this->offSize.set (offSize_); - if (!unlikely (c->allocate_size<HBUINT8> (offSize_ * (fdCount + 1)))) + this->count = fdCount; + this->offSize = offSize_; + if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (fdCount + 1)))) return_trace (false); /* serialize font dict offsets */ @@ -589,7 +589,7 @@ struct FDSelect0 { template <typename GID_TYPE, typename FD_TYPE> struct FDSelect3_4_Range { - bool sanitize (hb_sanitize_context_t *c, const void */*nullptr*/, unsigned int fdcount) const + bool sanitize (hb_sanitize_context_t *c, const void * /*nullptr*/, unsigned int fdcount) const { TRACE_SANITIZE (this); return_trace (first < c->get_num_glyphs () && (fd < fdcount)); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc index 8773c05a228..e6dd6a7b8c2 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc @@ -27,6 +27,8 @@ #include "hb-ot-cff1-table.hh" #include "hb-cff1-interp-cs.hh" +#ifndef HB_NO_CFF + using namespace CFF; /* SID to code */ @@ -165,8 +167,8 @@ struct bounds_t { void init () { - min.set_int (0x7FFFFFFF, 0x7FFFFFFF); - max.set_int (-0x80000000, -0x80000000); + min.set_int (INT_MAX, INT_MAX); + max.set_int (INT_MIN, INT_MIN); } void update (const point_t &pt) @@ -305,6 +307,11 @@ bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, boun bool OT::cff1::accelerator_t::get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const { +#ifdef HB_NO_OT_FONT_CFF + /* XXX Remove check when this code moves to .hh file. */ + return true; +#endif + bounds_t bounds; if (!_get_bounds (this, glyph, bounds)) @@ -383,3 +390,5 @@ bool OT::cff1::accelerator_t::get_seac_components (hb_codepoint_t glyph, hb_code } return false; } + +#endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh index 9d39242cfc9..3a887d3d0ca 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.hh @@ -110,7 +110,8 @@ struct Encoding1 { { if (glyph <= ranges[i].nLeft) { - return (hb_codepoint_t)ranges[i].first + glyph; + hb_codepoint_t code = (hb_codepoint_t) ranges[i].first + glyph; + return (likely (code < 0x100) ? code: CFF_UNDEF_CODE); } glyph -= (ranges[i].nLeft + 1); } @@ -196,18 +197,18 @@ struct Encoding { TRACE_SERIALIZE (this); Encoding *dest = c->extend_min (*this); if (unlikely (dest == nullptr)) return_trace (false); - dest->format.set (format | ((supp_codes.length > 0)? 0x80: 0)); + dest->format = format | ((supp_codes.length > 0)? 0x80: 0); if (format == 0) { Encoding0 *fmt0 = c->allocate_size<Encoding0> (Encoding0::min_size + HBUINT8::static_size * enc_count); if (unlikely (fmt0 == nullptr)) return_trace (false); - fmt0->nCodes ().set (enc_count); + fmt0->nCodes () = enc_count; unsigned int glyph = 0; for (unsigned int i = 0; i < code_ranges.length; i++) { hb_codepoint_t code = code_ranges[i].code; for (int left = (int)code_ranges[i].glyph; left >= 0; left--) - fmt0->codes[glyph++].set (code++); + fmt0->codes[glyph++] = code++; if (unlikely (!((glyph <= 0x100) && (code <= 0x100)))) return_trace (false); } @@ -216,24 +217,24 @@ struct Encoding { { Encoding1 *fmt1 = c->allocate_size<Encoding1> (Encoding1::min_size + Encoding1_Range::static_size * code_ranges.length); if (unlikely (fmt1 == nullptr)) return_trace (false); - fmt1->nRanges ().set (code_ranges.length); + fmt1->nRanges () = code_ranges.length; for (unsigned int i = 0; i < code_ranges.length; i++) { if (unlikely (!((code_ranges[i].code <= 0xFF) && (code_ranges[i].glyph <= 0xFF)))) return_trace (false); - fmt1->ranges[i].first.set (code_ranges[i].code); - fmt1->ranges[i].nLeft.set (code_ranges[i].glyph); + fmt1->ranges[i].first = code_ranges[i].code; + fmt1->ranges[i].nLeft = code_ranges[i].glyph; } } if (supp_codes.length > 0) { CFF1SuppEncData *suppData = c->allocate_size<CFF1SuppEncData> (CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_codes.length); if (unlikely (suppData == nullptr)) return_trace (false); - suppData->nSups ().set (supp_codes.length); + suppData->nSups () = supp_codes.length; for (unsigned int i = 0; i < supp_codes.length; i++) { - suppData->supps[i].code.set (supp_codes[i].code); - suppData->supps[i].glyph.set (supp_codes[i].glyph); /* actually SID */ + suppData->supps[i].code = supp_codes[i].code; + suppData->supps[i].glyph = supp_codes[i].glyph; /* actually SID */ } } return_trace (true); @@ -469,7 +470,7 @@ struct Charset { TRACE_SERIALIZE (this); Charset *dest = c->extend_min (*this); if (unlikely (dest == nullptr)) return_trace (false); - dest->format.set (format); + dest->format = format; if (format == 0) { Charset0 *fmt0 = c->allocate_size<Charset0> (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1)); @@ -479,7 +480,7 @@ struct Charset { { hb_codepoint_t sid = sid_ranges[i].code; for (int left = (int)sid_ranges[i].glyph; left >= 0; left--) - fmt0->sids[glyph++].set (sid++); + fmt0->sids[glyph++] = sid++; } } else if (format == 1) @@ -490,8 +491,8 @@ struct Charset { { if (unlikely (!(sid_ranges[i].glyph <= 0xFF))) return_trace (false); - fmt1->ranges[i].first.set (sid_ranges[i].code); - fmt1->ranges[i].nLeft.set (sid_ranges[i].glyph); + fmt1->ranges[i].first = sid_ranges[i].code; + fmt1->ranges[i].nLeft = sid_ranges[i].glyph; } } else /* format 2 */ @@ -502,8 +503,8 @@ struct Charset { { if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF))) return_trace (false); - fmt2->ranges[i].first.set (sid_ranges[i].code); - fmt2->ranges[i].nLeft.set (sid_ranges[i].glyph); + fmt2->ranges[i].first = sid_ranges[i].code; + fmt2->ranges[i].nLeft = sid_ranges[i].glyph; } } return_trace (true); @@ -575,9 +576,9 @@ struct CFF1StringIndex : CFF1Index TRACE_SERIALIZE (this); if (unlikely ((strings.count == 0) || (sidmap.get_count () == 0))) { - if (!unlikely (c->extend_min (this->count))) + if (unlikely (!c->extend_min (this->count))) return_trace (false); - count.set (0); + count = 0; return_trace (true); } @@ -598,9 +599,9 @@ struct CFF1StringIndex : CFF1Index } /* in parallel to above */ - unsigned int calculate_serialized_size (unsigned int &offSize /*OUT*/, const remap_t &sidmap) const + unsigned int calculate_serialized_size (unsigned int &offSize_ /*OUT*/, const remap_t &sidmap) const { - offSize = 0; + offSize_ = 0; if ((count == 0) || (sidmap.get_count () == 0)) return count.static_size; @@ -609,8 +610,8 @@ struct CFF1StringIndex : CFF1Index if (sidmap[i] != CFF_UNDEF_CODE) dataSize += length_at (i); - offSize = calcOffSize(dataSize); - return CFF1Index::calculate_serialized_size (offSize, sidmap.get_count (), dataSize); + offSize_ = calcOffSize(dataSize); + return CFF1Index::calculate_serialized_size (offSize_, sidmap.get_count (), dataSize); } }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc index 7daa5365670..f1fa6ec30b8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc @@ -27,6 +27,8 @@ #include "hb-ot-cff2-table.hh" #include "hb-cff2-interp-cs.hh" +#ifndef HB_NO_OT_FONT_CFF + using namespace CFF; struct extents_param_t @@ -34,10 +36,10 @@ struct extents_param_t void init () { path_open = false; - min_x.set_int (0x7FFFFFFF); - min_y.set_int (0x7FFFFFFF); - max_x.set_int (-0x80000000); - max_y.set_int (-0x80000000); + min_x.set_int (INT_MAX); + min_y.set_int (INT_MAX); + max_x.set_int (INT_MIN); + max_y.set_int (INT_MIN); } void start_path () { path_open = true; } @@ -99,6 +101,11 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const { +#ifdef HB_NO_OT_FONT_CFF + /* XXX Remove check when this code moves to .hh file. */ + return true; +#endif + if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false; unsigned int num_coords; @@ -134,3 +141,5 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, return true; } + +#endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh index 0526c35cb99..9e9679f8b27 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh @@ -83,21 +83,21 @@ struct CmapSubtableFormat4 bool serialize (hb_serialize_context_t *c, const hb_subset_plan_t *plan, - const hb_vector_t<segment_plan> &segments) + const hb_sorted_vector_t<segment_plan> &segments) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - this->format.set (4); - this->length.set (get_sub_table_size (segments)); + this->format = 4; + this->length = get_sub_table_size (segments); - this->segCountX2.set (segments.length * 2); - this->entrySelector.set (MAX (1u, hb_bit_storage (segments.length)) - 1); - this->searchRange.set (2 * (1u << this->entrySelector)); - this->rangeShift.set (segments.length * 2 > this->searchRange - ? 2 * segments.length - this->searchRange - : 0); + this->segCountX2 = segments.length * 2; + this->entrySelector = hb_max (1u, hb_bit_storage (segments.length)) - 1; + this->searchRange = 2 * (1u << this->entrySelector); + this->rangeShift = segments.length * 2 > this->searchRange + ? 2 * segments.length - this->searchRange + : 0; HBUINT16 *end_count = c->allocate_size<HBUINT16> (HBUINT16::static_size * segments.length); c->allocate_size<HBUINT16> (HBUINT16::static_size); // 2 bytes of padding. @@ -110,17 +110,17 @@ struct CmapSubtableFormat4 for (unsigned int i = 0; i < segments.length; i++) { - end_count[i].set (segments[i].end_code); - start_count[i].set (segments[i].start_code); + end_count[i] = segments[i].end_code; + start_count[i] = segments[i].start_code; if (segments[i].use_delta) { hb_codepoint_t cp = segments[i].start_code; hb_codepoint_t start_gid = 0; if (unlikely (!plan->new_gid_for_codepoint (cp, &start_gid) && cp != 0xFFFF)) return_trace (false); - id_delta[i].set (start_gid - segments[i].start_code); + id_delta[i] = start_gid - segments[i].start_code; } else { - id_delta[i].set (0); + id_delta[i] = 0; unsigned int num_codepoints = segments[i].end_code - segments[i].start_code + 1; HBUINT16 *glyph_id_array = c->allocate_size<HBUINT16> (HBUINT16::static_size * num_codepoints); if (glyph_id_array == nullptr) @@ -138,15 +138,14 @@ struct CmapSubtableFormat4 // id_range_offset[i] // = // 2 * (glyph_id_array - id_range_offset - i) - id_range_offset[i].set (2 * ( - glyph_id_array - id_range_offset - i)); + id_range_offset[i] = 2 * (glyph_id_array - id_range_offset - i); for (unsigned int j = 0; j < num_codepoints; j++) { hb_codepoint_t cp = segments[i].start_code + j; - hb_codepoint_t new_gid; + hb_codepoint_t new_gid = 0; if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) return_trace (false); - glyph_id_array[j].set (new_gid); + glyph_id_array[j] = new_gid; } } } @@ -154,7 +153,7 @@ struct CmapSubtableFormat4 return_trace (true); } - static size_t get_sub_table_size (const hb_vector_t<segment_plan> &segments) + static size_t get_sub_table_size (const hb_sorted_vector_t<segment_plan> &segments) { size_t segment_size = 0; for (unsigned int i = 0; i < segments.length; i++) @@ -177,14 +176,14 @@ struct CmapSubtableFormat4 } static bool create_sub_table_plan (const hb_subset_plan_t *plan, - hb_vector_t<segment_plan> *segments) + hb_sorted_vector_t<segment_plan> *segments) { segment_plan *segment = nullptr; hb_codepoint_t last_gid = 0; hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (plan->unicodes->next (&cp)) { - hb_codepoint_t new_gid; + hb_codepoint_t new_gid = 0; if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) { DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp); @@ -198,11 +197,11 @@ struct CmapSubtableFormat4 cp != segment->end_code + 1u) { segment = segments->push (); - segment->start_code.set (cp); - segment->end_code.set (cp); + segment->start_code = cp; + segment->end_code = cp; segment->use_delta = true; } else { - segment->end_code.set (cp); + segment->end_code = cp; if (last_gid + 1u != new_gid) // gid's are not consecutive in this segment so delta // cannot be used. @@ -216,8 +215,8 @@ struct CmapSubtableFormat4 if (segment == nullptr || segment->end_code != 0xFFFF) { segment = segments->push (); - segment->start_code.set (0xFFFF); - segment->end_code.set (0xFFFF); + segment->start_code = 0xFFFF; + segment->end_code = 0xFFFF; segment->use_delta = true; } @@ -286,7 +285,7 @@ struct CmapSubtableFormat4 *glyph = gid; return true; } - static bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph) + HB_INTERNAL static bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph) { return ((const accelerator_t *) obj)->get_glyph (codepoint, glyph); } @@ -349,7 +348,7 @@ struct CmapSubtableFormat4 /* Some broken fonts have too long of a "length" value. * If that is the case, just change the value to truncate * the subtable at the end of the blob. */ - uint16_t new_length = (uint16_t) MIN ((uintptr_t) 65535, + uint16_t new_length = (uint16_t) hb_min ((uintptr_t) 65535, (uintptr_t) (c->end - (char *) this)); if (!c->try_set (&length, new_length)) @@ -479,7 +478,7 @@ struct CmapSubtableLongSegmented { for (unsigned int i = 0; i < this->groups.len; i++) { out->add_range (this->groups[i].startCharCode, - MIN ((hb_codepoint_t) this->groups[i].endCharCode, + hb_min ((hb_codepoint_t) this->groups[i].endCharCode, (hb_codepoint_t) HB_UNICODE_MAX)); } } @@ -491,12 +490,12 @@ struct CmapSubtableLongSegmented } bool serialize (hb_serialize_context_t *c, - const hb_vector_t<CmapSubtableLongGroup> &group_data) + const hb_sorted_vector_t<CmapSubtableLongGroup> &group_data) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); if (unlikely (!groups.serialize (c, group_data.as_array ()))) return_trace (false); - return true; + return_trace (true); } protected: @@ -519,30 +518,31 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12> bool serialize (hb_serialize_context_t *c, - const hb_vector_t<CmapSubtableLongGroup> &groups) + const hb_sorted_vector_t<CmapSubtableLongGroup> &groups_data) { - if (unlikely (!c->extend_min (*this))) return false; + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (*this))) return_trace (false); - this->format.set (12); - this->reserved.set (0); - this->length.set (get_sub_table_size (groups)); + this->format = 12; + this->reserved = 0; + this->length = get_sub_table_size (groups_data); - return CmapSubtableLongSegmented<CmapSubtableFormat12>::serialize (c, groups); + return_trace (CmapSubtableLongSegmented<CmapSubtableFormat12>::serialize (c, groups_data)); } - static size_t get_sub_table_size (const hb_vector_t<CmapSubtableLongGroup> &groups) + static size_t get_sub_table_size (const hb_sorted_vector_t<CmapSubtableLongGroup> &groups_data) { - return 16 + 12 * groups.length; + return 16 + 12 * groups_data.length; } static bool create_sub_table_plan (const hb_subset_plan_t *plan, - hb_vector_t<CmapSubtableLongGroup> *groups) + hb_sorted_vector_t<CmapSubtableLongGroup> *groups_out) { CmapSubtableLongGroup *group = nullptr; hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (plan->unicodes->next (&cp)) { - hb_codepoint_t new_gid; + hb_codepoint_t new_gid = 0; if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) { DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp); @@ -551,17 +551,17 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12> if (!group || !_is_gid_consecutive (group, cp, new_gid)) { - group = groups->push (); - group->startCharCode.set (cp); - group->endCharCode.set (cp); - group->glyphID.set (new_gid); + group = groups_out->push (); + group->startCharCode = cp; + group->endCharCode = cp; + group->glyphID = new_gid; } - else group->endCharCode.set (cp); + else group->endCharCode = cp; } DEBUG_MSG(SUBSET, nullptr, "cmap"); - for (unsigned int i = 0; i < groups->length; i++) { - CmapSubtableLongGroup& group = (*groups)[i]; + for (unsigned int i = 0; i < groups_out->length; i++) { + CmapSubtableLongGroup& group = (*groups_out)[i]; DEBUG_MSG(SUBSET, nullptr, " %d: U+%04X-U+%04X, gid %d-%d", i, (uint32_t) group.startCharCode, (uint32_t) group.endCharCode, (uint32_t) group.glyphID, (uint32_t) group.glyphID + ((uint32_t) group.endCharCode - (uint32_t) group.startCharCode)); } @@ -623,7 +623,7 @@ struct DefaultUVS : SortedArrayOf<UnicodeValueRange, HBUINT32> for (unsigned int i = 0; i < count; i++) { hb_codepoint_t first = arrayZ[i].startUnicodeValue; - hb_codepoint_t last = MIN ((hb_codepoint_t) (first + arrayZ[i].additionalCount), + hb_codepoint_t last = hb_min ((hb_codepoint_t) (first + arrayZ[i].additionalCount), (hb_codepoint_t) HB_UNICODE_MAX); out->add_range (first, last); } @@ -853,8 +853,8 @@ struct cmap + CmapSubtableFormat12::get_sub_table_size (this->format12_groups); } - hb_vector_t<CmapSubtableFormat4::segment_plan> format4_segments; - hb_vector_t<CmapSubtableLongGroup> format12_groups; + hb_sorted_vector_t<CmapSubtableFormat4::segment_plan> format4_segments; + hb_sorted_vector_t<CmapSubtableLongGroup> format12_groups; }; bool _create_plan (const hb_subset_plan_t *plan, @@ -863,6 +863,7 @@ struct cmap if (unlikely (!CmapSubtableFormat4::create_sub_table_plan (plan, &cmap_plan->format4_segments))) return false; + if (!find_subtable (12)) return true; return CmapSubtableFormat12::create_sub_table_plan (plan, &cmap_plan->format12_groups); } @@ -879,33 +880,35 @@ struct cmap return false; } - table->version.set (0); + table->version = 0; - if (unlikely (!table->encodingRecord.serialize (&c, /* numTables */ 3))) - return false; + if (unlikely (!table->encodingRecord.serialize (&c, /* numTables */ cmap_subset_plan.format12_groups ? 3 : 2))) return false; // TODO(grieger): Convert the below to a for loop // Format 4, Plat 0 Encoding Record EncodingRecord &format4_plat0_rec = table->encodingRecord[0]; - format4_plat0_rec.platformID.set (0); // Unicode - format4_plat0_rec.encodingID.set (3); + format4_plat0_rec.platformID = 0; // Unicode + format4_plat0_rec.encodingID = 3; // Format 4, Plat 3 Encoding Record EncodingRecord &format4_plat3_rec = table->encodingRecord[1]; - format4_plat3_rec.platformID.set (3); // Windows - format4_plat3_rec.encodingID.set (1); // Unicode BMP + format4_plat3_rec.platformID = 3; // Windows + format4_plat3_rec.encodingID = 1; // Unicode BMP // Format 12 Encoding Record - EncodingRecord &format12_rec = table->encodingRecord[2]; - format12_rec.platformID.set (3); // Windows - format12_rec.encodingID.set (10); // Unicode UCS-4 + if (cmap_subset_plan.format12_groups) + { + EncodingRecord &format12_rec = table->encodingRecord[2]; + format12_rec.platformID = 3; // Windows + format12_rec.encodingID = 10; // Unicode UCS-4 + } // Write out format 4 sub table { CmapSubtable &subtable = format4_plat0_rec.subtable.serialize (&c, table); - format4_plat3_rec.subtable.set (format4_plat0_rec.subtable); - subtable.u.format.set (4); + format4_plat3_rec.subtable = (unsigned int) format4_plat0_rec.subtable; + subtable.u.format = 4; CmapSubtableFormat4 &format4 = subtable.u.format4; if (unlikely (!format4.serialize (&c, plan, cmap_subset_plan.format4_segments))) @@ -913,9 +916,11 @@ struct cmap } // Write out format 12 sub table. + if (cmap_subset_plan.format12_groups) { + EncodingRecord &format12_rec = table->encodingRecord[2]; CmapSubtable &subtable = format12_rec.subtable.serialize (&c, table); - subtable.u.format.set (12); + subtable.u.format = 12; CmapSubtableFormat12 &format12 = subtable.u.format12; if (unlikely (!format12.serialize (&c, cmap_subset_plan.format12_groups))) @@ -1096,18 +1101,18 @@ struct cmap hb_codepoint_t *glyph); template <typename Type> - static bool get_glyph_from (const void *obj, - hb_codepoint_t codepoint, - hb_codepoint_t *glyph) + HB_INTERNAL static bool get_glyph_from (const void *obj, + hb_codepoint_t codepoint, + hb_codepoint_t *glyph) { const Type *typed_obj = (const Type *) obj; return typed_obj->get_glyph (codepoint, glyph); } template <typename Type> - static bool get_glyph_from_symbol (const void *obj, - hb_codepoint_t codepoint, - hb_codepoint_t *glyph) + HB_INTERNAL static bool get_glyph_from_symbol (const void *obj, + hb_codepoint_t codepoint, + hb_codepoint_t *glyph) { const Type *typed_obj = (const Type *) obj; if (likely (typed_obj->get_glyph (codepoint, glyph))) @@ -1144,8 +1149,8 @@ struct cmap unsigned int encoding_id) const { EncodingRecord key; - key.platformID.set (platform_id); - key.encodingID.set (encoding_id); + key.platformID = platform_id; + key.encodingID = encoding_id; const EncodingRecord &result = encodingRecord.bsearch (key); if (!result.subtable) @@ -1154,6 +1159,18 @@ struct cmap return &(this+result.subtable); } + bool find_subtable (unsigned format) const + { + auto it = + + hb_iter (encodingRecord) + | hb_map (&EncodingRecord::subtable) + | hb_map (hb_add (this)) + | hb_filter ([&] (const CmapSubtable& _) { return _.u.format == format; }) + ; + + return it.len (); + } + public: bool sanitize (hb_sanitize_context_t *c) const diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh index 333ceaaba81..7955cf65162 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh @@ -144,7 +144,7 @@ struct IndexSubtableFormat1Or3 } IndexSubtableHeader header; - UnsizedArrayOf<Offset<OffsetType> > + UnsizedArrayOf<Offset<OffsetType>> offsetArrayZ; public: DEFINE_SIZE_ARRAY(8, offsetArrayZ); @@ -349,15 +349,15 @@ struct CBLC if (unlikely (!count)) return Null(BitmapSizeTable); - unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem); + unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem); if (!requested_ppem) requested_ppem = 1<<30; /* Choose largest strike. */ unsigned int best_i = 0; - unsigned int best_ppem = MAX (sizeTables[0].ppemX, sizeTables[0].ppemY); + unsigned int best_ppem = hb_max (sizeTables[0].ppemX, sizeTables[0].ppemY); for (unsigned int i = 1; i < count; i++) { - unsigned int ppem = MAX (sizeTables[i].ppemX, sizeTables[i].ppemY); + unsigned int ppem = hb_max (sizeTables[i].ppemX, sizeTables[i].ppemY); if ((requested_ppem <= ppem && ppem < best_ppem) || (requested_ppem > best_ppem && ppem > best_ppem)) { @@ -442,12 +442,12 @@ struct CBDT } /* Convert to font units. */ - double x_scale = upem / (double) strike.ppemX; - double y_scale = upem / (double) strike.ppemY; - extents->x_bearing = round (extents->x_bearing * x_scale); - extents->y_bearing = round (extents->y_bearing * y_scale); - extents->width = round (extents->width * x_scale); - extents->height = round (extents->height * y_scale); + float x_scale = upem / (float) strike.ppemX; + float y_scale = upem / (float) strike.ppemY; + extents->x_bearing = roundf (extents->x_bearing * x_scale); + extents->y_bearing = roundf (extents->y_bearing * y_scale); + extents->width = roundf (extents->width * x_scale); + extents->height = roundf (extents->height * y_scale); return true; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh index a57911ad0aa..90f89d5839b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh @@ -125,9 +125,9 @@ struct COLR protected: HBUINT16 version; /* Table version number (starts at 0). */ HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records. */ - LNNOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord> > + LNNOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord>> baseGlyphsZ; /* Offset to Base Glyph records. */ - LNNOffsetTo<UnsizedArrayOf<LayerRecord> > + LNNOffsetTo<UnsizedArrayOf<LayerRecord>> layersZ; /* Offset to Layer Records. */ HBUINT16 numLayers; /* Number of Layer Records. */ public: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh index 4070493504b..9ec2957ea2c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh @@ -87,15 +87,15 @@ struct CPALV1Tail } protected: - LNNOffsetTo<UnsizedArrayOf<HBUINT32> > + LNNOffsetTo<UnsizedArrayOf<HBUINT32>> paletteFlagsZ; /* Offset from the beginning of CPAL table to * the Palette Type Array. Set to 0 if no array * is provided. */ - LNNOffsetTo<UnsizedArrayOf<NameID> > + LNNOffsetTo<UnsizedArrayOf<NameID>> paletteLabelsZ; /* Offset from the beginning of CPAL table to * the palette labels array. Set to 0 if no * array is provided. */ - LNNOffsetTo<UnsizedArrayOf<NameID> > + LNNOffsetTo<UnsizedArrayOf<NameID>> colorLabelsZ; /* Offset from the beginning of CPAL table to * the color labels array. Set to 0 * if no array is provided. */ @@ -144,7 +144,7 @@ struct CPAL { hb_array_t<const BGRAColor> segment_colors = palette_colors.sub_array (start_offset, *color_count); /* Always return numColors colors per palette even if it has out-of-bounds start index. */ - unsigned int count = MIN<unsigned int> (MAX<int> (numColors - start_offset, 0), *color_count); + unsigned int count = hb_min ((unsigned) hb_max ((int) (numColors - start_offset), 0), *color_count); *color_count = count; for (unsigned int i = 0; i < count; i++) colors[i] = segment_colors[i]; /* Bound-checked read. */ @@ -176,7 +176,7 @@ struct CPAL HBUINT16 numPalettes; /* Number of palettes in the table. */ HBUINT16 numColorRecords; /* Total number of color records, combined for * all palettes. */ - LNNOffsetTo<UnsizedArrayOf<BGRAColor> > + LNNOffsetTo<UnsizedArrayOf<BGRAColor>> colorRecordsZ; /* Offset from the beginning of CPAL table to * the first ColorRecord. */ UnsizedArrayOf<HBUINT16> diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh index f6bdbb3dde0..9b725c46e74 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh @@ -121,7 +121,7 @@ struct SBIXStrike HBUINT16 resolution; /* The device pixel density (in PPI) for which this * strike was designed. (E.g., 96 PPI, 192 PPI.) */ protected: - UnsizedArrayOf<LOffsetTo<SBIXGlyph> > + UnsizedArrayOf<LOffsetTo<SBIXGlyph>> imageOffsetsZ; /* Offset from the beginning of the strike data header * to bitmap data for an individual glyph ID. */ public: @@ -175,7 +175,7 @@ struct sbix if (unlikely (!count)) return Null(SBIXStrike); - unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem); + unsigned int requested_ppem = hb_max (font->x_ppem, font->y_ppem); if (!requested_ppem) requested_ppem = 1<<30; /* Choose largest strike. */ /* TODO Add DPI sensitivity as well? */ @@ -242,11 +242,11 @@ struct sbix /* Convert to font units. */ if (strike_ppem) { - double scale = font->face->get_upem () / (double) strike_ppem; - extents->x_bearing = round (extents->x_bearing * scale); - extents->y_bearing = round (extents->y_bearing * scale); - extents->width = round (extents->width * scale); - extents->height = round (extents->height * scale); + float scale = font->face->get_upem () / (float) strike_ppem; + extents->x_bearing = roundf (extents->x_bearing * scale); + extents->y_bearing = roundf (extents->y_bearing * scale); + extents->width = roundf (extents->width * scale); + extents->height = roundf (extents->height * scale); } hb_blob_destroy (blob); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh index 6e8eddf2473..926d61e0faf 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh @@ -62,7 +62,7 @@ struct SVGDocumentIndexEntry * this index entry. */ HBUINT16 endGlyphID; /* The last glyph ID in the range described by * this index entry. Must be >= startGlyphID. */ - LNNOffsetTo<UnsizedArrayOf<HBUINT8> > + LNNOffsetTo<UnsizedArrayOf<HBUINT8>> svgDoc; /* Offset from the beginning of the SVG Document Index * to an SVG document. Must be non-zero. */ HBUINT32 svgDocLength; /* Length of the SVG document. @@ -107,7 +107,7 @@ struct SVG protected: HBUINT16 version; /* Table version (starting at 0). */ - LOffsetTo<SortedArrayOf<SVGDocumentIndexEntry> > + LOffsetTo<SortedArrayOf<SVGDocumentIndexEntry>> svgDocEntries; /* Offset (relative to the start of the SVG table) to the * SVG Documents Index. Must be non-zero. */ /* Array of SVG Document Index Entries. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc index 791135b100c..20c602cdc9b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc @@ -47,6 +47,8 @@ * @include: hb-ot.h * * Functions for fetching color-font information from OpenType font faces. + * + * HarfBuzz supports `COLR`/`CPAL`, `sbix`, `CBDT`, and `SVG` color fonts. **/ @@ -57,42 +59,54 @@ /** * hb_ot_color_has_palettes: - * @face: a font face. + * @face: #hb_face_t to work upon + * + * Tests whether a face includes a `CPAL` color-palette table. * - * Returns: whether CPAL table is available. + * Return value: true if data found, false otherwise * * Since: 2.1.0 */ hb_bool_t hb_ot_color_has_palettes (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.CPAL->has_data (); } /** * hb_ot_color_palette_get_count: - * @face: a font face. + * @face: #hb_face_t to work upon * - * Returns: the number of color palettes in @face, or zero if @face has - * no colors. + * Fetches the number of color palettes in a face. + * + * Return value: the number of palettes found * * Since: 2.1.0 */ unsigned int hb_ot_color_palette_get_count (hb_face_t *face) { +#ifdef HB_NO_COLOR + return 0; +#endif return face->table.CPAL->get_palette_count (); } /** * hb_ot_color_palette_get_name_id: - * @face: a font face. - * @palette_index: the index of the color palette whose name is being requested. + * @face: #hb_face_t to work upon + * @palette_index: The index of the color palette + * + * Fetches the `name` table Name ID that provides display names for + * a `CPAL` color palette. * - * Retrieves the name id of a color palette. For example, a color font can - * have themed palettes like "Spring", "Summer", "Fall", and "Winter". + * Palette display names can be generic (e.g., "Default") or provide + * specific, themed names (e.g., "Spring", "Summer", "Fall", and "Winter"). * - * Returns: an identifier within @face's `name` table. + * Return value: the Named ID found for the palette. * If the requested palette has no name the result is #HB_OT_NAME_ID_INVALID. * * Since: 2.1.0 @@ -101,15 +115,24 @@ hb_ot_name_id_t hb_ot_color_palette_get_name_id (hb_face_t *face, unsigned int palette_index) { +#ifdef HB_NO_COLOR + return HB_OT_NAME_ID_INVALID; +#endif return face->table.CPAL->get_palette_name_id (palette_index); } /** * hb_ot_color_palette_color_get_name_id: - * @face: a font face. - * @color_index: palette entry index. + * @face: #hb_face_t to work upon + * @color_index: The index of the color * - * Returns: Name ID associated with a palette entry, e.g. eye color + * Fetches the `name` table Name ID that provides display names for + * the specificed color in a face's `CPAL` color palette. + * + * Display names can be generic (e.g., "Background") or specific + * (e.g., "Eye color"). + * + * Return value: the Name ID found for the color. * * Since: 2.1.0 */ @@ -117,15 +140,20 @@ hb_ot_name_id_t hb_ot_color_palette_color_get_name_id (hb_face_t *face, unsigned int color_index) { +#ifdef HB_NO_COLOR + return HB_OT_NAME_ID_INVALID; +#endif return face->table.CPAL->get_color_name_id (color_index); } /** * hb_ot_color_palette_get_flags: - * @face: a font face - * @palette_index: the index of the color palette whose flags are being requested + * @face: #hb_face_t to work upon + * @palette_index: The index of the color palette + * + * Fetches the flags defined for a color palette. * - * Returns: the flags for the requested color palette. + * Return value: the #hb_ot_color_palette_flags_t of the requested color palette * * Since: 2.1.0 */ @@ -133,30 +161,30 @@ hb_ot_color_palette_flags_t hb_ot_color_palette_get_flags (hb_face_t *face, unsigned int palette_index) { +#ifdef HB_NO_COLOR + return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; +#endif return face->table.CPAL->get_palette_flags (palette_index); } /** * hb_ot_color_palette_get_colors: - * @face: a font face. - * @palette_index:the index of the color palette whose colors - * are being requested. - * @start_offset: the index of the first color being requested. - * @color_count: (inout) (optional): on input, how many colors - * can be maximally stored into the @colors array; - * on output, how many colors were actually stored. - * @colors: (array length=color_count) (out) (optional): - * an array of #hb_color_t records. After calling - * this function, @colors will be filled with - * the palette colors. If @colors is NULL, the function - * will just return the number of total colors - * without storing any actual colors; this can be used - * for allocating a buffer of suitable size before calling - * hb_ot_color_palette_get_colors() a second time. - * - * Retrieves the colors in a color palette. - * - * Returns: the total number of colors in the palette. + * @face: #hb_face_t to work upon + * @palette_index: the index of the color palette to query + * @start_offset: offset of the first color to retrieve + * @color_count: (inout) (optional): Input = the maximum number of colors to return; + * Output = the actual number of colors returned (may be zero) + * @colors: (out) (array length=color_count) (nullable): The array of #hb_color_t records found + * + * Fetches a list of the colors in a color palette. + * + * After calling this function, @colors will be filled with the palette + * colors. If @colors is NULL, the function will just return the number + * of total colors without storing any actual colors; this can be used + * for allocating a buffer of suitable size before calling + * hb_ot_color_palette_get_colors() a second time. + * + * Return value: the total number of colors in the palette * * Since: 2.1.0 */ @@ -167,6 +195,11 @@ hb_ot_color_palette_get_colors (hb_face_t *face, unsigned int *colors_count /* IN/OUT. May be NULL. */, hb_color_t *colors /* OUT. May be NULL. */) { +#ifdef HB_NO_COLOR + if (colors_count) + *colors_count = 0; + return 0; +#endif return face->table.CPAL->get_palette_colors (palette_index, start_offset, colors_count, colors); } @@ -177,28 +210,36 @@ hb_ot_color_palette_get_colors (hb_face_t *face, /** * hb_ot_color_has_layers: - * @face: a font face. + * @face: #hb_face_t to work upon * - * Returns: whether COLR table is available. + * Tests whether a face includes any `COLR` color layers. + * + * Return value: true if data found, false otherwise * * Since: 2.1.0 */ hb_bool_t hb_ot_color_has_layers (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.COLR->has_data (); } /** * hb_ot_color_glyph_get_layers: - * @face: a font face. - * @glyph: a layered color glyph id. - * @start_offset: starting offset of layers. - * @count: (inout) (optional): gets number of layers available to be written on buffer - * and returns number of written layers. - * @layers: (array length=count) (out) (optional): layers buffer to buffer. + * @face: #hb_face_t to work upon + * @glyph: The glyph index to query + * @start_offset: offset of the first layer to retrieve + * @layer_count: (inout) (optional): Input = the maximum number of layers to return; + * Output = the actual number of layers returned (may be zero) + * @layers: (out) (array length=layer_count) (nullable): The array of layers found + * + * Fetches a list of all color layers for the specified glyph index in the specified + * face. The list returned will begin at the offset provided. * - * Returns: Total number of layers a layered color glyph have. + * Return value: Total number of layers available for the glyph index queried * * Since: 2.1.0 */ @@ -206,10 +247,15 @@ unsigned int hb_ot_color_glyph_get_layers (hb_face_t *face, hb_codepoint_t glyph, unsigned int start_offset, - unsigned int *count, /* IN/OUT. May be NULL. */ + unsigned int *layer_count, /* IN/OUT. May be NULL. */ hb_ot_color_layer_t *layers /* OUT. May be NULL. */) { - return face->table.COLR->get_glyph_layers (glyph, start_offset, count, layers); +#ifdef HB_NO_COLOR + if (layer_count) + *layer_count = 0; + return 0; +#endif + return face->table.COLR->get_glyph_layers (glyph, start_offset, layer_count, layers); } @@ -219,34 +265,40 @@ hb_ot_color_glyph_get_layers (hb_face_t *face, /** * hb_ot_color_has_svg: - * @face: a font face. + * @face: #hb_face_t to work upon. * - * Check whether @face has SVG glyph images. + * Tests whether a face includes any `SVG` glyph images. * - * Returns true if available, false otherwise. + * Return value: true if data found, false otherwise. * * Since: 2.1.0 */ hb_bool_t hb_ot_color_has_svg (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.SVG->has_data (); } /** * hb_ot_color_glyph_reference_svg: - * @face: a font face. - * @glyph: a svg glyph index. + * @face: #hb_face_t to work upon + * @glyph: a svg glyph index * - * Get SVG document for a glyph. The blob may be either plain text or gzip-encoded. + * Fetches the SVG document for a glyph. The blob may be either plain text or gzip-encoded. * - * Returns: (transfer full): respective svg blob of the glyph, if available. + * Return value: (transfer full): An #hb_blob_t containing the SVG document of the glyph, if available * * Since: 2.1.0 */ hb_blob_t * hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) { +#ifdef HB_NO_COLOR + return hb_blob_get_empty (); +#endif return face->table.SVG->reference_blob_for_glyph (glyph); } @@ -257,36 +309,43 @@ hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) /** * hb_ot_color_has_png: - * @face: a font face. + * @face: #hb_face_t to work upon * - * Check whether @face has PNG glyph images (either CBDT or sbix tables). + * Tests whether a face has PNG glyph images (either in `CBDT` or `sbix` tables). * - * Returns true if available, false otherwise. + * Return value: true if data found, false otherwise * * Since: 2.1.0 */ hb_bool_t hb_ot_color_has_png (hb_face_t *face) { +#ifdef HB_NO_COLOR + return false; +#endif return face->table.CBDT->has_data () || face->table.sbix->has_data (); } /** * hb_ot_color_glyph_reference_png: - * @font: a font object, not face. upem should be set on - * that font object if one wants to get optimal png blob, otherwise - * return the biggest one - * @glyph: a glyph index. + * @font: #hb_font_t to work upon + * @glyph: a glyph index * - * Get PNG image for a glyph. + * Fetches the PNG image for a glyph. This function takes a font object, not a face object, + * as input. To get an optimally sized PNG blob, the UPEM value must be set on the @font + * object. If UPEM is unset, the blob returned will be the largest PNG available. * - * Returns: (transfer full): respective PNG blob of the glyph, if available. + * Return value: (transfer full): An #hb_blob_t containing the PNG image for the glyph, if available * * Since: 2.1.0 */ hb_blob_t * hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph) { +#ifdef HB_NO_COLOR + return hb_blob_get_empty (); +#endif + hb_blob_t *blob = hb_blob_get_empty (); if (font->face->table.sbix->has_data ()) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h index 49646bf3ac2..63ef20a1a08 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h @@ -59,11 +59,11 @@ hb_ot_color_palette_color_get_name_id (hb_face_t *face, /** * hb_ot_color_palette_flags_t: - * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special + * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: Default indicating that there is nothing special * to note about a color palette. - * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: flag indicating that the color + * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: Flag indicating that the color * palette is appropriate to use when displaying the font on a light background such as white. - * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: flag indicating that the color + * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: Flag indicating that the color * palette is appropriate to use when displaying the font on a dark background such as black. * * Since: 2.1.0 @@ -110,7 +110,7 @@ HB_EXTERN unsigned int hb_ot_color_glyph_get_layers (hb_face_t *face, hb_codepoint_t glyph, unsigned int start_offset, - unsigned int *count, /* IN/OUT. May be NULL. */ + unsigned int *layer_count, /* IN/OUT. May be NULL. */ hb_ot_color_layer_t *layers /* OUT. May be NULL. */); /* diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc index 94a9fdc479f..3344c4b6bfe 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc @@ -180,15 +180,20 @@ hb_ot_get_glyph_extents (hb_font_t *font, void *user_data HB_UNUSED) { const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; - bool ret = ot_face->sbix->get_extents (font, glyph, extents); - if (!ret) - ret = ot_face->glyf->get_extents (glyph, extents); - if (!ret) - ret = ot_face->cff1->get_extents (glyph, extents); - if (!ret) - ret = ot_face->cff2->get_extents (font, glyph, extents); - if (!ret) - ret = ot_face->CBDT->get_extents (font, glyph, extents); + bool ret = false; + +#if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR) + if (!ret) ret = ot_face->sbix->get_extents (font, glyph, extents); +#endif + if (!ret) ret = ot_face->glyf->get_extents (glyph, extents); +#ifndef HB_NO_OT_FONT_CFF + if (!ret) ret = ot_face->cff1->get_extents (glyph, extents); + if (!ret) ret = ot_face->cff2->get_extents (font, glyph, extents); +#endif +#if !defined(HB_NO_OT_FONT_BITMAP) && !defined(HB_NO_COLOR) + if (!ret) ret = ot_face->CBDT->get_extents (font, glyph, extents); +#endif + // TODO Hook up side-bearings variations. extents->x_bearing = font->em_scale_x (extents->x_bearing); extents->y_bearing = font->em_scale_y (extents->y_bearing); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh index c2b38b05bae..6113dbcf89a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh @@ -21,7 +21,7 @@ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * - * Google Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod, Garret Rieger, Roderick Sheeter */ #ifndef HB_OT_GLYF_TABLE_HH @@ -29,7 +29,6 @@ #include "hb-open-type.hh" #include "hb-ot-head-table.hh" -#include "hb-subset-glyf.hh" namespace OT { @@ -58,7 +57,7 @@ struct loca public: DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always * check the size externally, allow Null() object of it by - * defining it MIN() instead. */ + * defining it _MIN instead. */ }; @@ -81,26 +80,169 @@ struct glyf return_trace (true); } - bool subset (hb_subset_plan_t *plan) const + template<typename Iterator, + hb_requires (hb_is_source_of (Iterator, unsigned int))> + static bool + _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets) + { + unsigned int max_offset = + padded_offsets | hb_reduce (hb_max, 0); + unsigned num_offsets = padded_offsets.len () + 1; + bool use_short_loca = max_offset < 0x1FFFF; + unsigned entry_size = use_short_loca ? 2 : 4; + char *loca_prime_data = (char *) calloc (entry_size, num_offsets); + + if (unlikely (!loca_prime_data)) return false; + + if (use_short_loca) + _write_loca (padded_offsets, 1, hb_array ((HBUINT16*) loca_prime_data, num_offsets)); + else + _write_loca (padded_offsets, 0, hb_array ((HBUINT32*) loca_prime_data, num_offsets)); + + hb_blob_t * loca_blob = hb_blob_create (loca_prime_data, + entry_size * num_offsets, + HB_MEMORY_MODE_WRITABLE, + loca_prime_data, + free); + + bool result = plan->add_table (HB_OT_TAG_loca, loca_blob) + && _add_head_and_set_loca_version(plan, use_short_loca); + + hb_blob_destroy (loca_blob); + return result; + } + + template<typename IteratorIn, typename IteratorOut, + hb_requires (hb_is_source_of (IteratorIn, unsigned int)), + hb_requires (hb_is_sink_of (IteratorOut, unsigned))> + static void + _write_loca (IteratorIn it, unsigned right_shift, IteratorOut dest) + { + unsigned int offset = 0; + dest << 0; + + it + | hb_map ([=, &offset] (unsigned int padded_size) { + offset += padded_size; + DEBUG_MSG(SUBSET, nullptr, "loca entry offset %d", offset); + return offset >> right_shift; + }) + | hb_sink (dest) + ; + } + + // requires source of SubsetGlyph complains the identifier isn't declared + template <typename Iterator> + bool serialize(hb_serialize_context_t *c, + Iterator it, + const hb_subset_plan_t *plan) + { + TRACE_SERIALIZE (this); + + + it + | hb_apply ([=] (const SubsetGlyph& _) { _.serialize (c, plan); }) + ; + + return_trace (true); + } + + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + + glyf *glyf_prime = c->serializer->start_embed <glyf> (); + if (unlikely (!c->serializer->check_success (glyf_prime))) return_trace (false); + + // Byte region(s) per glyph to output + // unpadded, hints removed if so requested + // If we fail to process a glyph we produce an empty (0-length) glyph + hb_vector_t<SubsetGlyph> glyphs; + _populate_subset_glyphs (c->plan, &glyphs); + + glyf_prime->serialize (c->serializer, hb_iter (glyphs), c->plan); + + auto padded_offsets = + + hb_iter (glyphs) + | hb_map (&SubsetGlyph::padded_size) + ; + + return_trace (c->serializer->check_success (_add_loca_and_head (c->plan, padded_offsets))); + } + + template <typename SubsetGlyph> + void + _populate_subset_glyphs (const hb_subset_plan_t * plan, + hb_vector_t<SubsetGlyph> * glyphs /* OUT */) const + { + OT::glyf::accelerator_t glyf; + glyf.init (plan->source); + + + hb_range (plan->num_output_glyphs ()) + | hb_map ([&] (hb_codepoint_t new_gid) { + SubsetGlyph subset_glyph; + subset_glyph.new_gid = new_gid; + + // should never fail: all old gids should be mapped + if (!plan->old_gid_for_new_gid (new_gid, &subset_glyph.old_gid)) return subset_glyph; + + subset_glyph.source_glyph = glyf.bytes_for_glyph ((const char *) this, subset_glyph.old_gid); + if (plan->drop_hints) subset_glyph.drop_hints (glyf); + else subset_glyph.dest_start = subset_glyph.source_glyph; + + return subset_glyph; + }) + | hb_sink (glyphs) + ; + + glyf.fini(); + } + + static void + _fix_component_gids (const hb_subset_plan_t *plan, + hb_bytes_t glyph) { - hb_blob_t *glyf_prime = nullptr; - hb_blob_t *loca_prime = nullptr; - - bool success = true; - bool use_short_loca = false; - if (hb_subset_glyf_and_loca (plan, &use_short_loca, &glyf_prime, &loca_prime)) { - success = success && plan->add_table (HB_OT_TAG_glyf, glyf_prime); - success = success && plan->add_table (HB_OT_TAG_loca, loca_prime); - success = success && _add_head_and_set_loca_version (plan, use_short_loca); - } else { - success = false; + OT::glyf::CompositeGlyphHeader::Iterator iterator; + if (OT::glyf::CompositeGlyphHeader::get_iterator (&glyph, + glyph.length, + &iterator)) + { + do + { + hb_codepoint_t new_gid; + if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex, + &new_gid)) + continue; + ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex = new_gid; + } while (iterator.move_to_next ()); } - hb_blob_destroy (loca_prime); - hb_blob_destroy (glyf_prime); + } - return success; + static void + _zero_instruction_length (hb_bytes_t glyph) + { + const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (&glyph, 0); + int16_t num_contours = (int16_t) glyph_header.numberOfContours; + if (num_contours <= 0) return; // only for simple glyphs + + const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (&glyph, GlyphHeader::static_size + 2 * num_contours); + (HBUINT16 &) instruction_length = 0; } + static bool _remove_composite_instruction_flag (hb_bytes_t glyph) + { + const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (&glyph, 0); + if (glyph_header.numberOfContours >= 0) return true; // only for composites + + /* remove WE_HAVE_INSTRUCTIONS from flags in dest */ + OT::glyf::CompositeGlyphHeader::Iterator composite_it; + if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (&glyph, glyph.length, &composite_it))) return false; + const OT::glyf::CompositeGlyphHeader *composite_header; + do { + composite_header = composite_it.current; + OT::HBUINT16 *flags = const_cast<OT::HBUINT16 *> (&composite_header->flags); + *flags = (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS; + } while (composite_it.move_to_next ()); + return true; +} + static bool _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) { @@ -112,7 +254,7 @@ struct glyf return false; head *head_prime = (head *) hb_blob_get_data_writable (head_prime_blob, nullptr); - head_prime->indexToLocFormat.set (use_short_loca ? 0 : 1); + head_prime->indexToLocFormat = use_short_loca ? 0 : 1; bool success = plan->add_table (HB_OT_TAG_head, head_prime_blob); hb_blob_destroy (head_prime_blob); @@ -171,6 +313,7 @@ struct glyf return size; } + // TODO rewrite using new iterator framework if possible struct Iterator { const char *glyph_start; @@ -241,7 +384,7 @@ struct glyf loca_table = hb_sanitize_context_t ().reference_table<loca> (face); glyf_table = hb_sanitize_context_t ().reference_table<glyf> (face); - num_glyphs = MAX (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1; + num_glyphs = hb_max (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1; } void fini () @@ -283,7 +426,7 @@ struct glyf /* based on FontTools _g_l_y_f.py::trim */ bool remove_padding (unsigned int start_offset, - unsigned int *end_offset) const + unsigned int *end_offset) const { if (*end_offset - start_offset < GlyphHeader::static_size) return true; @@ -381,61 +524,55 @@ struct glyf return true; } - bool get_instruction_offsets (unsigned int start_offset, - unsigned int end_offset, - unsigned int *instruction_start /* OUT */, - unsigned int *instruction_end /* OUT */) const + bool get_instruction_length (hb_bytes_t glyph, + unsigned int * length /* OUT */) const { - if (end_offset - start_offset < GlyphHeader::static_size) + /* Empty glyph; no instructions. */ + if (glyph.length < GlyphHeader::static_size) { - *instruction_start = 0; - *instruction_end = 0; - return true; /* Empty glyph; no instructions. */ + *length = 0; + // only 0 byte glyphs are healthy when missing GlyphHeader + return glyph.length == 0; } - const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset); + const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (&glyph, 0); int16_t num_contours = (int16_t) glyph_header.numberOfContours; if (num_contours < 0) { + unsigned int start = glyph.length; + unsigned int end = glyph.length; + unsigned int glyph_offset = &glyph - glyf_table; CompositeGlyphHeader::Iterator composite_it; - if (unlikely (!CompositeGlyphHeader::get_iterator ( - (const char*) this->glyf_table + start_offset, - end_offset - start_offset, &composite_it))) return false; + if (unlikely (!CompositeGlyphHeader::get_iterator (&glyph, glyph.length, &composite_it))) return false; const CompositeGlyphHeader *last; do { last = composite_it.current; } while (composite_it.move_to_next ()); if ((uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS) - *instruction_start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size (); - else - *instruction_start = end_offset; - *instruction_end = end_offset; - if (unlikely (*instruction_start > *instruction_end)) + start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size () - glyph_offset; + if (unlikely (start > end)) { - DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset); + DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside %d byte buffer", start, glyph.length); return false; } + *length = end - start; } else { - unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours; - if (unlikely (instruction_length_offset + 2 > end_offset)) + unsigned int instruction_length_offset = GlyphHeader::static_size + 2 * num_contours; + if (unlikely (instruction_length_offset + 2 > glyph.length)) { DEBUG_MSG(SUBSET, nullptr, "Glyph size is too short, missing field instructionLength."); return false; } - const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (glyf_table, instruction_length_offset); - unsigned int start = instruction_length_offset + 2; - unsigned int end = start + (uint16_t) instruction_length; - if (unlikely (end > end_offset)) // Out of bounds of the current glyph + const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (&glyph, instruction_length_offset); + if (unlikely (instruction_length_offset + instruction_length > glyph.length)) // Out of bounds of the current glyph { DEBUG_MSG(SUBSET, nullptr, "The instructions array overruns the glyph's boundaries."); return false; } - - *instruction_start = start; - *instruction_end = end; + *length = (uint16_t) instruction_length; } return true; } @@ -451,14 +588,33 @@ struct glyf const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset); - extents->x_bearing = MIN (glyph_header.xMin, glyph_header.xMax); - extents->y_bearing = MAX (glyph_header.yMin, glyph_header.yMax); - extents->width = MAX (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing; - extents->height = MIN (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing; + extents->x_bearing = hb_min (glyph_header.xMin, glyph_header.xMax); + extents->y_bearing = hb_max (glyph_header.yMin, glyph_header.yMax); + extents->width = hb_max (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing; + extents->height = hb_min (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing; return true; } + hb_bytes_t bytes_for_glyph (const char * glyf, hb_codepoint_t gid) + { + unsigned int start_offset, end_offset; + if (unlikely (!(get_offsets (gid, &start_offset, &end_offset) && + remove_padding (start_offset, &end_offset)))) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to get offset or remove padding for %d", gid); + return hb_bytes_t (); + } + hb_bytes_t glyph = hb_bytes_t (glyf + start_offset, end_offset - start_offset); + if (glyph.length == 0) return glyph; + if (unlikely (glyph.length < GlyphHeader::static_size)) + { + DEBUG_MSG(SUBSET, nullptr, "Glyph size smaller than minimum header %d", gid); + return hb_bytes_t (); + } + return glyph; + } + private: bool short_offset; unsigned int num_glyphs; @@ -466,12 +622,99 @@ struct glyf hb_blob_ptr_t<glyf> glyf_table; }; + + struct SubsetGlyph + { + hb_codepoint_t new_gid; + hb_codepoint_t old_gid; + hb_bytes_t source_glyph; + hb_bytes_t dest_start; // region of source_glyph to copy first + hb_bytes_t dest_end; // region of source_glyph to copy second + + + bool serialize (hb_serialize_context_t *c, + const hb_subset_plan_t *plan) const + { + TRACE_SERIALIZE (this); + + hb_bytes_t dest_glyph = dest_start.copy(c); + dest_glyph = hb_bytes_t (&dest_glyph, dest_glyph.length + dest_end.copy(c).length); + unsigned int pad_length = padding (); + DEBUG_MSG(SUBSET, nullptr, "serialize %d byte glyph, width %d pad %d", dest_glyph.length, dest_glyph.length + pad_length, pad_length); + + HBUINT8 pad; + pad = 0; + while (pad_length > 0) + { + c->embed(pad); + pad_length--; + } + + if (dest_glyph.length) + { + _fix_component_gids (plan, dest_glyph); + if (plan->drop_hints) + { + _zero_instruction_length (dest_glyph); + c->check_success (_remove_composite_instruction_flag (dest_glyph)); + } + } + + return_trace (true); + } + + void drop_hints (const OT::glyf::accelerator_t& glyf) + { + if (source_glyph.length == 0) return; + + unsigned int instruction_length = 0; + if (!glyf.get_instruction_length (source_glyph, &instruction_length)) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to read instruction length for new_gid %d", new_gid); + return ; + } + + const GlyphHeader& header = StructAtOffset<GlyphHeader> (&source_glyph, 0); + int16_t num_contours = (int16_t) header.numberOfContours; + DEBUG_MSG(SUBSET, nullptr, "new_gid %d (%d contours) drop %d instruction bytes from %d byte source glyph", new_gid, num_contours, instruction_length, source_glyph.length); + if (num_contours < 0) + { + // composite, just chop instructions off the end + dest_start = hb_bytes_t (&source_glyph, source_glyph.length - instruction_length); + } + else + { + // simple glyph + dest_start = hb_bytes_t (&source_glyph, GlyphHeader::static_size + 2 * header.numberOfContours + 2); + dest_end = hb_bytes_t (&source_glyph + dest_start.length + instruction_length, + source_glyph.length - dest_start.length - instruction_length); +DEBUG_MSG(SUBSET, nullptr, "source_len %d start len %d instruction_len %d end len %d", source_glyph.length, dest_start.length, instruction_length, dest_end.length); + } + } + + unsigned int length () const + { + return dest_start.length + dest_end.length; + } + + // pad to 2 to ensure 2-byte loca will be ok + unsigned int padding () const + { + return length () % 2; + } + + unsigned int padded_size () const + { + return length () + padding (); + } + }; + protected: UnsizedArrayOf<HBUINT8> dataZ; /* Glyphs data. */ public: DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always * check the size externally, allow Null() object of it by - * defining it MIN() instead. */ + * defining it _MIN instead. */ }; struct glyf_accelerator_t : glyf::accelerator_t {}; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh index 953ccab80ef..96c1d1f634f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh @@ -41,71 +41,31 @@ namespace OT { struct DeviceRecord { - struct SubsetView - { - const DeviceRecord *source_device_record; - unsigned int sizeDeviceRecord; - hb_subset_plan_t *subset_plan; - - void init (const DeviceRecord *source_device_record, - unsigned int sizeDeviceRecord, - hb_subset_plan_t *subset_plan) - { - this->source_device_record = source_device_record; - this->sizeDeviceRecord = sizeDeviceRecord; - this->subset_plan = subset_plan; - } - - unsigned int len () const - { return this->subset_plan->num_output_glyphs (); } - - const HBUINT8* operator [] (unsigned int new_gid) const - { - if (unlikely (new_gid >= len ())) return nullptr; - - hb_codepoint_t old_gid; - if (!this->subset_plan->old_gid_for_new_gid (new_gid, &old_gid)) - return &Null(HBUINT8); - - if (old_gid >= sizeDeviceRecord - DeviceRecord::min_size) - return nullptr; - return &(this->source_device_record->widthsZ[old_gid]); - } - }; - - static unsigned int get_size (unsigned int count) + static unsigned int get_size (unsigned count) { return hb_ceil_to_4 (min_size + count * HBUINT8::static_size); } - bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view) + template<typename Iterator, + hb_requires (hb_is_iterator (Iterator))> + bool serialize (hb_serialize_context_t *c, unsigned pixelSize, Iterator it) { TRACE_SERIALIZE (this); - unsigned int size = get_size (subset_view.len ()); - if (unlikely (!c->allocate_size<DeviceRecord> (size))) - { - DEBUG_MSG(SUBSET, nullptr, "Couldn't allocate enough space for DeviceRecord: %d.", - size); - return_trace (false); - } - - this->pixelSize.set (subset_view.source_device_record->pixelSize); - this->maxWidth.set (subset_view.source_device_record->maxWidth); - - for (unsigned int i = 0; i < subset_view.len (); i++) - { - const HBUINT8 *width = subset_view[i]; - if (!width) - { - DEBUG_MSG(SUBSET, nullptr, "HDMX width for new gid %d is missing.", i); - return_trace (false); - } - widthsZ[i].set (*width); - } + unsigned length = it.len (); + + if (unlikely (!c->extend (*this, length))) return_trace (false); + + this->pixelSize = pixelSize; + this->maxWidth = + + it + | hb_reduce (hb_max, 0u); + + + it + | hb_sink (widthsZ.as_array (length)); return_trace (true); } - bool sanitize (hb_sanitize_context_t *c, unsigned int sizeDeviceRecord) const + bool sanitize (hb_sanitize_context_t *c, unsigned sizeDeviceRecord) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && @@ -135,62 +95,63 @@ struct hdmx return StructAtOffset<DeviceRecord> (&this->firstDeviceRecord, i * sizeDeviceRecord); } - bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan) + template<typename Iterator, + hb_requires (hb_is_iterator (Iterator))> + bool serialize (hb_serialize_context_t *c, unsigned version, Iterator it) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min ((*this)))) return_trace (false); - this->version.set (source_hdmx->version); - this->numRecords.set (source_hdmx->numRecords); - this->sizeDeviceRecord.set (DeviceRecord::get_size (plan->num_output_glyphs ())); + this->version = version; + this->numRecords = it.len (); + this->sizeDeviceRecord = DeviceRecord::get_size (it ? (*it).second.len () : 0); - for (unsigned int i = 0; i < source_hdmx->numRecords; i++) - { - DeviceRecord::SubsetView subset_view; - subset_view.init (&(*source_hdmx)[i], source_hdmx->sizeDeviceRecord, plan); + + it + | hb_apply ([c] (const hb_item_type<Iterator>& _) { + c->start_embed<DeviceRecord> ()->serialize (c, _.first, _.second); + }) + ; - if (!c->start_embed<DeviceRecord> ()->serialize (c, subset_view)) - return_trace (false); - } - - return_trace (true); + return_trace (c->successful); } - static size_t get_subsetted_size (const hdmx *source_hdmx, hb_subset_plan_t *plan) + + bool subset (hb_subset_context_t *c) const { - return min_size + source_hdmx->numRecords * DeviceRecord::get_size (plan->num_output_glyphs ()); + TRACE_SUBSET (this); + + hdmx *hdmx_prime = c->serializer->start_embed <hdmx> (); + if (unlikely (!hdmx_prime)) return_trace (false); + + auto it = + + hb_range ((unsigned) numRecords) + | hb_map ([c, this] (unsigned _) + { + const DeviceRecord *device_record = + &StructAtOffset<DeviceRecord> (&firstDeviceRecord, + _ * sizeDeviceRecord); + auto row = + + hb_range (c->plan->num_output_glyphs ()) + | hb_map (c->plan->reverse_glyph_map) + | hb_map ([=] (hb_codepoint_t _) + { + if (c->plan->is_empty_glyph (_)) + return Null(HBUINT8); + return device_record->widthsZ.as_array (get_num_glyphs ()) [_]; + }) + ; + return hb_pair ((unsigned) device_record->pixelSize, +row); + }) + ; + + hdmx_prime->serialize (c->serializer, version, it); + return_trace (true); } - bool subset (hb_subset_plan_t *plan) const + unsigned get_num_glyphs () const { - size_t dest_size = get_subsetted_size (this, plan); - hdmx *dest = (hdmx *) malloc (dest_size); - if (unlikely (!dest)) - { - DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for hdmx subset output.", (unsigned long) dest_size); - return false; - } - - hb_serialize_context_t c (dest, dest_size); - hdmx *hdmx_prime = c.start_serialize<hdmx> (); - if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan)) - { - free (dest); - DEBUG_MSG(SUBSET, nullptr, "Failed to serialize write new hdmx."); - return false; - } - c.end_serialize (); - - hb_blob_t *hdmx_prime_blob = hb_blob_create ((const char *) dest, - dest_size, - HB_MEMORY_MODE_READONLY, - dest, - free); - bool result = plan->add_table (HB_OT_TAG_hdmx, hdmx_prime_blob); - hb_blob_destroy (hdmx_prime_blob); - - return result; + return sizeDeviceRecord - DeviceRecord::min_size; } bool sanitize (hb_sanitize_context_t *c) const diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh index 9ef1f57168d..b3a97109b87 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh @@ -78,7 +78,7 @@ struct hmtxvmtx unsigned int length; H *table = (H *) hb_blob_get_data (dest_blob, &length); - table->numberOfLongMetrics.set (num_hmetrics); + table->numberOfLongMetrics = num_hmetrics; bool result = plan->add_table (H::tableTag, dest_blob); hb_blob_destroy (dest_blob); @@ -128,12 +128,12 @@ struct hmtxvmtx bool has_advance = i < num_advances; if (has_advance) { - ((LongMetric *) dest_pos)->advance.set (advance); - ((LongMetric *) dest_pos)->sb.set (side_bearing); + ((LongMetric *) dest_pos)->advance = advance; + ((LongMetric *) dest_pos)->sb = side_bearing; } else { - ((FWORD *) dest_pos)->set (side_bearing); + *((FWORD *) dest_pos) = side_bearing; } dest_pos += (has_advance ? 4 : 2); } @@ -240,7 +240,7 @@ struct hmtxvmtx return default_advance; } - return table->longMetricZ[MIN (glyph, (uint32_t) num_advances - 1)].advance; + return table->longMetricZ[hb_min (glyph, (uint32_t) num_advances - 1)].advance; } unsigned int get_advance (hb_codepoint_t glyph, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh index ec6a3c84c2b..ae2bcc92d1b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh @@ -47,9 +47,9 @@ struct KernSubTableFormat3 int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { hb_array_t<const FWORD> kernValue = kernValueZ.as_array (kernValueCount); - hb_array_t<const HBUINT8> leftClass = StructAfter<const UnsizedArrayOf<HBUINT8> > (kernValue).as_array (glyphCount); - hb_array_t<const HBUINT8> rightClass = StructAfter<const UnsizedArrayOf<HBUINT8> > (leftClass).as_array (glyphCount); - hb_array_t<const HBUINT8> kernIndex = StructAfter<const UnsizedArrayOf<HBUINT8> > (rightClass).as_array (leftClassCount * rightClassCount); + hb_array_t<const HBUINT8> leftClass = StructAfter<const UnsizedArrayOf<HBUINT8>> (kernValue).as_array (glyphCount); + hb_array_t<const HBUINT8> rightClass = StructAfter<const UnsizedArrayOf<HBUINT8>> (leftClass).as_array (glyphCount); + hb_array_t<const HBUINT8> kernIndex = StructAfter<const UnsizedArrayOf<HBUINT8>> (rightClass).as_array (leftClassCount * rightClassCount); unsigned int leftC = leftClass[left]; unsigned int rightC = rightClass[right]; @@ -121,16 +121,20 @@ struct KernSubTable } } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { case 0: return_trace (c->dispatch (u.format0)); - case 1: return_trace (u.header.apple ? c->dispatch (u.format1) : c->default_return_value ()); +#ifndef HB_NO_SHAPE_AAT + case 1: return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward<Ts> (ds)...) : c->default_return_value ()); +#endif case 2: return_trace (c->dispatch (u.format2)); - case 3: return_trace (u.header.apple ? c->dispatch (u.format3) : c->default_return_value ()); +#ifndef HB_NO_SHAPE_AAT + case 3: return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward<Ts> (ds)...) : c->default_return_value ()); +#endif default: return_trace (c->default_return_value ()); } } @@ -278,7 +282,9 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_state_machine (); +#ifndef HB_NO_SHAPE_AAT case 1: return u.aat.has_state_machine (); +#endif default:return false; } } @@ -287,7 +293,9 @@ struct kern { switch (get_type ()) { case 0: return u.ot.has_cross_stream (); +#ifndef HB_NO_SHAPE_AAT case 1: return u.aat.has_cross_stream (); +#endif default:return false; } } @@ -296,7 +304,9 @@ struct kern { switch (get_type ()) { case 0: return u.ot.get_h_kerning (left, right); +#ifndef HB_NO_SHAPE_AAT case 1: return u.aat.get_h_kerning (left, right); +#endif default:return 0; } } @@ -304,14 +314,16 @@ struct kern bool apply (AAT::hb_aat_apply_context_t *c) const { return dispatch (c); } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); switch (subtable_type) { - case 0: return_trace (c->dispatch (u.ot)); - case 1: return_trace (c->dispatch (u.aat)); + case 0: return_trace (c->dispatch (u.ot, hb_forward<Ts> (ds)...)); +#ifndef HB_NO_SHAPE_AAT + case 1: return_trace (c->dispatch (u.aat, hb_forward<Ts> (ds)...)); +#endif default: return_trace (c->default_return_value ()); } } @@ -328,7 +340,9 @@ struct kern HBUINT32 version32; HBUINT16 major; KernOT ot; +#ifndef HB_NO_SHAPE_AAT KernAAT aat; +#endif } u; public: DEFINE_SIZE_UNION (4, version32); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh index dd0fba1ff40..0912362941a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh @@ -153,7 +153,7 @@ struct BaseCoord struct FeatMinMaxRecord { - static int cmp (const void *key_, const void *entry_) + HB_INTERNAL static int cmp (const void *key_, const void *entry_) { hb_tag_t key = * (hb_tag_t *) key_; const FeatMinMaxRecord &entry = * (const FeatMinMaxRecord *) entry_; @@ -271,7 +271,7 @@ struct BaseValues struct BaseLangSysRecord { - static int cmp (const void *key_, const void *entry_) + HB_INTERNAL static int cmp (const void *key_, const void *entry_) { hb_tag_t key = * (hb_tag_t *) key_; const BaseLangSysRecord &entry = * (const BaseLangSysRecord *) entry_; @@ -345,7 +345,7 @@ struct BaseScript struct BaseScriptList; struct BaseScriptRecord { - static int cmp (const void *key_, const void *entry_) + HB_INTERNAL static int cmp (const void *key_, const void *entry_) { hb_tag_t key = * (hb_tag_t *) key_; const BaseScriptRecord &entry = * (const BaseScriptRecord *) entry_; @@ -447,7 +447,7 @@ struct Axis } protected: - OffsetTo<SortedArrayOf<Tag> > + OffsetTo<SortedArrayOf<Tag>> baseTagList; /* Offset to BaseTagList table, from beginning * of Axis table (may be NULL) * Array of 4-byte baseline identification tags — must diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh index 9b172257bca..bd728ecad6c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh @@ -66,7 +66,6 @@ namespace OT { #define NOT_COVERED ((unsigned int) -1) - /* * * OpenType Layout Common Table Formats @@ -104,7 +103,7 @@ struct Record }; template <typename Type> -struct RecordArrayOf : SortedArrayOf<Record<Type> > +struct RecordArrayOf : SortedArrayOf<Record<Type>> { const OffsetTo<Type>& get_offset (unsigned int i) const { return (*this)[i].offset; } @@ -139,7 +138,7 @@ struct RecordListOf : RecordArrayOf<Type> bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct RecordListOf<Type> *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); unsigned int count = this->len; for (unsigned int i = 0; i < count; i++) @@ -227,13 +226,13 @@ struct LangSys { if (reqFeatureIndex == 0xFFFFu) return Index::NOT_FOUND_INDEX; - return reqFeatureIndex;; + return reqFeatureIndex; } - bool subset (hb_subset_context_t *c) const + LangSys* copy (hb_serialize_context_t *c) const { - TRACE_SUBSET (this); - return_trace (c->serializer->embed (*this)); + TRACE_SERIALIZE (this); + return_trace (c->embed (*this)); } bool sanitize (hb_sanitize_context_t *c, @@ -278,12 +277,12 @@ struct Script bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct Script *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); - out->defaultLangSys.serialize_subset (c, this+defaultLangSys, out); + out->defaultLangSys.serialize_copy (c->serializer, this+defaultLangSys, out); unsigned int count = langSys.len; for (unsigned int i = 0; i < count; i++) - out->langSys.arrayZ[i].offset.serialize_subset (c, this+langSys[i].offset, out); + out->langSys.arrayZ[i].offset.serialize_copy (c->serializer, this+langSys[i].offset, out); return_trace (true); } @@ -560,9 +559,9 @@ struct Feature bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct Feature *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); - out->featureParams.set (0); /* TODO(subset) FeatureParams. */ + out->featureParams = 0; /* TODO(subset) FeatureParams. */ return_trace (true); } @@ -584,25 +583,25 @@ struct Feature * Adobe tools, only the 'size' feature had FeatureParams defined. */ - OffsetTo<FeatureParams> orig_offset = featureParams; + if (likely (featureParams.is_null ())) + return_trace (true); + + unsigned int orig_offset = featureParams; if (unlikely (!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))) return_trace (false); - if (likely (orig_offset.is_null ())) - return_trace (true); - if (featureParams == 0 && closure && closure->tag == HB_TAG ('s','i','z','e') && closure->list_base && closure->list_base < this) { - unsigned int new_offset_int = (unsigned int) orig_offset - + unsigned int new_offset_int = orig_offset - (((char *) this) - ((char *) closure->list_base)); OffsetTo<FeatureParams> new_offset; - /* Check that it did not overflow. */ - new_offset.set (new_offset_int); + /* Check that it would not overflow. */ + new_offset = new_offset_int; if (new_offset == new_offset_int && - c->try_set (&featureParams, new_offset) && + c->try_set (&featureParams, new_offset_int) && !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)) return_trace (false); } @@ -649,15 +648,18 @@ struct Lookup unsigned int get_subtable_count () const { return subTable.len; } template <typename TSubTable> - const TSubTable& get_subtable (unsigned int i) const - { return this+CastR<OffsetArrayOf<TSubTable> > (subTable)[i]; } - - template <typename TSubTable> const OffsetArrayOf<TSubTable>& get_subtables () const - { return CastR<OffsetArrayOf<TSubTable> > (subTable); } + { return CastR<OffsetArrayOf<TSubTable>> (subTable); } template <typename TSubTable> OffsetArrayOf<TSubTable>& get_subtables () - { return CastR<OffsetArrayOf<TSubTable> > (subTable); } + { return CastR<OffsetArrayOf<TSubTable>> (subTable); } + + template <typename TSubTable> + const TSubTable& get_subtable (unsigned int i) const + { return this+get_subtables<TSubTable> ()[i]; } + template <typename TSubTable> + TSubTable& get_subtable (unsigned int i) + { return this+get_subtables<TSubTable> ()[i]; } unsigned int get_size () const { @@ -683,14 +685,14 @@ struct Lookup return flag; } - template <typename TSubTable, typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename TSubTable, typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) 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<TSubTable> (i).dispatch (c, lookup_type); + typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, hb_forward<Ts> (ds)...); if (c->stop_sublookup_iteration (r)) return_trace (r); } @@ -704,40 +706,23 @@ struct Lookup { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - lookupType.set (lookup_type); - lookupFlag.set (lookup_props & 0xFFFFu); + lookupType = lookup_type; + lookupFlag = lookup_props & 0xFFFFu; if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false); if (lookupFlag & LookupFlag::UseMarkFilteringSet) { if (unlikely (!c->extend (*this))) return_trace (false); HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable); - markFilteringSet.set (lookup_props >> 16); + markFilteringSet = lookup_props >> 16; } return_trace (true); } - /* Older compilers need this to NOT be locally defined in a function. */ - template <typename TSubTable> - struct SubTableSubsetWrapper - { - SubTableSubsetWrapper (const TSubTable &subtable_, - unsigned int lookup_type_) : - subtable (subtable_), - lookup_type (lookup_type_) {} - - bool subset (hb_subset_context_t *c) const - { return subtable.dispatch (c, lookup_type); } - - private: - const TSubTable &subtable; - unsigned int lookup_type; - }; - template <typename TSubTable> bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct Lookup *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); /* Subset the actual subtables. */ @@ -747,23 +732,11 @@ struct Lookup OffsetArrayOf<TSubTable>& out_subtables = out->get_subtables<TSubTable> (); unsigned int count = subTable.len; for (unsigned int i = 0; i < count; i++) - { - SubTableSubsetWrapper<TSubTable> wrapper (this+subtables[i], get_type ()); - - out_subtables[i].serialize_subset (c, wrapper, out); - } + out_subtables[i].serialize_subset (c, this+subtables[i], out, get_type ()); return_trace (true); } - /* Older compilers need this to NOT be locally defined in a function. */ - template <typename TSubTable> - struct SubTableSanitizeWrapper : TSubTable - { - bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) const - { return this->dispatch (c, lookup_type); } - }; - template <typename TSubTable> bool sanitize (hb_sanitize_context_t *c) const { @@ -775,16 +748,21 @@ struct Lookup if (!markFilteringSet.sanitize (c)) return_trace (false); } - if (unlikely (!CastR<OffsetArrayOf<SubTableSanitizeWrapper<TSubTable> > > (subTable) - .sanitize (c, this, get_type ()))) + if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ()))) return_trace (false); - if (unlikely (get_type () == TSubTable::Extension)) + if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ())) { /* The spec says all subtables of an Extension lookup should * have the same type, which shall not be the Extension type * itself (but we already checked for that). - * This is specially important if one has a reverse type! */ + * This is specially important if one has a reverse type! + * + * We only do this if sanitizer edit_count is zero. Otherwise, + * some of the subtables might have become insane after they + * were sanity-checked by the edits of subsequent subtables. + * https://bugs.chromium.org/p/chromium/issues/detail?id=960331 + */ unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type (); unsigned int count = get_subtable_count (); for (unsigned int i = 1; i < count; i++) @@ -792,7 +770,6 @@ struct Lookup return_trace (false); } return_trace (true); - return_trace (true); } private: @@ -826,8 +803,9 @@ struct CoverageFormat1 return i; } - bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs) + template <typename Iterator, + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> + bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); return_trace (glyphArray.serialize (c, glyphs)); @@ -853,19 +831,19 @@ struct CoverageFormat1 template <typename set_t> bool add_coverage (set_t *glyphs) const - { - return glyphs->add_sorted_array (glyphArray.arrayZ, glyphArray.len); - } + { return glyphs->add_sorted_array (glyphArray.arrayZ, glyphArray.len); } public: /* Older compilers need this to be public. */ - struct Iter { + struct iter_t + { void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; } void fini () {} - bool more () { return i < c->glyphArray.len; } + bool more () const { return i < c->glyphArray.len; } void next () { i++; } - hb_codepoint_t get_glyph () { return c->glyphArray[i]; } - unsigned int get_coverage () { return i; } + hb_codepoint_t get_glyph () const { return c->glyphArray[i]; } + bool operator != (const iter_t& o) const + { return i != o.i || c != o.c; } private: const struct CoverageFormat1 *c; @@ -894,38 +872,48 @@ struct CoverageFormat2 NOT_COVERED; } - bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs) + template <typename Iterator, + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> + bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - if (unlikely (!glyphs.length)) + if (unlikely (!glyphs)) { - rangeRecord.len.set (0); + rangeRecord.len = 0; return_trace (true); } - unsigned int num_ranges = 1; - for (unsigned int i = 1; i < glyphs.length; i++) - if (glyphs[i - 1] + 1 != glyphs[i]) - num_ranges++; - rangeRecord.len.set (num_ranges); - if (unlikely (!c->extend (rangeRecord))) return_trace (false); + /* TODO(iter) Write more efficiently? */ - unsigned int range = 0; - rangeRecord[range].start = glyphs[0]; - rangeRecord[range].value.set (0); - for (unsigned int i = 1; i < glyphs.length; i++) + unsigned num_ranges = 0; + hb_codepoint_t last = (hb_codepoint_t) -2; + for (auto g: glyphs) { - if (glyphs[i - 1] + 1 != glyphs[i]) + if (last + 1 != g) + num_ranges++; + last = g; + } + + if (unlikely (!rangeRecord.serialize (c, num_ranges))) return_trace (false); + + unsigned count = 0; + unsigned range = (unsigned) -1; + last = (hb_codepoint_t) -2; + for (auto g: glyphs) + { + if (last + 1 != g) { - range++; - rangeRecord[range].start = glyphs[i]; - rangeRecord[range].value.set (i); + range++; + rangeRecord[range].start = g; + rangeRecord[range].value = count; } - rangeRecord[range].end = glyphs[i]; + rangeRecord[range].end = g; + last = g; + count++; } + return_trace (true); } @@ -972,7 +960,7 @@ struct CoverageFormat2 public: /* Older compilers need this to be public. */ - struct Iter + struct iter_t { void init (const CoverageFormat2 &c_) { @@ -987,7 +975,7 @@ struct CoverageFormat2 } } void fini () {} - bool more () { return i < c->rangeRecord.len; } + bool more () const { return i < c->rangeRecord.len; } void next () { if (j >= c->rangeRecord[i].end) @@ -995,23 +983,27 @@ struct CoverageFormat2 i++; if (more ()) { - hb_codepoint_t old = j; + unsigned int old = coverage; j = c->rangeRecord[i].start; - if (unlikely (j <= old)) + coverage = c->rangeRecord[i].value; + if (unlikely (coverage != old + 1)) { - /* Broken table. Skip. Important to avoid DoS. */ + /* Broken table. Skip. Important to avoid DoS. + * Also, our callers depend on coverage being + * consecutive and monotonically increasing, + * ie. iota(). */ i = c->rangeRecord.len; return; } - coverage = c->rangeRecord[i].value; } return; } coverage++; j++; } - hb_codepoint_t get_glyph () { return j; } - unsigned int get_coverage () { return coverage; } + hb_codepoint_t get_glyph () const { return j; } + bool operator != (const iter_t& o) const + { return i != o.i || j != o.j || c != o.c; } private: const struct CoverageFormat2 *c; @@ -1032,6 +1024,15 @@ struct CoverageFormat2 struct Coverage { + /* Has interface. */ + static constexpr unsigned SENTINEL = NOT_COVERED; + typedef unsigned int value_t; + value_t operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + /* Predicate. */ + bool operator () (hb_codepoint_t k) const { return has (k); } + + unsigned int get (hb_codepoint_t k) const { return get_coverage (k); } unsigned int get_coverage (hb_codepoint_t glyph_id) const { switch (u.format) { @@ -1041,17 +1042,24 @@ struct Coverage } } - bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs) + template <typename Iterator, + hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> + bool serialize (hb_serialize_context_t *c, Iterator glyphs) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - unsigned int num_ranges = 1; - for (unsigned int i = 1; i < glyphs.length; i++) - if (glyphs[i - 1] + 1 != glyphs[i]) - num_ranges++; - u.format.set (glyphs.length * 2 < num_ranges * 3 ? 1 : 2); + unsigned count = 0; + unsigned num_ranges = 0; + hb_codepoint_t last = (hb_codepoint_t) -2; + for (auto g: glyphs) + { + if (last + 1 != g) + num_ranges++; + last = g; + count++; + } + u.format = count * 2 < num_ranges * 3 ? 1 : 2; switch (u.format) { @@ -1105,9 +1113,10 @@ struct Coverage } } - struct Iter + struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t> { - Iter (const Coverage &c_) + static constexpr bool is_sorted_iterator = true; + iter_t (const Coverage &c_ = Null(Coverage)) { memset (this, 0, sizeof (*this)); format = c_.u.format; @@ -1118,7 +1127,7 @@ struct Coverage default: return; } } - bool more () + bool __more__ () const { switch (format) { @@ -1127,7 +1136,7 @@ struct Coverage default:return false; } } - void next () + void __next__ () { switch (format) { @@ -1136,7 +1145,10 @@ struct Coverage default: break; } } - hb_codepoint_t get_glyph () + typedef hb_codepoint_t __item_t__; + __item_t__ __item__ () const { return get_glyph (); } + + hb_codepoint_t get_glyph () const { switch (format) { @@ -1145,23 +1157,25 @@ struct Coverage default:return 0; } } - unsigned int get_coverage () + bool operator != (const iter_t& o) const { + if (format != o.format) return true; switch (format) { - case 1: return u.format1.get_coverage (); - case 2: return u.format2.get_coverage (); - default:return -1; + case 1: return u.format1 != o.u.format1; + case 2: return u.format2 != o.u.format2; + default:return false; } } private: unsigned int format; union { - CoverageFormat2::Iter format2; /* Put this one first since it's larger; helps shut up compiler. */ - CoverageFormat1::Iter format1; + CoverageFormat2::iter_t format2; /* Put this one first since it's larger; helps shut up compiler. */ + CoverageFormat1::iter_t format1; } u; }; + iter_t iter () const { return iter_t (*this); } protected: union { @@ -1193,24 +1207,24 @@ struct ClassDefFormat1 } bool serialize (hb_serialize_context_t *c, - hb_array_t<const HBUINT16> glyphs, + hb_array_t<const GlyphID> glyphs, hb_array_t<const HBUINT16> klasses) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - if (unlikely (!glyphs.length)) + if (unlikely (!glyphs)) { - startGlyph.set (0); - classValue.len.set (0); + startGlyph = 0; + classValue.len = 0; return_trace (true); } - hb_codepoint_t glyph_min = glyphs[0]; - hb_codepoint_t glyph_max = glyphs[glyphs.length - 1]; + hb_codepoint_t glyph_min = +glyphs | hb_reduce (hb_min, 0xFFFFu); + hb_codepoint_t glyph_max = +glyphs | hb_reduce (hb_max, 0u); - startGlyph.set (glyph_min); - classValue.len.set (glyph_max - glyph_min + 1); + startGlyph = glyph_min; + c->check_assign (classValue.len, glyph_max - glyph_min + 1); if (unlikely (!c->extend (classValue))) return_trace (false); for (unsigned int i = 0; i < glyphs.length; i++) @@ -1224,22 +1238,22 @@ struct ClassDefFormat1 TRACE_SUBSET (this); const hb_set_t &glyphset = *c->plan->glyphset (); const hb_map_t &glyph_map = *c->plan->glyph_map; - hb_vector_t<GlyphID> glyphs; + hb_sorted_vector_t<GlyphID> glyphs; hb_vector_t<HBUINT16> klasses; hb_codepoint_t start = startGlyph; hb_codepoint_t end = start + classValue.len; for (hb_codepoint_t g = start; g < end; g++) { + if (!glyphset.has (g)) continue; unsigned int value = classValue[g - start]; if (!value) continue; - if (!glyphset.has (g)) continue; - glyphs.push()->set (glyph_map[g]); - klasses.push()->set (value); + glyphs.push(glyph_map[g]); + klasses.push(value); } c->serializer->propagate_error (glyphs, klasses); ClassDef_serialize (c->serializer, glyphs, klasses); - return_trace (glyphs.length); + return_trace ((bool) glyphs); } bool sanitize (hb_sanitize_context_t *c) const @@ -1329,40 +1343,42 @@ struct ClassDefFormat2 } bool serialize (hb_serialize_context_t *c, - hb_array_t<const HBUINT16> glyphs, + hb_array_t<const GlyphID> glyphs, hb_array_t<const HBUINT16> klasses) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - if (unlikely (!glyphs.length)) + if (unlikely (!glyphs)) { - rangeRecord.len.set (0); + rangeRecord.len = 0; return_trace (true); } + unsigned int count = glyphs.len (); unsigned int num_ranges = 1; - for (unsigned int i = 1; i < glyphs.length; i++) + for (unsigned int i = 1; i < count; i++) if (glyphs[i - 1] + 1 != glyphs[i] || klasses[i - 1] != klasses[i]) num_ranges++; - rangeRecord.len.set (num_ranges); + rangeRecord.len = num_ranges; if (unlikely (!c->extend (rangeRecord))) return_trace (false); unsigned int range = 0; rangeRecord[range].start = glyphs[0]; - rangeRecord[range].value.set (klasses[0]); - for (unsigned int i = 1; i < glyphs.length; i++) + rangeRecord[range].value = klasses[0]; + for (unsigned int i = 1; i < count; i++) { if (glyphs[i - 1] + 1 != glyphs[i] || klasses[i - 1] != klasses[i]) { + rangeRecord[range].end = glyphs[i - 1]; range++; rangeRecord[range].start = glyphs[i]; rangeRecord[range].value = klasses[i]; } - rangeRecord[range].end = glyphs[i]; } + rangeRecord[range].end = glyphs[count - 1]; return_trace (true); } @@ -1384,13 +1400,13 @@ struct ClassDefFormat2 for (hb_codepoint_t g = start; g < end; g++) { if (!glyphset.has (g)) continue; - glyphs.push ()->set (glyph_map[g]); - klasses.push ()->set (value); + glyphs.push (glyph_map[g]); + klasses.push (value); } } c->serializer->propagate_error (glyphs, klasses); ClassDef_serialize (c->serializer, glyphs, klasses); - return_trace (glyphs.length); + return_trace ((bool) glyphs); } bool sanitize (hb_sanitize_context_t *c) const @@ -1468,6 +1484,15 @@ struct ClassDefFormat2 struct ClassDef { + /* Has interface. */ + static constexpr unsigned SENTINEL = 0; + typedef unsigned int value_t; + value_t operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + /* Projection. */ + hb_codepoint_t operator () (hb_codepoint_t k) const { return get (k); } + + unsigned int get (hb_codepoint_t k) const { return get_class (k); } unsigned int get_class (hb_codepoint_t glyph_id) const { switch (u.format) { @@ -1485,13 +1510,14 @@ struct ClassDef if (unlikely (!c->extend_min (*this))) return_trace (false); unsigned int format = 2; - if (glyphs.length) + if (likely (glyphs)) { - hb_codepoint_t glyph_min = glyphs[0]; - hb_codepoint_t glyph_max = glyphs[glyphs.length - 1]; + hb_codepoint_t glyph_min = +glyphs | hb_reduce (hb_min, 0xFFFFu); + hb_codepoint_t glyph_max = +glyphs | hb_reduce (hb_max, 0u); + unsigned int count = glyphs.len (); unsigned int num_ranges = 1; - for (unsigned int i = 1; i < glyphs.length; i++) + for (unsigned int i = 1; i < count; i++) if (glyphs[i - 1] + 1 != glyphs[i] || klasses[i - 1] != klasses[i]) num_ranges++; @@ -1499,7 +1525,7 @@ struct ClassDef if (1 + (glyph_max - glyph_min + 1) < num_ranges * 3) format = 1; } - u.format.set (format); + u.format = format; switch (u.format) { @@ -1975,10 +2001,10 @@ struct FeatureVariations return (this+record.substitutions).find_substitute (feature_index); } - bool subset (hb_subset_context_t *c) const + FeatureVariations* copy (hb_serialize_context_t *c) const { - TRACE_SUBSET (this); - return_trace (c->serializer->embed (*this)); + TRACE_SERIALIZE (this); + return_trace (c->embed (*this)); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh index 06c26fbb42c..ac1bddb2e0a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh @@ -220,7 +220,7 @@ struct LigGlyph { if (caret_count) { - hb_array_t <const OffsetTo<CaretValue> > array = carets.sub_array (start_offset, caret_count); + hb_array_t <const OffsetTo<CaretValue>> array = carets.sub_array (start_offset, caret_count); unsigned int count = array.length; for (unsigned int i = 0; i < count; i++) caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id, var_store); @@ -296,7 +296,7 @@ struct MarkGlyphSetsFormat1 protected: HBUINT16 format; /* Format identifier--format = 1 */ - ArrayOf<LOffsetTo<Coverage> > + ArrayOf<LOffsetTo<Coverage>> coverage; /* Array of long offsets to mark set * coverage tables */ public: @@ -439,19 +439,19 @@ struct GDEF bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct GDEF *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); out->glyphClassDef.serialize_subset (c, this+glyphClassDef, out); - out->attachList.set (0);//TODO(subset) serialize_subset (c, this+attachList, out); - out->ligCaretList.set (0);//TODO(subset) serialize_subset (c, this+ligCaretList, out); + out->attachList = 0;//TODO(subset) serialize_subset (c, this+attachList, out); + out->ligCaretList = 0;//TODO(subset) serialize_subset (c, this+ligCaretList, out); out->markAttachClassDef.serialize_subset (c, this+markAttachClassDef, out); if (version.to_int () >= 0x00010002u) - out->markGlyphSetsDef.set (0);// TODO(subset) serialize_subset (c, this+markGlyphSetsDef, out); + out->markGlyphSetsDef = 0;// TODO(subset) serialize_subset (c, this+markGlyphSetsDef, out); if (version.to_int () >= 0x00010003u) - out->varStore.set (0);// TODO(subset) serialize_subset (c, this+varStore, out); + out->varStore = 0;// TODO(subset) serialize_subset (c, this+varStore, out); return_trace (true); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh index e17a2824168..86c45be29c6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh @@ -173,15 +173,15 @@ struct ValueFormat : HBUINT16 return true; } - static OffsetTo<Device>& get_device (Value* value) - { return *CastP<OffsetTo<Device> > (value); } - static const OffsetTo<Device>& get_device (const Value* value, bool *worked=nullptr) + HB_INTERNAL static OffsetTo<Device>& get_device (Value* value) + { return *CastP<OffsetTo<Device>> (value); } + HB_INTERNAL static const OffsetTo<Device>& get_device (const Value* value, bool *worked=nullptr) { if (worked) *worked |= bool (*value); - return *CastP<OffsetTo<Device> > (value); + return *CastP<OffsetTo<Device>> (value); } - static const HBINT16& get_short (const Value* value, bool *worked=nullptr) + HB_INTERNAL static const HBINT16& get_short (const Value* value, bool *worked=nullptr) { if (worked) *worked |= bool (*value); return *CastP<HBINT16> (value); @@ -393,7 +393,7 @@ struct AnchorMatrix HBUINT16 rows; /* Number of rows */ protected: - UnsizedArrayOf<OffsetTo<Anchor> > + UnsizedArrayOf<OffsetTo<Anchor>> matrixZ; /* Matrix of offsets to Anchor tables-- * from beginning of AnchorMatrix table */ public: @@ -446,8 +446,8 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y); hb_glyph_position_t &o = buffer->cur_pos(); - o.x_offset = round (base_x - mark_x); - o.y_offset = round (base_y - mark_y); + o.x_offset = roundf (base_x - mark_x); + o.y_offset = roundf (base_y - mark_y); o.attach_type() = ATTACH_TYPE_MARK; o.attach_chain() = (int) glyph_pos - (int) buffer->idx; buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; @@ -576,14 +576,14 @@ struct SinglePosFormat2 struct SinglePos { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -616,7 +616,7 @@ struct PairSet friend struct PairPosFormat1; bool intersects (const hb_set_t *glyphs, - const ValueFormat *valueFormats) const + const ValueFormat *valueFormats) const { unsigned int len1 = valueFormats[0].get_len (); unsigned int len2 = valueFormats[1].get_len (); @@ -722,16 +722,14 @@ struct PairPosFormat1 { bool intersects (const hb_set_t *glyphs) const { - unsigned int count = pairSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (glyphs->has (iter.get_glyph ()) && - (this+pairSet[iter.get_coverage ()]).intersects (glyphs, valueFormat)) - return true; - } - return false; + return + + hb_zip (this+coverage, pairSet) + | hb_filter (*glyphs, hb_first) + | hb_map (hb_second) + | hb_map ([=] (const OffsetTo<PairSet> &_) + { return (this+_).intersects (glyphs, valueFormat); }) + | hb_any + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -909,14 +907,14 @@ struct PairPosFormat2 struct PairPos { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -995,32 +993,32 @@ struct CursivePosFormat1 /* Main-direction adjustment */ switch (c->direction) { case HB_DIRECTION_LTR: - pos[i].x_advance = round (exit_x) + pos[i].x_offset; + pos[i].x_advance = roundf (exit_x) + pos[i].x_offset; - d = round (entry_x) + pos[j].x_offset; + d = roundf (entry_x) + pos[j].x_offset; pos[j].x_advance -= d; pos[j].x_offset -= d; break; case HB_DIRECTION_RTL: - d = round (exit_x) + pos[i].x_offset; + d = roundf (exit_x) + pos[i].x_offset; pos[i].x_advance -= d; pos[i].x_offset -= d; - pos[j].x_advance = round (entry_x) + pos[j].x_offset; + pos[j].x_advance = roundf (entry_x) + pos[j].x_offset; break; case HB_DIRECTION_TTB: - pos[i].y_advance = round (exit_y) + pos[i].y_offset; + pos[i].y_advance = roundf (exit_y) + pos[i].y_offset; - d = round (entry_y) + pos[j].y_offset; + d = roundf (entry_y) + pos[j].y_offset; pos[j].y_advance -= d; pos[j].y_offset -= d; break; case HB_DIRECTION_BTT: - d = round (exit_y) + pos[i].y_offset; + d = roundf (exit_y) + pos[i].y_offset; pos[i].y_advance -= d; pos[i].y_offset -= d; - pos[j].y_advance = round (entry_y); + pos[j].y_advance = roundf (entry_y); break; case HB_DIRECTION_INVALID: default: @@ -1094,13 +1092,13 @@ struct CursivePosFormat1 struct CursivePos { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1210,13 +1208,13 @@ struct MarkBasePosFormat1 struct MarkBasePos { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1289,7 +1287,7 @@ struct MarkLigPosFormat1 unsigned int mark_id = _hb_glyph_info_get_lig_id (&buffer->cur()); unsigned int mark_comp = _hb_glyph_info_get_lig_comp (&buffer->cur()); if (lig_id && lig_id == mark_id && mark_comp > 0) - comp_index = MIN (comp_count, _hb_glyph_info_get_lig_comp (&buffer->cur())) - 1; + comp_index = hb_min (comp_count, _hb_glyph_info_get_lig_comp (&buffer->cur())) - 1; else comp_index = comp_count - 1; @@ -1335,13 +1333,13 @@ struct MarkLigPosFormat1 struct MarkLigPos { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1457,13 +1455,13 @@ struct MarkMarkPosFormat1 struct MarkMarkPos { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1509,20 +1507,20 @@ struct PosLookupSubTable Extension = 9 }; - template <typename context_t> - typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const { TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { - case Single: return_trace (u.single.dispatch (c)); - case Pair: return_trace (u.pair.dispatch (c)); - case Cursive: return_trace (u.cursive.dispatch (c)); - case MarkBase: return_trace (u.markBase.dispatch (c)); - case MarkLig: return_trace (u.markLig.dispatch (c)); - case MarkMark: return_trace (u.markMark.dispatch (c)); - case Context: return_trace (u.context.dispatch (c)); - case ChainContext: return_trace (u.chainContext.dispatch (c)); - case Extension: return_trace (u.extension.dispatch (c)); + case Single: return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...)); + case Pair: return_trace (u.pair.dispatch (c, hb_forward<Ts> (ds)...)); + case Cursive: return_trace (u.cursive.dispatch (c, hb_forward<Ts> (ds)...)); + case MarkBase: return_trace (u.markBase.dispatch (c, hb_forward<Ts> (ds)...)); + case MarkLig: return_trace (u.markLig.dispatch (c, hb_forward<Ts> (ds)...)); + case MarkMark: return_trace (u.markMark.dispatch (c, hb_forward<Ts> (ds)...)); + case Context: return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...)); + case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...)); + case Extension: return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...)); default: return_trace (c->default_return_value ()); } } @@ -1578,14 +1576,14 @@ struct PosLookup : Lookup dispatch (&c); } - static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); + HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); template <typename context_t> static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const - { return Lookup::dispatch<SubTable> (c); } + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const + { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); } bool subset (hb_subset_context_t *c) const { return Lookup::subset<SubTable> (c); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh index cc10634759b..0e1966e98e8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh @@ -34,10 +34,12 @@ namespace OT { +typedef hb_pair_t<hb_codepoint_t, hb_codepoint_t> hb_codepoint_pair_t; +template<typename Iterator> static inline void SingleSubst_serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, - hb_array_t<const GlyphID> substitutes); + Iterator it); + struct SingleSubstFormat1 { @@ -46,35 +48,28 @@ struct SingleSubstFormat1 void closure (hb_closure_context_t *c) const { - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - /* TODO Switch to range-based API to work around malicious fonts. - * https://github.com/harfbuzz/harfbuzz/issues/363 */ - hb_codepoint_t glyph_id = iter.get_glyph (); - if (c->glyphs->has (glyph_id)) - c->out->add ((glyph_id + deltaGlyphID) & 0xFFFFu); - } + unsigned d = deltaGlyphID; + + hb_iter (this+coverage) + | hb_filter (*c->glyphs) + | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; }) + | hb_sink (c->output) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).add_coverage (c->input))) return; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - /* TODO Switch to range-based API to work around malicious fonts. - * https://github.com/harfbuzz/harfbuzz/issues/363 */ - hb_codepoint_t glyph_id = iter.get_glyph (); - c->output->add ((glyph_id + deltaGlyphID) & 0xFFFFu); - } + unsigned d = deltaGlyphID; + + hb_iter (this+coverage) + | hb_map ([d] (hb_codepoint_t g) { return (g + d) & 0xFFFFu; }) + | hb_sink (c->output) + ; } const Coverage &get_coverage () const { return this+coverage; } bool would_apply (hb_would_apply_context_t *c) const - { - TRACE_WOULD_APPLY (this); - return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); - } + { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; } bool apply (hb_ot_apply_context_t *c) const { @@ -91,34 +86,39 @@ struct SingleSubstFormat1 return_trace (true); } + template<typename Iterator, + hb_requires (hb_is_sorted_source_of (Iterator, + hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, - int delta) + Iterator glyphs, + unsigned delta) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false); - deltaGlyphID.set (delta); /* TODO(serialize) overflow? */ + c->check_assign (deltaGlyphID, delta); return_trace (true); } bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; - hb_vector_t<GlyphID> from; - hb_vector_t<GlyphID> to; + hb_codepoint_t delta = deltaGlyphID; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (!glyphset.has (iter.get_glyph ())) continue; - from.push ()->set (glyph_map[iter.get_glyph ()]); - to.push ()->set (glyph_map[(iter.get_glyph () + delta) & 0xFFFF]); - } - c->serializer->propagate_error (from, to); - SingleSubst_serialize (c->serializer, from, to); - return_trace (from.length); + + auto it = + + hb_iter (this+coverage) + | hb_filter (glyphset) + | hb_map_retains_sorting ([&] (hb_codepoint_t g) { + return hb_codepoint_pair_t (glyph_map[g], + glyph_map[(g + delta) & 0xFFFF]); }) + ; + + bool ret = bool (it); + SingleSubst_serialize (c->serializer, it); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const @@ -132,8 +132,8 @@ struct SingleSubstFormat1 OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - HBINT16 deltaGlyphID; /* Add to original GlyphID to get - * substitute GlyphID */ + HBUINT16 deltaGlyphID; /* Add to original GlyphID to get + * substitute GlyphID, modulo 0x10000 */ public: DEFINE_SIZE_STATIC (6); }; @@ -145,35 +145,26 @@ struct SingleSubstFormat2 void closure (hb_closure_context_t *c) const { - unsigned int count = substitute.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (c->glyphs->has (iter.get_glyph ())) - c->out->add (substitute[iter.get_coverage ()]); - } + + hb_zip (this+coverage, substitute) + | hb_filter (*c->glyphs, hb_first) + | hb_map (hb_second) + | hb_sink (c->output) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).add_coverage (c->input))) return; - unsigned int count = substitute.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - c->output->add (substitute[iter.get_coverage ()]); - } + + hb_zip (this+coverage, substitute) + | hb_map (hb_second) + | hb_sink (c->output) + ; } const Coverage &get_coverage () const { return this+coverage; } bool would_apply (hb_would_apply_context_t *c) const - { - TRACE_WOULD_APPLY (this); - return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); - } + { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; } bool apply (hb_ot_apply_context_t *c) const { @@ -188,11 +179,21 @@ struct SingleSubstFormat2 return_trace (true); } + template<typename Iterator, + hb_requires (hb_is_sorted_source_of (Iterator, + const hb_codepoint_pair_t))> bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, - hb_array_t<const GlyphID> substitutes) + Iterator it) { TRACE_SERIALIZE (this); + auto substitutes = + + it + | hb_map (hb_second) + ; + auto glyphs = + + it + | hb_map_retains_sorting (hb_first) + ; if (unlikely (!c->extend_min (*this))) return_trace (false); if (unlikely (!substitute.serialize (c, substitutes))) return_trace (false); if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs))) return_trace (false); @@ -202,19 +203,19 @@ struct SingleSubstFormat2 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; - hb_vector_t<GlyphID> from; - hb_vector_t<GlyphID> to; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (!glyphset.has (iter.get_glyph ())) continue; - from.push ()->set (glyph_map[iter.get_glyph ()]); - to.push ()->set (glyph_map[substitute[iter.get_coverage ()]]); - } - c->serializer->propagate_error (from, to); - SingleSubst_serialize (c->serializer, from, to); - return_trace (from.length); + + auto it = + + hb_zip (this+coverage, substitute) + | hb_filter (glyphset, hb_first) + | hb_map_retains_sorting ([&] (hb_pair_t<hb_codepoint_t, const GlyphID &> p) -> hb_codepoint_pair_t + { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) + ; + + bool ret = bool (it); + SingleSubst_serialize (c->serializer, it); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const @@ -237,41 +238,45 @@ struct SingleSubstFormat2 struct SingleSubst { + + template<typename Iterator, + hb_requires (hb_is_sorted_source_of (Iterator, + const hb_codepoint_pair_t))> bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, - hb_array_t<const GlyphID> substitutes) + Iterator glyphs) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return_trace (false); - unsigned int format = 2; - int delta = 0; - if (glyphs.length) + unsigned format = 2; + unsigned delta = 0; + if (glyphs.len ()) { format = 1; - /* TODO(serialize) check for wrap-around */ - delta = substitutes[0] - glyphs[0]; - for (unsigned int i = 1; i < glyphs.length; i++) - if (delta != (int) (substitutes[i] - glyphs[i])) { - format = 2; - break; - } + auto get_delta = [=] (hb_codepoint_pair_t _) { + return (unsigned) (_.second - _.first) & 0xFFFF; + }; + delta = get_delta (*glyphs); + if (!hb_all (++(+glyphs), delta, get_delta)) format = 2; } - u.format.set (format); + u.format = format; switch (u.format) { - case 1: return_trace (u.format1.serialize (c, glyphs, delta)); - case 2: return_trace (u.format2.serialize (c, glyphs, substitutes)); + case 1: return_trace (u.format1.serialize (c, + + glyphs + | hb_map_retains_sorting (hb_first), + delta)); + case 2: return_trace (u.format2.serialize (c, glyphs)); default:return_trace (false); } } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -284,11 +289,11 @@ struct SingleSubst } u; }; +template<typename Iterator> static inline void SingleSubst_serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, - hb_array_t<const GlyphID> substitutes) -{ c->start_embed<SingleSubst> ()->serialize (c, glyphs, substitutes); } + Iterator it) +{ c->start_embed<SingleSubst> ()->serialize (c, it); } struct Sequence { @@ -296,7 +301,7 @@ struct Sequence { unsigned int count = substitute.len; for (unsigned int i = 0; i < count; i++) - c->out->add (substitute[i]); + c->output->add (substitute[i]); } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -335,10 +340,10 @@ struct Sequence } bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs) + hb_array_t<const GlyphID> subst) { TRACE_SERIALIZE (this); - return_trace (substitute.serialize (c, glyphs)); + return_trace (substitute.serialize (c, subst)); } bool sanitize (hb_sanitize_context_t *c) const @@ -361,31 +366,28 @@ struct MultipleSubstFormat1 void closure (hb_closure_context_t *c) const { - unsigned int count = sequence.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (c->glyphs->has (iter.get_glyph ())) - (this+sequence[iter.get_coverage ()]).closure (c); - } + + hb_zip (this+coverage, sequence) + | hb_filter (*c->glyphs, hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Sequence &_) { _.closure (c); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).add_coverage (c->input))) return; - unsigned int count = sequence.len; - for (unsigned int i = 0; i < count; i++) - (this+sequence[i]).collect_glyphs (c); + + hb_zip (this+coverage, sequence) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Sequence &_) { _.collect_glyphs (c); }) + ; } const Coverage &get_coverage () const { return this+coverage; } bool would_apply (hb_would_apply_context_t *c) const - { - TRACE_WOULD_APPLY (this); - return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); - } + { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; } bool apply (hb_ot_apply_context_t *c) const { @@ -398,7 +400,7 @@ struct MultipleSubstFormat1 } bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, + hb_sorted_array_t<const GlyphID> glyphs, hb_array_t<const unsigned int> substitute_len_list, hb_array_t<const GlyphID> substitute_glyphs_list) { @@ -444,27 +446,27 @@ struct MultipleSubstFormat1 struct MultipleSubst { bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, + hb_sorted_array_t<const GlyphID> glyphs, hb_array_t<const unsigned int> substitute_len_list, hb_array_t<const GlyphID> substitute_glyphs_list) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return_trace (false); unsigned int format = 1; - u.format.set (format); + u.format = format; switch (u.format) { case 1: return_trace (u.format1.serialize (c, glyphs, substitute_len_list, substitute_glyphs_list)); default:return_trace (false); } } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -482,7 +484,7 @@ struct AlternateSet { unsigned int count = alternates.len; for (unsigned int i = 0; i < count; i++) - c->out->add (alternates[i]); + c->output->add (alternates[i]); } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -502,7 +504,7 @@ struct AlternateSet unsigned int shift = hb_ctz (lookup_mask); unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift); - /* If alt_index is MAX, randomize feature if it is the rand feature. */ + /* If alt_index is MAX_VALUE, randomize feature if it is the rand feature. */ if (alt_index == HB_OT_MAP_MAX_VALUE && c->random) alt_index = c->random_number () % count + 1; @@ -514,10 +516,10 @@ struct AlternateSet } bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs) + hb_array_t<const GlyphID> alts) { TRACE_SERIALIZE (this); - return_trace (alternates.serialize (c, glyphs)); + return_trace (alternates.serialize (c, alts)); } bool sanitize (hb_sanitize_context_t *c) const @@ -541,35 +543,27 @@ struct AlternateSubstFormat1 void closure (hb_closure_context_t *c) const { - unsigned int count = alternateSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (c->glyphs->has (iter.get_glyph ())) - (this+alternateSet[iter.get_coverage ()]).closure (c); - } + + hb_zip (this+coverage, alternateSet) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([c] (const AlternateSet &_) { _.closure (c); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).add_coverage (c->input))) return; - unsigned int count = alternateSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - (this+alternateSet[iter.get_coverage ()]).collect_glyphs (c); - } + + hb_zip (this+coverage, alternateSet) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([c] (const AlternateSet &_) { _.collect_glyphs (c); }) + ; } const Coverage &get_coverage () const { return this+coverage; } bool would_apply (hb_would_apply_context_t *c) const - { - TRACE_WOULD_APPLY (this); - return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); - } + { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; } bool apply (hb_ot_apply_context_t *c) const { @@ -582,7 +576,7 @@ struct AlternateSubstFormat1 } bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, + hb_sorted_array_t<const GlyphID> glyphs, hb_array_t<const unsigned int> alternate_len_list, hb_array_t<const GlyphID> alternate_glyphs_list) { @@ -628,27 +622,27 @@ struct AlternateSubstFormat1 struct AlternateSubst { bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> glyphs, + hb_sorted_array_t<const GlyphID> glyphs, hb_array_t<const unsigned int> alternate_len_list, hb_array_t<const GlyphID> alternate_glyphs_list) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return_trace (false); unsigned int format = 1; - u.format.set (format); + u.format = format; switch (u.format) { case 1: return_trace (u.format1.serialize (c, glyphs, alternate_len_list, alternate_glyphs_list)); default:return_trace (false); } } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -668,17 +662,14 @@ struct Ligature unsigned int count = component.lenP1; for (unsigned int i = 1; i < count; i++) if (!glyphs->has (component[i])) - return false; + return false; return true; } void closure (hb_closure_context_t *c) const { - unsigned int count = component.lenP1; - for (unsigned int i = 1; i < count; i++) - if (!c->glyphs->has (component[i])) - return; - c->out->add (ligGlyph); + if (!intersects (c->glyphs)) return; + c->output->add (ligGlyph); } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -689,15 +680,14 @@ struct Ligature bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); if (c->len != component.lenP1) - return_trace (false); + return false; for (unsigned int i = 1; i < c->len; i++) if (likely (c->glyphs[i] != component[i])) - return_trace (false); + return false; - return_trace (true); + return true; } bool apply (hb_ot_apply_context_t *c) const @@ -771,38 +761,38 @@ struct LigatureSet { bool intersects (const hb_set_t *glyphs) const { - unsigned int num_ligs = ligature.len; - for (unsigned int i = 0; i < num_ligs; i++) - if ((this+ligature[i]).intersects (glyphs)) - return true; - return false; + return + + hb_iter (ligature) + | hb_map (hb_add (this)) + | hb_map ([glyphs] (const Ligature &_) { return _.intersects (glyphs); }) + | hb_any + ; } void closure (hb_closure_context_t *c) const { - unsigned int num_ligs = ligature.len; - for (unsigned int i = 0; i < num_ligs; i++) - (this+ligature[i]).closure (c); + + hb_iter (ligature) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Ligature &_) { _.closure (c); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { - unsigned int num_ligs = ligature.len; - for (unsigned int i = 0; i < num_ligs; i++) - (this+ligature[i]).collect_glyphs (c); + + hb_iter (ligature) + | hb_map (hb_add (this)) + | hb_apply ([c] (const Ligature &_) { _.collect_glyphs (c); }) + ; } bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); - unsigned int num_ligs = ligature.len; - for (unsigned int i = 0; i < num_ligs; i++) - { - const Ligature &lig = this+ligature[i]; - if (lig.would_apply (c)) - return_trace (true); - } - return_trace (false); + return + + hb_iter (ligature) + | hb_map (hb_add (this)) + | hb_map ([c] (const Ligature &_) { return _.would_apply (c); }) + | hb_any + ; } bool apply (hb_ot_apply_context_t *c) const @@ -828,7 +818,7 @@ struct LigatureSet if (unlikely (!ligature.serialize (c, ligatures.length))) return_trace (false); for (unsigned int i = 0; i < ligatures.length; i++) { - unsigned int component_count = MAX<int> (component_count_list[i] - 1, 0); + unsigned int component_count = (unsigned) hb_max ((int) component_count_list[i] - 1, 0); if (unlikely (!ligature[i].serialize (c, this) .serialize (c, ligatures[i], @@ -857,52 +847,46 @@ struct LigatureSubstFormat1 { bool intersects (const hb_set_t *glyphs) const { - unsigned int count = ligatureSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (glyphs->has (iter.get_glyph ()) && - (this+ligatureSet[iter.get_coverage ()]).intersects (glyphs)) - return true; - } - return false; + return + + hb_zip (this+coverage, ligatureSet) + | hb_filter (*glyphs, hb_first) + | hb_map (hb_second) + | hb_map ([this, glyphs] (const OffsetTo<LigatureSet> &_) + { return (this+_).intersects (glyphs); }) + | hb_any + ; } void closure (hb_closure_context_t *c) const { - unsigned int count = ligatureSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (c->glyphs->has (iter.get_glyph ())) - (this+ligatureSet[iter.get_coverage ()]).closure (c); - } + + hb_zip (this+coverage, ligatureSet) + | hb_filter (*c->glyphs, hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([c] (const LigatureSet &_) { _.closure (c); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).add_coverage (c->input))) return; - unsigned int count = ligatureSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - (this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c); - } + + + hb_zip (this+coverage, ligatureSet) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([c] (const LigatureSet &_) { _.collect_glyphs (c); }) + ; } const Coverage &get_coverage () const { return this+coverage; } bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); unsigned int index = (this+coverage).get_coverage (c->glyphs[0]); - if (likely (index == NOT_COVERED)) return_trace (false); + if (likely (index == NOT_COVERED)) return false; const LigatureSet &lig_set = this+ligatureSet[index]; - return_trace (lig_set.would_apply (c)); + return lig_set.would_apply (c); } bool apply (hb_ot_apply_context_t *c) const @@ -917,7 +901,7 @@ struct LigatureSubstFormat1 } bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> first_glyphs, + hb_sorted_array_t<const GlyphID> first_glyphs, hb_array_t<const unsigned int> ligature_per_first_glyph_count_list, hb_array_t<const GlyphID> ligatures_list, hb_array_t<const unsigned int> component_count_list, @@ -968,7 +952,7 @@ struct LigatureSubstFormat1 struct LigatureSubst { bool serialize (hb_serialize_context_t *c, - hb_array_t<const GlyphID> first_glyphs, + hb_sorted_array_t<const GlyphID> first_glyphs, hb_array_t<const unsigned int> ligature_per_first_glyph_count_list, hb_array_t<const GlyphID> ligatures_list, hb_array_t<const unsigned int> component_count_list, @@ -977,7 +961,7 @@ struct LigatureSubst TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (u.format))) return_trace (false); unsigned int format = 1; - u.format.set (format); + u.format = format; switch (u.format) { case 1: return_trace (u.format1.serialize (c, first_glyphs, @@ -989,13 +973,13 @@ struct LigatureSubst } } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1027,48 +1011,35 @@ struct ReverseChainSingleSubstFormat1 if (!(this+coverage).intersects (glyphs)) return false; - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack); unsigned int count; count = backtrack.len; for (unsigned int i = 0; i < count; i++) if (!(this+backtrack[i]).intersects (glyphs)) - return false; + return false; count = lookahead.len; for (unsigned int i = 0; i < count; i++) if (!(this+lookahead[i]).intersects (glyphs)) - return false; + return false; return true; } void closure (hb_closure_context_t *c) const { - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + if (!intersects (c->glyphs)) return; - unsigned int count; + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack); + const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID>> (lookahead); - count = backtrack.len; - for (unsigned int i = 0; i < count; i++) - if (!(this+backtrack[i]).intersects (c->glyphs)) - return; - - count = lookahead.len; - for (unsigned int i = 0; i < count; i++) - if (!(this+lookahead[i]).intersects (c->glyphs)) - return; - - const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); - count = substitute.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (c->glyphs->has (iter.get_glyph ())) - c->out->add (substitute[iter.get_coverage ()]); - } + + hb_zip (this+coverage, substitute) + | hb_filter (*c->glyphs, hb_first) + | hb_map (hb_second) + | hb_sink (c->output) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -1081,12 +1052,12 @@ struct ReverseChainSingleSubstFormat1 for (unsigned int i = 0; i < count; i++) if (unlikely (!(this+backtrack[i]).add_coverage (c->before))) return; - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack); count = lookahead.len; for (unsigned int i = 0; i < count; i++) if (unlikely (!(this+lookahead[i]).add_coverage (c->after))) return; - const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); + const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID>> (lookahead); count = substitute.len; c->output->add_array (substitute.arrayZ, substitute.len); } @@ -1094,10 +1065,7 @@ struct ReverseChainSingleSubstFormat1 const Coverage &get_coverage () const { return this+coverage; } bool would_apply (hb_would_apply_context_t *c) const - { - TRACE_WOULD_APPLY (this); - return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); - } + { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; } bool apply (hb_ot_apply_context_t *c) const { @@ -1108,15 +1076,15 @@ struct ReverseChainSingleSubstFormat1 unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack); - const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack); + const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID>> (lookahead); unsigned int start_index = 0, end_index = 0; if (match_backtrack (c, backtrack.len, (HBUINT16 *) backtrack.arrayZ, match_coverage, this, &start_index) && - match_lookahead (c, + match_lookahead (c, lookahead.len, (HBUINT16 *) lookahead.arrayZ, match_coverage, this, 1, &end_index)) @@ -1144,10 +1112,10 @@ struct ReverseChainSingleSubstFormat1 TRACE_SANITIZE (this); if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this))) return_trace (false); - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (backtrack); if (!lookahead.sanitize (c, this)) return_trace (false); - const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); + const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID>> (lookahead); return_trace (substitute.sanitize (c)); } @@ -1173,13 +1141,13 @@ struct ReverseChainSingleSubstFormat1 struct ReverseChainSingleSubst { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1213,19 +1181,19 @@ struct SubstLookupSubTable ReverseChainSingle = 8 }; - template <typename context_t> - typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const { TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { - case Single: return_trace (u.single.dispatch (c)); - case Multiple: return_trace (u.multiple.dispatch (c)); - case Alternate: return_trace (u.alternate.dispatch (c)); - case Ligature: return_trace (u.ligature.dispatch (c)); - case Context: return_trace (u.context.dispatch (c)); - case ChainContext: return_trace (u.chainContext.dispatch (c)); - case Extension: return_trace (u.extension.dispatch (c)); - case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c)); + case Single: return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...)); + case Multiple: return_trace (u.multiple.dispatch (c, hb_forward<Ts> (ds)...)); + case Alternate: return_trace (u.alternate.dispatch (c, hb_forward<Ts> (ds)...)); + case Ligature: return_trace (u.ligature.dispatch (c, hb_forward<Ts> (ds)...)); + case Context: return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...)); + case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...)); + case Extension: return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...)); + case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c, hb_forward<Ts> (ds)...)); default: return_trace (c->default_return_value ()); } } @@ -1253,7 +1221,7 @@ struct SubstLookup : Lookup const SubTable& get_subtable (unsigned int i) const { return Lookup::get_subtable<SubTable> (i); } - static bool lookup_type_is_reverse (unsigned int lookup_type) + HB_INTERNAL static bool lookup_type_is_reverse (unsigned int lookup_type) { return lookup_type == SubTable::ReverseChainSingle; } bool is_reverse () const @@ -1306,13 +1274,12 @@ struct SubstLookup : Lookup 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 (false); - if (!accel->may_have (c->glyphs[0])) return_trace (false); - return_trace (dispatch (c)); + if (unlikely (!c->len)) return false; + if (!accel->may_have (c->glyphs[0])) return false; + return dispatch (c); } - static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); + HB_INTERNAL static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); SubTable& serialize_subtable (hb_serialize_context_t *c, unsigned int i) @@ -1320,17 +1287,19 @@ struct SubstLookup : Lookup bool serialize_single (hb_serialize_context_t *c, uint32_t lookup_props, - hb_array_t<const GlyphID> glyphs, - hb_array_t<const GlyphID> substitutes) + hb_sorted_array_t<const GlyphID> glyphs, + hb_array_t<const GlyphID> substitutes) { TRACE_SERIALIZE (this); if (unlikely (!Lookup::serialize (c, SubTable::Single, lookup_props, 1))) return_trace (false); - return_trace (serialize_subtable (c, 0).u.single.serialize (c, glyphs, substitutes)); + + return_trace (serialize_subtable (c, 0).u.single + .serialize (c, hb_zip (glyphs, substitutes))); } bool serialize_multiple (hb_serialize_context_t *c, uint32_t lookup_props, - hb_array_t<const GlyphID> glyphs, + hb_sorted_array_t<const GlyphID> glyphs, hb_array_t<const unsigned int> substitute_len_list, hb_array_t<const GlyphID> substitute_glyphs_list) { @@ -1344,7 +1313,7 @@ struct SubstLookup : Lookup bool serialize_alternate (hb_serialize_context_t *c, uint32_t lookup_props, - hb_array_t<const GlyphID> glyphs, + hb_sorted_array_t<const GlyphID> glyphs, hb_array_t<const unsigned int> alternate_len_list, hb_array_t<const GlyphID> alternate_glyphs_list) { @@ -1358,7 +1327,7 @@ struct SubstLookup : Lookup bool serialize_ligature (hb_serialize_context_t *c, uint32_t lookup_props, - hb_array_t<const GlyphID> first_glyphs, + hb_sorted_array_t<const GlyphID> first_glyphs, hb_array_t<const unsigned int> ligature_per_first_glyph_count_list, hb_array_t<const GlyphID> ligatures_list, hb_array_t<const unsigned int> component_count_list, @@ -1375,12 +1344,12 @@ struct SubstLookup : Lookup } template <typename context_t> - static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); + HB_INTERNAL static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); - static hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index) + HB_INTERNAL static hb_closure_context_t::return_t dispatch_closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index) { if (!c->should_visit_lookup (lookup_index)) - return HB_VOID; + return hb_empty_t (); hb_closure_context_t::return_t ret = dispatch_recurse_func (c, lookup_index); @@ -1392,9 +1361,9 @@ struct SubstLookup : Lookup return ret; } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const - { return Lookup::dispatch<SubTable> (c); } + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const + { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); } bool subset (hb_subset_context_t *c) const { return Lookup::subset<SubTable> (c); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh index 88d834da4be..7d395b5d84d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh @@ -59,13 +59,13 @@ struct hb_intersects_context_t : }; struct hb_closure_context_t : - hb_dispatch_context_t<hb_closure_context_t, hb_void_t, 0> + hb_dispatch_context_t<hb_closure_context_t, hb_empty_t, 0> { const char *get_name () { return "CLOSURE"; } typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index); template <typename T> - return_t dispatch (const T &obj) { obj.closure (this); return HB_VOID; } - static return_t default_return_value () { return HB_VOID; } + return_t dispatch (const T &obj) { obj.closure (this); return hb_empty_t (); } + static return_t default_return_value () { return hb_empty_t (); } void recurse (unsigned int lookup_index) { if (unlikely (nesting_level_left == 0 || !recurse_func)) @@ -92,7 +92,7 @@ struct hb_closure_context_t : hb_face_t *face; hb_set_t *glyphs; - hb_set_t out[1]; + hb_set_t output[1]; recurse_func_t recurse_func; unsigned int nesting_level_left; unsigned int debug_depth; @@ -114,8 +114,8 @@ struct hb_closure_context_t : void flush () { - hb_set_union (glyphs, out); - hb_set_clear (out); + hb_set_union (glyphs, output); + hb_set_clear (output); } private: @@ -124,7 +124,7 @@ struct hb_closure_context_t : struct hb_would_apply_context_t : - hb_dispatch_context_t<hb_would_apply_context_t, bool, HB_DEBUG_WOULD_APPLY> + hb_dispatch_context_t<hb_would_apply_context_t, bool, 0> { const char *get_name () { return "WOULD_APPLY"; } template <typename T> @@ -151,13 +151,13 @@ struct hb_would_apply_context_t : struct hb_collect_glyphs_context_t : - hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_void_t, 0> + hb_dispatch_context_t<hb_collect_glyphs_context_t, hb_empty_t, 0> { const char *get_name () { return "COLLECT_GLYPHS"; } typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index); template <typename T> - return_t dispatch (const T &obj) { obj.collect_glyphs (this); return HB_VOID; } - static return_t default_return_value () { return HB_VOID; } + return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_empty_t (); } + static return_t default_return_value () { return hb_empty_t (); } void recurse (unsigned int lookup_index) { if (unlikely (nesting_level_left == 0 || !recurse_func)) @@ -286,7 +286,7 @@ struct hb_ot_apply_context_t : }; may_match_t may_match (const hb_glyph_info_t &info, - const HBUINT16 *glyph_data) const + const HBUINT16 *glyph_data) const { if (!(info.mask & mask) || (syllable && syllable != info.syllable ())) @@ -610,10 +610,10 @@ struct hb_ot_apply_context_t : struct hb_get_subtables_context_t : - hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY> + hb_dispatch_context_t<hb_get_subtables_context_t, hb_empty_t, HB_DEBUG_APPLY> { template <typename Type> - static bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c) + HB_INTERNAL static bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c) { const Type *typed_obj = (const Type *) obj; return typed_obj->apply (c); @@ -652,9 +652,9 @@ struct hb_get_subtables_context_t : { hb_applicable_t *entry = array.push(); entry->init (obj, apply_to<T>); - return HB_VOID; + return hb_empty_t (); } - static return_t default_return_value () { return HB_VOID; } + static return_t default_return_value () { return hb_empty_t (); } hb_get_subtables_context_t (array_t &array_) : array (array_), @@ -706,10 +706,11 @@ static inline bool intersects_array (const hb_set_t *glyphs, intersects_func_t intersects_func, const void *intersects_data) { - for (unsigned int i = 0; i < count; i++) - if (likely (!intersects_func (glyphs, values[i], intersects_data))) - return false; - return true; + return + + hb_iter (values, count) + | hb_map ([&] (const HBUINT16 &_) { return intersects_func (glyphs, _, intersects_data); }) + | hb_any + ; } @@ -734,8 +735,10 @@ static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED, collect_glyphs_func_t collect_func, const void *collect_data) { - for (unsigned int i = 0; i < count; i++) - collect_func (glyphs, values[i], collect_data); + return + + hb_iter (values, count) + | hb_apply ([&] (const HBUINT16 &_) { collect_func (glyphs, _, collect_data); }) + ; } @@ -846,7 +849,7 @@ static inline bool match_input (hb_ot_apply_context_t *c, if (ligbase == LIGBASE_NOT_CHECKED) { bool found = false; - const hb_glyph_info_t *out = buffer->out_info; + const auto *out = buffer->out_info; unsigned int j = buffer->out_len; while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id) { @@ -970,7 +973,7 @@ static inline bool ligate_input (hb_ot_apply_context_t *c, if (this_comp == 0) this_comp = last_num_components; unsigned int new_lig_comp = components_so_far - last_num_components + - MIN (this_comp, last_num_components); + hb_min (this_comp, last_num_components); _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp); } buffer->next_glyph (); @@ -992,7 +995,7 @@ static inline bool ligate_input (hb_ot_apply_context_t *c, if (!this_comp) break; unsigned int new_lig_comp = components_so_far - last_num_components + - MIN (this_comp, last_num_components); + hb_min (this_comp, last_num_components); _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp); } else break; @@ -1170,7 +1173,7 @@ static inline bool apply_lookup (hb_ot_apply_context_t *c, else { /* NOTE: delta is negative. */ - delta = MAX (delta, (int) next - (int) count); + delta = hb_max (delta, (int) next - (int) count); next -= delta; } @@ -1296,7 +1299,7 @@ struct Rule void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const { - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (inputZ.as_array ((inputCount ? inputCount - 1 : 0))); context_closure_lookup (c, inputCount, inputZ.arrayZ, @@ -1307,7 +1310,7 @@ struct Rule void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const { - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); context_collect_glyphs_lookup (c, inputCount, inputZ.arrayZ, @@ -1318,17 +1321,19 @@ struct Rule bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { - TRACE_WOULD_APPLY (this); - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); - return_trace (context_would_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context)); + return context_would_apply_lookup (c, + inputCount, inputZ.arrayZ, + lookupCount, lookupRecord.arrayZ, + lookup_context); } bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord> > + const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); return_trace (context_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context)); } @@ -1364,53 +1369,56 @@ struct RuleSet bool intersects (const hb_set_t *glyphs, ContextClosureLookupContext &lookup_context) const { - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - if ((this+rule[i]).intersects (glyphs, lookup_context)) - return true; - return false; + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const Rule &_) { return _.intersects (glyphs, lookup_context); }) + | hb_any + ; } void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const { - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - (this+rule[i]).closure (c, lookup_context); + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_apply ([&] (const Rule &_) { _.closure (c, lookup_context); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c, ContextCollectGlyphsLookupContext &lookup_context) const { - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - (this+rule[i]).collect_glyphs (c, lookup_context); + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_apply ([&] (const Rule &_) { _.collect_glyphs (c, lookup_context); }) + ; } bool would_apply (hb_would_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { - TRACE_WOULD_APPLY (this); - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - { - if ((this+rule[i]).would_apply (c, lookup_context)) - return_trace (true); - } - return_trace (false); + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const Rule &_) { return _.would_apply (c, lookup_context); }) + | hb_any + ; } bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - { - if ((this+rule[i]).apply (c, lookup_context)) - return_trace (true); - } - return_trace (false); + return_trace ( + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); }) + | hb_any + ) + ; } bool sanitize (hb_sanitize_context_t *c) const @@ -1437,16 +1445,14 @@ struct ContextFormat1 nullptr }; - unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (glyphs->has (iter.get_glyph ()) && - (this+ruleSet[iter.get_coverage ()]).intersects (glyphs, lookup_context)) - return true; - } - return false; + return + + hb_zip (this+coverage, ruleSet) + | hb_filter (*glyphs, hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_map ([&] (const RuleSet &_) { return _.intersects (glyphs, lookup_context); }) + | hb_any + ; } void closure (hb_closure_context_t *c) const @@ -1456,14 +1462,12 @@ struct ContextFormat1 nullptr }; - unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (c->glyphs->has (iter.get_glyph ())) - (this+ruleSet[iter.get_coverage ()]).closure (c, lookup_context); - } + + hb_zip (this+coverage, ruleSet) + | hb_filter (*c->glyphs, hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -1475,21 +1479,20 @@ struct ContextFormat1 nullptr }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - (this+ruleSet[i]).collect_glyphs (c, lookup_context); + + hb_iter (ruleSet) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.collect_glyphs (c, lookup_context); }) + ; } bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); - const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])]; struct ContextApplyLookupContext lookup_context = { {match_glyph}, nullptr }; - return_trace (rule_set.would_apply (c, lookup_context)); + return rule_set.would_apply (c, lookup_context); } const Coverage &get_coverage () const { return this+coverage; } @@ -1549,13 +1552,13 @@ struct ContextFormat2 &class_def }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - if (class_def.intersects_class (glyphs, i) && - (this+ruleSet[i]).intersects (glyphs, lookup_context)) - return true; - - return false; + return + + hb_enumerate (ruleSet) + | hb_map ([&] (const hb_pair_t<unsigned, const OffsetTo<RuleSet> &> p) + { return class_def.intersects_class (glyphs, p.first) && + (this+p.second).intersects (glyphs, lookup_context); }) + | hb_any + ; } void closure (hb_closure_context_t *c) const @@ -1570,12 +1573,15 @@ struct ContextFormat2 &class_def }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - if (class_def.intersects_class (c->glyphs, i)) { - const RuleSet &rule_set = this+ruleSet[i]; - rule_set.closure (c, lookup_context); - } + return + + hb_enumerate (ruleSet) + | hb_filter ([&] (unsigned _) + { return class_def.intersects_class (c->glyphs, _); }, + hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.closure (c, lookup_context); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -1588,15 +1594,14 @@ struct ContextFormat2 &class_def }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - (this+ruleSet[i]).collect_glyphs (c, lookup_context); + + hb_iter (ruleSet) + | hb_map (hb_add (this)) + | hb_apply ([&] (const RuleSet &_) { _.collect_glyphs (c, lookup_context); }) + ; } bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); - const ClassDef &class_def = this+classDef; unsigned int index = class_def.get_class (c->glyphs[0]); const RuleSet &rule_set = this+ruleSet[index]; @@ -1604,7 +1609,7 @@ struct ContextFormat2 {match_class}, &class_def }; - return_trace (rule_set.would_apply (c, lookup_context)); + return rule_set.would_apply (c, lookup_context); } const Coverage &get_coverage () const { return this+coverage; } @@ -1704,14 +1709,15 @@ struct ContextFormat3 bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); - const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount)); struct ContextApplyLookupContext lookup_context = { {match_coverage}, this }; - return_trace (context_would_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1), lookupCount, lookupRecord, lookup_context)); + return context_would_apply_lookup (c, + glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1), + lookupCount, lookupRecord, + lookup_context); } const Coverage &get_coverage () const { return this+coverageZ[0]; } @@ -1755,7 +1761,7 @@ struct ContextFormat3 HBUINT16 glyphCount; /* Number of glyphs in the input glyph * sequence */ HBUINT16 lookupCount; /* Number of LookupRecords */ - UnsizedArrayOf<OffsetTo<Coverage> > + UnsizedArrayOf<OffsetTo<Coverage>> coverageZ; /* Array of offsets to Coverage * table in glyph sequence order */ /*UnsizedArrayOf<LookupRecord> @@ -1767,15 +1773,15 @@ struct ContextFormat3 struct Context { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); - case 3: return_trace (c->dispatch (u.format3)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...)); + case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -1927,8 +1933,8 @@ struct ChainRule { bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const { - const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); - const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input); return chain_context_intersects (glyphs, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1939,9 +1945,9 @@ struct ChainRule void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const { - const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); - const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); chain_context_closure_lookup (c, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1953,9 +1959,9 @@ struct ChainRule void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const { - const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); - const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); chain_context_collect_glyphs_lookup (c, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1967,23 +1973,22 @@ struct ChainRule bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { - TRACE_WOULD_APPLY (this); - const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); - const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); - return_trace (chain_context_would_apply_lookup (c, - backtrack.len, backtrack.arrayZ, - input.lenP1, input.arrayZ, - lookahead.len, lookahead.arrayZ, lookup.len, - lookup.arrayZ, lookup_context)); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); + return chain_context_would_apply_lookup (c, + backtrack.len, backtrack.arrayZ, + input.lenP1, input.arrayZ, + lookahead.len, lookahead.arrayZ, lookup.len, + lookup.arrayZ, lookup_context); } bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); - const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); return_trace (chain_context_apply_lookup (c, backtrack.len, backtrack.arrayZ, input.lenP1, input.arrayZ, @@ -1995,11 +2000,11 @@ struct ChainRule { TRACE_SANITIZE (this); if (!backtrack.sanitize (c)) return_trace (false); - const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack); if (!input.sanitize (c)) return_trace (false); - const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input); if (!lookahead.sanitize (c)) return_trace (false); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); return_trace (lookup.sanitize (c)); } @@ -2025,46 +2030,51 @@ struct ChainRuleSet { bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const { - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - if ((this+rule[i]).intersects (glyphs, lookup_context)) - return true; - return false; + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRule &_) { return _.intersects (glyphs, lookup_context); }) + | hb_any + ; } void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const { - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - (this+rule[i]).closure (c, lookup_context); + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRule &_) { _.closure (c, lookup_context); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const { - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - (this+rule[i]).collect_glyphs (c, lookup_context); + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRule &_) { _.collect_glyphs (c, lookup_context); }) + ; } bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { - TRACE_WOULD_APPLY (this); - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - if ((this+rule[i]).would_apply (c, lookup_context)) - return_trace (true); - - return_trace (false); + return + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRule &_) { return _.would_apply (c, lookup_context); }) + | hb_any + ; } bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - unsigned int num_rules = rule.len; - for (unsigned int i = 0; i < num_rules; i++) - if ((this+rule[i]).apply (c, lookup_context)) - return_trace (true); - - return_trace (false); + return_trace ( + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); }) + | hb_any + ) + ; } bool sanitize (hb_sanitize_context_t *c) const @@ -2090,16 +2100,14 @@ struct ChainContextFormat1 {nullptr, nullptr, nullptr} }; - unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (glyphs->has (iter.get_glyph ()) && - (this+ruleSet[iter.get_coverage ()]).intersects (glyphs, lookup_context)) - return true; - } - return false; + return + + hb_zip (this+coverage, ruleSet) + | hb_filter (*glyphs, hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRuleSet &_) { return _.intersects (glyphs, lookup_context); }) + | hb_any + ; } void closure (hb_closure_context_t *c) const @@ -2109,14 +2117,12 @@ struct ChainContextFormat1 {nullptr, nullptr, nullptr} }; - unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) - { - if (unlikely (iter.get_coverage () >= count)) - break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ - if (c->glyphs->has (iter.get_glyph ())) - (this+ruleSet[iter.get_coverage ()]).closure (c, lookup_context); - } + + hb_zip (this+coverage, ruleSet) + | hb_filter (*c->glyphs, hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -2128,21 +2134,20 @@ struct ChainContextFormat1 {nullptr, nullptr, nullptr} }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - (this+ruleSet[i]).collect_glyphs (c, lookup_context); + + hb_iter (ruleSet) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.collect_glyphs (c, lookup_context); }) + ; } bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); - const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])]; struct ChainContextApplyLookupContext lookup_context = { {match_glyph}, {nullptr, nullptr, nullptr} }; - return_trace (rule_set.would_apply (c, lookup_context)); + return rule_set.would_apply (c, lookup_context); } const Coverage &get_coverage () const { return this+coverage; } @@ -2204,13 +2209,13 @@ struct ChainContextFormat2 &lookahead_class_def} }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - if (input_class_def.intersects_class (glyphs, i) && - (this+ruleSet[i]).intersects (glyphs, lookup_context)) - return true; - - return false; + return + + hb_enumerate (ruleSet) + | hb_map ([&] (const hb_pair_t<unsigned, const OffsetTo<ChainRuleSet> &> p) + { return input_class_def.intersects_class (glyphs, p.first) && + (this+p.second).intersects (glyphs, lookup_context); }) + | hb_any + ; } void closure (hb_closure_context_t *c) const { @@ -2228,12 +2233,15 @@ struct ChainContextFormat2 &lookahead_class_def} }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - if (input_class_def.intersects_class (c->glyphs, i)) { - const ChainRuleSet &rule_set = this+ruleSet[i]; - rule_set.closure (c, lookup_context); - } + return + + hb_enumerate (ruleSet) + | hb_filter ([&] (unsigned _) + { return input_class_def.intersects_class (c->glyphs, _); }, + hb_first) + | hb_map (hb_second) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.closure (c, lookup_context); }) + ; } void collect_glyphs (hb_collect_glyphs_context_t *c) const @@ -2251,15 +2259,14 @@ struct ChainContextFormat2 &lookahead_class_def} }; - unsigned int count = ruleSet.len; - for (unsigned int i = 0; i < count; i++) - (this+ruleSet[i]).collect_glyphs (c, lookup_context); + + hb_iter (ruleSet) + | hb_map (hb_add (this)) + | hb_apply ([&] (const ChainRuleSet &_) { _.collect_glyphs (c, lookup_context); }) + ; } bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); - const ClassDef &backtrack_class_def = this+backtrackClassDef; const ClassDef &input_class_def = this+inputClassDef; const ClassDef &lookahead_class_def = this+lookaheadClassDef; @@ -2272,7 +2279,7 @@ struct ChainContextFormat2 &input_class_def, &lookahead_class_def} }; - return_trace (rule_set.would_apply (c, lookup_context)); + return rule_set.would_apply (c, lookup_context); } const Coverage &get_coverage () const { return this+coverage; } @@ -2343,12 +2350,12 @@ struct ChainContextFormat3 { bool intersects (const hb_set_t *glyphs) const { - const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack); if (!(this+input[0]).intersects (glyphs)) return false; - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input); struct ChainContextClosureLookupContext lookup_context = { {intersects_coverage}, {this, this, this} @@ -2362,13 +2369,13 @@ struct ChainContextFormat3 void closure (hb_closure_context_t *c) const { - const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack); if (!(this+input[0]).intersects (c->glyphs)) return; - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); struct ChainContextClosureLookupContext lookup_context = { {intersects_coverage}, {this, this, this} @@ -2383,12 +2390,12 @@ struct ChainContextFormat3 void collect_glyphs (hb_collect_glyphs_context_t *c) const { - const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack); (this+input[0]).add_coverage (c->input); - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); struct ChainContextCollectGlyphsLookupContext lookup_context = { {collect_coverage}, {this, this, this} @@ -2403,38 +2410,36 @@ struct ChainContextFormat3 bool would_apply (hb_would_apply_context_t *c) const { - TRACE_WOULD_APPLY (this); - - const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); struct ChainContextApplyLookupContext lookup_context = { {match_coverage}, {this, this, this} }; - return_trace (chain_context_would_apply_lookup (c, - backtrack.len, (const HBUINT16 *) backtrack.arrayZ, - input.len, (const HBUINT16 *) input.arrayZ + 1, - lookahead.len, (const HBUINT16 *) lookahead.arrayZ, - lookup.len, lookup.arrayZ, lookup_context)); + return chain_context_would_apply_lookup (c, + backtrack.len, (const HBUINT16 *) backtrack.arrayZ, + input.len, (const HBUINT16 *) input.arrayZ + 1, + lookahead.len, (const HBUINT16 *) lookahead.arrayZ, + lookup.len, lookup.arrayZ, lookup_context); } const Coverage &get_coverage () const { - const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack); return this+input[0]; } bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); - const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack); unsigned int index = (this+input[0]).get_coverage (c->buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); struct ChainContextApplyLookupContext lookup_context = { {match_coverage}, {this, this, this} @@ -2457,12 +2462,12 @@ struct ChainContextFormat3 { TRACE_SANITIZE (this); if (!backtrack.sanitize (c, this)) return_trace (false); - const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); + const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack); if (!input.sanitize (c, this)) return_trace (false); if (!input.len) return_trace (false); /* To be consistent with Context. */ - const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input); + const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input); if (!lookahead.sanitize (c, this)) return_trace (false); - const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); + const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead); return_trace (lookup.sanitize (c)); } @@ -2489,15 +2494,15 @@ struct ChainContextFormat3 struct ChainContext { - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (c->dispatch (u.format1)); - case 2: return_trace (c->dispatch (u.format2)); - case 3: return_trace (c->dispatch (u.format3)); + case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...)); + case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...)); + case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -2519,18 +2524,14 @@ struct ExtensionFormat1 template <typename X> const X& get_subtable () const - { - unsigned int offset = extensionOffset; - if (unlikely (!offset)) return Null(typename T::SubTable); - return StructAtOffset<typename T::SubTable> (this, offset); - } + { return this + CastR<LOffsetTo<typename T::SubTable>> (extensionOffset); } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, format); if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ()); - return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type ())); + return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type (), hb_forward<Ts> (ds)...)); } /* This is called from may_dispatch() above with hb_sanitize_context_t. */ @@ -2538,7 +2539,6 @@ struct ExtensionFormat1 { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - extensionOffset != 0 && extensionLookupType != T::SubTable::Extension); } @@ -2547,7 +2547,7 @@ struct ExtensionFormat1 HBUINT16 extensionLookupType; /* Lookup type of subtable referenced * by ExtensionOffset (i.e. the * extension subtable). */ - HBUINT32 extensionOffset; /* Offset to the extension subtable, + Offset32 extensionOffset; /* Offset to the extension subtable, * of lookup type subtable. */ public: DEFINE_SIZE_STATIC (8); @@ -2572,13 +2572,13 @@ struct Extension } } - template <typename context_t> - typename context_t::return_t dispatch (context_t *c) const + template <typename context_t, typename ...Ts> + typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { TRACE_DISPATCH (this, u.format); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { - case 1: return_trace (u.format1.dispatch (c)); + case 1: return_trace (u.format1.dispatch (c, hb_forward<Ts> (ds)...)); default:return_trace (c->default_return_value ()); } } @@ -2681,7 +2681,7 @@ struct GSUBGPOS bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - struct GSUBGPOS *out = c->serializer->embed (*this); + auto *out = c->serializer->embed (*this); if (unlikely (!out)) return_trace (false); out->scriptList.serialize_subset (c, this+scriptList, out); @@ -2689,13 +2689,13 @@ struct GSUBGPOS typedef OffsetListOf<TLookup> TLookupList; /* TODO Use intersects() to count how many subtables survive? */ - CastR<OffsetTo<TLookupList> > (out->lookupList) + CastR<OffsetTo<TLookupList>> (out->lookupList) .serialize_subset (c, - this+CastR<const OffsetTo<TLookupList> > (lookupList), + this+CastR<OffsetTo<TLookupList>> (lookupList), out); if (version.to_int () >= 0x00010001u) - out->featureVars.serialize_subset (c, this+featureVars, out); + out->featureVars.serialize_copy (c->serializer, this+featureVars, out); return_trace (true); } @@ -2715,7 +2715,7 @@ struct GSUBGPOS likely (version.major == 1) && scriptList.sanitize (c, this) && featureList.sanitize (c, this) && - CastR<OffsetTo<TLookupList> > (lookupList).sanitize (c, this) && + CastR<OffsetTo<TLookupList>> (lookupList).sanitize (c, this) && (version.to_int () < 0x00010001u || featureVars.sanitize (c, this))); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc index 1365a3e21d8..1945df4feee 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc @@ -62,18 +62,54 @@ * kern */ +/** + * hb_ot_layout_has_kerning: + * @face: The #hb_face_t to work on + * + * Tests whether a face includes any kerning data in the 'kern' table. + * Does NOT test for kerning lookups in the GPOS table. + * + * Return value: true if data found, false otherwise + * + **/ bool hb_ot_layout_has_kerning (hb_face_t *face) { return face->table.kern->has_data (); } + +/** + * hb_ot_layout_has_machine_kerning: + * @face: The #hb_face_t to work on + * + * Tests whether a face includes any state-machine kerning in the 'kern' table. + * Does NOT examine the GPOS table. + * + * Return value: true if data found, false otherwise + * + **/ bool hb_ot_layout_has_machine_kerning (hb_face_t *face) { return face->table.kern->has_state_machine (); } + +/** + * hb_ot_layout_has_cross_kerning: + * @face: The #hb_face_t to work on + * + * Tests whether a face has any cross-stream kerning (i.e., kerns + * that make adjustments perpendicular to the direction of the text + * flow: Y adjustments in horizontal text or X adjustments in + * vertical text) in the 'kern' table. + * + * Does NOT examine the GPOS table. + * + * Return value: true is data found, false otherwise + * + **/ bool hb_ot_layout_has_cross_kerning (hb_face_t *face) { @@ -102,6 +138,9 @@ bool OT::GDEF::is_blacklisted (hb_blob_t *blob, hb_face_t *face) const { +#ifdef HB_NO_OT_LAYOUT_BLACKLIST + return false; +#endif /* The ugly business of blacklisting individual fonts' tables happen here! * See this thread for why we finally had to bend in and do this: * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html @@ -119,84 +158,82 @@ OT::GDEF::is_blacklisted (hb_blob_t *blob, * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693 * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875 */ -#define ENCODE(x,y,z) (((uint64_t) (x) << 48) | ((uint64_t) (y) << 24) | (uint64_t) (z)) - switch ENCODE(blob->length, - face->table.GSUB->table.get_length (), - face->table.GPOS->table.get_length ()) + switch HB_CODEPOINT_ENCODE3(blob->length, + face->table.GSUB->table.get_length (), + face->table.GPOS->table.get_length ()) { /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */ - case ENCODE (442, 2874, 42038): + case HB_CODEPOINT_ENCODE3 (442, 2874, 42038): /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */ - case ENCODE (430, 2874, 40662): + case HB_CODEPOINT_ENCODE3 (430, 2874, 40662): /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */ - case ENCODE (442, 2874, 39116): + case HB_CODEPOINT_ENCODE3 (442, 2874, 39116): /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */ - case ENCODE (430, 2874, 39374): + case HB_CODEPOINT_ENCODE3 (430, 2874, 39374): /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */ - case ENCODE (490, 3046, 41638): + case HB_CODEPOINT_ENCODE3 (490, 3046, 41638): /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */ - case ENCODE (478, 3046, 41902): + case HB_CODEPOINT_ENCODE3 (478, 3046, 41902): /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */ - case ENCODE (898, 12554, 46470): + case HB_CODEPOINT_ENCODE3 (898, 12554, 46470): /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */ - case ENCODE (910, 12566, 47732): + case HB_CODEPOINT_ENCODE3 (910, 12566, 47732): /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */ - case ENCODE (928, 23298, 59332): + case HB_CODEPOINT_ENCODE3 (928, 23298, 59332): /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */ - case ENCODE (940, 23310, 60732): + case HB_CODEPOINT_ENCODE3 (940, 23310, 60732): /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (964, 23836, 60072): + case HB_CODEPOINT_ENCODE3 (964, 23836, 60072): /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (976, 23832, 61456): + case HB_CODEPOINT_ENCODE3 (976, 23832, 61456): /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */ - case ENCODE (994, 24474, 60336): + case HB_CODEPOINT_ENCODE3 (994, 24474, 60336): /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */ - case ENCODE (1006, 24470, 61740): + case HB_CODEPOINT_ENCODE3 (1006, 24470, 61740): /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (1006, 24576, 61346): + case HB_CODEPOINT_ENCODE3 (1006, 24576, 61346): /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */ - case ENCODE (1018, 24572, 62828): + case HB_CODEPOINT_ENCODE3 (1018, 24572, 62828): /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5 tahoma.ttf from Windows 10 AU */ - case ENCODE (1006, 24576, 61352): + case HB_CODEPOINT_ENCODE3 (1006, 24576, 61352): /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2 tahomabd.ttf from Windows 10 AU */ - case ENCODE (1018, 24572, 62834): + case HB_CODEPOINT_ENCODE3 (1018, 24572, 62834): /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */ - case ENCODE (832, 7324, 47162): + case HB_CODEPOINT_ENCODE3 (832, 7324, 47162): /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */ - case ENCODE (844, 7302, 45474): + case HB_CODEPOINT_ENCODE3 (844, 7302, 45474): /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc himalaya.ttf from Windows 7 */ - case ENCODE (180, 13054, 7254): + case HB_CODEPOINT_ENCODE3 (180, 13054, 7254): /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */ - case ENCODE (192, 12638, 7254): + case HB_CODEPOINT_ENCODE3 (192, 12638, 7254): /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */ - case ENCODE (192, 12690, 7254): + case HB_CODEPOINT_ENCODE3 (192, 12690, 7254): /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */ /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */ - case ENCODE (188, 248, 3852): + case HB_CODEPOINT_ENCODE3 (188, 248, 3852): /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */ /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */ - case ENCODE (188, 264, 3426): + case HB_CODEPOINT_ENCODE3 (188, 264, 3426): /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */ - case ENCODE (1058, 47032, 11818): + case HB_CODEPOINT_ENCODE3 (1058, 47032, 11818): /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/ - case ENCODE (1046, 47030, 12600): + case HB_CODEPOINT_ENCODE3 (1046, 47030, 12600): /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */ - case ENCODE (1058, 71796, 16770): + case HB_CODEPOINT_ENCODE3 (1058, 71796, 16770): /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */ - case ENCODE (1046, 71790, 17862): + case HB_CODEPOINT_ENCODE3 (1046, 71790, 17862): /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */ - case ENCODE (1046, 71788, 17112): + case HB_CODEPOINT_ENCODE3 (1046, 71788, 17112): /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */ - case ENCODE (1058, 71794, 17514): + case HB_CODEPOINT_ENCODE3 (1058, 71794, 17514): /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */ - case ENCODE (1330, 109904, 57938): + case HB_CODEPOINT_ENCODE3 (1330, 109904, 57938): /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */ - case ENCODE (1330, 109904, 58972): + case HB_CODEPOINT_ENCODE3 (1330, 109904, 58972): /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85 Padauk.ttf * "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */ - case ENCODE (1004, 59092, 14836): + case HB_CODEPOINT_ENCODE3 (1004, 59092, 14836): return true; -#undef ENCODE } return false; } @@ -219,6 +256,15 @@ _hb_ot_layout_set_glyph_props (hb_font_t *font, /* Public API */ +/** + * hb_ot_layout_has_glyph_classes: + * @face: #hb_face_t to work upon + * + * Tests whether a face has any glyph classes defined in its GDEF table. + * + * Return value: true if data found, false otherwise + * + **/ hb_bool_t hb_ot_layout_has_glyph_classes (hb_face_t *face) { @@ -227,6 +273,13 @@ hb_ot_layout_has_glyph_classes (hb_face_t *face) /** * hb_ot_layout_get_glyph_class: + * @face: The #hb_face_t to work on + * @glyph: The #hb_codepoint_t code point to query + * + * Fetches the GDEF class of the requested glyph in the specified face. + * + * Return value: The #hb_ot_layout_glyph_class_t glyph class of the given code + * point in the GDEF table of the face. * * Since: 0.9.7 **/ @@ -239,6 +292,13 @@ hb_ot_layout_get_glyph_class (hb_face_t *face, /** * hb_ot_layout_get_glyphs_in_class: + * @face: The #hb_face_t to work on + * @klass: The #hb_ot_layout_glyph_class_t GDEF class to retrieve + * @glyphs: (out): The #hb_set_t set of all glyphs belonging to the requested + * class. + * + * Retrieves the set of all glyphs from the face that belong to the requested + * glyph class in the face's GDEF table. * * Since: 0.9.7 **/ @@ -250,6 +310,22 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t *face, return face->table.GDEF->table->get_glyphs_in_class (klass, glyphs); } + +/** + * hb_ot_layout_get_attach_points: + * @face: The #hb_face_t to work on + * @glyph: The #hb_codepoint_t code point to query + * @start_offset: offset of the first attachment point to retrieve + * @point_count: (inout) (allow-none): Input = the maximum number of attachment points to return; + * Output = the actual number of attachment points returned (may be zero) + * @point_array: (out) (array length=point_count): The array of attachment points found for the query + * + * Fetches a list of all attachment points for the specified glyph in the GDEF + * table of the face. The list returned will begin at the offset provided. + * + * Useful if the client program wishes to cache the list. + * + **/ unsigned int hb_ot_layout_get_attach_points (hb_face_t *face, hb_codepoint_t glyph, @@ -257,12 +333,33 @@ hb_ot_layout_get_attach_points (hb_face_t *face, unsigned int *point_count /* IN/OUT */, unsigned int *point_array /* OUT */) { +#ifdef HB_NO_LAYOUT_UNUSED + if (point_count) + *point_count = 0; + return 0; +#endif + return face->table.GDEF->table->get_attach_points (glyph, start_offset, point_count, point_array); } + +/** + * hb_ot_layout_get_ligature_carets: + * @font: The #hb_font_t to work on + * @direction: The #hb_direction_t text direction to use + * @glyph: The #hb_codepoint_t code point to query + * @start_offset: offset of the first caret position to retrieve + * @caret_count: (inout) (allow-none): Input = the maximum number of caret positions to return; + * Output = the actual number of caret positions returned (may be zero) + * @caret_array: (out) (array length=caret_count): The array of caret positions found for the query + * + * Fetches a list of the caret positions defined for a ligature glyph in the GDEF + * table of the font. The list returned will begin at the offset provided. + * + **/ unsigned int hb_ot_layout_get_ligature_carets (hb_font_t *font, hb_direction_t direction, @@ -271,6 +368,12 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font, unsigned int *caret_count /* IN/OUT */, hb_position_t *caret_array /* OUT */) { +#ifdef HB_NO_LAYOUT_UNUSED + if (caret_count) + *caret_count = 0; + return 0; +#endif + unsigned int result_caret_count = 0; unsigned int result = font->face->table.GDEF->table->get_lig_carets (font, direction, glyph, start_offset, &result_caret_count, caret_array); if (result) @@ -291,6 +394,9 @@ bool OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED, hb_face_t *face) const { +#ifdef HB_NO_OT_LAYOUT_BLACKLIST + return false; +#endif /* Mac OS X prefers morx over GSUB. It also ships with various Indic fonts, * all by 'MUTF' foundry (Tamil MN, Tamil Sangam MN, etc.), that have broken * GSUB/GPOS tables. Some have GSUB with zero scripts, those are ignored by @@ -316,6 +422,9 @@ bool OT::GPOS::is_blacklisted (hb_blob_t *blob HB_UNUSED, hb_face_t *face HB_UNUSED) const { +#ifdef HB_NO_OT_LAYOUT_BLACKLIST + return false; +#endif return false; } @@ -331,6 +440,19 @@ get_gsubgpos_table (hb_face_t *face, } +/** + * hb_ot_layout_table_get_script_tags: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @start_offset: offset of the first script tag to retrieve + * @script_count: (inout) (allow-none): Input = the maximum number of script tags to return; + * Output = the actual number of script tags returned (may be zero) + * @script_tags: (out) (array length=script_count): The array of #hb_tag_t script tags found for the query + * + * Fetches a list of all scripts enumerated in the specified face's GSUB table + * or GPOS table. The list returned will begin at the offset provided. + * + **/ unsigned int hb_ot_layout_table_get_script_tags (hb_face_t *face, hb_tag_t table_tag, @@ -345,11 +467,24 @@ hb_ot_layout_table_get_script_tags (hb_face_t *face, #define HB_OT_TAG_LATIN_SCRIPT HB_TAG ('l', 'a', 't', 'n') +/** + * hb_ot_layout_table_find_script: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_tag: #hb_tag_t of the script tag requested + * @script_index: (out): The index of the requested script tag + * + * Fetches the index if a given script tag in the specified face's GSUB table + * or GPOS table. + * + * Return value: true if the script is found, false otherwise + * + **/ hb_bool_t hb_ot_layout_table_find_script (hb_face_t *face, hb_tag_t table_tag, hb_tag_t script_tag, - unsigned int *script_index) + unsigned int *script_index /* OUT */) { static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), ""); const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); @@ -375,20 +510,38 @@ hb_ot_layout_table_find_script (hb_face_t *face, return false; } +#ifndef HB_DISABLE_DEPRECATED +/** + * hb_ot_layout_table_choose_script: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_tags: Array of #hb_tag_t script tags + * @script_index: (out): The index of the requested script tag + * @chosen_script: (out): #hb_tag_t of the script tag requested + * + * Deprecated since 2.0.0 + **/ hb_bool_t hb_ot_layout_table_choose_script (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *script_tags, - unsigned int *script_index, - hb_tag_t *chosen_script) + unsigned int *script_index /* OUT */, + hb_tag_t *chosen_script /* OUT */) { const hb_tag_t *t; for (t = script_tags; *t; t++); return hb_ot_layout_table_select_script (face, table_tag, t - script_tags, script_tags, script_index, chosen_script); } +#endif /** * hb_ot_layout_table_select_script: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_count: Number of script tags in the array + * @script_tags: Array of #hb_tag_t script tags + * @script_index: (out): The index of the requested script + * @chosen_script: (out): #hb_tag_t of the requested script * * Since: 2.0.0 **/ @@ -442,6 +595,19 @@ hb_ot_layout_table_select_script (hb_face_t *face, return false; } + +/** + * hb_ot_layout_table_get_feature_tags: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @start_offset: offset of the first feature tag to retrieve + * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return; + * Output = the actual number of feature tags returned (may be zero) + * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table + * + * Fetches a list of all feature tags in the given face's GSUB or GPOS table. + * + **/ unsigned int hb_ot_layout_table_get_feature_tags (hb_face_t *face, hb_tag_t table_tag, @@ -454,11 +620,24 @@ hb_ot_layout_table_get_feature_tags (hb_face_t *face, return g.get_feature_tags (start_offset, feature_count, feature_tags); } + +/** + * hb_ot_layout_table_find_feature: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @feature_tag: The #hb_tag_t og the requested feature tag + * @feature_index: (out): The index of the requested feature + * + * Fetches the index for a given feature tag in the specified face's GSUB table + * or GPOS table. + * + * Return value: true if the feature is found, false otherwise + **/ bool hb_ot_layout_table_find_feature (hb_face_t *face, hb_tag_t table_tag, hb_tag_t feature_tag, - unsigned int *feature_index) + unsigned int *feature_index /* OUT */) { static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), ""); const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); @@ -477,6 +656,20 @@ hb_ot_layout_table_find_feature (hb_face_t *face, } +/** + * hb_ot_layout_script_get_language_tags: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @start_offset: offset of the first language tag to retrieve + * @language_count: (inout) (allow-none): Input = the maximum number of language tags to return; + * Output = the actual number of language tags returned (may be zero) + * @language_tags: (out) (array length=language_count): Array of language tags found in the table + * + * Fetches a list of language tags in the given face's GSUB or GPOS table, underneath + * the specified script index. The list returned will begin at the offset provided. + * + **/ unsigned int hb_ot_layout_script_get_language_tags (hb_face_t *face, hb_tag_t table_tag, @@ -490,6 +683,24 @@ hb_ot_layout_script_get_language_tags (hb_face_t *face, return s.get_lang_sys_tags (start_offset, language_count, language_tags); } + +#ifndef HB_DISABLE_DEPRECATED +/** + * hb_ot_layout_script_find_language: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_tag: The #hb_tag_t of the requested language + * @language_index: The index of the requested language + * + * Fetches the index of a given language tag in the specified face's GSUB table + * or GPOS table, underneath the specified script tag. + * + * Return value: true if the language tag is found, false otherwise + * + * Since: ?? + * Deprecated: ?? + **/ hb_bool_t hb_ot_layout_script_find_language (hb_face_t *face, hb_tag_t table_tag, @@ -504,9 +715,22 @@ hb_ot_layout_script_find_language (hb_face_t *face, &language_tag, language_index); } +#endif + /** * hb_ot_layout_script_select_language: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_count: The number of languages in the specified script + * @language_tags: The array of language tags + * @language_index: (out): The index of the requested language + * + * Fetches the index of a given language tag in the specified face's GSUB table + * or GPOS table, underneath the specified script index. + * + * Return value: true if the language tag is found, false otherwise * * Since: 2.0.0 **/ @@ -536,6 +760,21 @@ hb_ot_layout_script_select_language (hb_face_t *face, return false; } + +/** + * hb_ot_layout_language_get_required_feature_index: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_index: The index of the requested language tag + * @feature_index: (out): The index of the requested feature + * + * Fetches the index of a requested feature in the given face's GSUB or GPOS table, + * underneath the specified script and language. + * + * Return value: true if the feature is found, false otherwise + * + **/ hb_bool_t hb_ot_layout_language_get_required_feature_index (hb_face_t *face, hb_tag_t table_tag, @@ -551,8 +790,20 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t *face, nullptr); } + /** * hb_ot_layout_language_get_required_feature: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_index: The index of the requested language tag + * @feature_index: The index of the requested feature + * @feature_tag: (out): The #hb_tag_t of the requested feature + * + * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table, + * underneath the specified script and language. + * + * Return value: true if the feature is found, false otherwise * * Since: 0.9.30 **/ @@ -574,6 +825,22 @@ hb_ot_layout_language_get_required_feature (hb_face_t *face, return l.has_required_feature (); } + +/** + * hb_ot_layout_language_get_feature_indexes: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_index: The index of the requested language tag + * @start_offset: offset of the first feature tag to retrieve + * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return; + * Output: the actual number of feature tags returned (may be zero) + * @feature_indexes: (out) (array length=feature_count): The array of feature indexes found for the query + * + * Fetches a list of all features in the specified face's GSUB table + * or GPOS table, underneath the specified script and language. The list + * returned will begin at the offset provided. + **/ unsigned int hb_ot_layout_language_get_feature_indexes (hb_face_t *face, hb_tag_t table_tag, @@ -589,6 +856,23 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t *face, return l.get_feature_indexes (start_offset, feature_count, feature_indexes); } + +/** + * hb_ot_layout_language_get_feature_tags: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_index: The index of the requested language tag + * @start_offset: offset of the first feature tag to retrieve + * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return; + * Output = the actual number of feature tags returned (may be zero) + * @feature_tags: (out) (array length=feature_count): The array of #hb_tag_t feature tags found for the query + * + * Fetches a list of all features in the specified face's GSUB table + * or GPOS table, underneath the specified script and language. The list + * returned will begin at the offset provided. + * + **/ unsigned int hb_ot_layout_language_get_feature_tags (hb_face_t *face, hb_tag_t table_tag, @@ -614,13 +898,28 @@ hb_ot_layout_language_get_feature_tags (hb_face_t *face, } +/** + * hb_ot_layout_language_find_feature: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_index: The index of the requested language tag + * @feature_tag: #hb_tag_t of the feature tag requested + * @feature_index: (out): The index of the requested feature + * + * Fetches the index of a given feature tag in the specified face's GSUB table + * or GPOS table, underneath the specified script and language. + * + * Return value: true if the feature is found, false otherwise + * + **/ hb_bool_t hb_ot_layout_language_find_feature (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_index, hb_tag_t feature_tag, - unsigned int *feature_index) + unsigned int *feature_index /* OUT */) { static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_FEATURE_INDEX), ""); const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); @@ -640,8 +939,20 @@ hb_ot_layout_language_find_feature (hb_face_t *face, return false; } + /** * hb_ot_layout_feature_get_lookups: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @feature_index: The index of the requested feature + * @start_offset: offset of the first lookup to retrieve + * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return; + * Output = the actual number of lookups returned (may be zero) + * @lookup_indexes: (out) (array length=lookup_count): The array of lookup indexes found for the query + * + * Fetches a list of all lookups enumerated for the specified feature, in + * the specified face's GSUB table or GPOS table. The list returned will + * begin at the offset provided. * * Since: 0.9.7 **/ @@ -662,8 +973,14 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face, lookup_indexes); } + /** * hb_ot_layout_table_get_lookup_count: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * + * Fetches the total number of lookups enumerated in the specified + * face's GSUB table or GPOS table. * * Since: 0.9.22 **/ @@ -805,8 +1122,21 @@ script_collect_features (hb_collect_features_context_t *c, } } + /** * hb_ot_layout_collect_features: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @scripts: The array of scripts to collect features for + * @languages: The array of languages to collect features for + * @features: The array of features to collect + * @feature_indexes: (out): The array of feature indexes found for the query + * + * Fetches a list of all feature indexes in the specified face's GSUB table + * or GPOS table, underneath the specified scripts, languages, and features. + * If no list of scripts is provided, all scripts will be queried. If no list + * of languages is provided, all languages will be queried. If no list of + * features is provided, all features will be queried. * * Since: 1.8.5 **/ @@ -843,8 +1173,21 @@ hb_ot_layout_collect_features (hb_face_t *face, } } + /** * hb_ot_layout_collect_lookups: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @scripts: The array of scripts to collect lookups for + * @languages: The array of languages to collect lookups for + * @features: The array of features to collect lookups for + * @lookup_indexes: (out): The array of lookup indexes found for the query + * + * Fetches a list of all feature-lookup indexes in the specified face's GSUB + * table or GPOS table, underneath the specified scripts, languages, and + * features. If no list of scripts is provided, all scripts will be queried. + * If no list of languages is provided, all languages will be queried. If no + * list of features is provided, all features will be queried. * * Since: 0.9.8 **/ @@ -866,8 +1209,19 @@ hb_ot_layout_collect_lookups (hb_face_t *face, g.get_feature (feature_index).add_lookup_indexes_to (lookup_indexes); } + /** * hb_ot_layout_lookup_collect_glyphs: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @lookup_index: The index of the feature lookup to query + * @glyphs_before: (out): Array of glyphs preceding the substitution range + * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup + * @glyphs_after: (out): Array of glyphs following the substition range + * @glyphs_output: (out): Array of glyphs that would be the substitued output of the lookup + * + * Fetches a list of all glyphs affected by the specified lookup in the + * specified face's GSUB table of GPOS table. * * Since: 0.9.7 **/ @@ -906,6 +1260,19 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, /* Variations support */ + +/** + * hb_ot_layout_table_find_feature_variations: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @coords: The variation coordinates to query + * @num_coords: The number of variation coorinates + * @variations_index: (out): The array of feature variations found for the query + * + * Fetches a list of feature variations in the specified face's GSUB table + * or GPOS table, at the specified variation coordinates. + * + **/ hb_bool_t hb_ot_layout_table_find_feature_variations (hb_face_t *face, hb_tag_t table_tag, @@ -918,6 +1285,23 @@ hb_ot_layout_table_find_feature_variations (hb_face_t *face, return g.find_variations_index (coords, num_coords, variations_index); } + +/** + * hb_ot_layout_feature_with_variations_get_lookups: + * @face: #hb_face_t to work upon + * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS + * @feature_index: The index of the feature to query + * @variations_index: The index of the feature variation to query + * @start_offset: offset of the first lookup to retrieve + * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return; + * Output = the actual number of lookups returned (may be zero) + * @lookup_indexes: (out) (array length=lookup_count): The array of lookups found for the query + * + * Fetches a list of all lookups enumerated for the specified feature, in + * the specified face's GSUB table or GPOS table, enabled at the specified + * variations index. The list returned will begin at the offset provided. + * + **/ unsigned int hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face, hb_tag_t table_tag, @@ -940,14 +1324,35 @@ hb_ot_layout_feature_with_variations_get_lookups (hb_face_t *face, * OT::GSUB */ + +/** + * hb_ot_layout_has_substitution: + * @face: #hb_face_t to work upon + * + * Tests whether the specified face includes any GSUB substitutions. + * + * Return value: true if data found, false otherwise + * + **/ hb_bool_t hb_ot_layout_has_substitution (hb_face_t *face) { return face->table.GSUB->table->has_data (); } + /** * hb_ot_layout_lookup_would_substitute: + * @face: #hb_face_t to work upon + * @lookup_index: The index of the lookup to query + * @glyphs: The sequence of glyphs to query for substitution + * @glyphs_length: The length of the glyph sequence + * @zero_context: #hb_bool_t indicating whether substitutions should be context-free + * + * Tests whether a specified lookup in the specified face would + * trigger a substitution on the given glyph sequence. + * + * Return value: true if a substitution would be triggered, false otherwise * * Since: 0.9.7 **/ @@ -966,6 +1371,16 @@ hb_ot_layout_lookup_would_substitute (hb_face_t *face, return l.would_apply (&c, &face->table.GSUB->accels[lookup_index]); } + +/** + * hb_ot_layout_substitute_start: + * @font: #hb_font_t to use + * @buffer: #hb_buffer_t buffer to work upon + * + * Called before substitution lookups are performed, to ensure that glyph + * class and other properties are set on the glyphs in the buffer. + * + **/ void hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer) @@ -1025,13 +1440,19 @@ hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer, /** * hb_ot_layout_lookup_substitute_closure: + * @face: #hb_face_t to work upon + * @lookup_index: index of the feature lookup to query + * @glyphs: (out): Array of glyphs comprising the transitive closure of the lookup + * + * Compute the transitive closure of glyphs needed for a + * specified lookup. * * Since: 0.9.7 **/ void hb_ot_layout_lookup_substitute_closure (hb_face_t *face, unsigned int lookup_index, - hb_set_t *glyphs) + hb_set_t *glyphs /* OUT */) { hb_map_t done_lookups; OT::hb_closure_context_t c (face, glyphs, &done_lookups); @@ -1043,6 +1464,9 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face, /** * hb_ot_layout_lookups_substitute_closure: + * @face: #hb_face_t to work upon + * @lookups: The set of lookups to query + * @glyphs: (out): Array of glyphs comprising the transitive closure of the lookups * * Compute the transitive closure of glyphs needed for all of the * provided lookups. @@ -1052,7 +1476,7 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face, void hb_ot_layout_lookups_substitute_closure (hb_face_t *face, const hb_set_t *lookups, - hb_set_t *glyphs) + hb_set_t *glyphs /* OUT */) { hb_map_t done_lookups; OT::hb_closure_context_t c (face, glyphs, &done_lookups); @@ -1081,32 +1505,84 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t *face, * OT::GPOS */ + +/** + * hb_ot_layout_has_positioning: + * @face: #hb_face_t to work upon + * + * Return value: true if the face has GPOS data, false otherwise + * + **/ hb_bool_t hb_ot_layout_has_positioning (hb_face_t *face) { return face->table.GPOS->table->has_data (); } +/** + * hb_ot_layout_position_start: + * @font: #hb_font_t to use + * @buffer: #hb_buffer_t buffer to work upon + * + * Called before positioning lookups are performed, to ensure that glyph + * attachment types and glyph-attachment chains are set for the glyphs in the buffer. + * + **/ void hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer) { OT::GPOS::position_start (font, buffer); } + +/** + * hb_ot_layout_position_finish_advances: + * @font: #hb_font_t to use + * @buffer: #hb_buffer_t buffer to work upon + * + * Called after positioning lookups are performed, to finish glyph advances. + * + **/ void hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer) { OT::GPOS::position_finish_advances (font, buffer); } +/** + * hb_ot_layout_position_finish_offsets: + * @font: #hb_font_t to use + * @buffer: #hb_buffer_t buffer to work upon + * + * Called after positioning lookups are performed, to finish glyph offsets. + * + **/ void hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) { OT::GPOS::position_finish_offsets (font, buffer); } + /** * hb_ot_layout_get_size_params: + * @face: #hb_face_t to work upon + * @design_size: (out): The design size of the face + * @subfamily_id: (out): The identifier of the face within the font subfamily + * @subfamily_name_id: (out): The ‘name’ table name ID of the face within the font subfamily + * @range_start: (out): The minimum size of the recommended size range for the face + * @range_end: (out): The maximum size of the recommended size range for the face + * + * Fetches optical-size feature data (i.e., the `size` feature from GPOS). Note that + * the subfamily_id and the subfamily name string (accessible via the subfamily_name_id) + * as used here are defined as pertaining only to fonts within a font family that differ + * specifically in their respective size ranges; other ways to differentiate fonts within + * a subfamily are not covered by the `size` feature. + * + * For more information on this distinction, see the `size` documentation at + * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-39size39 + * + * Return value: true if data found, false otherwise * * Since: 0.9.10 **/ @@ -1151,6 +1627,7 @@ hb_ot_layout_get_size_params (hb_face_t *face, return false; } + /** * hb_ot_layout_feature_get_name_ids: * @face: #hb_face_t to work upon @@ -1226,24 +1703,28 @@ hb_ot_layout_feature_get_name_ids (hb_face_t *face, return false; } + /** * hb_ot_layout_feature_get_characters: * @face: #hb_face_t to work upon * @table_tag: table tag to query, "GSUB" or "GPOS". * @feature_index: index of feature to query. - * @start_offset: In case the resulting char_count was equal to its input value, there - * is a chance there were more characters on the tag so this API can be - * called with an offset till resulting char_count gets to a number - * lower than input buffer (or consider using just a bigger buffer for - * one shot copying). - * @char_count: (inout) (allow-none): The count of characters for which this feature - * provides glyph variants. (May be zero.) - * @characters: (out caller-allocates) (array length=char_count): A buffer pointer. The Unicode codepoints - * of the characters for which this feature provides glyph variants. - * - * Fetches characters listed by designer under feature parameters for "Character - * Variant" ("cvXX") features. + * @start_offset: offset of the first character to retrieve + * @char_count: (inout) (allow-none): Input = the maximum number of characters to return; + * Output = the actual number of characters returned (may be zero) + * @characters: (out caller-allocates) (array length=char_count): A buffer pointer. + * The Unicode codepoints of the characters for which this feature provides + * glyph variants. + * + * Fetches a list of the characters defined as having a variant under the specified + * "Character Variant" ("cvXX") feature tag. * + * <note>Note: If the char_count output value is equal to its input value, then there + * is a chance there were more characters defined under the feature tag than were + * returned. This function can be called with incrementally larger start_offset + * until the char_count output value is lower than its input value, or the size + * of the characters array can be increased.</note> + * * Return value: Number of total sample characters in the cvXX feature. * * Since: 2.0.0 @@ -1269,7 +1750,7 @@ hb_ot_layout_feature_get_characters (hb_face_t *face, unsigned int len = 0; if (char_count && characters && start_offset < cv_params.characters.len) { - len = MIN (cv_params.characters.len - start_offset, *char_count); + len = hb_min (cv_params.characters.len - start_offset, *char_count); for (unsigned int i = 0; i < len; ++i) characters[i] = cv_params.characters[start_offset + i]; } @@ -1507,6 +1988,22 @@ typedef enum { HB_OT_LAYOUT_BASELINE_ROMN = HB_TAG('r','o','m','n') } hb_ot_layout_baseline_t; + +/** + * hb_ot_layout_get_baseline: + * @font: The #hb_font_t to work upon + * @baseline: The #hb_ot_layout_baseline_t to query + * @direction: The #hb_direction_t text direction to use (horizontal or vertical) + * @script_tag: #hb_tag_t of the script to use + * @language_tag: #hb_tag_t of the language to use + * @coord: (out): The position of the requested baseline + * + * Fetches the coordinates of the specified baseline in the face, underneath + * the specified script and language and in the specified text direction. + * + * Return value: true if the baseline is found for the settings queried, false otherwise + * + **/ HB_EXTERN hb_bool_t hb_ot_layout_get_baseline (hb_font_t *font, hb_ot_layout_baseline_t baseline, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h index e473954125e..3b9a78eafe4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h @@ -93,6 +93,17 @@ hb_ot_tags_to_script_and_language (hb_tag_t script_tag, HB_EXTERN hb_bool_t hb_ot_layout_has_glyph_classes (hb_face_t *face); +/** + * hb_ot_layout_glyph_class_t: + * @HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED: Glyphs not matching the other classifications + * @HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH: Spacing, single characters, capable of accepting marks + * @HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE: Glyphs that represent ligation of multiple characters + * @HB_OT_LAYOUT_GLYPH_CLASS_MARK: Non-spacing, combining glyphs that represent marks + * @HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT: Spacing glyphs that represent part of a single character + * + * The GDEF classes defined for glyphs. + * + **/ typedef enum { HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED = 0, HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH = 1, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc index ef0bcc716df..92d70bb415d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc @@ -188,12 +188,12 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, feature_infos[j].default_value = feature_infos[i].default_value; } else { feature_infos[j].flags &= ~F_GLOBAL; - feature_infos[j].max_value = MAX (feature_infos[j].max_value, feature_infos[i].max_value); + feature_infos[j].max_value = hb_max (feature_infos[j].max_value, feature_infos[i].max_value); /* Inherit default_value from j */ } feature_infos[j].flags |= (feature_infos[i].flags & F_HAS_FALLBACK); - feature_infos[j].stage[0] = MIN (feature_infos[j].stage[0], feature_infos[i].stage[0]); - feature_infos[j].stage[1] = MIN (feature_infos[j].stage[1], feature_infos[i].stage[1]); + feature_infos[j].stage[0] = hb_min (feature_infos[j].stage[0], feature_infos[i].stage[0]); + feature_infos[j].stage[1] = hb_min (feature_infos[j].stage[1], feature_infos[i].stage[1]); } feature_infos.shrink (j + 1); } @@ -213,34 +213,34 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, bits_needed = 0; else /* Limit bits per feature. */ - bits_needed = MIN(HB_OT_MAP_MAX_BITS, hb_bit_storage (info->max_value)); + bits_needed = hb_min (HB_OT_MAP_MAX_BITS, hb_bit_storage (info->max_value)); if (!info->max_value || next_bit + bits_needed > 8 * sizeof (hb_mask_t)) continue; /* Feature disabled, or not enough bits. */ - hb_bool_t found = false; + bool found = false; unsigned int feature_index[2]; for (unsigned int table_index = 0; table_index < 2; table_index++) { if (required_feature_tag[table_index] == info->tag) required_feature_stage[table_index] = info->stage[table_index]; - found |= hb_ot_layout_language_find_feature (face, - table_tags[table_index], - script_index[table_index], - language_index[table_index], - info->tag, - &feature_index[table_index]); + found |= (bool) hb_ot_layout_language_find_feature (face, + table_tags[table_index], + script_index[table_index], + language_index[table_index], + info->tag, + &feature_index[table_index]); } if (!found && (info->flags & F_GLOBAL_SEARCH)) { for (unsigned int table_index = 0; table_index < 2; table_index++) { - found |= hb_ot_layout_table_find_feature (face, - table_tags[table_index], - info->tag, - &feature_index[table_index]); + found |= (bool) hb_ot_layout_table_find_feature (face, + table_tags[table_index], + info->tag, + &feature_index[table_index]); } } if (!found && !(info->flags & F_HAS_FALLBACK)) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh index 28407c2176e..dd677863881 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh @@ -68,7 +68,7 @@ struct hb_ot_map_t unsigned short random : 1; hb_mask_t mask; - static int cmp (const void *pa, const void *pb) + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const lookup_map_t *a = (const lookup_map_t *) pa; const lookup_map_t *b = (const lookup_map_t *) pb; @@ -167,7 +167,7 @@ struct hb_ot_map_t hb_mask_t global_mask; - hb_vector_t<feature_map_t> features; + hb_sorted_vector_t<feature_map_t> features; hb_vector_t<lookup_map_t> lookups[2]; /* GSUB/GPOS */ hb_vector_t<stage_map_t> stages[2]; /* GSUB/GPOS */ }; @@ -247,7 +247,7 @@ struct hb_ot_map_builder_t unsigned int default_value; /* for non-global features, what should the unset glyphs take */ unsigned int stage[2]; /* GSUB/GPOS */ - static int cmp (const void *pa, const void *pb) + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const feature_info_t *a = (const feature_info_t *) pa; const feature_info_t *b = (const feature_info_t *) pb; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh index 62bf072e94d..dd622640410 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh @@ -664,7 +664,7 @@ struct MathVariants /* Array of offsets to MathGlyphConstruction tables - from the beginning of the MathVariants table, for shapes growing in vertical/horizontal direction. */ - UnsizedArrayOf<OffsetTo<MathGlyphConstruction> > + UnsizedArrayOf<OffsetTo<MathGlyphConstruction>> glyphConstruction; public: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc index bd31bf565ab..7f279232777 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc @@ -37,6 +37,11 @@ * @include: hb-ot.h * * Functions for fetching mathematics layout data from OpenType fonts. + * + * HarfBuzz itself does not implement a math layout solution. The + * functions and types provided can be used by client programs to access + * the font data necessary for typesetting OpenType Math layout. + * **/ @@ -48,31 +53,36 @@ * hb_ot_math_has_data: * @face: #hb_face_t to test * - * This function allows to verify the presence of an OpenType MATH table on the - * face. + * Tests whether a face has a `MATH` table. * - * Return value: true if face has a MATH table, false otherwise + * Return value: true if the table is found, false otherwise * * Since: 1.3.3 **/ hb_bool_t hb_ot_math_has_data (hb_face_t *face) { +#ifdef HB_NO_MATH + return false; +#endif + return face->table.MATH->has_data (); } /** * hb_ot_math_get_constant: - * @font: #hb_font_t from which to retrieve the value + * @font: #hb_font_t to work upon * @constant: #hb_ot_math_constant_t the constant to retrieve * - * This function returns the requested math constants as a #hb_position_t. - * If the request constant is HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, - * HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or - * HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is - * actually an integer between 0 and 100 representing that percentage. + * Fetches the specified math constant. For most constants, the value returned + * is an #hb_position_t. * - * Return value: the requested constant or 0 + * However, if the requested constant is #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, + * #HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or + * #HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN, then the return value is + * an integer between 0 and 100 representing that percentage. + * + * Return value: the requested constant or zero * * Since: 1.3.3 **/ @@ -80,15 +90,22 @@ hb_position_t hb_ot_math_get_constant (hb_font_t *font, hb_ot_math_constant_t constant) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_constant(constant, font); } /** * hb_ot_math_get_glyph_italics_correction: - * @font: #hb_font_t from which to retrieve the value - * @glyph: glyph index from which to retrieve the value + * @font: #hb_font_t to work upon + * @glyph: The glyph index from which to retrieve the value * - * Return value: the italics correction of the glyph or 0 + * Fetches an italics-correction value (if one exists) for the specified + * glyph index. + * + * Return value: the italics correction of the glyph or zero * * Since: 1.3.3 **/ @@ -96,15 +113,29 @@ hb_position_t hb_ot_math_get_glyph_italics_correction (hb_font_t *font, hb_codepoint_t glyph) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_glyph_info().get_italics_correction (glyph, font); } /** * hb_ot_math_get_glyph_top_accent_attachment: - * @font: #hb_font_t from which to retrieve the value - * @glyph: glyph index from which to retrieve the value + * @font: #hb_font_t to work upon + * @glyph: The glyph index from which to retrieve the value + * + * Fetches a top-accent-attachment value (if one exists) for the specified + * glyph index. * - * Return value: the top accent attachment of the glyph or 0 + * For any glyph that does not have a top-accent-attachment value - that is, + * a glyph not covered by the `MathTopAccentAttachment` table (or, when + * @font has no `MathTopAccentAttachment` table or no `MATH` table, any + * glyph) - the function synthesizes a value, returning the position at + * one-half the glyph's advance width. + * + * Return value: the top accent attachment of the glyph or 0.5 * the advance + * width of @glyph * * Since: 1.3.3 **/ @@ -112,13 +143,19 @@ hb_position_t hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font, hb_codepoint_t glyph) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_glyph_info().get_top_accent_attachment (glyph, font); } /** * hb_ot_math_is_glyph_extended_shape: - * @face: a #hb_face_t to test - * @glyph: a glyph index to test + * @face: #hb_face_t to work upon + * @glyph: The glyph index to test + * + * Tests whether the given glyph index is an extended shape in the face. * * Return value: true if the glyph is an extended shape, false otherwise * @@ -128,23 +165,29 @@ hb_bool_t hb_ot_math_is_glyph_extended_shape (hb_face_t *face, hb_codepoint_t glyph) { +#ifdef HB_NO_MATH + return false; +#endif + return face->table.MATH->get_glyph_info().is_extended_shape (glyph); } /** * hb_ot_math_get_glyph_kerning: - * @font: #hb_font_t from which to retrieve the value - * @glyph: glyph index from which to retrieve the value - * @kern: the #hb_ot_math_kern_t from which to retrieve the value + * @font: #hb_font_t to work upon + * @glyph: The glyph index from which to retrieve the value + * @kern: The #hb_ot_math_kern_t from which to retrieve the value * @correction_height: the correction height to use to determine the kerning. * - * This function tries to retrieve the MathKern table for the specified font, - * glyph and #hb_ot_math_kern_t. Then it browses the list of heights from the - * MathKern table to find one value that is greater or equal to specified - * correction_height. If one is found the corresponding value from the list of - * kerns is returned and otherwise the last kern value is returned. + * Fetches the math kerning (cut-ins) value for the specified font, glyph index, and + * @kern. + * + * If the MathKern table is found, the function examines it to find a height + * value that is greater or equal to @correction_height. If such a height + * value is found, corresponding kerning value from the table is returned. If + * no such height value is found, the last kerning value is returned. * - * Return value: requested kerning or 0 + * Return value: requested kerning value or zero * * Since: 1.3.3 **/ @@ -154,6 +197,10 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font, hb_ot_math_kern_t kern, hb_position_t correction_height) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_glyph_info().get_kerning (glyph, kern, correction_height, @@ -162,20 +209,24 @@ hb_ot_math_get_glyph_kerning (hb_font_t *font, /** * hb_ot_math_get_glyph_variants: - * @font: #hb_font_t from which to retrieve the values - * @glyph: index of the glyph to stretch - * @direction: direction of the stretching + * @font: #hb_font_t to work upon + * @glyph: The index of the glyph to stretch + * @direction: The direction of the stretching (horizontal or vertical) * @start_offset: offset of the first variant to retrieve - * @variants_count: maximum number of variants to retrieve after start_offset - * (IN) and actual number of variants retrieved (OUT) - * @variants: array of size at least @variants_count to store the result + * @variants_count: (inout): Input = the maximum number of variants to return; + * Output = the actual number of variants returned + * @variants: (out) (array length=variants_count): array of variants returned + * + * Fetches the MathGlyphConstruction for the specified font, glyph index, and + * direction. The corresponding list of size variants is returned as a list of + * #hb_ot_math_glyph_variant_t structs. * - * This function tries to retrieve the MathGlyphConstruction for the specified - * font, glyph and direction. Note that only the value of - * #HB_DIRECTION_IS_HORIZONTAL is considered. It provides the corresponding list - * of size variants as an array of hb_ot_math_glyph_variant_t structs. + * <note>The @direction parameter is only used to select between horizontal + * or vertical directions for the construction. Even though all #hb_direction_t + * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is + * considered.</note> * - * Return value: the total number of size variants available or 0 + * Return value: the total number of size variants available or zero * * Since: 1.3.3 **/ @@ -187,6 +238,12 @@ hb_ot_math_get_glyph_variants (hb_font_t *font, unsigned int *variants_count, /* IN/OUT */ hb_ot_math_glyph_variant_t *variants /* OUT */) { +#ifdef HB_NO_MATH + if (variants_count) + *variants_count = 0; + return 0; +#endif + return font->face->table.MATH->get_variants().get_glyph_variants (glyph, direction, font, start_offset, variants_count, @@ -195,15 +252,19 @@ hb_ot_math_get_glyph_variants (hb_font_t *font, /** * hb_ot_math_get_min_connector_overlap: - * @font: #hb_font_t from which to retrieve the value - * @direction: direction of the stretching + * @font: #hb_font_t to work upon + * @direction: direction of the stretching (horizontal or vertical) + * + * Fetches the MathVariants table for the specified font and returns the + * minimum overlap of connecting glyphs that are required to draw a glyph + * assembly in the specified direction. * - * This function tries to retrieve the MathVariants table for the specified - * font and returns the minimum overlap of connecting glyphs to draw a glyph - * assembly in the specified direction. Note that only the value of - * #HB_DIRECTION_IS_HORIZONTAL is considered. + * <note>The @direction parameter is only used to select between horizontal + * or vertical directions for the construction. Even though all #hb_direction_t + * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is + * considered.</note> * - * Return value: requested min connector overlap or 0 + * Return value: requested minimum connector overlap or zero * * Since: 1.3.3 **/ @@ -211,24 +272,33 @@ hb_position_t hb_ot_math_get_min_connector_overlap (hb_font_t *font, hb_direction_t direction) { +#ifdef HB_NO_MATH + return 0; +#endif + return font->face->table.MATH->get_variants().get_min_connector_overlap (direction, font); } /** * hb_ot_math_get_glyph_assembly: - * @font: #hb_font_t from which to retrieve the values - * @glyph: index of the glyph to stretch - * @direction: direction of the stretching + * @font: #hb_font_t to work upon + * @glyph: The index of the glyph to stretch + * @direction: direction of the stretching (horizontal or vertical) * @start_offset: offset of the first glyph part to retrieve - * @parts_count: maximum number of glyph parts to retrieve after start_offset - * (IN) and actual number of parts retrieved (OUT) - * @parts: array of size at least @parts_count to store the result - * @italics_correction: italic correction of the glyph assembly + * @parts_count: (inout): Input = maximum number of glyph parts to return; + * Output = actual number of parts returned + * @parts: (out) (array length=parts_count): the glyph parts returned + * @italics_correction: (out): italics correction of the glyph assembly * - * This function tries to retrieve the GlyphAssembly for the specified font, - * glyph and direction. Note that only the value of #HB_DIRECTION_IS_HORIZONTAL - * is considered. It provides the information necessary to draw the glyph - * assembly as an array of #hb_ot_math_glyph_part_t. + * Fetches the GlyphAssembly for the specified font, glyph index, and direction. + * Returned are a list of #hb_ot_math_glyph_part_t glyph parts that can be + * used to draw the glyph and an italics-correction value (if one is defined + * in the font). + * + * <note>The @direction parameter is only used to select between horizontal + * or vertical directions for the construction. Even though all #hb_direction_t + * values are accepted, only the result of #HB_DIRECTION_IS_HORIZONTAL is + * considered.</note> * * Return value: the total number of parts in the glyph assembly * @@ -243,6 +313,12 @@ hb_ot_math_get_glyph_assembly (hb_font_t *font, hb_ot_math_glyph_part_t *parts, /* OUT */ hb_position_t *italics_correction /* OUT */) { +#ifdef HB_NO_MATH + if (parts_count) + *parts_count = 0; + return 0; +#endif + return font->face->table.MATH->get_variants().get_glyph_parts (glyph, direction, font, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h index 521a5ca0376..d88aef8e949 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h @@ -50,6 +50,9 @@ HB_BEGIN_DECLS /** * hb_ot_math_constant_t: * + * The 'MATH' table constants specified at + * https://docs.microsoft.com/en-us/typography/opentype/spec/math + * * Since: 1.3.3 */ typedef enum { @@ -114,6 +117,9 @@ typedef enum { /** * hb_ot_math_kern_t: * + * The math kerning-table types defined for the four corners + * of a glyph. + * * Since: 1.3.3 */ typedef enum { @@ -125,6 +131,10 @@ typedef enum { /** * hb_ot_math_glyph_variant_t: + * @glyph: The glyph index of the variant + * @advance: The advance width of the variant + * + * Data type to hold math-variant information for a glyph. * * Since: 1.3.3 */ @@ -136,6 +146,8 @@ typedef struct hb_ot_math_glyph_variant_t { /** * hb_ot_math_glyph_part_flags_t: * + * Flags for math glyph parts. + * * Since: 1.3.3 */ typedef enum { /*< flags >*/ @@ -144,6 +156,15 @@ typedef enum { /*< flags >*/ /** * hb_ot_math_glyph_part_t: + * @glyph: The glyph index of the variant part + * @start_connector_length: The length of the connector on the starting side of the variant part + * @end_connection_length: The length of the conector on the ending side of the variant part + * @full_advance: The total advance of the part + * @flags: #hb_ot_math_glyph_part_flags_t flags for the part + * + * Data type to hold information for a "part" component of a math-variant glyph. + * Large variants for stretchable math glyphs (such as parentheses) can be constructed + * on the fly from parts. * * Since: 1.3.3 */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh index 10bd592e889..a2d9167c52c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh @@ -77,7 +77,7 @@ struct maxp void set_num_glyphs (unsigned int count) { - numGlyphs.set (count); + numGlyphs = count; } bool sanitize (hb_sanitize_context_t *c) const @@ -119,13 +119,13 @@ struct maxp if (maxp_prime->version.major == 1) { maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*maxp_prime); - v1.maxZones.set (1); - v1.maxTwilightPoints.set (0); - v1.maxStorage.set (0); - v1.maxFunctionDefs.set (0); - v1.maxInstructionDefs.set (0); - v1.maxStackElements.set (0); - v1.maxSizeOfInstructions.set (0); + v1.maxZones = 1; + v1.maxTwilightPoints = 0; + v1.maxStorage = 0; + v1.maxFunctionDefs = 0; + v1.maxInstructionDefs = 0; + v1.maxStackElements = 0; + v1.maxSizeOfInstructions = 0; } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language-static.hh index 0e37e0acb09..580e7637b90 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language-static.hh @@ -24,6 +24,9 @@ * Google Author(s): Behdad Esfahbod */ +#ifndef HB_OT_NAME_LANGUAGE_STATIC_HH +#define HB_OT_NAME_LANGUAGE_STATIC_HH + #include "hb-ot-name-language.hh" /* Following two tables were generated by joining FreeType, FontConfig, @@ -427,6 +430,9 @@ _hb_ot_name_language_for (unsigned int code, const hb_ot_language_map_t *array, unsigned int len) { +#ifdef HB_NO_OT_NAME_LANGUAGE + return HB_LANGUAGE_INVALID; +#endif const hb_ot_language_map_t *entry = (const hb_ot_language_map_t *) hb_bsearch (&code, array, @@ -455,3 +461,5 @@ _hb_ot_name_language_for_mac_code (unsigned int code) hb_mac_language_map, ARRAY_LENGTH (hb_mac_language_map)); } + +#endif /* HB_OT_NAME_LANGUAGE_STATIC_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh index c8ababd7b83..4eda46789ee 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh @@ -51,6 +51,7 @@ struct NameRecord { hb_language_t language (hb_face_t *face) const { +#ifndef HB_NO_OT_NAME_LANGUAGE unsigned int p = platformID; unsigned int l = languageID; @@ -60,9 +61,12 @@ struct NameRecord if (p == 1) return _hb_ot_name_language_for_mac_code (l); +#ifndef HB_NO_OT_NAME_LANGUAGE_AAT if (p == 0) return _hb_aat_language_get (face, l); +#endif +#endif return HB_LANGUAGE_INVALID; } @@ -93,11 +97,21 @@ struct NameRecord return UNSUPPORTED; } + NameRecord* copy (hb_serialize_context_t *c, + const void *src_base, + const void *dst_base) const + { + TRACE_SERIALIZE (this); + auto *out = c->embed (this); + if (unlikely (!out)) return_trace (nullptr); + out->offset.serialize_copy (c, src_base + offset, dst_base, length); + return_trace (out); + } + 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 (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset)); + return_trace (c->check_struct (this) && offset.sanitize (c, base, length)); } HBUINT16 platformID; /* Platform ID. */ @@ -105,7 +119,8 @@ struct NameRecord HBUINT16 languageID; /* Language ID. */ HBUINT16 nameID; /* Name ID. */ HBUINT16 length; /* String length (in bytes). */ - HBUINT16 offset; /* String offset from start of storage area (in bytes). */ + NNOffsetTo<UnsizedArrayOf<HBUINT8>> + offset; /* String offset from start of storage area (in bytes). */ public: DEFINE_SIZE_STATIC (12); }; @@ -156,15 +171,58 @@ struct name unsigned int get_size () const { return min_size + count * nameRecordZ.item_size; } + template <typename Iterator, + hb_requires (hb_is_source_of (Iterator, const NameRecord &))> + bool serialize (hb_serialize_context_t *c, + Iterator it, + const void *src_string_pool) + { + TRACE_SERIALIZE (this); + + if (unlikely (!c->extend_min ((*this)))) return_trace (false); + + this->format = 0; + this->count = it.len (); + + auto snap = c->snapshot (); + this->nameRecordZ.serialize (c, this->count); + if (unlikely (!c->check_assign (this->stringOffset, c->length ()))) return_trace (false); + c->revert (snap); + + const void *dst_string_pool = &(this + this->stringOffset); + + + it + | hb_apply ([=] (const NameRecord& _) { c->copy (_, src_string_pool, dst_string_pool); }) + ; + + if (unlikely (c->ran_out_of_room)) return_trace (false); + + assert (this->stringOffset == c->length ()); + + return_trace (true); + } + + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + + name *name_prime = c->serializer->start_embed<name> (); + if (unlikely (!name_prime)) return_trace (false); + + auto it = + + nameRecordZ.as_array (count) + | hb_filter (c->plan->name_ids, &NameRecord::nameID) + ; + + name_prime->serialize (c->serializer, it, hb_addressof (this + stringOffset)); + return_trace (name_prime->count); + } + bool sanitize_records (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); const void *string_pool = (this+stringOffset).arrayZ; - unsigned int _count = count; - /* Move to run-time?! */ - for (unsigned int i = 0; i < _count; i++) - if (!nameRecordZ[i].sanitize (c, string_pool)) return_trace (false); - return_trace (true); + return_trace (nameRecordZ.sanitize (c, count, string_pool)); } bool sanitize (hb_sanitize_context_t *c) const @@ -173,7 +231,8 @@ struct name return_trace (c->check_struct (this) && likely (format == 0 || format == 1) && c->check_array (nameRecordZ.arrayZ, count) && - c->check_range (this, stringOffset)); + c->check_range (this, stringOffset) && + sanitize_records (c)); } struct accelerator_t @@ -263,7 +322,7 @@ struct name /* We only implement format 0 for now. */ HBUINT16 format; /* Format selector (=0/1). */ HBUINT16 count; /* Number of name records. */ - NNOffsetTo<UnsizedArrayOf<HBUINT8> > + NNOffsetTo<UnsizedArrayOf<HBUINT8>> stringOffset; /* Offset to start of string storage (from start of table). */ UnsizedArrayOf<NameRecord> nameRecordZ; /* The name records where count is the number of records. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc index 907ae6ab504..5cd1cc1188a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc @@ -58,6 +58,11 @@ const hb_ot_name_entry_t * hb_ot_name_list_names (hb_face_t *face, unsigned int *num_entries /* OUT */) { +#ifdef HB_NO_NAME + if (num_entries) + *num_entries = 0; + return 0; +#endif const OT::name_accelerator_t &name = *face->table.name; if (num_entries) *num_entries = name.names.length; return (const hb_ot_name_entry_t *) name.names; @@ -93,7 +98,7 @@ hb_ot_name_convert_utf (hb_bytes_t bytes, dst = dst_next; src = src_next; - }; + } *text_size = dst - text; *dst = 0; /* NUL-terminate. */ @@ -105,7 +110,7 @@ hb_ot_name_convert_utf (hb_bytes_t bytes, { src = in_utf_t::next (src, src_end, &unicode, replacement); dst_len += out_utf_t::encode_len (unicode); - }; + } return dst_len; } @@ -167,6 +172,11 @@ hb_ot_name_get_utf8 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, char *text /* OUT */) { +#ifdef HB_NO_NAME + if (text_size) + *text_size = 0; + return 0; +#endif return hb_ot_name_get_utf<hb_utf8_t> (face, name_id, language, text_size, (hb_utf8_t::codepoint_t *) text); } @@ -194,6 +204,11 @@ hb_ot_name_get_utf16 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, uint16_t *text /* OUT */) { +#ifdef HB_NO_NAME + if (text_size) + *text_size = 0; + return 0; +#endif return hb_ot_name_get_utf<hb_utf16_t> (face, name_id, language, text_size, text); } @@ -220,5 +235,10 @@ hb_ot_name_get_utf32 (hb_face_t *face, unsigned int *text_size /* IN/OUT */, uint32_t *text /* OUT */) { +#ifdef HB_NO_NAME + if (text_size) + *text_size = 0; + return 0; +#endif return hb_ot_name_get_utf<hb_utf32_t> (face, name_id, language, text_size, text); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh index 68dd63e01e5..3b6a3727a41 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh @@ -160,8 +160,8 @@ struct OS2 uint16_t min_cp, max_cp; find_min_and_max_codepoint (plan->unicodes, &min_cp, &max_cp); - os2_prime->usFirstCharIndex.set (min_cp); - os2_prime->usLastCharIndex.set (max_cp); + os2_prime->usFirstCharIndex = min_cp; + os2_prime->usLastCharIndex = max_cp; _update_unicode_ranges (plan->unicodes, os2_prime->ulUnicodeRange); bool result = plan->add_table (HB_OT_TAG_OS2, os2_prime_blob); @@ -174,7 +174,7 @@ struct OS2 HBUINT32 ulUnicodeRange[4]) const { for (unsigned int i = 0; i < 4; i++) - ulUnicodeRange[i].set (0); + ulUnicodeRange[i] = 0; hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (codepoints->next (&cp)) { @@ -184,14 +184,14 @@ struct OS2 unsigned int block = bit / 32; unsigned int bit_in_block = bit % 32; unsigned int mask = 1 << bit_in_block; - ulUnicodeRange[block].set (ulUnicodeRange[block] | mask); + ulUnicodeRange[block] = ulUnicodeRange[block] | mask; } if (cp >= 0x10000 && cp <= 0x110000) { /* the spec says that bit 57 ("Non Plane 0") implies that there's at least one codepoint beyond the BMP; so I also include all the non-BMP codepoints here */ - ulUnicodeRange[1].set (ulUnicodeRange[1] | (1 << 25)); + ulUnicodeRange[1] = ulUnicodeRange[1] | (1 << 25); } } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh index 43c1143cf58..12e08316af5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh @@ -88,7 +88,7 @@ struct post return false; } - post_prime->version.major.set (3); // Version 3 does not have any glyph names. + post_prime->version.major = 3; // Version 3 does not have any glyph names. bool result = plan->add_table (HB_OT_TAG_post, post_prime_blob); hb_blob_destroy (post_prime_blob); @@ -131,7 +131,7 @@ struct post hb_bytes_t s = find_glyph_name (glyph); if (!s.length) return false; if (!buf_len) return true; - unsigned int len = MIN (buf_len - 1, s.length); + unsigned int len = hb_min (buf_len - 1, s.length); strncpy (buf, s.arrayZ, len); buf[len] = '\0'; return true; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh index 2a1f2f8458c..ecf3450490c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh @@ -66,8 +66,8 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS u_glyph > 0xFFFFu || s_glyph > 0xFFFFu) continue; - glyphs[num_glyphs].set (u_glyph); - substitutes[num_glyphs].set (s_glyph); + glyphs[num_glyphs] = u_glyph; + substitutes[num_glyphs] = s_glyph; num_glyphs++; } @@ -77,7 +77,9 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS /* Bubble-sort or something equally good! * May not be good-enough for presidential candidate interviews, but good-enough for us... */ - hb_stable_sort (&glyphs[0], num_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &substitutes[0]); + hb_stable_sort (&glyphs[0], num_glyphs, + (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::GlyphID::cmp, + &substitutes[0]); /* Each glyph takes four bytes max, and there's some overhead. */ @@ -86,10 +88,9 @@ arabic_fallback_synthesize_lookup_single (const hb_ot_shape_plan_t *plan HB_UNUS OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> (); bool ret = lookup->serialize_single (&c, OT::LookupFlag::IgnoreMarks, - hb_array (glyphs, num_glyphs), + hb_sorted_array (glyphs, num_glyphs), hb_array (substitutes, num_glyphs)); c.end_serialize (); - /* TODO sanitize the results? */ return ret ? c.copy<OT::SubstLookup> () : nullptr; } @@ -118,12 +119,14 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN hb_codepoint_t first_glyph; if (!hb_font_get_glyph (font, first_u, 0, &first_glyph)) continue; - first_glyphs[num_first_glyphs].set (first_glyph); + first_glyphs[num_first_glyphs] = first_glyph; ligature_per_first_glyph_count_list[num_first_glyphs] = 0; first_glyphs_indirection[num_first_glyphs] = first_glyph_idx; num_first_glyphs++; } - hb_stable_sort (&first_glyphs[0], num_first_glyphs, (int(*)(const OT::GlyphID*, const OT::GlyphID *)) OT::GlyphID::cmp, &first_glyphs_indirection[0]); + hb_stable_sort (&first_glyphs[0], num_first_glyphs, + (int(*)(const OT::HBUINT16*, const OT::HBUINT16 *)) OT::GlyphID::cmp, + &first_glyphs_indirection[0]); /* Now that the first-glyphs are sorted, walk again, populate ligatures. */ for (unsigned int i = 0; i < num_first_glyphs; i++) @@ -142,9 +145,9 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN ligature_per_first_glyph_count_list[i]++; - ligature_list[num_ligatures].set (ligature_glyph); + ligature_list[num_ligatures] = ligature_glyph; component_count_list[num_ligatures] = 2; - component_list[num_ligatures].set (second_glyph); + component_list[num_ligatures] = second_glyph; num_ligatures++; } } @@ -159,7 +162,7 @@ arabic_fallback_synthesize_lookup_ligature (const hb_ot_shape_plan_t *plan HB_UN OT::SubstLookup *lookup = c.start_serialize<OT::SubstLookup> (); bool ret = lookup->serialize_ligature (&c, OT::LookupFlag::IgnoreMarks, - hb_array (first_glyphs, num_first_glyphs), + hb_sorted_array (first_glyphs, num_first_glyphs), hb_array (ligature_per_first_glyph_count_list, num_first_glyphs), hb_array (ligature_list, num_ligatures), hb_array (component_count_list, num_ligatures), diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc index bdebde0f42e..3212e0c965b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc @@ -383,6 +383,10 @@ arabic_fallback_shape (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_OT_SHAPE_COMPLEX_ARABIC_FALLBACK + return; +#endif + const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data; if (!arabic_plan->do_fallback) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc index 90c36c023a4..14989730f38 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc @@ -70,6 +70,10 @@ compose_hebrew (const hb_ot_shape_normalize_context_t *c, bool found = (bool) c->unicode->compose (a, b, ab); +#ifdef HB_NO_OT_SHAPE_COMPLEX_HEBREW_FALLBACK + return found; +#endif + if (!found && !c->plan->has_gpos_mark) { /* Special-case Hebrew presentation forms that are excluded from diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh index 08b90e91312..ca26ecbaea3 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh @@ -34,788 +34,284 @@ #line 36 "hb-ot-shape-complex-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { - 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 4u, 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, 13u, 4u, 8u, 4u, 13u, - 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 8u, 8u, 4u, 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, 13u, 4u, 8u, - 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, - 5u, 8u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, - 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, - 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, - 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, - 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, - 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 8u, 3u, 17u, 3u, 17u, - 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, - 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, - 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, - 3u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, - 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 4u, 13u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, - 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, - 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, - 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, - 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 0 + 8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, + 4u, 13u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, + 4u, 8u, 4u, 13u, 4u, 13u, 4u, 13u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, + 6u, 6u, 16u, 16u, 4u, 8u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 7u, 5u, 8u, + 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 4u, 8u, 5u, 8u, 8u, 8u, 1u, 19u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 5u, 10u, 5u, 10u, 10u, 10u, 5u, 10u, + 1u, 16u, 1u, 16u, 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 5u, 10u, 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, + 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, + 5u, 10u, 3u, 17u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 1u, 16u, 3u, 10u, + 4u, 10u, 5u, 10u, 3u, 17u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, + 3u, 17u, 4u, 13u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 1u, 16u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 1u, 16u, 3u, 10u, 4u, 10u, + 5u, 10u, 3u, 17u, 4u, 10u, 5u, 10u, 5u, 10u, 3u, 10u, 5u, 10u, 1u, 17u, + 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, + 5u, 10u, 5u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 0 }; static const char _indic_syllable_machine_key_spans[] = { - 1, 5, 3, 1, 4, 3, 1, 4, - 3, 1, 4, 3, 1, 5, 1, 1, - 5, 1, 1, 5, 1, 1, 5, 1, - 1, 10, 5, 10, 5, 10, 5, 10, - 5, 10, 1, 5, 3, 1, 4, 3, - 1, 4, 3, 1, 4, 3, 1, 5, - 1, 1, 5, 1, 1, 5, 1, 1, - 5, 1, 1, 10, 5, 10, 5, 10, - 5, 10, 5, 10, 1, 5, 3, 1, - 4, 3, 1, 4, 3, 1, 4, 3, - 1, 5, 1, 1, 5, 1, 1, 5, - 1, 1, 5, 1, 1, 10, 5, 10, - 5, 10, 5, 10, 5, 1, 5, 3, - 1, 4, 3, 1, 4, 3, 1, 4, - 3, 1, 5, 1, 1, 5, 1, 1, - 5, 1, 1, 5, 1, 1, 10, 5, - 10, 5, 10, 5, 10, 5, 10, 10, - 4, 1, 19, 15, 15, 14, 16, 15, - 15, 14, 16, 15, 15, 14, 16, 15, - 15, 14, 16, 15, 15, 14, 6, 6, - 6, 1, 1, 1, 6, 8, 6, 8, - 7, 6, 8, 7, 6, 8, 7, 6, - 8, 7, 7, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 15, 15, 16, - 16, 16, 15, 15, 16, 16, 16, 15, - 15, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 6, 6, 6, 1, - 1, 1, 6, 8, 6, 8, 7, 6, - 8, 7, 6, 8, 7, 6, 8, 7, - 7, 15, 15, 16, 16, 16, 15, 15, - 16, 16, 16, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 5, 15, 15, - 14, 16, 15, 15, 14, 16, 15, 15, - 14, 16, 15, 15, 14, 16, 15, 15, - 14, 6, 6, 6, 1, 1, 1, 6, - 8, 6, 8, 7, 6, 8, 7, 6, - 8, 7, 6, 8, 7, 7, 15, 15, - 16, 16, 16, 15, 15, 16, 16, 16, - 15, 15, 16, 16, 16, 15, 15, 16, - 16, 16, 10, 15, 5, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 16, 15, 15, 14, 16, 15, 15, 14, - 6, 6, 6, 1, 1, 1, 6, 8, - 6, 8, 7, 6, 8, 7, 6, 8, - 7, 6, 8, 7, 7, 15, 15, 16, - 16, 16, 15, 15, 16, 16, 16, 15, - 15, 16, 16, 16, 15, 15, 16, 16, - 16, 15, 17, 15, 17, 10, 6, 1, - 1, 1, 6, 16, 8, 6, 6, 1, - 1, 1, 6, 16 + 1, 5, 3, 4, 5, 1, 1, 5, + 10, 5, 1, 3, 4, 5, 1, 1, + 5, 10, 10, 10, 1, 3, 4, 5, + 1, 1, 5, 5, 10, 1, 3, 4, + 5, 1, 1, 5, 5, 4, 1, 19, + 15, 15, 14, 16, 6, 6, 1, 6, + 16, 16, 16, 8, 7, 6, 7, 6, + 8, 6, 15, 15, 15, 15, 14, 16, + 15, 15, 14, 16, 6, 1, 6, 16, + 16, 8, 7, 6, 7, 6, 6, 8, + 6, 15, 15, 5, 15, 15, 14, 16, + 15, 16, 6, 1, 6, 16, 16, 8, + 7, 6, 15, 7, 6, 6, 8, 6, + 15, 10, 5, 15, 15, 14, 16, 15, + 16, 6, 1, 6, 16, 16, 8, 7, + 6, 15, 7, 6, 6, 8, 6, 17, + 15, 17, 10, 6, 1, 6, 16, 8, + 6, 6, 1, 6, 16 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 2, 8, 12, 14, 19, 23, 25, - 30, 34, 36, 41, 45, 47, 53, 55, - 57, 63, 65, 67, 73, 75, 77, 83, - 85, 87, 98, 104, 115, 121, 132, 138, - 149, 155, 166, 168, 174, 178, 180, 185, - 189, 191, 196, 200, 202, 207, 211, 213, - 219, 221, 223, 229, 231, 233, 239, 241, - 243, 249, 251, 253, 264, 270, 281, 287, - 298, 304, 315, 321, 332, 334, 340, 344, - 346, 351, 355, 357, 362, 366, 368, 373, - 377, 379, 385, 387, 389, 395, 397, 399, - 405, 407, 409, 415, 417, 419, 430, 436, - 447, 453, 464, 470, 481, 487, 489, 495, - 499, 501, 506, 510, 512, 517, 521, 523, - 528, 532, 534, 540, 542, 544, 550, 552, - 554, 560, 562, 564, 570, 572, 574, 585, - 591, 602, 608, 619, 625, 636, 642, 653, - 664, 669, 671, 691, 707, 723, 738, 755, - 771, 787, 802, 819, 835, 851, 866, 883, - 899, 915, 930, 947, 963, 979, 994, 1001, - 1008, 1015, 1017, 1019, 1021, 1028, 1037, 1044, - 1053, 1061, 1068, 1077, 1085, 1092, 1101, 1109, - 1116, 1125, 1133, 1141, 1157, 1173, 1190, 1207, - 1224, 1240, 1256, 1273, 1290, 1307, 1323, 1339, - 1356, 1373, 1390, 1406, 1422, 1439, 1456, 1473, - 1489, 1505, 1521, 1537, 1552, 1569, 1585, 1601, - 1616, 1633, 1649, 1665, 1680, 1697, 1713, 1729, - 1744, 1761, 1777, 1793, 1808, 1815, 1822, 1829, - 1831, 1833, 1835, 1842, 1851, 1858, 1867, 1875, - 1882, 1891, 1899, 1906, 1915, 1923, 1930, 1939, - 1947, 1955, 1971, 1987, 2004, 2021, 2038, 2054, - 2070, 2087, 2104, 2121, 2137, 2153, 2170, 2187, - 2204, 2220, 2236, 2253, 2270, 2287, 2293, 2309, - 2325, 2340, 2357, 2373, 2389, 2404, 2421, 2437, - 2453, 2468, 2485, 2501, 2517, 2532, 2549, 2565, - 2581, 2596, 2603, 2610, 2617, 2619, 2621, 2623, - 2630, 2639, 2646, 2655, 2663, 2670, 2679, 2687, - 2694, 2703, 2711, 2718, 2727, 2735, 2743, 2759, - 2775, 2792, 2809, 2826, 2842, 2858, 2875, 2892, - 2909, 2925, 2941, 2958, 2975, 2992, 3008, 3024, - 3041, 3058, 3075, 3086, 3102, 3108, 3124, 3140, - 3155, 3172, 3188, 3204, 3219, 3236, 3252, 3268, - 3283, 3300, 3316, 3332, 3347, 3364, 3380, 3396, - 3411, 3418, 3425, 3432, 3434, 3436, 3438, 3445, - 3454, 3461, 3470, 3478, 3485, 3494, 3502, 3509, - 3518, 3526, 3533, 3542, 3550, 3558, 3574, 3590, - 3607, 3624, 3641, 3657, 3673, 3690, 3707, 3724, - 3740, 3756, 3773, 3790, 3807, 3823, 3839, 3856, - 3873, 3890, 3906, 3924, 3940, 3958, 3969, 3976, - 3978, 3980, 3982, 3989, 4006, 4015, 4022, 4029, - 4031, 4033, 4035, 4042 + 0, 2, 8, 12, 17, 23, 25, 27, + 33, 44, 50, 52, 56, 61, 67, 69, + 71, 77, 88, 99, 110, 112, 116, 121, + 127, 129, 131, 137, 143, 154, 156, 160, + 165, 171, 173, 175, 181, 187, 192, 194, + 214, 230, 246, 261, 278, 285, 292, 294, + 301, 318, 335, 352, 361, 369, 376, 384, + 391, 400, 407, 423, 439, 455, 471, 486, + 503, 519, 535, 550, 567, 574, 576, 583, + 600, 617, 626, 634, 641, 649, 656, 663, + 672, 679, 695, 711, 717, 733, 749, 764, + 781, 797, 814, 821, 823, 830, 847, 864, + 873, 881, 888, 904, 912, 919, 926, 935, + 942, 958, 969, 975, 991, 1007, 1022, 1039, + 1055, 1072, 1079, 1081, 1088, 1105, 1122, 1131, + 1139, 1146, 1162, 1170, 1177, 1184, 1193, 1200, + 1218, 1234, 1252, 1263, 1270, 1272, 1279, 1296, + 1305, 1312, 1319, 1321, 1328 }; -static const short _indic_syllable_machine_indicies[] = { +static const unsigned char _indic_syllable_machine_indicies[] = { 1, 0, 2, 3, 3, 4, 1, 0, - 5, 5, 4, 0, 4, 0, 6, 6, - 7, 1, 0, 8, 8, 7, 0, 7, - 0, 9, 9, 10, 1, 0, 11, 11, - 10, 0, 10, 0, 12, 12, 13, 1, - 0, 14, 14, 13, 0, 13, 0, 15, - 0, 0, 0, 1, 0, 16, 0, 17, - 0, 18, 12, 12, 13, 1, 0, 19, - 0, 20, 0, 21, 9, 9, 10, 1, - 0, 22, 0, 23, 0, 24, 6, 6, - 7, 1, 0, 25, 0, 26, 0, 2, - 3, 3, 4, 1, 0, 0, 0, 0, - 27, 0, 28, 3, 3, 4, 1, 0, - 28, 3, 3, 4, 1, 0, 0, 0, - 0, 29, 0, 30, 3, 3, 4, 1, - 0, 30, 3, 3, 4, 1, 0, 0, - 0, 0, 31, 0, 32, 3, 3, 4, - 1, 0, 32, 3, 3, 4, 1, 0, - 0, 0, 0, 33, 0, 34, 3, 3, - 4, 1, 0, 34, 3, 3, 4, 1, - 0, 0, 0, 0, 35, 0, 37, 36, - 38, 39, 39, 40, 37, 36, 41, 41, - 40, 36, 40, 36, 42, 42, 43, 37, - 36, 44, 44, 43, 36, 43, 36, 45, - 45, 46, 37, 36, 47, 47, 46, 36, - 46, 36, 48, 48, 49, 37, 36, 50, - 50, 49, 36, 49, 36, 51, 36, 36, - 36, 37, 36, 52, 36, 53, 36, 54, - 48, 48, 49, 37, 36, 55, 36, 56, - 36, 57, 45, 45, 46, 37, 36, 58, - 36, 59, 36, 60, 42, 42, 43, 37, - 36, 61, 36, 62, 36, 38, 39, 39, - 40, 37, 36, 36, 36, 36, 63, 36, - 64, 39, 39, 40, 37, 36, 64, 39, - 39, 40, 37, 36, 36, 36, 36, 65, - 36, 66, 39, 39, 40, 37, 36, 66, - 39, 39, 40, 37, 36, 36, 36, 36, - 67, 36, 68, 39, 39, 40, 37, 36, - 68, 39, 39, 40, 37, 36, 36, 36, - 36, 69, 36, 70, 39, 39, 40, 37, - 36, 70, 39, 39, 40, 37, 36, 36, - 36, 36, 71, 36, 73, 72, 74, 75, - 75, 76, 73, 72, 78, 78, 76, 77, - 76, 77, 79, 79, 80, 73, 72, 81, - 81, 80, 72, 80, 72, 82, 82, 83, - 73, 72, 84, 84, 83, 72, 83, 72, - 85, 85, 86, 73, 72, 87, 87, 86, - 72, 86, 72, 88, 72, 72, 72, 73, - 72, 89, 72, 90, 72, 91, 85, 85, - 86, 73, 72, 92, 72, 93, 72, 94, - 82, 82, 83, 73, 72, 95, 72, 96, - 72, 97, 79, 79, 80, 73, 72, 98, - 72, 99, 72, 74, 75, 75, 76, 73, - 72, 72, 72, 72, 100, 72, 101, 75, - 75, 76, 73, 72, 101, 75, 75, 76, - 73, 72, 72, 72, 72, 102, 72, 103, - 75, 75, 76, 73, 72, 103, 75, 75, - 76, 73, 72, 72, 72, 72, 104, 72, - 105, 75, 75, 76, 73, 72, 105, 75, - 75, 76, 73, 72, 72, 72, 72, 106, - 72, 107, 75, 75, 76, 73, 72, 109, - 108, 110, 111, 111, 112, 109, 108, 113, - 113, 112, 108, 112, 108, 114, 114, 115, - 109, 108, 116, 116, 115, 108, 115, 108, - 117, 117, 118, 109, 108, 119, 119, 118, - 108, 118, 108, 120, 120, 121, 109, 108, - 122, 122, 121, 108, 121, 108, 123, 108, - 108, 108, 109, 108, 124, 108, 125, 108, - 126, 120, 120, 121, 109, 108, 127, 108, - 128, 108, 129, 117, 117, 118, 109, 108, - 130, 108, 131, 108, 132, 114, 114, 115, - 109, 108, 133, 108, 134, 108, 110, 111, - 111, 112, 109, 108, 108, 108, 108, 135, - 108, 136, 111, 111, 112, 109, 108, 136, - 111, 111, 112, 109, 108, 108, 108, 108, - 137, 108, 138, 111, 111, 112, 109, 108, - 138, 111, 111, 112, 109, 108, 108, 108, - 108, 139, 108, 140, 111, 111, 112, 109, - 108, 140, 111, 111, 112, 109, 108, 108, - 108, 108, 141, 108, 142, 111, 111, 112, - 109, 108, 142, 111, 111, 112, 109, 108, - 108, 108, 108, 143, 108, 107, 75, 75, - 76, 73, 72, 72, 72, 72, 144, 72, - 78, 78, 76, 1, 0, 146, 145, 148, - 149, 150, 151, 152, 153, 76, 73, 147, - 154, 155, 155, 144, 147, 156, 157, 158, - 159, 160, 147, 162, 163, 164, 165, 4, - 1, 161, 166, 161, 161, 35, 161, 161, - 161, 167, 161, 168, 163, 169, 169, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 163, 169, 169, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 170, 161, 161, 161, 17, 171, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 170, 161, 172, 173, 174, 175, 4, - 1, 161, 166, 161, 161, 33, 161, 161, - 161, 167, 161, 176, 173, 177, 177, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 173, 177, 177, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 178, 161, 161, 161, 17, 179, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 178, 161, 180, 181, 182, 183, 4, - 1, 161, 166, 161, 161, 31, 161, 161, - 161, 167, 161, 184, 181, 185, 185, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 181, 185, 185, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 186, 161, 161, 161, 17, 187, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 186, 161, 188, 189, 190, 191, 4, - 1, 161, 166, 161, 161, 29, 161, 161, - 161, 167, 161, 192, 189, 193, 193, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 189, 193, 193, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 194, 161, 161, 161, 17, 195, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 194, 161, 196, 197, 198, 199, 4, - 1, 161, 166, 161, 161, 27, 161, 161, - 161, 167, 161, 200, 197, 201, 201, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 197, 201, 201, 4, 1, - 161, 166, 161, 161, 161, 161, 161, 161, - 167, 161, 17, 202, 161, 1, 161, 166, - 161, 203, 203, 161, 1, 161, 166, 161, - 204, 161, 161, 205, 161, 166, 161, 166, - 161, 206, 161, 207, 161, 204, 161, 161, - 161, 161, 166, 161, 17, 161, 203, 203, - 161, 1, 161, 166, 161, 203, 202, 161, - 1, 161, 166, 161, 208, 26, 209, 210, - 7, 1, 161, 166, 161, 26, 209, 210, - 7, 1, 161, 166, 161, 209, 209, 7, - 1, 161, 166, 161, 211, 23, 212, 213, - 10, 1, 161, 166, 161, 23, 212, 213, - 10, 1, 161, 166, 161, 212, 212, 10, - 1, 161, 166, 161, 214, 20, 215, 216, - 13, 1, 161, 166, 161, 20, 215, 216, - 13, 1, 161, 166, 161, 215, 215, 13, - 1, 161, 166, 161, 217, 17, 203, 218, - 161, 1, 161, 166, 161, 17, 203, 218, - 161, 1, 161, 166, 161, 197, 201, 201, - 4, 1, 161, 166, 161, 196, 197, 201, - 201, 4, 1, 161, 166, 161, 161, 161, - 161, 161, 161, 167, 161, 196, 197, 198, - 201, 4, 1, 161, 166, 161, 161, 27, - 161, 161, 161, 167, 161, 194, 161, 219, - 161, 203, 203, 161, 1, 161, 166, 161, - 161, 161, 161, 161, 194, 161, 194, 161, - 161, 161, 203, 203, 161, 1, 161, 166, - 161, 161, 161, 161, 161, 194, 161, 194, - 161, 161, 161, 203, 195, 161, 1, 161, - 166, 161, 161, 161, 161, 161, 194, 161, - 188, 189, 193, 193, 4, 1, 161, 166, - 161, 161, 161, 161, 161, 161, 167, 161, - 188, 189, 190, 193, 4, 1, 161, 166, - 161, 161, 29, 161, 161, 161, 167, 161, - 186, 161, 220, 161, 203, 203, 161, 1, - 161, 166, 161, 161, 161, 161, 161, 186, - 161, 186, 161, 161, 161, 203, 203, 161, - 1, 161, 166, 161, 161, 161, 161, 161, - 186, 161, 186, 161, 161, 161, 203, 187, - 161, 1, 161, 166, 161, 161, 161, 161, - 161, 186, 161, 180, 181, 185, 185, 4, - 1, 161, 166, 161, 161, 161, 161, 161, - 161, 167, 161, 180, 181, 182, 185, 4, - 1, 161, 166, 161, 161, 31, 161, 161, - 161, 167, 161, 178, 161, 221, 161, 203, - 203, 161, 1, 161, 166, 161, 161, 161, - 161, 161, 178, 161, 178, 161, 161, 161, - 203, 203, 161, 1, 161, 166, 161, 161, - 161, 161, 161, 178, 161, 178, 161, 161, - 161, 203, 179, 161, 1, 161, 166, 161, - 161, 161, 161, 161, 178, 161, 172, 173, - 177, 177, 4, 1, 161, 166, 161, 161, - 161, 161, 161, 161, 167, 161, 172, 173, - 174, 177, 4, 1, 161, 166, 161, 161, - 33, 161, 161, 161, 167, 161, 170, 161, - 222, 161, 203, 203, 161, 1, 161, 166, - 161, 161, 161, 161, 161, 170, 161, 170, - 161, 161, 161, 203, 203, 161, 1, 161, - 166, 161, 161, 161, 161, 161, 170, 161, - 170, 161, 161, 161, 203, 171, 161, 1, - 161, 166, 161, 161, 161, 161, 161, 170, - 161, 162, 163, 169, 169, 4, 1, 161, - 166, 161, 161, 161, 161, 161, 161, 167, - 161, 162, 163, 164, 169, 4, 1, 161, - 166, 161, 161, 35, 161, 161, 161, 167, - 161, 224, 225, 226, 227, 40, 37, 223, - 228, 223, 223, 71, 223, 223, 223, 229, - 223, 230, 225, 231, 227, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 225, 231, 227, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 232, 223, 223, 223, 53, 233, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 232, - 223, 234, 235, 236, 237, 40, 37, 223, - 228, 223, 223, 69, 223, 223, 223, 229, - 223, 238, 235, 239, 239, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 235, 239, 239, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 240, 223, 223, 223, 53, 241, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 240, - 223, 242, 243, 244, 245, 40, 37, 223, - 228, 223, 223, 67, 223, 223, 223, 229, - 223, 246, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 243, 247, 247, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 248, 223, 223, 223, 53, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 248, - 223, 250, 251, 252, 253, 40, 37, 223, - 228, 223, 223, 65, 223, 223, 223, 229, - 223, 254, 251, 255, 255, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 251, 255, 255, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 256, 223, 223, 223, 53, 257, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 256, - 223, 258, 259, 260, 261, 40, 37, 223, - 228, 223, 223, 63, 223, 223, 223, 229, - 223, 262, 259, 263, 263, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 259, 263, 263, 40, 37, 223, 228, - 223, 223, 223, 223, 223, 223, 229, 223, - 53, 264, 223, 37, 223, 228, 223, 265, - 265, 223, 37, 223, 228, 223, 266, 223, - 223, 267, 223, 228, 223, 228, 223, 268, - 223, 269, 223, 266, 223, 223, 223, 223, - 228, 223, 53, 223, 265, 265, 223, 37, - 223, 228, 223, 265, 264, 223, 37, 223, - 228, 223, 270, 62, 271, 272, 43, 37, - 223, 228, 223, 62, 271, 272, 43, 37, - 223, 228, 223, 271, 271, 43, 37, 223, - 228, 223, 273, 59, 274, 275, 46, 37, - 223, 228, 223, 59, 274, 275, 46, 37, - 223, 228, 223, 274, 274, 46, 37, 223, - 228, 223, 276, 56, 277, 278, 49, 37, - 223, 228, 223, 56, 277, 278, 49, 37, - 223, 228, 223, 277, 277, 49, 37, 223, - 228, 223, 279, 53, 265, 280, 223, 37, - 223, 228, 223, 53, 265, 280, 223, 37, - 223, 228, 223, 259, 263, 263, 40, 37, - 223, 228, 223, 258, 259, 263, 263, 40, - 37, 223, 228, 223, 223, 223, 223, 223, - 223, 229, 223, 258, 259, 260, 263, 40, - 37, 223, 228, 223, 223, 63, 223, 223, - 223, 229, 223, 256, 223, 281, 223, 265, - 265, 223, 37, 223, 228, 223, 223, 223, - 223, 223, 256, 223, 256, 223, 223, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 223, 256, 223, 256, 223, 223, - 223, 265, 257, 223, 37, 223, 228, 223, - 223, 223, 223, 223, 256, 223, 250, 251, - 255, 255, 40, 37, 223, 228, 223, 223, - 223, 223, 223, 223, 229, 223, 250, 251, - 252, 255, 40, 37, 223, 228, 223, 223, - 65, 223, 223, 223, 229, 223, 248, 223, - 282, 223, 265, 265, 223, 37, 223, 228, - 223, 223, 223, 223, 223, 248, 223, 248, - 223, 223, 223, 265, 265, 223, 37, 223, - 228, 223, 223, 223, 223, 223, 248, 223, - 248, 223, 223, 223, 265, 249, 223, 37, - 223, 228, 223, 223, 223, 223, 223, 248, - 223, 242, 243, 247, 247, 40, 37, 223, - 228, 223, 223, 223, 223, 223, 223, 229, - 223, 242, 243, 244, 247, 40, 37, 223, - 228, 223, 223, 67, 223, 223, 223, 229, - 223, 240, 223, 283, 223, 265, 265, 223, - 37, 223, 228, 223, 223, 223, 223, 223, - 240, 223, 240, 223, 223, 223, 265, 265, - 223, 37, 223, 228, 223, 223, 223, 223, - 223, 240, 223, 240, 223, 223, 223, 265, - 241, 223, 37, 223, 228, 223, 223, 223, - 223, 223, 240, 223, 234, 235, 239, 239, - 40, 37, 223, 228, 223, 223, 223, 223, - 223, 223, 229, 223, 234, 235, 236, 239, - 40, 37, 223, 228, 223, 223, 69, 223, - 223, 223, 229, 223, 232, 223, 284, 223, - 265, 265, 223, 37, 223, 228, 223, 223, - 223, 223, 223, 232, 223, 232, 223, 223, - 223, 265, 265, 223, 37, 223, 228, 223, - 223, 223, 223, 223, 232, 223, 232, 223, - 223, 223, 265, 233, 223, 37, 223, 228, - 223, 223, 223, 223, 223, 232, 223, 70, - 39, 39, 40, 37, 223, 224, 225, 231, - 227, 40, 37, 223, 228, 223, 223, 223, - 223, 223, 223, 229, 223, 286, 151, 287, - 287, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 151, 287, 287, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 288, 285, 285, 285, - 90, 289, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 288, 285, 290, 291, 292, - 293, 76, 73, 285, 154, 285, 285, 106, - 285, 285, 285, 158, 285, 294, 291, 295, - 295, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 291, 295, 295, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 296, 285, 285, 285, - 90, 297, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 296, 285, 298, 299, 300, - 301, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 285, 158, 285, 302, 299, 303, - 303, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 299, 303, 303, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 304, 285, 285, 285, - 90, 305, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 304, 285, 306, 307, 308, - 309, 76, 73, 285, 154, 285, 285, 102, - 285, 285, 285, 158, 285, 310, 307, 311, - 311, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 307, 311, 311, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 312, 285, 285, 285, - 90, 313, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 312, 285, 314, 315, 316, - 317, 76, 73, 285, 154, 285, 285, 100, - 285, 285, 285, 158, 285, 318, 315, 319, - 319, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 315, 319, 319, - 76, 73, 285, 154, 285, 285, 285, 285, - 285, 285, 158, 285, 90, 320, 285, 73, - 285, 154, 285, 321, 321, 285, 73, 285, - 154, 285, 322, 285, 285, 323, 285, 154, - 285, 154, 285, 324, 285, 325, 285, 322, - 285, 285, 285, 285, 154, 285, 90, 285, - 321, 321, 285, 73, 285, 154, 285, 321, - 320, 285, 73, 285, 154, 285, 326, 99, - 327, 328, 80, 73, 285, 154, 285, 99, - 327, 328, 80, 73, 285, 154, 285, 327, - 327, 80, 73, 285, 154, 285, 329, 96, - 330, 331, 83, 73, 285, 154, 285, 96, - 330, 331, 83, 73, 285, 154, 285, 330, - 330, 83, 73, 285, 154, 285, 332, 93, - 333, 334, 86, 73, 285, 154, 285, 93, - 333, 334, 86, 73, 285, 154, 285, 333, - 333, 86, 73, 285, 154, 285, 335, 90, - 321, 336, 285, 73, 285, 154, 285, 90, - 321, 336, 285, 73, 285, 154, 285, 315, - 319, 319, 76, 73, 285, 154, 285, 314, - 315, 319, 319, 76, 73, 285, 154, 285, - 285, 285, 285, 285, 285, 158, 285, 314, - 315, 316, 319, 76, 73, 285, 154, 285, - 285, 100, 285, 285, 285, 158, 285, 312, - 285, 337, 285, 321, 321, 285, 73, 285, - 154, 285, 285, 285, 285, 285, 312, 285, - 312, 285, 285, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 285, 312, - 285, 312, 285, 285, 285, 321, 313, 285, - 73, 285, 154, 285, 285, 285, 285, 285, - 312, 285, 306, 307, 311, 311, 76, 73, - 285, 154, 285, 285, 285, 285, 285, 285, - 158, 285, 306, 307, 308, 311, 76, 73, - 285, 154, 285, 285, 102, 285, 285, 285, - 158, 285, 304, 285, 338, 285, 321, 321, - 285, 73, 285, 154, 285, 285, 285, 285, - 285, 304, 285, 304, 285, 285, 285, 321, - 321, 285, 73, 285, 154, 285, 285, 285, - 285, 285, 304, 285, 304, 285, 285, 285, - 321, 305, 285, 73, 285, 154, 285, 285, - 285, 285, 285, 304, 285, 298, 299, 303, - 303, 76, 73, 285, 154, 285, 285, 285, - 285, 285, 285, 158, 285, 298, 299, 300, - 303, 76, 73, 285, 154, 285, 285, 104, - 285, 285, 285, 158, 285, 296, 285, 339, - 285, 321, 321, 285, 73, 285, 154, 285, - 285, 285, 285, 285, 296, 285, 296, 285, - 285, 285, 321, 321, 285, 73, 285, 154, - 285, 285, 285, 285, 285, 296, 285, 296, - 285, 285, 285, 321, 297, 285, 73, 285, - 154, 285, 285, 285, 285, 285, 296, 285, - 290, 291, 295, 295, 76, 73, 285, 154, - 285, 285, 285, 285, 285, 285, 158, 285, - 290, 291, 292, 295, 76, 73, 285, 154, - 285, 285, 106, 285, 285, 285, 158, 285, - 288, 285, 340, 285, 321, 321, 285, 73, - 285, 154, 285, 285, 285, 285, 285, 288, - 285, 288, 285, 285, 285, 321, 321, 285, - 73, 285, 154, 285, 285, 285, 285, 285, - 288, 285, 288, 285, 285, 285, 321, 289, - 285, 73, 285, 154, 285, 285, 285, 285, - 285, 288, 285, 107, 75, 75, 76, 73, - 341, 341, 341, 341, 144, 341, 150, 151, - 287, 287, 76, 73, 285, 154, 285, 285, - 285, 285, 285, 285, 158, 285, 107, 75, - 75, 76, 73, 341, 343, 344, 345, 346, - 112, 109, 342, 347, 342, 342, 143, 342, - 342, 342, 348, 342, 349, 344, 346, 346, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 344, 346, 346, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 350, 342, 342, 342, 125, - 351, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 350, 342, 352, 353, 354, 355, - 112, 109, 342, 347, 342, 342, 141, 342, - 342, 342, 348, 342, 356, 353, 357, 357, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 353, 357, 357, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 358, 342, 342, 342, 125, - 359, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 358, 342, 360, 361, 362, 363, - 112, 109, 342, 347, 342, 342, 139, 342, - 342, 342, 348, 342, 364, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 361, 365, 365, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 366, 342, 342, 342, 125, - 367, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 366, 342, 368, 369, 370, 371, - 112, 109, 342, 347, 342, 342, 137, 342, - 342, 342, 348, 342, 372, 369, 373, 373, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 369, 373, 373, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 374, 342, 342, 342, 125, - 375, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 374, 342, 376, 377, 378, 379, - 112, 109, 342, 347, 342, 342, 135, 342, - 342, 342, 348, 342, 380, 377, 381, 381, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 377, 381, 381, 112, - 109, 342, 347, 342, 342, 342, 342, 342, - 342, 348, 342, 125, 382, 342, 109, 342, - 347, 342, 383, 383, 342, 109, 342, 347, - 342, 384, 342, 342, 385, 342, 347, 342, - 347, 342, 386, 342, 387, 342, 384, 342, - 342, 342, 342, 347, 342, 125, 342, 383, - 383, 342, 109, 342, 347, 342, 383, 382, - 342, 109, 342, 347, 342, 388, 134, 389, - 390, 115, 109, 342, 347, 342, 134, 389, - 390, 115, 109, 342, 347, 342, 389, 389, - 115, 109, 342, 347, 342, 391, 131, 392, - 393, 118, 109, 342, 347, 342, 131, 392, - 393, 118, 109, 342, 347, 342, 392, 392, - 118, 109, 342, 347, 342, 394, 128, 395, - 396, 121, 109, 342, 347, 342, 128, 395, - 396, 121, 109, 342, 347, 342, 395, 395, - 121, 109, 342, 347, 342, 397, 125, 383, - 398, 342, 109, 342, 347, 342, 125, 383, - 398, 342, 109, 342, 347, 342, 377, 381, - 381, 112, 109, 342, 347, 342, 376, 377, - 381, 381, 112, 109, 342, 347, 342, 342, - 342, 342, 342, 342, 348, 342, 376, 377, - 378, 381, 112, 109, 342, 347, 342, 342, - 135, 342, 342, 342, 348, 342, 374, 342, - 399, 342, 383, 383, 342, 109, 342, 347, - 342, 342, 342, 342, 342, 374, 342, 374, - 342, 342, 342, 383, 383, 342, 109, 342, - 347, 342, 342, 342, 342, 342, 374, 342, - 374, 342, 342, 342, 383, 375, 342, 109, - 342, 347, 342, 342, 342, 342, 342, 374, - 342, 368, 369, 373, 373, 112, 109, 342, - 347, 342, 342, 342, 342, 342, 342, 348, - 342, 368, 369, 370, 373, 112, 109, 342, - 347, 342, 342, 137, 342, 342, 342, 348, - 342, 366, 342, 400, 342, 383, 383, 342, - 109, 342, 347, 342, 342, 342, 342, 342, - 366, 342, 366, 342, 342, 342, 383, 383, - 342, 109, 342, 347, 342, 342, 342, 342, - 342, 366, 342, 366, 342, 342, 342, 383, - 367, 342, 109, 342, 347, 342, 342, 342, - 342, 342, 366, 342, 360, 361, 365, 365, - 112, 109, 342, 347, 342, 342, 342, 342, - 342, 342, 348, 342, 360, 361, 362, 365, - 112, 109, 342, 347, 342, 342, 139, 342, - 342, 342, 348, 342, 358, 342, 401, 342, - 383, 383, 342, 109, 342, 347, 342, 342, - 342, 342, 342, 358, 342, 358, 342, 342, - 342, 383, 383, 342, 109, 342, 347, 342, - 342, 342, 342, 342, 358, 342, 358, 342, - 342, 342, 383, 359, 342, 109, 342, 347, - 342, 342, 342, 342, 342, 358, 342, 352, - 353, 357, 357, 112, 109, 342, 347, 342, - 342, 342, 342, 342, 342, 348, 342, 352, - 353, 354, 357, 112, 109, 342, 347, 342, - 342, 141, 342, 342, 342, 348, 342, 350, - 342, 402, 342, 383, 383, 342, 109, 342, - 347, 342, 342, 342, 342, 342, 350, 342, - 350, 342, 342, 342, 383, 383, 342, 109, - 342, 347, 342, 342, 342, 342, 342, 350, - 342, 350, 342, 342, 342, 383, 351, 342, - 109, 342, 347, 342, 342, 342, 342, 342, - 350, 342, 343, 344, 346, 346, 112, 109, - 342, 347, 342, 342, 342, 342, 342, 342, - 348, 342, 148, 149, 150, 151, 403, 287, - 76, 73, 285, 154, 155, 155, 144, 285, - 285, 148, 158, 285, 162, 404, 164, 165, - 4, 1, 161, 166, 161, 161, 35, 161, - 161, 161, 167, 161, 170, 149, 150, 151, - 405, 406, 76, 407, 161, 408, 161, 155, - 144, 161, 161, 170, 158, 161, 107, 409, - 409, 76, 407, 161, 166, 161, 161, 144, - 161, 410, 161, 161, 411, 161, 408, 161, - 408, 161, 412, 161, 207, 161, 410, 161, - 161, 161, 161, 408, 161, 170, 161, 222, - 107, 409, 409, 76, 407, 161, 166, 161, - 161, 161, 161, 161, 170, 161, 414, 413, - 415, 415, 413, 146, 413, 416, 413, 415, - 415, 413, 146, 413, 416, 413, 417, 413, - 413, 418, 413, 416, 413, 416, 413, 419, - 413, 420, 413, 417, 413, 413, 413, 413, - 416, 413, 148, 341, 341, 341, 341, 341, - 341, 341, 341, 341, 155, 341, 341, 341, - 341, 148, 341, 0 + 3, 3, 4, 0, 3, 3, 4, 1, + 0, 5, 3, 3, 4, 1, 0, 6, + 0, 7, 0, 8, 3, 3, 4, 1, + 0, 2, 3, 3, 4, 1, 0, 0, + 0, 0, 9, 0, 11, 12, 12, 13, + 14, 10, 14, 10, 12, 12, 13, 10, + 12, 12, 13, 14, 10, 15, 12, 12, + 13, 14, 10, 16, 10, 17, 10, 18, + 12, 12, 13, 14, 10, 11, 12, 12, + 13, 14, 10, 10, 10, 10, 19, 10, + 11, 12, 12, 13, 14, 10, 10, 10, + 10, 20, 10, 22, 23, 23, 24, 25, + 21, 21, 21, 21, 26, 21, 25, 21, + 23, 23, 24, 27, 23, 23, 24, 25, + 21, 28, 23, 23, 24, 25, 21, 29, + 21, 30, 21, 22, 23, 23, 24, 25, + 21, 31, 23, 23, 24, 25, 21, 33, + 34, 34, 35, 36, 32, 32, 32, 32, + 37, 32, 36, 32, 34, 34, 35, 32, + 34, 34, 35, 36, 32, 38, 34, 34, + 35, 36, 32, 39, 32, 40, 32, 33, + 34, 34, 35, 36, 32, 41, 34, 34, + 35, 36, 32, 23, 23, 24, 1, 0, + 43, 42, 45, 46, 47, 48, 49, 50, + 24, 25, 44, 51, 52, 52, 26, 44, + 53, 54, 55, 56, 57, 44, 59, 60, + 61, 62, 4, 1, 58, 63, 58, 58, + 9, 58, 58, 58, 64, 58, 65, 60, + 66, 66, 4, 1, 58, 63, 58, 58, + 58, 58, 58, 58, 64, 58, 60, 66, + 66, 4, 1, 58, 63, 58, 58, 58, + 58, 58, 58, 64, 58, 45, 58, 58, + 58, 67, 68, 58, 1, 58, 63, 58, + 58, 58, 58, 58, 45, 58, 69, 69, + 58, 1, 58, 63, 58, 63, 58, 58, + 70, 58, 63, 58, 63, 58, 63, 58, + 58, 58, 58, 63, 58, 45, 58, 71, + 58, 69, 69, 58, 1, 58, 63, 58, + 58, 58, 58, 58, 45, 58, 45, 58, + 58, 58, 69, 69, 58, 1, 58, 63, + 58, 58, 58, 58, 58, 45, 58, 45, + 58, 58, 58, 69, 68, 58, 1, 58, + 63, 58, 58, 58, 58, 58, 45, 58, + 72, 7, 73, 74, 4, 1, 58, 63, + 58, 7, 73, 74, 4, 1, 58, 63, + 58, 73, 73, 4, 1, 58, 63, 58, + 75, 76, 76, 4, 1, 58, 63, 58, + 67, 77, 58, 1, 58, 63, 58, 67, + 58, 69, 69, 58, 1, 58, 63, 58, + 69, 77, 58, 1, 58, 63, 58, 59, + 60, 66, 66, 4, 1, 58, 63, 58, + 58, 58, 58, 58, 58, 64, 58, 59, + 60, 61, 66, 4, 1, 58, 63, 58, + 58, 9, 58, 58, 58, 64, 58, 79, + 80, 81, 82, 13, 14, 78, 83, 78, + 78, 20, 78, 78, 78, 84, 78, 85, + 80, 86, 82, 13, 14, 78, 83, 78, + 78, 78, 78, 78, 78, 84, 78, 80, + 86, 82, 13, 14, 78, 83, 78, 78, + 78, 78, 78, 78, 84, 78, 87, 78, + 78, 78, 88, 89, 78, 14, 78, 83, + 78, 78, 78, 78, 78, 87, 78, 90, + 80, 91, 92, 13, 14, 78, 83, 78, + 78, 19, 78, 78, 78, 84, 78, 93, + 80, 86, 86, 13, 14, 78, 83, 78, + 78, 78, 78, 78, 78, 84, 78, 80, + 86, 86, 13, 14, 78, 83, 78, 78, + 78, 78, 78, 78, 84, 78, 87, 78, + 78, 78, 94, 89, 78, 14, 78, 83, + 78, 78, 78, 78, 78, 87, 78, 83, + 78, 78, 95, 78, 83, 78, 83, 78, + 83, 78, 78, 78, 78, 83, 78, 87, + 78, 96, 78, 94, 94, 78, 14, 78, + 83, 78, 78, 78, 78, 78, 87, 78, + 87, 78, 78, 78, 94, 94, 78, 14, + 78, 83, 78, 78, 78, 78, 78, 87, + 78, 97, 17, 98, 99, 13, 14, 78, + 83, 78, 17, 98, 99, 13, 14, 78, + 83, 78, 98, 98, 13, 14, 78, 83, + 78, 100, 101, 101, 13, 14, 78, 83, + 78, 88, 102, 78, 14, 78, 83, 78, + 94, 94, 78, 14, 78, 83, 78, 88, + 78, 94, 94, 78, 14, 78, 83, 78, + 94, 102, 78, 14, 78, 83, 78, 90, + 80, 86, 86, 13, 14, 78, 83, 78, + 78, 78, 78, 78, 78, 84, 78, 90, + 80, 91, 86, 13, 14, 78, 83, 78, + 78, 19, 78, 78, 78, 84, 78, 11, + 12, 12, 13, 14, 78, 79, 80, 86, + 82, 13, 14, 78, 83, 78, 78, 78, + 78, 78, 78, 84, 78, 104, 48, 105, + 105, 24, 25, 103, 51, 103, 103, 103, + 103, 103, 103, 55, 103, 48, 105, 105, + 24, 25, 103, 51, 103, 103, 103, 103, + 103, 103, 55, 103, 106, 103, 103, 103, + 107, 108, 103, 25, 103, 51, 103, 103, + 103, 103, 103, 106, 103, 47, 48, 109, + 110, 24, 25, 103, 51, 103, 103, 26, + 103, 103, 103, 55, 103, 106, 103, 103, + 103, 111, 108, 103, 25, 103, 51, 103, + 103, 103, 103, 103, 106, 103, 51, 103, + 103, 112, 103, 51, 103, 51, 103, 51, + 103, 103, 103, 103, 51, 103, 106, 103, + 113, 103, 111, 111, 103, 25, 103, 51, + 103, 103, 103, 103, 103, 106, 103, 106, + 103, 103, 103, 111, 111, 103, 25, 103, + 51, 103, 103, 103, 103, 103, 106, 103, + 114, 30, 115, 116, 24, 25, 103, 51, + 103, 30, 115, 116, 24, 25, 103, 51, + 103, 115, 115, 24, 25, 103, 51, 103, + 47, 48, 105, 105, 24, 25, 103, 51, + 103, 103, 103, 103, 103, 103, 55, 103, + 117, 118, 118, 24, 25, 103, 51, 103, + 107, 119, 103, 25, 103, 51, 103, 111, + 111, 103, 25, 103, 51, 103, 107, 103, + 111, 111, 103, 25, 103, 51, 103, 111, + 119, 103, 25, 103, 51, 103, 47, 48, + 109, 105, 24, 25, 103, 51, 103, 103, + 26, 103, 103, 103, 55, 103, 22, 23, + 23, 24, 25, 120, 120, 120, 120, 26, + 120, 22, 23, 23, 24, 25, 120, 122, + 123, 124, 125, 35, 36, 121, 126, 121, + 121, 37, 121, 121, 121, 127, 121, 128, + 123, 125, 125, 35, 36, 121, 126, 121, + 121, 121, 121, 121, 121, 127, 121, 123, + 125, 125, 35, 36, 121, 126, 121, 121, + 121, 121, 121, 121, 127, 121, 129, 121, + 121, 121, 130, 131, 121, 36, 121, 126, + 121, 121, 121, 121, 121, 129, 121, 122, + 123, 124, 52, 35, 36, 121, 126, 121, + 121, 37, 121, 121, 121, 127, 121, 129, + 121, 121, 121, 132, 131, 121, 36, 121, + 126, 121, 121, 121, 121, 121, 129, 121, + 126, 121, 121, 133, 121, 126, 121, 126, + 121, 126, 121, 121, 121, 121, 126, 121, + 129, 121, 134, 121, 132, 132, 121, 36, + 121, 126, 121, 121, 121, 121, 121, 129, + 121, 129, 121, 121, 121, 132, 132, 121, + 36, 121, 126, 121, 121, 121, 121, 121, + 129, 121, 135, 40, 136, 137, 35, 36, + 121, 126, 121, 40, 136, 137, 35, 36, + 121, 126, 121, 136, 136, 35, 36, 121, + 126, 121, 122, 123, 125, 125, 35, 36, + 121, 126, 121, 121, 121, 121, 121, 121, + 127, 121, 138, 139, 139, 35, 36, 121, + 126, 121, 130, 140, 121, 36, 121, 126, + 121, 132, 132, 121, 36, 121, 126, 121, + 130, 121, 132, 132, 121, 36, 121, 126, + 121, 132, 140, 121, 36, 121, 126, 121, + 45, 46, 47, 48, 109, 105, 24, 25, + 103, 51, 52, 52, 26, 103, 103, 45, + 55, 103, 59, 141, 61, 62, 4, 1, + 58, 63, 58, 58, 9, 58, 58, 58, + 64, 58, 45, 46, 47, 48, 142, 143, + 24, 144, 58, 145, 58, 52, 26, 58, + 58, 45, 55, 58, 22, 146, 146, 24, + 144, 58, 63, 58, 58, 26, 58, 145, + 58, 58, 147, 58, 145, 58, 145, 58, + 145, 58, 58, 58, 58, 145, 58, 45, + 58, 71, 22, 146, 146, 24, 144, 58, + 63, 58, 58, 58, 58, 58, 45, 58, + 149, 148, 150, 150, 148, 43, 148, 151, + 148, 150, 150, 148, 43, 148, 151, 148, + 151, 148, 148, 152, 148, 151, 148, 151, + 148, 151, 148, 148, 148, 148, 151, 148, + 45, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 52, 120, 120, 120, 120, 45, + 120, 0 }; -static const short _indic_syllable_machine_trans_targs[] = { - 138, 160, 166, 2, 167, 3, 5, 170, - 6, 8, 173, 9, 11, 176, 12, 14, - 15, 159, 17, 18, 175, 20, 21, 172, - 23, 24, 169, 179, 183, 184, 188, 189, - 193, 194, 198, 199, 138, 222, 228, 36, - 229, 37, 39, 232, 40, 42, 235, 43, - 45, 238, 46, 48, 49, 221, 51, 52, - 237, 54, 55, 234, 57, 58, 231, 241, - 245, 246, 250, 251, 255, 256, 260, 262, - 138, 283, 289, 70, 290, 138, 71, 73, - 293, 74, 76, 296, 77, 79, 299, 80, - 82, 83, 282, 85, 86, 298, 88, 89, - 295, 91, 92, 292, 302, 306, 307, 311, - 312, 316, 317, 321, 138, 346, 352, 103, - 353, 104, 106, 356, 107, 109, 359, 110, - 112, 362, 113, 115, 116, 345, 118, 119, - 361, 121, 122, 358, 124, 125, 355, 365, - 369, 370, 374, 375, 379, 380, 384, 385, - 323, 138, 398, 138, 139, 201, 263, 265, - 322, 324, 285, 325, 386, 387, 301, 396, - 403, 138, 140, 142, 33, 200, 162, 178, - 141, 32, 143, 196, 144, 146, 31, 195, - 145, 30, 147, 191, 148, 150, 29, 190, - 149, 28, 151, 186, 152, 154, 27, 185, - 153, 26, 155, 181, 156, 158, 25, 180, - 157, 1, 165, 0, 161, 164, 163, 138, - 168, 4, 22, 171, 7, 19, 174, 10, - 16, 177, 13, 182, 187, 192, 197, 138, - 202, 204, 67, 261, 224, 240, 203, 66, - 205, 258, 206, 208, 65, 257, 207, 64, - 209, 253, 210, 212, 63, 252, 211, 62, - 213, 248, 214, 216, 61, 247, 215, 60, - 217, 243, 218, 220, 59, 242, 219, 35, - 227, 34, 223, 226, 225, 138, 230, 38, - 56, 233, 41, 53, 236, 44, 50, 239, - 47, 244, 249, 254, 259, 138, 264, 100, - 266, 319, 267, 269, 99, 318, 268, 98, - 270, 314, 271, 273, 97, 313, 272, 96, - 274, 309, 275, 277, 95, 308, 276, 94, - 278, 304, 279, 281, 93, 303, 280, 69, - 288, 68, 284, 287, 286, 138, 291, 72, - 90, 294, 75, 87, 297, 78, 84, 300, - 81, 305, 310, 315, 320, 138, 138, 326, - 328, 134, 133, 348, 364, 327, 329, 382, - 330, 332, 132, 381, 331, 131, 333, 377, - 334, 336, 130, 376, 335, 129, 337, 372, - 338, 340, 128, 371, 339, 127, 341, 367, - 342, 344, 126, 366, 343, 102, 351, 101, - 347, 350, 349, 138, 354, 105, 123, 357, - 108, 120, 360, 111, 117, 363, 114, 368, - 373, 378, 383, 135, 388, 389, 395, 390, - 392, 136, 391, 394, 393, 138, 397, 137, - 400, 399, 402, 401, 138 +static const unsigned char _indic_syllable_machine_trans_targs[] = { + 39, 45, 50, 2, 51, 5, 6, 53, + 57, 58, 39, 67, 11, 73, 68, 14, + 15, 75, 80, 81, 84, 39, 89, 21, + 95, 90, 98, 39, 24, 25, 97, 103, + 39, 112, 30, 118, 113, 121, 33, 34, + 120, 126, 39, 137, 39, 40, 60, 85, + 87, 105, 106, 91, 107, 127, 128, 99, + 135, 140, 39, 41, 43, 8, 59, 46, + 54, 42, 1, 44, 48, 0, 47, 49, + 52, 3, 4, 55, 7, 56, 39, 61, + 63, 18, 83, 69, 76, 62, 9, 64, + 78, 71, 65, 17, 82, 66, 10, 70, + 72, 74, 12, 13, 77, 16, 79, 39, + 86, 26, 88, 101, 93, 19, 104, 20, + 92, 94, 96, 22, 23, 100, 27, 102, + 39, 39, 108, 110, 28, 35, 114, 122, + 109, 111, 124, 116, 29, 115, 117, 119, + 31, 32, 123, 36, 125, 129, 130, 134, + 131, 132, 37, 133, 39, 136, 38, 138, + 139 }; static const char _indic_syllable_machine_trans_actions[] = { 1, 0, 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, 3, 0, 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, - 4, 0, 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, 6, 2, 6, 2, - 6, 2, 6, 2, 7, 0, 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, - 6, 8, 0, 11, 2, 2, 6, 0, - 12, 12, 0, 2, 6, 2, 6, 2, - 0, 13, 2, 0, 0, 2, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 2, 2, 0, 0, 2, - 2, 0, 2, 0, 0, 0, 0, 14, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 2, 2, 2, 2, 15, - 2, 0, 0, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 2, 2, 0, 0, 2, 2, 0, - 2, 0, 0, 0, 0, 16, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 17, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 6, 2, 6, 0, 0, 6, 6, 0, - 2, 0, 0, 0, 0, 18, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 19, 20, 2, - 0, 0, 0, 0, 2, 2, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 2, - 2, 0, 0, 2, 2, 0, 2, 0, - 0, 0, 0, 21, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 2, - 2, 2, 2, 0, 0, 22, 22, 0, - 0, 0, 0, 0, 0, 23, 2, 0, - 0, 0, 0, 0, 24 + 2, 2, 3, 2, 0, 2, 0, 0, + 0, 2, 2, 2, 2, 4, 2, 0, + 5, 0, 5, 6, 0, 0, 5, 2, + 7, 2, 0, 2, 0, 2, 0, 0, + 2, 2, 8, 0, 11, 2, 2, 5, + 0, 12, 12, 0, 2, 5, 2, 5, + 2, 0, 13, 2, 0, 0, 2, 0, + 2, 2, 0, 2, 2, 0, 0, 2, + 2, 0, 0, 0, 0, 2, 14, 2, + 0, 0, 2, 0, 2, 2, 0, 2, + 2, 2, 2, 0, 2, 2, 0, 0, + 2, 2, 0, 0, 0, 0, 2, 15, + 5, 0, 5, 2, 2, 0, 5, 0, + 0, 2, 5, 0, 0, 0, 0, 2, + 16, 17, 2, 0, 0, 0, 0, 2, + 2, 2, 2, 2, 0, 0, 2, 2, + 0, 0, 0, 0, 2, 0, 18, 18, + 0, 0, 0, 0, 19, 2, 0, 0, + 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -823,6 +319,7 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -835,41 +332,7 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + 0, 0, 0, 0, 0 }; static const char _indic_syllable_machine_from_state_actions[] = { @@ -877,6 +340,7 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 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, @@ -889,102 +353,35 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + 0, 0, 0, 0, 0 }; static const short _indic_syllable_machine_eof_trans[] = { 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 73, 73, 78, 78, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 73, - 1, 146, 0, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 342, 286, 342, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 286, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 414, 414, 414, 414, - 414, 414, 414, 342 + 1, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 22, 22, 28, 22, 22, + 22, 22, 22, 22, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 1, 43, 0, + 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 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, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 104, 104, + 104, 121, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 104, + 59, 59, 59, 59, 59, 59, 59, 149, + 149, 149, 149, 149, 121 }; -static const int indic_syllable_machine_start = 138; -static const int indic_syllable_machine_first_final = 138; +static const int indic_syllable_machine_start = 39; +static const int indic_syllable_machine_first_final = 39; static const int indic_syllable_machine_error = -1; -static const int indic_syllable_machine_en_main = 138; +static const int indic_syllable_machine_en_main = 39; #line 36 "hb-ot-shape-complex-indic-machine.rl" @@ -1010,7 +407,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 1014 "hb-ot-shape-complex-indic-machine.hh" +#line 411 "hb-ot-shape-complex-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -1026,12 +423,12 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 1030 "hb-ot-shape-complex-indic-machine.hh" +#line 427 "hb-ot-shape-complex-indic-machine.hh" { int _slen; int _trans; const unsigned char *_keys; - const short *_inds; + const unsigned char *_inds; if ( p == pe ) goto _test_eof; _resume: @@ -1040,7 +437,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 1044 "hb-ot-shape-complex-indic-machine.hh" +#line 441 "hb-ot-shape-complex-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -1062,26 +459,6 @@ _eof_trans: #line 1 "NONE" {te = p+1;} break; - case 14: -#line 84 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (consonant_syllable); }} - break; - case 16: -#line 85 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (vowel_syllable); }} - break; - case 21: -#line 86 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (standalone_cluster); }} - break; - case 24: -#line 87 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (symbol_cluster); }} - break; - case 18: -#line 88 "hb-ot-shape-complex-indic-machine.rl" - {te = p+1;{ found_syllable (broken_cluster); }} - break; case 11: #line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (non_indic_cluster); }} @@ -1090,23 +467,23 @@ _eof_trans: #line 84 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; - case 15: + case 14: #line 85 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (vowel_syllable); }} break; - case 20: + case 17: #line 86 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (standalone_cluster); }} break; - case 23: + case 19: #line 87 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 17: + case 15: #line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 19: + case 16: #line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (non_indic_cluster); }} break; @@ -1130,7 +507,7 @@ _eof_trans: #line 88 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; - case 5: + case 6: #line 1 "NONE" { switch( act ) { case 1: @@ -1145,13 +522,13 @@ _eof_trans: } } break; - case 22: + case 18: #line 1 "NONE" {te = p+1;} #line 84 "hb-ot-shape-complex-indic-machine.rl" {act = 1;} break; - case 6: + case 5: #line 1 "NONE" {te = p+1;} #line 88 "hb-ot-shape-complex-indic-machine.rl" @@ -1163,7 +540,7 @@ _eof_trans: #line 89 "hb-ot-shape-complex-indic-machine.rl" {act = 6;} break; -#line 1167 "hb-ot-shape-complex-indic-machine.hh" +#line 544 "hb-ot-shape-complex-indic-machine.hh" } _again: @@ -1172,7 +549,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 1176 "hb-ot-shape-complex-indic-machine.hh" +#line 553 "hb-ot-shape-complex-indic-machine.hh" } if ( ++p != pe ) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl index f7e022b989a..a2a88af0d97 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl @@ -64,14 +64,14 @@ reph = (Ra H | Repha); # possible reph cn = c.ZWJ?.n?; forced_rakar = ZWJ H ZWJ Ra; symbol = Symbol.N?; -matra_group = z{0,3}.M.N?.(H | forced_rakar)?; -syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}?; +matra_group = z*.M.N?.(H | forced_rakar)?; +syllable_tail = (z?.SM.SM?.ZWNJ?)? A*; halant_group = (z?.H.(ZWJ.N?)?); final_halant_group = halant_group | H.ZWNJ; medial_group = CM?; -halant_or_matra_group = (final_halant_group | matra_group{0,4}); +halant_or_matra_group = (final_halant_group | matra_group*); -complex_syllable_tail = (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail; +complex_syllable_tail = (halant_group.cn)* medial_group halant_or_matra_group syllable_tail; consonant_syllable = (Repha|CS)? cn complex_syllable_tail; vowel_syllable = reph? V.n? (ZWJ | complex_syllable_tail); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc index 1fd8fc670b1..f8cb5741b88 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc @@ -274,7 +274,11 @@ struct indic_shape_plan_t const indic_config_t *config; bool is_old_spec; +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE bool uniscribe_bug_compatible; +#else + static constexpr bool uniscribe_bug_compatible = false; +#endif mutable hb_atomic_int_t virama_glyph; would_substitute_feature_t rphf; @@ -300,7 +304,9 @@ data_create_indic (const hb_ot_shape_plan_t *plan) } indic_plan->is_old_spec = indic_plan->config->has_old_spec && ((plan->map.chosen_script[0] & 0x000000FFu) != '2'); +#ifndef HB_NO_UNISCRIBE_BUG_COMPATIBLE indic_plan->uniscribe_bug_compatible = hb_options ().uniscribe_bug_compatible; +#endif indic_plan->virama_glyph.set_relaxed (-1); /* Use zero-context would_substitute() matching for new-spec of the main @@ -645,7 +651,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, /* Reorder characters */ for (unsigned int i = start; i < base; i++) - info[i].indic_position() = MIN (POS_PRE_C, (indic_position_t) info[i].indic_position()); + info[i].indic_position() = hb_min (POS_PRE_C, (indic_position_t) info[i].indic_position()); if (base < end) info[base].indic_position() = POS_BASE_C; @@ -801,7 +807,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, unsigned int j = start + info[i].syllable(); while (j != i) { - max = MAX (max, j); + max = hb_max (max, j); unsigned int next = start + info[j].syllable(); info[j].syllable() = 255; /* So we don't process j later again. */ j = next; @@ -918,11 +924,10 @@ initial_reordering_standalone_cluster (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, unsigned int start, unsigned int end) { - const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; - /* We treat placeholder/dotted-circle as if they are consonants, so we * should just chain. Only if not in compatibility mode that is... */ + const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; if (indic_plan->uniscribe_bug_compatible) { /* For dotted-circle, this is what Uniscribe does: @@ -1008,7 +1013,6 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, ginfo.cluster = buffer->cur().cluster; ginfo.mask = buffer->cur().mask; ginfo.syllable() = buffer->cur().syllable(); - /* TODO Set glyph_props? */ /* Insert dottedcircle after possible Repha. */ while (buffer->idx < buffer->len && buffer->successful && @@ -1232,14 +1236,14 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, /* Note: this merge_clusters() is intentionally *after* the reordering. * Indic matra reordering is special and tricky... */ - buffer->merge_clusters (new_pos, MIN (end, base + 1)); + buffer->merge_clusters (new_pos, hb_min (end, base + 1)); new_pos--; } } else { for (unsigned int i = start; i < base; i++) if (info[i].indic_position () == POS_PRE_M) { - buffer->merge_clusters (i, MIN (end, base + 1)); + buffer->merge_clusters (i, hb_min (end, base + 1)); break; } } @@ -1372,13 +1376,15 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * TEST: U+0930,U+094D,U+0915,U+094B,U+094D */ if (!indic_plan->uniscribe_bug_compatible && - unlikely (is_halant (info[new_reph_pos]))) { + unlikely (is_halant (info[new_reph_pos]))) + { for (unsigned int i = base + 1; i < new_reph_pos; i++) if (info[i].indic_category() == OT_M) { /* Ok, got it. */ new_reph_pos--; } } + goto reph_move; } @@ -1591,11 +1597,10 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c, * https://docs.microsoft.com/en-us/typography/script-development/sinhala#shaping */ - const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) c->plan->data; + const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) c->plan->data; hb_codepoint_t glyph; - - if (hb_options ().uniscribe_bug_compatible || + if (indic_plan->uniscribe_bug_compatible || (c->font->get_nominal_glyph (ab, &glyph) && indic_plan->pstf.would_substitute (&glyph, 1, c->font->face))) { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh index 13ab51679a6..dc8f8c7ce31 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh @@ -278,7 +278,7 @@ matra_position_indic (hb_codepoint_t u, indic_position_t side) case POS_POST_C: return MATRA_POS_RIGHT (u); case POS_ABOVE_C: return MATRA_POS_TOP (u); case POS_BELOW_C: return MATRA_POS_BOTTOM (u); - }; + } return side; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc index 5746651d661..4c88477621b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc @@ -368,7 +368,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; - /* Note: This loop is extra overhead, but should not be measurable. */ + /* Note: This loop is extra overhead, but should not be measurable. + * TODO Use a buffer scratch flag to remove the loop. */ bool has_broken_syllables = false; unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; @@ -407,7 +408,6 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, ginfo.cluster = buffer->cur().cluster; ginfo.mask = buffer->cur().mask; ginfo.syllable() = buffer->cur().syllable(); - /* TODO Set glyph_props? */ /* Insert dottedcircle after possible Repha. */ while (buffer->idx < buffer->len && buffer->successful && diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh index 622294588b2..21015c7307e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh @@ -105,7 +105,7 @@ set_khmer_properties (hb_glyph_info_t &info) case POS_ABOVE_C: cat = OT_VAbv; break; case POS_POST_C: cat = OT_VPst; break; default: assert (0); - }; + } info.khmer_category() = cat; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh index 0c19e4f687f..d03832fa7c6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh @@ -38,9 +38,9 @@ static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, - 0 + 3u, 29u, 1u, 16u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, + 1u, 32u, 8u, 8u, 0 }; static const char _myanmar_syllable_machine_key_spans[] = { @@ -48,8 +48,9 @@ static const char _myanmar_syllable_machine_key_spans[] = { 27, 27, 27, 27, 16, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 25, 4, 25, 23, 21, 21, 27, 27, 27, - 27, 28, 27, 32, 27, 27, 27, 27, - 27, 28, 27, 27, 27, 27, 32, 1 + 27, 16, 28, 27, 27, 27, 27, 27, + 28, 27, 27, 27, 27, 28, 27, 32, + 32, 1 }; static const short _myanmar_syllable_machine_index_offsets[] = { @@ -57,8 +58,9 @@ static const short _myanmar_syllable_machine_index_offsets[] = { 187, 215, 243, 271, 299, 316, 344, 372, 400, 428, 456, 485, 513, 541, 569, 597, 623, 628, 654, 678, 700, 722, 750, 778, - 806, 834, 863, 891, 924, 952, 980, 1008, - 1036, 1064, 1093, 1121, 1149, 1177, 1205, 1238 + 806, 834, 851, 880, 908, 936, 964, 992, + 1020, 1049, 1077, 1105, 1133, 1161, 1190, 1218, + 1251, 1284 }; static const char _myanmar_syllable_machine_indicies[] = { @@ -136,108 +138,115 @@ static const char _myanmar_syllable_machine_indicies[] = { 21, 22, 23, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, 21, 21, 21, 27, 21, 21, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 21, 3, 3, 44, + 33, 34, 35, 36, 21, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 45, 44, 44, 44, 44, 44, - 44, 14, 44, 44, 44, 18, 44, 3, - 3, 44, 5, 44, 3, 3, 44, 5, + 44, 44, 46, 44, 44, 44, 44, 44, + 44, 14, 44, 44, 44, 18, 44, 45, + 45, 44, 5, 44, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 44, 44, 18, 44, 46, 44, - 3, 3, 44, 5, 44, 14, 44, 44, - 44, 44, 44, 44, 44, 47, 44, 44, - 44, 44, 44, 44, 14, 44, 3, 3, + 14, 44, 44, 44, 18, 44, 47, 44, + 45, 45, 44, 5, 44, 14, 44, 44, + 44, 44, 44, 44, 44, 48, 44, 44, + 44, 44, 44, 44, 14, 44, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 47, 44, 44, 44, 44, - 44, 44, 14, 44, 3, 3, 44, 5, + 44, 44, 44, 48, 44, 44, 44, 44, + 44, 44, 14, 44, 45, 45, 44, 5, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 14, 44, 2, 44, 3, 3, 44, 5, + 14, 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, - 44, 48, 44, 44, 48, 44, 44, 44, - 14, 49, 44, 44, 18, 44, 2, 44, - 3, 3, 44, 5, 44, 6, 44, 44, + 44, 49, 44, 44, 49, 44, 44, 44, + 14, 50, 44, 44, 18, 44, 2, 44, + 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 14, 44, 44, 44, - 18, 44, 2, 44, 3, 3, 44, 5, + 18, 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, - 44, 48, 44, 44, 44, 44, 44, 44, - 14, 49, 44, 44, 18, 44, 2, 44, - 3, 3, 44, 5, 44, 6, 44, 44, + 44, 49, 44, 44, 44, 44, 44, 44, + 14, 50, 44, 44, 18, 44, 2, 44, + 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 14, 49, 44, 44, - 18, 44, 22, 23, 24, 24, 21, 25, - 21, 26, 21, 21, 21, 21, 21, 21, - 21, 50, 21, 21, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 21, 22, - 51, 24, 24, 21, 25, 21, 26, 21, - 21, 21, 21, 21, 21, 21, 27, 21, - 21, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 21, 1, 1, 2, 3, 3, - 3, 44, 5, 44, 6, 1, 44, 44, - 44, 44, 1, 44, 8, 44, 44, 10, - 11, 12, 13, 14, 15, 16, 17, 18, - 19, 44, 1, 44, 2, 44, 3, 3, - 44, 5, 44, 6, 44, 44, 44, 44, - 44, 44, 44, 8, 44, 44, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 44, - 2, 44, 3, 3, 44, 5, 44, 6, - 44, 44, 44, 44, 44, 44, 44, 52, - 44, 44, 44, 44, 44, 44, 14, 15, - 16, 17, 18, 44, 2, 44, 3, 3, - 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 50, 44, 44, + 18, 44, 51, 51, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 51, 44, 2, 3, 45, 45, 44, + 5, 44, 6, 44, 44, 44, 44, 44, + 44, 44, 8, 44, 44, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 44, + 2, 44, 45, 45, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 8, + 44, 44, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 44, 2, 44, 45, 45, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 52, 44, 44, 44, 44, 44, 44, 14, 15, 16, 17, 18, 44, - 2, 44, 3, 3, 44, 5, 44, 6, + 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 14, 15, - 16, 44, 18, 44, 2, 44, 3, 3, + 16, 17, 18, 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 14, 44, 16, 44, 18, 44, - 2, 44, 3, 3, 44, 5, 44, 6, + 44, 44, 14, 15, 16, 44, 18, 44, + 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 14, 15, - 16, 17, 18, 52, 44, 2, 44, 3, - 3, 44, 5, 44, 6, 44, 44, 44, - 44, 44, 44, 44, 52, 44, 44, 10, - 44, 12, 44, 14, 15, 16, 17, 18, - 44, 2, 44, 3, 3, 44, 5, 44, + 44, 44, 44, 44, 44, 44, 14, 44, + 16, 44, 18, 44, 2, 44, 45, 45, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 17, 18, 52, + 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, - 52, 44, 44, 10, 44, 44, 44, 14, - 15, 16, 17, 18, 44, 2, 44, 3, - 3, 44, 5, 44, 6, 44, 44, 44, + 52, 44, 44, 10, 44, 12, 44, 14, + 15, 16, 17, 18, 44, 2, 44, 45, + 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, 52, 44, 44, 10, - 11, 12, 44, 14, 15, 16, 17, 18, - 44, 2, 3, 3, 3, 44, 5, 44, + 44, 44, 44, 14, 15, 16, 17, 18, + 44, 2, 44, 45, 45, 44, 5, 44, 6, 44, 44, 44, 44, 44, 44, 44, - 8, 44, 44, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 44, 1, 1, 53, - 53, 53, 53, 53, 53, 53, 53, 1, - 53, 53, 53, 53, 1, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 1, 53, 54, 53, - 0 + 52, 44, 44, 10, 11, 12, 44, 14, + 15, 16, 17, 18, 44, 2, 3, 45, + 45, 44, 5, 44, 6, 44, 44, 44, + 44, 44, 44, 44, 8, 44, 44, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 44, 22, 23, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 53, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 21, 22, 54, + 24, 24, 21, 25, 21, 26, 21, 21, + 21, 21, 21, 21, 21, 27, 21, 21, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 21, 1, 1, 2, 3, 45, 45, + 44, 5, 44, 6, 1, 44, 44, 44, + 44, 1, 44, 8, 44, 44, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 44, 1, 44, 1, 1, 55, 55, 55, + 55, 55, 55, 55, 55, 1, 55, 55, + 55, 55, 1, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 1, 55, 56, 55, 0 }; static const char _myanmar_syllable_machine_trans_targs[] = { - 0, 1, 23, 0, 0, 24, 30, 33, - 36, 46, 37, 42, 43, 44, 26, 39, - 40, 41, 29, 45, 47, 0, 2, 12, + 0, 1, 23, 33, 0, 24, 30, 45, + 35, 48, 36, 41, 42, 43, 26, 38, + 39, 40, 29, 44, 49, 0, 2, 12, 0, 3, 9, 13, 14, 19, 20, 21, 5, 16, 17, 18, 8, 22, 4, 6, - 7, 10, 11, 15, 0, 25, 27, 28, - 31, 32, 34, 35, 38, 0, 0 + 7, 10, 11, 15, 0, 0, 25, 27, + 28, 31, 32, 34, 37, 46, 47, 0, + 0 }; static const char _myanmar_syllable_machine_trans_actions[] = { - 3, 0, 0, 4, 5, 0, 0, 0, + 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 10 + 0, 0, 0, 0, 7, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 10 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -246,7 +255,8 @@ static const char _myanmar_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { @@ -255,7 +265,8 @@ static const char _myanmar_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const short _myanmar_syllable_machine_eof_trans[] = { @@ -263,8 +274,9 @@ static const short _myanmar_syllable_machine_eof_trans[] = { 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 22, 22, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 54, 54 + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 22, 22, 45, + 56, 56 }; static const int myanmar_syllable_machine_start = 0; @@ -297,7 +309,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 301 "hb-ot-shape-complex-myanmar-machine.hh" +#line 313 "hb-ot-shape-complex-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -313,7 +325,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 317 "hb-ot-shape-complex-myanmar-machine.hh" +#line 329 "hb-ot-shape-complex-myanmar-machine.hh" { int _slen; int _trans; @@ -327,7 +339,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 331 "hb-ot-shape-complex-myanmar-machine.hh" +#line 343 "hb-ot-shape-complex-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -345,11 +357,11 @@ _eof_trans: goto _again; switch ( _myanmar_syllable_machine_trans_actions[_trans] ) { - case 7: + case 6: #line 86 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; - case 5: + case 4: #line 87 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; @@ -357,7 +369,7 @@ _eof_trans: #line 88 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (punctuation_cluster); }} break; - case 4: + case 8: #line 89 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; @@ -365,11 +377,11 @@ _eof_trans: #line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; - case 6: + case 5: #line 86 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; - case 8: + case 7: #line 89 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; @@ -377,7 +389,7 @@ _eof_trans: #line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (non_myanmar_cluster); }} break; -#line 381 "hb-ot-shape-complex-myanmar-machine.hh" +#line 393 "hb-ot-shape-complex-myanmar-machine.hh" } _again: @@ -386,7 +398,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 390 "hb-ot-shape-complex-myanmar-machine.hh" +#line 402 "hb-ot-shape-complex-myanmar-machine.hh" } if ( ++p != pe ) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl index 7845a86d41f..c4e300fda93 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl @@ -75,9 +75,9 @@ post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?; pwo_tone_group = PT A* DB? As?; complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?; -syllable_tail = (H | complex_syllable_tail); +syllable_tail = (H (c|IV).VS?)* (H | complex_syllable_tail); -consonant_syllable = (k|CS)? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail; +consonant_syllable = (k|CS)? (c|IV|D|GB).VS? syllable_tail; punctuation_cluster = P V; broken_cluster = k? VS? syllable_tail; other = any; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc index 70ab972c6d2..b1f6b65ef52 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc @@ -301,7 +301,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; - /* Note: This loop is extra overhead, but should not be measurable. */ + /* Note: This loop is extra overhead, but should not be measurable. + * TODO Use a buffer scratch flag to remove the loop. */ bool has_broken_syllables = false; unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh index 3e9537a6447..9ec78ef8968 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh @@ -146,7 +146,7 @@ set_myanmar_properties (hb_glyph_info_t &info) break; case 0xAA74u: case 0xAA75u: case 0xAA76u: - /* https://github.com/roozbehp/unicode-data/issues/3 */ + /* https://github.com/harfbuzz/harfbuzz/issues/218 */ cat = OT_C; break; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc index 650c9800ac2..22d4aa3ab21 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc @@ -218,6 +218,10 @@ do_thai_pua_shaping (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, hb_font_t *font) { +#ifdef HB_NO_OT_SHAPE_COMPLEX_THAI_FALLBACK + return; +#endif + thai_above_state_t above_state = thai_above_start_state[NOT_CONSONANT]; thai_below_state_t below_state = thai_below_start_state[NOT_CONSONANT]; unsigned int base = 0; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh index c9410e4e581..39c20dec869 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh @@ -36,279 +36,273 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 44u, 21u, 21u, 8u, 44u, 8u, 44u, - 1u, 15u, 1u, 1u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 8u, 44u, 1u, 39u, 8u, 44u, 13u, 21u, 4u, 4u, 13u, 13u, - 8u, 44u, 8u, 44u, 8u, 44u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, 8u, 44u, - 8u, 44u, 8u, 44u, 1u, 39u, 1u, 15u, 12u, 44u, 1u, 44u, 8u, 44u, 21u, 42u, - 41u, 42u, 42u, 42u, 1u, 5u, 0 + 12u, 44u, 1u, 15u, 1u, 1u, 12u, 44u, 0u, 47u, 21u, 21u, 11u, 47u, 11u, 47u, + 1u, 15u, 1u, 1u, 11u, 47u, 22u, 47u, 23u, 47u, 24u, 47u, 25u, 47u, 26u, 47u, + 45u, 46u, 46u, 46u, 24u, 47u, 24u, 47u, 24u, 47u, 23u, 47u, 23u, 47u, 23u, 47u, + 22u, 47u, 22u, 47u, 22u, 47u, 22u, 47u, 11u, 47u, 1u, 47u, 11u, 47u, 13u, 21u, + 4u, 4u, 13u, 13u, 11u, 47u, 11u, 47u, 41u, 42u, 42u, 42u, 11u, 47u, 11u, 47u, + 22u, 47u, 23u, 47u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 47u, + 24u, 47u, 24u, 47u, 23u, 47u, 23u, 47u, 23u, 47u, 22u, 47u, 22u, 47u, 22u, 47u, + 22u, 47u, 11u, 47u, 1u, 47u, 1u, 15u, 4u, 4u, 13u, 21u, 13u, 13u, 12u, 44u, + 1u, 47u, 11u, 47u, 41u, 42u, 42u, 42u, 21u, 42u, 1u, 5u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 33, 15, 1, 33, 45, 1, 37, 37, - 15, 1, 37, 37, 32, 19, 19, 19, - 32, 32, 32, 37, 37, 37, 37, 37, - 37, 37, 37, 39, 37, 9, 1, 1, - 37, 37, 37, 32, 19, 19, 19, 32, - 32, 32, 37, 37, 37, 37, 37, 37, - 37, 37, 39, 15, 33, 44, 37, 22, - 2, 1, 5 + 33, 15, 1, 33, 48, 1, 37, 37, + 15, 1, 37, 26, 25, 24, 23, 22, + 2, 1, 24, 24, 24, 25, 25, 25, + 26, 26, 26, 26, 37, 47, 37, 9, + 1, 1, 37, 37, 2, 1, 37, 37, + 26, 25, 24, 23, 22, 2, 1, 24, + 24, 24, 25, 25, 25, 26, 26, 26, + 26, 37, 47, 15, 1, 9, 1, 33, + 47, 37, 2, 1, 22, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 34, 50, 52, 86, 132, 134, 172, - 210, 226, 228, 266, 304, 337, 357, 377, - 397, 430, 463, 496, 534, 572, 610, 648, - 686, 724, 762, 800, 840, 878, 888, 890, - 892, 930, 968, 1006, 1039, 1059, 1079, 1099, - 1132, 1165, 1198, 1236, 1274, 1312, 1350, 1388, - 1426, 1464, 1502, 1542, 1558, 1592, 1637, 1675, - 1698, 1701, 1703 + 0, 34, 50, 52, 86, 135, 137, 175, + 213, 229, 231, 269, 296, 322, 347, 371, + 394, 397, 399, 424, 449, 474, 500, 526, + 552, 579, 606, 633, 660, 698, 746, 784, + 794, 796, 798, 836, 874, 877, 879, 917, + 955, 982, 1008, 1033, 1057, 1080, 1083, 1085, + 1110, 1135, 1160, 1186, 1212, 1238, 1265, 1292, + 1319, 1346, 1384, 1432, 1448, 1450, 1460, 1462, + 1496, 1544, 1582, 1585, 1587, 1610 }; static const char _use_syllable_machine_indicies[] = { - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 4, 2, 3, 2, 6, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 6, 5, 7, 8, - 9, 7, 10, 8, 9, 9, 11, 9, - 9, 3, 12, 9, 9, 13, 7, 7, - 14, 15, 9, 9, 16, 17, 18, 19, - 20, 21, 22, 16, 23, 24, 25, 26, - 27, 28, 9, 29, 30, 31, 9, 9, - 9, 32, 33, 9, 35, 34, 37, 36, - 36, 38, 1, 36, 36, 39, 36, 36, - 36, 36, 36, 40, 41, 42, 43, 44, - 45, 46, 47, 41, 48, 40, 49, 50, - 51, 52, 36, 53, 54, 55, 36, 36, - 36, 36, 56, 36, 37, 36, 36, 38, - 1, 36, 36, 39, 36, 36, 36, 36, - 36, 57, 41, 42, 43, 44, 45, 46, - 47, 41, 48, 49, 49, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 56, 36, 38, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, - 59, 58, 38, 58, 37, 36, 36, 38, - 1, 36, 36, 39, 36, 36, 36, 36, - 36, 36, 41, 42, 43, 44, 45, 46, - 47, 41, 48, 49, 49, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 56, 36, 37, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 41, 42, 43, 44, 45, 36, 36, 36, - 36, 36, 36, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 42, 36, - 37, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 42, - 43, 44, 45, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 53, 54, 55, - 36, 37, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 43, 44, 45, 36, 37, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 44, 45, - 36, 37, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 45, 36, 37, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 43, 44, 45, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 53, 54, 55, 36, 37, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 43, 44, - 45, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 54, 55, 36, 37, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 43, - 44, 45, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 55, 36, - 37, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 42, - 43, 44, 45, 36, 36, 36, 36, 36, - 36, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 42, 36, 37, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 42, 43, 44, - 45, 36, 36, 36, 36, 36, 36, 36, - 51, 52, 36, 53, 54, 55, 36, 36, - 36, 36, 42, 36, 37, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 42, 43, 44, 45, 36, - 36, 36, 36, 36, 36, 36, 36, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 42, 36, 37, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 41, 42, 43, 44, 45, 36, 47, 41, - 36, 36, 36, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 42, 36, - 37, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 41, 42, - 43, 44, 45, 36, 60, 41, 36, 36, - 36, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 42, 36, 37, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 41, 42, 43, 44, - 45, 36, 36, 41, 36, 36, 36, 50, - 51, 52, 36, 53, 54, 55, 36, 36, - 36, 36, 42, 36, 37, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 41, 42, 43, 44, 45, 46, - 47, 41, 36, 36, 36, 50, 51, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 42, 36, 37, 36, 36, 38, 1, 36, - 36, 39, 36, 36, 36, 36, 36, 36, - 41, 42, 43, 44, 45, 46, 47, 41, - 48, 36, 49, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 56, 36, - 38, 58, 58, 58, 58, 58, 58, 37, - 58, 58, 58, 58, 58, 58, 59, 58, - 58, 58, 58, 58, 58, 58, 42, 43, - 44, 45, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 53, 54, 55, 58, - 37, 36, 36, 38, 1, 36, 36, 39, - 36, 36, 36, 36, 36, 36, 41, 42, - 43, 44, 45, 46, 47, 41, 48, 40, - 49, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 56, 36, 62, 61, - 61, 61, 61, 61, 61, 61, 63, 61, - 10, 64, 62, 61, 11, 65, 65, 3, - 6, 65, 65, 66, 65, 65, 65, 65, - 65, 67, 16, 17, 18, 19, 20, 21, - 22, 16, 23, 25, 25, 26, 27, 28, - 65, 29, 30, 31, 65, 65, 65, 65, - 33, 65, 11, 65, 65, 3, 6, 65, - 65, 66, 65, 65, 65, 65, 65, 65, - 16, 17, 18, 19, 20, 21, 22, 16, - 23, 25, 25, 26, 27, 28, 65, 29, - 30, 31, 65, 65, 65, 65, 33, 65, - 11, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 16, 17, - 18, 19, 20, 65, 65, 65, 65, 65, - 65, 26, 27, 28, 65, 29, 30, 31, - 65, 65, 65, 65, 17, 65, 11, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 17, 18, 19, - 20, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 29, 30, 31, 65, 11, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 18, - 19, 20, 65, 11, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 19, 20, 65, 11, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 20, 65, 11, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 18, 19, 20, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 29, 30, 31, 65, 11, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 18, 19, 20, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 30, 31, 65, 11, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 18, 19, 20, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 31, 65, 11, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 17, 18, 19, - 20, 65, 65, 65, 65, 65, 65, 26, - 27, 28, 65, 29, 30, 31, 65, 65, - 65, 65, 17, 65, 11, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 17, 18, 19, 20, 65, - 65, 65, 65, 65, 65, 65, 27, 28, - 65, 29, 30, 31, 65, 65, 65, 65, - 17, 65, 11, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 17, 18, 19, 20, 65, 65, 65, - 65, 65, 65, 65, 65, 28, 65, 29, - 30, 31, 65, 65, 65, 65, 17, 65, - 11, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 16, 17, - 18, 19, 20, 65, 22, 16, 65, 65, - 65, 26, 27, 28, 65, 29, 30, 31, - 65, 65, 65, 65, 17, 65, 11, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 16, 17, 18, 19, - 20, 65, 68, 16, 65, 65, 65, 26, - 27, 28, 65, 29, 30, 31, 65, 65, - 65, 65, 17, 65, 11, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 16, 17, 18, 19, 20, 65, - 65, 16, 65, 65, 65, 26, 27, 28, - 65, 29, 30, 31, 65, 65, 65, 65, - 17, 65, 11, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 16, 17, 18, 19, 20, 21, 22, 16, - 65, 65, 65, 26, 27, 28, 65, 29, - 30, 31, 65, 65, 65, 65, 17, 65, - 11, 65, 65, 3, 6, 65, 65, 66, - 65, 65, 65, 65, 65, 65, 16, 17, - 18, 19, 20, 21, 22, 16, 23, 65, - 25, 26, 27, 28, 65, 29, 30, 31, - 65, 65, 65, 65, 33, 65, 3, 65, - 65, 65, 65, 65, 65, 11, 65, 65, - 65, 65, 65, 65, 4, 65, 65, 65, - 65, 65, 65, 65, 17, 18, 19, 20, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 29, 30, 31, 65, 3, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 4, 69, 6, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 6, 69, - 8, 65, 65, 65, 8, 65, 65, 11, - 65, 65, 3, 6, 65, 65, 66, 65, - 65, 65, 65, 65, 65, 16, 17, 18, - 19, 20, 21, 22, 16, 23, 24, 25, - 26, 27, 28, 65, 29, 30, 31, 65, - 65, 65, 65, 33, 65, 11, 65, 65, - 3, 6, 65, 65, 66, 65, 65, 65, - 65, 65, 65, 16, 17, 18, 19, 20, - 21, 22, 16, 23, 24, 25, 26, 27, - 28, 65, 29, 30, 31, 65, 65, 65, - 65, 33, 65, 71, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 71, - 72, 70, 71, 72, 70, 72, 70, 8, - 69, 69, 69, 8, 69, 0 + 4, 2, 3, 2, 6, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 5, 7, 8, + 9, 7, 10, 11, 9, 9, 9, 9, + 9, 3, 12, 13, 9, 14, 7, 7, + 15, 16, 9, 9, 17, 18, 19, 20, + 21, 22, 23, 17, 24, 25, 26, 27, + 28, 29, 9, 30, 31, 32, 9, 33, + 34, 35, 36, 37, 38, 39, 9, 41, + 40, 43, 1, 42, 42, 44, 42, 42, + 42, 42, 42, 45, 46, 47, 48, 49, + 50, 51, 52, 46, 53, 45, 54, 55, + 56, 57, 42, 58, 59, 60, 42, 42, + 42, 42, 61, 62, 63, 64, 42, 43, + 1, 42, 42, 44, 42, 42, 42, 42, + 42, 65, 46, 47, 48, 49, 50, 51, + 52, 46, 53, 54, 54, 55, 56, 57, + 42, 58, 59, 60, 42, 42, 42, 42, + 61, 62, 63, 64, 42, 43, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 67, 66, 43, 66, 43, + 1, 42, 42, 44, 42, 42, 42, 42, + 42, 42, 46, 47, 48, 49, 50, 51, + 52, 46, 53, 54, 54, 55, 56, 57, + 42, 58, 59, 60, 42, 42, 42, 42, + 61, 62, 63, 64, 42, 46, 47, 48, + 49, 50, 42, 42, 42, 42, 42, 42, + 55, 56, 57, 42, 58, 59, 60, 42, + 42, 42, 42, 47, 62, 63, 64, 42, + 47, 48, 49, 50, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 58, 59, + 60, 42, 42, 42, 42, 42, 62, 63, + 64, 42, 48, 49, 50, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 62, + 63, 64, 42, 49, 50, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 62, + 63, 64, 42, 50, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 62, 63, + 64, 42, 62, 63, 42, 63, 42, 48, + 49, 50, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 58, 59, 60, 42, + 42, 42, 42, 42, 62, 63, 64, 42, + 48, 49, 50, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 59, 60, + 42, 42, 42, 42, 42, 62, 63, 64, + 42, 48, 49, 50, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, + 60, 42, 42, 42, 42, 42, 62, 63, + 64, 42, 47, 48, 49, 50, 42, 42, + 42, 42, 42, 42, 55, 56, 57, 42, + 58, 59, 60, 42, 42, 42, 42, 47, + 62, 63, 64, 42, 47, 48, 49, 50, + 42, 42, 42, 42, 42, 42, 42, 56, + 57, 42, 58, 59, 60, 42, 42, 42, + 42, 47, 62, 63, 64, 42, 47, 48, + 49, 50, 42, 42, 42, 42, 42, 42, + 42, 42, 57, 42, 58, 59, 60, 42, + 42, 42, 42, 47, 62, 63, 64, 42, + 46, 47, 48, 49, 50, 42, 52, 46, + 42, 42, 42, 55, 56, 57, 42, 58, + 59, 60, 42, 42, 42, 42, 47, 62, + 63, 64, 42, 46, 47, 48, 49, 50, + 42, 68, 46, 42, 42, 42, 55, 56, + 57, 42, 58, 59, 60, 42, 42, 42, + 42, 47, 62, 63, 64, 42, 46, 47, + 48, 49, 50, 42, 42, 46, 42, 42, + 42, 55, 56, 57, 42, 58, 59, 60, + 42, 42, 42, 42, 47, 62, 63, 64, + 42, 46, 47, 48, 49, 50, 51, 52, + 46, 42, 42, 42, 55, 56, 57, 42, + 58, 59, 60, 42, 42, 42, 42, 47, + 62, 63, 64, 42, 43, 1, 42, 42, + 44, 42, 42, 42, 42, 42, 42, 46, + 47, 48, 49, 50, 51, 52, 46, 53, + 42, 54, 55, 56, 57, 42, 58, 59, + 60, 42, 42, 42, 42, 61, 62, 63, + 64, 42, 43, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 67, 66, 66, 66, 66, 66, 66, 66, + 47, 48, 49, 50, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 58, 59, + 60, 66, 66, 66, 66, 66, 62, 63, + 64, 66, 43, 1, 42, 42, 44, 42, + 42, 42, 42, 42, 42, 46, 47, 48, + 49, 50, 51, 52, 46, 53, 45, 54, + 55, 56, 57, 42, 58, 59, 60, 42, + 42, 42, 42, 61, 62, 63, 64, 42, + 70, 69, 69, 69, 69, 69, 69, 69, + 71, 69, 10, 72, 70, 69, 43, 1, + 42, 42, 44, 42, 42, 42, 42, 42, + 73, 46, 47, 48, 49, 50, 51, 52, + 46, 53, 45, 54, 55, 56, 57, 42, + 58, 59, 60, 42, 74, 75, 42, 61, + 62, 63, 64, 42, 43, 1, 42, 42, + 44, 42, 42, 42, 42, 42, 42, 46, + 47, 48, 49, 50, 51, 52, 46, 53, + 45, 54, 55, 56, 57, 42, 58, 59, + 60, 42, 74, 75, 42, 61, 62, 63, + 64, 42, 74, 75, 76, 75, 76, 3, + 6, 77, 77, 78, 77, 77, 77, 77, + 77, 79, 17, 18, 19, 20, 21, 22, + 23, 17, 24, 26, 26, 27, 28, 29, + 77, 30, 31, 32, 77, 77, 77, 77, + 36, 37, 38, 39, 77, 3, 6, 77, + 77, 78, 77, 77, 77, 77, 77, 77, + 17, 18, 19, 20, 21, 22, 23, 17, + 24, 26, 26, 27, 28, 29, 77, 30, + 31, 32, 77, 77, 77, 77, 36, 37, + 38, 39, 77, 17, 18, 19, 20, 21, + 77, 77, 77, 77, 77, 77, 27, 28, + 29, 77, 30, 31, 32, 77, 77, 77, + 77, 18, 37, 38, 39, 77, 18, 19, + 20, 21, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 30, 31, 32, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 19, 20, 21, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 37, 38, 39, + 77, 20, 21, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 37, 38, 39, + 77, 21, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 37, 38, 77, 38, 77, 19, 20, 21, + 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 30, 31, 32, 77, 77, 77, + 77, 77, 37, 38, 39, 77, 19, 20, + 21, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 31, 32, 77, 77, + 77, 77, 77, 37, 38, 39, 77, 19, + 20, 21, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 32, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 18, 19, 20, 21, 77, 77, 77, 77, + 77, 77, 27, 28, 29, 77, 30, 31, + 32, 77, 77, 77, 77, 18, 37, 38, + 39, 77, 18, 19, 20, 21, 77, 77, + 77, 77, 77, 77, 77, 28, 29, 77, + 30, 31, 32, 77, 77, 77, 77, 18, + 37, 38, 39, 77, 18, 19, 20, 21, + 77, 77, 77, 77, 77, 77, 77, 77, + 29, 77, 30, 31, 32, 77, 77, 77, + 77, 18, 37, 38, 39, 77, 17, 18, + 19, 20, 21, 77, 23, 17, 77, 77, + 77, 27, 28, 29, 77, 30, 31, 32, + 77, 77, 77, 77, 18, 37, 38, 39, + 77, 17, 18, 19, 20, 21, 77, 80, + 17, 77, 77, 77, 27, 28, 29, 77, + 30, 31, 32, 77, 77, 77, 77, 18, + 37, 38, 39, 77, 17, 18, 19, 20, + 21, 77, 77, 17, 77, 77, 77, 27, + 28, 29, 77, 30, 31, 32, 77, 77, + 77, 77, 18, 37, 38, 39, 77, 17, + 18, 19, 20, 21, 22, 23, 17, 77, + 77, 77, 27, 28, 29, 77, 30, 31, + 32, 77, 77, 77, 77, 18, 37, 38, + 39, 77, 3, 6, 77, 77, 78, 77, + 77, 77, 77, 77, 77, 17, 18, 19, + 20, 21, 22, 23, 17, 24, 77, 26, + 27, 28, 29, 77, 30, 31, 32, 77, + 77, 77, 77, 36, 37, 38, 39, 77, + 3, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 4, 77, + 77, 77, 77, 77, 77, 77, 18, 19, + 20, 21, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 30, 31, 32, 77, + 77, 77, 77, 77, 37, 38, 39, 77, + 3, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 4, 81, + 82, 77, 13, 77, 77, 77, 77, 77, + 77, 77, 83, 77, 13, 77, 6, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 6, 81, + 8, 77, 77, 77, 8, 77, 77, 77, + 77, 77, 3, 6, 13, 77, 78, 77, + 77, 77, 77, 77, 77, 17, 18, 19, + 20, 21, 22, 23, 17, 24, 25, 26, + 27, 28, 29, 77, 30, 31, 32, 77, + 33, 34, 77, 36, 37, 38, 39, 77, + 3, 6, 77, 77, 78, 77, 77, 77, + 77, 77, 77, 17, 18, 19, 20, 21, + 22, 23, 17, 24, 25, 26, 27, 28, + 29, 77, 30, 31, 32, 77, 77, 77, + 77, 36, 37, 38, 39, 77, 33, 34, + 77, 34, 77, 74, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 74, + 75, 76, 8, 81, 81, 81, 8, 81, + 0 }; static const char _use_syllable_machine_trans_targs[] = { - 4, 8, 4, 32, 2, 4, 1, 5, - 6, 4, 29, 4, 51, 52, 53, 55, - 34, 35, 36, 37, 38, 45, 46, 48, - 54, 49, 42, 43, 44, 39, 40, 41, - 58, 50, 4, 4, 4, 4, 7, 0, - 28, 11, 12, 13, 14, 15, 22, 23, - 25, 26, 19, 20, 21, 16, 17, 18, - 27, 10, 4, 9, 24, 4, 30, 31, - 4, 4, 3, 33, 47, 4, 4, 56, - 57 + 4, 8, 4, 38, 2, 4, 1, 5, + 6, 4, 31, 34, 59, 60, 63, 64, + 68, 40, 41, 42, 43, 44, 53, 54, + 56, 65, 57, 50, 51, 52, 47, 48, + 49, 66, 67, 69, 58, 45, 46, 4, + 4, 4, 4, 7, 0, 30, 11, 12, + 13, 14, 15, 24, 25, 27, 28, 21, + 22, 23, 18, 19, 20, 29, 16, 17, + 4, 10, 4, 9, 26, 4, 32, 33, + 4, 35, 36, 37, 4, 4, 3, 39, + 55, 4, 61, 62 }; static const char _use_syllable_machine_trans_actions[] = { 1, 0, 2, 3, 0, 4, 0, 0, - 7, 8, 0, 9, 10, 10, 3, 0, + 7, 8, 0, 7, 9, 0, 9, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 3, 0, 0, 0, 0, 0, 0, - 0, 3, 11, 12, 13, 14, 7, 0, - 7, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 0, 0, 0, - 0, 7, 15, 0, 0, 16, 0, 0, - 17, 18, 0, 3, 0, 19, 20, 0, - 0 + 0, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 10, + 11, 12, 13, 7, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 14, 7, 15, 0, 0, 16, 0, 0, + 17, 7, 0, 0, 18, 19, 0, 3, + 0, 20, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -319,7 +313,8 @@ static const char _use_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { @@ -330,18 +325,20 @@ static const char _use_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 6, 0, 35, 37, 37, - 59, 59, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 59, 37, 62, 65, 62, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 70, 70, 66, 66, 71, - 71, 71, 70 + 1, 3, 3, 6, 0, 41, 43, 43, + 67, 67, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 67, 43, 70, + 73, 70, 43, 43, 77, 77, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 82, 78, 78, 78, 82, + 78, 78, 78, 78, 77, 82 }; static const int use_syllable_machine_start = 4; @@ -355,7 +352,7 @@ static const int use_syllable_machine_en_main = 4; -#line 143 "hb-ot-shape-complex-use-machine.rl" +#line 150 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -374,7 +371,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 378 "hb-ot-shape-complex-use-machine.hh" +#line 375 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -382,7 +379,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 163 "hb-ot-shape-complex-use-machine.rl" +#line 170 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -390,7 +387,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 394 "hb-ot-shape-complex-use-machine.hh" +#line 391 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -404,7 +401,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 408 "hb-ot-shape-complex-use-machine.hh" +#line 405 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -427,59 +424,59 @@ _eof_trans: {te = p+1;} break; case 12: -#line 132 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} break; case 14: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (standard_cluster); }} break; - case 9: -#line 138 "hb-ot-shape-complex-use-machine.rl" + case 10: +#line 145 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 8: -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 146 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (non_cluster); }} break; case 11: -#line 132 "hb-ot-shape-complex-use-machine.rl" +#line 139 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (independent_cluster); }} break; case 15: -#line 133 "hb-ot-shape-complex-use-machine.rl" +#line 140 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; case 13: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (standard_cluster); }} break; case 17: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 142 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; case 16: -#line 136 "hb-ot-shape-complex-use-machine.rl" +#line 143 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; - case 20: -#line 137 "hb-ot-shape-complex-use-machine.rl" + case 18: +#line 144 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 18: -#line 138 "hb-ot-shape-complex-use-machine.rl" + case 19: +#line 145 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 19: -#line 139 "hb-ot-shape-complex-use-machine.rl" + case 20: +#line 146 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; case 1: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (standard_cluster); }} break; case 4: -#line 138 "hb-ot-shape-complex-use-machine.rl" +#line 145 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 2: @@ -497,16 +494,16 @@ _eof_trans: case 3: #line 1 "NONE" {te = p+1;} -#line 138 "hb-ot-shape-complex-use-machine.rl" +#line 145 "hb-ot-shape-complex-use-machine.rl" {act = 7;} break; - case 10: + case 9: #line 1 "NONE" {te = p+1;} -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 146 "hb-ot-shape-complex-use-machine.rl" {act = 8;} break; -#line 510 "hb-ot-shape-complex-use-machine.hh" +#line 507 "hb-ot-shape-complex-use-machine.hh" } _again: @@ -515,7 +512,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 519 "hb-ot-shape-complex-use-machine.hh" +#line 516 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) @@ -531,7 +528,7 @@ _again: } -#line 171 "hb-ot-shape-complex-use-machine.rl" +#line 178 "hb-ot-shape-complex-use-machine.rl" } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl index 7702cd94de9..2a1b90d8fc6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl @@ -49,7 +49,7 @@ N = 4; # BASE_NUM GB = 5; # BASE_OTHER CGJ = 6; # CGJ #F = 7; # CONS_FINAL -FM = 8; # CONS_FINAL_MOD +#FM = 8; # CONS_FINAL_MOD #M = 9; # CONS_MED #CM = 10; # CONS_MOD SUB = 11; # CONS_SUB @@ -66,6 +66,8 @@ S = 19; # SYM VS = 21; # VARIATION_SELECTOR #V = 36; # VOWEL #VM = 40; # VOWEL_MOD +CS = 43; # CONS_WITH_STACKER +HVM = 44; # HALANT_OR_VOWEL_MODIFIER FAbv = 24; # CONS_FINAL_ABOVE FBlw = 25; # CONS_FINAL_BELOW @@ -86,9 +88,9 @@ VMPst = 39; # VOWEL_MOD_POST VMPre = 23; # VOWEL_MOD_PRE SMAbv = 41; # SYM_MOD_ABOVE SMBlw = 42; # SYM_MOD_BELOW -CS = 43; # CONS_WITH_STACKER - -HVM = 44; # HALANT_OR_VOWEL_MODIFIER +FMAbv = 45; # CONS_FINAL_MOD UIPC = Top +FMBlw = 46; # CONS_FINAL_MOD UIPC = Bottom +FMPst = 47; # CONS_FINAL_MOD UIPC = Not_Applicable h = H | HVM; # https://github.com/harfbuzz/harfbuzz/issues/1102 @@ -98,7 +100,8 @@ consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.h.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*; medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?; dependent_vowels = VPre* VAbv* VBlw* VPst*; vowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*; -final_consonants = FAbv* FBlw* FPst* FM?; +final_consonants = FAbv* FBlw* FPst*; +final_modifiers = FMAbv* FMBlw* | FMPst?; complex_syllable_tail = consonant_modifiers @@ -106,7 +109,11 @@ complex_syllable_tail = dependent_vowels vowel_modifiers final_consonants + final_modifiers ; +number_joiner_terminated_cluster_tail = (HN N VS?)* HN; +numeral_cluster_tail = (HN N VS?)+; +symbol_cluster_tail = SMAbv+ SMBlw* | SMBlw+; virama_terminated_cluster = (R|CS)? (B | GB) VS? @@ -119,12 +126,12 @@ standard_cluster = ; broken_cluster = R? - complex_syllable_tail + (complex_syllable_tail | number_joiner_terminated_cluster_tail | numeral_cluster_tail | symbol_cluster_tail) ; -number_joiner_terminated_cluster = N VS? (HN N VS?)* HN; -numeral_cluster = N VS? (HN N VS?)*; -symbol_cluster = S VS? SMAbv* SMBlw*; +number_joiner_terminated_cluster = N VS? number_joiner_terminated_cluster_tail; +numeral_cluster = N VS? numeral_cluster_tail?; +symbol_cluster = (S | GB) VS? symbol_cluster_tail?; independent_cluster = (IND | O | Rsv | WJ) VS?; other = any; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc index cb5c358cd56..93b81521715 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc @@ -22,7 +22,6 @@ #define B USE_B /* BASE */ #define CGJ USE_CGJ /* CGJ */ #define CS USE_CS /* CONS_WITH_STACKER */ -#define FM USE_FM /* CONS_FINAL_MOD */ #define GB USE_GB /* BASE_OTHER */ #define H USE_H /* HALANT */ #define HN USE_HN /* HALANT_NUM */ @@ -43,6 +42,9 @@ #define FBlw USE_FBlw #define FPst USE_FPst #define FAbv USE_FAbv +#define FMBlw USE_FMBlw +#define FMPst USE_FMPst +#define FMAbv USE_FMAbv #define MPre USE_MPre #define MBlw USE_MBlw #define MPst USE_MPst @@ -75,7 +77,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Latin-1 Supplement */ /* 00A0 */ GB, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, - /* 00B0 */ O, O, FM, FM, O, O, O, O, O, O, O, O, O, O, O, O, + /* 00B0 */ O, O, FMPst, FMPst, O, O, O, O, O, O, O, O, O, O, O, O, /* 00C0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 00D0 */ O, O, O, O, O, O, O, GB, @@ -108,7 +110,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPst, VPst, H, IND, O, /* 09D0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, B, B, O, B, /* 09E0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, - /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, B, O, FM, O, + /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, B, O, FMAbv, O, /* Gurmukhi */ @@ -204,7 +206,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Tibetan */ VBlw, VBlw, O, O, O, O, O, O, /* 0F20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 0F30 */ B, B, B, B, O, FM, O, FM, O, CMAbv, O, O, O, O, VPst, VPre, + /* 0F30 */ B, B, B, B, O, FMBlw, O, FMBlw, O, CMAbv, O, O, O, O, VPst, VPre, /* 0F40 */ B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, B, /* 0F50 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0F60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, @@ -213,7 +215,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 0F90 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, /* 0FA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, /* 0FB0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, O, O, - /* 0FC0 */ O, O, O, O, O, O, FM, O, + /* 0FC0 */ O, O, O, O, O, O, FMBlw, O, #define use_offset_0x1000u 1536 @@ -260,8 +262,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1790 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPst, VPst, - /* 17C0 */ VPst, VPre, VPre, VPre, VPst, VPst, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM, - /* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, FM, O, O, + /* 17C0 */ VPst, VPre, VPre, VPre, VPst, VPst, VMAbv, VMPst, VPst, VMAbv, VMAbv, FMAbv, FAbv, CMAbv, FMAbv, FMAbv, + /* 17D0 */ FMAbv, VAbv, H, FMAbv, O, O, O, O, O, O, O, O, B, FMAbv, O, O, /* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, #define use_offset_0x1900u 1936 @@ -272,7 +274,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1900 */ GB, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1910 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, O, /* 1920 */ VAbv, VAbv, VBlw, VPst, VPst, VAbv, VAbv, VAbv, VAbv, SUB, SUB, SUB, O, O, O, O, - /* 1930 */ FPst, FPst, VMBlw, FPst, FPst, FPst, FPst, FPst, FPst, FBlw, VAbv, FM, O, O, O, O, + /* 1930 */ FPst, FPst, VMBlw, FPst, FPst, FPst, FPst, FPst, FPst, FBlw, VAbv, FMBlw, O, O, O, O, /* 1940 */ O, O, O, O, O, O, B, B, B, B, B, B, B, B, B, B, /* Tai Le */ @@ -302,9 +304,9 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, FAbv, SUB, SUB, SUB, SUB, O, + /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, SUB, SUB, SUB, O, /* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, - /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FM, FM, O, O, FBlw, + /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FMAbv, FMAbv, O, O, FMBlw, /* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 1A90 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, @@ -318,8 +320,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1B20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1B30 */ B, B, B, B, CMAbv, VPst, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VPre, /* 1B40 */ VPst, VPst, VAbv, VAbv, H, B, B, B, B, B, B, B, O, O, O, O, - /* 1B50 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, - /* 1B60 */ O, O, O, O, O, O, O, O, O, O, O, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv, + /* 1B50 */ B, B, B, B, B, B, B, B, B, B, O, GB, GB, O, O, GB, + /* 1B60 */ O, S, GB, S, S, S, S, S, GB, S, S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv, /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv, O, O, O, O, O, O, O, O, O, O, O, O, /* Sundanese */ @@ -341,7 +343,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1C00 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1C10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1C20 */ B, B, B, B, SUB, SUB, VPst, VPre, VPre, VPst, VPst, VPst, VBlw, FAbv, FAbv, FAbv, - /* 1C30 */ FAbv, FAbv, FAbv, FAbv, VMPre, VMPre, FM, CMBlw, O, O, O, O, O, O, O, O, + /* 1C30 */ FAbv, FAbv, FAbv, FAbv, VMPre, VMPre, FMAbv, CMBlw, O, O, O, O, O, O, O, O, /* 1C40 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, B, B, #define use_offset_0x1cd0u 2688 @@ -357,7 +359,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Combining Diacritical Marks Supplement */ - O, O, O, FM, O, O, O, O, + O, O, O, FMAbv, O, O, O, O, #define use_offset_0x2008u 2744 @@ -372,8 +374,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Superscripts and Subscripts */ - /* 2070 */ O, O, O, O, FM, O, O, O, O, O, O, O, O, O, O, O, - /* 2080 */ O, O, FM, FM, FM, O, O, O, + /* 2070 */ O, O, O, O, FMPst, O, O, O, O, O, O, O, O, O, O, O, + /* 2080 */ O, O, FMPst, FMPst, FMPst, O, O, O, #define use_offset_0x20f0u 2800 @@ -547,7 +549,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11190 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 111A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 111B0 */ B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, - /* 111C0 */ H, B, R, R, O, O, O, O, GB, FBlw, CMBlw, VAbv, VBlw, O, O, O, + /* 111C0 */ H, B, R, R, O, O, O, O, GB, FMBlw, CMBlw, VAbv, VBlw, O, O, O, /* 111D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* Sinhala Archaic Numbers */ @@ -600,7 +602,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, /* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O, - /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, FM, B, + /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, FMAbv, B, /* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, @@ -683,7 +685,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11A00 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VAbv, VAbv, VBlw, B, B, B, B, B, /* 11A10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 11A30 */ B, B, B, FM, VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst, R, MBlw, MBlw, MBlw, MBlw, GB, + /* 11A30 */ B, B, B, FMBlw, VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst, R, MBlw, MBlw, MBlw, MBlw, GB, /* 11A40 */ O, O, O, O, O, GB, O, H, O, O, O, O, O, O, O, O, /* Soyombo */ @@ -809,7 +811,6 @@ hb_use_get_category (hb_codepoint_t u) #undef B #undef CGJ #undef CS -#undef FM #undef GB #undef H #undef HN @@ -830,6 +831,9 @@ hb_use_get_category (hb_codepoint_t u) #undef FBlw #undef FPst #undef FAbv +#undef FMBlw +#undef FMPst +#undef FMAbv #undef MPre #undef MBlw #undef MPst diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc index eecde6e8503..cbaa519c4b5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc @@ -294,7 +294,7 @@ setup_rphf_mask (const hb_ot_shape_plan_t *plan, foreach_syllable (buffer, start, end) { - unsigned int limit = info[start].use_category() == USE_R ? 1 : MIN (3u, end - start); + unsigned int limit = info[start].use_category() == USE_R ? 1 : hb_min (3u, end - start); for (unsigned int i = start; i < start + limit; i++) info[i].mask |= mask; } @@ -526,7 +526,8 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) return; - /* Note: This loop is extra overhead, but should not be measurable. */ + /* Note: This loop is extra overhead, but should not be measurable. + * TODO Use a buffer scratch flag to remove the loop. */ bool has_broken_syllables = false; unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; @@ -560,7 +561,6 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, ginfo.cluster = buffer->cur().cluster; ginfo.mask = buffer->cur().mask; ginfo.syllable() = buffer->cur().syllable(); - /* TODO Set glyph_props? */ /* Insert dottedcircle after possible Repha. */ while (buffer->idx < buffer->len && buffer->successful && diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh index ab56e1b8f1d..b52b853cd9f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh @@ -68,6 +68,10 @@ enum use_category_t { USE_VS = 21, /* VARIATION_SELECTOR */ // USE_V = 36, /* VOWEL */ // USE_VM = 40, /* VOWEL_MOD */ + USE_CS = 43, /* CONS_WITH_STACKER */ + + /* https://github.com/harfbuzz/harfbuzz/issues/1102 */ + USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */ USE_FAbv = 24, /* CONS_FINAL_ABOVE */ USE_FBlw = 25, /* CONS_FINAL_BELOW */ @@ -88,10 +92,9 @@ enum use_category_t { USE_VMPre = 23, /* VOWEL_MOD_PRE */ USE_SMAbv = 41, /* SYM_MOD_ABOVE */ USE_SMBlw = 42, /* SYM_MOD_BELOW */ - USE_CS = 43, /* CONS_WITH_STACKER */ - - /* https://github.com/harfbuzz/harfbuzz/issues/1102 */ - USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */ + USE_FMAbv = 45, /* CONS_FINAL_MOD UIPC = Top */ + USE_FMBlw = 46, /* CONS_FINAL_MOD UIPC = Bottom */ + USE_FMPst = 47, /* CONS_FINAL_MOD UIPC = Not_Applicable */ }; HB_INTERNAL USE_TABLE_ELEMENT_TYPE diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc index e4cf64561bf..912ee35b478 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc @@ -34,6 +34,9 @@ _hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, hb_font_t *font HB_UNUSED) { +#ifdef HB_NO_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS + return; +#endif if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) return; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc index f9d4a75f51c..573af8ec627 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc @@ -166,6 +166,10 @@ _hb_ot_shape_fallback_mark_position_recategorize_marks (const hb_ot_shape_plan_t hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) { +#ifdef HB_NO_OT_SHAPE_FALLBACK + return; +#endif + unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) @@ -434,6 +438,10 @@ _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, bool adjust_offsets_when_zeroing) { +#ifdef HB_NO_OT_SHAPE_FALLBACK + return; +#endif + _hb_buffer_assert_gsubgpos_vars (buffer); unsigned int start = 0; @@ -448,6 +456,7 @@ _hb_ot_shape_fallback_mark_position (const hb_ot_shape_plan_t *plan, } +#ifndef HB_DISABLE_DEPRECATED struct hb_ot_shape_fallback_kern_driver_t { hb_ot_shape_fallback_kern_driver_t (hb_font_t *font_, @@ -466,6 +475,7 @@ struct hb_ot_shape_fallback_kern_driver_t hb_font_t *font; hb_direction_t direction; }; +#endif /* Performs font-assisted kerning. */ void @@ -473,6 +483,11 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { +#ifdef HB_NO_OT_SHAPE_FALLBACK + return; +#endif + +#ifndef HB_DISABLE_DEPRECATED if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction) ? !font->has_glyph_h_kerning_func () : !font->has_glyph_v_kerning_func ()) @@ -489,6 +504,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, if (reverse) buffer->reverse (); +#endif } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc index 7fff3059e6c..c63c3adee0c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc @@ -55,7 +55,8 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner, const hb_feature_t *user_features, unsigned int num_user_features); -static bool +#ifndef HB_NO_SHAPE_AAT +static inline bool _hb_apply_morx (hb_face_t *face) { if (hb_options ().aat && @@ -69,14 +70,17 @@ _hb_apply_morx (hb_face_t *face) 0, nullptr, nullptr)) && hb_aat_layout_has_substitution (face); } +#endif hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *face, const hb_segment_properties_t *props) : face (face), props (*props), map (face, props), - aat_map (face, props), - apply_morx (_hb_apply_morx (face)) + aat_map (face, props) +#ifndef HB_NO_SHAPE_AAT + , apply_morx (_hb_apply_morx (face)) +#endif { shaper = hb_ot_shape_complex_categorize (this); @@ -124,24 +128,36 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, * Decide who does substitutions. GSUB, morx, or fallback. */ +#ifndef HB_NO_SHAPE_AAT plan.apply_morx = apply_morx; +#endif /* * Decide who does positioning. GPOS, kerx, kern, or fallback. */ - if (hb_options ().aat && hb_aat_layout_has_positioning (face)) + if (0) + ; +#ifndef HB_NO_SHAPE_AAT + else if (hb_options ().aat && hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; +#endif else if (!apply_morx && !disable_gpos && hb_ot_layout_has_positioning (face)) plan.apply_gpos = true; +#ifndef HB_NO_SHAPE_AAT else if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; +#endif if (!plan.apply_kerx && !has_gpos_kern) { /* Apparently Apple applies kerx if GPOS kern was not applied. */ - if (hb_aat_layout_has_positioning (face)) + if (0) + ; +#ifndef HB_NO_SHAPE_AAT + else if (hb_aat_layout_has_positioning (face)) plan.apply_kerx = true; +#endif else if (hb_ot_layout_has_kerning (face)) plan.apply_kern = true; } @@ -158,8 +174,10 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan, plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing && script_fallback_mark_positioning; +#ifndef HB_NO_SHAPE_AAT /* Currently we always apply trak. */ plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face); +#endif } bool @@ -962,12 +980,12 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c) c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT; if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_LEN_FACTOR))) { - c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR, + c->buffer->max_len = hb_max (c->buffer->len * HB_BUFFER_MAX_LEN_FACTOR, (unsigned) HB_BUFFER_MAX_LEN_MIN); } if (likely (!hb_unsigned_mul_overflows (c->buffer->len, HB_BUFFER_MAX_OPS_FACTOR))) { - c->buffer->max_ops = MAX (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR, + c->buffer->max_ops = hb_max (c->buffer->len * HB_BUFFER_MAX_OPS_FACTOR, (unsigned) HB_BUFFER_MAX_OPS_MIN); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh index 73a11e1af5b..b7c0f106531 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh @@ -80,10 +80,16 @@ struct hb_ot_shape_plan_t bool adjust_mark_positioning_when_zeroing : 1; bool apply_gpos : 1; - bool apply_kerx : 1; bool apply_kern : 1; +#ifndef HB_NO_SHAPE_AAT + bool apply_kerx : 1; bool apply_morx : 1; bool apply_trak : 1; +#else + static constexpr bool apply_kerx = false; + static constexpr bool apply_morx = false; + static constexpr bool apply_trak = false; +#endif void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const { @@ -113,7 +119,11 @@ struct hb_ot_shape_planner_t hb_segment_properties_t props; hb_ot_map_builder_t map; hb_aat_map_builder_t aat_map; +#ifndef HB_NO_SHAPE_AAT bool apply_morx : 1; +#else + static constexpr bool apply_morx = false; +#endif bool script_zero_marks : 1; bool script_fallback_mark_positioning : 1; const struct hb_ot_complex_shaper_t *shaper; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-stat-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-stat-table.hh index 04a2ee99e8c..03604a0adf9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-stat-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-stat-table.hh @@ -65,6 +65,8 @@ struct AxisValueFormat1 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 1. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -88,6 +90,8 @@ struct AxisValueFormat2 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 2. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -115,6 +119,8 @@ struct AxisValueFormat3 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 3. */ HBUINT16 axisIndex; /* Zero-base index into the axis record array @@ -157,6 +163,8 @@ struct AxisValueFormat4 return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_value_name_id () const { return valueNameID; } + protected: HBUINT16 format; /* Format identifier — set to 4. */ HBUINT16 axisCount; /* The total number of axes contributing to @@ -178,7 +186,7 @@ struct AxisValue bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (unlikely (c->check_struct (this))) + if (unlikely (!c->check_struct (this))) return_trace (false); switch (u.format) @@ -191,6 +199,18 @@ struct AxisValue } } + hb_ot_name_id_t get_value_name_id () const + { + switch (u.format) + { + case 1: return u.format1.get_value_name_id (); + case 2: return u.format2.get_value_name_id (); + case 3: return u.format3.get_value_name_id (); + case 4: return u.format4.get_value_name_id (); + default: return HB_OT_NAME_ID_INVALID; + } + } + protected: union { @@ -212,6 +232,8 @@ struct StatAxisRecord return_trace (likely (c->check_struct (this))); } + hb_ot_name_id_t get_name_id () const { return nameID; } + protected: Tag tag; /* A tag identifying the axis of design variation. */ NameID nameID; /* The name ID for entries in the 'name' table that @@ -231,17 +253,59 @@ struct STAT { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - majorVersion == 1 && - minorVersion > 0 && + version.major == 1 && + version.minor > 0 && designAxesOffset.sanitize (c, this, designAxisCount) && offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets)))); } + bool has_data () const { return version.to_int (); } + + unsigned get_design_axis_count () const { return designAxisCount; } + + hb_ot_name_id_t get_axis_record_name_id (unsigned axis_record_index) const + { + if (unlikely (axis_record_index >= designAxisCount)) return HB_OT_NAME_ID_INVALID; + const StatAxisRecord &axis_record = get_design_axes ()[axis_record_index]; + return axis_record.get_name_id (); + } + + unsigned get_axis_value_count () const { return axisValueCount; } + + hb_ot_name_id_t get_axis_value_name_id (unsigned axis_value_index) const + { + if (unlikely (axis_value_index >= axisValueCount)) return HB_OT_NAME_ID_INVALID; + const AxisValue &axis_value = (this + get_axis_value_offsets ()[axis_value_index]); + return axis_value.get_value_name_id (); + } + + void collect_name_ids (hb_set_t *nameids_to_retain) const + { + if (!has_data ()) return; + + + get_design_axes () + | hb_map (&StatAxisRecord::get_name_id) + | hb_sink (nameids_to_retain) + ; + + + get_axis_value_offsets () + | hb_map (hb_add (&(this + offsetToAxisValueOffsets))) + | hb_map (&AxisValue::get_value_name_id) + | hb_sink (nameids_to_retain) + ; + } + + protected: + hb_array_t<const StatAxisRecord> const get_design_axes () const + { return (this+designAxesOffset).as_array (designAxisCount); } + + hb_array_t<const OffsetTo<AxisValue>> const get_axis_value_offsets () const + { return (this+offsetToAxisValueOffsets).as_array (axisValueCount); } + + protected: - HBUINT16 majorVersion; /* Major version number of the style attributes - * table — set to 1. */ - HBUINT16 minorVersion; /* Minor version number of the style attributes - * table — set to 2. */ + FixedVersion<>version; /* Version of the stat table + * initially set to 0x00010002u */ HBUINT16 designAxisSize; /* The size in bytes of each axis record. */ HBUINT16 designAxisCount;/* The number of design axis records. In a * font with an 'fvar' table, this value must be @@ -249,7 +313,7 @@ struct STAT * in the 'fvar' table. In all fonts, must * be greater than zero if axisValueCount * is greater than zero. */ - LNNOffsetTo<UnsizedArrayOf<StatAxisRecord> > + LNNOffsetTo<UnsizedArrayOf<StatAxisRecord>> designAxesOffset; /* Offset in bytes from the beginning of * the STAT table to the start of the design @@ -257,7 +321,7 @@ struct STAT * set to zero; if designAxisCount is greater * than zero, must be greater than zero. */ HBUINT16 axisValueCount; /* The number of axis value tables. */ - LNNOffsetTo<UnsizedArrayOf<OffsetTo<AxisValue> > > + LNNOffsetTo<UnsizedArrayOf<OffsetTo<AxisValue>>> offsetToAxisValueOffsets; /* Offset in bytes from the beginning of * the STAT table to the start of the design diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh index 09e16271807..d8fcd2fdb46 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh @@ -7,1054 +7,1052 @@ * on files with these headers: * * <meta name="updated_at" content="2018-11-18 05:25 AM" /> - * File-Date: 2019-02-20 + * File-Date: 2019-04-03 */ #ifndef HB_OT_TAG_TABLE_HH #define HB_OT_TAG_TABLE_HH static const LangTag ot_languages[] = { - {"aa", {HB_TAG('A','F','R',' ')}}, /* Afar */ - {"aae", {HB_TAG('S','Q','I',' ')}}, /* Arbëreshë Albanian -> Albanian */ - {"aao", {HB_TAG('A','R','A',' ')}}, /* Algerian Saharan Arabic -> Arabic */ - {"aat", {HB_TAG('S','Q','I',' ')}}, /* Arvanitika Albanian -> Albanian */ - {"ab", {HB_TAG('A','B','K',' ')}}, /* Abkhazian */ - {"abh", {HB_TAG('A','R','A',' ')}}, /* Tajiki Arabic -> Arabic */ - {"abq", {HB_TAG('A','B','A',' ')}}, /* Abaza */ - {"abv", {HB_TAG('A','R','A',' ')}}, /* Baharna Arabic -> Arabic */ - {"acf", {HB_TAG('F','A','N',' ')}}, /* Saint Lucian Creole French -> French Antillean */ - {"ach", {HB_TAG('A','C','H',' ')}}, /* Acoli -> Acholi */ - {"acm", {HB_TAG('A','R','A',' ')}}, /* Mesopotamian Arabic -> Arabic */ - {"acq", {HB_TAG('A','R','A',' ')}}, /* Ta'izzi-Adeni Arabic -> Arabic */ - {"acr", {HB_TAG('A','C','R',' ')}}, /* Achi */ - {"acw", {HB_TAG('A','R','A',' ')}}, /* Hijazi Arabic -> Arabic */ - {"acx", {HB_TAG('A','R','A',' ')}}, /* Omani Arabic -> Arabic */ - {"acy", {HB_TAG('A','R','A',' ')}}, /* Cypriot Arabic -> Arabic */ - {"ada", {HB_TAG('D','N','G',' ')}}, /* Adangme -> Dangme */ - {"adf", {HB_TAG('A','R','A',' ')}}, /* Dhofari Arabic -> Arabic */ - {"adp", {HB_TAG('D','Z','N',' ')}}, /* Adap (retired code) -> Dzongkha */ - {"ady", {HB_TAG('A','D','Y',' ')}}, /* Adyghe */ - {"aeb", {HB_TAG('A','R','A',' ')}}, /* Tunisian Arabic -> Arabic */ - {"aec", {HB_TAG('A','R','A',' ')}}, /* Saidi Arabic -> Arabic */ - {"af", {HB_TAG('A','F','K',' ')}}, /* Afrikaans */ - {"afb", {HB_TAG('A','R','A',' ')}}, /* Gulf Arabic -> Arabic */ - {"ahg", {HB_TAG('A','G','W',' ')}}, /* Qimant -> Agaw */ - {"aht", {HB_TAG('A','T','H',' ')}}, /* Ahtena -> Athapaskan */ - {"aii", {HB_TAG('S','W','A',' '), /* Assyrian Neo-Aramaic -> Swadaya Aramaic */ - HB_TAG('S','Y','R',' ')}}, /* Assyrian Neo-Aramaic -> Syriac */ - {"aio", {HB_TAG('A','I','O',' ')}}, /* Aiton */ - {"aiw", {HB_TAG('A','R','I',' ')}}, /* Aari */ - {"ajp", {HB_TAG('A','R','A',' ')}}, /* South Levantine Arabic -> Arabic */ - {"ak", {HB_TAG('A','K','A',' '), /* Akan [macrolanguage] */ - HB_TAG('T','W','I',' ')}}, /* Akan [macrolanguage] -> Twi */ - {"aln", {HB_TAG('S','Q','I',' ')}}, /* Gheg Albanian -> Albanian */ - {"als", {HB_TAG('S','Q','I',' ')}}, /* Tosk Albanian -> Albanian */ - {"alt", {HB_TAG('A','L','T',' ')}}, /* Southern Altai -> Altai */ - {"am", {HB_TAG('A','M','H',' ')}}, /* Amharic */ - {"amf", {HB_TAG('H','B','N',' ')}}, /* Hamer-Banna -> Hammer-Banna */ - {"amw", {HB_TAG('S','Y','R',' ')}}, /* Western Neo-Aramaic -> Syriac */ - {"an", {HB_TAG('A','R','G',' ')}}, /* Aragonese */ - {"ang", {HB_TAG('A','N','G',' ')}}, /* Old English (ca. 450-1100) -> Anglo-Saxon */ - {"apc", {HB_TAG('A','R','A',' ')}}, /* North Levantine Arabic -> Arabic */ - {"apd", {HB_TAG('A','R','A',' ')}}, /* Sudanese Arabic -> Arabic */ - {"apj", {HB_TAG('A','T','H',' ')}}, /* Jicarilla Apache -> Athapaskan */ - {"apk", {HB_TAG('A','T','H',' ')}}, /* Kiowa Apache -> Athapaskan */ - {"apl", {HB_TAG('A','T','H',' ')}}, /* Lipan Apache -> Athapaskan */ - {"apm", {HB_TAG('A','T','H',' ')}}, /* Mescalero-Chiricahua Apache -> Athapaskan */ - {"apw", {HB_TAG('A','T','H',' ')}}, /* Western Apache -> Athapaskan */ - {"ar", {HB_TAG('A','R','A',' ')}}, /* Arabic [macrolanguage] */ - {"arb", {HB_TAG('A','R','A',' ')}}, /* Standard Arabic -> Arabic */ - {"arn", {HB_TAG('M','A','P',' ')}}, /* Mapudungun */ - {"arq", {HB_TAG('A','R','A',' ')}}, /* Algerian Arabic -> Arabic */ - {"ars", {HB_TAG('A','R','A',' ')}}, /* Najdi Arabic -> Arabic */ - {"ary", {HB_TAG('M','O','R',' ')}}, /* Moroccan Arabic -> Moroccan */ - {"arz", {HB_TAG('A','R','A',' ')}}, /* Egyptian Arabic -> Arabic */ - {"as", {HB_TAG('A','S','M',' ')}}, /* Assamese */ - {"ast", {HB_TAG('A','S','T',' ')}}, /* Asturian */ - {"ath", {HB_TAG('A','T','H',' ')}}, /* Athapascan [family] -> Athapaskan */ - {"atj", {HB_TAG('R','C','R',' ')}}, /* Atikamekw -> R-Cree */ - {"atv", {HB_TAG('A','L','T',' ')}}, /* Northern Altai -> Altai */ - {"auz", {HB_TAG('A','R','A',' ')}}, /* Uzbeki Arabic -> Arabic */ - {"av", {HB_TAG('A','V','R',' ')}}, /* Avaric -> Avar */ - {"avl", {HB_TAG('A','R','A',' ')}}, /* Eastern Egyptian Bedawi Arabic -> Arabic */ - {"awa", {HB_TAG('A','W','A',' ')}}, /* Awadhi */ - {"ay", {HB_TAG('A','Y','M',' ')}}, /* Aymara [macrolanguage] */ - {"ayc", {HB_TAG('A','Y','M',' ')}}, /* Southern Aymara -> Aymara */ - {"ayh", {HB_TAG('A','R','A',' ')}}, /* Hadrami Arabic -> Arabic */ - {"ayl", {HB_TAG('A','R','A',' ')}}, /* Libyan Arabic -> Arabic */ - {"ayn", {HB_TAG('A','R','A',' ')}}, /* Sanaani Arabic -> Arabic */ - {"ayp", {HB_TAG('A','R','A',' ')}}, /* North Mesopotamian Arabic -> Arabic */ - {"ayr", {HB_TAG('A','Y','M',' ')}}, /* Central Aymara -> Aymara */ - {"az", {HB_TAG('A','Z','E',' ')}}, /* Azerbaijani [macrolanguage] */ - {"azb", {HB_TAG('A','Z','B',' ')}}, /* South Azerbaijani -> Torki */ - {"azj", {HB_TAG('A','Z','E',' ')}}, /* North Azerbaijani -> Azerbaijani */ - {"ba", {HB_TAG('B','S','H',' ')}}, /* Bashkir */ - {"bad", {HB_TAG('B','A','D','0')}}, /* Banda [family] */ - {"bai", {HB_TAG('B','M','L',' ')}}, /* Bamileke [family] */ - {"bal", {HB_TAG('B','L','I',' ')}}, /* Baluchi [macrolanguage] */ - {"ban", {HB_TAG('B','A','N',' ')}}, /* Balinese */ - {"bar", {HB_TAG('B','A','R',' ')}}, /* Bavarian */ - {"bbc", {HB_TAG('B','B','C',' ')}}, /* Batak Toba */ - {"bbz", {HB_TAG('A','R','A',' ')}}, /* Babalia Creole Arabic -> Arabic */ - {"bcc", {HB_TAG('B','L','I',' ')}}, /* Southern Balochi -> Baluchi */ - {"bci", {HB_TAG('B','A','U',' ')}}, /* Baoulé -> Baulé */ - {"bcl", {HB_TAG('B','I','K',' ')}}, /* Central Bikol -> Bikol */ - {"bcq", {HB_TAG('B','C','H',' ')}}, /* Bench */ - {"bcr", {HB_TAG('A','T','H',' ')}}, /* Babine -> Athapaskan */ - {"bdy", {HB_TAG('B','D','Y',' ')}}, /* Bandjalang */ - {"be", {HB_TAG('B','E','L',' ')}}, /* Belarusian -> Belarussian */ - {"bea", {HB_TAG('A','T','H',' ')}}, /* Beaver -> Athapaskan */ - {"beb", {HB_TAG('B','T','I',' ')}}, /* Bebele -> Beti */ - {"bem", {HB_TAG('B','E','M',' ')}}, /* Bemba (Zambia) */ - {"ber", {HB_TAG('B','B','R',' ')}}, /* Berber [family] */ - {"bfq", {HB_TAG('B','A','D',' ')}}, /* Badaga */ - {"bft", {HB_TAG('B','L','T',' ')}}, /* Balti */ - {"bfu", {HB_TAG('L','A','H',' ')}}, /* Gahri -> Lahuli */ - {"bfy", {HB_TAG('B','A','G',' ')}}, /* Bagheli -> Baghelkhandi */ - {"bg", {HB_TAG('B','G','R',' ')}}, /* Bulgarian */ - {"bgc", {HB_TAG('B','G','C',' ')}}, /* Haryanvi */ - {"bgn", {HB_TAG('B','L','I',' ')}}, /* Western Balochi -> Baluchi */ - {"bgp", {HB_TAG('B','L','I',' ')}}, /* Eastern Balochi -> Baluchi */ - {"bgq", {HB_TAG('B','G','Q',' ')}}, /* Bagri */ - {"bgr", {HB_TAG('Q','I','N',' ')}}, /* Bawm Chin -> Chin */ - {"bhb", {HB_TAG('B','H','I',' ')}}, /* Bhili */ - {"bhi", {HB_TAG('B','H','I',' ')}}, /* Bhilali -> Bhili */ - {"bhk", {HB_TAG('B','I','K',' ')}}, /* Albay Bicolano (retired code) -> Bikol */ - {"bho", {HB_TAG('B','H','O',' ')}}, /* Bhojpuri */ - {"bhr", {HB_TAG('M','L','G',' ')}}, /* Bara Malagasy -> Malagasy */ - {"bi", {HB_TAG('B','I','S',' ')}}, /* Bislama */ - {"bik", {HB_TAG('B','I','K',' ')}}, /* Bikol [macrolanguage] */ - {"bin", {HB_TAG('E','D','O',' ')}}, /* Edo */ - {"bjj", {HB_TAG('B','J','J',' ')}}, /* Kanauji */ - {"bjn", {HB_TAG('M','L','Y',' ')}}, /* Banjar -> Malay */ - {"bjq", {HB_TAG('M','L','G',' ')}}, /* Southern Betsimisaraka Malagasy (retired code) -> Malagasy */ - {"bjt", {HB_TAG('B','L','N',' ')}}, /* Balanta-Ganja -> Balante */ - {"bla", {HB_TAG('B','K','F',' ')}}, /* Siksika -> Blackfoot */ - {"ble", {HB_TAG('B','L','N',' ')}}, /* Balanta-Kentohe -> Balante */ - {"blk", {HB_TAG('B','L','K',' ')}}, /* Pa’o Karen */ - {"bln", {HB_TAG('B','I','K',' ')}}, /* Southern Catanduanes Bikol -> Bikol */ - {"bm", {HB_TAG('B','M','B',' ')}}, /* Bambara (Bamanankan) */ - {"bmm", {HB_TAG('M','L','G',' ')}}, /* Northern Betsimisaraka Malagasy -> Malagasy */ - {"bn", {HB_TAG('B','E','N',' ')}}, /* Bengali */ - {"bo", {HB_TAG('T','I','B',' ')}}, /* Tibetan */ - {"bpy", {HB_TAG('B','P','Y',' ')}}, /* Bishnupriya -> Bishnupriya Manipuri */ - {"bqi", {HB_TAG('L','R','C',' ')}}, /* Bakhtiari -> Luri */ - {"br", {HB_TAG('B','R','E',' ')}}, /* Breton */ - {"bra", {HB_TAG('B','R','I',' ')}}, /* Braj -> Braj Bhasha */ - {"brh", {HB_TAG('B','R','H',' ')}}, /* Brahui */ - {"brx", {HB_TAG('B','R','X',' ')}}, /* Bodo (India) */ - {"bs", {HB_TAG('B','O','S',' ')}}, /* Bosnian */ - {"bsk", {HB_TAG('B','S','K',' ')}}, /* Burushaski */ - {"btb", {HB_TAG('B','T','I',' ')}}, /* Beti (Cameroon) (retired code) */ - {"btj", {HB_TAG('M','L','Y',' ')}}, /* Bacanese Malay -> Malay */ - {"bto", {HB_TAG('B','I','K',' ')}}, /* Rinconada Bikol -> Bikol */ - {"bts", {HB_TAG('B','T','S',' ')}}, /* Batak Simalungun */ - {"bug", {HB_TAG('B','U','G',' ')}}, /* Buginese -> Bugis */ - {"bum", {HB_TAG('B','T','I',' ')}}, /* Bulu (Cameroon) -> Beti */ - {"bve", {HB_TAG('M','L','Y',' ')}}, /* Berau Malay -> Malay */ - {"bvu", {HB_TAG('M','L','Y',' ')}}, /* Bukit Malay -> Malay */ - {"bxk", {HB_TAG('L','U','H',' ')}}, /* Bukusu -> Luyia */ - {"bxp", {HB_TAG('B','T','I',' ')}}, /* Bebil -> Beti */ - {"bxr", {HB_TAG('R','B','U',' ')}}, /* Russia Buriat -> Russian Buriat */ - {"byn", {HB_TAG('B','I','L',' ')}}, /* Bilin -> Bilen */ - {"byv", {HB_TAG('B','Y','V',' ')}}, /* Medumba */ - {"bzc", {HB_TAG('M','L','G',' ')}}, /* Southern Betsimisaraka Malagasy -> Malagasy */ - {"ca", {HB_TAG('C','A','T',' ')}}, /* Catalan */ - {"caf", {HB_TAG('C','R','R',' '), /* Southern Carrier -> Carrier */ - HB_TAG('A','T','H',' ')}}, /* Southern Carrier -> Athapaskan */ - {"cak", {HB_TAG('C','A','K',' ')}}, /* Kaqchikel */ - {"cbk", {HB_TAG('C','B','K',' ')}}, /* Chavacano -> Zamboanga Chavacano */ - {"cbl", {HB_TAG('Q','I','N',' ')}}, /* Bualkhaw Chin -> Chin */ - {"cco", {HB_TAG('C','C','H','N')}}, /* Comaltepec Chinantec -> Chinantec */ - {"ccq", {HB_TAG('A','R','K',' ')}}, /* Chaungtha (retired code) -> Rakhine */ - {"cdo", {HB_TAG('Z','H','S',' ')}}, /* Min Dong Chinese -> Chinese Simplified */ - {"ce", {HB_TAG('C','H','E',' ')}}, /* Chechen */ - {"ceb", {HB_TAG('C','E','B',' ')}}, /* Cebuano */ - {"cfm", {HB_TAG('H','A','L',' ')}}, /* Halam (Falam Chin) */ - {"cgg", {HB_TAG('C','G','G',' ')}}, /* Chiga */ - {"ch", {HB_TAG('C','H','A',' ')}}, /* Chamorro */ - {"chj", {HB_TAG('C','C','H','N')}}, /* Ojitlán Chinantec -> Chinantec */ - {"chk", {HB_TAG('C','H','K','0')}}, /* Chuukese */ - {"cho", {HB_TAG('C','H','O',' ')}}, /* Choctaw */ - {"chp", {HB_TAG('C','H','P',' '), /* Chipewyan */ - HB_TAG('S','A','Y',' '), /* Chipewyan -> Sayisi */ - HB_TAG('A','T','H',' ')}}, /* Chipewyan -> Athapaskan */ - {"chq", {HB_TAG('C','C','H','N')}}, /* Quiotepec Chinantec -> Chinantec */ - {"chr", {HB_TAG('C','H','R',' ')}}, /* Cherokee */ - {"chy", {HB_TAG('C','H','Y',' ')}}, /* Cheyenne */ - {"chz", {HB_TAG('C','C','H','N')}}, /* Ozumacín Chinantec -> Chinantec */ - {"ciw", {HB_TAG('O','J','B',' ')}}, /* Chippewa -> Ojibway */ - {"cja", {HB_TAG('C','J','A',' ')}}, /* Western Cham */ - {"cjm", {HB_TAG('C','J','M',' ')}}, /* Eastern Cham */ - {"cjy", {HB_TAG('Z','H','S',' ')}}, /* Jinyu Chinese -> Chinese Simplified */ - {"cka", {HB_TAG('Q','I','N',' ')}}, /* Khumi Awa Chin (retired code) -> Chin */ - {"ckb", {HB_TAG('K','U','R',' ')}}, /* Central Kurdish -> Kurdish */ - {"ckt", {HB_TAG('C','H','K',' ')}}, /* Chukot -> Chukchi */ - {"clc", {HB_TAG('A','T','H',' ')}}, /* Chilcotin -> Athapaskan */ - {"cld", {HB_TAG('S','Y','R',' ')}}, /* Chaldean Neo-Aramaic -> Syriac */ - {"cle", {HB_TAG('C','C','H','N')}}, /* Lealao Chinantec -> Chinantec */ - {"cmn", {HB_TAG('Z','H','S',' ')}}, /* Mandarin Chinese -> Chinese Simplified */ - {"cmr", {HB_TAG('Q','I','N',' ')}}, /* Mro-Khimi Chin -> Chin */ - {"cnb", {HB_TAG('Q','I','N',' ')}}, /* Chinbon Chin -> Chin */ - {"cnh", {HB_TAG('Q','I','N',' ')}}, /* Hakha Chin -> Chin */ - {"cnk", {HB_TAG('Q','I','N',' ')}}, /* Khumi Chin -> Chin */ - {"cnl", {HB_TAG('C','C','H','N')}}, /* Lalana Chinantec -> Chinantec */ - {"cnt", {HB_TAG('C','C','H','N')}}, /* Tepetotutla Chinantec -> Chinantec */ - {"cnw", {HB_TAG('Q','I','N',' ')}}, /* Ngawn Chin -> Chin */ - {"co", {HB_TAG('C','O','S',' ')}}, /* Corsican */ - {"coa", {HB_TAG('M','L','Y',' ')}}, /* Cocos Islands Malay -> Malay */ - {"cop", {HB_TAG('C','O','P',' ')}}, /* Coptic */ - {"coq", {HB_TAG('A','T','H',' ')}}, /* Coquille -> Athapaskan */ - {"cpa", {HB_TAG('C','C','H','N')}}, /* Palantla Chinantec -> Chinantec */ - {"cpe", {HB_TAG('C','P','P',' ')}}, /* English-based creoles and pidgins [family] -> Creoles */ - {"cpf", {HB_TAG('C','P','P',' ')}}, /* French-based creoles and pidgins [family] -> Creoles */ - {"cpp", {HB_TAG('C','P','P',' ')}}, /* Portuguese-based creoles and pidgins [family] -> Creoles */ - {"cpx", {HB_TAG('Z','H','S',' ')}}, /* Pu-Xian Chinese -> Chinese Simplified */ - {"cqd", {HB_TAG('H','M','N',' ')}}, /* Chuanqiandian Cluster Miao -> Hmong */ - {"cqu", {HB_TAG('Q','U','H',' ')}}, /* Chilean Quechua (retired code) -> Quechua (Bolivia) */ - {"cr", {HB_TAG('C','R','E',' '), /* Cree [macrolanguage] */ - HB_TAG('Y','C','R',' ')}}, /* Cree [macrolanguage] -> Y-Cree */ - {"crh", {HB_TAG('C','R','T',' ')}}, /* Crimean Tatar */ - {"crj", {HB_TAG('E','C','R',' ')}}, /* Southern East Cree -> Eastern Cree */ - {"crk", {HB_TAG('W','C','R',' ')}}, /* Plains Cree -> West-Cree */ - {"crl", {HB_TAG('E','C','R',' ')}}, /* Northern East Cree -> Eastern Cree */ - {"crm", {HB_TAG('M','C','R',' '), /* Moose Cree */ - HB_TAG('L','C','R',' ')}}, /* Moose Cree -> L-Cree */ - {"crp", {HB_TAG('C','P','P',' ')}}, /* Creoles and pidgins [family] -> Creoles */ - {"crx", {HB_TAG('C','R','R',' '), /* Carrier */ - HB_TAG('A','T','H',' ')}}, /* Carrier -> Athapaskan */ - {"cs", {HB_TAG('C','S','Y',' ')}}, /* Czech */ - {"csa", {HB_TAG('C','C','H','N')}}, /* Chiltepec Chinantec -> Chinantec */ - {"csb", {HB_TAG('C','S','B',' ')}}, /* Kashubian */ - {"csh", {HB_TAG('Q','I','N',' ')}}, /* Asho Chin -> Chin */ - {"cso", {HB_TAG('C','C','H','N')}}, /* Sochiapam Chinantec -> Chinantec */ - {"csw", {HB_TAG('N','C','R',' '), /* Swampy Cree -> N-Cree */ - HB_TAG('N','H','C',' ')}}, /* Swampy Cree -> Norway House Cree */ - {"csy", {HB_TAG('Q','I','N',' ')}}, /* Siyin Chin -> Chin */ - {"ctc", {HB_TAG('A','T','H',' ')}}, /* Chetco -> Athapaskan */ - {"ctd", {HB_TAG('Q','I','N',' ')}}, /* Tedim Chin -> Chin */ - {"cte", {HB_TAG('C','C','H','N')}}, /* Tepinapa Chinantec -> Chinantec */ - {"ctg", {HB_TAG('C','T','G',' ')}}, /* Chittagonian */ - {"ctl", {HB_TAG('C','C','H','N')}}, /* Tlacoatzintepec Chinantec -> Chinantec */ - {"cts", {HB_TAG('B','I','K',' ')}}, /* Northern Catanduanes Bikol -> Bikol */ - {"cu", {HB_TAG('C','S','L',' ')}}, /* Church Slavonic */ - {"cuc", {HB_TAG('C','C','H','N')}}, /* Usila Chinantec -> Chinantec */ - {"cuk", {HB_TAG('C','U','K',' ')}}, /* San Blas Kuna */ - {"cv", {HB_TAG('C','H','U',' ')}}, /* Chuvash */ - {"cvn", {HB_TAG('C','C','H','N')}}, /* Valle Nacional Chinantec -> Chinantec */ - {"cwd", {HB_TAG('D','C','R',' '), /* Woods Cree */ - HB_TAG('T','C','R',' ')}}, /* Woods Cree -> TH-Cree */ - {"cy", {HB_TAG('W','E','L',' ')}}, /* Welsh */ - {"czh", {HB_TAG('Z','H','S',' ')}}, /* Huizhou Chinese -> Chinese Simplified */ - {"czo", {HB_TAG('Z','H','S',' ')}}, /* Min Zhong Chinese -> Chinese Simplified */ - {"czt", {HB_TAG('Q','I','N',' ')}}, /* Zotung Chin -> Chin */ - {"da", {HB_TAG('D','A','N',' ')}}, /* Danish */ - {"dao", {HB_TAG('Q','I','N',' ')}}, /* Daai Chin -> Chin */ - {"dap", {HB_TAG('N','I','S',' ')}}, /* Nisi (India) (retired code) */ - {"dar", {HB_TAG('D','A','R',' ')}}, /* Dargwa */ - {"dax", {HB_TAG('D','A','X',' ')}}, /* Dayi */ - {"de", {HB_TAG('D','E','U',' ')}}, /* German */ - {"den", {HB_TAG('S','L','A',' '), /* Slave (Athapascan) [macrolanguage] -> Slavey */ - HB_TAG('A','T','H',' ')}}, /* Slave (Athapascan) [macrolanguage] -> Athapaskan */ - {"dgo", {HB_TAG('D','G','O',' ')}}, /* Dogri */ - {"dgr", {HB_TAG('A','T','H',' ')}}, /* Dogrib -> Athapaskan */ - {"dhd", {HB_TAG('M','A','W',' ')}}, /* Dhundari -> Marwari */ - {"dhg", {HB_TAG('D','H','G',' ')}}, /* Dhangu */ - {"dib", {HB_TAG('D','N','K',' ')}}, /* South Central Dinka -> Dinka */ - {"dik", {HB_TAG('D','N','K',' ')}}, /* Southwestern Dinka -> Dinka */ - {"din", {HB_TAG('D','N','K',' ')}}, /* Dinka [macrolanguage] */ - {"dip", {HB_TAG('D','N','K',' ')}}, /* Northeastern Dinka -> Dinka */ - {"diq", {HB_TAG('D','I','Q',' ')}}, /* Dimli */ - {"diw", {HB_TAG('D','N','K',' ')}}, /* Northwestern Dinka -> Dinka */ - {"dje", {HB_TAG('D','J','R',' ')}}, /* Zarma */ - {"djr", {HB_TAG('D','J','R','0')}}, /* Djambarrpuyngu */ - {"dks", {HB_TAG('D','N','K',' ')}}, /* Southeastern Dinka -> Dinka */ - {"dng", {HB_TAG('D','U','N',' ')}}, /* Dungan */ - {"dnj", {HB_TAG('D','N','J',' ')}}, /* Dan */ - {"doi", {HB_TAG('D','G','R',' ')}}, /* Dogri [macrolanguage] */ - {"drh", {HB_TAG('M','N','G',' ')}}, /* Darkhat (retired code) -> Mongolian */ - {"drw", {HB_TAG('D','R','I',' ')}}, /* Darwazi (retired code) -> Dari */ - {"dsb", {HB_TAG('L','S','B',' ')}}, /* Lower Sorbian */ - {"dty", {HB_TAG('N','E','P',' ')}}, /* Dotyali -> Nepali */ - {"duj", {HB_TAG('D','U','J',' ')}}, /* Dhuwal (retired code) */ - {"dup", {HB_TAG('M','L','Y',' ')}}, /* Duano -> Malay */ - {"dv", {HB_TAG('D','I','V',' '), /* Divehi (Dhivehi, Maldivian) */ - HB_TAG('D','H','V',' ')}}, /* Divehi (Dhivehi, Maldivian) (deprecated) */ - {"dwu", {HB_TAG('D','U','J',' ')}}, /* Dhuwal */ - {"dwy", {HB_TAG('D','U','J',' ')}}, /* Dhuwaya -> Dhuwal */ - {"dyu", {HB_TAG('J','U','L',' ')}}, /* Dyula -> Jula */ - {"dz", {HB_TAG('D','Z','N',' ')}}, /* Dzongkha */ - {"ee", {HB_TAG('E','W','E',' ')}}, /* Ewe */ - {"efi", {HB_TAG('E','F','I',' ')}}, /* Efik */ - {"ekk", {HB_TAG('E','T','I',' ')}}, /* Standard Estonian -> Estonian */ - {"el", {HB_TAG('E','L','L',' ')}}, /* Modern Greek (1453-) -> Greek */ - {"emk", {HB_TAG('E','M','K',' '), /* Eastern Maninkakan */ - HB_TAG('M','N','K',' ')}}, /* Eastern Maninkakan -> Maninka */ - {"en", {HB_TAG('E','N','G',' ')}}, /* English */ - {"enb", {HB_TAG('K','A','L',' ')}}, /* Markweeta -> Kalenjin */ - {"enf", {HB_TAG('F','N','E',' ')}}, /* Forest Enets -> Forest Nenets */ - {"enh", {HB_TAG('T','N','E',' ')}}, /* Tundra Enets -> Tundra Nenets */ - {"eo", {HB_TAG('N','T','O',' ')}}, /* Esperanto */ - {"es", {HB_TAG('E','S','P',' ')}}, /* Spanish */ - {"esg", {HB_TAG('G','O','N',' ')}}, /* Aheri Gondi -> Gondi */ - {"esi", {HB_TAG('I','P','K',' ')}}, /* North Alaskan Inupiatun -> Inupiat */ - {"esk", {HB_TAG('I','P','K',' ')}}, /* Northwest Alaska Inupiatun -> Inupiat */ - {"esu", {HB_TAG('E','S','U',' ')}}, /* Central Yupik */ - {"et", {HB_TAG('E','T','I',' ')}}, /* Estonian [macrolanguage] */ - {"eto", {HB_TAG('B','T','I',' ')}}, /* Eton (Cameroon) -> Beti */ - {"eu", {HB_TAG('E','U','Q',' ')}}, /* Basque */ - {"eve", {HB_TAG('E','V','N',' ')}}, /* Even */ - {"evn", {HB_TAG('E','V','K',' ')}}, /* Evenki */ - {"ewo", {HB_TAG('B','T','I',' ')}}, /* Ewondo -> Beti */ - {"eyo", {HB_TAG('K','A','L',' ')}}, /* Keiyo -> Kalenjin */ - {"fa", {HB_TAG('F','A','R',' ')}}, /* Persian [macrolanguage] */ - {"fan", {HB_TAG('F','A','N','0')}}, /* Fang (Equatorial Guinea) */ - {"fat", {HB_TAG('F','A','T',' ')}}, /* Fanti */ - {"fbl", {HB_TAG('B','I','K',' ')}}, /* West Albay Bikol -> Bikol */ - {"ff", {HB_TAG('F','U','L',' ')}}, /* Fulah [macrolanguage] */ - {"ffm", {HB_TAG('F','U','L',' ')}}, /* Maasina Fulfulde -> Fulah */ - {"fi", {HB_TAG('F','I','N',' ')}}, /* Finnish */ - {"fil", {HB_TAG('P','I','L',' ')}}, /* Filipino */ - {"fj", {HB_TAG('F','J','I',' ')}}, /* Fijian */ - {"flm", {HB_TAG('H','A','L',' '), /* Halam (Falam Chin) (retired code) */ - HB_TAG('Q','I','N',' ')}}, /* Falam Chin (retired code) -> Chin */ - {"fmp", {HB_TAG('F','M','P',' ')}}, /* Fe’fe’ */ - {"fo", {HB_TAG('F','O','S',' ')}}, /* Faroese */ - {"fon", {HB_TAG('F','O','N',' ')}}, /* Fon */ - {"fr", {HB_TAG('F','R','A',' ')}}, /* French */ - {"frc", {HB_TAG('F','R','C',' ')}}, /* Cajun French */ - {"frp", {HB_TAG('F','R','P',' ')}}, /* Arpitan */ - {"fub", {HB_TAG('F','U','L',' ')}}, /* Adamawa Fulfulde -> Fulah */ - {"fuc", {HB_TAG('F','U','L',' ')}}, /* Pulaar -> Fulah */ - {"fue", {HB_TAG('F','U','L',' ')}}, /* Borgu Fulfulde -> Fulah */ - {"fuf", {HB_TAG('F','T','A',' ')}}, /* Pular -> Futa */ - {"fuh", {HB_TAG('F','U','L',' ')}}, /* Western Niger Fulfulde -> Fulah */ - {"fui", {HB_TAG('F','U','L',' ')}}, /* Bagirmi Fulfulde -> Fulah */ - {"fuq", {HB_TAG('F','U','L',' ')}}, /* Central-Eastern Niger Fulfulde -> Fulah */ - {"fur", {HB_TAG('F','R','L',' ')}}, /* Friulian */ - {"fuv", {HB_TAG('F','U','V',' ')}}, /* Nigerian Fulfulde */ - {"fy", {HB_TAG('F','R','I',' ')}}, /* Western Frisian -> Frisian */ - {"ga", {HB_TAG('I','R','I',' ')}}, /* Irish */ - {"gaa", {HB_TAG('G','A','D',' ')}}, /* Ga */ - {"gag", {HB_TAG('G','A','G',' ')}}, /* Gagauz */ - {"gan", {HB_TAG('Z','H','S',' ')}}, /* Gan Chinese -> Chinese Simplified */ - {"gax", {HB_TAG('O','R','O',' ')}}, /* Borana-Arsi-Guji Oromo -> Oromo */ - {"gaz", {HB_TAG('O','R','O',' ')}}, /* West Central Oromo -> Oromo */ - {"gbm", {HB_TAG('G','A','W',' ')}}, /* Garhwali */ - {"gce", {HB_TAG('A','T','H',' ')}}, /* Galice -> Athapaskan */ - {"gd", {HB_TAG('G','A','E',' ')}}, /* Scottish Gaelic (Gaelic) */ - {"gda", {HB_TAG('R','A','J',' ')}}, /* Gade Lohar -> Rajasthani */ - {"gez", {HB_TAG('G','E','Z',' ')}}, /* Geez */ - {"ggo", {HB_TAG('G','O','N',' ')}}, /* Southern Gondi (retired code) -> Gondi */ - {"gih", {HB_TAG('G','I','H',' ')}}, /* Githabul */ - {"gil", {HB_TAG('G','I','L','0')}}, /* Kiribati (Gilbertese) */ - {"gju", {HB_TAG('R','A','J',' ')}}, /* Gujari -> Rajasthani */ - {"gkp", {HB_TAG('G','K','P',' ')}}, /* Guinea Kpelle -> Kpelle (Guinea) */ - {"gl", {HB_TAG('G','A','L',' ')}}, /* Galician */ - {"gld", {HB_TAG('N','A','N',' ')}}, /* Nanai */ - {"glk", {HB_TAG('G','L','K',' ')}}, /* Gilaki */ - {"gn", {HB_TAG('G','U','A',' ')}}, /* Guarani [macrolanguage] */ - {"gnn", {HB_TAG('G','N','N',' ')}}, /* Gumatj */ - {"gno", {HB_TAG('G','O','N',' ')}}, /* Northern Gondi -> Gondi */ - {"gnw", {HB_TAG('G','U','A',' ')}}, /* Western Bolivian Guaraní -> Guarani */ - {"gog", {HB_TAG('G','O','G',' ')}}, /* Gogo */ - {"gom", {HB_TAG('K','O','K',' ')}}, /* Goan Konkani -> Konkani */ - {"gon", {HB_TAG('G','O','N',' ')}}, /* Gondi [macrolanguage] */ - {"grt", {HB_TAG('G','R','O',' ')}}, /* Garo */ - {"gru", {HB_TAG('S','O','G',' ')}}, /* Kistane -> Sodo Gurage */ - {"gsw", {HB_TAG('A','L','S',' ')}}, /* Alsatian */ - {"gu", {HB_TAG('G','U','J',' ')}}, /* Gujarati */ - {"guc", {HB_TAG('G','U','C',' ')}}, /* Wayuu */ - {"guf", {HB_TAG('G','U','F',' ')}}, /* Gupapuyngu */ - {"gug", {HB_TAG('G','U','A',' ')}}, /* Paraguayan Guaraní -> Guarani */ - {"gui", {HB_TAG('G','U','A',' ')}}, /* Eastern Bolivian Guaraní -> Guarani */ - {"guk", {HB_TAG('G','M','Z',' '), /* Gumuz */ - HB_TAG('G','U','K',' ')}}, /* Gumuz (SIL fonts) */ - {"gun", {HB_TAG('G','U','A',' ')}}, /* Mbyá Guaraní -> Guarani */ - {"guz", {HB_TAG('G','U','Z',' ')}}, /* Gusii */ - {"gv", {HB_TAG('M','N','X',' ')}}, /* Manx */ - {"gwi", {HB_TAG('A','T','H',' ')}}, /* Gwichʼin -> Athapaskan */ - {"ha", {HB_TAG('H','A','U',' ')}}, /* Hausa */ - {"haa", {HB_TAG('A','T','H',' ')}}, /* Han -> Athapaskan */ - {"hae", {HB_TAG('O','R','O',' ')}}, /* Eastern Oromo -> Oromo */ - {"hak", {HB_TAG('Z','H','S',' ')}}, /* Hakka Chinese -> Chinese Simplified */ - {"har", {HB_TAG('H','R','I',' ')}}, /* Harari */ - {"haw", {HB_TAG('H','A','W',' ')}}, /* Hawaiian */ - {"hay", {HB_TAG('H','A','Y',' ')}}, /* Haya */ - {"haz", {HB_TAG('H','A','Z',' ')}}, /* Hazaragi */ - {"he", {HB_TAG('I','W','R',' ')}}, /* Hebrew */ - {"hea", {HB_TAG('H','M','N',' ')}}, /* Northern Qiandong Miao -> Hmong */ - {"hi", {HB_TAG('H','I','N',' ')}}, /* Hindi */ - {"hil", {HB_TAG('H','I','L',' ')}}, /* Hiligaynon */ - {"hji", {HB_TAG('M','L','Y',' ')}}, /* Haji -> Malay */ - {"hlt", {HB_TAG('Q','I','N',' ')}}, /* Matu Chin -> Chin */ - {"hma", {HB_TAG('H','M','N',' ')}}, /* Southern Mashan Hmong -> Hmong */ - {"hmc", {HB_TAG('H','M','N',' ')}}, /* Central Huishui Hmong -> Hmong */ - {"hmd", {HB_TAG('H','M','N',' ')}}, /* Large Flowery Miao -> Hmong */ - {"hme", {HB_TAG('H','M','N',' ')}}, /* Eastern Huishui Hmong -> Hmong */ - {"hmg", {HB_TAG('H','M','N',' ')}}, /* Southwestern Guiyang Hmong -> Hmong */ - {"hmh", {HB_TAG('H','M','N',' ')}}, /* Southwestern Huishui Hmong -> Hmong */ - {"hmi", {HB_TAG('H','M','N',' ')}}, /* Northern Huishui Hmong -> Hmong */ - {"hmj", {HB_TAG('H','M','N',' ')}}, /* Ge -> Hmong */ - {"hml", {HB_TAG('H','M','N',' ')}}, /* Luopohe Hmong -> Hmong */ - {"hmm", {HB_TAG('H','M','N',' ')}}, /* Central Mashan Hmong -> Hmong */ - {"hmn", {HB_TAG('H','M','N',' ')}}, /* Hmong [macrolanguage] */ - {"hmp", {HB_TAG('H','M','N',' ')}}, /* Northern Mashan Hmong -> Hmong */ - {"hmq", {HB_TAG('H','M','N',' ')}}, /* Eastern Qiandong Miao -> Hmong */ - {"hms", {HB_TAG('H','M','N',' ')}}, /* Southern Qiandong Miao -> Hmong */ - {"hmw", {HB_TAG('H','M','N',' ')}}, /* Western Mashan Hmong -> Hmong */ - {"hmy", {HB_TAG('H','M','N',' ')}}, /* Southern Guiyang Hmong -> Hmong */ - {"hmz", {HB_TAG('H','M','N',' ')}}, /* Hmong Shua -> Hmong */ - {"hnd", {HB_TAG('H','N','D',' ')}}, /* Southern Hindko -> Hindko */ - {"hne", {HB_TAG('C','H','H',' ')}}, /* Chhattisgarhi -> Chattisgarhi */ - {"hnj", {HB_TAG('H','M','N',' ')}}, /* Hmong Njua -> Hmong */ - {"hno", {HB_TAG('H','N','D',' ')}}, /* Northern Hindko -> Hindko */ - {"ho", {HB_TAG('H','M','O',' ')}}, /* Hiri Motu */ - {"hoc", {HB_TAG('H','O',' ',' ')}}, /* Ho */ - {"hoi", {HB_TAG('A','T','H',' ')}}, /* Holikachuk -> Athapaskan */ - {"hoj", {HB_TAG('H','A','R',' ')}}, /* Hadothi -> Harauti */ - {"hr", {HB_TAG('H','R','V',' ')}}, /* Croatian */ - {"hrm", {HB_TAG('H','M','N',' ')}}, /* Horned Miao -> Hmong */ - {"hsb", {HB_TAG('U','S','B',' ')}}, /* Upper Sorbian */ - {"hsn", {HB_TAG('Z','H','S',' ')}}, /* Xiang Chinese -> Chinese Simplified */ - {"ht", {HB_TAG('H','A','I',' ')}}, /* Haitian (Haitian Creole) */ - {"hu", {HB_TAG('H','U','N',' ')}}, /* Hungarian */ - {"huj", {HB_TAG('H','M','N',' ')}}, /* Northern Guiyang Hmong -> Hmong */ - {"hup", {HB_TAG('A','T','H',' ')}}, /* Hupa -> Athapaskan */ - {"hy", {HB_TAG('H','Y','E','0'), /* Armenian -> Armenian East */ - HB_TAG('H','Y','E',' ')}}, /* Armenian */ - {"hyw", {HB_TAG('H','Y','E',' ')}}, /* Western Armenian -> Armenian */ - {"hz", {HB_TAG('H','E','R',' ')}}, /* Herero */ - {"ia", {HB_TAG('I','N','A',' ')}}, /* Interlingua (International Auxiliary Language Association) */ - {"iba", {HB_TAG('I','B','A',' ')}}, /* Iban */ - {"ibb", {HB_TAG('I','B','B',' ')}}, /* Ibibio */ - {"id", {HB_TAG('I','N','D',' ')}}, /* Indonesian */ - {"ida", {HB_TAG('L','U','H',' ')}}, /* Idakho-Isukha-Tiriki -> Luyia */ - {"ie", {HB_TAG('I','L','E',' ')}}, /* Interlingue */ - {"ig", {HB_TAG('I','B','O',' ')}}, /* Igbo */ - {"igb", {HB_TAG('E','B','I',' ')}}, /* Ebira */ - {"ii", {HB_TAG('Y','I','M',' ')}}, /* Sichuan Yi -> Yi Modern */ - {"ijc", {HB_TAG('I','J','O',' ')}}, /* Izon -> Ijo */ - {"ijo", {HB_TAG('I','J','O',' ')}}, /* Ijo [family] */ - {"ik", {HB_TAG('I','P','K',' ')}}, /* Inupiaq [macrolanguage] -> Inupiat */ - {"ike", {HB_TAG('I','N','U',' ')}}, /* Eastern Canadian Inuktitut -> Inuktitut */ - {"ikt", {HB_TAG('I','N','U',' ')}}, /* Inuinnaqtun -> Inuktitut */ - {"ilo", {HB_TAG('I','L','O',' ')}}, /* Iloko -> Ilokano */ - {"in", {HB_TAG('I','N','D',' ')}}, /* Indonesian (retired code) */ - {"ing", {HB_TAG('A','T','H',' ')}}, /* Degexit'an -> Athapaskan */ - {"inh", {HB_TAG('I','N','G',' ')}}, /* Ingush */ - {"io", {HB_TAG('I','D','O',' ')}}, /* Ido */ - {"is", {HB_TAG('I','S','L',' ')}}, /* Icelandic */ - {"it", {HB_TAG('I','T','A',' ')}}, /* Italian */ - {"iu", {HB_TAG('I','N','U',' ')}}, /* Inuktitut [macrolanguage] */ - {"iw", {HB_TAG('I','W','R',' ')}}, /* Hebrew (retired code) */ - {"ja", {HB_TAG('J','A','N',' ')}}, /* Japanese */ - {"jak", {HB_TAG('M','L','Y',' ')}}, /* Jakun -> Malay */ - {"jam", {HB_TAG('J','A','M',' ')}}, /* Jamaican Creole English -> Jamaican Creole */ - {"jax", {HB_TAG('M','L','Y',' ')}}, /* Jambi Malay -> Malay */ - {"jbo", {HB_TAG('J','B','O',' ')}}, /* Lojban */ - {"jct", {HB_TAG('J','C','T',' ')}}, /* Krymchak */ - {"ji", {HB_TAG('J','I','I',' ')}}, /* Yiddish (retired code) */ - {"jv", {HB_TAG('J','A','V',' ')}}, /* Javanese */ - {"jw", {HB_TAG('J','A','V',' ')}}, /* Javanese (retired code) */ - {"ka", {HB_TAG('K','A','T',' ')}}, /* Georgian */ - {"kaa", {HB_TAG('K','R','K',' ')}}, /* Kara-Kalpak -> Karakalpak */ - {"kab", {HB_TAG('K','A','B','0')}}, /* Kabyle */ - {"kam", {HB_TAG('K','M','B',' ')}}, /* Kamba (Kenya) */ - {"kar", {HB_TAG('K','R','N',' ')}}, /* Karen [family] */ - {"kbd", {HB_TAG('K','A','B',' ')}}, /* Kabardian */ - {"kby", {HB_TAG('K','N','R',' ')}}, /* Manga Kanuri -> Kanuri */ - {"kca", {HB_TAG('K','H','K',' '), /* Khanty -> Khanty-Kazim */ - HB_TAG('K','H','S',' '), /* Khanty -> Khanty-Shurishkar */ - HB_TAG('K','H','V',' ')}}, /* Khanty -> Khanty-Vakhi */ - {"kde", {HB_TAG('K','D','E',' ')}}, /* Makonde */ - {"kdr", {HB_TAG('K','R','M',' ')}}, /* Karaim */ - {"kdt", {HB_TAG('K','U','Y',' ')}}, /* Kuy */ - {"kea", {HB_TAG('K','E','A',' ')}}, /* Kabuverdianu (Crioulo) */ - {"kek", {HB_TAG('K','E','K',' ')}}, /* Kekchi */ - {"kex", {HB_TAG('K','K','N',' ')}}, /* Kukna -> Kokni */ - {"kfa", {HB_TAG('K','O','D',' ')}}, /* Kodava -> Kodagu */ - {"kfr", {HB_TAG('K','A','C',' ')}}, /* Kachhi -> Kachchi */ - {"kfx", {HB_TAG('K','U','L',' ')}}, /* Kullu Pahari -> Kulvi */ - {"kfy", {HB_TAG('K','M','N',' ')}}, /* Kumaoni */ - {"kg", {HB_TAG('K','O','N','0')}}, /* Kongo [macrolanguage] */ - {"kha", {HB_TAG('K','S','I',' ')}}, /* Khasi */ - {"khb", {HB_TAG('X','B','D',' ')}}, /* Lü */ - {"khk", {HB_TAG('M','N','G',' ')}}, /* Halh Mongolian -> Mongolian */ - {"kht", {HB_TAG('K','H','N',' '), /* Khamti -> Khamti Shan (Microsoft fonts) */ - HB_TAG('K','H','T',' ')}}, /* Khamti -> Khamti Shan (OpenType spec and SIL fonts) */ - {"khw", {HB_TAG('K','H','W',' ')}}, /* Khowar */ - {"ki", {HB_TAG('K','I','K',' ')}}, /* Kikuyu (Gikuyu) */ - {"kiu", {HB_TAG('K','I','U',' ')}}, /* Kirmanjki */ - {"kj", {HB_TAG('K','U','A',' ')}}, /* Kuanyama */ - {"kjd", {HB_TAG('K','J','D',' ')}}, /* Southern Kiwai */ - {"kjh", {HB_TAG('K','H','A',' ')}}, /* Khakas -> Khakass */ - {"kjp", {HB_TAG('K','J','P',' ')}}, /* Pwo Eastern Karen -> Eastern Pwo Karen */ - {"kjz", {HB_TAG('K','J','Z',' ')}}, /* Bumthangkha */ - {"kk", {HB_TAG('K','A','Z',' ')}}, /* Kazakh */ - {"kkz", {HB_TAG('A','T','H',' ')}}, /* Kaska -> Athapaskan */ - {"kl", {HB_TAG('G','R','N',' ')}}, /* Greenlandic */ - {"kln", {HB_TAG('K','A','L',' ')}}, /* Kalenjin [macrolanguage] */ - {"km", {HB_TAG('K','H','M',' ')}}, /* Khmer */ - {"kmb", {HB_TAG('M','B','N',' ')}}, /* Kimbundu -> Mbundu */ - {"kmr", {HB_TAG('K','U','R',' ')}}, /* Northern Kurdish -> Kurdish */ - {"kmw", {HB_TAG('K','M','O',' ')}}, /* Komo (Democratic Republic of Congo) */ - {"kmz", {HB_TAG('K','M','Z',' ')}}, /* Khorasani Turkish -> Khorasani Turkic */ - {"kn", {HB_TAG('K','A','N',' ')}}, /* Kannada */ - {"knc", {HB_TAG('K','N','R',' ')}}, /* Central Kanuri -> Kanuri */ - {"kng", {HB_TAG('K','O','N','0')}}, /* Koongo -> Kongo */ - {"knn", {HB_TAG('K','O','K',' ')}}, /* Konkani */ - {"ko", {HB_TAG('K','O','R',' ')}}, /* Korean */ - {"koi", {HB_TAG('K','O','P',' ')}}, /* Komi-Permyak */ - {"kok", {HB_TAG('K','O','K',' ')}}, /* Konkani [macrolanguage] */ - {"kos", {HB_TAG('K','O','S',' ')}}, /* Kosraean */ - {"koy", {HB_TAG('A','T','H',' ')}}, /* Koyukon -> Athapaskan */ - {"kpe", {HB_TAG('K','P','L',' ')}}, /* Kpelle [macrolanguage] */ - {"kpv", {HB_TAG('K','O','Z',' ')}}, /* Komi-Zyrian */ - {"kpy", {HB_TAG('K','Y','K',' ')}}, /* Koryak */ - {"kqs", {HB_TAG('K','I','S',' ')}}, /* Northern Kissi -> Kisii */ - {"kqy", {HB_TAG('K','R','T',' ')}}, /* Koorete */ - {"kr", {HB_TAG('K','N','R',' ')}}, /* Kanuri [macrolanguage] */ - {"krc", {HB_TAG('K','A','R',' '), /* Karachay-Balkar -> Karachay */ - HB_TAG('B','A','L',' ')}}, /* Karachay-Balkar -> Balkar */ - {"kri", {HB_TAG('K','R','I',' ')}}, /* Krio */ - {"krl", {HB_TAG('K','R','L',' ')}}, /* Karelian */ - {"krt", {HB_TAG('K','N','R',' ')}}, /* Tumari Kanuri -> Kanuri */ - {"kru", {HB_TAG('K','U','U',' ')}}, /* Kurukh */ - {"ks", {HB_TAG('K','S','H',' ')}}, /* Kashmiri */ - {"ksh", {HB_TAG('K','S','H','0')}}, /* Kölsch -> Ripuarian */ - {"kss", {HB_TAG('K','I','S',' ')}}, /* Southern Kisi -> Kisii */ - {"ksw", {HB_TAG('K','S','W',' ')}}, /* S’gaw Karen */ - {"ktb", {HB_TAG('K','E','B',' ')}}, /* Kambaata -> Kebena */ - {"ktu", {HB_TAG('K','O','N',' ')}}, /* Kituba (Democratic Republic of Congo) -> Kikongo */ - {"ktw", {HB_TAG('A','T','H',' ')}}, /* Kato -> Athapaskan */ - {"ku", {HB_TAG('K','U','R',' ')}}, /* Kurdish [macrolanguage] */ - {"kum", {HB_TAG('K','U','M',' ')}}, /* Kumyk */ - {"kuu", {HB_TAG('A','T','H',' ')}}, /* Upper Kuskokwim -> Athapaskan */ - {"kv", {HB_TAG('K','O','M',' ')}}, /* Komi [macrolanguage] */ - {"kvb", {HB_TAG('M','L','Y',' ')}}, /* Kubu -> Malay */ - {"kvr", {HB_TAG('M','L','Y',' ')}}, /* Kerinci -> Malay */ - {"kw", {HB_TAG('C','O','R',' ')}}, /* Cornish */ - {"kwy", {HB_TAG('K','O','N','0')}}, /* San Salvador Kongo -> Kongo */ - {"kxc", {HB_TAG('K','M','S',' ')}}, /* Konso -> Komso */ - {"kxd", {HB_TAG('M','L','Y',' ')}}, /* Brunei -> Malay */ - {"kxu", {HB_TAG('K','U','I',' ')}}, /* Kui (India) */ - {"ky", {HB_TAG('K','I','R',' ')}}, /* Kirghiz (Kyrgyz) */ - {"kyu", {HB_TAG('K','Y','U',' ')}}, /* Western Kayah */ - {"la", {HB_TAG('L','A','T',' ')}}, /* Latin */ - {"lad", {HB_TAG('J','U','D',' ')}}, /* Ladino */ - {"lb", {HB_TAG('L','T','Z',' ')}}, /* Luxembourgish */ - {"lbe", {HB_TAG('L','A','K',' ')}}, /* Lak */ - {"lbj", {HB_TAG('L','D','K',' ')}}, /* Ladakhi */ - {"lbl", {HB_TAG('B','I','K',' ')}}, /* Libon Bikol -> Bikol */ - {"lce", {HB_TAG('M','L','Y',' ')}}, /* Loncong -> Malay */ - {"lcf", {HB_TAG('M','L','Y',' ')}}, /* Lubu -> Malay */ - {"ldi", {HB_TAG('K','O','N','0')}}, /* Laari -> Kongo */ - {"lez", {HB_TAG('L','E','Z',' ')}}, /* Lezghian -> Lezgi */ - {"lg", {HB_TAG('L','U','G',' ')}}, /* Ganda */ - {"li", {HB_TAG('L','I','M',' ')}}, /* Limburgish */ - {"lif", {HB_TAG('L','M','B',' ')}}, /* Limbu */ - {"lij", {HB_TAG('L','I','J',' ')}}, /* Ligurian */ - {"lis", {HB_TAG('L','I','S',' ')}}, /* Lisu */ - {"liw", {HB_TAG('M','L','Y',' ')}}, /* Col -> Malay */ - {"ljp", {HB_TAG('L','J','P',' ')}}, /* Lampung Api -> Lampung */ - {"lkb", {HB_TAG('L','U','H',' ')}}, /* Kabras -> Luyia */ - {"lki", {HB_TAG('L','K','I',' ')}}, /* Laki */ - {"lko", {HB_TAG('L','U','H',' ')}}, /* Khayo -> Luyia */ - {"lks", {HB_TAG('L','U','H',' ')}}, /* Kisa -> Luyia */ - {"lld", {HB_TAG('L','A','D',' ')}}, /* Ladin */ - {"lmn", {HB_TAG('L','A','M',' ')}}, /* Lambadi -> Lambani */ - {"lmo", {HB_TAG('L','M','O',' ')}}, /* Lombard */ - {"ln", {HB_TAG('L','I','N',' ')}}, /* Lingala */ - {"lo", {HB_TAG('L','A','O',' ')}}, /* Lao */ - {"lom", {HB_TAG('L','O','M',' ')}}, /* Loma (Liberia) */ - {"lrc", {HB_TAG('L','R','C',' ')}}, /* Northern Luri -> Luri */ - {"lri", {HB_TAG('L','U','H',' ')}}, /* Marachi -> Luyia */ - {"lrm", {HB_TAG('L','U','H',' ')}}, /* Marama -> Luyia */ - {"lsm", {HB_TAG('L','U','H',' ')}}, /* Saamia -> Luyia */ - {"lt", {HB_TAG('L','T','H',' ')}}, /* Lithuanian */ - {"ltg", {HB_TAG('L','V','I',' ')}}, /* Latgalian -> Latvian */ - {"lto", {HB_TAG('L','U','H',' ')}}, /* Tsotso -> Luyia */ - {"lts", {HB_TAG('L','U','H',' ')}}, /* Tachoni -> Luyia */ - {"lu", {HB_TAG('L','U','B',' ')}}, /* Luba-Katanga */ - {"lua", {HB_TAG('L','U','A',' ')}}, /* Luba-Lulua */ - {"luo", {HB_TAG('L','U','O',' ')}}, /* Luo (Kenya and Tanzania) */ - {"lus", {HB_TAG('M','I','Z',' ')}}, /* Lushai -> Mizo */ - {"luy", {HB_TAG('L','U','H',' ')}}, /* Luyia [macrolanguage] */ - {"luz", {HB_TAG('L','R','C',' ')}}, /* Southern Luri -> Luri */ - {"lv", {HB_TAG('L','V','I',' ')}}, /* Latvian [macrolanguage] */ - {"lvs", {HB_TAG('L','V','I',' ')}}, /* Standard Latvian -> Latvian */ - {"lwg", {HB_TAG('L','U','H',' ')}}, /* Wanga -> Luyia */ - {"lzh", {HB_TAG('Z','H','T',' ')}}, /* Literary Chinese -> Chinese Traditional */ - {"lzz", {HB_TAG('L','A','Z',' ')}}, /* Laz */ - {"mad", {HB_TAG('M','A','D',' ')}}, /* Madurese -> Madura */ - {"mag", {HB_TAG('M','A','G',' ')}}, /* Magahi */ - {"mai", {HB_TAG('M','T','H',' ')}}, /* Maithili */ - {"mak", {HB_TAG('M','K','R',' ')}}, /* Makasar */ - {"mam", {HB_TAG('M','A','M',' ')}}, /* Mam */ - {"man", {HB_TAG('M','N','K',' ')}}, /* Mandingo [macrolanguage] -> Maninka */ - {"max", {HB_TAG('M','L','Y',' ')}}, /* North Moluccan Malay -> Malay */ - {"mbo", {HB_TAG('M','B','O',' ')}}, /* Mbo (Cameroon) */ - {"mct", {HB_TAG('B','T','I',' ')}}, /* Mengisa -> Beti */ - {"mdf", {HB_TAG('M','O','K',' ')}}, /* Moksha */ - {"mdr", {HB_TAG('M','D','R',' ')}}, /* Mandar */ - {"mdy", {HB_TAG('M','L','E',' ')}}, /* Male (Ethiopia) */ - {"men", {HB_TAG('M','D','E',' ')}}, /* Mende (Sierra Leone) */ - {"meo", {HB_TAG('M','L','Y',' ')}}, /* Kedah Malay -> Malay */ - {"mer", {HB_TAG('M','E','R',' ')}}, /* Meru */ - {"mfa", {HB_TAG('M','F','A',' ')}}, /* Pattani Malay */ - {"mfb", {HB_TAG('M','L','Y',' ')}}, /* Bangka -> Malay */ - {"mfe", {HB_TAG('M','F','E',' ')}}, /* Morisyen */ - {"mg", {HB_TAG('M','L','G',' ')}}, /* Malagasy [macrolanguage] */ - {"mh", {HB_TAG('M','A','H',' ')}}, /* Marshallese */ - {"mhr", {HB_TAG('L','M','A',' ')}}, /* Eastern Mari -> Low Mari */ - {"mhv", {HB_TAG('A','R','K',' ')}}, /* Arakanese (retired code) -> Rakhine */ - {"mi", {HB_TAG('M','R','I',' ')}}, /* Maori */ - {"min", {HB_TAG('M','I','N',' ')}}, /* Minangkabau */ - {"mk", {HB_TAG('M','K','D',' ')}}, /* Macedonian */ - {"mku", {HB_TAG('M','N','K',' ')}}, /* Konyanka Maninka -> Maninka */ - {"mkw", {HB_TAG('M','K','W',' ')}}, /* Kituba (Congo) */ - {"ml", {HB_TAG('M','A','L',' '), /* Malayalam -> Malayalam Traditional */ - HB_TAG('M','L','R',' ')}}, /* Malayalam -> Malayalam Reformed */ - {"mlq", {HB_TAG('M','L','N',' '), /* Western Maninkakan -> Malinke */ - HB_TAG('M','N','K',' ')}}, /* Western Maninkakan -> Maninka */ - {"mmr", {HB_TAG('H','M','N',' ')}}, /* Western Xiangxi Miao -> Hmong */ - {"mn", {HB_TAG('M','N','G',' ')}}, /* Mongolian [macrolanguage] */ - {"mnc", {HB_TAG('M','C','H',' ')}}, /* Manchu */ - {"mni", {HB_TAG('M','N','I',' ')}}, /* Manipuri */ - {"mnk", {HB_TAG('M','N','D',' '), /* Mandinka */ - HB_TAG('M','N','K',' ')}}, /* Mandinka -> Maninka */ - {"mnp", {HB_TAG('Z','H','S',' ')}}, /* Min Bei Chinese -> Chinese Simplified */ - {"mns", {HB_TAG('M','A','N',' ')}}, /* Mansi */ - {"mnw", {HB_TAG('M','O','N',' ')}}, /* Mon */ - {"mo", {HB_TAG('M','O','L',' ')}}, /* Moldavian (retired code) */ - {"moh", {HB_TAG('M','O','H',' ')}}, /* Mohawk */ - {"mos", {HB_TAG('M','O','S',' ')}}, /* Mossi */ - {"mpe", {HB_TAG('M','A','J',' ')}}, /* Majang */ - {"mqg", {HB_TAG('M','L','Y',' ')}}, /* Kota Bangun Kutai Malay -> Malay */ - {"mr", {HB_TAG('M','A','R',' ')}}, /* Marathi */ - {"mrh", {HB_TAG('Q','I','N',' ')}}, /* Mara Chin -> Chin */ - {"mrj", {HB_TAG('H','M','A',' ')}}, /* Western Mari -> High Mari */ - {"ms", {HB_TAG('M','L','Y',' ')}}, /* Malay [macrolanguage] */ - {"msc", {HB_TAG('M','N','K',' ')}}, /* Sankaran Maninka -> Maninka */ - {"msh", {HB_TAG('M','L','G',' ')}}, /* Masikoro Malagasy -> Malagasy */ - {"msi", {HB_TAG('M','L','Y',' ')}}, /* Sabah Malay -> Malay */ - {"mt", {HB_TAG('M','T','S',' ')}}, /* Maltese */ - {"mtr", {HB_TAG('M','A','W',' ')}}, /* Mewari -> Marwari */ - {"mui", {HB_TAG('M','L','Y',' ')}}, /* Musi -> Malay */ - {"mup", {HB_TAG('R','A','J',' ')}}, /* Malvi -> Rajasthani */ - {"muq", {HB_TAG('H','M','N',' ')}}, /* Eastern Xiangxi Miao -> Hmong */ - {"mus", {HB_TAG('M','U','S',' ')}}, /* Creek -> Muscogee */ - {"mvb", {HB_TAG('A','T','H',' ')}}, /* Mattole -> Athapaskan */ - {"mve", {HB_TAG('M','A','W',' ')}}, /* Marwari (Pakistan) */ - {"mvf", {HB_TAG('M','N','G',' ')}}, /* Peripheral Mongolian -> Mongolian */ - {"mwk", {HB_TAG('M','N','K',' ')}}, /* Kita Maninkakan -> Maninka */ - {"mwl", {HB_TAG('M','W','L',' ')}}, /* Mirandese */ - {"mwr", {HB_TAG('M','A','W',' ')}}, /* Marwari [macrolanguage] */ - {"mww", {HB_TAG('M','W','W',' ')}}, /* Hmong Daw */ - {"my", {HB_TAG('B','R','M',' ')}}, /* Burmese */ - {"mym", {HB_TAG('M','E','N',' ')}}, /* Me’en */ - {"myn", {HB_TAG('M','Y','N',' ')}}, /* Mayan [family] */ - {"myq", {HB_TAG('M','N','K',' ')}}, /* Forest Maninka (retired code) -> Maninka */ - {"myv", {HB_TAG('E','R','Z',' ')}}, /* Erzya */ - {"mzn", {HB_TAG('M','Z','N',' ')}}, /* Mazanderani */ - {"na", {HB_TAG('N','A','U',' ')}}, /* Nauru -> Nauruan */ - {"nag", {HB_TAG('N','A','G',' ')}}, /* Naga Pidgin -> Naga-Assamese */ - {"nah", {HB_TAG('N','A','H',' ')}}, /* Nahuatl [family] */ - {"nan", {HB_TAG('Z','H','S',' ')}}, /* Min Nan Chinese -> Chinese Simplified */ - {"nap", {HB_TAG('N','A','P',' ')}}, /* Neapolitan */ - {"nb", {HB_TAG('N','O','R',' ')}}, /* Norwegian Bokmål -> Norwegian */ - {"nd", {HB_TAG('N','D','B',' ')}}, /* North Ndebele -> Ndebele */ - {"ndc", {HB_TAG('N','D','C',' ')}}, /* Ndau */ - {"nds", {HB_TAG('N','D','S',' ')}}, /* Low Saxon */ - {"ne", {HB_TAG('N','E','P',' ')}}, /* Nepali [macrolanguage] */ - {"new", {HB_TAG('N','E','W',' ')}}, /* Newari */ - {"ng", {HB_TAG('N','D','G',' ')}}, /* Ndonga */ - {"nga", {HB_TAG('N','G','A',' ')}}, /* Ngbaka */ - {"ngl", {HB_TAG('L','M','W',' ')}}, /* Lomwe */ - {"ngo", {HB_TAG('S','X','T',' ')}}, /* Ngoni -> Sutu */ - {"nhd", {HB_TAG('G','U','A',' ')}}, /* Chiripá -> Guarani */ - {"niq", {HB_TAG('K','A','L',' ')}}, /* Nandi -> Kalenjin */ - {"niu", {HB_TAG('N','I','U',' ')}}, /* Niuean */ - {"niv", {HB_TAG('G','I','L',' ')}}, /* Gilyak */ - {"njz", {HB_TAG('N','I','S',' ')}}, /* Nyishi -> Nisi */ - {"nl", {HB_TAG('N','L','D',' ')}}, /* Dutch */ - {"nle", {HB_TAG('L','U','H',' ')}}, /* East Nyala -> Luyia */ - {"nn", {HB_TAG('N','Y','N',' ')}}, /* Norwegian Nynorsk (Nynorsk, Norwegian) */ - {"no", {HB_TAG('N','O','R',' ')}}, /* Norwegian [macrolanguage] */ - {"nod", {HB_TAG('N','T','A',' ')}}, /* Northern Thai -> Northern Tai */ - {"noe", {HB_TAG('N','O','E',' ')}}, /* Nimadi */ - {"nog", {HB_TAG('N','O','G',' ')}}, /* Nogai */ - {"nov", {HB_TAG('N','O','V',' ')}}, /* Novial */ - {"npi", {HB_TAG('N','E','P',' ')}}, /* Nepali */ - {"nqo", {HB_TAG('N','K','O',' ')}}, /* N’Ko */ - {"nr", {HB_TAG('N','D','B',' ')}}, /* South Ndebele -> Ndebele */ - {"nsk", {HB_TAG('N','A','S',' ')}}, /* Naskapi */ - {"nso", {HB_TAG('N','S','O',' ')}}, /* Pedi -> Sotho, Northern */ - {"nv", {HB_TAG('N','A','V',' '), /* Navajo */ - HB_TAG('A','T','H',' ')}}, /* Navajo -> Athapaskan */ - {"ny", {HB_TAG('C','H','I',' ')}}, /* Chichewa (Chewa, Nyanja) */ - {"nyd", {HB_TAG('L','U','H',' ')}}, /* Nyore -> Luyia */ - {"nym", {HB_TAG('N','Y','M',' ')}}, /* Nyamwezi */ - {"nyn", {HB_TAG('N','K','L',' ')}}, /* Nyankole */ - {"nza", {HB_TAG('N','Z','A',' ')}}, /* Tigon Mbembe -> Mbembe Tigon */ - {"oc", {HB_TAG('O','C','I',' ')}}, /* Occitan (post 1500) */ - {"oj", {HB_TAG('O','J','B',' ')}}, /* Ojibwa [macrolanguage] -> Ojibway */ - {"ojb", {HB_TAG('O','J','B',' ')}}, /* Northwestern Ojibwa -> Ojibway */ - {"ojc", {HB_TAG('O','J','B',' ')}}, /* Central Ojibwa -> Ojibway */ - {"ojg", {HB_TAG('O','J','B',' ')}}, /* Eastern Ojibwa -> Ojibway */ - {"ojs", {HB_TAG('O','C','R',' ')}}, /* Severn Ojibwa -> Oji-Cree */ - {"ojw", {HB_TAG('O','J','B',' ')}}, /* Western Ojibwa -> Ojibway */ - {"oki", {HB_TAG('K','A','L',' ')}}, /* Okiek -> Kalenjin */ - {"okm", {HB_TAG('K','O','H',' ')}}, /* Middle Korean (10th-16th cent.) -> Korean Old Hangul */ - {"om", {HB_TAG('O','R','O',' ')}}, /* Oromo [macrolanguage] */ - {"or", {HB_TAG('O','R','I',' ')}}, /* Odia (formerly Oriya) [macrolanguage] */ - {"orc", {HB_TAG('O','R','O',' ')}}, /* Orma -> Oromo */ - {"orn", {HB_TAG('M','L','Y',' ')}}, /* Orang Kanaq -> Malay */ - {"ors", {HB_TAG('M','L','Y',' ')}}, /* Orang Seletar -> Malay */ - {"ory", {HB_TAG('O','R','I',' ')}}, /* Odia (formerly Oriya) */ - {"os", {HB_TAG('O','S','S',' ')}}, /* Ossetian */ - {"otw", {HB_TAG('O','J','B',' ')}}, /* Ottawa -> Ojibway */ - {"pa", {HB_TAG('P','A','N',' ')}}, /* Punjabi */ - {"pag", {HB_TAG('P','A','G',' ')}}, /* Pangasinan */ - {"pam", {HB_TAG('P','A','M',' ')}}, /* Pampanga -> Pampangan */ - {"pap", {HB_TAG('P','A','P','0')}}, /* Papiamento -> Papiamentu */ - {"pau", {HB_TAG('P','A','U',' ')}}, /* Palauan */ - {"pbt", {HB_TAG('P','A','S',' ')}}, /* Southern Pashto -> Pashto */ - {"pbu", {HB_TAG('P','A','S',' ')}}, /* Northern Pashto -> Pashto */ - {"pcc", {HB_TAG('P','C','C',' ')}}, /* Bouyei */ - {"pcd", {HB_TAG('P','C','D',' ')}}, /* Picard */ - {"pce", {HB_TAG('P','L','G',' ')}}, /* Ruching Palaung -> Palaung */ - {"pck", {HB_TAG('Q','I','N',' ')}}, /* Paite Chin -> Chin */ - {"pdc", {HB_TAG('P','D','C',' ')}}, /* Pennsylvania German */ - {"pel", {HB_TAG('M','L','Y',' ')}}, /* Pekal -> Malay */ - {"pes", {HB_TAG('F','A','R',' ')}}, /* Iranian Persian -> Persian */ - {"pga", {HB_TAG('A','R','A',' ')}}, /* Sudanese Creole Arabic -> Arabic */ - {"phk", {HB_TAG('P','H','K',' ')}}, /* Phake */ - {"pi", {HB_TAG('P','A','L',' ')}}, /* Pali */ - {"pih", {HB_TAG('P','I','H',' ')}}, /* Pitcairn-Norfolk -> Norfolk */ - {"pko", {HB_TAG('K','A','L',' ')}}, /* Pökoot -> Kalenjin */ - {"pl", {HB_TAG('P','L','K',' ')}}, /* Polish */ - {"pll", {HB_TAG('P','L','G',' ')}}, /* Shwe Palaung -> Palaung */ - {"plp", {HB_TAG('P','A','P',' ')}}, /* Palpa */ - {"plt", {HB_TAG('M','L','G',' ')}}, /* Plateau Malagasy -> Malagasy */ - {"pms", {HB_TAG('P','M','S',' ')}}, /* Piemontese */ - {"pnb", {HB_TAG('P','N','B',' ')}}, /* Western Panjabi */ - {"poh", {HB_TAG('P','O','H',' ')}}, /* Poqomchi' -> Pocomchi */ - {"pon", {HB_TAG('P','O','N',' ')}}, /* Pohnpeian */ - {"ppa", {HB_TAG('B','A','G',' ')}}, /* Pao (retired code) -> Baghelkhandi */ - {"pro", {HB_TAG('P','R','O',' ')}}, /* Old Provençal (to 1500) -> Provençal / Old Provençal */ - {"prs", {HB_TAG('D','R','I',' ')}}, /* Dari */ - {"ps", {HB_TAG('P','A','S',' ')}}, /* Pashto [macrolanguage] */ - {"pse", {HB_TAG('M','L','Y',' ')}}, /* Central Malay -> Malay */ - {"pst", {HB_TAG('P','A','S',' ')}}, /* Central Pashto -> Pashto */ - {"pt", {HB_TAG('P','T','G',' ')}}, /* Portuguese */ - {"pwo", {HB_TAG('P','W','O',' ')}}, /* Pwo Western Karen -> Western Pwo Karen */ - {"qu", {HB_TAG('Q','U','Z',' ')}}, /* Quechua [macrolanguage] */ - {"qub", {HB_TAG('Q','W','H',' ')}}, /* Huallaga Huánuco Quechua -> Quechua (Peru) */ - {"quc", {HB_TAG('Q','U','C',' ')}}, /* K’iche’ */ - {"qud", {HB_TAG('Q','V','I',' ')}}, /* Calderón Highland Quichua -> Quechua (Ecuador) */ - {"quf", {HB_TAG('Q','U','Z',' ')}}, /* Lambayeque Quechua -> Quechua */ - {"qug", {HB_TAG('Q','V','I',' ')}}, /* Chimborazo Highland Quichua -> Quechua (Ecuador) */ - {"quh", {HB_TAG('Q','U','H',' ')}}, /* South Bolivian Quechua -> Quechua (Bolivia) */ - {"quk", {HB_TAG('Q','U','Z',' ')}}, /* Chachapoyas Quechua -> Quechua */ - {"qul", {HB_TAG('Q','U','Z',' ')}}, /* North Bolivian Quechua -> Quechua */ - {"qup", {HB_TAG('Q','V','I',' ')}}, /* Southern Pastaza Quechua -> Quechua (Ecuador) */ - {"qur", {HB_TAG('Q','W','H',' ')}}, /* Yanahuanca Pasco Quechua -> Quechua (Peru) */ - {"qus", {HB_TAG('Q','U','H',' ')}}, /* Santiago del Estero Quichua -> Quechua (Bolivia) */ - {"quw", {HB_TAG('Q','V','I',' ')}}, /* Tena Lowland Quichua -> Quechua (Ecuador) */ - {"qux", {HB_TAG('Q','W','H',' ')}}, /* Yauyos Quechua -> Quechua (Peru) */ - {"quy", {HB_TAG('Q','U','Z',' ')}}, /* Ayacucho Quechua -> Quechua */ - {"quz", {HB_TAG('Q','U','Z',' ')}}, /* Cusco Quechua -> Quechua */ - {"qva", {HB_TAG('Q','W','H',' ')}}, /* Ambo-Pasco Quechua -> Quechua (Peru) */ - {"qvc", {HB_TAG('Q','U','Z',' ')}}, /* Cajamarca Quechua -> Quechua */ - {"qve", {HB_TAG('Q','U','Z',' ')}}, /* Eastern Apurímac Quechua -> Quechua */ - {"qvh", {HB_TAG('Q','W','H',' ')}}, /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */ - {"qvi", {HB_TAG('Q','V','I',' ')}}, /* Imbabura Highland Quichua -> Quechua (Ecuador) */ - {"qvj", {HB_TAG('Q','V','I',' ')}}, /* Loja Highland Quichua -> Quechua (Ecuador) */ - {"qvl", {HB_TAG('Q','W','H',' ')}}, /* Cajatambo North Lima Quechua -> Quechua (Peru) */ - {"qvm", {HB_TAG('Q','W','H',' ')}}, /* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */ - {"qvn", {HB_TAG('Q','W','H',' ')}}, /* North Junín Quechua -> Quechua (Peru) */ - {"qvo", {HB_TAG('Q','V','I',' ')}}, /* Napo Lowland Quechua -> Quechua (Ecuador) */ - {"qvp", {HB_TAG('Q','W','H',' ')}}, /* Pacaraos Quechua -> Quechua (Peru) */ - {"qvs", {HB_TAG('Q','U','Z',' ')}}, /* San Martín Quechua -> Quechua */ - {"qvw", {HB_TAG('Q','W','H',' ')}}, /* Huaylla Wanca Quechua -> Quechua (Peru) */ - {"qvz", {HB_TAG('Q','V','I',' ')}}, /* Northern Pastaza Quichua -> Quechua (Ecuador) */ - {"qwa", {HB_TAG('Q','W','H',' ')}}, /* Corongo Ancash Quechua -> Quechua (Peru) */ - {"qwc", {HB_TAG('Q','U','Z',' ')}}, /* Classical Quechua -> Quechua */ - {"qwh", {HB_TAG('Q','W','H',' ')}}, /* Huaylas Ancash Quechua -> Quechua (Peru) */ - {"qws", {HB_TAG('Q','W','H',' ')}}, /* Sihuas Ancash Quechua -> Quechua (Peru) */ - {"qxa", {HB_TAG('Q','W','H',' ')}}, /* Chiquián Ancash Quechua -> Quechua (Peru) */ - {"qxc", {HB_TAG('Q','W','H',' ')}}, /* Chincha Quechua -> Quechua (Peru) */ - {"qxh", {HB_TAG('Q','W','H',' ')}}, /* Panao Huánuco Quechua -> Quechua (Peru) */ - {"qxl", {HB_TAG('Q','V','I',' ')}}, /* Salasaca Highland Quichua -> Quechua (Ecuador) */ - {"qxn", {HB_TAG('Q','W','H',' ')}}, /* Northern Conchucos Ancash Quechua -> Quechua (Peru) */ - {"qxo", {HB_TAG('Q','W','H',' ')}}, /* Southern Conchucos Ancash Quechua -> Quechua (Peru) */ - {"qxp", {HB_TAG('Q','U','Z',' ')}}, /* Puno Quechua -> Quechua */ - {"qxr", {HB_TAG('Q','V','I',' ')}}, /* Cañar Highland Quichua -> Quechua (Ecuador) */ - {"qxt", {HB_TAG('Q','W','H',' ')}}, /* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */ - {"qxu", {HB_TAG('Q','U','Z',' ')}}, /* Arequipa-La Unión Quechua -> Quechua */ - {"qxw", {HB_TAG('Q','W','H',' ')}}, /* Jauja Wanca Quechua -> Quechua (Peru) */ - {"rag", {HB_TAG('L','U','H',' ')}}, /* Logooli -> Luyia */ - {"raj", {HB_TAG('R','A','J',' ')}}, /* Rajasthani [macrolanguage] */ - {"rar", {HB_TAG('R','A','R',' ')}}, /* Rarotongan */ - {"rbb", {HB_TAG('P','L','G',' ')}}, /* Rumai Palaung -> Palaung */ - {"rbl", {HB_TAG('B','I','K',' ')}}, /* Miraya Bikol -> Bikol */ - {"rej", {HB_TAG('R','E','J',' ')}}, /* Rejang */ - {"ria", {HB_TAG('R','I','A',' ')}}, /* Riang (India) */ - {"rif", {HB_TAG('R','I','F',' ')}}, /* Tarifit */ - {"rit", {HB_TAG('R','I','T',' ')}}, /* Ritarungo */ - {"rki", {HB_TAG('A','R','K',' ')}}, /* Rakhine */ - {"rkw", {HB_TAG('R','K','W',' ')}}, /* Arakwal */ - {"rm", {HB_TAG('R','M','S',' ')}}, /* Romansh */ - {"rmc", {HB_TAG('R','O','Y',' ')}}, /* Carpathian Romani -> Romany */ - {"rmf", {HB_TAG('R','O','Y',' ')}}, /* Kalo Finnish Romani -> Romany */ - {"rml", {HB_TAG('R','O','Y',' ')}}, /* Baltic Romani -> Romany */ - {"rmn", {HB_TAG('R','O','Y',' ')}}, /* Balkan Romani -> Romany */ - {"rmo", {HB_TAG('R','O','Y',' ')}}, /* Sinte Romani -> Romany */ - {"rmw", {HB_TAG('R','O','Y',' ')}}, /* Welsh Romani -> Romany */ - {"rmy", {HB_TAG('R','M','Y',' ')}}, /* Vlax Romani */ - {"rmz", {HB_TAG('A','R','K',' ')}}, /* Marma -> Rakhine */ - {"rn", {HB_TAG('R','U','N',' ')}}, /* Rundi */ - {"rnl", {HB_TAG('H','A','L',' ')}}, /* Ranglong -> Halam (Falam Chin) */ - {"ro", {HB_TAG('R','O','M',' ')}}, /* Romanian */ - {"rom", {HB_TAG('R','O','Y',' ')}}, /* Romany [macrolanguage] */ - {"rtm", {HB_TAG('R','T','M',' ')}}, /* Rotuman */ - {"ru", {HB_TAG('R','U','S',' ')}}, /* Russian */ - {"rue", {HB_TAG('R','S','Y',' ')}}, /* Rusyn */ - {"rup", {HB_TAG('R','U','P',' ')}}, /* Aromanian */ - {"rw", {HB_TAG('R','U','A',' ')}}, /* Kinyarwanda */ - {"rwr", {HB_TAG('M','A','W',' ')}}, /* Marwari (India) */ - {"sa", {HB_TAG('S','A','N',' ')}}, /* Sanskrit */ - {"sah", {HB_TAG('Y','A','K',' ')}}, /* Yakut -> Sakha */ - {"sam", {HB_TAG('P','A','A',' ')}}, /* Samaritan Aramaic -> Palestinian Aramaic */ - {"sas", {HB_TAG('S','A','S',' ')}}, /* Sasak */ - {"sat", {HB_TAG('S','A','T',' ')}}, /* Santali */ - {"sc", {HB_TAG('S','R','D',' ')}}, /* Sardinian [macrolanguage] */ - {"sck", {HB_TAG('S','A','D',' ')}}, /* Sadri */ - {"scn", {HB_TAG('S','C','N',' ')}}, /* Sicilian */ - {"sco", {HB_TAG('S','C','O',' ')}}, /* Scots */ - {"scs", {HB_TAG('S','C','S',' '), /* North Slavey */ - HB_TAG('S','L','A',' '), /* North Slavey -> Slavey */ - HB_TAG('A','T','H',' ')}}, /* North Slavey -> Athapaskan */ - {"sd", {HB_TAG('S','N','D',' ')}}, /* Sindhi */ - {"sdc", {HB_TAG('S','R','D',' ')}}, /* Sassarese Sardinian -> Sardinian */ - {"sdh", {HB_TAG('K','U','R',' ')}}, /* Southern Kurdish -> Kurdish */ - {"sdn", {HB_TAG('S','R','D',' ')}}, /* Gallurese Sardinian -> Sardinian */ - {"se", {HB_TAG('N','S','M',' ')}}, /* Northern Sami */ - {"seh", {HB_TAG('S','N','A',' ')}}, /* Sena */ - {"sek", {HB_TAG('A','T','H',' ')}}, /* Sekani -> Athapaskan */ - {"sel", {HB_TAG('S','E','L',' ')}}, /* Selkup */ - {"sez", {HB_TAG('Q','I','N',' ')}}, /* Senthang Chin -> Chin */ - {"sfm", {HB_TAG('H','M','N',' ')}}, /* Small Flowery Miao -> Hmong */ - {"sg", {HB_TAG('S','G','O',' ')}}, /* Sango */ - {"sga", {HB_TAG('S','G','A',' ')}}, /* Old Irish (to 900) */ - {"sgc", {HB_TAG('K','A','L',' ')}}, /* Kipsigis -> Kalenjin */ - {"sgs", {HB_TAG('S','G','S',' ')}}, /* Samogitian */ - {"sgw", {HB_TAG('C','H','G',' '), /* Sebat Bet Gurage -> Chaha Gurage */ - HB_TAG('S','G','W',' ')}}, /* Sebat Bet Gurage -> Chaha Gurage (SIL fonts) */ - {"shi", {HB_TAG('S','H','I',' ')}}, /* Tachelhit */ - {"shn", {HB_TAG('S','H','N',' ')}}, /* Shan */ - {"shu", {HB_TAG('A','R','A',' ')}}, /* Chadian Arabic -> Arabic */ - {"si", {HB_TAG('S','N','H',' ')}}, /* Sinhala (Sinhalese) */ - {"sid", {HB_TAG('S','I','D',' ')}}, /* Sidamo */ - {"sjd", {HB_TAG('K','S','M',' ')}}, /* Kildin Sami */ - {"sjo", {HB_TAG('S','I','B',' ')}}, /* Xibe -> Sibe */ - {"sk", {HB_TAG('S','K','Y',' ')}}, /* Slovak */ - {"skg", {HB_TAG('M','L','G',' ')}}, /* Sakalava Malagasy -> Malagasy */ - {"skr", {HB_TAG('S','R','K',' ')}}, /* Saraiki */ - {"sl", {HB_TAG('S','L','V',' ')}}, /* Slovenian */ - {"sm", {HB_TAG('S','M','O',' ')}}, /* Samoan */ - {"sma", {HB_TAG('S','S','M',' ')}}, /* Southern Sami */ - {"smj", {HB_TAG('L','S','M',' ')}}, /* Lule Sami */ - {"smn", {HB_TAG('I','S','M',' ')}}, /* Inari Sami */ - {"sms", {HB_TAG('S','K','S',' ')}}, /* Skolt Sami */ - {"sn", {HB_TAG('S','N','A','0')}}, /* Shona */ - {"snk", {HB_TAG('S','N','K',' ')}}, /* Soninke */ - {"so", {HB_TAG('S','M','L',' ')}}, /* Somali */ - {"sop", {HB_TAG('S','O','P',' ')}}, /* Songe */ - {"spv", {HB_TAG('O','R','I',' ')}}, /* Sambalpuri -> Odia (formerly Oriya) */ - {"spy", {HB_TAG('K','A','L',' ')}}, /* Sabaot -> Kalenjin */ - {"sq", {HB_TAG('S','Q','I',' ')}}, /* Albanian [macrolanguage] */ - {"sr", {HB_TAG('S','R','B',' ')}}, /* Serbian */ - {"src", {HB_TAG('S','R','D',' ')}}, /* Logudorese Sardinian -> Sardinian */ - {"sro", {HB_TAG('S','R','D',' ')}}, /* Campidanese Sardinian -> Sardinian */ - {"srr", {HB_TAG('S','R','R',' ')}}, /* Serer */ - {"srs", {HB_TAG('A','T','H',' ')}}, /* Sarsi -> Athapaskan */ - {"ss", {HB_TAG('S','W','Z',' ')}}, /* Swati */ - {"ssh", {HB_TAG('A','R','A',' ')}}, /* Shihhi Arabic -> Arabic */ - {"st", {HB_TAG('S','O','T',' ')}}, /* Southern Sotho -> Sotho, Southern */ - {"stq", {HB_TAG('S','T','Q',' ')}}, /* Saterfriesisch -> Saterland Frisian */ - {"stv", {HB_TAG('S','I','G',' ')}}, /* Silt'e -> Silte Gurage */ - {"su", {HB_TAG('S','U','N',' ')}}, /* Sundanese */ - {"suk", {HB_TAG('S','U','K',' ')}}, /* Sukuma */ - {"suq", {HB_TAG('S','U','R',' ')}}, /* Suri */ - {"sv", {HB_TAG('S','V','E',' ')}}, /* Swedish */ - {"sva", {HB_TAG('S','V','A',' ')}}, /* Svan */ - {"sw", {HB_TAG('S','W','K',' ')}}, /* Swahili [macrolanguage] */ - {"swb", {HB_TAG('C','M','R',' ')}}, /* Maore Comorian -> Comorian */ - {"swc", {HB_TAG('S','W','K',' ')}}, /* Congo Swahili -> Swahili */ - {"swh", {HB_TAG('S','W','K',' ')}}, /* Swahili */ - {"swv", {HB_TAG('M','A','W',' ')}}, /* Shekhawati -> Marwari */ - {"sxu", {HB_TAG('S','X','U',' ')}}, /* Upper Saxon */ - {"syc", {HB_TAG('S','Y','R',' ')}}, /* Classical Syriac -> Syriac */ - {"syl", {HB_TAG('S','Y','L',' ')}}, /* Sylheti */ - {"syr", {HB_TAG('S','Y','R',' ')}}, /* Syriac [macrolanguage] */ - {"szl", {HB_TAG('S','Z','L',' ')}}, /* Silesian */ - {"ta", {HB_TAG('T','A','M',' ')}}, /* Tamil */ - {"taa", {HB_TAG('A','T','H',' ')}}, /* Lower Tanana -> Athapaskan */ - {"tab", {HB_TAG('T','A','B',' ')}}, /* Tabassaran -> Tabasaran */ - {"taq", {HB_TAG('T','M','H',' ')}}, /* Tamasheq -> Tamashek */ - {"tau", {HB_TAG('A','T','H',' ')}}, /* Upper Tanana -> Athapaskan */ - {"tcb", {HB_TAG('A','T','H',' ')}}, /* Tanacross -> Athapaskan */ - {"tce", {HB_TAG('A','T','H',' ')}}, /* Southern Tutchone -> Athapaskan */ - {"tcp", {HB_TAG('Q','I','N',' ')}}, /* Tawr Chin -> Chin */ - {"tcy", {HB_TAG('T','U','L',' ')}}, /* Tulu -> Tumbuka */ - {"tcz", {HB_TAG('Q','I','N',' ')}}, /* Thado Chin -> Chin */ - {"tdd", {HB_TAG('T','D','D',' ')}}, /* Tai Nüa -> Dehong Dai */ - {"tdx", {HB_TAG('M','L','G',' ')}}, /* Tandroy-Mahafaly Malagasy -> Malagasy */ - {"te", {HB_TAG('T','E','L',' ')}}, /* Telugu */ - {"tec", {HB_TAG('K','A','L',' ')}}, /* Terik -> Kalenjin */ - {"tem", {HB_TAG('T','M','N',' ')}}, /* Timne -> Temne */ - {"tet", {HB_TAG('T','E','T',' ')}}, /* Tetum */ - {"tfn", {HB_TAG('A','T','H',' ')}}, /* Tanaina -> Athapaskan */ - {"tg", {HB_TAG('T','A','J',' ')}}, /* Tajik -> Tajiki */ - {"tgj", {HB_TAG('N','I','S',' ')}}, /* Tagin -> Nisi */ - {"tgx", {HB_TAG('A','T','H',' ')}}, /* Tagish -> Athapaskan */ - {"th", {HB_TAG('T','H','A',' ')}}, /* Thai */ - {"tht", {HB_TAG('A','T','H',' ')}}, /* Tahltan -> Athapaskan */ - {"thv", {HB_TAG('T','M','H',' ')}}, /* Tahaggart Tamahaq -> Tamashek */ - {"thz", {HB_TAG('T','M','H',' ')}}, /* Tayart Tamajeq -> Tamashek */ - {"ti", {HB_TAG('T','G','Y',' ')}}, /* Tigrinya */ - {"tig", {HB_TAG('T','G','R',' ')}}, /* Tigre */ - {"tiv", {HB_TAG('T','I','V',' ')}}, /* Tiv */ - {"tk", {HB_TAG('T','K','M',' ')}}, /* Turkmen */ - {"tkg", {HB_TAG('M','L','G',' ')}}, /* Tesaka Malagasy -> Malagasy */ - {"tl", {HB_TAG('T','G','L',' ')}}, /* Tagalog */ - {"tmh", {HB_TAG('T','M','H',' ')}}, /* Tamashek [macrolanguage] */ - {"tmw", {HB_TAG('M','L','Y',' ')}}, /* Temuan -> Malay */ - {"tn", {HB_TAG('T','N','A',' ')}}, /* Tswana */ - {"tnf", {HB_TAG('D','R','I',' ')}}, /* Tangshewi (retired code) -> Dari */ - {"to", {HB_TAG('T','G','N',' ')}}, /* Tonga (Tonga Islands) -> Tongan */ - {"tod", {HB_TAG('T','O','D','0')}}, /* Toma */ - {"toi", {HB_TAG('T','N','G',' ')}}, /* Tonga (Zambia) */ - {"tol", {HB_TAG('A','T','H',' ')}}, /* Tolowa -> Athapaskan */ - {"tpi", {HB_TAG('T','P','I',' ')}}, /* Tok Pisin */ - {"tr", {HB_TAG('T','R','K',' ')}}, /* Turkish */ - {"tru", {HB_TAG('T','U','A',' '), /* Turoyo -> Turoyo Aramaic */ - HB_TAG('S','Y','R',' ')}}, /* Turoyo -> Syriac */ - {"ts", {HB_TAG('T','S','G',' ')}}, /* Tsonga */ - {"tsj", {HB_TAG('T','S','J',' ')}}, /* Tshangla */ - {"tt", {HB_TAG('T','A','T',' ')}}, /* Tatar */ - {"ttm", {HB_TAG('A','T','H',' ')}}, /* Northern Tutchone -> Athapaskan */ - {"ttq", {HB_TAG('T','M','H',' ')}}, /* Tawallammat Tamajaq -> Tamashek */ - {"tum", {HB_TAG('T','U','M',' ')}}, /* Tumbuka -> Tulu */ - {"tuu", {HB_TAG('A','T','H',' ')}}, /* Tututni -> Athapaskan */ - {"tuy", {HB_TAG('K','A','L',' ')}}, /* Tugen -> Kalenjin */ - {"tvl", {HB_TAG('T','V','L',' ')}}, /* Tuvalu */ - {"tw", {HB_TAG('T','W','I',' '), /* Twi */ - HB_TAG('A','K','A',' ')}}, /* Twi -> Akan */ - {"txc", {HB_TAG('A','T','H',' ')}}, /* Tsetsaut -> Athapaskan */ - {"txy", {HB_TAG('M','L','G',' ')}}, /* Tanosy Malagasy -> Malagasy */ - {"ty", {HB_TAG('T','H','T',' ')}}, /* Tahitian */ - {"tyv", {HB_TAG('T','U','V',' ')}}, /* Tuvinian -> Tuvin */ - {"tyz", {HB_TAG('T','Y','Z',' ')}}, /* Tày */ - {"tzm", {HB_TAG('T','Z','M',' ')}}, /* Central Atlas Tamazight -> Tamazight */ - {"tzo", {HB_TAG('T','Z','O',' ')}}, /* Tzotzil */ - {"ubl", {HB_TAG('B','I','K',' ')}}, /* Buhi'non Bikol -> Bikol */ - {"udm", {HB_TAG('U','D','M',' ')}}, /* Udmurt */ - {"ug", {HB_TAG('U','Y','G',' ')}}, /* Uyghur */ - {"uk", {HB_TAG('U','K','R',' ')}}, /* Ukrainian */ - {"umb", {HB_TAG('U','M','B',' ')}}, /* Umbundu */ - {"unr", {HB_TAG('M','U','N',' ')}}, /* Mundari */ - {"ur", {HB_TAG('U','R','D',' ')}}, /* Urdu */ - {"urk", {HB_TAG('M','L','Y',' ')}}, /* Urak Lawoi' -> Malay */ - {"uz", {HB_TAG('U','Z','B',' ')}}, /* Uzbek [macrolanguage] */ - {"uzn", {HB_TAG('U','Z','B',' ')}}, /* Northern Uzbek -> Uzbek */ - {"uzs", {HB_TAG('U','Z','B',' ')}}, /* Southern Uzbek -> Uzbek */ - {"ve", {HB_TAG('V','E','N',' ')}}, /* Venda */ - {"vec", {HB_TAG('V','E','C',' ')}}, /* Venetian */ - {"vi", {HB_TAG('V','I','T',' ')}}, /* Vietnamese */ - {"vkk", {HB_TAG('M','L','Y',' ')}}, /* Kaur -> Malay */ - {"vkt", {HB_TAG('M','L','Y',' ')}}, /* Tenggarong Kutai Malay -> Malay */ - {"vls", {HB_TAG('F','L','E',' ')}}, /* Vlaams -> Dutch (Flemish) */ - {"vmw", {HB_TAG('M','A','K',' ')}}, /* Makhuwa */ - {"vo", {HB_TAG('V','O','L',' ')}}, /* Volapük */ - {"vro", {HB_TAG('V','R','O',' ')}}, /* Võro */ - {"wa", {HB_TAG('W','L','N',' ')}}, /* Walloon */ - {"war", {HB_TAG('W','A','R',' ')}}, /* Waray (Philippines) -> Waray-Waray */ - {"wbm", {HB_TAG('W','A',' ',' ')}}, /* Wa */ - {"wbr", {HB_TAG('W','A','G',' ')}}, /* Wagdi */ - {"wlc", {HB_TAG('C','M','R',' ')}}, /* Mwali Comorian -> Comorian */ - {"wle", {HB_TAG('S','I','G',' ')}}, /* Wolane -> Silte Gurage */ - {"wlk", {HB_TAG('A','T','H',' ')}}, /* Wailaki -> Athapaskan */ - {"wni", {HB_TAG('C','M','R',' ')}}, /* Ndzwani Comorian -> Comorian */ - {"wo", {HB_TAG('W','L','F',' ')}}, /* Wolof */ - {"wry", {HB_TAG('M','A','W',' ')}}, /* Merwari -> Marwari */ - {"wsg", {HB_TAG('G','O','N',' ')}}, /* Adilabad Gondi -> Gondi */ - {"wtm", {HB_TAG('W','T','M',' ')}}, /* Mewati */ - {"wuu", {HB_TAG('Z','H','S',' ')}}, /* Wu Chinese -> Chinese Simplified */ - {"xal", {HB_TAG('K','L','M',' '), /* Kalmyk */ - HB_TAG('T','O','D',' ')}}, /* Kalmyk -> Todo */ - {"xan", {HB_TAG('S','E','K',' ')}}, /* Xamtanga -> Sekota */ - {"xh", {HB_TAG('X','H','S',' ')}}, /* Xhosa */ - {"xjb", {HB_TAG('X','J','B',' ')}}, /* Minjungbal -> Minjangbal */ - {"xkf", {HB_TAG('X','K','F',' ')}}, /* Khengkha */ - {"xmm", {HB_TAG('M','L','Y',' ')}}, /* Manado Malay -> Malay */ - {"xmv", {HB_TAG('M','L','G',' ')}}, /* Antankarana Malagasy -> Malagasy */ - {"xmw", {HB_TAG('M','L','G',' ')}}, /* Tsimihety Malagasy -> Malagasy */ - {"xnr", {HB_TAG('D','G','R',' ')}}, /* Kangri -> Dogri */ - {"xog", {HB_TAG('X','O','G',' ')}}, /* Soga */ - {"xpe", {HB_TAG('X','P','E',' ')}}, /* Liberia Kpelle -> Kpelle (Liberia) */ - {"xsl", {HB_TAG('S','S','L',' '), /* South Slavey */ - HB_TAG('S','L','A',' '), /* South Slavey -> Slavey */ - HB_TAG('A','T','H',' ')}}, /* South Slavey -> Athapaskan */ - {"xst", {HB_TAG('S','I','G',' ')}}, /* Silt'e (retired code) -> Silte Gurage */ - {"xwo", {HB_TAG('T','O','D',' ')}}, /* Written Oirat -> Todo */ - {"yao", {HB_TAG('Y','A','O',' ')}}, /* Yao */ - {"yap", {HB_TAG('Y','A','P',' ')}}, /* Yapese */ - {"ybd", {HB_TAG('A','R','K',' ')}}, /* Yangbye (retired code) -> Rakhine */ - {"ydd", {HB_TAG('J','I','I',' ')}}, /* Eastern Yiddish -> Yiddish */ - {"yi", {HB_TAG('J','I','I',' ')}}, /* Yiddish [macrolanguage] */ - {"yih", {HB_TAG('J','I','I',' ')}}, /* Western Yiddish -> Yiddish */ - {"yo", {HB_TAG('Y','B','A',' ')}}, /* Yoruba */ - {"yos", {HB_TAG('Q','I','N',' ')}}, /* Yos (retired code) -> Chin */ - {"yrk", {HB_TAG('T','N','E',' '), /* Nenets -> Tundra Nenets */ - HB_TAG('F','N','E',' ')}}, /* Nenets -> Forest Nenets */ - {"yue", {HB_TAG('Z','H','H',' ')}}, /* Yue Chinese -> Chinese, Hong Kong SAR */ - {"za", {HB_TAG('Z','H','A',' ')}}, /* Zhuang [macrolanguage] */ - {"zch", {HB_TAG('Z','H','A',' ')}}, /* Central Hongshuihe Zhuang -> Zhuang */ - {"zdj", {HB_TAG('C','M','R',' ')}}, /* Ngazidja Comorian -> Comorian */ - {"zea", {HB_TAG('Z','E','A',' ')}}, /* Zeeuws -> Zealandic */ - {"zeh", {HB_TAG('Z','H','A',' ')}}, /* Eastern Hongshuihe Zhuang -> Zhuang */ - {"zgb", {HB_TAG('Z','H','A',' ')}}, /* Guibei Zhuang -> Zhuang */ - {"zgh", {HB_TAG('Z','G','H',' ')}}, /* Standard Moroccan Tamazight */ - {"zgm", {HB_TAG('Z','H','A',' ')}}, /* Minz Zhuang -> Zhuang */ - {"zgn", {HB_TAG('Z','H','A',' ')}}, /* Guibian Zhuang -> Zhuang */ - {"zh", {HB_TAG('Z','H','S',' ')}}, /* Chinese [macrolanguage] -> Chinese Simplified */ - {"zhd", {HB_TAG('Z','H','A',' ')}}, /* Dai Zhuang -> Zhuang */ - {"zhn", {HB_TAG('Z','H','A',' ')}}, /* Nong Zhuang -> Zhuang */ - {"zlj", {HB_TAG('Z','H','A',' ')}}, /* Liujiang Zhuang -> Zhuang */ - {"zlm", {HB_TAG('M','L','Y',' ')}}, /* Malay */ - {"zln", {HB_TAG('Z','H','A',' ')}}, /* Lianshan Zhuang -> Zhuang */ - {"zlq", {HB_TAG('Z','H','A',' ')}}, /* Liuqian Zhuang -> Zhuang */ - {"zmi", {HB_TAG('M','L','Y',' ')}}, /* Negeri Sembilan Malay -> Malay */ - {"zne", {HB_TAG('Z','N','D',' ')}}, /* Zande */ - {"zom", {HB_TAG('Q','I','N',' ')}}, /* Zou -> Chin */ - {"zqe", {HB_TAG('Z','H','A',' ')}}, /* Qiubei Zhuang -> Zhuang */ - {"zsm", {HB_TAG('M','L','Y',' ')}}, /* Standard Malay -> Malay */ - {"zu", {HB_TAG('Z','U','L',' ')}}, /* Zulu */ - {"zum", {HB_TAG('L','R','C',' ')}}, /* Kumzari -> Luri */ - {"zyb", {HB_TAG('Z','H','A',' ')}}, /* Yongbei Zhuang -> Zhuang */ - {"zyg", {HB_TAG('Z','H','A',' ')}}, /* Yang Zhuang -> Zhuang */ - {"zyj", {HB_TAG('Z','H','A',' ')}}, /* Youjiang Zhuang -> Zhuang */ - {"zyn", {HB_TAG('Z','H','A',' ')}}, /* Yongnan Zhuang -> Zhuang */ - {"zza", {HB_TAG('Z','Z','A',' ')}}, /* Zazaki [macrolanguage] */ - {"zzj", {HB_TAG('Z','H','A',' ')}}, /* Zuojiang Zhuang -> Zhuang */ + {"aa", HB_TAG('A','F','R',' ')}, /* Afar */ + {"aae", HB_TAG('S','Q','I',' ')}, /* Arbëreshë Albanian -> Albanian */ + {"aao", HB_TAG('A','R','A',' ')}, /* Algerian Saharan Arabic -> Arabic */ + {"aat", HB_TAG('S','Q','I',' ')}, /* Arvanitika Albanian -> Albanian */ + {"ab", HB_TAG('A','B','K',' ')}, /* Abkhazian */ + {"abh", HB_TAG('A','R','A',' ')}, /* Tajiki Arabic -> Arabic */ + {"abq", HB_TAG('A','B','A',' ')}, /* Abaza */ + {"abv", HB_TAG('A','R','A',' ')}, /* Baharna Arabic -> Arabic */ + {"acf", HB_TAG('F','A','N',' ')}, /* Saint Lucian Creole French -> French Antillean */ +/*{"ach", HB_TAG('A','C','H',' ')},*/ /* Acoli -> Acholi */ + {"acm", HB_TAG('A','R','A',' ')}, /* Mesopotamian Arabic -> Arabic */ + {"acq", HB_TAG('A','R','A',' ')}, /* Ta'izzi-Adeni Arabic -> Arabic */ +/*{"acr", HB_TAG('A','C','R',' ')},*/ /* Achi */ + {"acw", HB_TAG('A','R','A',' ')}, /* Hijazi Arabic -> Arabic */ + {"acx", HB_TAG('A','R','A',' ')}, /* Omani Arabic -> Arabic */ + {"acy", HB_TAG('A','R','A',' ')}, /* Cypriot Arabic -> Arabic */ + {"ada", HB_TAG('D','N','G',' ')}, /* Adangme -> Dangme */ + {"adf", HB_TAG('A','R','A',' ')}, /* Dhofari Arabic -> Arabic */ + {"adp", HB_TAG('D','Z','N',' ')}, /* Adap (retired code) -> Dzongkha */ +/*{"ady", HB_TAG('A','D','Y',' ')},*/ /* Adyghe */ + {"aeb", HB_TAG('A','R','A',' ')}, /* Tunisian Arabic -> Arabic */ + {"aec", HB_TAG('A','R','A',' ')}, /* Saidi Arabic -> Arabic */ + {"af", HB_TAG('A','F','K',' ')}, /* Afrikaans */ + {"afb", HB_TAG('A','R','A',' ')}, /* Gulf Arabic -> Arabic */ + {"ahg", HB_TAG('A','G','W',' ')}, /* Qimant -> Agaw */ + {"aht", HB_TAG('A','T','H',' ')}, /* Ahtena -> Athapaskan */ + {"aii", HB_TAG('S','W','A',' ')}, /* Assyrian Neo-Aramaic -> Swadaya Aramaic */ + {"aii", HB_TAG('S','Y','R',' ')}, /* Assyrian Neo-Aramaic -> Syriac */ +/*{"aio", HB_TAG('A','I','O',' ')},*/ /* Aiton */ + {"aiw", HB_TAG('A','R','I',' ')}, /* Aari */ + {"ajp", HB_TAG('A','R','A',' ')}, /* South Levantine Arabic -> Arabic */ + {"ak", HB_TAG('A','K','A',' ')}, /* Akan [macrolanguage] */ + {"ak", HB_TAG('T','W','I',' ')}, /* Akan [macrolanguage] -> Twi */ + {"aln", HB_TAG('S','Q','I',' ')}, /* Gheg Albanian -> Albanian */ + {"als", HB_TAG('S','Q','I',' ')}, /* Tosk Albanian -> Albanian */ +/*{"alt", HB_TAG('A','L','T',' ')},*/ /* Southern Altai -> Altai */ + {"am", HB_TAG('A','M','H',' ')}, /* Amharic */ + {"amf", HB_TAG('H','B','N',' ')}, /* Hamer-Banna -> Hammer-Banna */ + {"amw", HB_TAG('S','Y','R',' ')}, /* Western Neo-Aramaic -> Syriac */ + {"an", HB_TAG('A','R','G',' ')}, /* Aragonese */ +/*{"ang", HB_TAG('A','N','G',' ')},*/ /* Old English (ca. 450-1100) -> Anglo-Saxon */ + {"apc", HB_TAG('A','R','A',' ')}, /* North Levantine Arabic -> Arabic */ + {"apd", HB_TAG('A','R','A',' ')}, /* Sudanese Arabic -> Arabic */ + {"apj", HB_TAG('A','T','H',' ')}, /* Jicarilla Apache -> Athapaskan */ + {"apk", HB_TAG('A','T','H',' ')}, /* Kiowa Apache -> Athapaskan */ + {"apl", HB_TAG('A','T','H',' ')}, /* Lipan Apache -> Athapaskan */ + {"apm", HB_TAG('A','T','H',' ')}, /* Mescalero-Chiricahua Apache -> Athapaskan */ + {"apw", HB_TAG('A','T','H',' ')}, /* Western Apache -> Athapaskan */ + {"ar", HB_TAG('A','R','A',' ')}, /* Arabic [macrolanguage] */ + {"arb", HB_TAG('A','R','A',' ')}, /* Standard Arabic -> Arabic */ + {"arn", HB_TAG('M','A','P',' ')}, /* Mapudungun */ + {"arq", HB_TAG('A','R','A',' ')}, /* Algerian Arabic -> Arabic */ + {"ars", HB_TAG('A','R','A',' ')}, /* Najdi Arabic -> Arabic */ + {"ary", HB_TAG('M','O','R',' ')}, /* Moroccan Arabic -> Moroccan */ + {"arz", HB_TAG('A','R','A',' ')}, /* Egyptian Arabic -> Arabic */ + {"as", HB_TAG('A','S','M',' ')}, /* Assamese */ +/*{"ast", HB_TAG('A','S','T',' ')},*/ /* Asturian */ +/*{"ath", HB_TAG('A','T','H',' ')},*/ /* Athapascan [family] -> Athapaskan */ + {"atj", HB_TAG('R','C','R',' ')}, /* Atikamekw -> R-Cree */ + {"atv", HB_TAG('A','L','T',' ')}, /* Northern Altai -> Altai */ + {"auz", HB_TAG('A','R','A',' ')}, /* Uzbeki Arabic -> Arabic */ + {"av", HB_TAG('A','V','R',' ')}, /* Avaric -> Avar */ + {"avl", HB_TAG('A','R','A',' ')}, /* Eastern Egyptian Bedawi Arabic -> Arabic */ +/*{"awa", HB_TAG('A','W','A',' ')},*/ /* Awadhi */ + {"ay", HB_TAG('A','Y','M',' ')}, /* Aymara [macrolanguage] */ + {"ayc", HB_TAG('A','Y','M',' ')}, /* Southern Aymara -> Aymara */ + {"ayh", HB_TAG('A','R','A',' ')}, /* Hadrami Arabic -> Arabic */ + {"ayl", HB_TAG('A','R','A',' ')}, /* Libyan Arabic -> Arabic */ + {"ayn", HB_TAG('A','R','A',' ')}, /* Sanaani Arabic -> Arabic */ + {"ayp", HB_TAG('A','R','A',' ')}, /* North Mesopotamian Arabic -> Arabic */ + {"ayr", HB_TAG('A','Y','M',' ')}, /* Central Aymara -> Aymara */ + {"az", HB_TAG('A','Z','E',' ')}, /* Azerbaijani [macrolanguage] */ +/*{"azb", HB_TAG('A','Z','B',' ')},*/ /* South Azerbaijani -> Torki */ + {"azj", HB_TAG('A','Z','E',' ')}, /* North Azerbaijani -> Azerbaijani */ + {"ba", HB_TAG('B','S','H',' ')}, /* Bashkir */ + {"bad", HB_TAG('B','A','D','0')}, /* Banda [family] */ + {"bai", HB_TAG('B','M','L',' ')}, /* Bamileke [family] */ + {"bal", HB_TAG('B','L','I',' ')}, /* Baluchi [macrolanguage] */ +/*{"ban", HB_TAG('B','A','N',' ')},*/ /* Balinese */ +/*{"bar", HB_TAG('B','A','R',' ')},*/ /* Bavarian */ +/*{"bbc", HB_TAG('B','B','C',' ')},*/ /* Batak Toba */ + {"bbz", HB_TAG('A','R','A',' ')}, /* Babalia Creole Arabic -> Arabic */ + {"bcc", HB_TAG('B','L','I',' ')}, /* Southern Balochi -> Baluchi */ + {"bci", HB_TAG('B','A','U',' ')}, /* Baoulé -> Baulé */ + {"bcl", HB_TAG('B','I','K',' ')}, /* Central Bikol -> Bikol */ + {"bcq", HB_TAG('B','C','H',' ')}, /* Bench */ + {"bcr", HB_TAG('A','T','H',' ')}, /* Babine -> Athapaskan */ +/*{"bdy", HB_TAG('B','D','Y',' ')},*/ /* Bandjalang */ + {"be", HB_TAG('B','E','L',' ')}, /* Belarusian -> Belarussian */ + {"bea", HB_TAG('A','T','H',' ')}, /* Beaver -> Athapaskan */ + {"beb", HB_TAG('B','T','I',' ')}, /* Bebele -> Beti */ +/*{"bem", HB_TAG('B','E','M',' ')},*/ /* Bemba (Zambia) */ + {"ber", HB_TAG('B','B','R',' ')}, /* Berber [family] */ + {"bfq", HB_TAG('B','A','D',' ')}, /* Badaga */ + {"bft", HB_TAG('B','L','T',' ')}, /* Balti */ + {"bfu", HB_TAG('L','A','H',' ')}, /* Gahri -> Lahuli */ + {"bfy", HB_TAG('B','A','G',' ')}, /* Bagheli -> Baghelkhandi */ + {"bg", HB_TAG('B','G','R',' ')}, /* Bulgarian */ +/*{"bgc", HB_TAG('B','G','C',' ')},*/ /* Haryanvi */ + {"bgn", HB_TAG('B','L','I',' ')}, /* Western Balochi -> Baluchi */ + {"bgp", HB_TAG('B','L','I',' ')}, /* Eastern Balochi -> Baluchi */ +/*{"bgq", HB_TAG('B','G','Q',' ')},*/ /* Bagri */ + {"bgr", HB_TAG('Q','I','N',' ')}, /* Bawm Chin -> Chin */ + {"bhb", HB_TAG('B','H','I',' ')}, /* Bhili */ +/*{"bhi", HB_TAG('B','H','I',' ')},*/ /* Bhilali -> Bhili */ + {"bhk", HB_TAG('B','I','K',' ')}, /* Albay Bicolano (retired code) -> Bikol */ +/*{"bho", HB_TAG('B','H','O',' ')},*/ /* Bhojpuri */ + {"bhr", HB_TAG('M','L','G',' ')}, /* Bara Malagasy -> Malagasy */ + {"bi", HB_TAG('B','I','S',' ')}, /* Bislama */ +/*{"bik", HB_TAG('B','I','K',' ')},*/ /* Bikol [macrolanguage] */ + {"bin", HB_TAG('E','D','O',' ')}, /* Edo */ +/*{"bjj", HB_TAG('B','J','J',' ')},*/ /* Kanauji */ + {"bjn", HB_TAG('M','L','Y',' ')}, /* Banjar -> Malay */ + {"bjq", HB_TAG('M','L','G',' ')}, /* Southern Betsimisaraka Malagasy (retired code) -> Malagasy */ + {"bjt", HB_TAG('B','L','N',' ')}, /* Balanta-Ganja -> Balante */ + {"bla", HB_TAG('B','K','F',' ')}, /* Siksika -> Blackfoot */ + {"ble", HB_TAG('B','L','N',' ')}, /* Balanta-Kentohe -> Balante */ +/*{"blk", HB_TAG('B','L','K',' ')},*/ /* Pa’o Karen */ + {"bln", HB_TAG('B','I','K',' ')}, /* Southern Catanduanes Bikol -> Bikol */ + {"bm", HB_TAG('B','M','B',' ')}, /* Bambara (Bamanankan) */ + {"bmm", HB_TAG('M','L','G',' ')}, /* Northern Betsimisaraka Malagasy -> Malagasy */ + {"bn", HB_TAG('B','E','N',' ')}, /* Bengali */ + {"bo", HB_TAG('T','I','B',' ')}, /* Tibetan */ +/*{"bpy", HB_TAG('B','P','Y',' ')},*/ /* Bishnupriya -> Bishnupriya Manipuri */ + {"bqi", HB_TAG('L','R','C',' ')}, /* Bakhtiari -> Luri */ + {"br", HB_TAG('B','R','E',' ')}, /* Breton */ + {"bra", HB_TAG('B','R','I',' ')}, /* Braj -> Braj Bhasha */ +/*{"brh", HB_TAG('B','R','H',' ')},*/ /* Brahui */ +/*{"brx", HB_TAG('B','R','X',' ')},*/ /* Bodo (India) */ + {"bs", HB_TAG('B','O','S',' ')}, /* Bosnian */ +/*{"bsk", HB_TAG('B','S','K',' ')},*/ /* Burushaski */ + {"btb", HB_TAG('B','T','I',' ')}, /* Beti (Cameroon) (retired code) */ + {"btj", HB_TAG('M','L','Y',' ')}, /* Bacanese Malay -> Malay */ + {"bto", HB_TAG('B','I','K',' ')}, /* Rinconada Bikol -> Bikol */ +/*{"bts", HB_TAG('B','T','S',' ')},*/ /* Batak Simalungun */ +/*{"bug", HB_TAG('B','U','G',' ')},*/ /* Buginese -> Bugis */ + {"bum", HB_TAG('B','T','I',' ')}, /* Bulu (Cameroon) -> Beti */ + {"bve", HB_TAG('M','L','Y',' ')}, /* Berau Malay -> Malay */ + {"bvu", HB_TAG('M','L','Y',' ')}, /* Bukit Malay -> Malay */ + {"bxk", HB_TAG('L','U','H',' ')}, /* Bukusu -> Luyia */ + {"bxp", HB_TAG('B','T','I',' ')}, /* Bebil -> Beti */ + {"bxr", HB_TAG('R','B','U',' ')}, /* Russia Buriat -> Russian Buriat */ + {"byn", HB_TAG('B','I','L',' ')}, /* Bilin -> Bilen */ +/*{"byv", HB_TAG('B','Y','V',' ')},*/ /* Medumba */ + {"bzc", HB_TAG('M','L','G',' ')}, /* Southern Betsimisaraka Malagasy -> Malagasy */ + {"ca", HB_TAG('C','A','T',' ')}, /* Catalan */ + {"caf", HB_TAG('C','R','R',' ')}, /* Southern Carrier -> Carrier */ + {"caf", HB_TAG('A','T','H',' ')}, /* Southern Carrier -> Athapaskan */ +/*{"cak", HB_TAG('C','A','K',' ')},*/ /* Kaqchikel */ +/*{"cbk", HB_TAG('C','B','K',' ')},*/ /* Chavacano -> Zamboanga Chavacano */ + {"cbl", HB_TAG('Q','I','N',' ')}, /* Bualkhaw Chin -> Chin */ + {"cco", HB_TAG('C','C','H','N')}, /* Comaltepec Chinantec -> Chinantec */ + {"ccq", HB_TAG('A','R','K',' ')}, /* Chaungtha (retired code) -> Rakhine */ + {"cdo", HB_TAG('Z','H','S',' ')}, /* Min Dong Chinese -> Chinese Simplified */ + {"ce", HB_TAG('C','H','E',' ')}, /* Chechen */ +/*{"ceb", HB_TAG('C','E','B',' ')},*/ /* Cebuano */ + {"cfm", HB_TAG('H','A','L',' ')}, /* Halam (Falam Chin) */ +/*{"cgg", HB_TAG('C','G','G',' ')},*/ /* Chiga */ + {"ch", HB_TAG('C','H','A',' ')}, /* Chamorro */ + {"chj", HB_TAG('C','C','H','N')}, /* Ojitlán Chinantec -> Chinantec */ + {"chk", HB_TAG('C','H','K','0')}, /* Chuukese */ +/*{"cho", HB_TAG('C','H','O',' ')},*/ /* Choctaw */ + {"chp", HB_TAG('C','H','P',' ')}, /* Chipewyan */ + {"chp", HB_TAG('S','A','Y',' ')}, /* Chipewyan -> Sayisi */ + {"chp", HB_TAG('A','T','H',' ')}, /* Chipewyan -> Athapaskan */ + {"chq", HB_TAG('C','C','H','N')}, /* Quiotepec Chinantec -> Chinantec */ +/*{"chr", HB_TAG('C','H','R',' ')},*/ /* Cherokee */ +/*{"chy", HB_TAG('C','H','Y',' ')},*/ /* Cheyenne */ + {"chz", HB_TAG('C','C','H','N')}, /* Ozumacín Chinantec -> Chinantec */ + {"ciw", HB_TAG('O','J','B',' ')}, /* Chippewa -> Ojibway */ +/*{"cja", HB_TAG('C','J','A',' ')},*/ /* Western Cham */ +/*{"cjm", HB_TAG('C','J','M',' ')},*/ /* Eastern Cham */ + {"cjy", HB_TAG('Z','H','S',' ')}, /* Jinyu Chinese -> Chinese Simplified */ + {"cka", HB_TAG('Q','I','N',' ')}, /* Khumi Awa Chin (retired code) -> Chin */ + {"ckb", HB_TAG('K','U','R',' ')}, /* Central Kurdish -> Kurdish */ + {"ckt", HB_TAG('C','H','K',' ')}, /* Chukot -> Chukchi */ + {"clc", HB_TAG('A','T','H',' ')}, /* Chilcotin -> Athapaskan */ + {"cld", HB_TAG('S','Y','R',' ')}, /* Chaldean Neo-Aramaic -> Syriac */ + {"cle", HB_TAG('C','C','H','N')}, /* Lealao Chinantec -> Chinantec */ + {"cmn", HB_TAG('Z','H','S',' ')}, /* Mandarin Chinese -> Chinese Simplified */ + {"cmr", HB_TAG('Q','I','N',' ')}, /* Mro-Khimi Chin -> Chin */ + {"cnb", HB_TAG('Q','I','N',' ')}, /* Chinbon Chin -> Chin */ + {"cnh", HB_TAG('Q','I','N',' ')}, /* Hakha Chin -> Chin */ + {"cnk", HB_TAG('Q','I','N',' ')}, /* Khumi Chin -> Chin */ + {"cnl", HB_TAG('C','C','H','N')}, /* Lalana Chinantec -> Chinantec */ + {"cnt", HB_TAG('C','C','H','N')}, /* Tepetotutla Chinantec -> Chinantec */ + {"cnw", HB_TAG('Q','I','N',' ')}, /* Ngawn Chin -> Chin */ + {"co", HB_TAG('C','O','S',' ')}, /* Corsican */ + {"coa", HB_TAG('M','L','Y',' ')}, /* Cocos Islands Malay -> Malay */ +/*{"cop", HB_TAG('C','O','P',' ')},*/ /* Coptic */ + {"coq", HB_TAG('A','T','H',' ')}, /* Coquille -> Athapaskan */ + {"cpa", HB_TAG('C','C','H','N')}, /* Palantla Chinantec -> Chinantec */ + {"cpe", HB_TAG('C','P','P',' ')}, /* English-based creoles and pidgins [family] -> Creoles */ + {"cpf", HB_TAG('C','P','P',' ')}, /* French-based creoles and pidgins [family] -> Creoles */ +/*{"cpp", HB_TAG('C','P','P',' ')},*/ /* Portuguese-based creoles and pidgins [family] -> Creoles */ + {"cpx", HB_TAG('Z','H','S',' ')}, /* Pu-Xian Chinese -> Chinese Simplified */ + {"cqd", HB_TAG('H','M','N',' ')}, /* Chuanqiandian Cluster Miao -> Hmong */ + {"cqu", HB_TAG('Q','U','H',' ')}, /* Chilean Quechua (retired code) -> Quechua (Bolivia) */ + {"cr", HB_TAG('C','R','E',' ')}, /* Cree [macrolanguage] */ + {"cr", HB_TAG('Y','C','R',' ')}, /* Cree [macrolanguage] -> Y-Cree */ + {"crh", HB_TAG('C','R','T',' ')}, /* Crimean Tatar */ + {"crj", HB_TAG('E','C','R',' ')}, /* Southern East Cree -> Eastern Cree */ + {"crk", HB_TAG('W','C','R',' ')}, /* Plains Cree -> West-Cree */ + {"crl", HB_TAG('E','C','R',' ')}, /* Northern East Cree -> Eastern Cree */ + {"crm", HB_TAG('M','C','R',' ')}, /* Moose Cree */ + {"crm", HB_TAG('L','C','R',' ')}, /* Moose Cree -> L-Cree */ + {"crp", HB_TAG('C','P','P',' ')}, /* Creoles and pidgins [family] -> Creoles */ + {"crx", HB_TAG('C','R','R',' ')}, /* Carrier */ + {"crx", HB_TAG('A','T','H',' ')}, /* Carrier -> Athapaskan */ + {"cs", HB_TAG('C','S','Y',' ')}, /* Czech */ + {"csa", HB_TAG('C','C','H','N')}, /* Chiltepec Chinantec -> Chinantec */ +/*{"csb", HB_TAG('C','S','B',' ')},*/ /* Kashubian */ + {"csh", HB_TAG('Q','I','N',' ')}, /* Asho Chin -> Chin */ + {"cso", HB_TAG('C','C','H','N')}, /* Sochiapam Chinantec -> Chinantec */ + {"csw", HB_TAG('N','C','R',' ')}, /* Swampy Cree -> N-Cree */ + {"csw", HB_TAG('N','H','C',' ')}, /* Swampy Cree -> Norway House Cree */ + {"csy", HB_TAG('Q','I','N',' ')}, /* Siyin Chin -> Chin */ + {"ctc", HB_TAG('A','T','H',' ')}, /* Chetco -> Athapaskan */ + {"ctd", HB_TAG('Q','I','N',' ')}, /* Tedim Chin -> Chin */ + {"cte", HB_TAG('C','C','H','N')}, /* Tepinapa Chinantec -> Chinantec */ +/*{"ctg", HB_TAG('C','T','G',' ')},*/ /* Chittagonian */ + {"ctl", HB_TAG('C','C','H','N')}, /* Tlacoatzintepec Chinantec -> Chinantec */ + {"cts", HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol -> Bikol */ + {"cu", HB_TAG('C','S','L',' ')}, /* Church Slavonic */ + {"cuc", HB_TAG('C','C','H','N')}, /* Usila Chinantec -> Chinantec */ +/*{"cuk", HB_TAG('C','U','K',' ')},*/ /* San Blas Kuna */ + {"cv", HB_TAG('C','H','U',' ')}, /* Chuvash */ + {"cvn", HB_TAG('C','C','H','N')}, /* Valle Nacional Chinantec -> Chinantec */ + {"cwd", HB_TAG('D','C','R',' ')}, /* Woods Cree */ + {"cwd", HB_TAG('T','C','R',' ')}, /* Woods Cree -> TH-Cree */ + {"cy", HB_TAG('W','E','L',' ')}, /* Welsh */ + {"czh", HB_TAG('Z','H','S',' ')}, /* Huizhou Chinese -> Chinese Simplified */ + {"czo", HB_TAG('Z','H','S',' ')}, /* Min Zhong Chinese -> Chinese Simplified */ + {"czt", HB_TAG('Q','I','N',' ')}, /* Zotung Chin -> Chin */ + {"da", HB_TAG('D','A','N',' ')}, /* Danish */ + {"dao", HB_TAG('Q','I','N',' ')}, /* Daai Chin -> Chin */ + {"dap", HB_TAG('N','I','S',' ')}, /* Nisi (India) (retired code) */ +/*{"dar", HB_TAG('D','A','R',' ')},*/ /* Dargwa */ +/*{"dax", HB_TAG('D','A','X',' ')},*/ /* Dayi */ + {"de", HB_TAG('D','E','U',' ')}, /* German */ + {"den", HB_TAG('S','L','A',' ')}, /* Slave (Athapascan) [macrolanguage] -> Slavey */ + {"den", HB_TAG('A','T','H',' ')}, /* Slave (Athapascan) [macrolanguage] -> Athapaskan */ +/*{"dgo", HB_TAG('D','G','O',' ')},*/ /* Dogri */ + {"dgr", HB_TAG('A','T','H',' ')}, /* Dogrib -> Athapaskan */ + {"dhd", HB_TAG('M','A','W',' ')}, /* Dhundari -> Marwari */ +/*{"dhg", HB_TAG('D','H','G',' ')},*/ /* Dhangu */ + {"dib", HB_TAG('D','N','K',' ')}, /* South Central Dinka -> Dinka */ + {"dik", HB_TAG('D','N','K',' ')}, /* Southwestern Dinka -> Dinka */ + {"din", HB_TAG('D','N','K',' ')}, /* Dinka [macrolanguage] */ + {"dip", HB_TAG('D','N','K',' ')}, /* Northeastern Dinka -> Dinka */ +/*{"diq", HB_TAG('D','I','Q',' ')},*/ /* Dimli */ + {"diw", HB_TAG('D','N','K',' ')}, /* Northwestern Dinka -> Dinka */ + {"dje", HB_TAG('D','J','R',' ')}, /* Zarma */ + {"djr", HB_TAG('D','J','R','0')}, /* Djambarrpuyngu */ + {"dks", HB_TAG('D','N','K',' ')}, /* Southeastern Dinka -> Dinka */ + {"dng", HB_TAG('D','U','N',' ')}, /* Dungan */ +/*{"dnj", HB_TAG('D','N','J',' ')},*/ /* Dan */ + {"doi", HB_TAG('D','G','R',' ')}, /* Dogri [macrolanguage] */ + {"drh", HB_TAG('M','N','G',' ')}, /* Darkhat (retired code) -> Mongolian */ + {"drw", HB_TAG('D','R','I',' ')}, /* Darwazi (retired code) -> Dari */ + {"dsb", HB_TAG('L','S','B',' ')}, /* Lower Sorbian */ + {"dty", HB_TAG('N','E','P',' ')}, /* Dotyali -> Nepali */ +/*{"duj", HB_TAG('D','U','J',' ')},*/ /* Dhuwal (retired code) */ + {"dup", HB_TAG('M','L','Y',' ')}, /* Duano -> Malay */ + {"dv", HB_TAG('D','I','V',' ')}, /* Divehi (Dhivehi, Maldivian) */ + {"dv", HB_TAG('D','H','V',' ')}, /* Divehi (Dhivehi, Maldivian) (deprecated) */ + {"dwu", HB_TAG('D','U','J',' ')}, /* Dhuwal */ + {"dwy", HB_TAG('D','U','J',' ')}, /* Dhuwaya -> Dhuwal */ + {"dyu", HB_TAG('J','U','L',' ')}, /* Dyula -> Jula */ + {"dz", HB_TAG('D','Z','N',' ')}, /* Dzongkha */ + {"ee", HB_TAG('E','W','E',' ')}, /* Ewe */ +/*{"efi", HB_TAG('E','F','I',' ')},*/ /* Efik */ + {"ekk", HB_TAG('E','T','I',' ')}, /* Standard Estonian -> Estonian */ + {"el", HB_TAG('E','L','L',' ')}, /* Modern Greek (1453-) -> Greek */ + {"emk", HB_TAG('E','M','K',' ')}, /* Eastern Maninkakan */ + {"emk", HB_TAG('M','N','K',' ')}, /* Eastern Maninkakan -> Maninka */ + {"en", HB_TAG('E','N','G',' ')}, /* English */ + {"enb", HB_TAG('K','A','L',' ')}, /* Markweeta -> Kalenjin */ + {"enf", HB_TAG('F','N','E',' ')}, /* Forest Enets -> Forest Nenets */ + {"enh", HB_TAG('T','N','E',' ')}, /* Tundra Enets -> Tundra Nenets */ + {"eo", HB_TAG('N','T','O',' ')}, /* Esperanto */ + {"es", HB_TAG('E','S','P',' ')}, /* Spanish */ + {"esg", HB_TAG('G','O','N',' ')}, /* Aheri Gondi -> Gondi */ + {"esi", HB_TAG('I','P','K',' ')}, /* North Alaskan Inupiatun -> Inupiat */ + {"esk", HB_TAG('I','P','K',' ')}, /* Northwest Alaska Inupiatun -> Inupiat */ +/*{"esu", HB_TAG('E','S','U',' ')},*/ /* Central Yupik */ + {"et", HB_TAG('E','T','I',' ')}, /* Estonian [macrolanguage] */ + {"eto", HB_TAG('B','T','I',' ')}, /* Eton (Cameroon) -> Beti */ + {"eu", HB_TAG('E','U','Q',' ')}, /* Basque */ + {"eve", HB_TAG('E','V','N',' ')}, /* Even */ + {"evn", HB_TAG('E','V','K',' ')}, /* Evenki */ + {"ewo", HB_TAG('B','T','I',' ')}, /* Ewondo -> Beti */ + {"eyo", HB_TAG('K','A','L',' ')}, /* Keiyo -> Kalenjin */ + {"fa", HB_TAG('F','A','R',' ')}, /* Persian [macrolanguage] */ + {"fan", HB_TAG('F','A','N','0')}, /* Fang (Equatorial Guinea) */ +/*{"fat", HB_TAG('F','A','T',' ')},*/ /* Fanti */ + {"fbl", HB_TAG('B','I','K',' ')}, /* West Albay Bikol -> Bikol */ + {"ff", HB_TAG('F','U','L',' ')}, /* Fulah [macrolanguage] */ + {"ffm", HB_TAG('F','U','L',' ')}, /* Maasina Fulfulde -> Fulah */ + {"fi", HB_TAG('F','I','N',' ')}, /* Finnish */ + {"fil", HB_TAG('P','I','L',' ')}, /* Filipino */ + {"fj", HB_TAG('F','J','I',' ')}, /* Fijian */ + {"flm", HB_TAG('H','A','L',' ')}, /* Halam (Falam Chin) (retired code) */ + {"flm", HB_TAG('Q','I','N',' ')}, /* Falam Chin (retired code) -> Chin */ +/*{"fmp", HB_TAG('F','M','P',' ')},*/ /* Fe’fe’ */ + {"fo", HB_TAG('F','O','S',' ')}, /* Faroese */ +/*{"fon", HB_TAG('F','O','N',' ')},*/ /* Fon */ + {"fr", HB_TAG('F','R','A',' ')}, /* French */ +/*{"frc", HB_TAG('F','R','C',' ')},*/ /* Cajun French */ +/*{"frp", HB_TAG('F','R','P',' ')},*/ /* Arpitan */ + {"fub", HB_TAG('F','U','L',' ')}, /* Adamawa Fulfulde -> Fulah */ + {"fuc", HB_TAG('F','U','L',' ')}, /* Pulaar -> Fulah */ + {"fue", HB_TAG('F','U','L',' ')}, /* Borgu Fulfulde -> Fulah */ + {"fuf", HB_TAG('F','T','A',' ')}, /* Pular -> Futa */ + {"fuh", HB_TAG('F','U','L',' ')}, /* Western Niger Fulfulde -> Fulah */ + {"fui", HB_TAG('F','U','L',' ')}, /* Bagirmi Fulfulde -> Fulah */ + {"fuq", HB_TAG('F','U','L',' ')}, /* Central-Eastern Niger Fulfulde -> Fulah */ + {"fur", HB_TAG('F','R','L',' ')}, /* Friulian */ +/*{"fuv", HB_TAG('F','U','V',' ')},*/ /* Nigerian Fulfulde */ + {"fy", HB_TAG('F','R','I',' ')}, /* Western Frisian -> Frisian */ + {"ga", HB_TAG('I','R','I',' ')}, /* Irish */ + {"gaa", HB_TAG('G','A','D',' ')}, /* Ga */ +/*{"gag", HB_TAG('G','A','G',' ')},*/ /* Gagauz */ + {"gan", HB_TAG('Z','H','S',' ')}, /* Gan Chinese -> Chinese Simplified */ + {"gax", HB_TAG('O','R','O',' ')}, /* Borana-Arsi-Guji Oromo -> Oromo */ + {"gaz", HB_TAG('O','R','O',' ')}, /* West Central Oromo -> Oromo */ + {"gbm", HB_TAG('G','A','W',' ')}, /* Garhwali */ + {"gce", HB_TAG('A','T','H',' ')}, /* Galice -> Athapaskan */ + {"gd", HB_TAG('G','A','E',' ')}, /* Scottish Gaelic (Gaelic) */ + {"gda", HB_TAG('R','A','J',' ')}, /* Gade Lohar -> Rajasthani */ +/*{"gez", HB_TAG('G','E','Z',' ')},*/ /* Geez */ + {"ggo", HB_TAG('G','O','N',' ')}, /* Southern Gondi (retired code) -> Gondi */ +/*{"gih", HB_TAG('G','I','H',' ')},*/ /* Githabul */ + {"gil", HB_TAG('G','I','L','0')}, /* Kiribati (Gilbertese) */ + {"gju", HB_TAG('R','A','J',' ')}, /* Gujari -> Rajasthani */ +/*{"gkp", HB_TAG('G','K','P',' ')},*/ /* Guinea Kpelle -> Kpelle (Guinea) */ + {"gl", HB_TAG('G','A','L',' ')}, /* Galician */ + {"gld", HB_TAG('N','A','N',' ')}, /* Nanai */ +/*{"glk", HB_TAG('G','L','K',' ')},*/ /* Gilaki */ + {"gn", HB_TAG('G','U','A',' ')}, /* Guarani [macrolanguage] */ +/*{"gnn", HB_TAG('G','N','N',' ')},*/ /* Gumatj */ + {"gno", HB_TAG('G','O','N',' ')}, /* Northern Gondi -> Gondi */ + {"gnw", HB_TAG('G','U','A',' ')}, /* Western Bolivian Guaraní -> Guarani */ +/*{"gog", HB_TAG('G','O','G',' ')},*/ /* Gogo */ + {"gom", HB_TAG('K','O','K',' ')}, /* Goan Konkani -> Konkani */ +/*{"gon", HB_TAG('G','O','N',' ')},*/ /* Gondi [macrolanguage] */ + {"grt", HB_TAG('G','R','O',' ')}, /* Garo */ + {"gru", HB_TAG('S','O','G',' ')}, /* Kistane -> Sodo Gurage */ + {"gsw", HB_TAG('A','L','S',' ')}, /* Alsatian */ + {"gu", HB_TAG('G','U','J',' ')}, /* Gujarati */ +/*{"guc", HB_TAG('G','U','C',' ')},*/ /* Wayuu */ +/*{"guf", HB_TAG('G','U','F',' ')},*/ /* Gupapuyngu */ + {"gug", HB_TAG('G','U','A',' ')}, /* Paraguayan Guaraní -> Guarani */ + {"gui", HB_TAG('G','U','A',' ')}, /* Eastern Bolivian Guaraní -> Guarani */ + {"guk", HB_TAG('G','M','Z',' ')}, /* Gumuz */ + {"guk", HB_TAG('G','U','K',' ')}, /* Gumuz (SIL fonts) */ + {"gun", HB_TAG('G','U','A',' ')}, /* Mbyá Guaraní -> Guarani */ +/*{"guz", HB_TAG('G','U','Z',' ')},*/ /* Gusii */ + {"gv", HB_TAG('M','N','X',' ')}, /* Manx */ + {"gwi", HB_TAG('A','T','H',' ')}, /* Gwichʼin -> Athapaskan */ + {"ha", HB_TAG('H','A','U',' ')}, /* Hausa */ + {"haa", HB_TAG('A','T','H',' ')}, /* Han -> Athapaskan */ + {"hae", HB_TAG('O','R','O',' ')}, /* Eastern Oromo -> Oromo */ + {"hak", HB_TAG('Z','H','S',' ')}, /* Hakka Chinese -> Chinese Simplified */ + {"har", HB_TAG('H','R','I',' ')}, /* Harari */ +/*{"haw", HB_TAG('H','A','W',' ')},*/ /* Hawaiian */ +/*{"hay", HB_TAG('H','A','Y',' ')},*/ /* Haya */ +/*{"haz", HB_TAG('H','A','Z',' ')},*/ /* Hazaragi */ + {"he", HB_TAG('I','W','R',' ')}, /* Hebrew */ + {"hea", HB_TAG('H','M','N',' ')}, /* Northern Qiandong Miao -> Hmong */ + {"hi", HB_TAG('H','I','N',' ')}, /* Hindi */ +/*{"hil", HB_TAG('H','I','L',' ')},*/ /* Hiligaynon */ + {"hji", HB_TAG('M','L','Y',' ')}, /* Haji -> Malay */ + {"hlt", HB_TAG('Q','I','N',' ')}, /* Matu Chin -> Chin */ + {"hma", HB_TAG('H','M','N',' ')}, /* Southern Mashan Hmong -> Hmong */ + {"hmc", HB_TAG('H','M','N',' ')}, /* Central Huishui Hmong -> Hmong */ + {"hmd", HB_TAG('H','M','N',' ')}, /* Large Flowery Miao -> Hmong */ + {"hme", HB_TAG('H','M','N',' ')}, /* Eastern Huishui Hmong -> Hmong */ + {"hmg", HB_TAG('H','M','N',' ')}, /* Southwestern Guiyang Hmong -> Hmong */ + {"hmh", HB_TAG('H','M','N',' ')}, /* Southwestern Huishui Hmong -> Hmong */ + {"hmi", HB_TAG('H','M','N',' ')}, /* Northern Huishui Hmong -> Hmong */ + {"hmj", HB_TAG('H','M','N',' ')}, /* Ge -> Hmong */ + {"hml", HB_TAG('H','M','N',' ')}, /* Luopohe Hmong -> Hmong */ + {"hmm", HB_TAG('H','M','N',' ')}, /* Central Mashan Hmong -> Hmong */ +/*{"hmn", HB_TAG('H','M','N',' ')},*/ /* Hmong [macrolanguage] */ + {"hmp", HB_TAG('H','M','N',' ')}, /* Northern Mashan Hmong -> Hmong */ + {"hmq", HB_TAG('H','M','N',' ')}, /* Eastern Qiandong Miao -> Hmong */ + {"hms", HB_TAG('H','M','N',' ')}, /* Southern Qiandong Miao -> Hmong */ + {"hmw", HB_TAG('H','M','N',' ')}, /* Western Mashan Hmong -> Hmong */ + {"hmy", HB_TAG('H','M','N',' ')}, /* Southern Guiyang Hmong -> Hmong */ + {"hmz", HB_TAG('H','M','N',' ')}, /* Hmong Shua -> Hmong */ +/*{"hnd", HB_TAG('H','N','D',' ')},*/ /* Southern Hindko -> Hindko */ + {"hne", HB_TAG('C','H','H',' ')}, /* Chhattisgarhi -> Chattisgarhi */ + {"hnj", HB_TAG('H','M','N',' ')}, /* Hmong Njua -> Hmong */ + {"hno", HB_TAG('H','N','D',' ')}, /* Northern Hindko -> Hindko */ + {"ho", HB_TAG('H','M','O',' ')}, /* Hiri Motu */ + {"hoc", HB_TAG('H','O',' ',' ')}, /* Ho */ + {"hoi", HB_TAG('A','T','H',' ')}, /* Holikachuk -> Athapaskan */ + {"hoj", HB_TAG('H','A','R',' ')}, /* Hadothi -> Harauti */ + {"hr", HB_TAG('H','R','V',' ')}, /* Croatian */ + {"hrm", HB_TAG('H','M','N',' ')}, /* Horned Miao -> Hmong */ + {"hsb", HB_TAG('U','S','B',' ')}, /* Upper Sorbian */ + {"hsn", HB_TAG('Z','H','S',' ')}, /* Xiang Chinese -> Chinese Simplified */ + {"ht", HB_TAG('H','A','I',' ')}, /* Haitian (Haitian Creole) */ + {"hu", HB_TAG('H','U','N',' ')}, /* Hungarian */ + {"huj", HB_TAG('H','M','N',' ')}, /* Northern Guiyang Hmong -> Hmong */ + {"hup", HB_TAG('A','T','H',' ')}, /* Hupa -> Athapaskan */ + {"hy", HB_TAG('H','Y','E','0')}, /* Armenian -> Armenian East */ + {"hy", HB_TAG('H','Y','E',' ')}, /* Armenian */ + {"hyw", HB_TAG('H','Y','E',' ')}, /* Western Armenian -> Armenian */ + {"hz", HB_TAG('H','E','R',' ')}, /* Herero */ + {"ia", HB_TAG('I','N','A',' ')}, /* Interlingua (International Auxiliary Language Association) */ +/*{"iba", HB_TAG('I','B','A',' ')},*/ /* Iban */ +/*{"ibb", HB_TAG('I','B','B',' ')},*/ /* Ibibio */ + {"id", HB_TAG('I','N','D',' ')}, /* Indonesian */ + {"ida", HB_TAG('L','U','H',' ')}, /* Idakho-Isukha-Tiriki -> Luyia */ + {"ie", HB_TAG('I','L','E',' ')}, /* Interlingue */ + {"ig", HB_TAG('I','B','O',' ')}, /* Igbo */ + {"igb", HB_TAG('E','B','I',' ')}, /* Ebira */ + {"ii", HB_TAG('Y','I','M',' ')}, /* Sichuan Yi -> Yi Modern */ + {"ijc", HB_TAG('I','J','O',' ')}, /* Izon -> Ijo */ +/*{"ijo", HB_TAG('I','J','O',' ')},*/ /* Ijo [family] */ + {"ik", HB_TAG('I','P','K',' ')}, /* Inupiaq [macrolanguage] -> Inupiat */ + {"ike", HB_TAG('I','N','U',' ')}, /* Eastern Canadian Inuktitut -> Inuktitut */ + {"ikt", HB_TAG('I','N','U',' ')}, /* Inuinnaqtun -> Inuktitut */ +/*{"ilo", HB_TAG('I','L','O',' ')},*/ /* Iloko -> Ilokano */ + {"in", HB_TAG('I','N','D',' ')}, /* Indonesian (retired code) */ + {"ing", HB_TAG('A','T','H',' ')}, /* Degexit'an -> Athapaskan */ + {"inh", HB_TAG('I','N','G',' ')}, /* Ingush */ + {"io", HB_TAG('I','D','O',' ')}, /* Ido */ + {"is", HB_TAG('I','S','L',' ')}, /* Icelandic */ + {"it", HB_TAG('I','T','A',' ')}, /* Italian */ + {"iu", HB_TAG('I','N','U',' ')}, /* Inuktitut [macrolanguage] */ + {"iw", HB_TAG('I','W','R',' ')}, /* Hebrew (retired code) */ + {"ja", HB_TAG('J','A','N',' ')}, /* Japanese */ + {"jak", HB_TAG('M','L','Y',' ')}, /* Jakun -> Malay */ +/*{"jam", HB_TAG('J','A','M',' ')},*/ /* Jamaican Creole English -> Jamaican Creole */ + {"jax", HB_TAG('M','L','Y',' ')}, /* Jambi Malay -> Malay */ +/*{"jbo", HB_TAG('J','B','O',' ')},*/ /* Lojban */ +/*{"jct", HB_TAG('J','C','T',' ')},*/ /* Krymchak */ + {"ji", HB_TAG('J','I','I',' ')}, /* Yiddish (retired code) */ + {"jv", HB_TAG('J','A','V',' ')}, /* Javanese */ + {"jw", HB_TAG('J','A','V',' ')}, /* Javanese (retired code) */ + {"ka", HB_TAG('K','A','T',' ')}, /* Georgian */ + {"kaa", HB_TAG('K','R','K',' ')}, /* Kara-Kalpak -> Karakalpak */ + {"kab", HB_TAG('K','A','B','0')}, /* Kabyle */ + {"kam", HB_TAG('K','M','B',' ')}, /* Kamba (Kenya) */ + {"kar", HB_TAG('K','R','N',' ')}, /* Karen [family] */ + {"kbd", HB_TAG('K','A','B',' ')}, /* Kabardian */ + {"kby", HB_TAG('K','N','R',' ')}, /* Manga Kanuri -> Kanuri */ + {"kca", HB_TAG('K','H','K',' ')}, /* Khanty -> Khanty-Kazim */ + {"kca", HB_TAG('K','H','S',' ')}, /* Khanty -> Khanty-Shurishkar */ + {"kca", HB_TAG('K','H','V',' ')}, /* Khanty -> Khanty-Vakhi */ +/*{"kde", HB_TAG('K','D','E',' ')},*/ /* Makonde */ + {"kdr", HB_TAG('K','R','M',' ')}, /* Karaim */ + {"kdt", HB_TAG('K','U','Y',' ')}, /* Kuy */ +/*{"kea", HB_TAG('K','E','A',' ')},*/ /* Kabuverdianu (Crioulo) */ +/*{"kek", HB_TAG('K','E','K',' ')},*/ /* Kekchi */ + {"kex", HB_TAG('K','K','N',' ')}, /* Kukna -> Kokni */ + {"kfa", HB_TAG('K','O','D',' ')}, /* Kodava -> Kodagu */ + {"kfr", HB_TAG('K','A','C',' ')}, /* Kachhi -> Kachchi */ + {"kfx", HB_TAG('K','U','L',' ')}, /* Kullu Pahari -> Kulvi */ + {"kfy", HB_TAG('K','M','N',' ')}, /* Kumaoni */ + {"kg", HB_TAG('K','O','N','0')}, /* Kongo [macrolanguage] */ + {"kha", HB_TAG('K','S','I',' ')}, /* Khasi */ + {"khb", HB_TAG('X','B','D',' ')}, /* Lü */ + {"khk", HB_TAG('M','N','G',' ')}, /* Halh Mongolian -> Mongolian */ + {"kht", HB_TAG('K','H','N',' ')}, /* Khamti -> Khamti Shan (Microsoft fonts) */ + {"kht", HB_TAG('K','H','T',' ')}, /* Khamti -> Khamti Shan (OpenType spec and SIL fonts) */ +/*{"khw", HB_TAG('K','H','W',' ')},*/ /* Khowar */ + {"ki", HB_TAG('K','I','K',' ')}, /* Kikuyu (Gikuyu) */ +/*{"kiu", HB_TAG('K','I','U',' ')},*/ /* Kirmanjki */ + {"kj", HB_TAG('K','U','A',' ')}, /* Kuanyama */ +/*{"kjd", HB_TAG('K','J','D',' ')},*/ /* Southern Kiwai */ + {"kjh", HB_TAG('K','H','A',' ')}, /* Khakas -> Khakass */ +/*{"kjp", HB_TAG('K','J','P',' ')},*/ /* Pwo Eastern Karen -> Eastern Pwo Karen */ +/*{"kjz", HB_TAG('K','J','Z',' ')},*/ /* Bumthangkha */ + {"kk", HB_TAG('K','A','Z',' ')}, /* Kazakh */ + {"kkz", HB_TAG('A','T','H',' ')}, /* Kaska -> Athapaskan */ + {"kl", HB_TAG('G','R','N',' ')}, /* Greenlandic */ + {"kln", HB_TAG('K','A','L',' ')}, /* Kalenjin [macrolanguage] */ + {"km", HB_TAG('K','H','M',' ')}, /* Khmer */ + {"kmb", HB_TAG('M','B','N',' ')}, /* Kimbundu -> Mbundu */ + {"kmr", HB_TAG('K','U','R',' ')}, /* Northern Kurdish -> Kurdish */ + {"kmw", HB_TAG('K','M','O',' ')}, /* Komo (Democratic Republic of Congo) */ +/*{"kmz", HB_TAG('K','M','Z',' ')},*/ /* Khorasani Turkish -> Khorasani Turkic */ + {"kn", HB_TAG('K','A','N',' ')}, /* Kannada */ + {"knc", HB_TAG('K','N','R',' ')}, /* Central Kanuri -> Kanuri */ + {"kng", HB_TAG('K','O','N','0')}, /* Koongo -> Kongo */ + {"knn", HB_TAG('K','O','K',' ')}, /* Konkani */ + {"ko", HB_TAG('K','O','R',' ')}, /* Korean */ + {"koi", HB_TAG('K','O','P',' ')}, /* Komi-Permyak */ +/*{"kok", HB_TAG('K','O','K',' ')},*/ /* Konkani [macrolanguage] */ +/*{"kos", HB_TAG('K','O','S',' ')},*/ /* Kosraean */ + {"koy", HB_TAG('A','T','H',' ')}, /* Koyukon -> Athapaskan */ + {"kpe", HB_TAG('K','P','L',' ')}, /* Kpelle [macrolanguage] */ + {"kpv", HB_TAG('K','O','Z',' ')}, /* Komi-Zyrian */ + {"kpy", HB_TAG('K','Y','K',' ')}, /* Koryak */ + {"kqs", HB_TAG('K','I','S',' ')}, /* Northern Kissi -> Kisii */ + {"kqy", HB_TAG('K','R','T',' ')}, /* Koorete */ + {"kr", HB_TAG('K','N','R',' ')}, /* Kanuri [macrolanguage] */ + {"krc", HB_TAG('K','A','R',' ')}, /* Karachay-Balkar -> Karachay */ + {"krc", HB_TAG('B','A','L',' ')}, /* Karachay-Balkar -> Balkar */ +/*{"kri", HB_TAG('K','R','I',' ')},*/ /* Krio */ +/*{"krl", HB_TAG('K','R','L',' ')},*/ /* Karelian */ + {"krt", HB_TAG('K','N','R',' ')}, /* Tumari Kanuri -> Kanuri */ + {"kru", HB_TAG('K','U','U',' ')}, /* Kurukh */ + {"ks", HB_TAG('K','S','H',' ')}, /* Kashmiri */ + {"ksh", HB_TAG('K','S','H','0')}, /* Kölsch -> Ripuarian */ + {"kss", HB_TAG('K','I','S',' ')}, /* Southern Kisi -> Kisii */ +/*{"ksw", HB_TAG('K','S','W',' ')},*/ /* S’gaw Karen */ + {"ktb", HB_TAG('K','E','B',' ')}, /* Kambaata -> Kebena */ + {"ktu", HB_TAG('K','O','N',' ')}, /* Kituba (Democratic Republic of Congo) -> Kikongo */ + {"ktw", HB_TAG('A','T','H',' ')}, /* Kato -> Athapaskan */ + {"ku", HB_TAG('K','U','R',' ')}, /* Kurdish [macrolanguage] */ +/*{"kum", HB_TAG('K','U','M',' ')},*/ /* Kumyk */ + {"kuu", HB_TAG('A','T','H',' ')}, /* Upper Kuskokwim -> Athapaskan */ + {"kv", HB_TAG('K','O','M',' ')}, /* Komi [macrolanguage] */ + {"kvb", HB_TAG('M','L','Y',' ')}, /* Kubu -> Malay */ + {"kvr", HB_TAG('M','L','Y',' ')}, /* Kerinci -> Malay */ + {"kw", HB_TAG('C','O','R',' ')}, /* Cornish */ + {"kwy", HB_TAG('K','O','N','0')}, /* San Salvador Kongo -> Kongo */ + {"kxc", HB_TAG('K','M','S',' ')}, /* Konso -> Komso */ + {"kxd", HB_TAG('M','L','Y',' ')}, /* Brunei -> Malay */ + {"kxu", HB_TAG('K','U','I',' ')}, /* Kui (India) */ + {"ky", HB_TAG('K','I','R',' ')}, /* Kirghiz (Kyrgyz) */ +/*{"kyu", HB_TAG('K','Y','U',' ')},*/ /* Western Kayah */ + {"la", HB_TAG('L','A','T',' ')}, /* Latin */ + {"lad", HB_TAG('J','U','D',' ')}, /* Ladino */ + {"lb", HB_TAG('L','T','Z',' ')}, /* Luxembourgish */ + {"lbe", HB_TAG('L','A','K',' ')}, /* Lak */ + {"lbj", HB_TAG('L','D','K',' ')}, /* Ladakhi */ + {"lbl", HB_TAG('B','I','K',' ')}, /* Libon Bikol -> Bikol */ + {"lce", HB_TAG('M','L','Y',' ')}, /* Loncong -> Malay */ + {"lcf", HB_TAG('M','L','Y',' ')}, /* Lubu -> Malay */ + {"ldi", HB_TAG('K','O','N','0')}, /* Laari -> Kongo */ +/*{"lez", HB_TAG('L','E','Z',' ')},*/ /* Lezghian -> Lezgi */ + {"lg", HB_TAG('L','U','G',' ')}, /* Ganda */ + {"li", HB_TAG('L','I','M',' ')}, /* Limburgish */ + {"lif", HB_TAG('L','M','B',' ')}, /* Limbu */ +/*{"lij", HB_TAG('L','I','J',' ')},*/ /* Ligurian */ +/*{"lis", HB_TAG('L','I','S',' ')},*/ /* Lisu */ + {"liw", HB_TAG('M','L','Y',' ')}, /* Col -> Malay */ +/*{"ljp", HB_TAG('L','J','P',' ')},*/ /* Lampung Api -> Lampung */ + {"lkb", HB_TAG('L','U','H',' ')}, /* Kabras -> Luyia */ +/*{"lki", HB_TAG('L','K','I',' ')},*/ /* Laki */ + {"lko", HB_TAG('L','U','H',' ')}, /* Khayo -> Luyia */ + {"lks", HB_TAG('L','U','H',' ')}, /* Kisa -> Luyia */ + {"lld", HB_TAG('L','A','D',' ')}, /* Ladin */ + {"lmn", HB_TAG('L','A','M',' ')}, /* Lambadi -> Lambani */ +/*{"lmo", HB_TAG('L','M','O',' ')},*/ /* Lombard */ + {"ln", HB_TAG('L','I','N',' ')}, /* Lingala */ + {"lo", HB_TAG('L','A','O',' ')}, /* Lao */ +/*{"lom", HB_TAG('L','O','M',' ')},*/ /* Loma (Liberia) */ +/*{"lrc", HB_TAG('L','R','C',' ')},*/ /* Northern Luri -> Luri */ + {"lri", HB_TAG('L','U','H',' ')}, /* Marachi -> Luyia */ + {"lrm", HB_TAG('L','U','H',' ')}, /* Marama -> Luyia */ + {"lsm", HB_TAG('L','U','H',' ')}, /* Saamia -> Luyia */ + {"lt", HB_TAG('L','T','H',' ')}, /* Lithuanian */ + {"ltg", HB_TAG('L','V','I',' ')}, /* Latgalian -> Latvian */ + {"lto", HB_TAG('L','U','H',' ')}, /* Tsotso -> Luyia */ + {"lts", HB_TAG('L','U','H',' ')}, /* Tachoni -> Luyia */ + {"lu", HB_TAG('L','U','B',' ')}, /* Luba-Katanga */ +/*{"lua", HB_TAG('L','U','A',' ')},*/ /* Luba-Lulua */ +/*{"luo", HB_TAG('L','U','O',' ')},*/ /* Luo (Kenya and Tanzania) */ + {"lus", HB_TAG('M','I','Z',' ')}, /* Lushai -> Mizo */ + {"luy", HB_TAG('L','U','H',' ')}, /* Luyia [macrolanguage] */ + {"luz", HB_TAG('L','R','C',' ')}, /* Southern Luri -> Luri */ + {"lv", HB_TAG('L','V','I',' ')}, /* Latvian [macrolanguage] */ + {"lvs", HB_TAG('L','V','I',' ')}, /* Standard Latvian -> Latvian */ + {"lwg", HB_TAG('L','U','H',' ')}, /* Wanga -> Luyia */ + {"lzh", HB_TAG('Z','H','T',' ')}, /* Literary Chinese -> Chinese Traditional */ + {"lzz", HB_TAG('L','A','Z',' ')}, /* Laz */ +/*{"mad", HB_TAG('M','A','D',' ')},*/ /* Madurese -> Madura */ +/*{"mag", HB_TAG('M','A','G',' ')},*/ /* Magahi */ + {"mai", HB_TAG('M','T','H',' ')}, /* Maithili */ + {"mak", HB_TAG('M','K','R',' ')}, /* Makasar */ +/*{"mam", HB_TAG('M','A','M',' ')},*/ /* Mam */ + {"man", HB_TAG('M','N','K',' ')}, /* Mandingo [macrolanguage] -> Maninka */ + {"max", HB_TAG('M','L','Y',' ')}, /* North Moluccan Malay -> Malay */ +/*{"mbo", HB_TAG('M','B','O',' ')},*/ /* Mbo (Cameroon) */ + {"mct", HB_TAG('B','T','I',' ')}, /* Mengisa -> Beti */ + {"mdf", HB_TAG('M','O','K',' ')}, /* Moksha */ +/*{"mdr", HB_TAG('M','D','R',' ')},*/ /* Mandar */ + {"mdy", HB_TAG('M','L','E',' ')}, /* Male (Ethiopia) */ + {"men", HB_TAG('M','D','E',' ')}, /* Mende (Sierra Leone) */ + {"meo", HB_TAG('M','L','Y',' ')}, /* Kedah Malay -> Malay */ +/*{"mer", HB_TAG('M','E','R',' ')},*/ /* Meru */ +/*{"mfa", HB_TAG('M','F','A',' ')},*/ /* Pattani Malay */ + {"mfb", HB_TAG('M','L','Y',' ')}, /* Bangka -> Malay */ +/*{"mfe", HB_TAG('M','F','E',' ')},*/ /* Morisyen */ + {"mg", HB_TAG('M','L','G',' ')}, /* Malagasy [macrolanguage] */ + {"mh", HB_TAG('M','A','H',' ')}, /* Marshallese */ + {"mhr", HB_TAG('L','M','A',' ')}, /* Eastern Mari -> Low Mari */ + {"mhv", HB_TAG('A','R','K',' ')}, /* Arakanese (retired code) -> Rakhine */ + {"mi", HB_TAG('M','R','I',' ')}, /* Maori */ +/*{"min", HB_TAG('M','I','N',' ')},*/ /* Minangkabau */ + {"mk", HB_TAG('M','K','D',' ')}, /* Macedonian */ + {"mku", HB_TAG('M','N','K',' ')}, /* Konyanka Maninka -> Maninka */ +/*{"mkw", HB_TAG('M','K','W',' ')},*/ /* Kituba (Congo) */ + {"ml", HB_TAG('M','A','L',' ')}, /* Malayalam -> Malayalam Traditional */ + {"ml", HB_TAG('M','L','R',' ')}, /* Malayalam -> Malayalam Reformed */ + {"mlq", HB_TAG('M','L','N',' ')}, /* Western Maninkakan -> Malinke */ + {"mlq", HB_TAG('M','N','K',' ')}, /* Western Maninkakan -> Maninka */ + {"mmr", HB_TAG('H','M','N',' ')}, /* Western Xiangxi Miao -> Hmong */ + {"mn", HB_TAG('M','N','G',' ')}, /* Mongolian [macrolanguage] */ + {"mnc", HB_TAG('M','C','H',' ')}, /* Manchu */ +/*{"mni", HB_TAG('M','N','I',' ')},*/ /* Manipuri */ + {"mnk", HB_TAG('M','N','D',' ')}, /* Mandinka */ + {"mnk", HB_TAG('M','N','K',' ')}, /* Mandinka -> Maninka */ + {"mnp", HB_TAG('Z','H','S',' ')}, /* Min Bei Chinese -> Chinese Simplified */ + {"mns", HB_TAG('M','A','N',' ')}, /* Mansi */ + {"mnw", HB_TAG('M','O','N',' ')}, /* Mon */ + {"mo", HB_TAG('M','O','L',' ')}, /* Moldavian (retired code) */ +/*{"moh", HB_TAG('M','O','H',' ')},*/ /* Mohawk */ +/*{"mos", HB_TAG('M','O','S',' ')},*/ /* Mossi */ + {"mpe", HB_TAG('M','A','J',' ')}, /* Majang */ + {"mqg", HB_TAG('M','L','Y',' ')}, /* Kota Bangun Kutai Malay -> Malay */ + {"mr", HB_TAG('M','A','R',' ')}, /* Marathi */ + {"mrh", HB_TAG('Q','I','N',' ')}, /* Mara Chin -> Chin */ + {"mrj", HB_TAG('H','M','A',' ')}, /* Western Mari -> High Mari */ + {"ms", HB_TAG('M','L','Y',' ')}, /* Malay [macrolanguage] */ + {"msc", HB_TAG('M','N','K',' ')}, /* Sankaran Maninka -> Maninka */ + {"msh", HB_TAG('M','L','G',' ')}, /* Masikoro Malagasy -> Malagasy */ + {"msi", HB_TAG('M','L','Y',' ')}, /* Sabah Malay -> Malay */ + {"mt", HB_TAG('M','T','S',' ')}, /* Maltese */ + {"mtr", HB_TAG('M','A','W',' ')}, /* Mewari -> Marwari */ + {"mui", HB_TAG('M','L','Y',' ')}, /* Musi -> Malay */ + {"mup", HB_TAG('R','A','J',' ')}, /* Malvi -> Rajasthani */ + {"muq", HB_TAG('H','M','N',' ')}, /* Eastern Xiangxi Miao -> Hmong */ +/*{"mus", HB_TAG('M','U','S',' ')},*/ /* Creek -> Muscogee */ + {"mvb", HB_TAG('A','T','H',' ')}, /* Mattole -> Athapaskan */ + {"mve", HB_TAG('M','A','W',' ')}, /* Marwari (Pakistan) */ + {"mvf", HB_TAG('M','N','G',' ')}, /* Peripheral Mongolian -> Mongolian */ + {"mwk", HB_TAG('M','N','K',' ')}, /* Kita Maninkakan -> Maninka */ +/*{"mwl", HB_TAG('M','W','L',' ')},*/ /* Mirandese */ + {"mwr", HB_TAG('M','A','W',' ')}, /* Marwari [macrolanguage] */ +/*{"mww", HB_TAG('M','W','W',' ')},*/ /* Hmong Daw */ + {"my", HB_TAG('B','R','M',' ')}, /* Burmese */ + {"mym", HB_TAG('M','E','N',' ')}, /* Me’en */ +/*{"myn", HB_TAG('M','Y','N',' ')},*/ /* Mayan [family] */ + {"myq", HB_TAG('M','N','K',' ')}, /* Forest Maninka (retired code) -> Maninka */ + {"myv", HB_TAG('E','R','Z',' ')}, /* Erzya */ +/*{"mzn", HB_TAG('M','Z','N',' ')},*/ /* Mazanderani */ + {"na", HB_TAG('N','A','U',' ')}, /* Nauru -> Nauruan */ +/*{"nag", HB_TAG('N','A','G',' ')},*/ /* Naga Pidgin -> Naga-Assamese */ +/*{"nah", HB_TAG('N','A','H',' ')},*/ /* Nahuatl [family] */ + {"nan", HB_TAG('Z','H','S',' ')}, /* Min Nan Chinese -> Chinese Simplified */ +/*{"nap", HB_TAG('N','A','P',' ')},*/ /* Neapolitan */ + {"nb", HB_TAG('N','O','R',' ')}, /* Norwegian Bokmål -> Norwegian */ + {"nd", HB_TAG('N','D','B',' ')}, /* North Ndebele -> Ndebele */ +/*{"ndc", HB_TAG('N','D','C',' ')},*/ /* Ndau */ +/*{"nds", HB_TAG('N','D','S',' ')},*/ /* Low Saxon */ + {"ne", HB_TAG('N','E','P',' ')}, /* Nepali [macrolanguage] */ +/*{"new", HB_TAG('N','E','W',' ')},*/ /* Newari */ + {"ng", HB_TAG('N','D','G',' ')}, /* Ndonga */ +/*{"nga", HB_TAG('N','G','A',' ')},*/ /* Ngbaka */ + {"ngl", HB_TAG('L','M','W',' ')}, /* Lomwe */ + {"ngo", HB_TAG('S','X','T',' ')}, /* Ngoni -> Sutu */ + {"nhd", HB_TAG('G','U','A',' ')}, /* Chiripá -> Guarani */ + {"niq", HB_TAG('K','A','L',' ')}, /* Nandi -> Kalenjin */ +/*{"niu", HB_TAG('N','I','U',' ')},*/ /* Niuean */ + {"niv", HB_TAG('G','I','L',' ')}, /* Gilyak */ + {"njz", HB_TAG('N','I','S',' ')}, /* Nyishi -> Nisi */ + {"nl", HB_TAG('N','L','D',' ')}, /* Dutch */ + {"nle", HB_TAG('L','U','H',' ')}, /* East Nyala -> Luyia */ + {"nn", HB_TAG('N','Y','N',' ')}, /* Norwegian Nynorsk (Nynorsk, Norwegian) */ + {"no", HB_TAG('N','O','R',' ')}, /* Norwegian [macrolanguage] */ + {"nod", HB_TAG('N','T','A',' ')}, /* Northern Thai -> Northern Tai */ +/*{"noe", HB_TAG('N','O','E',' ')},*/ /* Nimadi */ +/*{"nog", HB_TAG('N','O','G',' ')},*/ /* Nogai */ +/*{"nov", HB_TAG('N','O','V',' ')},*/ /* Novial */ + {"npi", HB_TAG('N','E','P',' ')}, /* Nepali */ + {"nqo", HB_TAG('N','K','O',' ')}, /* N’Ko */ + {"nr", HB_TAG('N','D','B',' ')}, /* South Ndebele -> Ndebele */ + {"nsk", HB_TAG('N','A','S',' ')}, /* Naskapi */ +/*{"nso", HB_TAG('N','S','O',' ')},*/ /* Pedi -> Sotho, Northern */ + {"nv", HB_TAG('N','A','V',' ')}, /* Navajo */ + {"nv", HB_TAG('A','T','H',' ')}, /* Navajo -> Athapaskan */ + {"ny", HB_TAG('C','H','I',' ')}, /* Chichewa (Chewa, Nyanja) */ + {"nyd", HB_TAG('L','U','H',' ')}, /* Nyore -> Luyia */ +/*{"nym", HB_TAG('N','Y','M',' ')},*/ /* Nyamwezi */ + {"nyn", HB_TAG('N','K','L',' ')}, /* Nyankole */ +/*{"nza", HB_TAG('N','Z','A',' ')},*/ /* Tigon Mbembe -> Mbembe Tigon */ + {"oc", HB_TAG('O','C','I',' ')}, /* Occitan (post 1500) */ + {"oj", HB_TAG('O','J','B',' ')}, /* Ojibwa [macrolanguage] -> Ojibway */ +/*{"ojb", HB_TAG('O','J','B',' ')},*/ /* Northwestern Ojibwa -> Ojibway */ + {"ojc", HB_TAG('O','J','B',' ')}, /* Central Ojibwa -> Ojibway */ + {"ojg", HB_TAG('O','J','B',' ')}, /* Eastern Ojibwa -> Ojibway */ + {"ojs", HB_TAG('O','C','R',' ')}, /* Severn Ojibwa -> Oji-Cree */ + {"ojw", HB_TAG('O','J','B',' ')}, /* Western Ojibwa -> Ojibway */ + {"oki", HB_TAG('K','A','L',' ')}, /* Okiek -> Kalenjin */ + {"okm", HB_TAG('K','O','H',' ')}, /* Middle Korean (10th-16th cent.) -> Korean Old Hangul */ + {"om", HB_TAG('O','R','O',' ')}, /* Oromo [macrolanguage] */ + {"or", HB_TAG('O','R','I',' ')}, /* Odia (formerly Oriya) [macrolanguage] */ + {"orc", HB_TAG('O','R','O',' ')}, /* Orma -> Oromo */ + {"orn", HB_TAG('M','L','Y',' ')}, /* Orang Kanaq -> Malay */ + {"ors", HB_TAG('M','L','Y',' ')}, /* Orang Seletar -> Malay */ + {"ory", HB_TAG('O','R','I',' ')}, /* Odia (formerly Oriya) */ + {"os", HB_TAG('O','S','S',' ')}, /* Ossetian */ + {"otw", HB_TAG('O','J','B',' ')}, /* Ottawa -> Ojibway */ + {"pa", HB_TAG('P','A','N',' ')}, /* Punjabi */ +/*{"pag", HB_TAG('P','A','G',' ')},*/ /* Pangasinan */ +/*{"pam", HB_TAG('P','A','M',' ')},*/ /* Pampanga -> Pampangan */ + {"pap", HB_TAG('P','A','P','0')}, /* Papiamento -> Papiamentu */ +/*{"pau", HB_TAG('P','A','U',' ')},*/ /* Palauan */ + {"pbt", HB_TAG('P','A','S',' ')}, /* Southern Pashto -> Pashto */ + {"pbu", HB_TAG('P','A','S',' ')}, /* Northern Pashto -> Pashto */ +/*{"pcc", HB_TAG('P','C','C',' ')},*/ /* Bouyei */ +/*{"pcd", HB_TAG('P','C','D',' ')},*/ /* Picard */ + {"pce", HB_TAG('P','L','G',' ')}, /* Ruching Palaung -> Palaung */ + {"pck", HB_TAG('Q','I','N',' ')}, /* Paite Chin -> Chin */ +/*{"pdc", HB_TAG('P','D','C',' ')},*/ /* Pennsylvania German */ + {"pel", HB_TAG('M','L','Y',' ')}, /* Pekal -> Malay */ + {"pes", HB_TAG('F','A','R',' ')}, /* Iranian Persian -> Persian */ + {"pga", HB_TAG('A','R','A',' ')}, /* Sudanese Creole Arabic -> Arabic */ +/*{"phk", HB_TAG('P','H','K',' ')},*/ /* Phake */ + {"pi", HB_TAG('P','A','L',' ')}, /* Pali */ +/*{"pih", HB_TAG('P','I','H',' ')},*/ /* Pitcairn-Norfolk -> Norfolk */ + {"pko", HB_TAG('K','A','L',' ')}, /* Pökoot -> Kalenjin */ + {"pl", HB_TAG('P','L','K',' ')}, /* Polish */ + {"pll", HB_TAG('P','L','G',' ')}, /* Shwe Palaung -> Palaung */ + {"plp", HB_TAG('P','A','P',' ')}, /* Palpa */ + {"plt", HB_TAG('M','L','G',' ')}, /* Plateau Malagasy -> Malagasy */ +/*{"pms", HB_TAG('P','M','S',' ')},*/ /* Piemontese */ +/*{"pnb", HB_TAG('P','N','B',' ')},*/ /* Western Panjabi */ +/*{"poh", HB_TAG('P','O','H',' ')},*/ /* Poqomchi' -> Pocomchi */ +/*{"pon", HB_TAG('P','O','N',' ')},*/ /* Pohnpeian */ + {"ppa", HB_TAG('B','A','G',' ')}, /* Pao (retired code) -> Baghelkhandi */ +/*{"pro", HB_TAG('P','R','O',' ')},*/ /* Old Provençal (to 1500) -> Provençal / Old Provençal */ + {"prs", HB_TAG('D','R','I',' ')}, /* Dari */ + {"ps", HB_TAG('P','A','S',' ')}, /* Pashto [macrolanguage] */ + {"pse", HB_TAG('M','L','Y',' ')}, /* Central Malay -> Malay */ + {"pst", HB_TAG('P','A','S',' ')}, /* Central Pashto -> Pashto */ + {"pt", HB_TAG('P','T','G',' ')}, /* Portuguese */ +/*{"pwo", HB_TAG('P','W','O',' ')},*/ /* Pwo Western Karen -> Western Pwo Karen */ + {"qu", HB_TAG('Q','U','Z',' ')}, /* Quechua [macrolanguage] */ + {"qub", HB_TAG('Q','W','H',' ')}, /* Huallaga Huánuco Quechua -> Quechua (Peru) */ +/*{"quc", HB_TAG('Q','U','C',' ')},*/ /* K’iche’ */ + {"qud", HB_TAG('Q','V','I',' ')}, /* Calderón Highland Quichua -> Quechua (Ecuador) */ + {"quf", HB_TAG('Q','U','Z',' ')}, /* Lambayeque Quechua -> Quechua */ + {"qug", HB_TAG('Q','V','I',' ')}, /* Chimborazo Highland Quichua -> Quechua (Ecuador) */ +/*{"quh", HB_TAG('Q','U','H',' ')},*/ /* South Bolivian Quechua -> Quechua (Bolivia) */ + {"quk", HB_TAG('Q','U','Z',' ')}, /* Chachapoyas Quechua -> Quechua */ + {"qul", HB_TAG('Q','U','Z',' ')}, /* North Bolivian Quechua -> Quechua */ + {"qup", HB_TAG('Q','V','I',' ')}, /* Southern Pastaza Quechua -> Quechua (Ecuador) */ + {"qur", HB_TAG('Q','W','H',' ')}, /* Yanahuanca Pasco Quechua -> Quechua (Peru) */ + {"qus", HB_TAG('Q','U','H',' ')}, /* Santiago del Estero Quichua -> Quechua (Bolivia) */ + {"quw", HB_TAG('Q','V','I',' ')}, /* Tena Lowland Quichua -> Quechua (Ecuador) */ + {"qux", HB_TAG('Q','W','H',' ')}, /* Yauyos Quechua -> Quechua (Peru) */ + {"quy", HB_TAG('Q','U','Z',' ')}, /* Ayacucho Quechua -> Quechua */ +/*{"quz", HB_TAG('Q','U','Z',' ')},*/ /* Cusco Quechua -> Quechua */ + {"qva", HB_TAG('Q','W','H',' ')}, /* Ambo-Pasco Quechua -> Quechua (Peru) */ + {"qvc", HB_TAG('Q','U','Z',' ')}, /* Cajamarca Quechua -> Quechua */ + {"qve", HB_TAG('Q','U','Z',' ')}, /* Eastern Apurímac Quechua -> Quechua */ + {"qvh", HB_TAG('Q','W','H',' ')}, /* Huamalíes-Dos de Mayo Huánuco Quechua -> Quechua (Peru) */ +/*{"qvi", HB_TAG('Q','V','I',' ')},*/ /* Imbabura Highland Quichua -> Quechua (Ecuador) */ + {"qvj", HB_TAG('Q','V','I',' ')}, /* Loja Highland Quichua -> Quechua (Ecuador) */ + {"qvl", HB_TAG('Q','W','H',' ')}, /* Cajatambo North Lima Quechua -> Quechua (Peru) */ + {"qvm", HB_TAG('Q','W','H',' ')}, /* Margos-Yarowilca-Lauricocha Quechua -> Quechua (Peru) */ + {"qvn", HB_TAG('Q','W','H',' ')}, /* North Junín Quechua -> Quechua (Peru) */ + {"qvo", HB_TAG('Q','V','I',' ')}, /* Napo Lowland Quechua -> Quechua (Ecuador) */ + {"qvp", HB_TAG('Q','W','H',' ')}, /* Pacaraos Quechua -> Quechua (Peru) */ + {"qvs", HB_TAG('Q','U','Z',' ')}, /* San Martín Quechua -> Quechua */ + {"qvw", HB_TAG('Q','W','H',' ')}, /* Huaylla Wanca Quechua -> Quechua (Peru) */ + {"qvz", HB_TAG('Q','V','I',' ')}, /* Northern Pastaza Quichua -> Quechua (Ecuador) */ + {"qwa", HB_TAG('Q','W','H',' ')}, /* Corongo Ancash Quechua -> Quechua (Peru) */ + {"qwc", HB_TAG('Q','U','Z',' ')}, /* Classical Quechua -> Quechua */ +/*{"qwh", HB_TAG('Q','W','H',' ')},*/ /* Huaylas Ancash Quechua -> Quechua (Peru) */ + {"qws", HB_TAG('Q','W','H',' ')}, /* Sihuas Ancash Quechua -> Quechua (Peru) */ + {"qxa", HB_TAG('Q','W','H',' ')}, /* Chiquián Ancash Quechua -> Quechua (Peru) */ + {"qxc", HB_TAG('Q','W','H',' ')}, /* Chincha Quechua -> Quechua (Peru) */ + {"qxh", HB_TAG('Q','W','H',' ')}, /* Panao Huánuco Quechua -> Quechua (Peru) */ + {"qxl", HB_TAG('Q','V','I',' ')}, /* Salasaca Highland Quichua -> Quechua (Ecuador) */ + {"qxn", HB_TAG('Q','W','H',' ')}, /* Northern Conchucos Ancash Quechua -> Quechua (Peru) */ + {"qxo", HB_TAG('Q','W','H',' ')}, /* Southern Conchucos Ancash Quechua -> Quechua (Peru) */ + {"qxp", HB_TAG('Q','U','Z',' ')}, /* Puno Quechua -> Quechua */ + {"qxr", HB_TAG('Q','V','I',' ')}, /* Cañar Highland Quichua -> Quechua (Ecuador) */ + {"qxt", HB_TAG('Q','W','H',' ')}, /* Santa Ana de Tusi Pasco Quechua -> Quechua (Peru) */ + {"qxu", HB_TAG('Q','U','Z',' ')}, /* Arequipa-La Unión Quechua -> Quechua */ + {"qxw", HB_TAG('Q','W','H',' ')}, /* Jauja Wanca Quechua -> Quechua (Peru) */ + {"rag", HB_TAG('L','U','H',' ')}, /* Logooli -> Luyia */ +/*{"raj", HB_TAG('R','A','J',' ')},*/ /* Rajasthani [macrolanguage] */ +/*{"rar", HB_TAG('R','A','R',' ')},*/ /* Rarotongan */ + {"rbb", HB_TAG('P','L','G',' ')}, /* Rumai Palaung -> Palaung */ + {"rbl", HB_TAG('B','I','K',' ')}, /* Miraya Bikol -> Bikol */ +/*{"rej", HB_TAG('R','E','J',' ')},*/ /* Rejang */ +/*{"ria", HB_TAG('R','I','A',' ')},*/ /* Riang (India) */ +/*{"rif", HB_TAG('R','I','F',' ')},*/ /* Tarifit */ +/*{"rit", HB_TAG('R','I','T',' ')},*/ /* Ritarungo */ + {"rki", HB_TAG('A','R','K',' ')}, /* Rakhine */ +/*{"rkw", HB_TAG('R','K','W',' ')},*/ /* Arakwal */ + {"rm", HB_TAG('R','M','S',' ')}, /* Romansh */ + {"rmc", HB_TAG('R','O','Y',' ')}, /* Carpathian Romani -> Romany */ + {"rmf", HB_TAG('R','O','Y',' ')}, /* Kalo Finnish Romani -> Romany */ + {"rml", HB_TAG('R','O','Y',' ')}, /* Baltic Romani -> Romany */ + {"rmn", HB_TAG('R','O','Y',' ')}, /* Balkan Romani -> Romany */ + {"rmo", HB_TAG('R','O','Y',' ')}, /* Sinte Romani -> Romany */ + {"rmw", HB_TAG('R','O','Y',' ')}, /* Welsh Romani -> Romany */ +/*{"rmy", HB_TAG('R','M','Y',' ')},*/ /* Vlax Romani */ + {"rmz", HB_TAG('A','R','K',' ')}, /* Marma -> Rakhine */ + {"rn", HB_TAG('R','U','N',' ')}, /* Rundi */ + {"rnl", HB_TAG('H','A','L',' ')}, /* Ranglong -> Halam (Falam Chin) */ + {"ro", HB_TAG('R','O','M',' ')}, /* Romanian */ + {"rom", HB_TAG('R','O','Y',' ')}, /* Romany [macrolanguage] */ +/*{"rtm", HB_TAG('R','T','M',' ')},*/ /* Rotuman */ + {"ru", HB_TAG('R','U','S',' ')}, /* Russian */ + {"rue", HB_TAG('R','S','Y',' ')}, /* Rusyn */ +/*{"rup", HB_TAG('R','U','P',' ')},*/ /* Aromanian */ + {"rw", HB_TAG('R','U','A',' ')}, /* Kinyarwanda */ + {"rwr", HB_TAG('M','A','W',' ')}, /* Marwari (India) */ + {"sa", HB_TAG('S','A','N',' ')}, /* Sanskrit */ + {"sah", HB_TAG('Y','A','K',' ')}, /* Yakut -> Sakha */ + {"sam", HB_TAG('P','A','A',' ')}, /* Samaritan Aramaic -> Palestinian Aramaic */ +/*{"sas", HB_TAG('S','A','S',' ')},*/ /* Sasak */ +/*{"sat", HB_TAG('S','A','T',' ')},*/ /* Santali */ + {"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */ + {"sck", HB_TAG('S','A','D',' ')}, /* Sadri */ +/*{"scn", HB_TAG('S','C','N',' ')},*/ /* Sicilian */ +/*{"sco", HB_TAG('S','C','O',' ')},*/ /* Scots */ + {"scs", HB_TAG('S','C','S',' ')}, /* North Slavey */ + {"scs", HB_TAG('S','L','A',' ')}, /* North Slavey -> Slavey */ + {"scs", HB_TAG('A','T','H',' ')}, /* North Slavey -> Athapaskan */ + {"sd", HB_TAG('S','N','D',' ')}, /* Sindhi */ + {"sdc", HB_TAG('S','R','D',' ')}, /* Sassarese Sardinian -> Sardinian */ + {"sdh", HB_TAG('K','U','R',' ')}, /* Southern Kurdish -> Kurdish */ + {"sdn", HB_TAG('S','R','D',' ')}, /* Gallurese Sardinian -> Sardinian */ + {"se", HB_TAG('N','S','M',' ')}, /* Northern Sami */ + {"seh", HB_TAG('S','N','A',' ')}, /* Sena */ + {"sek", HB_TAG('A','T','H',' ')}, /* Sekani -> Athapaskan */ +/*{"sel", HB_TAG('S','E','L',' ')},*/ /* Selkup */ + {"sez", HB_TAG('Q','I','N',' ')}, /* Senthang Chin -> Chin */ + {"sfm", HB_TAG('H','M','N',' ')}, /* Small Flowery Miao -> Hmong */ + {"sg", HB_TAG('S','G','O',' ')}, /* Sango */ +/*{"sga", HB_TAG('S','G','A',' ')},*/ /* Old Irish (to 900) */ + {"sgc", HB_TAG('K','A','L',' ')}, /* Kipsigis -> Kalenjin */ +/*{"sgs", HB_TAG('S','G','S',' ')},*/ /* Samogitian */ + {"sgw", HB_TAG('C','H','G',' ')}, /* Sebat Bet Gurage -> Chaha Gurage */ + {"sgw", HB_TAG('S','G','W',' ')}, /* Sebat Bet Gurage -> Chaha Gurage (SIL fonts) */ +/*{"shi", HB_TAG('S','H','I',' ')},*/ /* Tachelhit */ +/*{"shn", HB_TAG('S','H','N',' ')},*/ /* Shan */ + {"shu", HB_TAG('A','R','A',' ')}, /* Chadian Arabic -> Arabic */ + {"si", HB_TAG('S','N','H',' ')}, /* Sinhala (Sinhalese) */ +/*{"sid", HB_TAG('S','I','D',' ')},*/ /* Sidamo */ + {"sjd", HB_TAG('K','S','M',' ')}, /* Kildin Sami */ + {"sjo", HB_TAG('S','I','B',' ')}, /* Xibe -> Sibe */ + {"sk", HB_TAG('S','K','Y',' ')}, /* Slovak */ + {"skg", HB_TAG('M','L','G',' ')}, /* Sakalava Malagasy -> Malagasy */ + {"skr", HB_TAG('S','R','K',' ')}, /* Saraiki */ + {"sl", HB_TAG('S','L','V',' ')}, /* Slovenian */ + {"sm", HB_TAG('S','M','O',' ')}, /* Samoan */ + {"sma", HB_TAG('S','S','M',' ')}, /* Southern Sami */ + {"smj", HB_TAG('L','S','M',' ')}, /* Lule Sami */ + {"smn", HB_TAG('I','S','M',' ')}, /* Inari Sami */ + {"sms", HB_TAG('S','K','S',' ')}, /* Skolt Sami */ + {"sn", HB_TAG('S','N','A','0')}, /* Shona */ +/*{"snk", HB_TAG('S','N','K',' ')},*/ /* Soninke */ + {"so", HB_TAG('S','M','L',' ')}, /* Somali */ +/*{"sop", HB_TAG('S','O','P',' ')},*/ /* Songe */ + {"spv", HB_TAG('O','R','I',' ')}, /* Sambalpuri -> Odia (formerly Oriya) */ + {"spy", HB_TAG('K','A','L',' ')}, /* Sabaot -> Kalenjin */ + {"sq", HB_TAG('S','Q','I',' ')}, /* Albanian [macrolanguage] */ + {"sr", HB_TAG('S','R','B',' ')}, /* Serbian */ + {"src", HB_TAG('S','R','D',' ')}, /* Logudorese Sardinian -> Sardinian */ + {"sro", HB_TAG('S','R','D',' ')}, /* Campidanese Sardinian -> Sardinian */ +/*{"srr", HB_TAG('S','R','R',' ')},*/ /* Serer */ + {"srs", HB_TAG('A','T','H',' ')}, /* Sarsi -> Athapaskan */ + {"ss", HB_TAG('S','W','Z',' ')}, /* Swati */ + {"ssh", HB_TAG('A','R','A',' ')}, /* Shihhi Arabic -> Arabic */ + {"st", HB_TAG('S','O','T',' ')}, /* Southern Sotho -> Sotho, Southern */ +/*{"stq", HB_TAG('S','T','Q',' ')},*/ /* Saterfriesisch -> Saterland Frisian */ + {"stv", HB_TAG('S','I','G',' ')}, /* Silt'e -> Silte Gurage */ + {"su", HB_TAG('S','U','N',' ')}, /* Sundanese */ +/*{"suk", HB_TAG('S','U','K',' ')},*/ /* Sukuma */ + {"suq", HB_TAG('S','U','R',' ')}, /* Suri */ + {"sv", HB_TAG('S','V','E',' ')}, /* Swedish */ +/*{"sva", HB_TAG('S','V','A',' ')},*/ /* Svan */ + {"sw", HB_TAG('S','W','K',' ')}, /* Swahili [macrolanguage] */ + {"swb", HB_TAG('C','M','R',' ')}, /* Maore Comorian -> Comorian */ + {"swc", HB_TAG('S','W','K',' ')}, /* Congo Swahili -> Swahili */ + {"swh", HB_TAG('S','W','K',' ')}, /* Swahili */ + {"swv", HB_TAG('M','A','W',' ')}, /* Shekhawati -> Marwari */ +/*{"sxu", HB_TAG('S','X','U',' ')},*/ /* Upper Saxon */ + {"syc", HB_TAG('S','Y','R',' ')}, /* Classical Syriac -> Syriac */ +/*{"syl", HB_TAG('S','Y','L',' ')},*/ /* Sylheti */ +/*{"syr", HB_TAG('S','Y','R',' ')},*/ /* Syriac [macrolanguage] */ +/*{"szl", HB_TAG('S','Z','L',' ')},*/ /* Silesian */ + {"ta", HB_TAG('T','A','M',' ')}, /* Tamil */ + {"taa", HB_TAG('A','T','H',' ')}, /* Lower Tanana -> Athapaskan */ +/*{"tab", HB_TAG('T','A','B',' ')},*/ /* Tabassaran -> Tabasaran */ + {"taq", HB_TAG('T','M','H',' ')}, /* Tamasheq -> Tamashek */ + {"tau", HB_TAG('A','T','H',' ')}, /* Upper Tanana -> Athapaskan */ + {"tcb", HB_TAG('A','T','H',' ')}, /* Tanacross -> Athapaskan */ + {"tce", HB_TAG('A','T','H',' ')}, /* Southern Tutchone -> Athapaskan */ + {"tcp", HB_TAG('Q','I','N',' ')}, /* Tawr Chin -> Chin */ + {"tcy", HB_TAG('T','U','L',' ')}, /* Tulu -> Tumbuka */ + {"tcz", HB_TAG('Q','I','N',' ')}, /* Thado Chin -> Chin */ +/*{"tdd", HB_TAG('T','D','D',' ')},*/ /* Tai Nüa -> Dehong Dai */ + {"tdx", HB_TAG('M','L','G',' ')}, /* Tandroy-Mahafaly Malagasy -> Malagasy */ + {"te", HB_TAG('T','E','L',' ')}, /* Telugu */ + {"tec", HB_TAG('K','A','L',' ')}, /* Terik -> Kalenjin */ + {"tem", HB_TAG('T','M','N',' ')}, /* Timne -> Temne */ +/*{"tet", HB_TAG('T','E','T',' ')},*/ /* Tetum */ + {"tfn", HB_TAG('A','T','H',' ')}, /* Tanaina -> Athapaskan */ + {"tg", HB_TAG('T','A','J',' ')}, /* Tajik -> Tajiki */ + {"tgj", HB_TAG('N','I','S',' ')}, /* Tagin -> Nisi */ + {"tgx", HB_TAG('A','T','H',' ')}, /* Tagish -> Athapaskan */ + {"th", HB_TAG('T','H','A',' ')}, /* Thai */ + {"tht", HB_TAG('A','T','H',' ')}, /* Tahltan -> Athapaskan */ + {"thv", HB_TAG('T','M','H',' ')}, /* Tahaggart Tamahaq -> Tamashek */ + {"thz", HB_TAG('T','M','H',' ')}, /* Tayart Tamajeq -> Tamashek */ + {"ti", HB_TAG('T','G','Y',' ')}, /* Tigrinya */ + {"tig", HB_TAG('T','G','R',' ')}, /* Tigre */ +/*{"tiv", HB_TAG('T','I','V',' ')},*/ /* Tiv */ + {"tk", HB_TAG('T','K','M',' ')}, /* Turkmen */ + {"tkg", HB_TAG('M','L','G',' ')}, /* Tesaka Malagasy -> Malagasy */ + {"tl", HB_TAG('T','G','L',' ')}, /* Tagalog */ +/*{"tmh", HB_TAG('T','M','H',' ')},*/ /* Tamashek [macrolanguage] */ + {"tmw", HB_TAG('M','L','Y',' ')}, /* Temuan -> Malay */ + {"tn", HB_TAG('T','N','A',' ')}, /* Tswana */ + {"tnf", HB_TAG('D','R','I',' ')}, /* Tangshewi (retired code) -> Dari */ + {"to", HB_TAG('T','G','N',' ')}, /* Tonga (Tonga Islands) -> Tongan */ + {"tod", HB_TAG('T','O','D','0')}, /* Toma */ + {"toi", HB_TAG('T','N','G',' ')}, /* Tonga (Zambia) */ + {"tol", HB_TAG('A','T','H',' ')}, /* Tolowa -> Athapaskan */ +/*{"tpi", HB_TAG('T','P','I',' ')},*/ /* Tok Pisin */ + {"tr", HB_TAG('T','R','K',' ')}, /* Turkish */ + {"tru", HB_TAG('T','U','A',' ')}, /* Turoyo -> Turoyo Aramaic */ + {"tru", HB_TAG('S','Y','R',' ')}, /* Turoyo -> Syriac */ + {"ts", HB_TAG('T','S','G',' ')}, /* Tsonga */ +/*{"tsj", HB_TAG('T','S','J',' ')},*/ /* Tshangla */ + {"tt", HB_TAG('T','A','T',' ')}, /* Tatar */ + {"ttm", HB_TAG('A','T','H',' ')}, /* Northern Tutchone -> Athapaskan */ + {"ttq", HB_TAG('T','M','H',' ')}, /* Tawallammat Tamajaq -> Tamashek */ +/*{"tum", HB_TAG('T','U','M',' ')},*/ /* Tumbuka -> Tulu */ + {"tuu", HB_TAG('A','T','H',' ')}, /* Tututni -> Athapaskan */ + {"tuy", HB_TAG('K','A','L',' ')}, /* Tugen -> Kalenjin */ +/*{"tvl", HB_TAG('T','V','L',' ')},*/ /* Tuvalu */ + {"tw", HB_TAG('T','W','I',' ')}, /* Twi */ + {"tw", HB_TAG('A','K','A',' ')}, /* Twi -> Akan */ + {"txc", HB_TAG('A','T','H',' ')}, /* Tsetsaut -> Athapaskan */ + {"txy", HB_TAG('M','L','G',' ')}, /* Tanosy Malagasy -> Malagasy */ + {"ty", HB_TAG('T','H','T',' ')}, /* Tahitian */ + {"tyv", HB_TAG('T','U','V',' ')}, /* Tuvinian -> Tuvin */ +/*{"tyz", HB_TAG('T','Y','Z',' ')},*/ /* Tày */ +/*{"tzm", HB_TAG('T','Z','M',' ')},*/ /* Central Atlas Tamazight -> Tamazight */ +/*{"tzo", HB_TAG('T','Z','O',' ')},*/ /* Tzotzil */ + {"ubl", HB_TAG('B','I','K',' ')}, /* Buhi'non Bikol -> Bikol */ +/*{"udm", HB_TAG('U','D','M',' ')},*/ /* Udmurt */ + {"ug", HB_TAG('U','Y','G',' ')}, /* Uyghur */ + {"uk", HB_TAG('U','K','R',' ')}, /* Ukrainian */ +/*{"umb", HB_TAG('U','M','B',' ')},*/ /* Umbundu */ + {"unr", HB_TAG('M','U','N',' ')}, /* Mundari */ + {"ur", HB_TAG('U','R','D',' ')}, /* Urdu */ + {"urk", HB_TAG('M','L','Y',' ')}, /* Urak Lawoi' -> Malay */ + {"uz", HB_TAG('U','Z','B',' ')}, /* Uzbek [macrolanguage] */ + {"uzn", HB_TAG('U','Z','B',' ')}, /* Northern Uzbek -> Uzbek */ + {"uzs", HB_TAG('U','Z','B',' ')}, /* Southern Uzbek -> Uzbek */ + {"ve", HB_TAG('V','E','N',' ')}, /* Venda */ +/*{"vec", HB_TAG('V','E','C',' ')},*/ /* Venetian */ + {"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */ + {"vkk", HB_TAG('M','L','Y',' ')}, /* Kaur -> Malay */ + {"vkt", HB_TAG('M','L','Y',' ')}, /* Tenggarong Kutai Malay -> Malay */ + {"vls", HB_TAG('F','L','E',' ')}, /* Vlaams -> Dutch (Flemish) */ + {"vmw", HB_TAG('M','A','K',' ')}, /* Makhuwa */ + {"vo", HB_TAG('V','O','L',' ')}, /* Volapük */ +/*{"vro", HB_TAG('V','R','O',' ')},*/ /* Võro */ + {"wa", HB_TAG('W','L','N',' ')}, /* Walloon */ +/*{"war", HB_TAG('W','A','R',' ')},*/ /* Waray (Philippines) -> Waray-Waray */ + {"wbm", HB_TAG('W','A',' ',' ')}, /* Wa */ + {"wbr", HB_TAG('W','A','G',' ')}, /* Wagdi */ + {"wlc", HB_TAG('C','M','R',' ')}, /* Mwali Comorian -> Comorian */ + {"wle", HB_TAG('S','I','G',' ')}, /* Wolane -> Silte Gurage */ + {"wlk", HB_TAG('A','T','H',' ')}, /* Wailaki -> Athapaskan */ + {"wni", HB_TAG('C','M','R',' ')}, /* Ndzwani Comorian -> Comorian */ + {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */ + {"wry", HB_TAG('M','A','W',' ')}, /* Merwari -> Marwari */ + {"wsg", HB_TAG('G','O','N',' ')}, /* Adilabad Gondi -> Gondi */ +/*{"wtm", HB_TAG('W','T','M',' ')},*/ /* Mewati */ + {"wuu", HB_TAG('Z','H','S',' ')}, /* Wu Chinese -> Chinese Simplified */ + {"xal", HB_TAG('K','L','M',' ')}, /* Kalmyk */ + {"xal", HB_TAG('T','O','D',' ')}, /* Kalmyk -> Todo */ + {"xan", HB_TAG('S','E','K',' ')}, /* Xamtanga -> Sekota */ + {"xh", HB_TAG('X','H','S',' ')}, /* Xhosa */ +/*{"xjb", HB_TAG('X','J','B',' ')},*/ /* Minjungbal -> Minjangbal */ +/*{"xkf", HB_TAG('X','K','F',' ')},*/ /* Khengkha */ + {"xmm", HB_TAG('M','L','Y',' ')}, /* Manado Malay -> Malay */ + {"xmv", HB_TAG('M','L','G',' ')}, /* Antankarana Malagasy -> Malagasy */ + {"xmw", HB_TAG('M','L','G',' ')}, /* Tsimihety Malagasy -> Malagasy */ + {"xnr", HB_TAG('D','G','R',' ')}, /* Kangri -> Dogri */ +/*{"xog", HB_TAG('X','O','G',' ')},*/ /* Soga */ +/*{"xpe", HB_TAG('X','P','E',' ')},*/ /* Liberia Kpelle -> Kpelle (Liberia) */ + {"xsl", HB_TAG('S','S','L',' ')}, /* South Slavey */ + {"xsl", HB_TAG('S','L','A',' ')}, /* South Slavey -> Slavey */ + {"xsl", HB_TAG('A','T','H',' ')}, /* South Slavey -> Athapaskan */ + {"xst", HB_TAG('S','I','G',' ')}, /* Silt'e (retired code) -> Silte Gurage */ + {"xwo", HB_TAG('T','O','D',' ')}, /* Written Oirat -> Todo */ +/*{"yao", HB_TAG('Y','A','O',' ')},*/ /* Yao */ +/*{"yap", HB_TAG('Y','A','P',' ')},*/ /* Yapese */ + {"ybd", HB_TAG('A','R','K',' ')}, /* Yangbye (retired code) -> Rakhine */ + {"ydd", HB_TAG('J','I','I',' ')}, /* Eastern Yiddish -> Yiddish */ + {"yi", HB_TAG('J','I','I',' ')}, /* Yiddish [macrolanguage] */ + {"yih", HB_TAG('J','I','I',' ')}, /* Western Yiddish -> Yiddish */ + {"yo", HB_TAG('Y','B','A',' ')}, /* Yoruba */ + {"yos", HB_TAG('Q','I','N',' ')}, /* Yos (retired code) -> Chin */ + {"yrk", HB_TAG('T','N','E',' ')}, /* Nenets -> Tundra Nenets */ + {"yrk", HB_TAG('F','N','E',' ')}, /* Nenets -> Forest Nenets */ + {"yue", HB_TAG('Z','H','H',' ')}, /* Yue Chinese -> Chinese, Hong Kong SAR */ + {"za", HB_TAG('Z','H','A',' ')}, /* Zhuang [macrolanguage] */ + {"zch", HB_TAG('Z','H','A',' ')}, /* Central Hongshuihe Zhuang -> Zhuang */ + {"zdj", HB_TAG('C','M','R',' ')}, /* Ngazidja Comorian -> Comorian */ +/*{"zea", HB_TAG('Z','E','A',' ')},*/ /* Zeeuws -> Zealandic */ + {"zeh", HB_TAG('Z','H','A',' ')}, /* Eastern Hongshuihe Zhuang -> Zhuang */ + {"zgb", HB_TAG('Z','H','A',' ')}, /* Guibei Zhuang -> Zhuang */ +/*{"zgh", HB_TAG('Z','G','H',' ')},*/ /* Standard Moroccan Tamazight */ + {"zgm", HB_TAG('Z','H','A',' ')}, /* Minz Zhuang -> Zhuang */ + {"zgn", HB_TAG('Z','H','A',' ')}, /* Guibian Zhuang -> Zhuang */ + {"zh", HB_TAG('Z','H','S',' ')}, /* Chinese [macrolanguage] -> Chinese Simplified */ + {"zhd", HB_TAG('Z','H','A',' ')}, /* Dai Zhuang -> Zhuang */ + {"zhn", HB_TAG('Z','H','A',' ')}, /* Nong Zhuang -> Zhuang */ + {"zlj", HB_TAG('Z','H','A',' ')}, /* Liujiang Zhuang -> Zhuang */ + {"zlm", HB_TAG('M','L','Y',' ')}, /* Malay */ + {"zln", HB_TAG('Z','H','A',' ')}, /* Lianshan Zhuang -> Zhuang */ + {"zlq", HB_TAG('Z','H','A',' ')}, /* Liuqian Zhuang -> Zhuang */ + {"zmi", HB_TAG('M','L','Y',' ')}, /* Negeri Sembilan Malay -> Malay */ + {"zne", HB_TAG('Z','N','D',' ')}, /* Zande */ + {"zom", HB_TAG('Q','I','N',' ')}, /* Zou -> Chin */ + {"zqe", HB_TAG('Z','H','A',' ')}, /* Qiubei Zhuang -> Zhuang */ + {"zsm", HB_TAG('M','L','Y',' ')}, /* Standard Malay -> Malay */ + {"zu", HB_TAG('Z','U','L',' ')}, /* Zulu */ + {"zum", HB_TAG('L','R','C',' ')}, /* Kumzari -> Luri */ + {"zyb", HB_TAG('Z','H','A',' ')}, /* Yongbei Zhuang -> Zhuang */ + {"zyg", HB_TAG('Z','H','A',' ')}, /* Yang Zhuang -> Zhuang */ + {"zyj", HB_TAG('Z','H','A',' ')}, /* Youjiang Zhuang -> Zhuang */ + {"zyn", HB_TAG('Z','H','A',' ')}, /* Yongnan Zhuang -> Zhuang */ +/*{"zza", HB_TAG('Z','Z','A',' ')},*/ /* Zazaki [macrolanguage] */ + {"zzj", HB_TAG('Z','H','A',' ')}, /* Zuojiang Zhuang -> Zhuang */ }; -static_assert (HB_OT_MAX_TAGS_PER_LANGUAGE == 3u, ""); - /** * hb_ot_tags_from_complex_language: * @lang_str: a BCP 47 language tag to convert. @@ -1934,7 +1932,8 @@ hb_ot_tags_from_complex_language (const char *lang_str, * * Converts @tag to a BCP 47 language tag if it is ambiguous (it corresponds to * many language tags) and the best tag is not the alphabetically first, or if - * the best tag consists of multiple subtags. + * the best tag consists of multiple subtags, or if the best tag does not appear + * in #ot_languages. * * Return value: The #hb_language_t corresponding to the BCP 47 language tag, * or #HB_LANGUAGE_INVALID if @tag is not ambiguous. @@ -1944,6 +1943,8 @@ hb_ot_ambiguous_tag_to_language (hb_tag_t tag) { switch (tag) { + case HB_TAG('A','L','T',' '): /* Altai */ + return hb_language_from_string ("alt", -1); /* Southern Altai */ case HB_TAG('A','P','P','H'): /* Phonetic transcription—Americanist conventions */ return hb_language_from_string ("und-fonnapa", -1); /* Undetermined; North American Phonetic Alphabet */ case HB_TAG('A','R','A',' '): /* Arabic */ @@ -1962,8 +1963,6 @@ hb_ot_ambiguous_tag_to_language (hb_tag_t tag) return hb_language_from_string ("din", -1); /* Dinka */ case HB_TAG('D','R','I',' '): /* Dari */ return hb_language_from_string ("prs", -1); /* Dari */ - case HB_TAG('D','U','J',' '): /* Dhuwal */ - return hb_language_from_string ("dwu", -1); /* Dhuwal */ case HB_TAG('D','Z','N',' '): /* Dzongkha */ return hb_language_from_string ("dz", -1); /* Dzongkha */ case HB_TAG('E','T','I',' '): /* Estonian */ @@ -1972,6 +1971,8 @@ hb_ot_ambiguous_tag_to_language (hb_tag_t tag) return hb_language_from_string ("gon", -1); /* Gondi */ case HB_TAG('H','M','N',' '): /* Hmong */ return hb_language_from_string ("hmn", -1); /* Hmong */ + case HB_TAG('H','N','D',' '): /* Hindko */ + return hb_language_from_string ("hnd", -1); /* Southern Hindko */ case HB_TAG('I','J','O',' '): /* Ijo */ return hb_language_from_string ("ijo", -1); /* Ijo */ case HB_TAG('I','N','U',' '): /* Inuktitut */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc index 751ccab0b8d..ad3635bdabb 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc @@ -113,6 +113,7 @@ hb_ot_new_tag_to_script (hb_tag_t tag) return HB_SCRIPT_UNKNOWN; } +#ifndef HB_DISABLE_DEPRECATED void hb_ot_tags_from_script (hb_script_t script, hb_tag_t *script_tag_1, @@ -124,6 +125,7 @@ hb_ot_tags_from_script (hb_script_t script, *script_tag_1 = count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_SCRIPT; *script_tag_2 = count > 1 ? tags[1] : HB_OT_TAG_DEFAULT_SCRIPT; } +#endif /* * Complete list at: @@ -198,7 +200,7 @@ lang_matches (const char *lang_str, const char *spec) struct LangTag { char language[4]; - hb_tag_t tags[HB_OT_MAX_TAGS_PER_LANGUAGE]; + hb_tag_t tag; int cmp (const char *a) const { @@ -212,7 +214,7 @@ struct LangTag p = strchr (b, '-'); db = p ? (unsigned int) (p - b) : strlen (b); - return strncmp (a, b, MAX (da, db)); + return strncmp (a, b, hb_max (da, db)); } int cmp (const LangTag *that) const { return cmp (that->language); } @@ -230,6 +232,7 @@ struct LangTag /*{"??", {HB_TAG('Y','I','C',' ')}},*/ /* Yi Classic */ /*{"zh?", {HB_TAG('Z','H','P',' ')}},*/ /* Chinese Phonetic */ +#ifndef HB_DISABLE_DEPRECATED hb_tag_t hb_ot_tag_from_language (hb_language_t language) { @@ -238,6 +241,7 @@ hb_ot_tag_from_language (hb_language_t language) hb_ot_tags_from_script_and_language (HB_SCRIPT_UNKNOWN, language, nullptr, nullptr, &count, tags); return count > 0 ? tags[0] : HB_OT_TAG_DEFAULT_LANGUAGE; } +#endif static void hb_ot_tags_from_language (const char *lang_str, @@ -246,6 +250,7 @@ hb_ot_tags_from_language (const char *lang_str, hb_tag_t *tags) { const char *s; + unsigned int tag_idx; /* Check for matches of multiple subtags. */ if (hb_ot_tags_from_complex_language (lang_str, limit, count, tags)) @@ -254,7 +259,6 @@ hb_ot_tags_from_language (const char *lang_str, /* Find a language matching in the first component. */ s = strchr (lang_str, '-'); { - const LangTag *lang_tag; if (s && limit - lang_str >= 6) { const char *extlang_end = strchr (s + 1, '-'); @@ -263,12 +267,18 @@ hb_ot_tags_from_language (const char *lang_str, ISALPHA (s[1])) lang_str = s + 1; } - lang_tag = hb_sorted_array (ot_languages).bsearch (lang_str); - if (lang_tag) + if (hb_sorted_array (ot_languages).bfind (lang_str, &tag_idx)) { unsigned int i; - for (i = 0; i < *count && lang_tag->tags[i] != HB_TAG_NONE; i++) - tags[i] = lang_tag->tags[i]; + while (tag_idx != 0 && + 0 == strcmp (ot_languages[tag_idx].language, ot_languages[tag_idx - 1].language)) + tag_idx--; + for (i = 0; + i < *count && + tag_idx + i < ARRAY_LENGTH (ot_languages) && + 0 == strcmp (ot_languages[tag_idx + i].language, ot_languages[tag_idx].language); + i++) + tags[i] = ot_languages[tag_idx + i].tag; *count = i; return; } @@ -417,20 +427,33 @@ hb_ot_tag_to_language (hb_tag_t tag) } for (i = 0; i < ARRAY_LENGTH (ot_languages); i++) - if (ot_languages[i].tags[0] == tag) + if (ot_languages[i].tag == tag) return hb_language_from_string (ot_languages[i].language, -1); - /* Else return a custom language in the form of "x-hbotABCD" */ + /* If it's three letters long, assume it's ISO 639-3 and lower-case and use it + * (if it's not a registered tag, calling hb_ot_tag_from_language on the + * result might not return the same tag as the original tag). + * Else return a custom language in the form of "x-hbotABCD". */ { - unsigned char buf[11] = "x-hbot"; + char buf[11] = "x-hbot"; + char *str = buf; buf[6] = tag >> 24; buf[7] = (tag >> 16) & 0xFF; buf[8] = (tag >> 8) & 0xFF; buf[9] = tag & 0xFF; if (buf[9] == 0x20) + { buf[9] = '\0'; + if (ISALPHA (buf[6]) && ISALPHA (buf[7]) && ISALPHA (buf[8])) + { + buf[6] = TOLOWER (buf[6]); + buf[7] = TOLOWER (buf[7]); + buf[8] = TOLOWER (buf[8]); + str += 6; + } + } buf[10] = '\0'; - return hb_language_from_string ((char *) buf, -1); + return hb_language_from_string (str, -1); } } @@ -506,7 +529,7 @@ test_langs_sorted () for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++) { int c = ot_languages[i].cmp (&ot_languages[i - 1]); - if (c >= 0) + if (c > 0) { fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n", i, ot_languages[i-1].language, c, ot_languages[i].language); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh index c4a192dc918..57a3a6d16f8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh @@ -123,7 +123,7 @@ struct avar void map_coords (int *coords, unsigned int coords_length) const { - unsigned int count = MIN<unsigned int> (coords_length, axisCount); + unsigned int count = hb_min (coords_length, axisCount); const SegmentMaps *map = &firstAxisSegmentMaps; for (unsigned int i = 0; i < count; i++) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh index 78cb3c867fa..7df81428fcc 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh @@ -114,17 +114,19 @@ struct fvar unsigned int get_axis_count () const { return axisCount; } +#ifndef HB_DISABLE_DEPRECATED void get_axis_deprecated (unsigned int axis_index, hb_ot_var_axis_t *info) const { const AxisRecord &axis = get_axes ()[axis_index]; info->tag = axis.axisTag; info->name_id = axis.axisNameID; - info->default_value = axis.defaultValue / 65536.; + info->default_value = axis.defaultValue / 65536.f; /* Ensure order, to simplify client math. */ - info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.); - info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.); + info->min_value = hb_min (info->default_value, axis.minValue / 65536.f); + info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f); } +#endif void get_axis_info (unsigned int axis_index, hb_ot_var_axis_info_t *info) const @@ -134,13 +136,14 @@ struct fvar info->tag = axis.axisTag; info->name_id = axis.axisNameID; info->flags = (hb_ot_var_axis_flags_t) (unsigned int) axis.flags; - info->default_value = axis.defaultValue / 65536.; + info->default_value = axis.defaultValue / 65536.f; /* Ensure order, to simplify client math. */ - info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.); - info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.); + info->min_value = hb_min (info->default_value, axis.minValue / 65536.f); + info->max_value = hb_max (info->default_value, axis.maxValue / 65536.f); info->reserved = 0; } +#ifndef HB_DISABLE_DEPRECATED unsigned int get_axes_deprecated (unsigned int start_offset, unsigned int *axes_count /* IN/OUT */, hb_ot_var_axis_t *axes_array /* OUT */) const @@ -149,12 +152,12 @@ struct fvar { /* TODO Rewrite as hb_array_t<>::sub-array() */ unsigned int count = axisCount; - start_offset = MIN (start_offset, count); + start_offset = hb_min (start_offset, count); count -= start_offset; axes_array += start_offset; - count = MIN (count, *axes_count); + count = hb_min (count, *axes_count); *axes_count = count; for (unsigned int i = 0; i < count; i++) @@ -162,6 +165,7 @@ struct fvar } return axisCount; } +#endif unsigned int get_axis_infos (unsigned int start_offset, unsigned int *axes_count /* IN/OUT */, @@ -171,12 +175,12 @@ struct fvar { /* TODO Rewrite as hb_array_t<>::sub-array() */ unsigned int count = axisCount; - start_offset = MIN (start_offset, count); + start_offset = hb_min (start_offset, count); count -= start_offset; axes_array += start_offset; - count = MIN (count, *axes_count); + count = hb_min (count, *axes_count); *axes_count = count; for (unsigned int i = 0; i < count; i++) @@ -185,6 +189,7 @@ struct fvar return axisCount; } +#ifndef HB_DISABLE_DEPRECATED bool find_axis_deprecated (hb_tag_t tag, unsigned int *axis_index, hb_ot_var_axis_t *info) const @@ -203,6 +208,7 @@ struct fvar *axis_index = HB_OT_VAR_NO_AXIS_INDEX; return false; } +#endif bool find_axis_info (hb_tag_t tag, hb_ot_var_axis_info_t *info) const @@ -223,7 +229,7 @@ struct fvar hb_ot_var_axis_info_t axis; get_axis_info (axis_index, &axis); - v = MAX (MIN (v, axis.max_value), axis.min_value); /* Clamp. */ + v = hb_max (hb_min (v, axis.max_value), axis.min_value); /* Clamp. */ if (v == axis.default_value) return 0; @@ -253,8 +259,8 @@ struct fvar } unsigned int get_instance_coords (unsigned int instance_index, - unsigned int *coords_length, /* IN/OUT */ - float *coords /* OUT */) const + unsigned int *coords_length, /* IN/OUT */ + float *coords /* OUT */) const { const InstanceRecord *instance = get_instance (instance_index); if (unlikely (!instance)) @@ -274,6 +280,27 @@ struct fvar return axisCount; } + void collect_name_ids (hb_set_t *nameids) const + { + if (!has_data ()) return; + + + get_axes () + | hb_map (&AxisRecord::axisNameID) + | hb_sink (nameids) + ; + + + hb_range ((unsigned) instanceCount) + | hb_map ([this] (const unsigned _) { return get_instance_subfamily_name_id (_); }) + | hb_sink (nameids) + ; + + + hb_range ((unsigned) instanceCount) + | hb_map ([this] (const unsigned _) { return get_instance_postscript_name_id (_); }) + | hb_sink (nameids) + ; + } + + protected: hb_array_t<const AxisRecord> get_axes () const { return hb_array (&(this+firstAxis), axisCount); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc index e327fb76243..25a246a2130 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc @@ -75,6 +75,7 @@ hb_ot_var_get_axis_count (hb_face_t *face) return face->table.fvar->get_axis_count (); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_ot_var_get_axes: * @@ -104,6 +105,7 @@ hb_ot_var_find_axis (hb_face_t *face, { return face->table.fvar->find_axis_deprecated (axis_tag, axis_index, axis_info); } +#endif /** * hb_ot_var_get_axis_infos: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh index 39073db8f32..b2059e86e64 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh @@ -81,11 +81,11 @@ struct VORG if (unlikely (!c.extend_min (*subset_table))) return false; - subset_table->version.major.set (1); - subset_table->version.minor.set (0); + subset_table->version.major = 1; + subset_table->version.minor = 0; - subset_table->defaultVertOriginY.set (vorg_table->defaultVertOriginY); - subset_table->vertYOrigins.len.set (subset_metrics.length); + subset_table->defaultVertOriginY = vorg_table->defaultVertOriginY; + subset_table->vertYOrigins.len = subset_metrics.length; bool success = true; if (subset_metrics.length > 0) @@ -130,8 +130,8 @@ struct VORG if (plan->new_gid_for_old_gid (old_glyph, &new_glyph)) { VertOriginMetric *metrics = subset_metrics.push (); - metrics->glyph.set (new_glyph); - metrics->vertOriginY.set (vertYOrigins[i].vertOriginY); + metrics->glyph = new_glyph; + metrics->vertOriginY = vertYOrigins[i].vertOriginY; } } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-pool.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-pool.hh new file mode 100644 index 00000000000..ff0ee194c85 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-pool.hh @@ -0,0 +1,102 @@ +/* + * Copyright © 2019 Facebook, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Facebook Author(s): Behdad Esfahbod + */ + +#ifndef HB_POOL_HH +#define HB_POOL_HH + +#include "hb.hh" + +/* Memory pool for persistent allocation of small objects. */ + +template <typename T, unsigned ChunkLen = 16> +struct hb_pool_t +{ + hb_pool_t () : next (nullptr) {} + ~hb_pool_t () { fini (); } + + void fini () + { + next = nullptr; + + + hb_iter (chunks) + | hb_apply ([] (chunk_t *_) { ::free (_); }) + ; + + chunks.fini (); + } + + T* alloc () + { + if (unlikely (!next)) + { + if (unlikely (!chunks.alloc (chunks.length + 1))) return nullptr; + chunk_t *chunk = (chunk_t *) calloc (1, sizeof (chunk_t)); + if (unlikely (!chunk)) return nullptr; + chunks.push (chunk); + next = chunk->thread (); + } + + T* obj = next; + next = * ((T**) next); + + memset (obj, 0, sizeof (T)); + + return obj; + } + + void free (T* obj) + { + * (T**) obj = next; + next = obj; + } + + private: + + static_assert (ChunkLen > 1, ""); + static_assert (sizeof (T) >= sizeof (void *), ""); + static_assert (alignof (T) % sizeof (void *) == 0, ""); + + struct chunk_t + { + T* thread () + { + for (unsigned i = 0; i < ARRAY_LENGTH (arrayZ) - 1; i++) + * (T**) &arrayZ[i] = &arrayZ[i + 1]; + + * (T**) &arrayZ[ARRAY_LENGTH (arrayZ) - 1] = nullptr; + + return arrayZ; + } + + T arrayZ[ChunkLen]; + }; + + T* next; + hb_vector_t<chunk_t *> chunks; +}; + + +#endif /* HB_POOL_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh new file mode 100644 index 00000000000..5f5b4bdc988 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh @@ -0,0 +1,401 @@ +/* + * Copyright © 2007,2008,2009,2010 Red Hat, Inc. + * Copyright © 2012,2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_SANITIZE_HH +#define HB_SANITIZE_HH + +#include "hb.hh" +#include "hb-blob.hh" +#include "hb-dispatch.hh" + + +/* + * Sanitize + * + * + * === Introduction === + * + * The sanitize machinery is at the core of our zero-cost font loading. We + * mmap() font file into memory and create a blob out of it. Font subtables + * are returned as a readonly sub-blob of the main font blob. These table + * blobs are then sanitized before use, to ensure invalid memory access does + * not happen. The toplevel sanitize API use is like, eg. to load the 'head' + * table: + * + * hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<OT::head> (face); + * + * The blob then can be converted to a head table struct with: + * + * const head *head_table = head_blob->as<head> (); + * + * What the reference_table does is, to call hb_face_reference_table() to load + * the table blob, sanitize it and return either the sanitized blob, or empty + * blob if sanitization failed. The blob->as() function returns the null + * object of its template type argument if the blob is empty. Otherwise, it + * just casts the blob contents to the desired type. + * + * Sanitizing a blob of data with a type T works as follows (with minor + * simplification): + * + * - Cast blob content to T*, call sanitize() method of it, + * - If sanitize succeeded, return blob. + * - Otherwise, if blob is not writable, try making it writable, + * or copy if cannot be made writable in-place, + * - Call sanitize() again. Return blob if sanitize succeeded. + * - Return empty blob otherwise. + * + * + * === The sanitize() contract === + * + * The sanitize() method of each object type shall return true if it's safe to + * call other methods of the object, and false otherwise. + * + * Note that what sanitize() checks for might align with what the specification + * describes as valid table data, but does not have to be. In particular, we + * do NOT want to be pedantic and concern ourselves with validity checks that + * are irrelevant to our use of the table. On the contrary, we want to be + * lenient with error handling and accept invalid data to the extent that it + * does not impose extra burden on us. + * + * Based on the sanitize contract, one can see that what we check for depends + * on how we use the data in other table methods. Ie. if other table methods + * assume that offsets do NOT point out of the table data block, then that's + * something sanitize() must check for (GSUB/GPOS/GDEF/etc work this way). On + * the other hand, if other methods do such checks themselves, then sanitize() + * does not have to bother with them (glyf/local work this way). The choice + * depends on the table structure and sanitize() performance. For example, to + * check glyf/loca offsets in sanitize() would cost O(num-glyphs). We try hard + * to avoid such costs during font loading. By postponing such checks to the + * actual glyph loading, we reduce the sanitize cost to O(1) and total runtime + * cost to O(used-glyphs). As such, this is preferred. + * + * The same argument can be made re GSUB/GPOS/GDEF, but there, the table + * structure is so complicated that by checking all offsets at sanitize() time, + * we make the code much simpler in other methods, as offsets and referenced + * objects do not need to be validated at each use site. + */ + +/* This limits sanitizing time on really broken fonts. */ +#ifndef HB_SANITIZE_MAX_EDITS +#define HB_SANITIZE_MAX_EDITS 32 +#endif +#ifndef HB_SANITIZE_MAX_OPS_FACTOR +#define HB_SANITIZE_MAX_OPS_FACTOR 8 +#endif +#ifndef HB_SANITIZE_MAX_OPS_MIN +#define HB_SANITIZE_MAX_OPS_MIN 16384 +#endif +#ifndef HB_SANITIZE_MAX_OPS_MAX +#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF +#endif + +struct hb_sanitize_context_t : + hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE> +{ + hb_sanitize_context_t () : + debug_depth (0), + start (nullptr), end (nullptr), + max_ops (0), + writable (false), edit_count (0), + blob (nullptr), + num_glyphs (65536), + num_glyphs_set (false) {} + + const char *get_name () { return "SANITIZE"; } + template <typename T, typename F> + bool may_dispatch (const T *obj HB_UNUSED, const F *format) + { return format->sanitize (this); } + static return_t default_return_value () { return true; } + static return_t no_dispatch_return_value () { return false; } + bool stop_sublookup_iteration (const return_t r) const { return !r; } + + private: + template <typename T, typename ...Ts> auto + _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN + ( obj.sanitize (this, hb_forward<Ts> (ds)...) ) + template <typename T, typename ...Ts> auto + _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN + ( obj.dispatch (this, hb_forward<Ts> (ds)...) ) + public: + template <typename T, typename ...Ts> auto + dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN + ( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) ) + + + void init (hb_blob_t *b) + { + this->blob = hb_blob_reference (b); + this->writable = false; + } + + void set_num_glyphs (unsigned int num_glyphs_) + { + num_glyphs = num_glyphs_; + num_glyphs_set = true; + } + unsigned int get_num_glyphs () { return num_glyphs; } + + void set_max_ops (int max_ops_) { max_ops = max_ops_; } + + template <typename T> + void set_object (const T *obj) + { + reset_object (); + + if (!obj) return; + + const char *obj_start = (const char *) obj; + if (unlikely (obj_start < this->start || this->end <= obj_start)) + this->start = this->end = nullptr; + else + { + this->start = obj_start; + this->end = obj_start + hb_min (size_t (this->end - obj_start), obj->get_size ()); + } + } + + void reset_object () + { + this->start = this->blob->data; + this->end = this->start + this->blob->length; + assert (this->start <= this->end); /* Must not overflow. */ + } + + void start_processing () + { + reset_object (); + this->max_ops = hb_max ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR, + (unsigned) HB_SANITIZE_MAX_OPS_MIN); + this->edit_count = 0; + this->debug_depth = 0; + + DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1, + "start [%p..%p] (%lu bytes)", + this->start, this->end, + (unsigned long) (this->end - this->start)); + } + + void end_processing () + { + DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1, + "end [%p..%p] %u edit requests", + this->start, this->end, this->edit_count); + + hb_blob_destroy (this->blob); + this->blob = nullptr; + this->start = this->end = nullptr; + } + + unsigned get_edit_count () { return edit_count; } + + bool check_range (const void *base, + unsigned int len) const + { + const char *p = (const char *) base; + bool ok = !len || + (this->start <= p && + p <= this->end && + (unsigned int) (this->end - p) >= len && + this->max_ops-- > 0); + + 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, + ok ? "OK" : "OUT-OF-RANGE"); + + return likely (ok); + } + + template <typename T> + bool check_range (const T *base, + unsigned int a, + unsigned int b) const + { + return !hb_unsigned_mul_overflows (a, b) && + this->check_range (base, a * b); + } + + template <typename T> + bool check_range (const T *base, + unsigned int a, + unsigned int b, + unsigned int c) const + { + return !hb_unsigned_mul_overflows (a, b) && + this->check_range (base, a * b, c); + } + + template <typename T> + bool check_array (const T *base, unsigned int len) const + { + return this->check_range (base, len, hb_static_size (T)); + } + + template <typename T> + bool check_array (const T *base, + unsigned int a, + unsigned int b) const + { + return this->check_range (base, a, b, hb_static_size (T)); + } + + template <typename Type> + bool check_struct (const Type *obj) const + { return likely (this->check_range (obj, obj->min_size)); } + + bool may_edit (const void *base, unsigned int len) + { + if (this->edit_count >= HB_SANITIZE_MAX_EDITS) + return false; + + const char *p = (const char *) base; + this->edit_count++; + + 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 this->writable; + } + + template <typename Type, typename ValueType> + bool try_set (const Type *obj, const ValueType &v) + { + if (this->may_edit (obj, hb_static_size (Type))) + { + * const_cast<Type *> (obj) = v; + return true; + } + return false; + } + + template <typename Type> + hb_blob_t *sanitize_blob (hb_blob_t *blob) + { + bool sane; + + init (blob); + + retry: + DEBUG_MSG_FUNC (SANITIZE, start, "start"); + + start_processing (); + + if (unlikely (!start)) + { + end_processing (); + return blob; + } + + Type *t = reinterpret_cast<Type *> (const_cast<char *> (start)); + + sane = t->sanitize (this); + if (sane) + { + if (edit_count) + { + DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %d edits; going for second round", edit_count); + + /* sanitize again to ensure no toe-stepping */ + edit_count = 0; + sane = t->sanitize (this); + if (edit_count) { + DEBUG_MSG_FUNC (SANITIZE, start, "requested %d edits in second round; FAILLING", edit_count); + sane = false; + } + } + } + else + { + if (edit_count && !writable) { + start = hb_blob_get_data_writable (blob, nullptr); + end = start + blob->length; + + if (start) + { + writable = true; + /* ok, we made it writable by relocating. try again */ + DEBUG_MSG_FUNC (SANITIZE, start, "retry"); + goto retry; + } + } + } + + end_processing (); + + DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED"); + if (sane) + { + hb_blob_make_immutable (blob); + return blob; + } + else + { + hb_blob_destroy (blob); + return hb_blob_get_empty (); + } + } + + template <typename Type> + hb_blob_t *reference_table (const hb_face_t *face, hb_tag_t tableTag = Type::tableTag) + { + if (!num_glyphs_set) + set_num_glyphs (hb_face_get_glyph_count (face)); + return sanitize_blob<Type> (hb_face_reference_table (face, tableTag)); + } + + mutable unsigned int debug_depth; + const char *start, *end; + mutable int max_ops; + private: + bool writable; + unsigned int edit_count; + hb_blob_t *blob; + unsigned int num_glyphs; + bool num_glyphs_set; +}; + +struct hb_sanitize_with_object_t +{ + template <typename T> + hb_sanitize_with_object_t (hb_sanitize_context_t *c, const T& obj) : c (c) + { c->set_object (obj); } + ~hb_sanitize_with_object_t () + { c->reset_object (); } + + private: + hb_sanitize_context_t *c; +}; + + +#endif /* HB_SANITIZE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh new file mode 100644 index 00000000000..76f70160842 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh @@ -0,0 +1,473 @@ +/* + * Copyright © 2007,2008,2009,2010 Red Hat, Inc. + * Copyright © 2012,2018 Google, Inc. + * Copyright © 2019 Facebook, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + * Facebook Author(s): Behdad Esfahbod + */ + +#ifndef HB_SERIALIZE_HH +#define HB_SERIALIZE_HH + +#include "hb.hh" +#include "hb-blob.hh" +#include "hb-map.hh" +#include "hb-pool.hh" + + +/* + * Serialize + */ + +struct hb_serialize_context_t +{ + typedef unsigned objidx_t; + + struct range_t + { + char *head, *tail; + }; + + struct object_t : range_t + { + void fini () { links.fini (); } + + bool operator == (const object_t &o) const + { + return (tail - head == o.tail - o.head) + && (links.length == o.links.length) + && 0 == hb_memcmp (head, o.head, tail - head) + && links.as_bytes () == o.links.as_bytes (); + } + uint32_t hash () const + { + return hb_bytes_t (head, tail - head).hash () ^ + links.as_bytes ().hash (); + } + + struct link_t + { + bool is_wide: 1; + unsigned position : 31; + unsigned bias; + objidx_t objidx; + }; + + hb_vector_t<link_t> links; + object_t *next; + }; + + range_t snapshot () { range_t s = {head, tail} ; return s; } + + + hb_serialize_context_t (void *start_, unsigned int size) : + start ((char *) start_), + end (start + size), + current (nullptr) + { reset (); } + ~hb_serialize_context_t () { fini (); } + + void fini () + { + ++ hb_iter (packed) + | hb_apply ([] (object_t *_) { _->fini (); }) + ; + packed.fini (); + this->packed_map.fini (); + + while (current) + { + auto *_ = current; + current = current->next; + _->fini (); + } + object_pool.fini (); + } + + bool in_error () const { return !this->successful; } + + void reset () + { + this->successful = true; + this->ran_out_of_room = false; + this->head = this->start; + this->tail = this->end; + this->debug_depth = 0; + + fini (); + this->packed.push (nullptr); + } + + bool check_success (bool success) + { return this->successful && (success || (err_other_error (), false)); } + + template <typename T1, typename T2> + bool check_equal (T1 &&v1, T2 &&v2) + { return check_success (v1 == v2); } + + template <typename T1, typename T2> + bool check_assign (T1 &v1, T2 &&v2) + { return check_equal (v1 = v2, v2); } + + template <typename T> bool propagate_error (T &&obj) + { return check_success (!hb_deref (obj).in_error ()); } + + template <typename T1, typename... Ts> bool propagate_error (T1 &&o1, Ts&&... os) + { return propagate_error (hb_forward<T1> (o1)) && + propagate_error (hb_forward<Ts> (os)...); } + + /* To be called around main operation. */ + template <typename Type> + Type *start_serialize () + { + DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1, + "start [%p..%p] (%lu bytes)", + this->start, this->end, + (unsigned long) (this->end - this->start)); + + assert (!current); + return push<Type> (); + } + void end_serialize () + { + DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, -1, + "end [%p..%p] serialized %u bytes; %s", + this->start, this->end, + (unsigned) (this->head - this->start), + this->successful ? "successful" : "UNSUCCESSFUL"); + + propagate_error (packed, packed_map); + + if (unlikely (!current)) return; + assert (!current->next); + + /* Only "pack" if there exist other objects... Otherwise, don't bother. + * Saves a move. */ + if (packed.length <= 1) + return; + + pop_pack (); + + resolve_links (); + } + + template <typename Type = void> + Type *push () + { + object_t *obj = object_pool.alloc (); + if (unlikely (!obj)) + check_success (false); + else + { + obj->head = head; + obj->tail = tail; + obj->next = current; + current = obj; + } + return start_embed<Type> (); + } + void pop_discard () + { + object_t *obj = current; + if (unlikely (!obj)) return; + current = current->next; + revert (*obj); + object_pool.free (obj); + } + objidx_t pop_pack () + { + object_t *obj = current; + if (unlikely (!obj)) return 0; + current = current->next; + obj->tail = head; + obj->next = nullptr; + unsigned len = obj->tail - obj->head; + head = obj->head; /* Rewind head. */ + + if (!len) + { + assert (!obj->links.length); + return 0; + } + + objidx_t objidx = packed_map.get (obj); + if (objidx) + { + obj->fini (); + return objidx; + } + + tail -= len; + memmove (tail, obj->head, len); + + obj->head = tail; + obj->tail = tail + len; + + packed.push (obj); + + if (unlikely (packed.in_error ())) + return 0; + + objidx = packed.length - 1; + + packed_map.set (obj, objidx); + + return objidx; + } + + void revert (range_t snap) + { + assert (snap.head <= head); + assert (tail <= snap.tail); + head = snap.head; + tail = snap.tail; + discard_stale_objects (); + } + + void discard_stale_objects () + { + while (packed.length > 1 && + packed.tail ()->head < tail) + { + packed_map.del (packed.tail ()); + assert (!packed.tail ()->next); + packed.tail ()->fini (); + packed.pop (); + } + if (packed.length > 1) + assert (packed.tail ()->head == tail); + } + + template <typename T> + void add_link (T &ofs, objidx_t objidx, const void *base = nullptr) + { + static_assert (sizeof (T) == 2 || sizeof (T) == 4, ""); + + if (!objidx) + return; + + assert (current); + assert (current->head <= (const char *) &ofs); + + if (!base) + base = current->head; + else + assert (current->head <= (const char *) base); + + auto& link = *current->links.push (); + link.is_wide = sizeof (T) == 4; + link.position = (const char *) &ofs - current->head; + link.bias = (const char *) base - current->head; + link.objidx = objidx; + } + + void resolve_links () + { + if (unlikely (in_error ())) return; + + assert (!current); + assert (packed.length > 1); + + for (const object_t* parent : ++hb_iter (packed)) + { + for (const object_t::link_t &link : parent->links) + { + const object_t* child = packed[link.objidx]; + assert (link.bias <= (size_t) (parent->tail - parent->head)); + unsigned offset = (child->head - parent->head) - link.bias; + + if (link.is_wide) + { + auto &off = * ((BEInt<uint32_t, 4> *) (parent->head + link.position)); + assert (0 == off); + check_assign (off, offset); + } + else + { + auto &off = * ((BEInt<uint16_t, 2> *) (parent->head + link.position)); + assert (0 == off); + check_assign (off, offset); + } + } + } + } + + unsigned int length () const { return this->head - current->head; } + + void align (unsigned int alignment) + { + unsigned int l = length () % alignment; + if (l) + allocate_size<void> (alignment - l); + } + + template <typename Type = void> + Type *start_embed (const Type *obj HB_UNUSED = nullptr) const + { return reinterpret_cast<Type *> (this->head); } + template <typename Type> + Type *start_embed (const Type &obj) const + { return start_embed (hb_addressof (obj)); } + + /* Following two functions exist to allow setting breakpoint on. */ + void err_ran_out_of_room () { this->ran_out_of_room = true; } + void err_other_error () { this->successful = false; } + + template <typename Type> + Type *allocate_size (unsigned int size) + { + if (unlikely (!this->successful)) return nullptr; + + if (this->tail - this->head < ptrdiff_t (size)) + { + err_ran_out_of_room (); + this->successful = false; + return nullptr; + } + memset (this->head, 0, size); + char *ret = this->head; + this->head += size; + return reinterpret_cast<Type *> (ret); + } + + template <typename Type> + Type *allocate_min () + { + return this->allocate_size<Type> (Type::min_size); + } + + template <typename Type> + Type *embed (const Type *obj) + { + unsigned int size = obj->get_size (); + Type *ret = this->allocate_size<Type> (size); + if (unlikely (!ret)) return nullptr; + memcpy (ret, obj, size); + return ret; + } + template <typename Type> + Type *embed (const Type &obj) + { return embed (hb_addressof (obj)); } + + template <typename Type, typename ...Ts> auto + _copy (const Type &src, hb_priority<1>, Ts&&... ds) HB_RETURN + (Type *, src.copy (this, hb_forward<Ts> (ds)...)) + + template <typename Type> auto + _copy (const Type &src, hb_priority<0>) -> decltype (&(src = src)) + { + Type *ret = this->allocate_size<Type> (sizeof (Type)); + if (unlikely (!ret)) return nullptr; + *ret = src; + return ret; + } + + /* Like embed, but active: calls obj.operator=() or obj.copy() to transfer data + * instead of memcpy(). */ + template <typename Type, typename ...Ts> + Type *copy (const Type &src, Ts&&... ds) + { return _copy (src, hb_prioritize, hb_forward<Ts> (ds)...); } + template <typename Type, typename ...Ts> + Type *copy (const Type *src, Ts&&... ds) + { return copy (*src, hb_forward<Ts> (ds)...); } + + template <typename Type> + hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; } + + template <typename Type> + Type *extend_size (Type *obj, unsigned int size) + { + assert (this->start <= (char *) obj); + assert ((char *) obj <= this->head); + assert ((char *) obj + size >= this->head); + if (unlikely (!this->allocate_size<Type> (((char *) obj) + size - this->head))) return nullptr; + return reinterpret_cast<Type *> (obj); + } + template <typename Type> + Type *extend_size (Type &obj, unsigned int size) + { return extend_size (hb_addressof (obj), size); } + + template <typename Type> + Type *extend_min (Type *obj) { return extend_size (obj, obj->min_size); } + template <typename Type> + Type *extend_min (Type &obj) { return extend_min (hb_addressof (obj)); } + + template <typename Type, typename ...Ts> + Type *extend (Type *obj, Ts&&... ds) + { return extend_size (obj, obj->get_size (hb_forward<Ts> (ds)...)); } + template <typename Type, typename ...Ts> + Type *extend (Type &obj, Ts&&... ds) + { return extend (hb_addressof (obj), hb_forward<Ts> (ds)...); } + + /* Output routines. */ + hb_bytes_t copy_bytes () const + { + assert (this->successful); + /* Copy both items from head side and tail side... */ + unsigned int len = (this->head - this->start) + + (this->end - this->tail); + char *p = (char *) malloc (len); + if (p) + { + memcpy (p, this->start, this->head - this->start); + memcpy (p + (this->head - this->start), this->tail, this->end - this->tail); + } + else + return hb_bytes_t (); + return hb_bytes_t (p, len); + } + template <typename Type> + Type *copy () const + { return reinterpret_cast<Type *> ((char *) copy_bytes ().arrayZ); } + hb_blob_t *copy_blob () const + { + hb_bytes_t b = copy_bytes (); + return hb_blob_create (b.arrayZ, b.length, + HB_MEMORY_MODE_WRITABLE, + (char *) b.arrayZ, free); + } + + public: /* TODO Make private. */ + char *start, *head, *tail, *end; + unsigned int debug_depth; + bool successful; + bool ran_out_of_room; + + private: + + /* Object memory pool. */ + hb_pool_t<object_t> object_pool; + + /* Stack of currently under construction objects. */ + object_t *current; + + /* Stack of packed objects. Object 0 is always nil object. */ + hb_vector_t<object_t *> packed; + + /* Map view of packed objects. */ + hb_hashmap_t<const object_t *, objidx_t, nullptr, 0> packed_map; +}; + + +#endif /* HB_SERIALIZE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc index 06823626452..fa986880968 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc @@ -389,6 +389,7 @@ hb_set_symmetric_difference (hb_set_t *set, set->symmetric_difference (other); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_set_invert: * @set: a set. @@ -403,6 +404,7 @@ void hb_set_invert (hb_set_t *set HB_UNUSED) { } +#endif /** * hb_set_get_population: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh index 64a136385ff..ad449d0ce7a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh @@ -28,6 +28,7 @@ #define HB_SET_HH #include "hb.hh" +#include "hb-machinery.hh" /* @@ -39,7 +40,7 @@ struct hb_set_t { - HB_NO_COPY_ASSIGN (hb_set_t); + HB_DELETE_COPY_ASSIGN (hb_set_t); hb_set_t () { init (); } ~hb_set_t () { fini (); } @@ -69,7 +70,7 @@ struct hb_set_t void add (hb_codepoint_t g) { elt (g) |= mask (g); } void del (hb_codepoint_t g) { elt (g) &= ~mask (g); } - bool has (hb_codepoint_t g) const { return !!(elt (g) & mask (g)); } + bool get (hb_codepoint_t g) const { return elt (g) & mask (g); } void add_range (hb_codepoint_t a, hb_codepoint_t b) { @@ -186,7 +187,7 @@ struct hb_set_t hb_object_header_t header; bool successful; /* Allocations successful */ mutable unsigned int population; - hb_vector_t<page_map_t> page_map; + hb_sorted_vector_t<page_map_t> page_map; hb_vector_t<page_t> pages; void init_shallow () @@ -227,11 +228,18 @@ struct hb_set_t return true; } - void clear () + void reset () { if (unlikely (hb_object_is_immutable (this))) return; + clear (); successful = true; + } + + void clear () + { + if (unlikely (hb_object_is_immutable (this))) + return; population = 0; page_map.resize (0); pages.resize (0); @@ -301,7 +309,7 @@ struct hb_set_t { page->add (g); - array = (const T *) ((const char *) array + stride); + array = &StructAtOffsetUnaligned<T> (array, stride); count--; } while (count && (g = *array, start <= g && g < end)); @@ -357,15 +365,26 @@ struct hb_set_t for (unsigned int i = a; i < b + 1; i++) del (i); } - bool has (hb_codepoint_t g) const + bool get (hb_codepoint_t g) const { const page_t *page = page_for (g); if (!page) return false; - return page->has (g); + return page->get (g); } - bool intersects (hb_codepoint_t first, - hb_codepoint_t last) const + + /* Has interface. */ + static constexpr bool SENTINEL = false; + typedef bool value_t; + value_t operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + /* Predicate. */ + bool operator () (hb_codepoint_t k) const { return has (k); } + + /* Sink interface. */ + hb_set_t& operator << (hb_codepoint_t v) { add (v); return *this; } + + bool intersects (hb_codepoint_t first, hb_codepoint_t last) const { hb_codepoint_t c = first - 1; return next (&c) && c <= last; @@ -422,8 +441,8 @@ struct hb_set_t return true; } - template <class Op> - void process (const hb_set_t *other) + template <typename Op> + void process (const Op& op, const hb_set_t *other) { if (unlikely (!successful)) return; @@ -477,7 +496,7 @@ struct hb_set_t b--; count--; page_map[count] = page_map[a]; - Op::process (page_at (count).v, page_at (a).v, other->page_at (b).v); + page_at (count).v = op (page_at (a).v, other->page_at (b).v); } else if (page_map[a - 1].major > other->page_map[b - 1].major) { @@ -523,19 +542,19 @@ struct hb_set_t void union_ (const hb_set_t *other) { - process<HbOpOr> (other); + process (hb_bitwise_or, other); } void intersect (const hb_set_t *other) { - process<HbOpAnd> (other); + process (hb_bitwise_and, other); } void subtract (const hb_set_t *other) { - process<HbOpMinus> (other); + process (hb_bitwise_sub, other); } void symmetric_difference (const hb_set_t *other) { - process<HbOpXor> (other); + process (hb_bitwise_xor, other); } bool next (hb_codepoint_t *codepoint) const { @@ -671,27 +690,29 @@ struct hb_set_t /* * Iterator implementation. */ - struct const_iter_t : hb_sorted_iter_t<const_iter_t, const hb_codepoint_t> + struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t> { - const_iter_t (const hb_set_t &s_) : - s (s_), v (INVALID), l (s.get_population () + 1) { __next__ (); } + static constexpr bool is_sorted_iterator = true; + iter_t (const hb_set_t &s_ = Null(hb_set_t)) : + s (&s_), v (INVALID), l (s->get_population () + 1) { __next__ (); } - typedef hb_codepoint_t __item_type__; + typedef hb_codepoint_t __item_t__; hb_codepoint_t __item__ () const { return v; } bool __more__ () const { return v != INVALID; } - void __next__ () { s.next (&v); if (l) l--; } - void __prev__ () { s.previous (&v); } - unsigned __len__ () { return l; } + void __next__ () { s->next (&v); if (l) l--; } + void __prev__ () { s->previous (&v); } + unsigned __len__ () const { return l; } + iter_t end () const { return iter_t (*s); } + bool operator != (const iter_t& o) const + { return s != o.s || v != o.v; } protected: - const hb_set_t &s; + const hb_set_t *s; hb_codepoint_t v; unsigned l; }; - const_iter_t const_iter () const { return const_iter_t (*this); } - operator const_iter_t () const { return const_iter (); } - typedef const_iter_t iter_t; - iter_t iter () const { return const_iter (); } + iter_t iter () const { return iter_t (*this); } + operator iter_t () const { return iter (); } protected: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh index 36d8fc7f660..25c584bc054 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-list.hh @@ -45,10 +45,6 @@ HB_SHAPER_IMPLEMENT (directwrite) #endif #ifdef HAVE_CORETEXT HB_SHAPER_IMPLEMENT (coretext) - -/* Only picks up fonts that have a "mort" or "morx" table. - Probably going to be removed https://github.com/harfbuzz/harfbuzz/issues/1478 */ -HB_SHAPER_IMPLEMENT (coretext_aat) #endif #ifdef HAVE_FALLBACK diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc index 4c515886024..6b89183cab8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc @@ -37,6 +37,7 @@ #include "hb-ot-maxp-table.hh" #ifndef HB_NO_VISIBILITY +#include "hb-ot-name-language-static.hh" hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)] = {}; /*thread_local*/ hb_vector_size_impl_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)] = {}; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.cc index f29937a2276..aa5d27b36ac 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.cc @@ -160,13 +160,13 @@ serialize_fdselect_3_4 (hb_serialize_context_t *c, TRACE_SERIALIZE (this); FDSELECT3_4 *p = c->allocate_size<FDSELECT3_4> (size); if (unlikely (p == nullptr)) return_trace (false); - p->nRanges ().set (fdselect_ranges.length); + p->nRanges () = fdselect_ranges.length; for (unsigned int i = 0; i < fdselect_ranges.length; i++) { - p->ranges[i].first.set (fdselect_ranges[i].glyph); - p->ranges[i].fd.set (fdselect_ranges[i].code); + p->ranges[i].first = fdselect_ranges[i].glyph; + p->ranges[i].fd = fdselect_ranges[i].code; } - p->sentinel().set (num_glyphs); + p->sentinel() = num_glyphs; return_trace (true); } @@ -186,7 +186,7 @@ hb_serialize_cff_fdselect (hb_serialize_context_t *c, TRACE_SERIALIZE (this); FDSelect *p = c->allocate_min<FDSelect> (); if (unlikely (p == nullptr)) return_trace (false); - p->format.set (fdselect_format); + p->format = fdselect_format; size -= FDSelect::min_size; switch (fdselect_format) @@ -205,7 +205,7 @@ hb_serialize_cff_fdselect (hb_serialize_context_t *c, { fd = fdselect_ranges[range_index++].code; } - p->fds[i].set (fd); + p->fds[i] = fd; } break; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh index 81368ee4c54..921b0253d6a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh @@ -209,7 +209,7 @@ struct cff_font_dict_op_serializer_t : op_serializer_t /* serialize the opcode */ HBUINT8 *p = c->allocate_size<HBUINT8> (1); if (unlikely (p == nullptr)) return_trace (false); - p->set (OpCode_Private); + *p = OpCode_Private; return_trace (true); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff1.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff1.cc index 49ac0bf4299..cfecab6ba36 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff1.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff1.cc @@ -32,6 +32,8 @@ #include "hb-subset-cff-common.hh" #include "hb-cff1-interp-cs.hh" +#ifndef HB_NO_SUBSET_CFF + using namespace CFF; struct remap_sid_t : remap_t @@ -147,7 +149,7 @@ struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dic return_trace (false); HBUINT8 *p = c->allocate_size<HBUINT8> (1); if (unlikely (p == nullptr)) return_trace (false); - p->set (OpCode_Private); + *p = OpCode_Private; } break; @@ -351,7 +353,7 @@ struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_t<cff1_cs_opset_subr_subset_t case OpCode_return: param.current_parsed_str->add_op (op, env.str_ref); param.current_parsed_str->set_parsed (); - env.returnFromSubr (); + env.return_from_subr (); param.set_current_str (env, false); break; @@ -382,7 +384,7 @@ struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_t<cff1_cs_opset_subr_subset_t cff1_biased_subrs_t& subrs, hb_set_t *closure) { byte_str_ref_t str_ref = env.str_ref; - env.callSubr (subrs, type); + env.call_subr (subrs, type); param.current_parsed_str->add_call_op (op, str_ref, env.context.subr_num); hb_set_add (closure, env.context.subr_num); param.set_current_str (env, true); @@ -394,8 +396,8 @@ struct cff1_cs_opset_subr_subset_t : cff1_cs_opset_t<cff1_cs_opset_subr_subset_t struct cff1_subr_subsetter_t : subr_subsetter_t<cff1_subr_subsetter_t, CFF1Subrs, const OT::cff1::accelerator_subset_t, cff1_cs_interp_env_t, cff1_cs_opset_subr_subset_t, OpCode_endchar> { - cff1_subr_subsetter_t (const OT::cff1::accelerator_subset_t &acc, const hb_subset_plan_t *plan) - : subr_subsetter_t (acc, plan) {} + cff1_subr_subsetter_t (const OT::cff1::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_) + : subr_subsetter_t (acc_, plan_) {} static void finalize_parsed_str (cff1_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring) { @@ -892,10 +894,10 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, return false; /* header */ - cff->version.major.set (0x01); - cff->version.minor.set (0x00); - cff->nameIndex.set (cff->min_size); - cff->offSize.set (4); /* unused? */ + cff->version.major = 0x01; + cff->version.minor = 0x00; + cff->nameIndex = cff->min_size; + cff->offSize = 4; /* unused? */ /* name INDEX */ { @@ -912,7 +914,7 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, /* top dict INDEX */ { assert (plan.offsets.topDictInfo.offset == (unsigned) (c.head - c.start)); - CFF1IndexOf<TopDict> *dest = c.start_embed< CFF1IndexOf<TopDict> > (); + CFF1IndexOf<TopDict> *dest = c.start_embed< CFF1IndexOf<TopDict>> (); if (dest == nullptr) return false; cff1_top_dict_op_serializer_t topSzr; top_dict_modifiers_t modifier (plan.offsets, plan.topDictModSIDs); @@ -1064,7 +1066,7 @@ static inline bool _write_cff1 (const cff_subset_plan &plan, return true; } -static bool +static inline bool _hb_subset_cff1 (const OT::cff1::accelerator_subset_t &acc, const char *data, hb_subset_plan_t *plan, @@ -1118,3 +1120,5 @@ hb_subset_cff1 (hb_subset_plan_t *plan, return result; } + +#endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff2.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff2.cc index bf76a3edec4..5977b5669e6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff2.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff2.cc @@ -32,6 +32,8 @@ #include "hb-subset-cff-common.hh" #include "hb-cff2-interp-cs.hh" +#ifndef HB_NO_SUBSET_CFF + using namespace CFF; struct cff2_sub_table_offsets_t : cff_sub_table_offsets_t @@ -183,7 +185,7 @@ struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_t<cff2_cs_opset_subr_subset_t case OpCode_return: param.current_parsed_str->set_parsed (); - env.returnFromSubr (); + env.return_from_subr (); param.set_current_str (env, false); break; @@ -213,7 +215,7 @@ struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_t<cff2_cs_opset_subr_subset_t cff2_biased_subrs_t& subrs, hb_set_t *closure) { byte_str_ref_t str_ref = env.str_ref; - env.callSubr (subrs, type); + env.call_subr (subrs, type); param.current_parsed_str->add_call_op (op, str_ref, env.context.subr_num); hb_set_add (closure, env.context.subr_num); param.set_current_str (env, true); @@ -225,8 +227,8 @@ struct cff2_cs_opset_subr_subset_t : cff2_cs_opset_t<cff2_cs_opset_subr_subset_t struct cff2_subr_subsetter_t : subr_subsetter_t<cff2_subr_subsetter_t, CFF2Subrs, const OT::cff2::accelerator_subset_t, cff2_cs_interp_env_t, cff2_cs_opset_subr_subset_t> { - cff2_subr_subsetter_t (const OT::cff2::accelerator_subset_t &acc, const hb_subset_plan_t *plan) - : subr_subsetter_t (acc, plan) {} + cff2_subr_subsetter_t (const OT::cff2::accelerator_subset_t &acc_, const hb_subset_plan_t *plan_) + : subr_subsetter_t (acc_, plan_) {} static void finalize_parsed_str (cff2_cs_interp_env_t &env, subr_subset_param_t& param, parsed_cs_str_t &charstring) { @@ -451,14 +453,14 @@ static inline bool _write_cff2 (const cff2_subset_plan &plan, return false; /* header */ - cff2->version.major.set (0x02); - cff2->version.minor.set (0x00); - cff2->topDict.set (OT::cff2::static_size); + cff2->version.major = 0x02; + cff2->version.minor = 0x00; + cff2->topDict = OT::cff2::static_size; /* top dict */ { assert (cff2->topDict == (unsigned) (c.head - c.start)); - cff2->topDictSize.set (plan.offsets.topDictInfo.size); + cff2->topDictSize = plan.offsets.topDictInfo.size; TopDict &dict = cff2 + cff2->topDict; cff2_top_dict_op_serializer_t topSzr; if (unlikely (!dict.serialize (&c, acc.topDict, topSzr, plan.offsets))) @@ -571,7 +573,7 @@ static inline bool _write_cff2 (const cff2_subset_plan &plan, return true; } -static bool +static inline bool _hb_subset_cff2 (const OT::cff2::accelerator_subset_t &acc, const char *data, hb_subset_plan_t *plan, @@ -626,3 +628,5 @@ hb_subset_cff2 (hb_subset_plan_t *plan, return result; } + +#endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc deleted file mode 100644 index ee004eeb34e..00000000000 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Garret Rieger, Roderick Sheeter - */ - -#include "hb-open-type.hh" -#include "hb-ot-glyf-table.hh" -#include "hb-set.h" -#include "hb-subset-glyf.hh" - -struct loca_data_t -{ - bool is_short; - void *data; - unsigned int size; - - inline bool - _write_loca_entry (unsigned int id, - unsigned int offset) - { - unsigned int entry_size = is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32); - if ((id + 1) * entry_size <= size) - { - if (is_short) { - ((OT::HBUINT16*) data) [id].set (offset / 2); - } else { - ((OT::HBUINT32*) data) [id].set (offset); - } - return true; - } - - // Offset was not written because the write is out of bounds. - DEBUG_MSG(SUBSET, - nullptr, - "WARNING: Attempted to write an out of bounds loca entry at index %d. Loca size is %d.", - id, - size); - return false; - } -}; - -/** - * If hints are being dropped find the range which in glyf at which - * the hinting instructions are located. Add them to the instruction_ranges - * vector. - */ -static bool -_add_instructions_range (const OT::glyf::accelerator_t &glyf, - hb_codepoint_t glyph_id, - unsigned int glyph_start_offset, - unsigned int glyph_end_offset, - bool drop_hints, - hb_vector_t<unsigned int> *instruction_ranges /* OUT */) -{ - if (!instruction_ranges->resize (instruction_ranges->length + 2)) - { - DEBUG_MSG(SUBSET, nullptr, "Failed to resize instruction_ranges."); - return false; - } - unsigned int *instruction_start = &(*instruction_ranges)[instruction_ranges->length - 2]; - *instruction_start = 0; - unsigned int *instruction_end = &(*instruction_ranges)[instruction_ranges->length - 1]; - *instruction_end = 0; - - if (drop_hints) - { - if (unlikely (!glyf.get_instruction_offsets (glyph_start_offset, glyph_end_offset, - instruction_start, instruction_end))) - { - DEBUG_MSG(SUBSET, nullptr, "Unable to get instruction offsets for %d", glyph_id); - return false; - } - } - - return true; -} - -static bool -_calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf, - const hb_subset_plan_t *plan, - loca_data_t *loca_data, /* OUT */ - unsigned int *glyf_size /* OUT */, - hb_vector_t<unsigned int> *instruction_ranges /* OUT */) -{ - unsigned int total = 0; - - hb_codepoint_t next_glyph = HB_SET_VALUE_INVALID; - while (plan->glyphset ()->next (&next_glyph)) - { - unsigned int start_offset, end_offset; - if (unlikely (!(glyf.get_offsets (next_glyph, &start_offset, &end_offset) && - glyf.remove_padding (start_offset, &end_offset)))) - { - DEBUG_MSG(SUBSET, nullptr, "Invalid gid %d", next_glyph); - start_offset = end_offset = 0; - } - - bool is_zero_length = end_offset - start_offset < OT::glyf::GlyphHeader::static_size; - if (!_add_instructions_range (glyf, - next_glyph, - start_offset, - end_offset, - plan->drop_hints && !is_zero_length, - instruction_ranges)) - return false; - - if (is_zero_length) - continue; /* 0-length glyph */ - - total += end_offset - start_offset - - ((*instruction_ranges)[instruction_ranges->length - 1] - - (*instruction_ranges)[instruction_ranges->length - 2]); - /* round2 so short loca will work */ - total += total % 2; - } - - *glyf_size = total; - loca_data->is_short = (total <= 131070); - loca_data->size = (plan->num_output_glyphs () + 1) - * (loca_data->is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32)); - - DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca", - total, - loca_data->size, - loca_data->is_short ? "short" : "long"); - return true; -} - -static void -_update_components (const hb_subset_plan_t *plan, - char *glyph_start, - unsigned int length) -{ - OT::glyf::CompositeGlyphHeader::Iterator iterator; - if (OT::glyf::CompositeGlyphHeader::get_iterator (glyph_start, - length, - &iterator)) - { - do - { - hb_codepoint_t new_gid; - if (!plan->new_gid_for_old_gid (iterator.current->glyphIndex, - &new_gid)) - continue; - - ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex.set (new_gid); - } while (iterator.move_to_next ()); - } -} - -static bool _remove_composite_instruction_flag (char *glyf_prime, unsigned int length) -{ - /* remove WE_HAVE_INSTRUCTIONS from flags in dest */ - OT::glyf::CompositeGlyphHeader::Iterator composite_it; - if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (glyf_prime, length, &composite_it))) return false; - const OT::glyf::CompositeGlyphHeader *glyph; - do { - glyph = composite_it.current; - OT::HBUINT16 *flags = const_cast<OT::HBUINT16 *> (&glyph->flags); - flags->set ( (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS); - } while (composite_it.move_to_next ()); - return true; -} - -static bool -_write_glyf_and_loca_prime (const hb_subset_plan_t *plan, - const OT::glyf::accelerator_t &glyf, - const char *glyf_data, - hb_vector_t<unsigned int> &instruction_ranges, - unsigned int glyf_prime_size, - char *glyf_prime_data /* OUT */, - loca_data_t *loca_prime /* OUT */) -{ - char *glyf_prime_data_next = glyf_prime_data; - - bool success = true; - - - unsigned int i = 0; - hb_codepoint_t new_gid; - for (new_gid = 0; new_gid < plan->num_output_glyphs (); new_gid++) - { - hb_codepoint_t old_gid; - if (!plan->old_gid_for_new_gid (new_gid, &old_gid)) - { - // Empty glyph, add a loca entry and carry on. - loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - continue; - } - - - unsigned int start_offset, end_offset; - if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) && - glyf.remove_padding (start_offset, &end_offset)))) - end_offset = start_offset = 0; - - unsigned int instruction_start = instruction_ranges[i * 2]; - unsigned int instruction_end = instruction_ranges[i * 2 + 1]; - - int length = end_offset - start_offset - (instruction_end - instruction_start); - - if (glyf_prime_data_next + length > glyf_prime_data + glyf_prime_size) - { - DEBUG_MSG(SUBSET, - nullptr, - "WARNING: Attempted to write an out of bounds glyph entry for gid %d (length %d)", - i, length); - return false; - } - - if (instruction_start == instruction_end) - memcpy (glyf_prime_data_next, glyf_data + start_offset, length); - else - { - memcpy (glyf_prime_data_next, glyf_data + start_offset, instruction_start - start_offset); - memcpy (glyf_prime_data_next + instruction_start - start_offset, glyf_data + instruction_end, end_offset - instruction_end); - /* if the instructions end at the end this was a composite glyph, else simple */ - if (instruction_end == end_offset) - { - if (unlikely (!_remove_composite_instruction_flag (glyf_prime_data_next, length))) return false; - } - else - /* zero instruction length, which is just before instruction_start */ - memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2); - } - - success = success && loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - _update_components (plan, glyf_prime_data_next, length); - - // TODO: don't align to two bytes if using long loca. - glyf_prime_data_next += length + (length % 2); // Align to 2 bytes for short loca. - - i++; - } - - // loca table has n+1 entries where the last entry signifies the end location of the last - // glyph. - success = success && loca_prime->_write_loca_entry (new_gid, - glyf_prime_data_next - glyf_prime_data); - return success; -} - -static bool -_hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf, - const char *glyf_data, - hb_subset_plan_t *plan, - bool *use_short_loca, - hb_blob_t **glyf_prime_blob /* OUT */, - hb_blob_t **loca_prime_blob /* OUT */) -{ - // TODO(grieger): Sanity check allocation size for the new table. - loca_data_t loca_prime; - unsigned int glyf_prime_size; - hb_vector_t<unsigned int> instruction_ranges; - instruction_ranges.init (); - - if (unlikely (!_calculate_glyf_and_loca_prime_size (glyf, - plan, - &loca_prime, - &glyf_prime_size, - &instruction_ranges))) { - instruction_ranges.fini (); - return false; - } - *use_short_loca = loca_prime.is_short; - - char *glyf_prime_data = (char *) calloc (1, glyf_prime_size); - loca_prime.data = (void *) calloc (1, loca_prime.size); - if (unlikely (!_write_glyf_and_loca_prime (plan, glyf, glyf_data, - instruction_ranges, - glyf_prime_size, glyf_prime_data, - &loca_prime))) { - free (glyf_prime_data); - free (loca_prime.data); - instruction_ranges.fini (); - return false; - } - instruction_ranges.fini (); - - *glyf_prime_blob = hb_blob_create (glyf_prime_data, - glyf_prime_size, - HB_MEMORY_MODE_READONLY, - glyf_prime_data, - free); - *loca_prime_blob = hb_blob_create ((char *) loca_prime.data, - loca_prime.size, - HB_MEMORY_MODE_READONLY, - loca_prime.data, - free); - return true; -} - -/** - * hb_subset_glyf: - * Subsets the glyph table according to a provided plan. - * - * Return value: subsetted glyf table. - * - * Since: 1.7.5 - **/ -bool -hb_subset_glyf_and_loca (hb_subset_plan_t *plan, - bool *use_short_loca, /* OUT */ - hb_blob_t **glyf_prime, /* OUT */ - hb_blob_t **loca_prime /* OUT */) -{ - hb_blob_t *glyf_blob = hb_sanitize_context_t ().reference_table<OT::glyf> (plan->source); - const char *glyf_data = hb_blob_get_data (glyf_blob, nullptr); - - OT::glyf::accelerator_t glyf; - glyf.init (plan->source); - bool result = _hb_subset_glyf_and_loca (glyf, - glyf_data, - plan, - use_short_loca, - glyf_prime, - loca_prime); - - hb_blob_destroy (glyf_blob); - glyf.fini (); - - return result; -} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh deleted file mode 100644 index 99cf8f07112..00000000000 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Garret Rieger - */ - -#ifndef HB_SUBSET_GLYF_HH -#define HB_SUBSET_GLYF_HH - -#include "hb.hh" - -#include "hb-subset.hh" - -HB_INTERNAL bool -hb_subset_glyf_and_loca (hb_subset_plan_t *plan, - bool *use_short_loca, /* OUT */ - hb_blob_t **glyf_prime /* OUT */, - hb_blob_t **loca_prime /* OUT */); - -#endif /* HB_SUBSET_GLYF_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc index 693c9c21ee9..34f1cb86394 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc @@ -44,11 +44,45 @@ hb_subset_input_create_or_fail () input->unicodes = hb_set_create (); input->glyphs = hb_set_create (); + input->name_ids = hb_set_create (); + hb_set_add_range (input->name_ids, 0, 6); + input->drop_tables = hb_set_create (); input->drop_hints = false; - input->drop_layout = true; input->desubroutinize = false; input->retain_gids = false; + hb_tag_t default_drop_tables[] = { + // Layout disabled by default + HB_TAG ('G', 'S', 'U', 'B'), + HB_TAG ('G', 'P', 'O', 'S'), + HB_TAG ('G', 'D', 'E', 'F'), + HB_TAG ('m', 'o', 'r', 'x'), + HB_TAG ('m', 'o', 'r', 't'), + HB_TAG ('k', 'e', 'r', 'x'), + HB_TAG ('k', 'e', 'r', 'n'), + + // Copied from fontTools: + HB_TAG ('B', 'A', 'S', 'E'), + HB_TAG ('J', 'S', 'T', 'F'), + HB_TAG ('D', 'S', 'I', 'G'), + HB_TAG ('E', 'B', 'D', 'T'), + HB_TAG ('E', 'B', 'L', 'C'), + HB_TAG ('E', 'B', 'S', 'C'), + HB_TAG ('S', 'V', 'G', ' '), + HB_TAG ('P', 'C', 'L', 'T'), + HB_TAG ('L', 'T', 'S', 'H'), + // Graphite tables + HB_TAG ('F', 'e', 'a', 't'), + HB_TAG ('G', 'l', 'a', 't'), + HB_TAG ('G', 'l', 'o', 'c'), + HB_TAG ('S', 'i', 'l', 'f'), + HB_TAG ('S', 'i', 'l', 'l'), + // Colour + HB_TAG ('s', 'b', 'i', 'x') + }; + + input->drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables)); + return input; } @@ -81,6 +115,8 @@ hb_subset_input_destroy (hb_subset_input_t *subset_input) hb_set_destroy (subset_input->unicodes); hb_set_destroy (subset_input->glyphs); + hb_set_destroy (subset_input->name_ids); + hb_set_destroy (subset_input->drop_tables); free (subset_input); } @@ -109,30 +145,29 @@ hb_subset_input_glyph_set (hb_subset_input_t *subset_input) return subset_input->glyphs; } -HB_EXTERN void -hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input, - hb_bool_t drop_hints) +HB_EXTERN hb_set_t * +hb_subset_input_nameid_set (hb_subset_input_t *subset_input) { - subset_input->drop_hints = drop_hints; + return subset_input->name_ids; } -HB_EXTERN hb_bool_t -hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input) +HB_EXTERN hb_set_t * +hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input) { - return subset_input->drop_hints; + return subset_input->drop_tables; } HB_EXTERN void -hb_subset_input_set_drop_layout (hb_subset_input_t *subset_input, - hb_bool_t drop_layout) +hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input, + hb_bool_t drop_hints) { - subset_input->drop_layout = drop_layout; + subset_input->drop_hints = drop_hints; } HB_EXTERN hb_bool_t -hb_subset_input_get_drop_layout (hb_subset_input_t *subset_input) +hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input) { - return subset_input->drop_layout; + return subset_input->drop_hints; } HB_EXTERN void @@ -152,7 +187,7 @@ hb_subset_input_get_desubroutinize (hb_subset_input_t *subset_input) * hb_subset_input_set_retain_gids: * @subset_input: a subset_input. * @retain_gids: If true the subsetter will not renumber glyph ids. - * Since: REPLACEME + * Since: 2.4.0 **/ HB_EXTERN void hb_subset_input_set_retain_gids (hb_subset_input_t *subset_input, @@ -164,7 +199,7 @@ hb_subset_input_set_retain_gids (hb_subset_input_t *subset_input, /** * hb_subset_input_get_retain_gids: * Returns: value of retain_gids. - * Since: REPLACEME + * Since: 2.4.0 **/ HB_EXTERN hb_bool_t hb_subset_input_get_retain_gids (hb_subset_input_t *subset_input) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh index 04d6e121b77..f6dd4ac3197 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh @@ -40,16 +40,17 @@ struct hb_subset_input_t hb_set_t *unicodes; hb_set_t *glyphs; + hb_set_t *name_ids; + hb_set_t *drop_tables; - bool drop_hints : 1; - bool drop_layout : 1; - bool desubroutinize : 1; - bool retain_gids : 1; + bool drop_hints; + bool desubroutinize; + bool retain_gids; /* TODO * * features * lookups - * nameIDs + * name_ids * ... */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc index 8b72314940e..7c1ed872c3a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc @@ -31,8 +31,10 @@ #include "hb-ot-cmap-table.hh" #include "hb-ot-glyf-table.hh" #include "hb-ot-cff1-table.hh" +#include "hb-ot-var-fvar-table.hh" +#include "hb-ot-stat-table.hh" -static void +static inline void _add_gid_and_children (const OT::glyf::accelerator_t &glyf, hb_codepoint_t gid, hb_set_t *gids_to_retain) @@ -53,7 +55,8 @@ _add_gid_and_children (const OT::glyf::accelerator_t &glyf, } } -static void +#ifndef HB_NO_SUBSET_CFF +static inline void _add_cff_seac_components (const OT::cff1::accelerator_t &cff, hb_codepoint_t gid, hb_set_t *gids_to_retain) @@ -65,8 +68,10 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff, hb_set_add (gids_to_retain, accent_gid); } } +#endif -static void +#ifndef HB_NO_SUBSET_LAYOUT +static inline void _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain) { hb_set_t lookup_indices; @@ -80,8 +85,9 @@ _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain) &lookup_indices, gids_to_retain); } +#endif -static void +static inline void _remove_invalid_gids (hb_set_t *glyphs, unsigned int num_glyphs) { @@ -93,24 +99,21 @@ _remove_invalid_gids (hb_set_t *glyphs, } } -static hb_set_t * -_populate_gids_to_retain (hb_face_t *face, +static void +_populate_gids_to_retain (hb_subset_plan_t* plan, const hb_set_t *unicodes, const hb_set_t *input_glyphs_to_retain, - bool close_over_gsub, - hb_set_t *unicodes_to_retain, - hb_map_t *codepoint_to_glyph) + bool close_over_gsub) { OT::cmap::accelerator_t cmap; OT::glyf::accelerator_t glyf; OT::cff1::accelerator_t cff; - cmap.init (face); - glyf.init (face); - cff.init (face); + cmap.init (plan->source); + glyf.init (plan->source); + cff.init (plan->source); - hb_set_t *initial_gids_to_retain = hb_set_create (); - initial_gids_to_retain->add (0); // Not-def - hb_set_union (initial_gids_to_retain, input_glyphs_to_retain); + plan->_glyphset_gsub->add (0); // Not-def + hb_set_union (plan->_glyphset_gsub, input_glyphs_to_retain); hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (unicodes->next (&cp)) @@ -121,67 +124,92 @@ _populate_gids_to_retain (hb_face_t *face, DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp); continue; } - unicodes_to_retain->add (cp); - codepoint_to_glyph->set (cp, gid); - initial_gids_to_retain->add (gid); + plan->unicodes->add (cp); + plan->codepoint_to_glyph->set (cp, gid); + plan->_glyphset_gsub->add (gid); } +#ifndef HB_NO_SUBSET_LAYOUT if (close_over_gsub) // Add all glyphs needed for GSUB substitutions. - _gsub_closure (face, initial_gids_to_retain); + _gsub_closure (plan->source, plan->_glyphset_gsub); +#endif + _remove_invalid_gids (plan->_glyphset_gsub, plan->source->get_num_glyphs ()); // Populate a full set of glyphs to retain by adding all referenced // composite glyphs. hb_codepoint_t gid = HB_SET_VALUE_INVALID; - hb_set_t *all_gids_to_retain = hb_set_create (); - while (initial_gids_to_retain->next (&gid)) + while (plan->_glyphset_gsub->next (&gid)) { - _add_gid_and_children (glyf, gid, all_gids_to_retain); + _add_gid_and_children (glyf, gid, plan->_glyphset); +#ifndef HB_NO_SUBSET_CFF if (cff.is_valid ()) - _add_cff_seac_components (cff, gid, all_gids_to_retain); + _add_cff_seac_components (cff, gid, plan->_glyphset); +#endif } - hb_set_destroy (initial_gids_to_retain); - - _remove_invalid_gids (all_gids_to_retain, face->get_num_glyphs ()); + _remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ()); cff.fini (); glyf.fini (); cmap.fini (); - - return all_gids_to_retain; } static void -_create_old_gid_to_new_gid_map (const hb_face_t *face, - bool retain_gids, - hb_set_t *all_gids_to_retain, - hb_map_t *glyph_map, /* OUT */ - hb_map_t *reverse_glyph_map, /* OUT */ - unsigned int *num_glyphs /* OUT */) +_create_old_gid_to_new_gid_map (const hb_face_t *face, + bool retain_gids, + const hb_set_t *all_gids_to_retain, + hb_map_t *glyph_map, /* OUT */ + hb_map_t *reverse_glyph_map, /* OUT */ + unsigned int *num_glyphs /* OUT */) { - hb_codepoint_t gid = HB_SET_VALUE_INVALID; - unsigned int length = 0; - for (unsigned int i = 0; all_gids_to_retain->next (&gid); i++) { - if (!retain_gids) - { - glyph_map->set (gid, i); - reverse_glyph_map->set (i, gid); - } - else - { - glyph_map->set (gid, gid); - reverse_glyph_map->set (gid, gid); - } - ++length; - } - if (!retain_gids || length == 0) + if (!retain_gids) { - *num_glyphs = length; + + hb_enumerate (hb_iter (all_gids_to_retain), (hb_codepoint_t) 0) + | hb_sink (reverse_glyph_map) + ; + *num_glyphs = reverse_glyph_map->get_population (); + } else { + + hb_iter (all_gids_to_retain) + | hb_map ([] (hb_codepoint_t _) { + return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (_, _); + }) + | hb_sink (reverse_glyph_map) + ; + + unsigned max_glyph = + + hb_iter (all_gids_to_retain) + | hb_reduce (hb_max, 0) + ; + *num_glyphs = max_glyph + 1; } - else + + + reverse_glyph_map->iter () + | hb_map (&hb_pair_t<hb_codepoint_t, hb_codepoint_t>::reverse) + | hb_sink (glyph_map) + ; +} + +static void +_nameid_closure (hb_face_t *face, + hb_set_t *nameids) +{ + hb_tag_t table_tags[32]; + unsigned count = ARRAY_LENGTH (table_tags); + hb_face_get_table_tags (face, 0, &count, table_tags); + for (unsigned int i = 0; i < count; i++) { - *num_glyphs = face->get_num_glyphs (); + hb_tag_t tag = table_tags[i]; + switch (tag) { + case HB_OT_TAG_STAT: + face->table.STAT->collect_name_ids (nameids); + break; + case HB_OT_TAG_fvar: + face->table.fvar->collect_name_ids (nameids); + break; + default: + break; + } } } @@ -202,20 +230,25 @@ hb_subset_plan_create (hb_face_t *face, hb_subset_plan_t *plan = hb_object_create<hb_subset_plan_t> (); plan->drop_hints = input->drop_hints; - plan->drop_layout = input->drop_layout; plan->desubroutinize = input->desubroutinize; - plan->unicodes = hb_set_create(); + plan->retain_gids = input->retain_gids; + plan->unicodes = hb_set_create (); + plan->name_ids = hb_set_reference (input->name_ids); + _nameid_closure (face, plan->name_ids); + plan->drop_tables = hb_set_reference (input->drop_tables); plan->source = hb_face_reference (face); plan->dest = hb_face_builder_create (); - plan->codepoint_to_glyph = hb_map_create(); - plan->glyph_map = hb_map_create(); - plan->reverse_glyph_map = hb_map_create(); - plan->_glyphset = _populate_gids_to_retain (face, - input->unicodes, - input->glyphs, - !plan->drop_layout, - plan->unicodes, - plan->codepoint_to_glyph); + + plan->_glyphset = hb_set_create (); + plan->_glyphset_gsub = hb_set_create (); + plan->codepoint_to_glyph = hb_map_create (); + plan->glyph_map = hb_map_create (); + plan->reverse_glyph_map = hb_map_create (); + + _populate_gids_to_retain (plan, + input->unicodes, + input->glyphs, + !input->drop_tables->has (HB_OT_TAG_GSUB)); _create_old_gid_to_new_gid_map (face, input->retain_gids, @@ -238,12 +271,15 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan) if (!hb_object_destroy (plan)) return; hb_set_destroy (plan->unicodes); + hb_set_destroy (plan->name_ids); + hb_set_destroy (plan->drop_tables); hb_face_destroy (plan->source); hb_face_destroy (plan->dest); hb_map_destroy (plan->codepoint_to_glyph); hb_map_destroy (plan->glyph_map); hb_map_destroy (plan->reverse_glyph_map); hb_set_destroy (plan->_glyphset); + hb_set_destroy (plan->_glyphset_gsub); free (plan); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh index 56726d4d043..ee44b63a467 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh @@ -40,12 +40,18 @@ struct hb_subset_plan_t hb_object_header_t header; bool drop_hints : 1; - bool drop_layout : 1; bool desubroutinize : 1; + bool retain_gids : 1; // For each cp that we'd like to retain maps to the corresponding gid. hb_set_t *unicodes; + // name_ids we would like to retain + hb_set_t *name_ids; + + // Tables which should be dropped. + hb_set_t *drop_tables; + // The glyph subset hb_map_t *codepoint_to_glyph; @@ -59,11 +65,14 @@ struct hb_subset_plan_t unsigned int _num_output_glyphs; hb_set_t *_glyphset; + hb_set_t *_glyphset_gsub; public: /* * The set of input glyph ids which will be retained in the subset. + * Does NOT include ids kept due to retain_gids. You probably want to use + * glyph_map/reverse_glyph_map. */ inline const hb_set_t * glyphset () const @@ -72,6 +81,15 @@ struct hb_subset_plan_t } /* + * The set of input glyph ids which will be retained in the subset. + */ + inline const hb_set_t * + glyphset_gsub () const + { + return _glyphset_gsub; + } + + /* * The total number of output glyphs in the final subset. */ inline unsigned int diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc index 135265fc166..794369550b1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc @@ -28,7 +28,6 @@ #include "hb-open-type.hh" #include "hb-subset.hh" -#include "hb-subset-glyf.hh" #include "hb-open-file.hh" #include "hb-ot-cmap-table.hh" @@ -43,11 +42,15 @@ #include "hb-ot-cff1-table.hh" #include "hb-ot-cff2-table.hh" #include "hb-ot-vorg-table.hh" +#include "hb-ot-name-table.hh" #include "hb-ot-layout-gsub-table.hh" #include "hb-ot-layout-gpos-table.hh" -static unsigned int +HB_UNUSED static inline unsigned int +_plan_estimate_subset_table_size (hb_subset_plan_t *plan, + unsigned int table_len); +static inline unsigned int _plan_estimate_subset_table_size (hb_subset_plan_t *plan, unsigned int table_len) { @@ -64,14 +67,16 @@ template<typename TableType> static bool _subset2 (hb_subset_plan_t *plan) { + bool result = true; hb_blob_t *source_blob = hb_sanitize_context_t ().reference_table<TableType> (plan->source); const TableType *table = source_blob->as<TableType> (); hb_tag_t tag = TableType::tableTag; - hb_bool_t result = false; if (source_blob->data) { hb_vector_t<char> buf; + /* TODO Not all tables are glyph-related. 'name' table size for example should not be + * affected by number of glyphs. Accommodate that. */ unsigned int buf_size = _plan_estimate_subset_table_size (plan, source_blob->length); DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG (tag), buf_size); if (unlikely (!buf.alloc (buf_size))) @@ -81,9 +86,10 @@ _subset2 (hb_subset_plan_t *plan) } retry: hb_serialize_context_t serializer ((void *) buf, buf_size); + serializer.start_serialize<TableType> (); hb_subset_context_t c (plan, &serializer); - result = table->subset (&c); - if (serializer.in_error ()) + bool needed = table->subset (&c); + if (serializer.ran_out_of_room) { buf_size += (buf_size >> 1) + 32; DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c ran out of room; reallocating to %u bytes.", HB_UNTAG (tag), buf_size); @@ -94,17 +100,23 @@ _subset2 (hb_subset_plan_t *plan) } goto retry; } + serializer.end_serialize (); + + result = !serializer.in_error (); + if (result) { - hb_blob_t *dest_blob = serializer.copy_blob (); - DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c final subset table size: %u bytes.", HB_UNTAG (tag), dest_blob->length); - result = c.plan->add_table (tag, dest_blob); - hb_blob_destroy (dest_blob); - } - else - { - DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag)); - result = true; + if (needed) + { + hb_blob_t *dest_blob = serializer.copy_blob (); + DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c final subset table size: %u bytes.", HB_UNTAG (tag), dest_blob->length); + result = c.plan->add_table (tag, dest_blob); + hb_blob_destroy (dest_blob); + } + else + { + DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset table subsetted to empty.", HB_UNTAG (tag)); + } } } else @@ -143,10 +155,13 @@ _subset_table (hb_subset_plan_t *plan, bool result = true; switch (tag) { case HB_OT_TAG_glyf: - result = _subset<const OT::glyf> (plan); + result = _subset2<const OT::glyf> (plan); break; case HB_OT_TAG_hdmx: - result = _subset<const OT::hdmx> (plan); + result = _subset2<const OT::hdmx> (plan); + break; + case HB_OT_TAG_name: + result = _subset2<const OT::name> (plan); break; case HB_OT_TAG_head: // TODO that won't work well if there is no glyf @@ -180,6 +195,8 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_post: result = _subset<const OT::post> (plan); break; + +#ifndef HB_NO_SUBSET_CFF case HB_OT_TAG_cff1: result = _subset<const OT::cff1> (plan); break; @@ -189,6 +206,9 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_VORG: result = _subset<const OT::VORG> (plan); break; +#endif + +#ifndef HB_NO_SUBSET_LAYOUT case HB_OT_TAG_GDEF: result = _subset2<const OT::GDEF> (plan); break; @@ -198,6 +218,7 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_GPOS: result = _subset2<const OT::GPOS> (plan); break; +#endif default: hb_blob_t *source_table = hb_face_reference_table (plan->source, tag); @@ -215,6 +236,9 @@ _subset_table (hb_subset_plan_t *plan, static bool _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag) { + if (plan->drop_tables->has (tag)) + return true; + switch (tag) { case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */ case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */ @@ -223,31 +247,19 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag) case HB_TAG ('h', 'd', 'm', 'x'): /* hint table, fallthrough */ case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */ return plan->drop_hints; + +#ifdef HB_NO_SUBSET_LAYOUT // Drop Layout Tables if requested. case HB_OT_TAG_GDEF: case HB_OT_TAG_GPOS: case HB_OT_TAG_GSUB: - return plan->drop_layout; - // Drop these tables below by default, list pulled - // from fontTools: - case HB_TAG ('B', 'A', 'S', 'E'): - case HB_TAG ('J', 'S', 'T', 'F'): - case HB_TAG ('D', 'S', 'I', 'G'): - case HB_TAG ('E', 'B', 'D', 'T'): - case HB_TAG ('E', 'B', 'L', 'C'): - case HB_TAG ('E', 'B', 'S', 'C'): - case HB_TAG ('S', 'V', 'G', ' '): - case HB_TAG ('P', 'C', 'L', 'T'): - case HB_TAG ('L', 'T', 'S', 'H'): - // Graphite tables: - case HB_TAG ('F', 'e', 'a', 't'): - case HB_TAG ('G', 'l', 'a', 't'): - case HB_TAG ('G', 'l', 'o', 'c'): - case HB_TAG ('S', 'i', 'l', 'f'): - case HB_TAG ('S', 'i', 'l', 'l'): - // Colour - case HB_TAG ('s', 'b', 'i', 'x'): + case HB_TAG ('m', 'o', 'r', 'x'): + case HB_TAG ('m', 'o', 'r', 't'): + case HB_TAG ('k', 'e', 'r', 'x'): + case HB_TAG ('k', 'e', 'r', 'n'): return true; +#endif + default: return false; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h index 657709ec815..c778896a202 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h @@ -54,6 +54,12 @@ hb_subset_input_unicode_set (hb_subset_input_t *subset_input); HB_EXTERN hb_set_t * hb_subset_input_glyph_set (hb_subset_input_t *subset_input); +HB_EXTERN hb_set_t * +hb_subset_input_nameid_set (hb_subset_input_t *subset_input); + +HB_EXTERN hb_set_t * +hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input); + HB_EXTERN void hb_subset_input_set_drop_hints (hb_subset_input_t *subset_input, hb_bool_t drop_hints); @@ -61,12 +67,6 @@ HB_EXTERN hb_bool_t hb_subset_input_get_drop_hints (hb_subset_input_t *subset_input); HB_EXTERN void -hb_subset_input_set_drop_layout (hb_subset_input_t *subset_input, - hb_bool_t drop_layout); -HB_EXTERN hb_bool_t -hb_subset_input_get_drop_layout (hb_subset_input_t *subset_input); - -HB_EXTERN void hb_subset_input_set_desubroutinize (hb_subset_input_t *subset_input, hb_bool_t desubroutinize); HB_EXTERN hb_bool_t diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh index 45cb763ecb6..b8dd07ab288 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh @@ -40,9 +40,19 @@ struct hb_subset_context_t : hb_dispatch_context_t<hb_subset_context_t, bool, HB_DEBUG_SUBSET> { const char *get_name () { return "SUBSET"; } - template <typename T> - bool dispatch (const T &obj) { return obj.subset (this); } - static bool default_return_value () { return true; } + static return_t default_return_value () { return true; } + + private: + template <typename T, typename ...Ts> auto + _dispatch (const T &obj, hb_priority<1>, Ts&&... ds) HB_AUTO_RETURN + ( obj.subset (this, hb_forward<Ts> (ds)...) ) + template <typename T, typename ...Ts> auto + _dispatch (const T &obj, hb_priority<0>, Ts&&... ds) HB_AUTO_RETURN + ( obj.dispatch (this, hb_forward<Ts> (ds)...) ) + public: + template <typename T, typename ...Ts> auto + dispatch (const T &obj, Ts&&... ds) HB_AUTO_RETURN + ( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) ) hb_subset_plan_t *plan; hb_serialize_context_t *serializer; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucd-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucd-table.hh new file mode 100644 index 00000000000..95c4bf86eab --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucd-table.hh @@ -0,0 +1,5160 @@ +/* == Start of generated table == */ +/* + * The following table is generated by running: + * + * ./gen-ucd-table.py ucd.nonunihan.grouped.xml + * + * on file with this description: Unicode 12.1.0 + */ + +#ifndef HB_UCD_TABLE_HH +#define HB_UCD_TABLE_HH + + +#include "hb.hh" + +static const hb_script_t +_hb_ucd_sc_map[138] = +{ + HB_SCRIPT_COMMON, HB_SCRIPT_INHERITED, + HB_SCRIPT_UNKNOWN, HB_SCRIPT_ARABIC, + HB_SCRIPT_ARMENIAN, HB_SCRIPT_BENGALI, + HB_SCRIPT_CYRILLIC, HB_SCRIPT_DEVANAGARI, + HB_SCRIPT_GEORGIAN, HB_SCRIPT_GREEK, + HB_SCRIPT_GUJARATI, HB_SCRIPT_GURMUKHI, + HB_SCRIPT_HANGUL, HB_SCRIPT_HAN, + HB_SCRIPT_HEBREW, HB_SCRIPT_HIRAGANA, + HB_SCRIPT_KANNADA, HB_SCRIPT_KATAKANA, + HB_SCRIPT_LAO, HB_SCRIPT_LATIN, + HB_SCRIPT_MALAYALAM, HB_SCRIPT_ORIYA, + HB_SCRIPT_TAMIL, HB_SCRIPT_TELUGU, + HB_SCRIPT_THAI, HB_SCRIPT_TIBETAN, + HB_SCRIPT_BOPOMOFO, HB_SCRIPT_BRAILLE, + HB_SCRIPT_CANADIAN_SYLLABICS, HB_SCRIPT_CHEROKEE, + HB_SCRIPT_ETHIOPIC, HB_SCRIPT_KHMER, + HB_SCRIPT_MONGOLIAN, HB_SCRIPT_MYANMAR, + HB_SCRIPT_OGHAM, HB_SCRIPT_RUNIC, + HB_SCRIPT_SINHALA, HB_SCRIPT_SYRIAC, + HB_SCRIPT_THAANA, HB_SCRIPT_YI, + HB_SCRIPT_DESERET, HB_SCRIPT_GOTHIC, + HB_SCRIPT_OLD_ITALIC, HB_SCRIPT_BUHID, + HB_SCRIPT_HANUNOO, HB_SCRIPT_TAGALOG, + HB_SCRIPT_TAGBANWA, HB_SCRIPT_CYPRIOT, + HB_SCRIPT_LIMBU, HB_SCRIPT_LINEAR_B, + HB_SCRIPT_OSMANYA, HB_SCRIPT_SHAVIAN, + HB_SCRIPT_TAI_LE, HB_SCRIPT_UGARITIC, + HB_SCRIPT_BUGINESE, HB_SCRIPT_COPTIC, + HB_SCRIPT_GLAGOLITIC, HB_SCRIPT_KHAROSHTHI, + HB_SCRIPT_NEW_TAI_LUE, HB_SCRIPT_OLD_PERSIAN, + HB_SCRIPT_SYLOTI_NAGRI, HB_SCRIPT_TIFINAGH, + HB_SCRIPT_BALINESE, HB_SCRIPT_CUNEIFORM, + HB_SCRIPT_NKO, HB_SCRIPT_PHAGS_PA, + HB_SCRIPT_PHOENICIAN, HB_SCRIPT_CARIAN, + HB_SCRIPT_CHAM, HB_SCRIPT_KAYAH_LI, + HB_SCRIPT_LEPCHA, HB_SCRIPT_LYCIAN, + HB_SCRIPT_LYDIAN, HB_SCRIPT_OL_CHIKI, + HB_SCRIPT_REJANG, HB_SCRIPT_SAURASHTRA, + HB_SCRIPT_SUNDANESE, HB_SCRIPT_VAI, + HB_SCRIPT_AVESTAN, HB_SCRIPT_BAMUM, + HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, HB_SCRIPT_IMPERIAL_ARAMAIC, + HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, + HB_SCRIPT_JAVANESE, HB_SCRIPT_KAITHI, + HB_SCRIPT_LISU, HB_SCRIPT_MEETEI_MAYEK, + HB_SCRIPT_OLD_SOUTH_ARABIAN, HB_SCRIPT_OLD_TURKIC, + HB_SCRIPT_SAMARITAN, HB_SCRIPT_TAI_THAM, + HB_SCRIPT_TAI_VIET, HB_SCRIPT_BATAK, + HB_SCRIPT_BRAHMI, HB_SCRIPT_MANDAIC, + HB_SCRIPT_CHAKMA, HB_SCRIPT_MEROITIC_CURSIVE, + HB_SCRIPT_MEROITIC_HIEROGLYPHS, HB_SCRIPT_MIAO, + HB_SCRIPT_SHARADA, HB_SCRIPT_SORA_SOMPENG, + HB_SCRIPT_TAKRI, HB_SCRIPT_BASSA_VAH, + HB_SCRIPT_CAUCASIAN_ALBANIAN, HB_SCRIPT_DUPLOYAN, + HB_SCRIPT_ELBASAN, HB_SCRIPT_GRANTHA, + HB_SCRIPT_KHOJKI, HB_SCRIPT_KHUDAWADI, + HB_SCRIPT_LINEAR_A, HB_SCRIPT_MAHAJANI, + HB_SCRIPT_MANICHAEAN, HB_SCRIPT_MENDE_KIKAKUI, + HB_SCRIPT_MODI, HB_SCRIPT_MRO, + HB_SCRIPT_NABATAEAN, HB_SCRIPT_OLD_NORTH_ARABIAN, + HB_SCRIPT_OLD_PERMIC, HB_SCRIPT_PAHAWH_HMONG, + HB_SCRIPT_PALMYRENE, HB_SCRIPT_PAU_CIN_HAU, + HB_SCRIPT_PSALTER_PAHLAVI, HB_SCRIPT_SIDDHAM, + HB_SCRIPT_TIRHUTA, HB_SCRIPT_WARANG_CITI, + HB_SCRIPT_AHOM, HB_SCRIPT_ANATOLIAN_HIEROGLYPHS, + HB_SCRIPT_HATRAN, HB_SCRIPT_MULTANI, + HB_SCRIPT_OLD_HUNGARIAN, HB_SCRIPT_SIGNWRITING, + HB_SCRIPT_ADLAM, HB_SCRIPT_BHAIKSUKI, + HB_SCRIPT_MARCHEN, HB_SCRIPT_OSAGE, + HB_SCRIPT_TANGUT, HB_SCRIPT_NEWA, +}; +static const hb_codepoint_t +_hb_ucd_dm1_map[935] = +{ + 0x003Bu, 0x004Bu, 0x0060u, 0x00B4u, 0x00B7u, 0x00C5u, 0x02B9u, 0x0300u, + 0x0301u, 0x0313u, 0x0385u, 0x0386u, 0x0388u, 0x0389u, 0x038Au, 0x038Cu, + 0x038Eu, 0x038Fu, 0x0390u, 0x03A9u, 0x03ACu, 0x03ADu, 0x03AEu, 0x03AFu, + 0x03B0u, 0x03B9u, 0x03CCu, 0x03CDu, 0x03CEu, 0x2002u, 0x2003u, 0x3008u, + 0x3009u, 0x349Eu, 0x34B9u, 0x34BBu, 0x34DFu, 0x3515u, 0x36EEu, 0x36FCu, + 0x3781u, 0x382Fu, 0x3862u, 0x387Cu, 0x38C7u, 0x38E3u, 0x391Cu, 0x393Au, + 0x3A2Eu, 0x3A6Cu, 0x3AE4u, 0x3B08u, 0x3B19u, 0x3B49u, 0x3B9Du, 0x3C18u, + 0x3C4Eu, 0x3D33u, 0x3D96u, 0x3EACu, 0x3EB8u, 0x3F1Bu, 0x3FFCu, 0x4008u, + 0x4018u, 0x4039u, 0x4046u, 0x4096u, 0x40E3u, 0x412Fu, 0x4202u, 0x4227u, + 0x42A0u, 0x4301u, 0x4334u, 0x4359u, 0x43D5u, 0x43D9u, 0x440Bu, 0x446Bu, + 0x452Bu, 0x455Du, 0x4561u, 0x456Bu, 0x45D7u, 0x45F9u, 0x4635u, 0x46BEu, + 0x46C7u, 0x4995u, 0x49E6u, 0x4A6Eu, 0x4A76u, 0x4AB2u, 0x4B33u, 0x4BCEu, + 0x4CCEu, 0x4CEDu, 0x4CF8u, 0x4D56u, 0x4E0Du, 0x4E26u, 0x4E32u, 0x4E38u, + 0x4E39u, 0x4E3Du, 0x4E41u, 0x4E82u, 0x4E86u, 0x4EAEu, 0x4EC0u, 0x4ECCu, + 0x4EE4u, 0x4F60u, 0x4F80u, 0x4F86u, 0x4F8Bu, 0x4FAEu, 0x4FBBu, 0x4FBFu, + 0x5002u, 0x502Bu, 0x507Au, 0x5099u, 0x50CFu, 0x50DAu, 0x50E7u, 0x5140u, + 0x5145u, 0x514Du, 0x5154u, 0x5164u, 0x5167u, 0x5168u, 0x5169u, 0x516Du, + 0x5177u, 0x5180u, 0x518Du, 0x5192u, 0x5195u, 0x5197u, 0x51A4u, 0x51ACu, + 0x51B5u, 0x51B7u, 0x51C9u, 0x51CCu, 0x51DCu, 0x51DEu, 0x51F5u, 0x5203u, + 0x5207u, 0x5217u, 0x5229u, 0x523Au, 0x523Bu, 0x5246u, 0x5272u, 0x5277u, + 0x5289u, 0x529Bu, 0x52A3u, 0x52B3u, 0x52C7u, 0x52C9u, 0x52D2u, 0x52DEu, + 0x52E4u, 0x52F5u, 0x52FAu, 0x5305u, 0x5306u, 0x5317u, 0x533Fu, 0x5349u, + 0x5351u, 0x535Au, 0x5373u, 0x5375u, 0x537Du, 0x537Fu, 0x53C3u, 0x53CAu, + 0x53DFu, 0x53E5u, 0x53EBu, 0x53F1u, 0x5406u, 0x540Fu, 0x541Du, 0x5438u, + 0x5442u, 0x5448u, 0x5468u, 0x549Eu, 0x54A2u, 0x54BDu, 0x54F6u, 0x5510u, + 0x5553u, 0x5555u, 0x5563u, 0x5584u, 0x5587u, 0x5599u, 0x559Du, 0x55ABu, + 0x55B3u, 0x55C0u, 0x55C2u, 0x55E2u, 0x5606u, 0x5651u, 0x5668u, 0x5674u, + 0x56F9u, 0x5716u, 0x5717u, 0x578Bu, 0x57CEu, 0x57F4u, 0x580Du, 0x5831u, + 0x5832u, 0x5840u, 0x585Au, 0x585Eu, 0x58A8u, 0x58ACu, 0x58B3u, 0x58D8u, + 0x58DFu, 0x58EEu, 0x58F2u, 0x58F7u, 0x5906u, 0x591Au, 0x5922u, 0x5944u, + 0x5948u, 0x5951u, 0x5954u, 0x5962u, 0x5973u, 0x59D8u, 0x59ECu, 0x5A1Bu, + 0x5A27u, 0x5A62u, 0x5A66u, 0x5AB5u, 0x5B08u, 0x5B28u, 0x5B3Eu, 0x5B85u, + 0x5BC3u, 0x5BD8u, 0x5BE7u, 0x5BEEu, 0x5BF3u, 0x5BFFu, 0x5C06u, 0x5C22u, + 0x5C3Fu, 0x5C60u, 0x5C62u, 0x5C64u, 0x5C65u, 0x5C6Eu, 0x5C8Du, 0x5CC0u, + 0x5D19u, 0x5D43u, 0x5D50u, 0x5D6Bu, 0x5D6Eu, 0x5D7Cu, 0x5DB2u, 0x5DBAu, + 0x5DE1u, 0x5DE2u, 0x5DFDu, 0x5E28u, 0x5E3Du, 0x5E69u, 0x5E74u, 0x5EA6u, + 0x5EB0u, 0x5EB3u, 0x5EB6u, 0x5EC9u, 0x5ECAu, 0x5ED2u, 0x5ED3u, 0x5ED9u, + 0x5EECu, 0x5EFEu, 0x5F04u, 0x5F22u, 0x5F53u, 0x5F62u, 0x5F69u, 0x5F6Bu, + 0x5F8Bu, 0x5F9Au, 0x5FA9u, 0x5FADu, 0x5FCDu, 0x5FD7u, 0x5FF5u, 0x5FF9u, + 0x6012u, 0x601Cu, 0x6075u, 0x6081u, 0x6094u, 0x60C7u, 0x60D8u, 0x60E1u, + 0x6108u, 0x6144u, 0x6148u, 0x614Cu, 0x614Eu, 0x6160u, 0x6168u, 0x617Au, + 0x618Eu, 0x6190u, 0x61A4u, 0x61AFu, 0x61B2u, 0x61DEu, 0x61F2u, 0x61F6u, + 0x6200u, 0x6210u, 0x621Bu, 0x622Eu, 0x6234u, 0x625Du, 0x62B1u, 0x62C9u, + 0x62CFu, 0x62D3u, 0x62D4u, 0x62FCu, 0x62FEu, 0x633Du, 0x6350u, 0x6368u, + 0x637Bu, 0x6383u, 0x63A0u, 0x63A9u, 0x63C4u, 0x63C5u, 0x63E4u, 0x641Cu, + 0x6422u, 0x6452u, 0x6469u, 0x6477u, 0x647Eu, 0x649Au, 0x649Du, 0x64C4u, + 0x654Fu, 0x6556u, 0x656Cu, 0x6578u, 0x6599u, 0x65C5u, 0x65E2u, 0x65E3u, + 0x6613u, 0x6649u, 0x6674u, 0x6688u, 0x6691u, 0x669Cu, 0x66B4u, 0x66C6u, + 0x66F4u, 0x66F8u, 0x6700u, 0x6717u, 0x671Bu, 0x6721u, 0x674Eu, 0x6753u, + 0x6756u, 0x675Eu, 0x677Bu, 0x6785u, 0x6797u, 0x67F3u, 0x67FAu, 0x6817u, + 0x681Fu, 0x6852u, 0x6881u, 0x6885u, 0x688Eu, 0x68A8u, 0x6914u, 0x6942u, + 0x69A3u, 0x69EAu, 0x6A02u, 0x6A13u, 0x6AA8u, 0x6AD3u, 0x6ADBu, 0x6B04u, + 0x6B21u, 0x6B54u, 0x6B72u, 0x6B77u, 0x6B79u, 0x6B9Fu, 0x6BAEu, 0x6BBAu, + 0x6BBBu, 0x6C4Eu, 0x6C67u, 0x6C88u, 0x6CBFu, 0x6CCCu, 0x6CCDu, 0x6CE5u, + 0x6D16u, 0x6D1Bu, 0x6D1Eu, 0x6D34u, 0x6D3Eu, 0x6D41u, 0x6D69u, 0x6D6Au, + 0x6D77u, 0x6D78u, 0x6D85u, 0x6DCBu, 0x6DDAu, 0x6DEAu, 0x6DF9u, 0x6E1Au, + 0x6E2Fu, 0x6E6Eu, 0x6E9Cu, 0x6EBAu, 0x6EC7u, 0x6ECBu, 0x6ED1u, 0x6EDBu, + 0x6F0Fu, 0x6F22u, 0x6F23u, 0x6F6Eu, 0x6FC6u, 0x6FEBu, 0x6FFEu, 0x701Bu, + 0x701Eu, 0x7039u, 0x704Au, 0x7070u, 0x7077u, 0x707Du, 0x7099u, 0x70ADu, + 0x70C8u, 0x70D9u, 0x7145u, 0x7149u, 0x716Eu, 0x719Cu, 0x71CEu, 0x71D0u, + 0x7210u, 0x721Bu, 0x7228u, 0x722Bu, 0x7235u, 0x7250u, 0x7262u, 0x7280u, + 0x7295u, 0x72AFu, 0x72C0u, 0x72FCu, 0x732Au, 0x7375u, 0x737Au, 0x7387u, + 0x738Bu, 0x73A5u, 0x73B2u, 0x73DEu, 0x7406u, 0x7409u, 0x7422u, 0x7447u, + 0x745Cu, 0x7469u, 0x7471u, 0x7485u, 0x7489u, 0x7498u, 0x74CAu, 0x7506u, + 0x7524u, 0x753Bu, 0x753Eu, 0x7559u, 0x7565u, 0x7570u, 0x75E2u, 0x7610u, + 0x761Du, 0x761Fu, 0x7642u, 0x7669u, 0x76CAu, 0x76DBu, 0x76E7u, 0x76F4u, + 0x7701u, 0x771Eu, 0x771Fu, 0x7740u, 0x774Au, 0x778Bu, 0x77A7u, 0x784Eu, + 0x786Bu, 0x788Cu, 0x7891u, 0x78CAu, 0x78CCu, 0x78FBu, 0x792Au, 0x793Cu, + 0x793Eu, 0x7948u, 0x7949u, 0x7950u, 0x7956u, 0x795Du, 0x795Eu, 0x7965u, + 0x797Fu, 0x798Du, 0x798Eu, 0x798Fu, 0x79AEu, 0x79CAu, 0x79EBu, 0x7A1Cu, + 0x7A40u, 0x7A4Au, 0x7A4Fu, 0x7A81u, 0x7AB1u, 0x7ACBu, 0x7AEEu, 0x7B20u, + 0x7BC0u, 0x7BC6u, 0x7BC9u, 0x7C3Eu, 0x7C60u, 0x7C7Bu, 0x7C92u, 0x7CBEu, + 0x7CD2u, 0x7CD6u, 0x7CE3u, 0x7CE7u, 0x7CE8u, 0x7D00u, 0x7D10u, 0x7D22u, + 0x7D2Fu, 0x7D5Bu, 0x7D63u, 0x7DA0u, 0x7DBEu, 0x7DC7u, 0x7DF4u, 0x7E02u, + 0x7E09u, 0x7E37u, 0x7E41u, 0x7E45u, 0x7F3Eu, 0x7F72u, 0x7F79u, 0x7F7Au, + 0x7F85u, 0x7F95u, 0x7F9Au, 0x7FBDu, 0x7FFAu, 0x8001u, 0x8005u, 0x8046u, + 0x8060u, 0x806Fu, 0x8070u, 0x807Eu, 0x808Bu, 0x80ADu, 0x80B2u, 0x8103u, + 0x813Eu, 0x81D8u, 0x81E8u, 0x81EDu, 0x8201u, 0x8204u, 0x8218u, 0x826Fu, + 0x8279u, 0x828Bu, 0x8291u, 0x829Du, 0x82B1u, 0x82B3u, 0x82BDu, 0x82E5u, + 0x82E6u, 0x831Du, 0x8323u, 0x8336u, 0x8352u, 0x8353u, 0x8363u, 0x83ADu, + 0x83BDu, 0x83C9u, 0x83CAu, 0x83CCu, 0x83DCu, 0x83E7u, 0x83EFu, 0x83F1u, + 0x843Du, 0x8449u, 0x8457u, 0x84EEu, 0x84F1u, 0x84F3u, 0x84FCu, 0x8516u, + 0x8564u, 0x85CDu, 0x85FAu, 0x8606u, 0x8612u, 0x862Du, 0x863Fu, 0x8650u, + 0x865Cu, 0x8667u, 0x8669u, 0x8688u, 0x86A9u, 0x86E2u, 0x870Eu, 0x8728u, + 0x876Bu, 0x8779u, 0x8786u, 0x87BAu, 0x87E1u, 0x8801u, 0x881Fu, 0x884Cu, + 0x8860u, 0x8863u, 0x88C2u, 0x88CFu, 0x88D7u, 0x88DEu, 0x88E1u, 0x88F8u, + 0x88FAu, 0x8910u, 0x8941u, 0x8964u, 0x8986u, 0x898Bu, 0x8996u, 0x8AA0u, + 0x8AAAu, 0x8ABFu, 0x8ACBu, 0x8AD2u, 0x8AD6u, 0x8AEDu, 0x8AF8u, 0x8AFEu, + 0x8B01u, 0x8B39u, 0x8B58u, 0x8B80u, 0x8B8Au, 0x8C48u, 0x8C55u, 0x8CABu, + 0x8CC1u, 0x8CC2u, 0x8CC8u, 0x8CD3u, 0x8D08u, 0x8D1Bu, 0x8D77u, 0x8DBCu, + 0x8DCBu, 0x8DEFu, 0x8DF0u, 0x8ECAu, 0x8ED4u, 0x8F26u, 0x8F2Au, 0x8F38u, + 0x8F3Bu, 0x8F62u, 0x8F9Eu, 0x8FB0u, 0x8FB6u, 0x9023u, 0x9038u, 0x9072u, + 0x907Cu, 0x908Fu, 0x9094u, 0x90CEu, 0x90DEu, 0x90F1u, 0x90FDu, 0x9111u, + 0x911Bu, 0x916Au, 0x9199u, 0x91B4u, 0x91CCu, 0x91CFu, 0x91D1u, 0x9234u, + 0x9238u, 0x9276u, 0x927Cu, 0x92D7u, 0x92D8u, 0x9304u, 0x934Au, 0x93F9u, + 0x9415u, 0x958Bu, 0x95ADu, 0x95B7u, 0x962Eu, 0x964Bu, 0x964Du, 0x9675u, + 0x9678u, 0x967Cu, 0x9686u, 0x96A3u, 0x96B7u, 0x96B8u, 0x96C3u, 0x96E2u, + 0x96E3u, 0x96F6u, 0x96F7u, 0x9723u, 0x9732u, 0x9748u, 0x9756u, 0x97DBu, + 0x97E0u, 0x97FFu, 0x980Bu, 0x9818u, 0x9829u, 0x983Bu, 0x985Eu, 0x98E2u, + 0x98EFu, 0x98FCu, 0x9928u, 0x9929u, 0x99A7u, 0x99C2u, 0x99F1u, 0x99FEu, + 0x9A6Au, 0x9B12u, 0x9B6Fu, 0x9C40u, 0x9C57u, 0x9CFDu, 0x9D67u, 0x9DB4u, + 0x9DFAu, 0x9E1Eu, 0x9E7Fu, 0x9E97u, 0x9E9Fu, 0x9EBBu, 0x9ECEu, 0x9EF9u, + 0x9EFEu, 0x9F05u, 0x9F0Fu, 0x9F16u, 0x9F3Bu, 0x9F43u, 0x9F8Du, 0x9F8Eu, + 0x9F9Cu,0x20122u,0x2051Cu,0x20525u,0x2054Bu,0x2063Au,0x20804u,0x208DEu, + 0x20A2Cu,0x20B63u,0x214E4u,0x216A8u,0x216EAu,0x219C8u,0x21B18u,0x21D0Bu, + 0x21DE4u,0x21DE6u,0x22183u,0x2219Fu,0x22331u,0x226D4u,0x22844u,0x2284Au, + 0x22B0Cu,0x22BF1u,0x2300Au,0x232B8u,0x2335Fu,0x23393u,0x2339Cu,0x233C3u, + 0x233D5u,0x2346Du,0x236A3u,0x238A7u,0x23A8Du,0x23AFAu,0x23CBCu,0x23D1Eu, + 0x23ED1u,0x23F5Eu,0x23F8Eu,0x24263u,0x242EEu,0x243ABu,0x24608u,0x24735u, + 0x24814u,0x24C36u,0x24C92u,0x24FA1u,0x24FB8u,0x25044u,0x250F2u,0x250F3u, + 0x25119u,0x25133u,0x25249u,0x2541Du,0x25626u,0x2569Au,0x256C5u,0x2597Cu, + 0x25AA7u,0x25BABu,0x25C80u,0x25CD0u,0x25F86u,0x261DAu,0x26228u,0x26247u, + 0x262D9u,0x2633Eu,0x264DAu,0x26523u,0x265A8u,0x267A7u,0x267B5u,0x26B3Cu, + 0x26C36u,0x26CD5u,0x26D6Bu,0x26F2Cu,0x26FB1u,0x270D2u,0x273CAu,0x27667u, + 0x278AEu,0x27966u,0x27CA8u,0x27ED3u,0x27F2Fu,0x285D2u,0x285EDu,0x2872Eu, + 0x28BFAu,0x28D77u,0x29145u,0x291DFu,0x2921Au,0x2940Au,0x29496u,0x295B6u, + 0x29B30u,0x2A0CEu,0x2A105u,0x2A20Eu,0x2A291u,0x2A392u,0x2A600u, +}; +static const uint64_t +_hb_ucd_dm2_map[1025] = +{ + HB_CODEPOINT_ENCODE3 (0x003Cu, 0x0338u, 0x226Eu), HB_CODEPOINT_ENCODE3 (0x003Du, 0x0338u, 0x2260u), + HB_CODEPOINT_ENCODE3 (0x003Eu, 0x0338u, 0x226Fu), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0300u, 0x00C0u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0301u, 0x00C1u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0302u, 0x00C2u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0303u, 0x00C3u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0304u, 0x0100u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0306u, 0x0102u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0307u, 0x0226u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0308u, 0x00C4u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0309u, 0x1EA2u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Au, 0x00C5u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Cu, 0x01CDu), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x030Fu, 0x0200u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0311u, 0x0202u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0323u, 0x1EA0u), HB_CODEPOINT_ENCODE3 (0x0041u, 0x0325u, 0x1E00u), + HB_CODEPOINT_ENCODE3 (0x0041u, 0x0328u, 0x0104u), HB_CODEPOINT_ENCODE3 (0x0042u, 0x0307u, 0x1E02u), + HB_CODEPOINT_ENCODE3 (0x0042u, 0x0323u, 0x1E04u), HB_CODEPOINT_ENCODE3 (0x0042u, 0x0331u, 0x1E06u), + HB_CODEPOINT_ENCODE3 (0x0043u, 0x0301u, 0x0106u), HB_CODEPOINT_ENCODE3 (0x0043u, 0x0302u, 0x0108u), + HB_CODEPOINT_ENCODE3 (0x0043u, 0x0307u, 0x010Au), HB_CODEPOINT_ENCODE3 (0x0043u, 0x030Cu, 0x010Cu), + HB_CODEPOINT_ENCODE3 (0x0043u, 0x0327u, 0x00C7u), HB_CODEPOINT_ENCODE3 (0x0044u, 0x0307u, 0x1E0Au), + HB_CODEPOINT_ENCODE3 (0x0044u, 0x030Cu, 0x010Eu), HB_CODEPOINT_ENCODE3 (0x0044u, 0x0323u, 0x1E0Cu), + HB_CODEPOINT_ENCODE3 (0x0044u, 0x0327u, 0x1E10u), HB_CODEPOINT_ENCODE3 (0x0044u, 0x032Du, 0x1E12u), + HB_CODEPOINT_ENCODE3 (0x0044u, 0x0331u, 0x1E0Eu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0300u, 0x00C8u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0301u, 0x00C9u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0302u, 0x00CAu), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0303u, 0x1EBCu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0304u, 0x0112u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0306u, 0x0114u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0307u, 0x0116u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0308u, 0x00CBu), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0309u, 0x1EBAu), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x030Cu, 0x011Au), HB_CODEPOINT_ENCODE3 (0x0045u, 0x030Fu, 0x0204u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0311u, 0x0206u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0323u, 0x1EB8u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x0327u, 0x0228u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0328u, 0x0118u), + HB_CODEPOINT_ENCODE3 (0x0045u, 0x032Du, 0x1E18u), HB_CODEPOINT_ENCODE3 (0x0045u, 0x0330u, 0x1E1Au), + HB_CODEPOINT_ENCODE3 (0x0046u, 0x0307u, 0x1E1Eu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0301u, 0x01F4u), + HB_CODEPOINT_ENCODE3 (0x0047u, 0x0302u, 0x011Cu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0304u, 0x1E20u), + HB_CODEPOINT_ENCODE3 (0x0047u, 0x0306u, 0x011Eu), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0307u, 0x0120u), + HB_CODEPOINT_ENCODE3 (0x0047u, 0x030Cu, 0x01E6u), HB_CODEPOINT_ENCODE3 (0x0047u, 0x0327u, 0x0122u), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x0302u, 0x0124u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x0307u, 0x1E22u), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x0308u, 0x1E26u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x030Cu, 0x021Eu), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x0323u, 0x1E24u), HB_CODEPOINT_ENCODE3 (0x0048u, 0x0327u, 0x1E28u), + HB_CODEPOINT_ENCODE3 (0x0048u, 0x032Eu, 0x1E2Au), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0300u, 0x00CCu), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0301u, 0x00CDu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0302u, 0x00CEu), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0303u, 0x0128u), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0304u, 0x012Au), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0306u, 0x012Cu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0307u, 0x0130u), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0308u, 0x00CFu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0309u, 0x1EC8u), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x030Cu, 0x01CFu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x030Fu, 0x0208u), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0311u, 0x020Au), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0323u, 0x1ECAu), + HB_CODEPOINT_ENCODE3 (0x0049u, 0x0328u, 0x012Eu), HB_CODEPOINT_ENCODE3 (0x0049u, 0x0330u, 0x1E2Cu), + HB_CODEPOINT_ENCODE3 (0x004Au, 0x0302u, 0x0134u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0301u, 0x1E30u), + HB_CODEPOINT_ENCODE3 (0x004Bu, 0x030Cu, 0x01E8u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0323u, 0x1E32u), + HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0327u, 0x0136u), HB_CODEPOINT_ENCODE3 (0x004Bu, 0x0331u, 0x1E34u), + HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0301u, 0x0139u), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x030Cu, 0x013Du), + HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0323u, 0x1E36u), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0327u, 0x013Bu), + HB_CODEPOINT_ENCODE3 (0x004Cu, 0x032Du, 0x1E3Cu), HB_CODEPOINT_ENCODE3 (0x004Cu, 0x0331u, 0x1E3Au), + HB_CODEPOINT_ENCODE3 (0x004Du, 0x0301u, 0x1E3Eu), HB_CODEPOINT_ENCODE3 (0x004Du, 0x0307u, 0x1E40u), + HB_CODEPOINT_ENCODE3 (0x004Du, 0x0323u, 0x1E42u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0300u, 0x01F8u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0301u, 0x0143u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0303u, 0x00D1u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0307u, 0x1E44u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x030Cu, 0x0147u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0323u, 0x1E46u), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0327u, 0x0145u), + HB_CODEPOINT_ENCODE3 (0x004Eu, 0x032Du, 0x1E4Au), HB_CODEPOINT_ENCODE3 (0x004Eu, 0x0331u, 0x1E48u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0300u, 0x00D2u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0301u, 0x00D3u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0302u, 0x00D4u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0303u, 0x00D5u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0304u, 0x014Cu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0306u, 0x014Eu), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0307u, 0x022Eu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0308u, 0x00D6u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0309u, 0x1ECEu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Bu, 0x0150u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Cu, 0x01D1u), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x030Fu, 0x020Cu), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0311u, 0x020Eu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x031Bu, 0x01A0u), + HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0323u, 0x1ECCu), HB_CODEPOINT_ENCODE3 (0x004Fu, 0x0328u, 0x01EAu), + HB_CODEPOINT_ENCODE3 (0x0050u, 0x0301u, 0x1E54u), HB_CODEPOINT_ENCODE3 (0x0050u, 0x0307u, 0x1E56u), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x0301u, 0x0154u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0307u, 0x1E58u), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x030Cu, 0x0158u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x030Fu, 0x0210u), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x0311u, 0x0212u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0323u, 0x1E5Au), + HB_CODEPOINT_ENCODE3 (0x0052u, 0x0327u, 0x0156u), HB_CODEPOINT_ENCODE3 (0x0052u, 0x0331u, 0x1E5Eu), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0301u, 0x015Au), HB_CODEPOINT_ENCODE3 (0x0053u, 0x0302u, 0x015Cu), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0307u, 0x1E60u), HB_CODEPOINT_ENCODE3 (0x0053u, 0x030Cu, 0x0160u), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0323u, 0x1E62u), HB_CODEPOINT_ENCODE3 (0x0053u, 0x0326u, 0x0218u), + HB_CODEPOINT_ENCODE3 (0x0053u, 0x0327u, 0x015Eu), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0307u, 0x1E6Au), + HB_CODEPOINT_ENCODE3 (0x0054u, 0x030Cu, 0x0164u), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0323u, 0x1E6Cu), + HB_CODEPOINT_ENCODE3 (0x0054u, 0x0326u, 0x021Au), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0327u, 0x0162u), + HB_CODEPOINT_ENCODE3 (0x0054u, 0x032Du, 0x1E70u), HB_CODEPOINT_ENCODE3 (0x0054u, 0x0331u, 0x1E6Eu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0300u, 0x00D9u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0301u, 0x00DAu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0302u, 0x00DBu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0303u, 0x0168u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0304u, 0x016Au), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0306u, 0x016Cu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0308u, 0x00DCu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0309u, 0x1EE6u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Au, 0x016Eu), HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Bu, 0x0170u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Cu, 0x01D3u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x030Fu, 0x0214u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0311u, 0x0216u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x031Bu, 0x01AFu), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0323u, 0x1EE4u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x0324u, 0x1E72u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0328u, 0x0172u), HB_CODEPOINT_ENCODE3 (0x0055u, 0x032Du, 0x1E76u), + HB_CODEPOINT_ENCODE3 (0x0055u, 0x0330u, 0x1E74u), HB_CODEPOINT_ENCODE3 (0x0056u, 0x0303u, 0x1E7Cu), + HB_CODEPOINT_ENCODE3 (0x0056u, 0x0323u, 0x1E7Eu), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0300u, 0x1E80u), + HB_CODEPOINT_ENCODE3 (0x0057u, 0x0301u, 0x1E82u), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0302u, 0x0174u), + HB_CODEPOINT_ENCODE3 (0x0057u, 0x0307u, 0x1E86u), HB_CODEPOINT_ENCODE3 (0x0057u, 0x0308u, 0x1E84u), + HB_CODEPOINT_ENCODE3 (0x0057u, 0x0323u, 0x1E88u), HB_CODEPOINT_ENCODE3 (0x0058u, 0x0307u, 0x1E8Au), + HB_CODEPOINT_ENCODE3 (0x0058u, 0x0308u, 0x1E8Cu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0300u, 0x1EF2u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0301u, 0x00DDu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0302u, 0x0176u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0303u, 0x1EF8u), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0304u, 0x0232u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0307u, 0x1E8Eu), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0308u, 0x0178u), + HB_CODEPOINT_ENCODE3 (0x0059u, 0x0309u, 0x1EF6u), HB_CODEPOINT_ENCODE3 (0x0059u, 0x0323u, 0x1EF4u), + HB_CODEPOINT_ENCODE3 (0x005Au, 0x0301u, 0x0179u), HB_CODEPOINT_ENCODE3 (0x005Au, 0x0302u, 0x1E90u), + HB_CODEPOINT_ENCODE3 (0x005Au, 0x0307u, 0x017Bu), HB_CODEPOINT_ENCODE3 (0x005Au, 0x030Cu, 0x017Du), + HB_CODEPOINT_ENCODE3 (0x005Au, 0x0323u, 0x1E92u), HB_CODEPOINT_ENCODE3 (0x005Au, 0x0331u, 0x1E94u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0300u, 0x00E0u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0301u, 0x00E1u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0302u, 0x00E2u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0303u, 0x00E3u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0304u, 0x0101u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0306u, 0x0103u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0307u, 0x0227u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0308u, 0x00E4u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0309u, 0x1EA3u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Au, 0x00E5u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Cu, 0x01CEu), HB_CODEPOINT_ENCODE3 (0x0061u, 0x030Fu, 0x0201u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0311u, 0x0203u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0323u, 0x1EA1u), + HB_CODEPOINT_ENCODE3 (0x0061u, 0x0325u, 0x1E01u), HB_CODEPOINT_ENCODE3 (0x0061u, 0x0328u, 0x0105u), + HB_CODEPOINT_ENCODE3 (0x0062u, 0x0307u, 0x1E03u), HB_CODEPOINT_ENCODE3 (0x0062u, 0x0323u, 0x1E05u), + HB_CODEPOINT_ENCODE3 (0x0062u, 0x0331u, 0x1E07u), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0301u, 0x0107u), + HB_CODEPOINT_ENCODE3 (0x0063u, 0x0302u, 0x0109u), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0307u, 0x010Bu), + HB_CODEPOINT_ENCODE3 (0x0063u, 0x030Cu, 0x010Du), HB_CODEPOINT_ENCODE3 (0x0063u, 0x0327u, 0x00E7u), + HB_CODEPOINT_ENCODE3 (0x0064u, 0x0307u, 0x1E0Bu), HB_CODEPOINT_ENCODE3 (0x0064u, 0x030Cu, 0x010Fu), + HB_CODEPOINT_ENCODE3 (0x0064u, 0x0323u, 0x1E0Du), HB_CODEPOINT_ENCODE3 (0x0064u, 0x0327u, 0x1E11u), + HB_CODEPOINT_ENCODE3 (0x0064u, 0x032Du, 0x1E13u), HB_CODEPOINT_ENCODE3 (0x0064u, 0x0331u, 0x1E0Fu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0300u, 0x00E8u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0301u, 0x00E9u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0302u, 0x00EAu), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0303u, 0x1EBDu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0304u, 0x0113u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0306u, 0x0115u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0307u, 0x0117u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0308u, 0x00EBu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0309u, 0x1EBBu), HB_CODEPOINT_ENCODE3 (0x0065u, 0x030Cu, 0x011Bu), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x030Fu, 0x0205u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0311u, 0x0207u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0323u, 0x1EB9u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x0327u, 0x0229u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0328u, 0x0119u), HB_CODEPOINT_ENCODE3 (0x0065u, 0x032Du, 0x1E19u), + HB_CODEPOINT_ENCODE3 (0x0065u, 0x0330u, 0x1E1Bu), HB_CODEPOINT_ENCODE3 (0x0066u, 0x0307u, 0x1E1Fu), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0301u, 0x01F5u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x0302u, 0x011Du), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0304u, 0x1E21u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x0306u, 0x011Fu), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0307u, 0x0121u), HB_CODEPOINT_ENCODE3 (0x0067u, 0x030Cu, 0x01E7u), + HB_CODEPOINT_ENCODE3 (0x0067u, 0x0327u, 0x0123u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0302u, 0x0125u), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x0307u, 0x1E23u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0308u, 0x1E27u), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x030Cu, 0x021Fu), HB_CODEPOINT_ENCODE3 (0x0068u, 0x0323u, 0x1E25u), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x0327u, 0x1E29u), HB_CODEPOINT_ENCODE3 (0x0068u, 0x032Eu, 0x1E2Bu), + HB_CODEPOINT_ENCODE3 (0x0068u, 0x0331u, 0x1E96u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0300u, 0x00ECu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0301u, 0x00EDu), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0302u, 0x00EEu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0303u, 0x0129u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0304u, 0x012Bu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0306u, 0x012Du), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0308u, 0x00EFu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0309u, 0x1EC9u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x030Cu, 0x01D0u), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x030Fu, 0x0209u), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0311u, 0x020Bu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0323u, 0x1ECBu), HB_CODEPOINT_ENCODE3 (0x0069u, 0x0328u, 0x012Fu), + HB_CODEPOINT_ENCODE3 (0x0069u, 0x0330u, 0x1E2Du), HB_CODEPOINT_ENCODE3 (0x006Au, 0x0302u, 0x0135u), + HB_CODEPOINT_ENCODE3 (0x006Au, 0x030Cu, 0x01F0u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0301u, 0x1E31u), + HB_CODEPOINT_ENCODE3 (0x006Bu, 0x030Cu, 0x01E9u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0323u, 0x1E33u), + HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0327u, 0x0137u), HB_CODEPOINT_ENCODE3 (0x006Bu, 0x0331u, 0x1E35u), + HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0301u, 0x013Au), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x030Cu, 0x013Eu), + HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0323u, 0x1E37u), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0327u, 0x013Cu), + HB_CODEPOINT_ENCODE3 (0x006Cu, 0x032Du, 0x1E3Du), HB_CODEPOINT_ENCODE3 (0x006Cu, 0x0331u, 0x1E3Bu), + HB_CODEPOINT_ENCODE3 (0x006Du, 0x0301u, 0x1E3Fu), HB_CODEPOINT_ENCODE3 (0x006Du, 0x0307u, 0x1E41u), + HB_CODEPOINT_ENCODE3 (0x006Du, 0x0323u, 0x1E43u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0300u, 0x01F9u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0301u, 0x0144u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0303u, 0x00F1u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0307u, 0x1E45u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x030Cu, 0x0148u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0323u, 0x1E47u), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0327u, 0x0146u), + HB_CODEPOINT_ENCODE3 (0x006Eu, 0x032Du, 0x1E4Bu), HB_CODEPOINT_ENCODE3 (0x006Eu, 0x0331u, 0x1E49u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0300u, 0x00F2u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0301u, 0x00F3u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0302u, 0x00F4u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0303u, 0x00F5u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0304u, 0x014Du), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0306u, 0x014Fu), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0307u, 0x022Fu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0308u, 0x00F6u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0309u, 0x1ECFu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Bu, 0x0151u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Cu, 0x01D2u), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x030Fu, 0x020Du), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0311u, 0x020Fu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x031Bu, 0x01A1u), + HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0323u, 0x1ECDu), HB_CODEPOINT_ENCODE3 (0x006Fu, 0x0328u, 0x01EBu), + HB_CODEPOINT_ENCODE3 (0x0070u, 0x0301u, 0x1E55u), HB_CODEPOINT_ENCODE3 (0x0070u, 0x0307u, 0x1E57u), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x0301u, 0x0155u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0307u, 0x1E59u), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x030Cu, 0x0159u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x030Fu, 0x0211u), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x0311u, 0x0213u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0323u, 0x1E5Bu), + HB_CODEPOINT_ENCODE3 (0x0072u, 0x0327u, 0x0157u), HB_CODEPOINT_ENCODE3 (0x0072u, 0x0331u, 0x1E5Fu), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0301u, 0x015Bu), HB_CODEPOINT_ENCODE3 (0x0073u, 0x0302u, 0x015Du), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0307u, 0x1E61u), HB_CODEPOINT_ENCODE3 (0x0073u, 0x030Cu, 0x0161u), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0323u, 0x1E63u), HB_CODEPOINT_ENCODE3 (0x0073u, 0x0326u, 0x0219u), + HB_CODEPOINT_ENCODE3 (0x0073u, 0x0327u, 0x015Fu), HB_CODEPOINT_ENCODE3 (0x0074u, 0x0307u, 0x1E6Bu), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0308u, 0x1E97u), HB_CODEPOINT_ENCODE3 (0x0074u, 0x030Cu, 0x0165u), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0323u, 0x1E6Du), HB_CODEPOINT_ENCODE3 (0x0074u, 0x0326u, 0x021Bu), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0327u, 0x0163u), HB_CODEPOINT_ENCODE3 (0x0074u, 0x032Du, 0x1E71u), + HB_CODEPOINT_ENCODE3 (0x0074u, 0x0331u, 0x1E6Fu), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0300u, 0x00F9u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0301u, 0x00FAu), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0302u, 0x00FBu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0303u, 0x0169u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0304u, 0x016Bu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0306u, 0x016Du), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0308u, 0x00FCu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0309u, 0x1EE7u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Au, 0x016Fu), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Bu, 0x0171u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Cu, 0x01D4u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x030Fu, 0x0215u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0311u, 0x0217u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x031Bu, 0x01B0u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0323u, 0x1EE5u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x0324u, 0x1E73u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0328u, 0x0173u), + HB_CODEPOINT_ENCODE3 (0x0075u, 0x032Du, 0x1E77u), HB_CODEPOINT_ENCODE3 (0x0075u, 0x0330u, 0x1E75u), + HB_CODEPOINT_ENCODE3 (0x0076u, 0x0303u, 0x1E7Du), HB_CODEPOINT_ENCODE3 (0x0076u, 0x0323u, 0x1E7Fu), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0300u, 0x1E81u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x0301u, 0x1E83u), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0302u, 0x0175u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x0307u, 0x1E87u), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0308u, 0x1E85u), HB_CODEPOINT_ENCODE3 (0x0077u, 0x030Au, 0x1E98u), + HB_CODEPOINT_ENCODE3 (0x0077u, 0x0323u, 0x1E89u), HB_CODEPOINT_ENCODE3 (0x0078u, 0x0307u, 0x1E8Bu), + HB_CODEPOINT_ENCODE3 (0x0078u, 0x0308u, 0x1E8Du), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0300u, 0x1EF3u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0301u, 0x00FDu), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0302u, 0x0177u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0303u, 0x1EF9u), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0304u, 0x0233u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0307u, 0x1E8Fu), HB_CODEPOINT_ENCODE3 (0x0079u, 0x0308u, 0x00FFu), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0309u, 0x1EF7u), HB_CODEPOINT_ENCODE3 (0x0079u, 0x030Au, 0x1E99u), + HB_CODEPOINT_ENCODE3 (0x0079u, 0x0323u, 0x1EF5u), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0301u, 0x017Au), + HB_CODEPOINT_ENCODE3 (0x007Au, 0x0302u, 0x1E91u), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0307u, 0x017Cu), + HB_CODEPOINT_ENCODE3 (0x007Au, 0x030Cu, 0x017Eu), HB_CODEPOINT_ENCODE3 (0x007Au, 0x0323u, 0x1E93u), + HB_CODEPOINT_ENCODE3 (0x007Au, 0x0331u, 0x1E95u), HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0300u, 0x1FEDu), + HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0301u, 0x0385u), HB_CODEPOINT_ENCODE3 (0x00A8u, 0x0342u, 0x1FC1u), + HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0300u, 0x1EA6u), HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0301u, 0x1EA4u), + HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0303u, 0x1EAAu), HB_CODEPOINT_ENCODE3 (0x00C2u, 0x0309u, 0x1EA8u), + HB_CODEPOINT_ENCODE3 (0x00C4u, 0x0304u, 0x01DEu), HB_CODEPOINT_ENCODE3 (0x00C5u, 0x0301u, 0x01FAu), + HB_CODEPOINT_ENCODE3 (0x00C6u, 0x0301u, 0x01FCu), HB_CODEPOINT_ENCODE3 (0x00C6u, 0x0304u, 0x01E2u), + HB_CODEPOINT_ENCODE3 (0x00C7u, 0x0301u, 0x1E08u), HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0300u, 0x1EC0u), + HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0301u, 0x1EBEu), HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0303u, 0x1EC4u), + HB_CODEPOINT_ENCODE3 (0x00CAu, 0x0309u, 0x1EC2u), HB_CODEPOINT_ENCODE3 (0x00CFu, 0x0301u, 0x1E2Eu), + HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0300u, 0x1ED2u), HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0301u, 0x1ED0u), + HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0303u, 0x1ED6u), HB_CODEPOINT_ENCODE3 (0x00D4u, 0x0309u, 0x1ED4u), + HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0301u, 0x1E4Cu), HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0304u, 0x022Cu), + HB_CODEPOINT_ENCODE3 (0x00D5u, 0x0308u, 0x1E4Eu), HB_CODEPOINT_ENCODE3 (0x00D6u, 0x0304u, 0x022Au), + HB_CODEPOINT_ENCODE3 (0x00D8u, 0x0301u, 0x01FEu), HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0300u, 0x01DBu), + HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0301u, 0x01D7u), HB_CODEPOINT_ENCODE3 (0x00DCu, 0x0304u, 0x01D5u), + HB_CODEPOINT_ENCODE3 (0x00DCu, 0x030Cu, 0x01D9u), HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0300u, 0x1EA7u), + HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0301u, 0x1EA5u), HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0303u, 0x1EABu), + HB_CODEPOINT_ENCODE3 (0x00E2u, 0x0309u, 0x1EA9u), HB_CODEPOINT_ENCODE3 (0x00E4u, 0x0304u, 0x01DFu), + HB_CODEPOINT_ENCODE3 (0x00E5u, 0x0301u, 0x01FBu), HB_CODEPOINT_ENCODE3 (0x00E6u, 0x0301u, 0x01FDu), + HB_CODEPOINT_ENCODE3 (0x00E6u, 0x0304u, 0x01E3u), HB_CODEPOINT_ENCODE3 (0x00E7u, 0x0301u, 0x1E09u), + HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0300u, 0x1EC1u), HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0301u, 0x1EBFu), + HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0303u, 0x1EC5u), HB_CODEPOINT_ENCODE3 (0x00EAu, 0x0309u, 0x1EC3u), + HB_CODEPOINT_ENCODE3 (0x00EFu, 0x0301u, 0x1E2Fu), HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0300u, 0x1ED3u), + HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0301u, 0x1ED1u), HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0303u, 0x1ED7u), + HB_CODEPOINT_ENCODE3 (0x00F4u, 0x0309u, 0x1ED5u), HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0301u, 0x1E4Du), + HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0304u, 0x022Du), HB_CODEPOINT_ENCODE3 (0x00F5u, 0x0308u, 0x1E4Fu), + HB_CODEPOINT_ENCODE3 (0x00F6u, 0x0304u, 0x022Bu), HB_CODEPOINT_ENCODE3 (0x00F8u, 0x0301u, 0x01FFu), + HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0300u, 0x01DCu), HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0301u, 0x01D8u), + HB_CODEPOINT_ENCODE3 (0x00FCu, 0x0304u, 0x01D6u), HB_CODEPOINT_ENCODE3 (0x00FCu, 0x030Cu, 0x01DAu), + HB_CODEPOINT_ENCODE3 (0x0102u, 0x0300u, 0x1EB0u), HB_CODEPOINT_ENCODE3 (0x0102u, 0x0301u, 0x1EAEu), + HB_CODEPOINT_ENCODE3 (0x0102u, 0x0303u, 0x1EB4u), HB_CODEPOINT_ENCODE3 (0x0102u, 0x0309u, 0x1EB2u), + HB_CODEPOINT_ENCODE3 (0x0103u, 0x0300u, 0x1EB1u), HB_CODEPOINT_ENCODE3 (0x0103u, 0x0301u, 0x1EAFu), + HB_CODEPOINT_ENCODE3 (0x0103u, 0x0303u, 0x1EB5u), HB_CODEPOINT_ENCODE3 (0x0103u, 0x0309u, 0x1EB3u), + HB_CODEPOINT_ENCODE3 (0x0112u, 0x0300u, 0x1E14u), HB_CODEPOINT_ENCODE3 (0x0112u, 0x0301u, 0x1E16u), + HB_CODEPOINT_ENCODE3 (0x0113u, 0x0300u, 0x1E15u), HB_CODEPOINT_ENCODE3 (0x0113u, 0x0301u, 0x1E17u), + HB_CODEPOINT_ENCODE3 (0x014Cu, 0x0300u, 0x1E50u), HB_CODEPOINT_ENCODE3 (0x014Cu, 0x0301u, 0x1E52u), + HB_CODEPOINT_ENCODE3 (0x014Du, 0x0300u, 0x1E51u), HB_CODEPOINT_ENCODE3 (0x014Du, 0x0301u, 0x1E53u), + HB_CODEPOINT_ENCODE3 (0x015Au, 0x0307u, 0x1E64u), HB_CODEPOINT_ENCODE3 (0x015Bu, 0x0307u, 0x1E65u), + HB_CODEPOINT_ENCODE3 (0x0160u, 0x0307u, 0x1E66u), HB_CODEPOINT_ENCODE3 (0x0161u, 0x0307u, 0x1E67u), + HB_CODEPOINT_ENCODE3 (0x0168u, 0x0301u, 0x1E78u), HB_CODEPOINT_ENCODE3 (0x0169u, 0x0301u, 0x1E79u), + HB_CODEPOINT_ENCODE3 (0x016Au, 0x0308u, 0x1E7Au), HB_CODEPOINT_ENCODE3 (0x016Bu, 0x0308u, 0x1E7Bu), + HB_CODEPOINT_ENCODE3 (0x017Fu, 0x0307u, 0x1E9Bu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0300u, 0x1EDCu), + HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0301u, 0x1EDAu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0303u, 0x1EE0u), + HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0309u, 0x1EDEu), HB_CODEPOINT_ENCODE3 (0x01A0u, 0x0323u, 0x1EE2u), + HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0300u, 0x1EDDu), HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0301u, 0x1EDBu), + HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0303u, 0x1EE1u), HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0309u, 0x1EDFu), + HB_CODEPOINT_ENCODE3 (0x01A1u, 0x0323u, 0x1EE3u), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0300u, 0x1EEAu), + HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0301u, 0x1EE8u), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0303u, 0x1EEEu), + HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0309u, 0x1EECu), HB_CODEPOINT_ENCODE3 (0x01AFu, 0x0323u, 0x1EF0u), + HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0300u, 0x1EEBu), HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0301u, 0x1EE9u), + HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0303u, 0x1EEFu), HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0309u, 0x1EEDu), + HB_CODEPOINT_ENCODE3 (0x01B0u, 0x0323u, 0x1EF1u), HB_CODEPOINT_ENCODE3 (0x01B7u, 0x030Cu, 0x01EEu), + HB_CODEPOINT_ENCODE3 (0x01EAu, 0x0304u, 0x01ECu), HB_CODEPOINT_ENCODE3 (0x01EBu, 0x0304u, 0x01EDu), + HB_CODEPOINT_ENCODE3 (0x0226u, 0x0304u, 0x01E0u), HB_CODEPOINT_ENCODE3 (0x0227u, 0x0304u, 0x01E1u), + HB_CODEPOINT_ENCODE3 (0x0228u, 0x0306u, 0x1E1Cu), HB_CODEPOINT_ENCODE3 (0x0229u, 0x0306u, 0x1E1Du), + HB_CODEPOINT_ENCODE3 (0x022Eu, 0x0304u, 0x0230u), HB_CODEPOINT_ENCODE3 (0x022Fu, 0x0304u, 0x0231u), + HB_CODEPOINT_ENCODE3 (0x0292u, 0x030Cu, 0x01EFu), HB_CODEPOINT_ENCODE3 (0x0308u, 0x0301u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0300u, 0x1FBAu), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0301u, 0x0386u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0304u, 0x1FB9u), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0306u, 0x1FB8u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0313u, 0x1F08u), HB_CODEPOINT_ENCODE3 (0x0391u, 0x0314u, 0x1F09u), + HB_CODEPOINT_ENCODE3 (0x0391u, 0x0345u, 0x1FBCu), HB_CODEPOINT_ENCODE3 (0x0395u, 0x0300u, 0x1FC8u), + HB_CODEPOINT_ENCODE3 (0x0395u, 0x0301u, 0x0388u), HB_CODEPOINT_ENCODE3 (0x0395u, 0x0313u, 0x1F18u), + HB_CODEPOINT_ENCODE3 (0x0395u, 0x0314u, 0x1F19u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0300u, 0x1FCAu), + HB_CODEPOINT_ENCODE3 (0x0397u, 0x0301u, 0x0389u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0313u, 0x1F28u), + HB_CODEPOINT_ENCODE3 (0x0397u, 0x0314u, 0x1F29u), HB_CODEPOINT_ENCODE3 (0x0397u, 0x0345u, 0x1FCCu), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0300u, 0x1FDAu), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0301u, 0x038Au), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0304u, 0x1FD9u), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0306u, 0x1FD8u), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0308u, 0x03AAu), HB_CODEPOINT_ENCODE3 (0x0399u, 0x0313u, 0x1F38u), + HB_CODEPOINT_ENCODE3 (0x0399u, 0x0314u, 0x1F39u), HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0300u, 0x1FF8u), + HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0301u, 0x038Cu), HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0313u, 0x1F48u), + HB_CODEPOINT_ENCODE3 (0x039Fu, 0x0314u, 0x1F49u), HB_CODEPOINT_ENCODE3 (0x03A1u, 0x0314u, 0x1FECu), + HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0300u, 0x1FEAu), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0301u, 0x038Eu), + HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0304u, 0x1FE9u), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0306u, 0x1FE8u), + HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0308u, 0x03ABu), HB_CODEPOINT_ENCODE3 (0x03A5u, 0x0314u, 0x1F59u), + HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0300u, 0x1FFAu), HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0301u, 0x038Fu), + HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0313u, 0x1F68u), HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0314u, 0x1F69u), + HB_CODEPOINT_ENCODE3 (0x03A9u, 0x0345u, 0x1FFCu), HB_CODEPOINT_ENCODE3 (0x03ACu, 0x0345u, 0x1FB4u), + HB_CODEPOINT_ENCODE3 (0x03AEu, 0x0345u, 0x1FC4u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0300u, 0x1F70u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0301u, 0x03ACu), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0304u, 0x1FB1u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0306u, 0x1FB0u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0313u, 0x1F00u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0314u, 0x1F01u), HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0342u, 0x1FB6u), + HB_CODEPOINT_ENCODE3 (0x03B1u, 0x0345u, 0x1FB3u), HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0300u, 0x1F72u), + HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0301u, 0x03ADu), HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0313u, 0x1F10u), + HB_CODEPOINT_ENCODE3 (0x03B5u, 0x0314u, 0x1F11u), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0300u, 0x1F74u), + HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0301u, 0x03AEu), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0313u, 0x1F20u), + HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0314u, 0x1F21u), HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0342u, 0x1FC6u), + HB_CODEPOINT_ENCODE3 (0x03B7u, 0x0345u, 0x1FC3u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0300u, 0x1F76u), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0301u, 0x03AFu), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0304u, 0x1FD1u), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0306u, 0x1FD0u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0308u, 0x03CAu), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0313u, 0x1F30u), HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0314u, 0x1F31u), + HB_CODEPOINT_ENCODE3 (0x03B9u, 0x0342u, 0x1FD6u), HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0300u, 0x1F78u), + HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0301u, 0x03CCu), HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0313u, 0x1F40u), + HB_CODEPOINT_ENCODE3 (0x03BFu, 0x0314u, 0x1F41u), HB_CODEPOINT_ENCODE3 (0x03C1u, 0x0313u, 0x1FE4u), + HB_CODEPOINT_ENCODE3 (0x03C1u, 0x0314u, 0x1FE5u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0300u, 0x1F7Au), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0301u, 0x03CDu), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0304u, 0x1FE1u), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0306u, 0x1FE0u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0308u, 0x03CBu), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0313u, 0x1F50u), HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0314u, 0x1F51u), + HB_CODEPOINT_ENCODE3 (0x03C5u, 0x0342u, 0x1FE6u), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0300u, 0x1F7Cu), + HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0301u, 0x03CEu), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0313u, 0x1F60u), + HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0314u, 0x1F61u), HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0342u, 0x1FF6u), + HB_CODEPOINT_ENCODE3 (0x03C9u, 0x0345u, 0x1FF3u), HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0300u, 0x1FD2u), + HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0301u, 0x0390u), HB_CODEPOINT_ENCODE3 (0x03CAu, 0x0342u, 0x1FD7u), + HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0300u, 0x1FE2u), HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0301u, 0x03B0u), + HB_CODEPOINT_ENCODE3 (0x03CBu, 0x0342u, 0x1FE7u), HB_CODEPOINT_ENCODE3 (0x03CEu, 0x0345u, 0x1FF4u), + HB_CODEPOINT_ENCODE3 (0x03D2u, 0x0301u, 0x03D3u), HB_CODEPOINT_ENCODE3 (0x03D2u, 0x0308u, 0x03D4u), + HB_CODEPOINT_ENCODE3 (0x0406u, 0x0308u, 0x0407u), HB_CODEPOINT_ENCODE3 (0x0410u, 0x0306u, 0x04D0u), + HB_CODEPOINT_ENCODE3 (0x0410u, 0x0308u, 0x04D2u), HB_CODEPOINT_ENCODE3 (0x0413u, 0x0301u, 0x0403u), + HB_CODEPOINT_ENCODE3 (0x0415u, 0x0300u, 0x0400u), HB_CODEPOINT_ENCODE3 (0x0415u, 0x0306u, 0x04D6u), + HB_CODEPOINT_ENCODE3 (0x0415u, 0x0308u, 0x0401u), HB_CODEPOINT_ENCODE3 (0x0416u, 0x0306u, 0x04C1u), + HB_CODEPOINT_ENCODE3 (0x0416u, 0x0308u, 0x04DCu), HB_CODEPOINT_ENCODE3 (0x0417u, 0x0308u, 0x04DEu), + HB_CODEPOINT_ENCODE3 (0x0418u, 0x0300u, 0x040Du), HB_CODEPOINT_ENCODE3 (0x0418u, 0x0304u, 0x04E2u), + HB_CODEPOINT_ENCODE3 (0x0418u, 0x0306u, 0x0419u), HB_CODEPOINT_ENCODE3 (0x0418u, 0x0308u, 0x04E4u), + HB_CODEPOINT_ENCODE3 (0x041Au, 0x0301u, 0x040Cu), HB_CODEPOINT_ENCODE3 (0x041Eu, 0x0308u, 0x04E6u), + HB_CODEPOINT_ENCODE3 (0x0423u, 0x0304u, 0x04EEu), HB_CODEPOINT_ENCODE3 (0x0423u, 0x0306u, 0x040Eu), + HB_CODEPOINT_ENCODE3 (0x0423u, 0x0308u, 0x04F0u), HB_CODEPOINT_ENCODE3 (0x0423u, 0x030Bu, 0x04F2u), + HB_CODEPOINT_ENCODE3 (0x0427u, 0x0308u, 0x04F4u), HB_CODEPOINT_ENCODE3 (0x042Bu, 0x0308u, 0x04F8u), + HB_CODEPOINT_ENCODE3 (0x042Du, 0x0308u, 0x04ECu), HB_CODEPOINT_ENCODE3 (0x0430u, 0x0306u, 0x04D1u), + HB_CODEPOINT_ENCODE3 (0x0430u, 0x0308u, 0x04D3u), HB_CODEPOINT_ENCODE3 (0x0433u, 0x0301u, 0x0453u), + HB_CODEPOINT_ENCODE3 (0x0435u, 0x0300u, 0x0450u), HB_CODEPOINT_ENCODE3 (0x0435u, 0x0306u, 0x04D7u), + HB_CODEPOINT_ENCODE3 (0x0435u, 0x0308u, 0x0451u), HB_CODEPOINT_ENCODE3 (0x0436u, 0x0306u, 0x04C2u), + HB_CODEPOINT_ENCODE3 (0x0436u, 0x0308u, 0x04DDu), HB_CODEPOINT_ENCODE3 (0x0437u, 0x0308u, 0x04DFu), + HB_CODEPOINT_ENCODE3 (0x0438u, 0x0300u, 0x045Du), HB_CODEPOINT_ENCODE3 (0x0438u, 0x0304u, 0x04E3u), + HB_CODEPOINT_ENCODE3 (0x0438u, 0x0306u, 0x0439u), HB_CODEPOINT_ENCODE3 (0x0438u, 0x0308u, 0x04E5u), + HB_CODEPOINT_ENCODE3 (0x043Au, 0x0301u, 0x045Cu), HB_CODEPOINT_ENCODE3 (0x043Eu, 0x0308u, 0x04E7u), + HB_CODEPOINT_ENCODE3 (0x0443u, 0x0304u, 0x04EFu), HB_CODEPOINT_ENCODE3 (0x0443u, 0x0306u, 0x045Eu), + HB_CODEPOINT_ENCODE3 (0x0443u, 0x0308u, 0x04F1u), HB_CODEPOINT_ENCODE3 (0x0443u, 0x030Bu, 0x04F3u), + HB_CODEPOINT_ENCODE3 (0x0447u, 0x0308u, 0x04F5u), HB_CODEPOINT_ENCODE3 (0x044Bu, 0x0308u, 0x04F9u), + HB_CODEPOINT_ENCODE3 (0x044Du, 0x0308u, 0x04EDu), HB_CODEPOINT_ENCODE3 (0x0456u, 0x0308u, 0x0457u), + HB_CODEPOINT_ENCODE3 (0x0474u, 0x030Fu, 0x0476u), HB_CODEPOINT_ENCODE3 (0x0475u, 0x030Fu, 0x0477u), + HB_CODEPOINT_ENCODE3 (0x04D8u, 0x0308u, 0x04DAu), HB_CODEPOINT_ENCODE3 (0x04D9u, 0x0308u, 0x04DBu), + HB_CODEPOINT_ENCODE3 (0x04E8u, 0x0308u, 0x04EAu), HB_CODEPOINT_ENCODE3 (0x04E9u, 0x0308u, 0x04EBu), + HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05B8u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D0u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D1u, 0x05BFu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D2u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D3u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D4u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05B9u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D5u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D6u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D8u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05B4u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05D9u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05DAu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05DBu, 0x05BFu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05DCu, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05DEu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E0u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E1u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E3u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E4u, 0x05BFu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E6u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E7u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E8u, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C1u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05E9u, 0x05C2u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x05EAu, 0x05BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x05F2u, 0x05B7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0627u, 0x0653u, 0x0622u), HB_CODEPOINT_ENCODE3 (0x0627u, 0x0654u, 0x0623u), + HB_CODEPOINT_ENCODE3 (0x0627u, 0x0655u, 0x0625u), HB_CODEPOINT_ENCODE3 (0x0648u, 0x0654u, 0x0624u), + HB_CODEPOINT_ENCODE3 (0x064Au, 0x0654u, 0x0626u), HB_CODEPOINT_ENCODE3 (0x06C1u, 0x0654u, 0x06C2u), + HB_CODEPOINT_ENCODE3 (0x06D2u, 0x0654u, 0x06D3u), HB_CODEPOINT_ENCODE3 (0x06D5u, 0x0654u, 0x06C0u), + HB_CODEPOINT_ENCODE3 (0x0915u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0916u, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0917u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x091Cu, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0921u, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0922u, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0928u, 0x093Cu, 0x0929u), HB_CODEPOINT_ENCODE3 (0x092Bu, 0x093Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x092Fu, 0x093Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0930u, 0x093Cu, 0x0931u), + HB_CODEPOINT_ENCODE3 (0x0933u, 0x093Cu, 0x0934u), HB_CODEPOINT_ENCODE3 (0x09A1u, 0x09BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x09A2u, 0x09BCu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x09AFu, 0x09BCu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09BEu, 0x09CBu), HB_CODEPOINT_ENCODE3 (0x09C7u, 0x09D7u, 0x09CCu), + HB_CODEPOINT_ENCODE3 (0x0A16u, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A17u, 0x0A3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0A1Cu, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A2Bu, 0x0A3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0A32u, 0x0A3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0A38u, 0x0A3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0B21u, 0x0B3Cu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0B22u, 0x0B3Cu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B3Eu, 0x0B4Bu), HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B56u, 0x0B48u), + HB_CODEPOINT_ENCODE3 (0x0B47u, 0x0B57u, 0x0B4Cu), HB_CODEPOINT_ENCODE3 (0x0B92u, 0x0BD7u, 0x0B94u), + HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BBEu, 0x0BCAu), HB_CODEPOINT_ENCODE3 (0x0BC6u, 0x0BD7u, 0x0BCCu), + HB_CODEPOINT_ENCODE3 (0x0BC7u, 0x0BBEu, 0x0BCBu), HB_CODEPOINT_ENCODE3 (0x0C46u, 0x0C56u, 0x0C48u), + HB_CODEPOINT_ENCODE3 (0x0CBFu, 0x0CD5u, 0x0CC0u), HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CC2u, 0x0CCAu), + HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD5u, 0x0CC7u), HB_CODEPOINT_ENCODE3 (0x0CC6u, 0x0CD6u, 0x0CC8u), + HB_CODEPOINT_ENCODE3 (0x0CCAu, 0x0CD5u, 0x0CCBu), HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D3Eu, 0x0D4Au), + HB_CODEPOINT_ENCODE3 (0x0D46u, 0x0D57u, 0x0D4Cu), HB_CODEPOINT_ENCODE3 (0x0D47u, 0x0D3Eu, 0x0D4Bu), + HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCAu, 0x0DDAu), HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DCFu, 0x0DDCu), + HB_CODEPOINT_ENCODE3 (0x0DD9u, 0x0DDFu, 0x0DDEu), HB_CODEPOINT_ENCODE3 (0x0DDCu, 0x0DCAu, 0x0DDDu), + HB_CODEPOINT_ENCODE3 (0x0F40u, 0x0FB5u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F42u, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F4Cu, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F51u, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F56u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F5Bu, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F72u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F74u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F71u, 0x0F80u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F90u, 0x0FB5u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0F92u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0F9Cu, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0FA1u, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0FA6u, 0x0FB7u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0FABu, 0x0FB7u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x0FB2u, 0x0F80u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x0FB3u, 0x0F80u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1025u, 0x102Eu, 0x1026u), + HB_CODEPOINT_ENCODE3 (0x1B05u, 0x1B35u, 0x1B06u), HB_CODEPOINT_ENCODE3 (0x1B07u, 0x1B35u, 0x1B08u), + HB_CODEPOINT_ENCODE3 (0x1B09u, 0x1B35u, 0x1B0Au), HB_CODEPOINT_ENCODE3 (0x1B0Bu, 0x1B35u, 0x1B0Cu), + HB_CODEPOINT_ENCODE3 (0x1B0Du, 0x1B35u, 0x1B0Eu), HB_CODEPOINT_ENCODE3 (0x1B11u, 0x1B35u, 0x1B12u), + HB_CODEPOINT_ENCODE3 (0x1B3Au, 0x1B35u, 0x1B3Bu), HB_CODEPOINT_ENCODE3 (0x1B3Cu, 0x1B35u, 0x1B3Du), + HB_CODEPOINT_ENCODE3 (0x1B3Eu, 0x1B35u, 0x1B40u), HB_CODEPOINT_ENCODE3 (0x1B3Fu, 0x1B35u, 0x1B41u), + HB_CODEPOINT_ENCODE3 (0x1B42u, 0x1B35u, 0x1B43u), HB_CODEPOINT_ENCODE3 (0x1E36u, 0x0304u, 0x1E38u), + HB_CODEPOINT_ENCODE3 (0x1E37u, 0x0304u, 0x1E39u), HB_CODEPOINT_ENCODE3 (0x1E5Au, 0x0304u, 0x1E5Cu), + HB_CODEPOINT_ENCODE3 (0x1E5Bu, 0x0304u, 0x1E5Du), HB_CODEPOINT_ENCODE3 (0x1E62u, 0x0307u, 0x1E68u), + HB_CODEPOINT_ENCODE3 (0x1E63u, 0x0307u, 0x1E69u), HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0302u, 0x1EACu), + HB_CODEPOINT_ENCODE3 (0x1EA0u, 0x0306u, 0x1EB6u), HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0302u, 0x1EADu), + HB_CODEPOINT_ENCODE3 (0x1EA1u, 0x0306u, 0x1EB7u), HB_CODEPOINT_ENCODE3 (0x1EB8u, 0x0302u, 0x1EC6u), + HB_CODEPOINT_ENCODE3 (0x1EB9u, 0x0302u, 0x1EC7u), HB_CODEPOINT_ENCODE3 (0x1ECCu, 0x0302u, 0x1ED8u), + HB_CODEPOINT_ENCODE3 (0x1ECDu, 0x0302u, 0x1ED9u), HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0300u, 0x1F02u), + HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0301u, 0x1F04u), HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0342u, 0x1F06u), + HB_CODEPOINT_ENCODE3 (0x1F00u, 0x0345u, 0x1F80u), HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0300u, 0x1F03u), + HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0301u, 0x1F05u), HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0342u, 0x1F07u), + HB_CODEPOINT_ENCODE3 (0x1F01u, 0x0345u, 0x1F81u), HB_CODEPOINT_ENCODE3 (0x1F02u, 0x0345u, 0x1F82u), + HB_CODEPOINT_ENCODE3 (0x1F03u, 0x0345u, 0x1F83u), HB_CODEPOINT_ENCODE3 (0x1F04u, 0x0345u, 0x1F84u), + HB_CODEPOINT_ENCODE3 (0x1F05u, 0x0345u, 0x1F85u), HB_CODEPOINT_ENCODE3 (0x1F06u, 0x0345u, 0x1F86u), + HB_CODEPOINT_ENCODE3 (0x1F07u, 0x0345u, 0x1F87u), HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0300u, 0x1F0Au), + HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0301u, 0x1F0Cu), HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0342u, 0x1F0Eu), + HB_CODEPOINT_ENCODE3 (0x1F08u, 0x0345u, 0x1F88u), HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0300u, 0x1F0Bu), + HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0301u, 0x1F0Du), HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0342u, 0x1F0Fu), + HB_CODEPOINT_ENCODE3 (0x1F09u, 0x0345u, 0x1F89u), HB_CODEPOINT_ENCODE3 (0x1F0Au, 0x0345u, 0x1F8Au), + HB_CODEPOINT_ENCODE3 (0x1F0Bu, 0x0345u, 0x1F8Bu), HB_CODEPOINT_ENCODE3 (0x1F0Cu, 0x0345u, 0x1F8Cu), + HB_CODEPOINT_ENCODE3 (0x1F0Du, 0x0345u, 0x1F8Du), HB_CODEPOINT_ENCODE3 (0x1F0Eu, 0x0345u, 0x1F8Eu), + HB_CODEPOINT_ENCODE3 (0x1F0Fu, 0x0345u, 0x1F8Fu), HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0300u, 0x1F12u), + HB_CODEPOINT_ENCODE3 (0x1F10u, 0x0301u, 0x1F14u), HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0300u, 0x1F13u), + HB_CODEPOINT_ENCODE3 (0x1F11u, 0x0301u, 0x1F15u), HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0300u, 0x1F1Au), + HB_CODEPOINT_ENCODE3 (0x1F18u, 0x0301u, 0x1F1Cu), HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0300u, 0x1F1Bu), + HB_CODEPOINT_ENCODE3 (0x1F19u, 0x0301u, 0x1F1Du), HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0300u, 0x1F22u), + HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0301u, 0x1F24u), HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0342u, 0x1F26u), + HB_CODEPOINT_ENCODE3 (0x1F20u, 0x0345u, 0x1F90u), HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0300u, 0x1F23u), + HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0301u, 0x1F25u), HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0342u, 0x1F27u), + HB_CODEPOINT_ENCODE3 (0x1F21u, 0x0345u, 0x1F91u), HB_CODEPOINT_ENCODE3 (0x1F22u, 0x0345u, 0x1F92u), + HB_CODEPOINT_ENCODE3 (0x1F23u, 0x0345u, 0x1F93u), HB_CODEPOINT_ENCODE3 (0x1F24u, 0x0345u, 0x1F94u), + HB_CODEPOINT_ENCODE3 (0x1F25u, 0x0345u, 0x1F95u), HB_CODEPOINT_ENCODE3 (0x1F26u, 0x0345u, 0x1F96u), + HB_CODEPOINT_ENCODE3 (0x1F27u, 0x0345u, 0x1F97u), HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0300u, 0x1F2Au), + HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0301u, 0x1F2Cu), HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0342u, 0x1F2Eu), + HB_CODEPOINT_ENCODE3 (0x1F28u, 0x0345u, 0x1F98u), HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0300u, 0x1F2Bu), + HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0301u, 0x1F2Du), HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0342u, 0x1F2Fu), + HB_CODEPOINT_ENCODE3 (0x1F29u, 0x0345u, 0x1F99u), HB_CODEPOINT_ENCODE3 (0x1F2Au, 0x0345u, 0x1F9Au), + HB_CODEPOINT_ENCODE3 (0x1F2Bu, 0x0345u, 0x1F9Bu), HB_CODEPOINT_ENCODE3 (0x1F2Cu, 0x0345u, 0x1F9Cu), + HB_CODEPOINT_ENCODE3 (0x1F2Du, 0x0345u, 0x1F9Du), HB_CODEPOINT_ENCODE3 (0x1F2Eu, 0x0345u, 0x1F9Eu), + HB_CODEPOINT_ENCODE3 (0x1F2Fu, 0x0345u, 0x1F9Fu), HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0300u, 0x1F32u), + HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0301u, 0x1F34u), HB_CODEPOINT_ENCODE3 (0x1F30u, 0x0342u, 0x1F36u), + HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0300u, 0x1F33u), HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0301u, 0x1F35u), + HB_CODEPOINT_ENCODE3 (0x1F31u, 0x0342u, 0x1F37u), HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0300u, 0x1F3Au), + HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0301u, 0x1F3Cu), HB_CODEPOINT_ENCODE3 (0x1F38u, 0x0342u, 0x1F3Eu), + HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0300u, 0x1F3Bu), HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0301u, 0x1F3Du), + HB_CODEPOINT_ENCODE3 (0x1F39u, 0x0342u, 0x1F3Fu), HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0300u, 0x1F42u), + HB_CODEPOINT_ENCODE3 (0x1F40u, 0x0301u, 0x1F44u), HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0300u, 0x1F43u), + HB_CODEPOINT_ENCODE3 (0x1F41u, 0x0301u, 0x1F45u), HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0300u, 0x1F4Au), + HB_CODEPOINT_ENCODE3 (0x1F48u, 0x0301u, 0x1F4Cu), HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0300u, 0x1F4Bu), + HB_CODEPOINT_ENCODE3 (0x1F49u, 0x0301u, 0x1F4Du), HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0300u, 0x1F52u), + HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0301u, 0x1F54u), HB_CODEPOINT_ENCODE3 (0x1F50u, 0x0342u, 0x1F56u), + HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0300u, 0x1F53u), HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0301u, 0x1F55u), + HB_CODEPOINT_ENCODE3 (0x1F51u, 0x0342u, 0x1F57u), HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0300u, 0x1F5Bu), + HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0301u, 0x1F5Du), HB_CODEPOINT_ENCODE3 (0x1F59u, 0x0342u, 0x1F5Fu), + HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0300u, 0x1F62u), HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0301u, 0x1F64u), + HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0342u, 0x1F66u), HB_CODEPOINT_ENCODE3 (0x1F60u, 0x0345u, 0x1FA0u), + HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0300u, 0x1F63u), HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0301u, 0x1F65u), + HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0342u, 0x1F67u), HB_CODEPOINT_ENCODE3 (0x1F61u, 0x0345u, 0x1FA1u), + HB_CODEPOINT_ENCODE3 (0x1F62u, 0x0345u, 0x1FA2u), HB_CODEPOINT_ENCODE3 (0x1F63u, 0x0345u, 0x1FA3u), + HB_CODEPOINT_ENCODE3 (0x1F64u, 0x0345u, 0x1FA4u), HB_CODEPOINT_ENCODE3 (0x1F65u, 0x0345u, 0x1FA5u), + HB_CODEPOINT_ENCODE3 (0x1F66u, 0x0345u, 0x1FA6u), HB_CODEPOINT_ENCODE3 (0x1F67u, 0x0345u, 0x1FA7u), + HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0300u, 0x1F6Au), HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0301u, 0x1F6Cu), + HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0342u, 0x1F6Eu), HB_CODEPOINT_ENCODE3 (0x1F68u, 0x0345u, 0x1FA8u), + HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0300u, 0x1F6Bu), HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0301u, 0x1F6Du), + HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0342u, 0x1F6Fu), HB_CODEPOINT_ENCODE3 (0x1F69u, 0x0345u, 0x1FA9u), + HB_CODEPOINT_ENCODE3 (0x1F6Au, 0x0345u, 0x1FAAu), HB_CODEPOINT_ENCODE3 (0x1F6Bu, 0x0345u, 0x1FABu), + HB_CODEPOINT_ENCODE3 (0x1F6Cu, 0x0345u, 0x1FACu), HB_CODEPOINT_ENCODE3 (0x1F6Du, 0x0345u, 0x1FADu), + HB_CODEPOINT_ENCODE3 (0x1F6Eu, 0x0345u, 0x1FAEu), HB_CODEPOINT_ENCODE3 (0x1F6Fu, 0x0345u, 0x1FAFu), + HB_CODEPOINT_ENCODE3 (0x1F70u, 0x0345u, 0x1FB2u), HB_CODEPOINT_ENCODE3 (0x1F74u, 0x0345u, 0x1FC2u), + HB_CODEPOINT_ENCODE3 (0x1F7Cu, 0x0345u, 0x1FF2u), HB_CODEPOINT_ENCODE3 (0x1FB6u, 0x0345u, 0x1FB7u), + HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0300u, 0x1FCDu), HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0301u, 0x1FCEu), + HB_CODEPOINT_ENCODE3 (0x1FBFu, 0x0342u, 0x1FCFu), HB_CODEPOINT_ENCODE3 (0x1FC6u, 0x0345u, 0x1FC7u), + HB_CODEPOINT_ENCODE3 (0x1FF6u, 0x0345u, 0x1FF7u), HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0300u, 0x1FDDu), + HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0301u, 0x1FDEu), HB_CODEPOINT_ENCODE3 (0x1FFEu, 0x0342u, 0x1FDFu), + HB_CODEPOINT_ENCODE3 (0x2190u, 0x0338u, 0x219Au), HB_CODEPOINT_ENCODE3 (0x2192u, 0x0338u, 0x219Bu), + HB_CODEPOINT_ENCODE3 (0x2194u, 0x0338u, 0x21AEu), HB_CODEPOINT_ENCODE3 (0x21D0u, 0x0338u, 0x21CDu), + HB_CODEPOINT_ENCODE3 (0x21D2u, 0x0338u, 0x21CFu), HB_CODEPOINT_ENCODE3 (0x21D4u, 0x0338u, 0x21CEu), + HB_CODEPOINT_ENCODE3 (0x2203u, 0x0338u, 0x2204u), HB_CODEPOINT_ENCODE3 (0x2208u, 0x0338u, 0x2209u), + HB_CODEPOINT_ENCODE3 (0x220Bu, 0x0338u, 0x220Cu), HB_CODEPOINT_ENCODE3 (0x2223u, 0x0338u, 0x2224u), + HB_CODEPOINT_ENCODE3 (0x2225u, 0x0338u, 0x2226u), HB_CODEPOINT_ENCODE3 (0x223Cu, 0x0338u, 0x2241u), + HB_CODEPOINT_ENCODE3 (0x2243u, 0x0338u, 0x2244u), HB_CODEPOINT_ENCODE3 (0x2245u, 0x0338u, 0x2247u), + HB_CODEPOINT_ENCODE3 (0x2248u, 0x0338u, 0x2249u), HB_CODEPOINT_ENCODE3 (0x224Du, 0x0338u, 0x226Du), + HB_CODEPOINT_ENCODE3 (0x2261u, 0x0338u, 0x2262u), HB_CODEPOINT_ENCODE3 (0x2264u, 0x0338u, 0x2270u), + HB_CODEPOINT_ENCODE3 (0x2265u, 0x0338u, 0x2271u), HB_CODEPOINT_ENCODE3 (0x2272u, 0x0338u, 0x2274u), + HB_CODEPOINT_ENCODE3 (0x2273u, 0x0338u, 0x2275u), HB_CODEPOINT_ENCODE3 (0x2276u, 0x0338u, 0x2278u), + HB_CODEPOINT_ENCODE3 (0x2277u, 0x0338u, 0x2279u), HB_CODEPOINT_ENCODE3 (0x227Au, 0x0338u, 0x2280u), + HB_CODEPOINT_ENCODE3 (0x227Bu, 0x0338u, 0x2281u), HB_CODEPOINT_ENCODE3 (0x227Cu, 0x0338u, 0x22E0u), + HB_CODEPOINT_ENCODE3 (0x227Du, 0x0338u, 0x22E1u), HB_CODEPOINT_ENCODE3 (0x2282u, 0x0338u, 0x2284u), + HB_CODEPOINT_ENCODE3 (0x2283u, 0x0338u, 0x2285u), HB_CODEPOINT_ENCODE3 (0x2286u, 0x0338u, 0x2288u), + HB_CODEPOINT_ENCODE3 (0x2287u, 0x0338u, 0x2289u), HB_CODEPOINT_ENCODE3 (0x2291u, 0x0338u, 0x22E2u), + HB_CODEPOINT_ENCODE3 (0x2292u, 0x0338u, 0x22E3u), HB_CODEPOINT_ENCODE3 (0x22A2u, 0x0338u, 0x22ACu), + HB_CODEPOINT_ENCODE3 (0x22A8u, 0x0338u, 0x22ADu), HB_CODEPOINT_ENCODE3 (0x22A9u, 0x0338u, 0x22AEu), + HB_CODEPOINT_ENCODE3 (0x22ABu, 0x0338u, 0x22AFu), HB_CODEPOINT_ENCODE3 (0x22B2u, 0x0338u, 0x22EAu), + HB_CODEPOINT_ENCODE3 (0x22B3u, 0x0338u, 0x22EBu), HB_CODEPOINT_ENCODE3 (0x22B4u, 0x0338u, 0x22ECu), + HB_CODEPOINT_ENCODE3 (0x22B5u, 0x0338u, 0x22EDu), HB_CODEPOINT_ENCODE3 (0x2ADDu, 0x0338u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x3046u, 0x3099u, 0x3094u), HB_CODEPOINT_ENCODE3 (0x304Bu, 0x3099u, 0x304Cu), + HB_CODEPOINT_ENCODE3 (0x304Du, 0x3099u, 0x304Eu), HB_CODEPOINT_ENCODE3 (0x304Fu, 0x3099u, 0x3050u), + HB_CODEPOINT_ENCODE3 (0x3051u, 0x3099u, 0x3052u), HB_CODEPOINT_ENCODE3 (0x3053u, 0x3099u, 0x3054u), + HB_CODEPOINT_ENCODE3 (0x3055u, 0x3099u, 0x3056u), HB_CODEPOINT_ENCODE3 (0x3057u, 0x3099u, 0x3058u), + HB_CODEPOINT_ENCODE3 (0x3059u, 0x3099u, 0x305Au), HB_CODEPOINT_ENCODE3 (0x305Bu, 0x3099u, 0x305Cu), + HB_CODEPOINT_ENCODE3 (0x305Du, 0x3099u, 0x305Eu), HB_CODEPOINT_ENCODE3 (0x305Fu, 0x3099u, 0x3060u), + HB_CODEPOINT_ENCODE3 (0x3061u, 0x3099u, 0x3062u), HB_CODEPOINT_ENCODE3 (0x3064u, 0x3099u, 0x3065u), + HB_CODEPOINT_ENCODE3 (0x3066u, 0x3099u, 0x3067u), HB_CODEPOINT_ENCODE3 (0x3068u, 0x3099u, 0x3069u), + HB_CODEPOINT_ENCODE3 (0x306Fu, 0x3099u, 0x3070u), HB_CODEPOINT_ENCODE3 (0x306Fu, 0x309Au, 0x3071u), + HB_CODEPOINT_ENCODE3 (0x3072u, 0x3099u, 0x3073u), HB_CODEPOINT_ENCODE3 (0x3072u, 0x309Au, 0x3074u), + HB_CODEPOINT_ENCODE3 (0x3075u, 0x3099u, 0x3076u), HB_CODEPOINT_ENCODE3 (0x3075u, 0x309Au, 0x3077u), + HB_CODEPOINT_ENCODE3 (0x3078u, 0x3099u, 0x3079u), HB_CODEPOINT_ENCODE3 (0x3078u, 0x309Au, 0x307Au), + HB_CODEPOINT_ENCODE3 (0x307Bu, 0x3099u, 0x307Cu), HB_CODEPOINT_ENCODE3 (0x307Bu, 0x309Au, 0x307Du), + HB_CODEPOINT_ENCODE3 (0x309Du, 0x3099u, 0x309Eu), HB_CODEPOINT_ENCODE3 (0x30A6u, 0x3099u, 0x30F4u), + HB_CODEPOINT_ENCODE3 (0x30ABu, 0x3099u, 0x30ACu), HB_CODEPOINT_ENCODE3 (0x30ADu, 0x3099u, 0x30AEu), + HB_CODEPOINT_ENCODE3 (0x30AFu, 0x3099u, 0x30B0u), HB_CODEPOINT_ENCODE3 (0x30B1u, 0x3099u, 0x30B2u), + HB_CODEPOINT_ENCODE3 (0x30B3u, 0x3099u, 0x30B4u), HB_CODEPOINT_ENCODE3 (0x30B5u, 0x3099u, 0x30B6u), + HB_CODEPOINT_ENCODE3 (0x30B7u, 0x3099u, 0x30B8u), HB_CODEPOINT_ENCODE3 (0x30B9u, 0x3099u, 0x30BAu), + HB_CODEPOINT_ENCODE3 (0x30BBu, 0x3099u, 0x30BCu), HB_CODEPOINT_ENCODE3 (0x30BDu, 0x3099u, 0x30BEu), + HB_CODEPOINT_ENCODE3 (0x30BFu, 0x3099u, 0x30C0u), HB_CODEPOINT_ENCODE3 (0x30C1u, 0x3099u, 0x30C2u), + HB_CODEPOINT_ENCODE3 (0x30C4u, 0x3099u, 0x30C5u), HB_CODEPOINT_ENCODE3 (0x30C6u, 0x3099u, 0x30C7u), + HB_CODEPOINT_ENCODE3 (0x30C8u, 0x3099u, 0x30C9u), HB_CODEPOINT_ENCODE3 (0x30CFu, 0x3099u, 0x30D0u), + HB_CODEPOINT_ENCODE3 (0x30CFu, 0x309Au, 0x30D1u), HB_CODEPOINT_ENCODE3 (0x30D2u, 0x3099u, 0x30D3u), + HB_CODEPOINT_ENCODE3 (0x30D2u, 0x309Au, 0x30D4u), HB_CODEPOINT_ENCODE3 (0x30D5u, 0x3099u, 0x30D6u), + HB_CODEPOINT_ENCODE3 (0x30D5u, 0x309Au, 0x30D7u), HB_CODEPOINT_ENCODE3 (0x30D8u, 0x3099u, 0x30D9u), + HB_CODEPOINT_ENCODE3 (0x30D8u, 0x309Au, 0x30DAu), HB_CODEPOINT_ENCODE3 (0x30DBu, 0x3099u, 0x30DCu), + HB_CODEPOINT_ENCODE3 (0x30DBu, 0x309Au, 0x30DDu), HB_CODEPOINT_ENCODE3 (0x30EFu, 0x3099u, 0x30F7u), + HB_CODEPOINT_ENCODE3 (0x30F0u, 0x3099u, 0x30F8u), HB_CODEPOINT_ENCODE3 (0x30F1u, 0x3099u, 0x30F9u), + HB_CODEPOINT_ENCODE3 (0x30F2u, 0x3099u, 0x30FAu), HB_CODEPOINT_ENCODE3 (0x30FDu, 0x3099u, 0x30FEu), + HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C1u, 0x0000u), HB_CODEPOINT_ENCODE3 (0xFB49u, 0x05C2u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x11099u, 0x110BAu, 0x1109Au),HB_CODEPOINT_ENCODE3 (0x1109Bu, 0x110BAu, 0x1109Cu), + HB_CODEPOINT_ENCODE3 (0x110A5u, 0x110BAu, 0x110ABu),HB_CODEPOINT_ENCODE3 (0x11131u, 0x11127u, 0x1112Eu), + HB_CODEPOINT_ENCODE3 (0x11132u, 0x11127u, 0x1112Fu),HB_CODEPOINT_ENCODE3 (0x11347u, 0x1133Eu, 0x1134Bu), + HB_CODEPOINT_ENCODE3 (0x11347u, 0x11357u, 0x1134Cu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114B0u, 0x114BCu), + HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BAu, 0x114BBu),HB_CODEPOINT_ENCODE3 (0x114B9u, 0x114BDu, 0x114BEu), + HB_CODEPOINT_ENCODE3 (0x115B8u, 0x115AFu, 0x115BAu),HB_CODEPOINT_ENCODE3 (0x115B9u, 0x115AFu, 0x115BBu), + HB_CODEPOINT_ENCODE3 (0x1D157u, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D158u, 0x1D165u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Eu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D16Fu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D170u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D171u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D15Fu, 0x1D172u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1B9u, 0x1D165u, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D1BAu, 0x1D165u, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Eu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D1BBu, 0x1D16Fu, 0x0000u), HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Eu, 0x0000u), + HB_CODEPOINT_ENCODE3 (0x1D1BCu, 0x1D16Fu, 0x0000u), +}; + +#ifndef HB_OPTIMIZE_SIZE + +static const uint8_t +_hb_ucd_u8[31814] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 28, + 29, 26, 30, 31, 32, 33, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 26, 57, 58, 59, 59, 59, 59, 59, 26, 26, 60, 59, 59, 59, 59, 59, + 59, 59, 26, 61, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 26, 62, 59, 63, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 64, 26, 65, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 66, 67, 59, 59, 59, 59, 68, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 69, 70, 71, 72, 73, 74, 59, 59, + 75, 76, 59, 59, 77, 59, 78, 79, 80, 81, 73, 82, 83, 84, 59, 59, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 85, 26, 26, 26, 26, 26, 26, 26, 86, 87, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 88, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 89, 59, 59, 59, 59, 59, 59, 26, 90, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 91, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 92, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 93, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 25, 25, 25, 21, + 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 21, 18, 24, 16, + 24, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 29, 21, 23, 23, 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, + 26, 25, 15, 15, 24, 5, 21, 21, 24, 15, 7, 19, 15, 15, 15, 21, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 25, 9, 9, 9, 9, 9, 9, 9, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, + 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 9, 5, 5, + 5, 9, 9, 5, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 9, 9, + 9, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 5, 9, 9, 5, 9, + 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 5, 9, 5, 9, 9, + 5, 9, 9, 9, 5, 9, 5, 9, 9, 5, 5, 7, 9, 5, 5, 5, + 7, 7, 7, 7, 9, 8, 5, 9, 8, 5, 9, 8, 5, 9, 5, 9, + 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, + 5, 9, 8, 5, 9, 5, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 9, 9, 5, 9, 9, 5, + 5, 9, 5, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 6, 6, 6, 6, 6, 24, 24, 24, 24, 24, 24, 24, 6, 24, 6, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 9, 5, 9, 5, 6, 24, 9, 5, 2, 2, 6, 5, 5, 5, 21, 9, + 2, 2, 2, 2, 24, 24, 9, 21, 9, 9, 9, 2, 9, 2, 9, 9, + 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, + 5, 5, 9, 9, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 5, 5, 5, 5, 9, 5, 25, 9, 5, 9, 9, 5, 5, 9, 9, 9, + 9, 5, 26, 12, 12, 12, 12, 12, 11, 11, 9, 5, 9, 5, 9, 5, + 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, + 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 2, 2, 6, 21, 21, 21, 21, 21, 21, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 17, 2, 2, 26, 26, 23, + 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 17, 12, + 21, 12, 12, 21, 12, 12, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, + 7, 7, 7, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 25, 25, 25, 21, 21, 23, 21, 21, 26, 26, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 1, 2, 21, 21, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 7, 7, + 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 21, 7, 12, 12, 12, 12, 12, 12, 12, 1, 26, 12, + 12, 12, 12, 12, 12, 6, 6, 12, 12, 26, 12, 12, 12, 12, 7, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 26, 26, 7, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 1, + 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 6, 6, 26, 21, 21, 21, 6, 2, 2, 12, 23, 23, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 6, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 6, 12, 12, 12, 6, 12, 12, 12, 12, 12, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 2, 2, 21, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, + 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 10, 10, + 7, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 12, 12, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 21, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, + 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, + 7, 2, 7, 2, 2, 2, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 7, 2, + 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 7, 7, 2, 7, + 7, 7, 12, 12, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 7, 7, 23, 23, 15, 15, 15, 15, 15, 15, 26, 23, 7, 21, 12, 2, + 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, + 7, 2, 7, 7, 2, 7, 7, 2, 7, 7, 2, 2, 12, 2, 10, 10, + 10, 12, 12, 2, 2, 2, 2, 12, 12, 2, 2, 12, 12, 12, 2, 2, + 2, 12, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 2, 7, 2, + 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 12, 12, 7, 7, 7, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, + 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 12, 2, 12, 12, 10, 2, 10, 10, 12, 2, 2, + 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 21, 23, 2, 2, 2, 2, 2, 2, 2, 7, 12, 12, 12, 12, 12, 12, + 2, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, + 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12, + 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 2, 2, + 2, 2, 2, 2, 2, 2, 12, 10, 2, 2, 2, 2, 7, 7, 2, 7, + 26, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 12, 7, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7, + 7, 2, 7, 7, 7, 7, 2, 2, 2, 7, 7, 2, 7, 2, 7, 7, + 2, 2, 2, 7, 7, 2, 2, 2, 7, 7, 7, 2, 2, 2, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 10, 10, + 12, 10, 10, 2, 2, 2, 10, 10, 10, 2, 10, 10, 10, 12, 2, 2, + 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 26, 26, 26, 26, 26, 26, 23, 26, 2, 2, 2, 2, 2, + 12, 10, 10, 10, 12, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 12, 12, + 12, 10, 10, 10, 10, 2, 12, 12, 12, 2, 12, 12, 12, 12, 2, 2, + 2, 2, 2, 2, 2, 12, 12, 2, 7, 7, 7, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 15, 15, 15, 15, 15, 15, 15, 26, + 7, 12, 10, 10, 21, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12, + 10, 10, 10, 10, 10, 2, 12, 10, 10, 2, 10, 10, 12, 12, 2, 2, + 2, 2, 2, 2, 2, 10, 10, 2, 2, 2, 2, 2, 2, 2, 7, 2, + 2, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 7, 10, 10, + 10, 12, 12, 12, 12, 2, 10, 10, 10, 2, 10, 10, 10, 12, 7, 26, + 2, 2, 2, 2, 7, 7, 7, 10, 15, 15, 15, 15, 15, 15, 15, 7, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 7, 7, 7, 7, 7, 7, + 2, 2, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 12, 2, 2, 2, 2, 10, + 10, 10, 12, 12, 12, 2, 12, 2, 10, 10, 10, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 23, + 7, 7, 7, 7, 7, 7, 6, 12, 12, 12, 12, 12, 12, 12, 12, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 2, 2, 2, 2, + 2, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, + 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 2, 2, + 7, 7, 7, 7, 7, 2, 6, 2, 12, 12, 12, 12, 12, 12, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 7, 7, 7, 7, + 7, 26, 26, 26, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 26, 21, 26, 26, 26, 12, 12, 26, 26, 26, 26, 26, 26, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 26, 12, 26, 12, 26, 12, 22, 18, 22, 18, 10, 10, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, + 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, + 12, 12, 12, 12, 12, 21, 12, 12, 7, 7, 7, 7, 7, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 26, 26, + 26, 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 2, 26, 26, + 21, 21, 21, 21, 21, 26, 26, 26, 26, 21, 21, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 12, + 12, 10, 12, 12, 12, 12, 12, 12, 10, 12, 12, 10, 10, 12, 12, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21, 21, + 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 7, 7, 7, 7, 12, 12, + 12, 7, 10, 10, 10, 7, 7, 10, 10, 10, 10, 10, 10, 10, 7, 7, + 7, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 12, 10, 10, 12, 12, 10, 10, 10, 10, 10, 10, 12, 7, 10, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 12, 26, 26, + 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 2, 2, 9, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 6, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 2, + 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 2, + 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 2, 2, 5, 5, 5, 5, 5, 5, 2, 2, + 17, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 26, 21, 7, + 29, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 22, 18, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 21, 21, 14, 14, + 14, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, + 7, 7, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 12, 12, 12, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 2, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 10, 10, + 10, 10, 10, 10, 10, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 21, 21, 21, 6, 21, 21, 21, 23, 7, 12, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, + 21, 21, 21, 21, 21, 21, 17, 21, 21, 21, 21, 12, 12, 12, 1, 2, + 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 7, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, + 12, 12, 12, 10, 10, 10, 10, 12, 12, 10, 10, 10, 2, 2, 2, 2, + 10, 10, 12, 10, 10, 10, 10, 10, 10, 12, 12, 12, 2, 2, 2, 2, + 26, 2, 2, 2, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, + 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 2, 2, 2, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 7, 7, 7, 7, 7, 7, 7, 12, 12, 10, 10, 12, 2, 2, 21, 21, + 7, 7, 7, 7, 7, 10, 12, 10, 12, 12, 12, 12, 12, 12, 12, 2, + 12, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12, + 21, 21, 21, 21, 21, 21, 21, 6, 21, 21, 21, 21, 21, 21, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 2, + 12, 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 12, 10, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, + 10, 10, 12, 10, 10, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, + 21, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, + 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 12, 12, 12, 7, 7, + 7, 7, 7, 7, 7, 7, 12, 10, 12, 12, 10, 10, 10, 12, 10, 12, + 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, + 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12, + 12, 12, 12, 12, 10, 10, 12, 12, 2, 2, 2, 21, 21, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 21, 21, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 10, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 12, 7, 7, + 7, 7, 7, 7, 12, 7, 7, 10, 12, 12, 7, 2, 2, 2, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, + 9, 5, 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, + 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 2, 9, 2, 9, 2, 9, 2, 9, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, + 5, 5, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 5, 24, + 24, 24, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 24, + 5, 5, 5, 5, 2, 2, 5, 5, 9, 9, 9, 9, 2, 24, 24, 24, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 24, 24, 24, + 2, 2, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 2, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 1, 1, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 21, 21, 20, 19, 22, 20, 20, 19, 22, 20, + 21, 21, 21, 21, 21, 21, 21, 21, 27, 28, 1, 1, 1, 1, 1, 29, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 21, 21, 21, 21, 16, + 16, 21, 21, 21, 25, 22, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 25, 21, 16, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 29, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 15, 6, 2, 2, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 6, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 2, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, + 11, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 9, 26, 26, 26, 26, 9, 26, 26, 5, 9, 9, 9, 5, 5, + 9, 9, 9, 5, 26, 9, 26, 26, 25, 9, 9, 9, 9, 9, 26, 26, + 26, 26, 26, 26, 9, 26, 9, 26, 9, 26, 9, 9, 9, 9, 26, 5, + 9, 9, 9, 9, 5, 7, 7, 7, 7, 5, 26, 26, 5, 5, 9, 9, + 25, 25, 25, 25, 25, 9, 5, 5, 5, 5, 26, 25, 26, 26, 5, 26, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 9, 5, 14, 14, 14, 14, 15, 26, 26, 2, 2, 2, 2, + 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 25, 25, 26, 26, 26, 26, + 25, 26, 26, 25, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 25, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, + 26, 26, 25, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 26, 26, 26, 26, + 25, 25, 26, 26, 26, 26, 26, 26, 26, 22, 18, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, + 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15, + 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18, + 22, 18, 22, 18, 22, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 25, 25, 25, 25, 25, 22, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, + 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, + 18, 22, 18, 22, 18, 22, 18, 22, 18, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 25, 25, + 25, 25, 25, 25, 25, 26, 26, 25, 25, 25, 25, 25, 25, 26, 26, 26, + 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 9, 5, 9, 9, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9, + 9, 5, 9, 5, 5, 9, 5, 5, 5, 5, 5, 5, 6, 6, 9, 9, + 9, 5, 9, 5, 5, 26, 26, 26, 26, 26, 26, 9, 5, 9, 5, 12, + 12, 12, 9, 5, 2, 2, 2, 2, 2, 21, 21, 21, 21, 15, 21, 21, + 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 6, + 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 2, + 21, 21, 20, 19, 20, 19, 21, 21, 21, 20, 19, 21, 20, 19, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 17, 21, 21, 17, 21, 20, 19, 21, 21, + 20, 19, 22, 18, 22, 18, 22, 18, 22, 18, 21, 21, 21, 21, 21, 6, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 17, 17, 21, 21, 21, 21, + 17, 21, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, + 29, 21, 21, 21, 26, 6, 7, 14, 22, 18, 22, 18, 22, 18, 22, 18, + 22, 18, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18, 17, 22, 18, 18, + 26, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, + 17, 6, 6, 6, 6, 6, 26, 26, 14, 14, 14, 6, 7, 21, 26, 26, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 24, 24, 6, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 6, 6, 6, 7, + 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 26, 26, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15, 15, 15, + 26, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 2, 2, 2, 2, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 7, 12, + 11, 11, 11, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 6, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 6, 6, 12, 12, + 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 12, 12, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, + 24, 24, 24, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 24, 24, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 9, 5, 9, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 6, 24, 24, 9, 5, 9, 5, 7, + 9, 5, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9, 9, 9, 5, + 9, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, + 2, 2, 9, 5, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 7, 6, 6, 5, 7, 7, 7, 7, 7, + 7, 7, 12, 7, 7, 7, 12, 7, 7, 7, 7, 12, 7, 7, 7, 7, + 7, 7, 7, 10, 10, 12, 12, 10, 26, 26, 26, 26, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 26, 26, 23, 26, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, + 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, + 12, 12, 7, 7, 7, 7, 7, 7, 21, 21, 21, 7, 21, 7, 7, 12, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 21, 21, + 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 7, 7, 7, 12, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 10, + 10, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 6, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 21, 21, + 7, 7, 7, 7, 7, 12, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 10, + 10, 12, 12, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 21, 21, 21, 21, + 6, 7, 7, 7, 7, 7, 7, 26, 26, 26, 7, 10, 12, 10, 7, 7, + 12, 7, 12, 12, 12, 7, 7, 12, 12, 7, 7, 7, 7, 7, 12, 12, + 7, 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 6, 21, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 12, 12, 10, 10, + 21, 21, 7, 6, 6, 10, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 2, + 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 6, 6, 6, 6, + 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 10, 10, 12, 10, 10, 12, 10, 10, 21, 10, 12, 2, 2, + 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 7, 12, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 2, + 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 22, + 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 23, 26, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 22, 18, 21, 2, 2, 2, 2, 2, 2, + 21, 17, 17, 16, 16, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, + 18, 22, 18, 22, 18, 21, 21, 22, 18, 21, 21, 21, 21, 16, 16, 16, + 21, 21, 21, 2, 21, 21, 21, 21, 17, 22, 18, 22, 18, 22, 18, 21, + 21, 21, 25, 17, 25, 25, 25, 2, 21, 23, 21, 21, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 1, + 2, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 22, + 18, 21, 22, 18, 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, + 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 2, 2, 2, + 23, 23, 25, 24, 26, 23, 23, 2, 26, 25, 25, 25, 25, 26, 26, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 26, 26, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, + 21, 21, 21, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 14, 14, 14, 14, 14, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 26, 26, 26, 2, + 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 2, 2, + 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, + 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, + 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 14, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 21, + 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, + 21, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, + 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 7, 7, 7, 7, 7, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 2, 2, 7, 2, 2, 7, + 7, 7, 7, 7, 7, 7, 2, 21, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 7, 7, 7, 26, 26, 15, 15, 15, 15, 15, 15, 15, + 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 2, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 15, 15, 7, 7, + 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 12, 12, 12, 2, 12, 12, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 7, 7, 7, 7, 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12, 2, 2, 2, 2, 12, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 21, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, + 7, 7, 7, 7, 7, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 12, 12, 2, 2, 2, 2, 15, 15, 15, 15, 15, + 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 2, 2, 2, 21, 21, 21, 21, 21, 21, 21, + 7, 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, + 7, 7, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, + 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, + 7, 7, 7, 7, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, + 15, 15, 15, 15, 15, 15, 15, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 15, 15, 15, 15, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, + 10, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 21, 21, 2, 2, + 15, 15, 15, 15, 15, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, + 10, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 21, 21, 1, 21, 21, + 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, + 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 10, 12, 12, 12, + 12, 12, 12, 12, 12, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 21, 21, 21, 21, 7, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 12, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, + 10, 7, 7, 7, 7, 21, 21, 21, 21, 12, 12, 12, 12, 21, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 21, 7, 21, 21, 21, + 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 12, + 12, 12, 10, 10, 12, 10, 12, 12, 21, 21, 21, 21, 21, 21, 12, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, + 12, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, + 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 12, 12, 7, 10, 10, + 12, 10, 10, 10, 10, 2, 2, 10, 10, 2, 2, 10, 10, 10, 2, 2, + 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 7, 7, 7, + 7, 7, 10, 10, 2, 2, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, + 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, + 10, 10, 12, 12, 12, 10, 12, 7, 7, 7, 7, 21, 21, 21, 21, 21, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 21, 2, 21, 12, 7, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, 10, 12, + 12, 10, 12, 12, 7, 7, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 12, 12, 12, 12, 2, 2, 10, 10, 10, 10, 12, 12, 10, 12, + 12, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 7, 7, 7, 7, 12, 12, 2, 2, + 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 12, 10, 12, + 12, 21, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 10, 10, + 12, 12, 12, 12, 12, 12, 10, 12, 7, 2, 2, 2, 2, 2, 2, 2, + 10, 10, 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 21, 21, 21, 26, + 12, 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 2, 2, 2, 2, + 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, + 7, 10, 10, 10, 12, 12, 12, 12, 2, 2, 12, 12, 10, 10, 10, 10, + 12, 7, 21, 7, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7, + 7, 7, 7, 12, 12, 12, 12, 12, 12, 10, 7, 12, 12, 12, 12, 21, + 21, 21, 21, 21, 21, 21, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 12, 12, 12, 12, 12, 12, 10, 10, 12, 12, 12, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 21, 21, 7, 21, 21, + 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 10, 12, + 7, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 2, 10, 12, 12, 12, 12, 12, 12, + 12, 10, 12, 12, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, + 7, 12, 12, 12, 12, 12, 12, 2, 2, 2, 12, 2, 12, 12, 2, 12, + 12, 12, 12, 12, 12, 12, 7, 12, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 2, + 12, 12, 2, 10, 10, 12, 10, 12, 7, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 12, 12, 10, 10, 21, 21, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 23, 23, 23, + 23, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, + 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 26, 26, 26, 26, + 6, 6, 6, 6, 21, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 15, 15, 15, 15, 15, + 15, 15, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 7, 7, 7, + 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 12, + 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 12, + 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 21, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 26, 12, 12, 21, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 10, 10, 12, 12, 12, 26, 26, 26, 10, 10, 10, + 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, + 12, 12, 12, 26, 26, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 12, 12, 12, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, + 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 2, 9, 9, + 2, 2, 9, 2, 2, 9, 9, 2, 2, 9, 9, 9, 9, 2, 9, 9, + 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 2, 5, 2, 5, 5, 5, + 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9, + 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 2, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2, + 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 9, 9, 9, 9, 9, 9, + 9, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, + 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, + 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 5, 2, 2, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, + 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 12, 26, 26, 21, 21, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12, + 12, 12, 2, 12, 12, 2, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, + 12, 12, 12, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 2, 2, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 7, 26, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 23, + 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 5, 5, 5, 5, 12, 12, 12, 12, 12, 12, 12, 6, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, 15, 15, + 23, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, + 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2, 7, 2, 2, 2, 2, + 2, 2, 7, 2, 2, 2, 2, 7, 2, 7, 2, 7, 2, 7, 7, 7, + 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7, + 2, 7, 7, 2, 7, 2, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7, + 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, + 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, + 25, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24, + 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 26, 26, 26, + 26, 26, 2, 26, 26, 26, 26, 2, 2, 2, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 2, 2, 2, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, + 26, 26, 26, 26, 2, 2, 2, 2, 26, 26, 26, 2, 2, 2, 2, 2, + 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, + 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 0, 0, 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, + 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 0, + 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, 37, 0, 0, 38, 0, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 0, 51, 52, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 56, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 54, 59, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, + 0, 16, 0, 0, 0, 0, 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, + 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 0, 0, 0, 30, 31, 32, + 0, 0, 0, 0, 0, 30, 31, 0, 0, 33, 0, 0, 0, 30, 31, 0, + 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 30, 31, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 31, 34, + 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 35, 31, 0, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 37, 38, 0, + 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 41, 0, 42, 0, 0, + 0, 43, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, + 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 57, 49, 0, + 58, 59, 0, 0, 60, 0, 0, 0, 61, 62, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 68, 1, 69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70, 71, 72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, + 0, 75, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 76, 0, 0, 0, + 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 78, 0, 79, 0, 0, 0, 0, 0, 74, 80, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 1, 74, 0, 0, 81, 0, 0, 82, + 0, 0, 0, 0, 0, 83, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 84, 85, 0, 0, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 86, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, + 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 91, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 88, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, + 0, 75, 0, 0, 0, 95, 0, 0, 0, 0, 96, 0, 0, 97, 0, 0, + 0, 83, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0,101, 31, 0, + 102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 33, + 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75,106, 0, 0, 0, 0, 0, 0, 75, 0, 0, + 0, 0, 0, 0, 0,107, 0, 0, 0, 0, 0, 0,108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 49,109, 0, + 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111, 0, + 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0,113, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 115,116,117, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,121,122, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 0, 0, 0,125, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, + 230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,232, + 220,220,220,220,232,216,220,220,220,220,220,202,202,220,220,220, + 220,202,202,220,220,220,220,220,220,220,220,220,220,220, 1, 1, + 1, 1, 1,220,220,220,220,230,230,230,230,230,230,230,230,240, + 230,220,220,220,230,230,230,220,220, 0,230,230,230,220,220,220, + 220,230,232,220,220,230,233,234,234,233,234,234,233,230,230,230, + 230,230,230,230,230,230,230,230,230,230, 0, 0, 0,230,230,230, + 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,230,230,230,230, + 220,230,230,230,222,220,230,230,230,230,230,230,220,220,220,220, + 220,220,230,230,220,230,230,222,228,230, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0,230,220, + 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, + 230,230, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220, + 220,230,230,230,230,230,220,230,230,220, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230,230,230,230, 0, 0,230,230,230,230,220,230, 0, + 0,230,230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,220,230,230,220,230, + 230,220,220,220,230,220,220,230,220,230,230,230,220,230,220,230, + 220,230,220,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,230,230,230,230,230,230,230,220,230, 0, 0, + 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230, 0,230,230,230,230,230,230,230,230,230, 0,230, + 230,230, 0,230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,220,220,220, 0, 0, 0, 0, 0, 0, 0,220,230,230, + 230,230,230,230,230,230,230,230,230,230,230,230, 0,220,230,230, + 220,230,230,220,230,230,230,220,220,220, 27, 28, 29,230,230,230, + 220,230,230,220,220,230,230,230,230,230, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 84, + 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,103,103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,107,107,107,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,118,118, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,122,122,122,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,220,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, + 0,220, 0,216, 0, 0, 0, 0, 0, 0, 0,129,130, 0,132, 0, + 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, 9, 0, + 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,222,230,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,230,220, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, + 230,230,230,230,230,230,230, 0, 0,220,230,230,230,230,230,220, + 220,220,220,220,220,230,230,220, 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,230,220,230,230,230,230,230,230,230, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 1,220, + 220,220,220,220,230,230,220,220,220,220,230, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0,220, 0, 0, 0, 0, 0, 0,230, 0, + 0, 0,230,230, 0, 0, 0, 0, 0, 0,230,230,220,230,230,230, + 230,230,230,230,220,230,230,234,214,220,202,230,230,230,230,230, + 230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230, + 232,228,228,220, 0,230,233,220,230,220,230,230, 1, 1,230,230, + 230,230, 1, 1, 1,230,230, 0, 0, 0, 0,230, 0, 0, 0, 1, + 1,230,220,230, 1, 1,220,220,220,220,230, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,218,228,232,222,224,224, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230, + 230,230,230,230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,230,230, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,220,220,220, 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230, 0,230,230,220, 0, + 0,230,230, 0, 0, 0, 0, 0,230,230, 0,230, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0,230,230,230,230,230,230, + 230,220,220,220,220,220,220,220,230,230,220, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,220, 0,230, 0, 0, 0, 0, 0, 0, + 0, 0,230, 1,220, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,230, + 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230, + 230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 220,220,230,230,230,220,230,220,220,220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 7, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230,230,230,230,230,230,230, 0, 0, 0,230,230,230,230,230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, + 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,216, + 216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, 0, 0, + 0, 0, 0, 0, 0,220,220,220,220,220,220,220,220, 0, 0,230, + 230,230,230,230,220,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,230,230,230,230, 0, 0, 0, 0,230,230,230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, + 230, 0,230,230,230,230,230,230,230,230,230,230,230,230,230,230, + 230,230,230, 0, 0,230,230,230,230,230,230,230, 0,230,230, 0, + 230,230,230,230,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,230,230,230,230,220,220,220,220,220,220, + 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230, + 230,230,230,230, 7, 0, 0, 0, 0, 0, 16, 17, 17, 17, 17, 17, + 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169, + 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, + 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, + 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, + 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, + 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, + 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 21, 32, 4, 0, 10, + 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, + 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, + 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 21, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, + 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, + 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 1, 20, + 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, + 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, 19, 20, + 21, 22, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 28, 28, 29, 30, 31, 32, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 35, 35, 35, + 35, 35, 59, 59, 60, 35, 35, 35, 35, 35, 35, 35, 61, 62, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 63, 64, + 35, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 66, 68, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 69, 70, 35, 35, 35, 35, 71, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 72, 73, 74, 75, 76, 77, 35, 35, 78, 79, 35, 35, 80, 35, + 81, 82, 83, 84, 17, 85, 86, 87, 35, 35, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 88, 25, 25, + 25, 25, 25, 25, 25, 89, 90, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 91, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 92, + 35, 35, 35, 35, 35, 35, 25, 93, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 94, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, + 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, + 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 0, 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, + 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 3, 0, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, + 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, + 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, + 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, + 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, + 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 11, 11, 2, + 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, + 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, + 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, + 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, + 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, + 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, + 2, 2, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 22, + 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, + 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, + 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 22, 2, 2, 2, + 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, + 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, + 2, 23, 23, 2, 23, 23, 23, 2, 2, 2, 2, 2, 23, 23, 23, 23, + 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, + 2, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 2, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 20, 20, 20, + 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, + 36, 2, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, 2, + 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 36, 36, + 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, + 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 2, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, + 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, + 30, 30, 30, 2, 30, 2, 30, 30, 30, 30, 2, 2, 30, 2, 30, 30, + 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 2, 30, 30, + 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 2, 2, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 45, 45, 45, 45, 45, 45, + 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, + 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, + 28, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, + 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 2, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 2, 2, 8, 8, 8, 76, 76, 76, 76, + 76, 76, 76, 76, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, + 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, + 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 9, 9, 9, 9, + 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, + 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 61, 30, 30, 30, 30, + 30, 30, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, + 30, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, + 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, 39, 39, + 39, 39, 39, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 2, 2, 19, 19, + 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 2, 2, 2, 2, 2, 2, 2, 2, 2, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 30, 30, + 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 2, 2, 30, 30, 30, + 30, 30, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 9, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, + 12, 12, 12, 2, 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, + 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, + 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, + 14, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 3, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, + 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, + 12, 12, 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, 0, 2, + 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118,118,118, + 118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118, + 118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 2, 2, 2, 2, 2, 2,135,135,135,135, + 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135, + 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135,135,135, + 135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106,106,106, + 106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106, + 106,106,106,106, 2, 2, 2, 2, 2, 2, 2, 2,104,104,104,104, + 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,110,110,110,110, + 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, + 110,110,110, 2, 2, 2, 2, 2, 2, 2, 2, 2,110,110,110,110, + 110,110, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,110,110,110,110, + 110,110,110,110, 2, 2, 2, 2, 2, 2, 2, 2, 47, 47, 47, 47, + 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 2, 81, 81, 81, 81, 81, 81, 81, 81, 81,120,120,120,120, + 120,120,120,120,120,120,120,120,120,120,120,120,116,116,116,116, + 116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, + 116,116,116,116,116,116,116,116,116,116,116, 2, 2, 2, 2, 2, + 2, 2, 2,116,116,116,116,116,116,116,116,116,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 2, + 128,128, 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, + 2, 57, 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, + 2, 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,117,117,117,117, + 117,117,117,117,117,117,117,117,117,117,117,117,112,112,112,112, + 112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, + 112,112,112, 2, 2, 2, 2,112,112,112,112,112,112,112,112,112, + 112,112,112, 2, 2, 2, 2, 2, 2, 2, 2, 2, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 2, 2, 83, 83, 83, 83, 83, 83, 83, 83, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 2, + 2, 2, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122, 2, 2, + 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,122,122,122,122,122,122,122, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130,130,130, + 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,130,130,130, 2, + 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101,101,101, + 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, + 101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101,101,101, + 101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 2, 2, 2, 2, 2, 2, 2, 2, 2,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111, 2, 2, 2, 2, 2, 2, 2, 2, 2,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, + 100,100,100,100,100,100,100,100,100,100, 2, 2, 2, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,108,108,108,108, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108, 2,108, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, + 108,108,108,108,108,108,108,108,108,108,108, 2,129,129,129,129, + 129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129,129,129, + 129,129,129,129,129,129,129,129,129,129, 2,129,129,129,129,129, + 129,129,129,129,129,129, 2, 2, 2, 2, 2, 2,109,109,109,109, + 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, + 109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109,109,109, + 109,109,109,109,109,109, 2, 2, 2, 2, 2, 2,107,107,107,107, + 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, 2,107, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, + 107,107,107,107,107, 2,107,107,107,107,107,107,107, 2,107,107, + 2,107,107,107,107,107, 2, 1,107,107,107,107,107,107,107,107, + 107, 2, 2,107,107, 2, 2,107,107,107, 2, 2,107, 2, 2, 2, + 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107,107,107, + 2, 2,107,107,107,107,107,107,107, 2, 2, 2,107,107,107,107, + 107, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,137,137,137,137, + 137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137, + 137,137,137,137,137,137, 2,137, 2,137,137,137,124,124,124,124, + 124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, + 124,124,124,124, 2, 2, 2, 2, 2, 2, 2, 2,124,124,124,124, + 124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, + 123,123, 2, 2,123,123,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123,123,123,123,123,123,123, 2, 2,114,114,114,114, + 114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114, + 114, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,114,114,114,114, + 114,114,114,114,114,114, 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2,102,102,102,102, + 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, + 102,102,102,102,102, 2, 2, 2, 2, 2, 2, 2,102,102,102,102, + 102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126,126,126, + 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, + 126,126,126,126,126,126,126, 2, 2,126,126,126,126,126,126,126, + 126,126,126,126,126,126,126,126, 2, 2, 2, 2, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2,125,125,125,125, + 125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125, 5, 5, 5, 5, + 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, + 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,121,121,121,121, + 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121, + 121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133,133,133, + 133,133,133,133,133, 2,133,133,133,133,133,133,133,133,133,133, + 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133, + 133,133,133, 2,133,133,133,133,133,133,133,133,133,133,133,133, + 133,133, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,133,133,133,133, + 133,133,133,133,133,133,133,133,133, 2, 2, 2,134,134,134,134, + 134,134,134,134,134,134,134,134,134,134,134,134, 2, 2,134,134, + 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134, + 134,134,134,134, 2,134,134,134,134,134,134,134,134,134,134,134, + 134,134,134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 2, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 2, 2, 2, 8, 2, 8, 8, 2, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, + 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, + 63, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 2, 2, 2, 2, 2, 2, 2,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,127, 2, 2, 2, 2, 2, 2, 2, 2, 2, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 2, 2, 2, 2, 2, 2, 2,115,115,115,115, + 115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115, + 115,115,115,115,115,115,115,115,115,115,115, 2,115,115,115,115, + 115,115,115,115,115,115, 2, 2, 2, 2,115,115,103,103,103,103, + 103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103, + 103,103,103,103,103,103,103,103,103,103, 2, 2,103,103,103,103, + 103,103, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,119,119,119,119, + 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 119,119, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,119,119,119,119, + 119,119,119,119,119,119, 2,119,119,119,119,119,119,119, 2,119, + 119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119, + 119,119,119,119, 2, 2, 2, 2, 2,119,119,119, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 2, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 2, 2, 2, 2, 2, 2, 2, 99,136, 12, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136,136, + 136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, + 136,136,136,136, 2, 2, 2, 2, 2, 2, 2, 2,136,136,136, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 15, 15, 15, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 17, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, 2,105,105,105,105, + 105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, + 105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105,105,105, + 105,105,105,105,105,105,105,105,105, 2, 2, 2,105,105,105,105, + 105,105,105,105,105, 2, 2, 2, 2, 2, 2, 2,105,105,105,105, + 105,105,105,105,105,105, 2, 2,105,105,105,105, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, + 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0,131,131,131,131, + 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, + 131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131,131,131, + 131,131,131,131,131,131,131,131,131,131,131,131, 56, 56, 56, 56, + 56, 56, 56, 2, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, + 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 14,113,113,113,113, + 113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113, + 113, 2, 2,113,113,113,113,113,113,113,113,113,113,113,113,113, + 113,113,113, 2, 2, 2, 2, 2, 2, 2, 2, 2,132,132,132,132, + 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132, + 132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132,132,132, + 132,132,132,132,132,132, 2, 2, 2, 2,132,132, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, + 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 3, 2, + 3, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 2, + 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, + 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, + 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 13, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, + 2, 3, 4, 5, 6, 0, 0, 0, 0, 7, 8, 9, 10, 11, 0, 12, + 0, 0, 0, 0, 13, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 16, 0, 17, 18, 19, 0, 0, 0, 20, 21, 22, 0, 23, 0, 24, + 0, 25, 0, 26, 0, 0, 0, 0, 0, 27, 28, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 0, + 41, 0, 42, 43, 44, 45, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 52, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, + 64, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 66, 0, + 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 68, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 0, +}; +static const uint16_t +_hb_ucd_u16[11168] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, + 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, + 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, + 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, + 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, + 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, + 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, + 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32, + 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, + 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, + 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, + 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, + 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72, + 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72, + 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 167, 168, 48, 48, 167, 48, 48, 169, 170, 171, 48, 48, + 48, 170, 48, 48, 48, 172, 173, 174, 48, 175, 9, 9, 9, 9, 9, 176, + 177, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182, + 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192, + 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198, + 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208, + 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72, + 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223, + 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233, + 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13, + 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 278, 208, 279, 208, 208, 208, 208, 280, 208, 281, 277, 282, 208, 283, 284, 208, + 208, 208, 285, 72, 286, 72, 269, 269, 269, 287, 208, 208, 208, 208, 288, 269, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 289, 290, 208, 208, 291, + 208, 208, 208, 208, 208, 208, 292, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 277, 277, 277, 277, 277, 277, 277, 277, 298, 299, 277, 277, 277, 300, 277, 301, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 208, 208, 208, 277, 302, 208, 208, 303, 208, 304, 208, 208, 208, 208, 208, 208, + 9, 9, 305, 11, 11, 306, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310, + 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32, + 316, 317, 318, 319, 320, 72, 72, 72, 208, 321, 208, 208, 208, 208, 208, 322, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 72, 324, + 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330, + 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48, + 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 198, 208, 208, 208, 208, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 72, + 48, 337, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344, + 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354, + 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362, + 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370, + 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380, + 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 386, 48, 387, 48, 48, 205, + 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, + 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48, 206, 72, 72, + 390, 391, 392, 393, 394, 48, 48, 48, 48, 48, 48, 395, 396, 397, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 398, 72, 48, 48, 48, 48, 399, 48, 48, 400, 72, 72, 401, + 32, 402, 32, 403, 404, 405, 406, 407, 48, 48, 48, 48, 48, 48, 48, 408, + 409, 2, 3, 4, 5, 410, 411, 412, 48, 413, 48, 199, 414, 415, 416, 417, + 418, 48, 171, 419, 203, 203, 72, 72, 48, 48, 48, 48, 48, 48, 48, 71, + 420, 269, 269, 421, 270, 270, 270, 422, 423, 324, 424, 72, 72, 208, 208, 425, + 72, 72, 72, 72, 72, 72, 72, 72, 48, 150, 48, 48, 48, 100, 426, 427, + 48, 48, 428, 48, 429, 48, 48, 430, 48, 431, 48, 48, 432, 433, 72, 72, + 9, 9, 434, 11, 11, 48, 48, 48, 48, 203, 191, 9, 9, 435, 11, 436, + 48, 48, 400, 48, 48, 48, 437, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 314, 48, 198, 400, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 438, 48, 48, 439, 48, 440, 48, 441, 48, 199, 442, 72, 72, 72, 48, 443, + 48, 444, 48, 445, 72, 72, 72, 72, 48, 48, 48, 446, 269, 447, 269, 269, + 448, 449, 48, 450, 451, 452, 48, 453, 48, 454, 72, 72, 455, 48, 456, 457, + 48, 48, 48, 458, 48, 459, 48, 460, 48, 461, 462, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 195, 72, 72, 72, 9, 9, 9, 463, 11, 11, 11, 464, + 48, 48, 465, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 269, 466, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 454, 467, 48, 62, 468, 72, 72, 72, 72, 72, 72, 72, 72, 48, 314, + 469, 48, 48, 470, 471, 447, 472, 473, 220, 48, 48, 474, 475, 48, 195, 191, + 476, 48, 477, 478, 479, 48, 48, 480, 220, 48, 48, 481, 482, 483, 484, 485, + 48, 97, 486, 487, 72, 72, 72, 72, 488, 489, 490, 48, 48, 491, 492, 191, + 493, 83, 84, 494, 495, 496, 497, 498, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 504, 505, 506, 507, 72, 72, + 48, 48, 48, 508, 509, 191, 510, 72, 48, 48, 511, 512, 191, 72, 72, 72, + 48, 172, 513, 514, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 517, 48, 48, 518, 519, 72, + 520, 48, 48, 521, 522, 523, 48, 48, 524, 525, 526, 72, 48, 48, 48, 195, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 84, 48, 504, 527, 528, 147, 174, 529, 48, 530, 531, 532, 72, 72, 72, 72, + 533, 48, 48, 534, 535, 191, 536, 48, 537, 538, 191, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 540, 541, 542, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 206, 72, 72, 72, 72, 72, 72, + 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 386, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 199, 545, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 314, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546, + 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 400, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 559, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 205, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, + 208, 208, 563, 208, 208, 208, 564, 565, 566, 208, 567, 208, 208, 208, 568, 72, + 208, 208, 208, 208, 569, 72, 72, 72, 72, 72, 72, 72, 72, 72, 269, 570, + 208, 208, 208, 208, 208, 285, 269, 451, 72, 72, 72, 72, 72, 72, 72, 72, + 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11, + 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11, + 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591, + 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 606, 607, 608, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 150, 609, 610, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 48, 611, 612, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 613, 614, 72, 72, + 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 484, 269, 269, 616, 617, 72, 72, 72, 72, + 484, 269, 618, 619, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323, + 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208, + 633, 208, 208, 324, 568, 634, 323, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 635, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 323, 631, 286, + 208, 208, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 568, 324, 72, + 324, 208, 208, 208, 636, 175, 208, 208, 636, 208, 637, 72, 72, 72, 72, 72, + 638, 208, 208, 208, 208, 208, 208, 639, 208, 208, 640, 208, 641, 208, 208, 208, + 208, 208, 208, 208, 208, 322, 637, 642, 633, 323, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 314, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 203, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 643, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72, + 48, 203, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 644, 72, 645, 645, 645, 645, 645, 645, 72, 72, 72, 72, 72, 72, 72, 72, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 646, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 647, + 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 11, 11, 11, 13, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 16, 17, 18, 17, 17, 19, 20, 21, 21, 22, 21, 23, 24, + 25, 26, 27, 27, 28, 29, 27, 30, 27, 27, 27, 27, 27, 31, 27, 27, + 32, 33, 33, 33, 34, 27, 27, 27, 35, 35, 35, 36, 37, 37, 37, 38, + 39, 39, 40, 41, 42, 43, 44, 45, 45, 45, 27, 46, 45, 47, 48, 27, + 49, 49, 49, 49, 49, 50, 51, 49, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 110, 111, 112, 113, 110, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 123, 124, 123, 125, 45, 45, 126, 127, 128, 129, 130, 131, 45, 45, + 132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137, 45, 45, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 139, 139, 141, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143, + 143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170, + 171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176, + 177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168, + 188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194, 195, 45, 45, 45, 45, + 196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201, + 202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211, + 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 8, 217, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 11, 218, 11, 11, 218, 219, 11, 220, 11, 11, 11, 221, 221, 222, 11, 223, + 224, 0, 0, 0, 0, 0, 225, 226, 227, 228, 0, 0, 45, 8, 8, 229, + 0, 0, 230, 231, 232, 0, 4, 4, 233, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 234, 45, 235, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, 0, + 239, 239, 240, 239, 239, 240, 4, 4, 241, 241, 241, 241, 241, 241, 241, 242, + 139, 139, 140, 243, 243, 243, 244, 245, 143, 246, 247, 247, 247, 247, 14, 14, + 0, 0, 0, 0, 0, 45, 45, 45, 248, 249, 248, 248, 248, 248, 248, 250, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 45, 252, + 253, 0, 254, 255, 256, 257, 257, 257, 257, 258, 259, 260, 260, 260, 260, 261, + 262, 263, 263, 264, 142, 142, 142, 142, 265, 0, 263, 266, 0, 0, 267, 260, + 142, 265, 0, 0, 0, 0, 142, 268, 0, 0, 0, 0, 0, 260, 260, 269, + 260, 260, 260, 260, 260, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 0, 0, 0, 0, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 45, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 272, 271, 271, 271, 273, 274, 274, 274, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 276, 45, 14, 14, 14, 14, 14, 14, 277, 277, 277, 277, 277, 278, + 0, 0, 279, 4, 4, 4, 4, 4, 280, 4, 4, 4, 281, 45, 45, 282, + 283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290, 49, 49, + 291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299, + 300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308, + 309, 310, 247, 4, 4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 315, 142, 316, 142, 142, 317, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 45, 45, + 320, 321, 21, 322, 323, 27, 27, 27, 27, 27, 27, 27, 324, 47, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 325, 45, 27, 27, 27, 27, 326, 27, 27, 327, 45, 45, 328, + 8, 285, 329, 0, 0, 330, 331, 332, 27, 27, 27, 27, 27, 27, 27, 333, + 334, 0, 1, 2, 1, 2, 335, 259, 260, 336, 142, 265, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 345, 45, 45, 342, 342, 342, 342, 342, 342, 342, 346, + 347, 0, 0, 348, 11, 11, 11, 11, 349, 252, 350, 45, 45, 0, 0, 351, + 45, 45, 45, 45, 45, 45, 45, 45, 352, 353, 354, 354, 354, 355, 356, 252, + 357, 357, 358, 359, 360, 361, 361, 362, 363, 364, 365, 365, 366, 367, 45, 45, + 368, 368, 368, 368, 368, 369, 369, 369, 370, 371, 372, 373, 373, 374, 373, 375, + 376, 376, 377, 378, 378, 378, 379, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 381, 380, 382, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 384, 385, 385, 386, 387, 388, 389, 389, 390, 391, 392, 45, 45, 45, 393, 394, + 395, 396, 397, 398, 45, 45, 45, 45, 399, 399, 400, 401, 400, 402, 400, 400, + 403, 404, 405, 406, 407, 407, 408, 408, 409, 409, 45, 45, 410, 410, 411, 412, + 413, 413, 413, 414, 415, 416, 417, 418, 419, 420, 421, 45, 45, 45, 45, 45, + 422, 422, 422, 422, 423, 45, 45, 45, 424, 424, 424, 425, 424, 424, 424, 426, + 0, 0, 427, 285, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 27, 428, 45, 45, 45, 45, 45, 45, 45, 45, + 8, 8, 429, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 27, 430, + 431, 431, 431, 431, 432, 433, 431, 434, 435, 435, 435, 435, 436, 437, 438, 439, + 440, 440, 440, 441, 442, 443, 443, 444, 445, 445, 445, 445, 446, 445, 447, 448, + 449, 450, 449, 451, 45, 45, 45, 45, 452, 453, 454, 455, 455, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 45, 45, 45, 45, 45, 45, 45, 45, + 466, 466, 466, 466, 466, 467, 45, 45, 468, 468, 468, 468, 469, 470, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 471, 471, 471, 472, 471, 473, 45, 45, + 474, 474, 474, 474, 475, 476, 477, 45, 478, 478, 478, 479, 480, 45, 45, 45, + 481, 482, 483, 481, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 17, 17, 17, 484, 45, 45, 45, 45, 45, 45, 485, 485, 485, 485, 485, 486, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 487, 488, 488, 487, 489, 45, + 14, 14, 14, 14, 490, 49, 49, 49, 49, 49, 491, 45, 492, 492, 492, 493, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 494, 495, 495, 496, 497, 495, 498, 499, 499, 500, 501, 502, 45, 45, 45, 45, + 503, 139, 139, 504, 505, 506, 507, 11, 349, 508, 509, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 510, 511, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 512, 512, 512, 513, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 514, 514, 514, 514, 514, 515, 45, 45, 45, 45, 45, 45, + 514, 514, 514, 514, 514, 514, 516, 517, 514, 514, 514, 514, 514, 514, 514, 514, + 514, 514, 514, 514, 518, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 520, 521, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, + 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, + 522, 522, 522, 522, 523, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 524, 525, 526, 527, 45, 45, 45, 45, 45, 45, 528, 529, 530, + 531, 531, 531, 531, 532, 533, 534, 535, 531, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 536, 536, 536, 536, 536, 537, 45, 45, 45, 45, 45, 45, + 538, 538, 538, 538, 539, 538, 538, 538, 540, 538, 45, 45, 45, 45, 541, 45, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 543, + 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 542, 544, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 545, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 546, 45, 45, 45, 547, 548, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 317, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 549, 549, 549, 549, 549, 549, 550, 551, 552, 553, 267, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, + 0, 0, 555, 0, 0, 0, 556, 557, 558, 0, 559, 0, 0, 0, 560, 45, + 11, 11, 11, 11, 561, 45, 45, 45, 45, 45, 45, 45, 45, 45, 0, 267, + 0, 0, 0, 0, 0, 234, 0, 560, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 225, 0, 0, 0, 562, 563, 564, 565, 0, 0, 0, + 566, 567, 0, 568, 569, 570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, + 572, 572, 572, 572, 572, 572, 572, 572, 573, 574, 575, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 576, 577, 578, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 248, 248, 579, 318, 580, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 21, 21, 21, 581, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 584, 45, 45, + 585, 585, 585, 585, 586, 587, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 334, 0, 0, 0, 588, 45, 45, 45, 45, + 334, 0, 0, 589, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 590, 27, 591, 592, 593, 594, 595, 596, 597, 598, 599, 598, 45, 45, 45, 324, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 267, 227, 334, 334, 334, 0, 554, + 600, 0, 0, 0, 0, 0, 600, 0, 0, 0, 600, 45, 45, 45, 601, 0, + 602, 0, 0, 252, 560, 603, 554, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, 600, 235, + 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 560, 252, 45, + 252, 0, 0, 0, 427, 285, 0, 0, 427, 0, 589, 45, 45, 45, 45, 45, + 604, 0, 0, 0, 0, 0, 0, 605, 0, 0, 606, 0, 607, 0, 0, 0, + 0, 0, 0, 0, 0, 267, 589, 608, 609, 554, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 610, 45, 45, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 611, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 612, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 613, 45, + 248, 318, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 614, 45, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, + 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, + 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, + 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, + 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, + 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, + 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, + 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, + 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, + 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, + 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, + 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, + 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, + 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, + 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, + 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, + 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, + 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, + 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, + 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, + 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, + 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, + 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, + 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, + 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, + 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, + 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, + 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, + 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, + 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, + 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, + 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, + 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, + 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, + 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, + 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, + 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, + 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, + 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, + 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, + 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, + 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, + 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, + 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, + 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, + 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, + 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, + 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, + 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, + 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, + 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, + 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, + 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, + 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, + 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, + 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, + 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, + 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, + 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, + 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, + 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, + 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, + 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, + 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, + 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, + 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, + 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, + 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, + 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, + 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, + 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, + 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, + 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, + 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, + 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, + 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, + 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, + 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, + 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, + 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, + 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, + 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, + 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, + 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, + 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, + 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, + 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, + 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, + 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, + 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, + 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, + 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, + 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, + 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, + 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, + 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, + 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, + 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, + 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, + 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, + 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, + 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, + 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1948,1949, + 1950,1951,1952,1953,1954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1955,1956,1957,1959,1958, + 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, + 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, + 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, + 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, + 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, + 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, + 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, + 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, + 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, + 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, + 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, + 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, + 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, + 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, + 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, + 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, + 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, + 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, + 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, + 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, + 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, + 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, + 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, + 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, + 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, + 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, + 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, + 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, + 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, + 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, + 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, + 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, + 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, + 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +static const int16_t +_hb_ucd_i16[196] = +{ + 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, + 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, + 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, + -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, + 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, + 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, + 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, + 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, + -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, + 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, + -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, + -1, 0, 1, -1, +}; + +static inline uint_fast8_t +_hb_ucd_gc (unsigned u) +{ + return u<1114110u?_hb_ucd_u8[2176+(((_hb_ucd_u16[((_hb_ucd_u8[u>>4>>5])<<5)+((u>>4)&31u)])<<4)+((u)&15u))]:2; +} +static inline uint_fast8_t +_hb_ucd_ccc (unsigned u) +{ + return u<125259u?_hb_ucd_u8[14026+(((_hb_ucd_u8[13034+(((_hb_ucd_u8[12544+(u>>4>>4)])<<4)+((u>>4)&15u))])<<4)+((u)&15u))]:0; +} +static inline unsigned +_hb_ucd_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline int_fast16_t +_hb_ucd_bmg (unsigned u) +{ + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[16170+(((_hb_ucd_b4(16042+_hb_ucd_u8,u>>2>>6))<<6)+((u>>2)&63u))])<<2)+((u)&3u)]:0; +} +static inline uint_fast8_t +_hb_ucd_sc (unsigned u) +{ + return u<918000u?_hb_ucd_u8[18924+(((_hb_ucd_u16[3008+(((_hb_ucd_u8[17130+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:2; +} +static inline uint_fast16_t +_hb_ucd_dm (unsigned u) +{ + return u<195102u?_hb_ucd_u16[6048+(((_hb_ucd_u8[28764+(u>>6)])<<6)+((u)&63u))]:0; +} + + +#else + +static const uint8_t +_hb_ucd_u8[16998] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 9, 10, 11, 7, 7, 7, 7, 12, 13, 14, 14, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 21, 23, 21, 21, 21, 21, 24, 7, 7, + 25, 26, 21, 21, 21, 21, 27, 28, 21, 21, 29, 30, 31, 32, 33, 34, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, 7, 39, 21, 40, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 41, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 42, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 69, 72, 73, + 69, 69, 64, 74, 64, 64, 75, 76, 77, 78, 79, 80, 81, 82, 69, 83, + 84, 85, 86, 87, 88, 89, 69, 69, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 90, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 91, + 92, 34, 34, 34, 34, 34, 34, 34, 34, 93, 34, 34, 94, 95, 96, 97, + 98, 99,100,101,102,103,104,105, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,106, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, + 108,108, 34, 34,109,110,111,112, 34, 34,113,114,115,116,117,118, + 119,120,121,122,123,124,125,126,127,128,129,123, 34, 34,130,123, + 131,132,133,134,135,136,137,138,139,140,141,123,142,123,143,144, + 145,146,147,148,149,150,151,123,152,153,123,154,155,156,157,123, + 158,159,123,160,161,162,123,123,163,164,165,166,123,167,123,168, + 34, 34, 34, 34, 34, 34, 34,169,170, 34,171,123,123,123,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, + 34, 34, 34, 34, 34, 34, 34, 34,172,123,123,123,123,123,123,123, + 123,123,123,123,123,123,123,123, 34, 34, 34, 34,173,123,123,123, + 34, 34, 34, 34,174,175,176,177,123,123,123,123,178,179,180,181, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,182, + 34, 34, 34, 34, 34,183,123,123,123,123,123,123,123,123,123,123, + 34, 34,184, 34, 34,185,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123,123,123,123,123,186,187,123,123,123,123,123,123, + 69,188,189,190,191,192,193,123,194,195,196,197,198,199,200,201, + 69, 69, 69, 69,202,203,123,123,123,123,123,123,123,123,123,123, + 204,123,205,123,123,206,123,123,123,123,123,123,123,123,123,123, + 34,207,208,123,123,123,123,123,209,210,211,123,212,213,123,123, + 214,215,216,217,218,123, 69,219, 69, 69, 69, 69, 69,220,221,222, + 223,224,225,226,227,228,123,123,123,123,123,123,123,123,123,123, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,229, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,230, 34, + 231, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,232, 34, 34, + 34, 34, 34, 34, 34, 34, 34,233,123,123,123,123,123,123,123,123, + 34, 34, 34, 34,234,123,123,123,123,123,123,123,123,123,123,123, + 235,123,236,237,123,123,123,123,123,123,123,123,123,123,123,123, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,238, + 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,239, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, + 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, + 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, + 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, + 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, + 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, + 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, + 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, + 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, + 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, + 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10, + 44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11, + 11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, + 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11, + 32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, + 48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52, 2, 2, 2, + 16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62, + 36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65, 8, 9, 66, 2, 67, + 43, 43, 43, 43, 43, 60, 68, 2, 69, 36, 36, 36, 36, 70, 43, 43, + 7, 7, 7, 7, 7, 2, 2, 36, 71, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36, + 7, 7, 7, 7, 7, 36, 77, 78, 2, 2, 2, 2, 2, 2, 2, 79, + 70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36, + 36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44, + 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, + 43, 43, 40, 21, 2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43, + 43, 43, 75, 43, 75, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 64, + 36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 61, 36, 36, 36, 36, 44, + 44, 57, 43, 43, 43, 43, 43, 43, 43, 82, 43, 43, 43, 43, 43, 43, + 43, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 83, 71, 84, + 85, 43, 43, 43, 83, 84, 85, 84, 70, 43, 43, 43, 36, 36, 36, 36, + 36, 43, 2, 7, 7, 7, 7, 7, 86, 36, 36, 36, 36, 36, 36, 36, + 70, 84, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 84, + 85, 43, 80, 87, 88, 87, 85, 61, 44, 44, 44, 87, 44, 44, 36, 62, + 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 56, 63, 80, + 57, 83, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 84, + 85, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61, + 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 70, 64, 44, 44, 44, 44, + 57, 83, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, + 61, 36, 62, 36, 36, 44, 71, 84, 85, 43, 43, 57, 83, 87, 85, 44, + 61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43, + 57, 84, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 85, + 85, 43, 80, 87, 88, 87, 85, 44, 44, 44, 44, 83, 44, 44, 36, 62, + 78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36, + 61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36, + 36, 36, 36, 36, 36, 44, 44, 84, 83, 88, 44, 84, 88, 84, 85, 44, + 61, 44, 44, 87, 44, 44, 44, 44, 27, 89, 67, 67, 56, 90, 44, 44, + 83, 84, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 44, 62, 43, 83, 84, 88, 43, 80, 43, 43, 44, + 44, 44, 57, 80, 36, 61, 44, 44, 44, 44, 44, 91, 27, 27, 27, 89, + 70, 84, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 85, + 84, 84, 88, 83, 88, 84, 43, 44, 44, 44, 87, 88, 44, 44, 44, 61, + 62, 61, 44, 44, 44, 44, 44, 44, 43, 84, 62, 36, 36, 36, 61, 36, + 36, 36, 36, 36, 36, 70, 71, 84, 85, 43, 80, 84, 88, 84, 85, 77, + 44, 44, 36, 92, 27, 27, 27, 93, 27, 27, 27, 27, 89, 36, 36, 36, + 44, 84, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, + 36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 87, + 84, 43, 80, 80, 84, 84, 84, 84, 44, 84, 64, 44, 44, 44, 44, 44, + 62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 94, + 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, + 62, 61, 61, 36, 36, 61, 36, 36, 36, 36, 62, 62, 36, 36, 36, 36, + 70, 36, 43, 43, 43, 43, 71, 44, 36, 36, 61, 81, 43, 43, 43, 44, + 7, 7, 7, 7, 7, 44, 36, 36, 77, 67, 2, 2, 2, 2, 2, 2, + 2, 95, 95, 67, 43, 67, 67, 67, 7, 7, 7, 7, 7, 27, 27, 27, + 27, 27, 50, 50, 50, 4, 4, 84, 36, 36, 36, 36, 62, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 61, 44, 57, 43, 43, 43, 43, 43, 43, 83, + 43, 43, 60, 43, 36, 36, 70, 43, 43, 43, 43, 43, 57, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 80, 67, 67, 67, 67, 76, 67, 67, 90, 67, + 2, 2, 95, 67, 21, 64, 44, 44, 36, 36, 36, 36, 36, 92, 85, 43, + 83, 43, 43, 43, 85, 83, 85, 71, 7, 7, 7, 7, 7, 2, 2, 2, + 36, 36, 36, 84, 43, 36, 36, 43, 71, 84, 96, 92, 84, 84, 84, 36, + 70, 43, 71, 36, 36, 36, 36, 36, 36, 83, 85, 83, 84, 84, 85, 92, + 7, 7, 7, 7, 7, 84, 85, 67, 11, 11, 11, 48, 44, 44, 48, 44, + 16, 16, 16, 16, 16, 53, 45, 16, 36, 36, 36, 36, 61, 36, 36, 44, + 36, 36, 36, 61, 61, 36, 36, 44, 61, 36, 36, 44, 36, 36, 36, 61, + 61, 36, 36, 44, 36, 36, 36, 36, 36, 36, 36, 61, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 61, 57, 43, 2, 2, 2, 2, 97, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 98, 44, 67, 67, 67, 67, 67, 44, 44, 44, + 11, 11, 11, 44, 16, 16, 16, 44, 99, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 77, 72,100, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36,101,102, 44, 36, 36, 36, 36, 36, 63, 2,103, + 104, 36, 36, 36, 61, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36, + 36, 43, 80, 44, 44, 44, 44, 44, 36, 43, 60, 64, 44, 44, 44, 44, + 36, 43, 44, 44, 44, 44, 44, 44, 61, 43, 44, 44, 44, 44, 44, 44, + 36, 36, 43, 85, 43, 43, 43, 84, 84, 84, 84, 83, 85, 43, 43, 43, + 43, 43, 2, 86, 2, 66, 70, 44, 7, 7, 7, 7, 7, 44, 44, 44, + 27, 27, 27, 27, 27, 44, 44, 44, 2, 2, 2,105, 2, 59, 43, 68, + 36,106, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 44, 44, + 36, 36, 70, 71, 36, 36, 36, 36, 36, 36, 36, 36, 70, 61, 44, 44, + 36, 36, 36, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 61, + 43, 83, 84, 85, 83, 84, 44, 44, 84, 83, 84, 84, 85, 43, 44, 44, + 90, 44, 2, 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 44, + 36, 36, 61, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 44, 44, + 36, 36, 36, 36, 36, 44, 44, 44, 7, 7, 7, 7, 7, 98, 44, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 36, 36, 36, 70, 83, 85, 44, 2, + 36, 36, 92, 83, 43, 43, 43, 80, 83, 83, 85, 43, 43, 43, 83, 84, + 84, 85, 43, 43, 43, 43, 80, 57, 2, 2, 2, 86, 2, 2, 2, 44, + 43, 43, 43, 43, 43, 43, 43,107, 43, 43, 96, 36, 36, 36, 36, 36, + 36, 36, 83, 43, 43, 83, 83, 84, 84, 83, 96, 36, 36, 36, 44, 44, + 95, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 90, 44, + 43, 96, 36, 36, 36, 36, 36, 36, 92, 43, 43, 84, 43, 85, 43, 36, + 36, 36, 36, 83, 43, 84, 85, 85, 43, 84, 44, 44, 44, 44, 2, 2, + 36, 36, 84, 84, 84, 84, 43, 43, 43, 43, 84, 43, 44, 91, 2, 2, + 7, 7, 7, 7, 7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40, 2, + 16, 16, 16, 16,108, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11, + 2, 2, 2, 2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43, + 83, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 92, 43, 61, 44, 44, + 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16, + 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,109, 40, 40, + 43, 43, 43, 43, 43, 57, 43, 43, 32, 32, 32, 16, 16, 16, 16, 32, + 16, 16, 16, 16, 11, 11, 11, 11, 16, 16, 16, 44, 11, 11, 11, 44, + 16, 16, 16, 16, 48, 48, 48, 48, 16, 16, 16, 16, 16, 16, 16, 44, + 16, 16, 16, 16,110,110,110,110, 16, 16,108, 16, 11, 11,111,112, + 41, 16,108, 16, 11, 11,111, 41, 16, 16, 44, 16, 11, 11,113, 41, + 16, 16, 16, 16, 11, 11,114, 41, 44, 16,108, 16, 11, 11,111,115, + 116,116,116,116,116,117, 65, 65,118,118,118, 2,119,120,119,120, + 2, 2, 2, 2,121, 65, 65,122, 2, 2, 2, 2,123,124, 2,125, + 126, 2,127,128, 2, 2, 2, 2, 2, 9,126, 2, 2, 2, 2,129, + 65, 65, 68, 65, 65, 65, 65, 65,130, 44, 27, 27, 27, 8,127,131, + 27, 27, 27, 27, 27, 8,127,102, 40, 40, 40, 40, 40, 40, 81, 44, + 20, 20, 20, 20, 20, 20, 20, 20, 43, 43, 43, 43, 43, 43,132, 51, + 133, 51,133, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44, + 67,134, 67,135, 67, 34, 11, 16, 11, 32,135, 67, 49, 11, 11, 67, + 67, 67,134,134,134, 11, 11,136, 11, 11, 35, 36, 39, 67, 16, 11, + 8, 8, 49, 16, 16, 26, 67,137, 27, 27, 27, 27, 27, 27, 27, 27, + 103,103,103,103,103,103,103,103,103,138,139,103,140, 67, 44, 44, + 8, 8,141, 67, 67, 8, 67, 67,141, 26, 67,141, 67, 67, 67,141, + 67, 67, 67, 67, 67, 67, 67, 8, 67,141,141, 67, 67, 67, 67, 67, + 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67,142,143, 67, 67, + 67, 67, 67, 67, 67, 67,141, 67, 67, 67, 67, 67, 67, 26, 8, 8, + 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, + 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 90, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67, + 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67, + 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, + 67, 67, 67, 67, 67, 67, 67, 26, 67, 67, 67, 67, 4, 4, 4, 4, + 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, + 8, 8,127,144, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, + 8,127,145,145,145,145,145,145,145,145,145,145,144, 8, 8, 8, + 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, + 8, 8,141, 26, 8, 8,141, 67, 67, 67, 44, 67, 67, 67, 67, 67, + 67, 67, 67, 44, 67, 67, 67, 67, 11, 11, 11, 11, 11, 11, 11, 47, + 16, 16, 16, 16, 16, 16, 16,108, 32, 11, 32, 34, 34, 34, 34, 11, + 32, 32, 34, 16, 16, 16, 40, 11, 32, 32,137, 67, 67,135, 34,146, + 43, 32, 44, 44, 91, 2, 97, 2, 16, 16, 16,147, 44, 44,147, 44, + 36, 36, 36, 36, 44, 44, 44, 52, 64, 44, 44, 44, 44, 44, 44, 57, + 36, 36, 36, 61, 44, 44, 44, 44, 36, 36, 36, 61, 36, 36, 36, 61, + 2,119,119, 2,123,124,119, 2, 2, 2, 2, 6, 2,105,119, 2, + 119, 4, 4, 4, 4, 2, 2, 86, 2, 2, 2, 2, 2,118, 2, 2, + 105,148, 2, 2, 2, 2, 2, 2, 67, 67, 67, 67, 67, 55, 67, 67, + 67, 67, 44, 44, 44, 44, 44, 44, 67, 67, 67, 44, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 67, 44, 44, 1, 2,149,150, 4, 4, 4, 4, + 4, 67, 4, 4, 4, 4,151,152,153,103,103,103,103, 43, 43, 84, + 154, 40, 40, 67,103,155, 63, 67, 36, 36, 36, 61, 57,156,157, 69, + 36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36, + 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, + 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, + 158, 27, 27, 27, 27, 27, 27, 27, 36, 36,106, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36,159, 2, 7, 7, 7, 7, 7, 36, 44, 44, + 32, 32, 32, 32, 32, 32, 32, 70, 51,160, 43, 43, 43, 43, 43, 86, + 32, 32, 32, 32, 32, 32, 40, 43, 36, 36, 36,103,103,103,103,103, + 43, 2, 2, 2, 44, 44, 44, 44, 41, 41, 41,157, 40, 40, 40, 40, + 41, 32, 32, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, + 45, 16, 16, 16, 34, 34, 34, 32, 32, 32, 32, 32, 42,161, 34, 35, + 32, 32, 16, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 11, 11, 32, + 11, 11, 32, 32, 32, 32, 32, 32, 44, 32, 11, 47, 44, 44, 44, 44, + 44, 44, 44, 62, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36, + 36, 92, 85, 83, 67, 67, 44, 44, 27, 27, 27, 67,162, 44, 44, 44, + 36, 36, 2, 2, 44, 44, 44, 44, 84, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 84, 84, 84, 84, 84, 84, 84, 84, 43, 44, 44, 44, 44, 2, + 43, 36, 36, 36, 2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43, 2, + 36, 36, 36, 70, 43, 43, 43, 43, 43, 84, 44, 44, 44, 44, 44, 91, + 36, 70, 84, 43, 43, 84, 43, 84,163, 2, 2, 2, 2, 2, 2, 52, + 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 70, 69, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 83, + 85, 83, 85, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 83, 44, + 7, 7, 7, 7, 7, 44, 2, 2, 69, 36, 36, 77, 67, 92, 83, 36, + 71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 62,106, 2, 36, 36, 36, 36, 36, 92, 43, 84, + 2,106,164, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61, + 62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,112, 40, 40, + 16, 16, 16, 16, 44, 44, 44, 44, 36, 92, 85, 84, 83,163, 85, 44, + 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36, + 165,165,165,165,165,165,165,165,166,166,166,166,166,166,166,166, + 16, 16, 16,108, 44, 44, 44, 44, 44,147, 16, 16, 44, 44, 62, 71, + 36, 36, 36, 36,167, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61, + 36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, + 41, 44, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36,145, 44, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36,162, 44, + 2, 2, 2,168,128, 44, 44, 44, 6,169,170,145,145,145,145,145, + 145,145,128,168,128, 2,125,171, 2, 64, 2, 2,151,145,145,128, + 2,172, 8,173, 66, 2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 61, 79, 91, 2, 3, 2, 4, 5, 6, 2, + 16, 16, 16, 16, 16, 17, 18,127,128, 4, 2, 36, 36, 36, 36, 36, + 69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40, + 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44, + 20,174, 56,175, 26, 8,141, 90, 44, 44, 44, 44, 79, 65, 67, 44, + 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62, + 2, 64, 44,176, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67, + 103,103,140, 27, 89, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 90, + 90, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 50, 44, + 177, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 44, 44, + 27, 27, 44, 44, 44, 44, 62, 36,150, 36, 36, 36, 36,178, 44, 44, + 36, 36, 36, 43, 43, 80, 44, 44, 36, 36, 36, 36, 36, 36, 36, 91, + 36, 36, 44, 44, 36, 36, 36, 36,179,103,103, 44, 44, 44, 44, 44, + 11, 11, 11, 11, 16, 16, 16, 16, 11, 11, 44, 44, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 44, 44, 36, 36, 44, 44, 44, 44, 44, 91, + 36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62, + 36, 36, 36, 91, 27, 27, 27, 27, 36, 36, 36, 77,158, 27, 27, 27, + 44, 44, 44,176, 27, 27, 27, 27, 36, 61, 36, 44, 44,176, 27, 27, + 36, 36, 36, 27, 27, 27, 44, 91, 36, 36, 36, 36, 36, 44, 44, 91, + 36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27, + 70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36, + 36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27, 98, 44, 44, 44, + 2, 2, 2, 2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36,180, 30, + 36, 36, 36, 36, 36, 36,180, 27, 36, 36, 36, 36, 78, 36, 36, 36, + 36, 36, 70, 80, 44,176, 27, 27, 2, 2, 2, 64, 44, 44, 44, 44, + 36, 36, 36, 44, 91, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27, + 36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 91, 2, 64, 44, + 44, 44, 44, 44,176, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, + 16,108, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, + 27, 27, 27, 27, 27, 27, 27, 98, 27, 27, 27, 93, 44, 44, 44, 44, + 177, 27, 30, 2, 2, 44, 44, 44, 85, 96, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, + 27, 27, 27, 7, 7, 7, 7, 7, 44, 44, 44, 44, 44, 44, 44, 57, + 84, 85, 43, 83, 85, 60,181, 2, 2, 44, 44, 44, 44, 44, 79, 44, + 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 85, 43, + 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 92, 88, 44, 44, 44, 44, + 36, 70, 2, 61, 44, 44, 44, 44, 36, 92, 84, 43, 43, 43, 43, 83, + 96, 36, 63, 2, 59, 43, 60, 44, 7, 7, 7, 7, 7, 63, 63, 2, + 176, 27, 27, 27, 27, 27, 27, 27, 27, 27, 98, 44, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 84, 85, 43, 84, 83, 43, 2, 2, 2, 80, + 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, + 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, + 84, 85, 43, 43, 43, 80, 44, 44, 43, 84, 62, 36, 36, 36, 61, 62, + 61, 36, 62, 36, 36, 57, 71, 84, 83, 84, 88, 87, 88, 87, 84, 44, + 61, 44, 44, 87, 44, 44, 62, 36, 36, 84, 44, 43, 43, 43, 80, 44, + 43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 92, 84, 43, 43, 43, 43, + 84, 43, 83, 71, 36, 63, 2, 2, 7, 7, 7, 7, 7, 91, 91, 71, + 84, 85, 43, 43, 83, 83, 84, 85, 83, 43, 36, 72, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 92, 84, 43, 43, 44, 84, 84, 43, 85, + 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 44, + 84, 85, 43, 43, 43, 83, 85, 85, 60, 2, 61, 44, 44, 44, 44, 44, + 2, 2, 2, 2, 2, 2, 64, 44, 36, 36, 36, 36, 36, 70, 85, 84, + 43, 43, 43, 85, 61, 44, 44, 44, 84, 43, 43, 85, 43, 43, 44, 44, + 7, 7, 7, 7, 7, 27, 2, 95, 43, 43, 43, 43, 85, 60, 44, 44, + 27, 98, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 44, 36, 36, 36, + 92, 84, 43, 43, 44, 43, 84, 84, 71, 72, 88, 44, 44, 44, 44, 44, + 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 83, 70, 43, 60, + 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 83, 85, 43, 36, 36, + 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 83, 43, 2, 72, 2, + 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 85, + 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, + 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 87, 43, 43, 43, + 83, 43, 85, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, + 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, + 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 84, 84, 88, + 43, 87, 85, 85, 61, 44, 44, 44, 36, 70, 83,163, 64, 44, 44, 44, + 27, 27, 89, 67, 67, 67, 56, 20,162, 67, 67, 67, 67, 67, 67, 67, + 67, 44, 44, 44, 44, 44, 44, 91,103,103,103,103,103,103,103,178, + 2, 2, 64, 44, 44, 44, 44, 44, 65, 65, 65, 65, 68, 44, 44, 44, + 43, 43, 60, 44, 44, 44, 44, 44, 43, 43, 43, 60, 2, 2, 67, 67, + 40, 40, 95, 44, 44, 44, 44, 44, 7, 7, 7, 7, 7,176, 27, 27, + 27, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 44, 44, 62, 36, + 27, 27, 27, 30, 2, 64, 44, 44, 36, 36, 36, 36, 36, 61, 44, 57, + 92, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 44, 44, 44, 57, 43, 74, 40, 40, 40, 40, 40, 40, + 40, 86, 44, 44, 44, 44, 44, 44, 36, 61, 44, 44, 44, 44, 44, 44, + 44, 44, 36, 36, 44, 44, 44, 44, 36, 36, 36, 36, 36, 44, 50, 60, + 65, 65, 44, 44, 44, 44, 44, 44, 67, 67, 67, 90, 55, 67, 67, 67, + 67, 67,182, 85, 43, 67,182, 84, 84,183, 65, 65, 65, 82, 43, 43, + 43, 76, 50, 43, 43, 43, 67, 67, 67, 67, 67, 67, 67, 43, 43, 67, + 67, 67, 67, 67, 90, 44, 44, 44, 67, 43, 76, 44, 44, 44, 44, 44, + 27, 27, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16, + 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, + 16, 16,108, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 47, 11, 44, 47, 48, 47, 48, 11, 47, 11, + 11, 11, 11, 16, 16,147,147, 16, 16, 16,147, 16, 16, 16, 16, 16, + 16, 16, 11, 48, 11, 47, 48, 11, 11, 11, 47, 11, 11, 11, 47, 16, + 16, 16, 16, 16, 11, 48, 11, 47, 11, 11, 47, 47, 44, 11, 11, 11, + 47, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, + 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11, + 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, + 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, + 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, + 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 43, 43, 43, 76, 67, 50, 43, 43, + 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, + 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, + 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, + 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, + 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 43, 43, + 7, 7, 7, 7, 7, 44, 44, 94, 36, 36, 61,176, 27, 27, 27, 27, + 43, 43, 43, 80, 44, 44, 44, 44, 16, 16, 43, 43, 43, 74, 44, 44, + 27, 27, 27, 27, 27, 27,158, 27,184, 27, 98, 44, 44, 44, 44, 44, + 27, 27, 27, 27, 27, 27, 27,158, 27, 27, 27, 27, 27, 27, 27, 44, + 36, 36, 62, 36, 36, 36, 36, 36, 62, 61, 61, 62, 62, 36, 36, 36, + 36, 61, 36, 36, 62, 62, 44, 44, 44, 61, 44, 62, 62, 62, 62, 36, + 62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36, + 36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36, + 62, 36, 62, 36, 36, 62, 36, 36, 8, 44, 44, 44, 44, 44, 44, 44, + 55, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 90, 44, + 44, 44, 44, 67, 67, 67, 67, 67, 67, 90, 44, 44, 44, 44, 44, 44, + 67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41, + 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 44, + 67, 67, 67, 67, 67, 67, 55, 67, 67, 55, 67, 90, 44, 67, 67, 67, + 67, 90, 55, 67, 67, 90, 44, 67, 67, 67, 67, 67, 67, 90, 55, 67, + 67, 67, 44, 44, 67, 90, 44, 44, 36, 44, 44, 44, 44, 44, 44, 44, + 79, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, 65, 65, 65, 65, + 166,166,166,166,166,166,166, 44,166,166,166,166,166,166,166, 0, + 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, + 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, + 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, + 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, + 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, + 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, + 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, + 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, + 21, 2, 1, 1, 21, 23, 26, 26, 1, 2, 6, 7, 7, 12, 12, 7, + 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, + 12, 2, 6, 2, 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, + 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, + 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, + 14, 7, 17, 21, 7, 6, 11, 2, 5, 2, 5, 6, 8, 8, 8, 24, + 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, + 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, + 18, 21, 21, 29, 15, 6, 18, 6, 12, 11, 11, 12, 9, 26, 26, 9, + 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, + 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, 26, 6, 7, 14, 17, 22, + 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, + 11, 21, 24, 9, 23, 26, 10, 21, 6, 10, 4, 4, 3, 3, 7, 25, + 21, 22, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 23, 2, + 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, 21, 1, 26, 10, 10, 1, + 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, + 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, + 0, 0, 38, 39, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 8, 0, 9, 0, 10, 11, 0, 0, 12, 13, + 14, 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, 0, 0, 0, 21, 22, + 0, 23, 24, 0, 0, 23, 25, 26, 0, 23, 25, 0, 0, 23, 25, 0, + 0, 23, 25, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 23, 25, 0, + 0, 28, 25, 0, 0, 0, 29, 0, 0, 30, 31, 0, 0, 32, 33, 0, + 34, 35, 0, 36, 37, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42, 42, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 44, 0, 0, + 0, 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, 47, 0, 48, 0, 0, + 0, 49, 50, 51, 0, 52, 0, 53, 0, 54, 0, 0, 0, 0, 55, 56, + 0, 0, 0, 0, 0, 0, 57, 58, 0, 0, 0, 0, 0, 0, 59, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, + 0, 0, 0, 62, 0, 0, 0, 63, 0, 64, 0, 0, 65, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 0, 0, 68, + 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 50, 70, + 0, 71, 72, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, 75, 76, 77, + 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 78, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 81, + 0, 0, 0, 82, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 85, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 69, 62, 0, 88, 0, 0, + 89, 90, 0, 73, 0, 0, 91, 0, 0, 92, 0, 0, 0, 0, 0, 93, + 0, 94, 25, 95, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 97, 0, + 0, 0, 0, 0, 0, 62, 98, 0, 0, 62, 0, 0, 0, 99, 0, 0, + 0,100, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 74, 0, 42,101, 0,102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, + 0, 0,103, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, + 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,108,109,110, 0, 0, 0, 0,111, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112,113, 0, 0, 0, 0, 0, 0, + 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, + 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, + 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 0, 0, 0, 0, + 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 1, + 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 38, 1, 39, + 14, 39, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 0, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 0, 0, + 0, 0, 19, 1, 21, 0, 0, 47, 0, 0, 0, 0, 0, 38, 48, 1, + 1, 49, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, + 0, 0, 0, 0, 52, 1, 1, 1, 53, 21, 43, 54, 55, 21, 35, 1, + 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 57, 58, 59, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 0, 0, 0, 57, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, + 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, + 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, + 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, + 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 72, 73, 74, 75, + 76, 77, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 79, 80, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 64, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 19, 84, 0, + 63, 0, 0, 0, 0, 49, 1, 85, 0, 0, 0, 0, 1, 54, 15, 41, + 0, 0, 0, 0, 0, 56, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, + 0, 87, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, + 0, 0, 0, 0, 88, 9, 12, 4, 89, 8, 90, 47, 0, 59, 50, 0, + 21, 1, 21, 91, 92, 1, 1, 1, 1, 1, 1, 1, 1, 93, 94, 95, + 0, 0, 0, 0, 96, 1, 97, 59, 81, 98, 99, 4, 59, 0, 0, 0, + 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,100,101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 0, 19, 0, 1, 1, 50, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 64, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 50, 0, 0, 0, + 0, 0, 52, 69, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,103,104, 59, 38, 81, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, + 1, 14, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 88, 0, + 0, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 62, + 0,108, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0,109, 14, 54, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0, + 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, + 63, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, + 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 56, + 0, 38, 1, 59, 1, 59, 0, 0, 64, 87, 0, 0, 0, 0, 0, 60, + 112, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,112, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, + 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, + 87,113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, + 0, 0, 0, 0, 8, 90, 0, 0, 0, 0, 0, 0, 1, 88, 0, 0, + 0, 0, 0, 0, 0, 0, 0,114, 0,115,116,117,118, 0, 52, 4, + 119, 49, 23, 0, 0, 0, 0, 0, 0, 0, 38, 50, 0, 0, 0, 0, + 38, 59, 0, 0, 0, 0, 0, 0, 1, 88, 1, 1, 1, 1, 39, 1, + 48,103, 88, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 4,119, 0, 0, 0, 1,120, 0, 0, 0, 0, 0, + 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216, + 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, + 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220, + 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230, + 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, + 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220, + 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, + 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, + 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230, + 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230, + 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230, + 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0, + 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, + 0, 0, 0,220,230,230, 0,220,230,220,220,220, 27, 28, 29,230, + 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, + 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0, + 122,122,122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, + 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0, + 130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, + 0, 9, 9, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220, + 220, 0, 0, 0,230, 0, 0,220, 0, 0, 9, 9, 0, 0, 7, 0, + 230,230,230, 0,230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220, + 202,230,230,230,230,230,232,228,228,220, 0,230,233,220,230,220, + 230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, + 0, 0,218,228,232,222,224,224, 0, 8, 8, 0,230, 0,230,230, + 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, + 0,230,220, 0, 0, 0,220,220, 0, 9, 7, 0, 0, 7, 9, 0, + 0, 0, 9, 7, 9, 9, 0, 0, 0, 0, 1, 0, 0,216,216, 1, + 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0, + 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, + 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, + 0, 0, 0, 0, 1, 2, 39, 40, 0, 1, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, + 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, + 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, + 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, + 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, + 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, + 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, + 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, + 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, + 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 12, 12, 12, 12, 13, 14, + 14, 14, 14, 15, 16, 17, 18, 19, 20, 14, 21, 14, 22, 14, 14, 14, + 14, 23, 24, 24, 25, 26, 14, 14, 14, 14, 27, 28, 14, 14, 29, 30, + 31, 32, 33, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 35, 7, 36, 37, 7, 38, 7, 7, + 7, 39, 14, 40, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 41, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, + 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, + 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 79, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, + 83, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 70, 70, 98, 99,100,101,102,102, + 103,104,105,106,107,108,109,110,111,112, 97,113,114,115,116,117, + 118, 97,119,119,120, 97,121,122,123,124,125,126,127,128,129,130, + 131, 97,132, 97,133,134,135,136,137,138,139,140,141, 97,142,143, + 97,144,145,146,147, 97,148,149, 97,150,151,152, 97, 97,153,154, + 155,156, 97,157, 97,158,159,159,159,159,159,159,159,160,161,159, + 162, 97, 97, 97, 97, 97,163,163,163,163,163,163,163,163,164, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,165,165, + 165,165,166, 97, 97, 97,167,167,167,167,168,169,170,171, 97, 97, + 97, 97,172,173,174,175,176,176,176,176,176,176,176,176,176,176, + 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, + 176,176,176,176,176,177,176,176,176,176,176,178, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,179,180,181, 32, 32,182, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,183,184, + 97, 97, 97, 97, 97, 97, 59,185,186,187,188,189,190, 97,191,192, + 193, 59, 59,194, 59,195,196,196,196,196,196,197, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,198, 97,199, 97, 97,200, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,201,202,203, 97, 97, 97, 97, 97,204,205, + 206, 97,207,208, 97, 97,209,210,211,212,213, 97, 59, 59, 59, 59, + 59, 59, 59,214,215,216,217,218,219,220,221,222, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,223, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70,224, 70,225, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,226, 70, 70, 70, 70, 70, 70, 70, 70, 70,227, 97, 97, + 97, 97, 97, 97, 97, 97, 70, 70, 70, 70,228, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97,229, 97,230,231, 0, 1, 2, 2, 0, 1, + 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, + 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 0, + 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, + 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 3, 0, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, + 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, + 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, + 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, + 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, + 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, + 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, + 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, + 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, + 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, + 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, + 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, + 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, + 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 2, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, + 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, + 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, + 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, + 2, 2, 2, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 2, 2, 2, 23, 23, + 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, + 2, 2, 2, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 2, 16, 16, + 16, 16, 2, 2, 16, 16, 2, 16, 16, 2, 2, 2, 2, 2, 20, 20, + 20, 20, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 2, + 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, + 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, + 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, + 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, + 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2, + 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, + 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, + 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, + 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, + 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2, + 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 2, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, + 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, + 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, + 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, + 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, + 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, + 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, + 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 2, 62, 62, + 62, 62, 62, 2, 2, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, + 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, + 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, + 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, + 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, + 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 9, 1, 1, 2, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, + 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, + 19, 19, 19, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, 55, 55, + 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, + 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, + 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, + 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 2, 26, 26, 26, 2, 2, 2, 2, 2, 12, 12, + 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, + 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0, + 0, 19, 19, 19, 19, 19, 2, 2, 19, 19, 19, 19, 19, 2, 2, 2, + 2, 2, 2, 2, 2, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, + 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, + 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, + 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, + 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, + 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30, + 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 19, 19, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, + 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, + 2, 12, 12, 12, 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, + 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, + 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3, + 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, + 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, + 0, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, + 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, + 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 9, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0, + 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118, + 118,118,118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, + 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, + 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135, + 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106, + 106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104, + 104,104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,110,110, + 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110, + 110,110,110,110, 2, 2, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120, + 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116, + 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128, + 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, + 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, + 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, + 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2, + 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, + 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117, + 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112, + 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, + 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122, + 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122, + 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2, + 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130, + 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130, 3, 3, + 3, 3, 3, 3, 3, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, + 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101, + 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, + 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, + 100,100,100,100,100,100,100,100,100,100,100,100, 2, 2, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108, + 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, + 108,108,108,108,108, 2,129,129,129,129,129,129,129, 2,129, 2, + 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109, + 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109, + 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, + 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, + 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2, + 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2, + 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, + 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, + 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, + 2,137, 2,137,137,137,124,124,124,124,124,124,124,124,124,124, + 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, + 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, + 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102, 2, + 2, 2, 2, 2, 2, 2,102,102, 2, 2, 2, 2, 2, 2,126,126, + 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126, + 126,126, 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2,125,125, + 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,125, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 2, 2, 2, 7, 7, 7, 2, 2, 2, 2, 2,121,121, + 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2,133,133, + 133,133,133,133,133,133,133, 2,133,133,133,133,133,133,133,133, + 133,133,133,133,133, 2,133,133,133,133,133,133, 2, 2,133,133, + 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134, 2, 2, + 134,134,134,134,134,134, 2,134,134,134,134,134,134,134,134,134, + 134,134,134,134,134, 2, 8, 8, 8, 8, 8, 8, 8, 2, 8, 8, + 2, 8, 8, 8, 8, 8, 2, 2, 8, 2, 8, 8, 2, 8, 8, 8, + 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 2, + 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, 2, 2, 22, 22, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, + 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, + 63, 63, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 2, 80, 2, 2, 2, 2, 2, 2, 2,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2, + 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115, + 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,103,103, + 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, + 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, + 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119, 11, 11, + 11, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136, 12, + 0, 0, 2, 2, 2, 2,136,136,136,136,136,136,136,136,136,136, + 136, 2, 2, 2, 2, 2, 17, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,105,105, + 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, + 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, + 2, 2,105,105,105,105, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131, + 131,131,131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, + 2,131,131,131,131,131, 2,131,131,131,131,131,131,131, 56, 2, + 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, + 56, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 2, 2, 2, 13, 13, + 2, 2, 2, 2, 13, 13, 14, 14, 2, 2, 2, 2, 2, 14,113,113, + 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, + 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, + 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 0, 0, + 0, 0, 0, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, + 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, + 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 13, 13, + 13, 13, 13, 13, 13, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 0, + 2, 2, 2, 2, 2, 2, 16, 50, 84,118, 88, 89, 90, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 91, 85, 85,220, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, + 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, + 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, + 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, + 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, + 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105, + 106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,113, 0, + 114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122, + 123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128,129,130,131,132,133,134,135,136,137, + 138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153, + 154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162, + 163, 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,169, 0, 0, 0, + 0,170,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,172,173,174,175,176,177,178,179,180,181, + 182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197, + 198,199,200,201,202,203,204,205, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 4, +}; +static const uint16_t +_hb_ucd_u16[8928] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, + 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, + 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, + 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, + 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, + 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, + 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, + 48, 67, 68, 69, 48, 70, 71, 72, 72, 72, 48, 73, 72, 74, 75, 32, + 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, + 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, + 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, + 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, + 136, 48, 48, 137, 138, 139, 72, 72, 140, 48, 141, 142, 143, 144, 72, 72, + 145, 146, 147, 148, 149, 48, 150, 151, 152, 153, 32, 154, 155, 156, 72, 72, + 48, 48, 157, 158, 159, 160, 161, 162, 163, 164, 9, 9, 165, 11, 11, 166, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 167, 168, 48, 48, + 167, 48, 48, 169, 170, 171, 48, 48, 48, 170, 48, 48, 48, 172, 173, 174, + 48, 175, 9, 9, 9, 9, 9, 176, 177, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 178, 48, 179, 180, 48, 48, 48, 48, 181, 182, + 183, 184, 48, 185, 48, 186, 183, 187, 48, 48, 48, 188, 189, 190, 191, 192, + 193, 191, 48, 48, 194, 48, 48, 195, 196, 48, 197, 48, 48, 48, 48, 198, + 48, 199, 200, 201, 202, 48, 203, 204, 48, 48, 205, 48, 206, 207, 208, 208, + 48, 209, 48, 48, 48, 210, 211, 212, 191, 191, 213, 214, 72, 72, 72, 72, + 215, 48, 48, 216, 217, 159, 218, 219, 220, 48, 221, 64, 48, 48, 222, 223, + 48, 48, 224, 225, 226, 64, 48, 227, 228, 9, 9, 229, 230, 231, 232, 233, + 11, 11, 234, 27, 27, 27, 235, 236, 11, 237, 27, 27, 32, 32, 32, 238, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 239, 13, 13, 13, 13, 13, 13, + 240, 241, 240, 240, 241, 242, 240, 243, 244, 244, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 260, 72, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 270, 271, 272, 273, 208, 274, 275, 208, 276, + 277, 277, 277, 277, 277, 277, 277, 277, 278, 208, 279, 208, 208, 208, 208, 280, + 208, 281, 277, 282, 208, 283, 284, 208, 208, 208, 285, 72, 286, 72, 269, 269, + 269, 287, 208, 208, 208, 208, 288, 269, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 208, 208, 289, 290, 208, 208, 291, 208, 208, 208, 208, 208, 208, 292, 208, + 208, 208, 208, 208, 208, 208, 293, 294, 269, 295, 208, 208, 296, 277, 297, 277, + 298, 299, 277, 277, 277, 300, 277, 301, 208, 208, 208, 277, 302, 208, 208, 303, + 208, 304, 208, 208, 208, 208, 208, 208, 9, 9, 305, 11, 11, 306, 307, 308, + 13, 13, 13, 13, 13, 13, 309, 310, 11, 11, 311, 48, 48, 48, 312, 313, + 48, 314, 315, 315, 315, 315, 32, 32, 316, 317, 318, 319, 320, 72, 72, 72, + 208, 321, 208, 208, 208, 208, 208, 322, 208, 208, 208, 208, 208, 323, 72, 324, + 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 177, 48, 48, 48, 48, 330, + 331, 48, 48, 136, 48, 48, 48, 48, 199, 332, 48, 71, 208, 208, 322, 48, + 208, 333, 334, 208, 335, 336, 208, 208, 334, 208, 208, 336, 208, 208, 208, 208, + 48, 48, 48, 198, 208, 208, 208, 208, 48, 48, 48, 48, 48, 48, 48, 72, + 48, 337, 48, 48, 48, 48, 48, 48, 150, 208, 208, 208, 285, 48, 48, 227, + 338, 48, 339, 72, 13, 13, 340, 341, 13, 342, 48, 48, 48, 48, 343, 344, + 31, 345, 346, 347, 13, 13, 13, 348, 349, 350, 351, 352, 353, 72, 72, 354, + 355, 48, 356, 357, 48, 48, 48, 358, 359, 48, 48, 360, 361, 191, 32, 362, + 64, 48, 363, 48, 364, 365, 48, 150, 76, 48, 48, 366, 367, 368, 369, 370, + 48, 48, 371, 372, 373, 374, 48, 375, 48, 48, 48, 376, 377, 378, 379, 380, + 381, 382, 315, 11, 11, 383, 384, 11, 11, 11, 11, 11, 48, 48, 385, 191, + 48, 48, 386, 48, 387, 48, 48, 205, 388, 388, 388, 388, 388, 388, 388, 388, + 389, 389, 389, 389, 389, 389, 389, 389, 48, 48, 48, 48, 48, 48, 203, 48, + 48, 48, 48, 48, 48, 206, 72, 72, 390, 391, 392, 393, 394, 48, 48, 48, + 48, 48, 48, 395, 396, 397, 48, 48, 48, 48, 48, 398, 72, 48, 48, 48, + 48, 399, 48, 48, 400, 72, 72, 401, 32, 402, 32, 403, 404, 405, 406, 407, + 48, 48, 48, 48, 48, 48, 48, 408, 409, 2, 3, 4, 5, 410, 411, 412, + 48, 413, 48, 199, 414, 415, 416, 417, 418, 48, 171, 419, 203, 203, 72, 72, + 48, 48, 48, 48, 48, 48, 48, 71, 420, 269, 269, 421, 270, 270, 270, 422, + 423, 324, 424, 72, 72, 208, 208, 425, 72, 72, 72, 72, 72, 72, 72, 72, + 48, 150, 48, 48, 48, 100, 426, 427, 48, 48, 428, 48, 429, 48, 48, 430, + 48, 431, 48, 48, 432, 433, 72, 72, 9, 9, 434, 11, 11, 48, 48, 48, + 48, 203, 191, 9, 9, 435, 11, 436, 48, 48, 400, 48, 48, 48, 437, 72, + 48, 48, 48, 314, 48, 198, 400, 72, 438, 48, 48, 439, 48, 440, 48, 441, + 48, 199, 442, 72, 72, 72, 48, 443, 48, 444, 48, 445, 72, 72, 72, 72, + 48, 48, 48, 446, 269, 447, 269, 269, 448, 449, 48, 450, 451, 452, 48, 453, + 48, 454, 72, 72, 455, 48, 456, 457, 48, 48, 48, 458, 48, 459, 48, 460, + 48, 461, 462, 72, 72, 72, 72, 72, 48, 48, 48, 48, 195, 72, 72, 72, + 9, 9, 9, 463, 11, 11, 11, 464, 48, 48, 465, 191, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 269, 466, 48, 454, 467, 48, 62, 468, 72, 72, + 72, 72, 72, 72, 72, 72, 48, 314, 469, 48, 48, 470, 471, 447, 472, 473, + 220, 48, 48, 474, 475, 48, 195, 191, 476, 48, 477, 478, 479, 48, 48, 480, + 220, 48, 48, 481, 482, 483, 484, 485, 48, 97, 486, 487, 72, 72, 72, 72, + 488, 489, 490, 48, 48, 491, 492, 191, 493, 83, 84, 494, 495, 496, 497, 498, + 48, 48, 48, 499, 500, 501, 72, 72, 48, 48, 48, 502, 503, 191, 72, 72, + 48, 48, 504, 505, 506, 507, 72, 72, 48, 48, 48, 508, 509, 191, 510, 72, + 48, 48, 511, 512, 191, 72, 72, 72, 48, 172, 513, 514, 72, 72, 72, 72, + 48, 48, 486, 515, 72, 72, 72, 72, 72, 72, 9, 9, 11, 11, 147, 516, + 72, 72, 517, 48, 48, 518, 519, 72, 520, 48, 48, 521, 522, 523, 48, 48, + 524, 525, 526, 72, 48, 48, 48, 195, 84, 48, 504, 527, 528, 147, 174, 529, + 48, 530, 531, 532, 72, 72, 72, 72, 533, 48, 48, 534, 535, 191, 536, 48, + 537, 538, 191, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 48, 539, + 72, 72, 72, 72, 269, 540, 541, 542, 48, 206, 72, 72, 72, 72, 72, 72, + 270, 270, 270, 270, 270, 270, 543, 544, 48, 48, 48, 48, 386, 72, 72, 72, + 48, 48, 199, 545, 72, 72, 72, 72, 48, 48, 48, 48, 314, 72, 72, 72, + 48, 48, 48, 195, 48, 199, 368, 72, 72, 72, 72, 72, 72, 48, 203, 546, + 48, 48, 48, 547, 548, 549, 550, 551, 48, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 9, 9, 11, 11, 269, 552, 72, 72, 72, 72, 72, 72, + 48, 48, 48, 48, 553, 554, 555, 555, 556, 557, 72, 72, 72, 72, 558, 72, + 48, 48, 48, 48, 48, 48, 48, 400, 48, 48, 48, 48, 48, 48, 48, 559, + 48, 199, 72, 72, 72, 559, 560, 48, 48, 48, 48, 48, 48, 48, 48, 205, + 48, 48, 48, 48, 48, 48, 71, 150, 195, 561, 562, 72, 72, 72, 72, 72, + 208, 208, 208, 208, 208, 208, 208, 323, 208, 208, 563, 208, 208, 208, 564, 565, + 566, 208, 567, 208, 208, 208, 568, 72, 208, 208, 208, 208, 569, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 269, 570, 208, 208, 208, 208, 208, 285, 269, 451, + 9, 571, 11, 572, 573, 574, 240, 9, 575, 576, 577, 578, 579, 9, 571, 11, + 580, 581, 11, 582, 583, 584, 585, 9, 586, 11, 9, 571, 11, 572, 573, 11, + 240, 9, 575, 585, 9, 586, 11, 9, 571, 11, 587, 9, 588, 589, 590, 591, + 11, 592, 9, 593, 594, 595, 596, 11, 597, 9, 598, 11, 599, 600, 600, 600, + 32, 32, 32, 601, 32, 32, 602, 603, 604, 605, 45, 72, 72, 72, 72, 72, + 606, 607, 608, 72, 72, 72, 72, 72, 48, 48, 150, 609, 610, 72, 72, 72, + 72, 72, 72, 72, 48, 48, 611, 612, 48, 48, 48, 48, 613, 614, 72, 72, + 9, 9, 575, 11, 615, 368, 72, 72, 72, 72, 72, 72, 72, 72, 72, 484, + 269, 269, 616, 617, 72, 72, 72, 72, 484, 269, 618, 619, 72, 72, 72, 72, + 620, 48, 621, 622, 623, 624, 625, 626, 627, 205, 628, 205, 72, 72, 72, 629, + 208, 208, 324, 208, 208, 208, 208, 208, 208, 322, 333, 630, 630, 630, 208, 323, + 174, 208, 208, 208, 208, 208, 631, 208, 208, 208, 631, 72, 72, 72, 632, 208, + 633, 208, 208, 324, 568, 634, 323, 72, 208, 208, 208, 208, 208, 208, 208, 635, + 208, 208, 208, 208, 208, 323, 631, 286, 208, 208, 208, 208, 208, 208, 208, 322, + 208, 208, 208, 208, 208, 568, 324, 72, 324, 208, 208, 208, 636, 175, 208, 208, + 636, 208, 637, 72, 72, 72, 72, 72, 638, 208, 208, 208, 208, 208, 208, 639, + 208, 208, 640, 208, 641, 208, 208, 208, 208, 208, 208, 208, 208, 322, 637, 642, + 633, 323, 72, 72, 72, 72, 72, 72, 48, 48, 48, 48, 48, 314, 72, 72, + 48, 48, 48, 204, 48, 48, 48, 48, 48, 203, 48, 48, 48, 48, 48, 48, + 48, 48, 643, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 72, + 48, 203, 72, 72, 72, 72, 72, 72, 644, 72, 645, 645, 645, 645, 645, 645, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72, + 389, 389, 389, 389, 389, 389, 389, 646, 389, 389, 389, 389, 389, 389, 389, 647, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, + 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, + 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, + 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, + 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, + 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, + 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, + 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 26, 26, + 26, 26, 26, 26, 31, 31, 50, 51, 26, 26, 52, 31, 53, 31, 31, 31, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 54, 56, 54, 54, 54, + 57, 58, 59, 60, 60, 61, 62, 63, 58, 64, 65, 66, 67, 60, 60, 68, + 69, 70, 71, 72, 72, 73, 74, 75, 70, 76, 77, 78, 79, 72, 80, 26, + 81, 82, 83, 84, 84, 85, 86, 87, 82, 88, 89, 26, 90, 84, 91, 92, + 93, 94, 95, 96, 96, 97, 98, 99, 94, 100, 101, 102, 103, 96, 96, 26, + 104, 105, 106, 107, 108, 105, 109, 110, 105, 106, 111, 26, 112, 109, 109, 113, + 114, 115, 116, 114, 114, 116, 114, 117, 115, 118, 119, 120, 121, 114, 122, 114, + 123, 124, 125, 123, 123, 125, 126, 127, 124, 128, 129, 130, 131, 123, 132, 26, + 133, 134, 135, 136, 136, 136, 136, 136, 134, 135, 137, 136, 138, 136, 136, 136, + 139, 140, 141, 142, 140, 140, 143, 144, 141, 145, 146, 140, 147, 140, 148, 26, + 149, 150, 150, 150, 150, 150, 150, 151, 150, 150, 150, 152, 26, 26, 26, 26, + 153, 154, 155, 155, 156, 155, 155, 157, 158, 157, 155, 159, 26, 26, 26, 26, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, 162, 161, 160, + 160, 160, 160, 161, 160, 160, 160, 163, 160, 163, 164, 165, 26, 26, 26, 26, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 167, 167, 167, 167, 168, 169, 167, 167, 167, 167, 167, 170, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 174, 173, 172, 172, 172, 172, + 172, 173, 172, 172, 172, 172, 173, 174, 173, 172, 174, 172, 172, 172, 172, 172, + 172, 172, 173, 172, 172, 172, 172, 172, 172, 172, 172, 175, 172, 172, 172, 176, + 172, 172, 172, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 181, 181, 181, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 185, + 186, 187, 188, 26, 189, 189, 190, 26, 191, 191, 192, 26, 193, 194, 195, 26, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 198, 196, 198, + 199, 200, 201, 202, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 203, + 201, 201, 201, 201, 201, 204, 180, 180, 180, 180, 180, 180, 180, 180, 205, 26, + 206, 206, 206, 207, 206, 208, 206, 208, 209, 206, 210, 210, 210, 211, 212, 26, + 213, 213, 213, 213, 213, 214, 213, 213, 213, 215, 213, 216, 196, 196, 196, 196, + 217, 217, 217, 218, 219, 219, 219, 219, 219, 219, 219, 220, 219, 219, 219, 221, + 219, 222, 219, 222, 219, 223, 9, 224, 26, 26, 26, 26, 26, 26, 26, 26, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 225, 225, 225, 227, + 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 230, 231, + 232, 232, 232, 232, 232, 232, 232, 233, 232, 234, 235, 235, 235, 235, 235, 235, + 18, 236, 167, 167, 167, 167, 167, 237, 228, 26, 238, 9, 239, 240, 241, 242, + 2, 2, 2, 2, 243, 244, 2, 2, 2, 2, 2, 245, 246, 247, 2, 248, + 2, 2, 2, 2, 2, 2, 2, 249, 9, 9, 9, 9, 9, 9, 9, 250, + 14, 14, 251, 251, 14, 14, 14, 14, 251, 251, 14, 252, 14, 14, 14, 251, + 14, 14, 14, 14, 14, 14, 253, 14, 253, 14, 254, 255, 14, 14, 256, 257, + 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 260, 261, + 0, 262, 2, 263, 0, 0, 0, 0, 26, 26, 9, 9, 9, 9, 264, 26, + 0, 0, 0, 0, 265, 266, 4, 0, 0, 267, 0, 0, 2, 2, 2, 2, + 2, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 262, 26, 26, 26, 0, 269, 26, 26, 0, 0, 0, 0, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, + 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 273, 273, 273, 273, 273, 274, 273, 273, 273, 273, 273, 274, 2, 2, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 275, 276, + 167, 167, 167, 167, 168, 169, 277, 277, 277, 277, 277, 277, 277, 278, 279, 278, + 172, 172, 174, 26, 174, 174, 174, 174, 174, 174, 174, 174, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 281, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 282, 26, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 26, 26, 26, 0, 284, + 285, 0, 0, 0, 286, 287, 0, 288, 289, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 291, 292, 293, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 295, + 296, 297, 297, 297, 297, 297, 298, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 299, 0, 0, 297, 297, 297, 300, 0, 0, 0, 0, 284, 26, 294, 294, + 171, 171, 171, 299, 0, 0, 0, 0, 0, 0, 0, 0, 171, 171, 171, 301, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 294, 294, 294, 294, 302, + 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 0, 0, 0, 0, 0, + 280, 280, 280, 280, 280, 280, 283, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 26, 26, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 304, 303, 303, 303, 303, 303, 303, 305, 26, 306, 306, 306, 306, 306, 306, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 307, 307, 307, 308, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 26, + 0, 0, 0, 0, 310, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 311, 2, 2, 2, 2, 2, 2, 312, 26, 26, 26, 26, 26, 313, 2, + 314, 314, 314, 314, 314, 315, 0, 316, 317, 317, 317, 317, 317, 317, 317, 26, + 318, 318, 318, 318, 318, 318, 318, 318, 319, 320, 318, 321, 54, 54, 54, 54, + 322, 322, 322, 322, 322, 323, 324, 324, 324, 324, 325, 326, 171, 171, 171, 327, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 328, 330, 166, 166, 166, 331, + 332, 332, 332, 332, 332, 332, 333, 26, 332, 334, 332, 335, 166, 166, 166, 166, + 336, 336, 336, 336, 336, 336, 336, 336, 337, 26, 26, 338, 339, 339, 340, 26, + 341, 341, 341, 26, 174, 174, 2, 2, 2, 2, 2, 342, 343, 26, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 339, 339, 339, 339, 339, 344, 339, 345, + 171, 171, 171, 171, 346, 26, 171, 171, 299, 347, 171, 171, 171, 171, 171, 346, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 283, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 348, 26, 26, 26, 26, + 349, 26, 350, 351, 25, 25, 352, 353, 354, 25, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 355, 26, 52, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 356, 26, 26, 31, 31, 31, 31, 31, 31, + 31, 31, 357, 31, 31, 31, 31, 31, 31, 26, 26, 26, 26, 26, 31, 51, + 9, 9, 0, 316, 9, 358, 0, 0, 0, 0, 359, 0, 262, 284, 50, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 360, + 361, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 362, 294, 293, 294, + 294, 294, 294, 363, 171, 171, 171, 299, 364, 364, 364, 365, 262, 262, 26, 366, + 367, 368, 367, 367, 369, 367, 367, 370, 367, 371, 367, 371, 26, 26, 26, 26, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 372, + 373, 0, 0, 0, 0, 0, 374, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 257, 0, 284, 375, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 376, + 377, 377, 377, 378, 379, 379, 379, 379, 379, 379, 380, 26, 381, 0, 0, 284, + 382, 382, 382, 382, 383, 384, 385, 385, 385, 386, 387, 387, 387, 387, 387, 388, + 389, 389, 389, 390, 391, 391, 391, 391, 392, 391, 393, 26, 26, 26, 26, 26, + 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395, + 396, 396, 396, 397, 396, 398, 399, 399, 399, 399, 400, 399, 399, 399, 399, 400, + 401, 401, 401, 401, 401, 26, 402, 402, 402, 402, 402, 402, 403, 404, 26, 26, + 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, + 405, 405, 405, 405, 405, 405, 406, 26, 405, 405, 407, 26, 405, 26, 26, 26, + 408, 409, 410, 410, 410, 410, 411, 412, 413, 413, 414, 413, 415, 415, 415, 415, + 416, 416, 416, 417, 418, 416, 26, 26, 26, 26, 26, 26, 419, 419, 420, 421, + 422, 422, 422, 423, 424, 424, 424, 425, 26, 26, 26, 26, 26, 26, 26, 26, + 426, 426, 426, 426, 427, 427, 427, 428, 427, 427, 429, 427, 427, 427, 427, 427, + 430, 431, 432, 433, 434, 434, 435, 436, 434, 437, 434, 437, 438, 438, 438, 438, + 439, 439, 439, 439, 26, 26, 26, 26, 440, 440, 440, 440, 441, 442, 441, 26, + 443, 443, 443, 443, 443, 443, 444, 445, 446, 446, 447, 446, 448, 448, 449, 448, + 450, 450, 451, 452, 26, 453, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 455, 26, 26, 26, 26, 26, 26, + 456, 456, 456, 456, 456, 456, 457, 26, 456, 456, 456, 456, 456, 456, 457, 458, + 0, 0, 0, 0, 0, 26, 0, 316, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 459, + 9, 9, 9, 9, 9, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 459, 26, + 460, 460, 460, 460, 460, 460, 460, 460, 460, 461, 462, 460, 460, 460, 26, 463, + 464, 464, 464, 464, 464, 464, 464, 464, 465, 466, 467, 467, 467, 468, 467, 469, + 470, 470, 470, 470, 470, 470, 471, 470, 472, 26, 473, 473, 473, 473, 474, 26, + 475, 475, 475, 475, 475, 475, 475, 475, 475, 476, 475, 475, 477, 140, 478, 26, + 479, 479, 480, 479, 479, 479, 479, 481, 26, 26, 26, 26, 26, 26, 26, 26, + 482, 483, 484, 485, 484, 486, 487, 487, 487, 487, 487, 487, 487, 488, 487, 489, + 490, 491, 492, 493, 493, 494, 495, 496, 491, 497, 498, 499, 500, 501, 501, 26, + 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 502, 503, 26, 26, 26, 26, + 504, 504, 504, 504, 504, 504, 504, 504, 504, 26, 504, 505, 26, 26, 26, 26, + 506, 506, 506, 506, 506, 506, 507, 506, 506, 506, 506, 507, 26, 26, 26, 26, + 508, 508, 508, 508, 508, 508, 508, 508, 509, 26, 508, 510, 201, 511, 26, 26, + 512, 512, 512, 512, 512, 512, 512, 513, 512, 514, 26, 26, 26, 26, 26, 26, + 515, 515, 515, 516, 515, 517, 515, 515, 26, 26, 26, 26, 26, 26, 26, 26, + 21, 21, 21, 21, 21, 21, 21, 518, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 520, 521, + 26, 26, 26, 26, 60, 522, 60, 60, 60, 60, 60, 522, 523, 26, 26, 26, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 26, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 524, 26, 26, 26, 525, 525, 525, 525, 525, 525, 525, 526, + 527, 528, 527, 527, 527, 527, 529, 527, 530, 26, 527, 527, 527, 531, 532, 532, + 532, 532, 533, 532, 532, 534, 535, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 536, 537, 167, 167, 167, 167, 536, 538, 167, 26, 167, 539, 540, 541, 14, 14, + 14, 257, 15, 375, 14, 542, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 84, 84, 84, 89, + 26, 26, 26, 26, 26, 26, 26, 26, 109, 109, 109, 109, 109, 109, 543, 544, + 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, + 545, 545, 545, 546, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 547, 548, 26, + 545, 545, 545, 545, 545, 545, 545, 545, 549, 26, 26, 26, 26, 26, 26, 26, + 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, + 550, 550, 550, 550, 550, 551, 550, 552, 26, 26, 26, 26, 26, 26, 26, 26, + 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 553, 553, 553, 553, 553, 553, 554, 26, 26, 26, 26, 26, 26, 26, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 555, 556, 556, 556, 557, 556, 558, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 559, 559, 559, 560, 560, 26, + 561, 561, 561, 561, 561, 561, 561, 561, 562, 26, 561, 563, 563, 561, 561, 564, + 561, 561, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 565, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 566, 566, 566, 566, 566, 566, 566, 566, 566, 567, 566, 566, 566, 566, 566, 566, + 566, 568, 566, 566, 26, 26, 26, 26, 26, 26, 26, 26, 569, 26, 26, 26, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 26, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 571, 26, + 572, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 290, 290, 290, 291, 26, 26, 26, 26, 26, 26, 573, 26, 574, 26, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 346, + 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 576, 575, 577, + 575, 578, 575, 579, 284, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, + 0, 0, 0, 0, 262, 361, 0, 0, 0, 0, 0, 0, 580, 581, 0, 582, + 583, 584, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 586, 26, 26, + 14, 14, 14, 14, 14, 14, 14, 14, 251, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 284, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 26, 0, 0, 0, 586, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, + 0, 0, 0, 259, 587, 588, 0, 589, 590, 0, 0, 0, 0, 0, 0, 0, + 591, 592, 259, 259, 0, 0, 0, 593, 594, 595, 596, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, 0, 0, 0, 0, 0, + 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, + 597, 598, 26, 599, 600, 597, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 274, 273, 273, 601, 602, 603, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 604, 280, 283, 280, 605, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 606, + 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, + 607, 607, 607, 607, 607, 607, 607, 607, 608, 607, 609, 26, 26, 26, 26, 26, + 610, 610, 610, 610, 610, 610, 610, 610, 610, 611, 610, 612, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 361, 0, + 0, 0, 0, 0, 0, 0, 613, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 361, 0, 0, 0, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, + 614, 31, 31, 31, 615, 616, 617, 618, 619, 620, 615, 621, 615, 617, 617, 622, + 31, 623, 31, 624, 625, 623, 31, 624, 26, 26, 26, 26, 26, 26, 355, 26, + 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 284, 26, 0, 262, 361, 0, 361, 0, 361, 0, 0, 0, 272, 26, + 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, + 0, 0, 0, 0, 0, 613, 26, 26, 26, 26, 26, 26, 626, 0, 0, 0, + 627, 26, 0, 0, 0, 0, 0, 284, 0, 586, 316, 26, 272, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 26, 0, 613, 0, 269, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 284, 26, 26, + 0, 284, 0, 0, 0, 0, 0, 0, 0, 26, 0, 316, 0, 0, 0, 0, + 0, 26, 0, 0, 0, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 593, 595, + 0, 0, 0, 0, 592, 628, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 26, 0, 272, 284, 269, + 269, 26, 272, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 629, 26, 26, 26, 26, 26, + 280, 280, 280, 280, 280, 280, 604, 26, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 348, 26, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 630, 26, 26, 26, + 280, 280, 280, 283, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 631, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, + 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, + 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, + 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, + 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, + 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, + 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, + 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, + 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, + 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, + 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, + 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, + 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, + 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, + 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, + 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, + 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, + 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, + 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, + 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, + 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, + 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, + 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, + 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, + 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, + 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, + 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, + 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, + 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, + 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, + 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, + 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, + 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, + 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, + 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, + 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, + 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, + 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, + 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, + 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, + 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, + 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, + 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, + 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, + 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, + 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, + 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, + 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, + 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, + 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, + 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, + 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, + 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, + 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, + 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, + 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, + 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, + 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, + 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, + 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, + 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, + 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, + 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, + 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, + 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, + 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, + 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, + 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, + 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, + 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, + 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, + 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, + 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, + 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, + 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, + 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, + 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, + 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, + 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, + 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, + 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, + 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, + 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, + 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, + 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, + 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, + 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, + 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, + 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, + 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, + 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, + 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, + 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, + 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, + 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, + 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, + 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, + 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, + 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, + 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, + 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, + 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, + 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, + 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, + 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, + 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, + 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, + 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, + 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, + 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, + 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, + 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, + 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, + 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, + 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, + 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, + 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1948,1949, + 1950,1951,1952,1953,1954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1955,1956,1957,1959,1958, + 1960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, + 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, + 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, + 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, + 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, + 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, + 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, + 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, + 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, + 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, + 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, + 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, + 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, + 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, + 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, + 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, + 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, + 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, + 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, + 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, + 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, + 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, + 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, + 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, + 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, + 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, + 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, + 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, + 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, + 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, + 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, + 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, + 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, + 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, +}; +static const int16_t +_hb_ucd_i16[196] = +{ + 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, + 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, + 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, + -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, + 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, + 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, + 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, + 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, + -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, + 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, + -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, + -1, 0, 1, -1, +}; + +static inline uint_fast8_t +_hb_ucd_gc (unsigned u) +{ + return u<1114110u?_hb_ucd_u8[6432+(((_hb_ucd_u8[1248+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; +} +static inline uint_fast8_t +_hb_ucd_ccc (unsigned u) +{ + return u<125259u?_hb_ucd_u8[8640+(((_hb_ucd_u8[7704+(((_hb_ucd_u8[7048+(((_hb_ucd_u8[6802+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0; +} +static inline unsigned +_hb_ucd_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline int_fast16_t +_hb_ucd_bmg (unsigned u) +{ + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9372+(((_hb_ucd_u8[9252+(((_hb_ucd_b4(9124+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; +} +static inline uint_fast8_t +_hb_ucd_sc (unsigned u) +{ + return u<918000u?_hb_ucd_u8[10822+(((_hb_ucd_u16[1920+(((_hb_ucd_u8[10150+(((_hb_ucd_u8[9700+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; +} +static inline uint_fast16_t +_hb_ucd_dm (unsigned u) +{ + return u<195102u?_hb_ucd_u16[5632+(((_hb_ucd_u8[15974+(((_hb_ucd_b4(15878+_hb_ucd_u8,u>>4>>6))<<6)+((u>>4)&63u))])<<4)+((u)&15u))]:0; +} + +#endif + + +#endif /* HB_UCD_TABLE_HH */ + +/* == End of generated table == */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucd.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucd.cc new file mode 100644 index 00000000000..134e043d89c --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucd.cc @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2012 Grigori Goronzy <greg@kinoho.net> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "hb.hh" +#include "hb-machinery.hh" + +#include "hb-ucd-table.hh" + +static hb_unicode_combining_class_t +hb_ucd_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return (hb_unicode_combining_class_t) _hb_ucd_ccc (unicode); +} + +static hb_unicode_general_category_t +hb_ucd_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return (hb_unicode_general_category_t) _hb_ucd_gc (unicode); +} + +static hb_codepoint_t +hb_ucd_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return unicode + _hb_ucd_bmg (unicode); +} + +static hb_script_t +hb_ucd_script (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, + void *user_data HB_UNUSED) +{ + return _hb_ucd_sc_map[_hb_ucd_sc (unicode)]; +} + + +#define SBASE 0xAC00u +#define LBASE 0x1100u +#define VBASE 0x1161u +#define TBASE 0x11A7u +#define SCOUNT 11172u +#define LCOUNT 19u +#define VCOUNT 21u +#define TCOUNT 28u +#define NCOUNT (VCOUNT * TCOUNT) + +static inline bool +_hb_ucd_decompose_hangul (hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b) +{ + unsigned si = ab - SBASE; + + if (si >= SCOUNT) + return false; + + if (si % TCOUNT) + { + /* LV,T */ + *a = SBASE + (si / TCOUNT) * TCOUNT; + *b = TBASE + (si % TCOUNT); + return true; + } else { + /* L,V */ + *a = LBASE + (si / NCOUNT); + *b = VBASE + (si % NCOUNT) / TCOUNT; + return true; + } +} + +static inline bool +_hb_ucd_compose_hangul (hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab) +{ + if (a >= SBASE && a < (SBASE + SCOUNT) && b > TBASE && b < (TBASE + TCOUNT) && + !((a - SBASE) % TCOUNT)) + { + /* LV,T */ + *ab = a + (b - TBASE); + return true; + } + else if (a >= LBASE && a < (LBASE + LCOUNT) && b >= VBASE && b < (VBASE + VCOUNT)) + { + /* L,V */ + int li = a - LBASE; + int vi = b - VBASE; + *ab = SBASE + li * NCOUNT + vi * TCOUNT; + return true; + } + else + return false; +} + +static int +_cmp_pair (const void *_key, const void *_item) +{ + uint64_t& a = * (uint64_t*) _key; + uint64_t b = (* (uint64_t*) _item) & HB_CODEPOINT_ENCODE3(0x1FFFFFu, 0x1FFFFFu, 0); + + return a < b ? -1 : a > b ? +1 : 0; +} + +static hb_bool_t +hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, + void *user_data HB_UNUSED) +{ + if (_hb_ucd_compose_hangul (a, b, ab)) return true; + + uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0); + uint64_t *v = (uint64_t*) hb_bsearch (&k, _hb_ucd_dm2_map, + ARRAY_LENGTH (_hb_ucd_dm2_map), + sizeof (*_hb_ucd_dm2_map), + _cmp_pair); + if (likely (!v)) return false; + + hb_codepoint_t u = HB_CODEPOINT_DECODE3_3 (*v); + if (unlikely (!u)) return false; + + *ab = u; + return true; +} + +static hb_bool_t +hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, + void *user_data HB_UNUSED) +{ + if (_hb_ucd_decompose_hangul (ab, a, b)) return true; + + unsigned i = _hb_ucd_dm (ab); + + if (likely (!i)) return false; + i--; + + if (i < ARRAY_LENGTH (_hb_ucd_dm1_map)) + { + *a = _hb_ucd_dm1_map[i]; + *b = 0; + return true; + } + i -= ARRAY_LENGTH (_hb_ucd_dm1_map); + + uint64_t v = _hb_ucd_dm2_map[i]; + *a = HB_CODEPOINT_DECODE3_1 (v); + *b = HB_CODEPOINT_DECODE3_2 (v); + return true; +} + + +#if HB_USE_ATEXIT +static void free_static_ucd_funcs (); +#endif + +static struct hb_ucd_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_ucd_unicode_funcs_lazy_loader_t> +{ + static hb_unicode_funcs_t *create () + { + hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr); + + hb_unicode_funcs_set_combining_class_func (funcs, hb_ucd_combining_class, nullptr, nullptr); + hb_unicode_funcs_set_general_category_func (funcs, hb_ucd_general_category, nullptr, nullptr); + hb_unicode_funcs_set_mirroring_func (funcs, hb_ucd_mirroring, nullptr, nullptr); + hb_unicode_funcs_set_script_func (funcs, hb_ucd_script, nullptr, nullptr); + hb_unicode_funcs_set_compose_func (funcs, hb_ucd_compose, nullptr, nullptr); + hb_unicode_funcs_set_decompose_func (funcs, hb_ucd_decompose, nullptr, nullptr); + + hb_unicode_funcs_make_immutable (funcs); + +#if HB_USE_ATEXIT + atexit (free_static_ucd_funcs); +#endif + + return funcs; + } +} static_ucd_funcs; + +#if HB_USE_ATEXIT +static +void free_static_ucd_funcs () +{ + static_ucd_funcs.free_instance (); +} +#endif + +extern "C" HB_INTERNAL +hb_unicode_funcs_t * +hb_ucd_get_unicode_funcs (); + +hb_unicode_funcs_t * +hb_ucd_get_unicode_funcs () +{ +#ifdef HB_NO_UCD + return hb_unicode_funcs_get_empty (); +#endif + return static_ucd_funcs.get_unconst (); +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc deleted file mode 100644 index 8230bf1e8e4..00000000000 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2012 Grigori Goronzy <greg@kinoho.net> - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "hb.hh" - -#include "hb-machinery.hh" - -#include "ucdn.h" - -static const hb_script_t ucdn_script_translate[] = -{ - HB_SCRIPT_COMMON, - HB_SCRIPT_LATIN, - HB_SCRIPT_GREEK, - HB_SCRIPT_CYRILLIC, - HB_SCRIPT_ARMENIAN, - HB_SCRIPT_HEBREW, - HB_SCRIPT_ARABIC, - HB_SCRIPT_SYRIAC, - HB_SCRIPT_THAANA, - HB_SCRIPT_DEVANAGARI, - HB_SCRIPT_BENGALI, - HB_SCRIPT_GURMUKHI, - HB_SCRIPT_GUJARATI, - HB_SCRIPT_ORIYA, - HB_SCRIPT_TAMIL, - HB_SCRIPT_TELUGU, - HB_SCRIPT_KANNADA, - HB_SCRIPT_MALAYALAM, - HB_SCRIPT_SINHALA, - HB_SCRIPT_THAI, - HB_SCRIPT_LAO, - HB_SCRIPT_TIBETAN, - HB_SCRIPT_MYANMAR, - HB_SCRIPT_GEORGIAN, - HB_SCRIPT_HANGUL, - HB_SCRIPT_ETHIOPIC, - HB_SCRIPT_CHEROKEE, - HB_SCRIPT_CANADIAN_SYLLABICS, - HB_SCRIPT_OGHAM, - HB_SCRIPT_RUNIC, - HB_SCRIPT_KHMER, - HB_SCRIPT_MONGOLIAN, - HB_SCRIPT_HIRAGANA, - HB_SCRIPT_KATAKANA, - HB_SCRIPT_BOPOMOFO, - HB_SCRIPT_HAN, - HB_SCRIPT_YI, - HB_SCRIPT_OLD_ITALIC, - HB_SCRIPT_GOTHIC, - HB_SCRIPT_DESERET, - HB_SCRIPT_INHERITED, - HB_SCRIPT_TAGALOG, - HB_SCRIPT_HANUNOO, - HB_SCRIPT_BUHID, - HB_SCRIPT_TAGBANWA, - HB_SCRIPT_LIMBU, - HB_SCRIPT_TAI_LE, - HB_SCRIPT_LINEAR_B, - HB_SCRIPT_UGARITIC, - HB_SCRIPT_SHAVIAN, - HB_SCRIPT_OSMANYA, - HB_SCRIPT_CYPRIOT, - HB_SCRIPT_BRAILLE, - HB_SCRIPT_BUGINESE, - HB_SCRIPT_COPTIC, - HB_SCRIPT_NEW_TAI_LUE, - HB_SCRIPT_GLAGOLITIC, - HB_SCRIPT_TIFINAGH, - HB_SCRIPT_SYLOTI_NAGRI, - HB_SCRIPT_OLD_PERSIAN, - HB_SCRIPT_KHAROSHTHI, - HB_SCRIPT_BALINESE, - HB_SCRIPT_CUNEIFORM, - HB_SCRIPT_PHOENICIAN, - HB_SCRIPT_PHAGS_PA, - HB_SCRIPT_NKO, - HB_SCRIPT_SUNDANESE, - HB_SCRIPT_LEPCHA, - HB_SCRIPT_OL_CHIKI, - HB_SCRIPT_VAI, - HB_SCRIPT_SAURASHTRA, - HB_SCRIPT_KAYAH_LI, - HB_SCRIPT_REJANG, - HB_SCRIPT_LYCIAN, - HB_SCRIPT_CARIAN, - HB_SCRIPT_LYDIAN, - HB_SCRIPT_CHAM, - HB_SCRIPT_TAI_THAM, - HB_SCRIPT_TAI_VIET, - HB_SCRIPT_AVESTAN, - HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, - HB_SCRIPT_SAMARITAN, - HB_SCRIPT_LISU, - HB_SCRIPT_BAMUM, - HB_SCRIPT_JAVANESE, - HB_SCRIPT_MEETEI_MAYEK, - HB_SCRIPT_IMPERIAL_ARAMAIC, - HB_SCRIPT_OLD_SOUTH_ARABIAN, - HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, - HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, - HB_SCRIPT_OLD_TURKIC, - HB_SCRIPT_KAITHI, - HB_SCRIPT_BATAK, - HB_SCRIPT_BRAHMI, - HB_SCRIPT_MANDAIC, - HB_SCRIPT_CHAKMA, - HB_SCRIPT_MEROITIC_CURSIVE, - HB_SCRIPT_MEROITIC_HIEROGLYPHS, - HB_SCRIPT_MIAO, - HB_SCRIPT_SHARADA, - HB_SCRIPT_SORA_SOMPENG, - HB_SCRIPT_TAKRI, - HB_SCRIPT_UNKNOWN, - HB_SCRIPT_BASSA_VAH, - HB_SCRIPT_CAUCASIAN_ALBANIAN, - HB_SCRIPT_DUPLOYAN, - HB_SCRIPT_ELBASAN, - HB_SCRIPT_GRANTHA, - HB_SCRIPT_KHOJKI, - HB_SCRIPT_KHUDAWADI, - HB_SCRIPT_LINEAR_A, - HB_SCRIPT_MAHAJANI, - HB_SCRIPT_MANICHAEAN, - HB_SCRIPT_MENDE_KIKAKUI, - HB_SCRIPT_MODI, - HB_SCRIPT_MRO, - HB_SCRIPT_NABATAEAN, - HB_SCRIPT_OLD_NORTH_ARABIAN, - HB_SCRIPT_OLD_PERMIC, - HB_SCRIPT_PAHAWH_HMONG, - HB_SCRIPT_PALMYRENE, - HB_SCRIPT_PAU_CIN_HAU, - HB_SCRIPT_PSALTER_PAHLAVI, - HB_SCRIPT_SIDDHAM, - HB_SCRIPT_TIRHUTA, - HB_SCRIPT_WARANG_CITI, - HB_SCRIPT_AHOM, - HB_SCRIPT_ANATOLIAN_HIEROGLYPHS, - HB_SCRIPT_HATRAN, - HB_SCRIPT_MULTANI, - HB_SCRIPT_OLD_HUNGARIAN, - HB_SCRIPT_SIGNWRITING, - HB_SCRIPT_ADLAM, - HB_SCRIPT_BHAIKSUKI, - HB_SCRIPT_MARCHEN, - HB_SCRIPT_NEWA, - HB_SCRIPT_OSAGE, - HB_SCRIPT_TANGUT, - HB_SCRIPT_MASARAM_GONDI, - HB_SCRIPT_NUSHU, - HB_SCRIPT_SOYOMBO, - HB_SCRIPT_ZANABAZAR_SQUARE, - HB_SCRIPT_DOGRA, - HB_SCRIPT_GUNJALA_GONDI, - HB_SCRIPT_HANIFI_ROHINGYA, - HB_SCRIPT_MAKASAR, - HB_SCRIPT_MEDEFAIDRIN, - HB_SCRIPT_OLD_SOGDIAN, - HB_SCRIPT_SOGDIAN, - HB_SCRIPT_ELYMAIC, - HB_SCRIPT_NANDINAGARI, - HB_SCRIPT_NYIAKENG_PUACHUE_HMONG, - HB_SCRIPT_WANCHO, -}; - -static hb_unicode_combining_class_t -hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode); -} - -static hb_unicode_general_category_t -hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return (hb_unicode_general_category_t)ucdn_get_general_category(unicode); -} - -static hb_codepoint_t -hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return ucdn_mirror(unicode); -} - -static hb_script_t -hb_ucdn_script(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return ucdn_script_translate[ucdn_get_script(unicode)]; -} - -static hb_bool_t -hb_ucdn_compose(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, - void *user_data HB_UNUSED) -{ - return ucdn_compose(ab, a, b); -} - -static hb_bool_t -hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, - void *user_data HB_UNUSED) -{ - return ucdn_decompose(ab, a, b); -} - - -#if HB_USE_ATEXIT -static void free_static_ucdn_funcs (); -#endif - -static struct hb_ucdn_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_ucdn_unicode_funcs_lazy_loader_t> -{ - static hb_unicode_funcs_t *create () - { - hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr); - - hb_unicode_funcs_set_combining_class_func (funcs, hb_ucdn_combining_class, nullptr, nullptr); - hb_unicode_funcs_set_general_category_func (funcs, hb_ucdn_general_category, nullptr, nullptr); - hb_unicode_funcs_set_mirroring_func (funcs, hb_ucdn_mirroring, nullptr, nullptr); - hb_unicode_funcs_set_script_func (funcs, hb_ucdn_script, nullptr, nullptr); - hb_unicode_funcs_set_compose_func (funcs, hb_ucdn_compose, nullptr, nullptr); - hb_unicode_funcs_set_decompose_func (funcs, hb_ucdn_decompose, nullptr, nullptr); - - hb_unicode_funcs_make_immutable (funcs); - -#if HB_USE_ATEXIT - atexit (free_static_ucdn_funcs); -#endif - - return funcs; - } -} static_ucdn_funcs; - -#if HB_USE_ATEXIT -static -void free_static_ucdn_funcs () -{ - static_ucdn_funcs.free_instance (); -} -#endif - -extern "C" HB_INTERNAL -hb_unicode_funcs_t * -hb_ucdn_get_unicode_funcs (); - -hb_unicode_funcs_t * -hb_ucdn_get_unicode_funcs () -{ - return static_ucdn_funcs.get_unconst (); -} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc index 4ac521d38cf..9ec2d85634d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc @@ -60,6 +60,7 @@ hb_unicode_combining_class_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, return HB_UNICODE_COMBINING_CLASS_NOT_REORDERED; } +#ifndef HB_DISABLE_DEPRECATED static unsigned int hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t unicode HB_UNUSED, @@ -67,6 +68,7 @@ hb_unicode_eastasian_width_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, { return 1; } +#endif static hb_unicode_general_category_t hb_unicode_general_category_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, @@ -113,6 +115,7 @@ hb_unicode_decompose_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, } +#ifndef HB_DISABLE_DEPRECATED static unsigned int hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t u HB_UNUSED, @@ -121,20 +124,21 @@ hb_unicode_decompose_compatibility_nil (hb_unicode_funcs_t *ufuncs HB_UNUSED { return 0; } +#endif +extern "C" hb_unicode_funcs_t *hb_ucd_get_unicode_funcs (); extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (); extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (); -extern "C" hb_unicode_funcs_t *hb_ucdn_get_unicode_funcs (); hb_unicode_funcs_t * hb_unicode_funcs_get_default () { -#if defined(HAVE_UCDN) - return hb_ucdn_get_unicode_funcs (); -#elif defined(HAVE_GLIB) +#if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD) + return hb_ucd_get_unicode_funcs (); +#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB) return hb_glib_get_unicode_funcs (); -#elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN) +#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN) return hb_icu_get_unicode_funcs (); #else #define HB_UNICODE_FUNCS_NIL 1 @@ -144,7 +148,7 @@ hb_unicode_funcs_get_default () #if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL) #error "Could not find any Unicode functions implementation, you have to provide your own" -#error "Consider building hb-ucdn.c. If you absolutely want to build without any, check the code." +#error "Consider building hb-ucd.cc. If you absolutely want to build without any, check the code." #endif /** @@ -425,6 +429,7 @@ hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, return ufuncs->decompose (ab, a, b); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_unicode_decompose_compatibility: * @ufuncs: Unicode functions. @@ -445,6 +450,7 @@ hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, { return ufuncs->decompose_compatibility (u, decomposed); } +#endif /* See hb-unicode.hh for details. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh index 82ebb106472..80624c0ec3d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh @@ -42,19 +42,19 @@ extern HB_INTERNAL const uint8_t _hb_modified_combining_class[256]; #define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS \ HB_UNICODE_FUNC_IMPLEMENT (combining_class) \ - HB_UNICODE_FUNC_IMPLEMENT (eastasian_width) \ + HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (eastasian_width)) \ HB_UNICODE_FUNC_IMPLEMENT (general_category) \ HB_UNICODE_FUNC_IMPLEMENT (mirroring) \ HB_UNICODE_FUNC_IMPLEMENT (script) \ HB_UNICODE_FUNC_IMPLEMENT (compose) \ HB_UNICODE_FUNC_IMPLEMENT (decompose) \ - HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility) \ + HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility)) \ /* ^--- Add new callbacks here */ /* Simple callbacks are those taking a hb_codepoint_t and returning a hb_codepoint_t */ #define HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE \ HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_combining_class_t, combining_class) \ - HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width) \ + HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (unsigned int, eastasian_width)) \ HB_UNICODE_FUNC_IMPLEMENT (hb_unicode_general_category_t, general_category) \ HB_UNICODE_FUNC_IMPLEMENT (hb_codepoint_t, mirroring) \ HB_UNICODE_FUNC_IMPLEMENT (hb_script_t, script) \ @@ -89,7 +89,11 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE unsigned int decompose_compatibility (hb_codepoint_t u, hb_codepoint_t *decomposed) { +#ifdef HB_DISABLE_DEPRECATED + unsigned int ret = 0; +#else unsigned int ret = func.decompose_compatibility (this, u, decomposed, user_data.decompose_compatibility); +#endif if (ret == 1 && u == decomposed[0]) { decomposed[0] = 0; return 0; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc index 31c50dfeb7b..f97ed91fcc0 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc @@ -283,7 +283,7 @@ struct active_feature_t { OPENTYPE_FEATURE_RECORD rec; unsigned int order; - static int cmp (const void *pa, const void *pb) { + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const active_feature_t *a = (const active_feature_t *) pa; const active_feature_t *b = (const active_feature_t *) pb; return a->rec.tagFeature < b->rec.tagFeature ? -1 : a->rec.tagFeature > b->rec.tagFeature ? 1 : @@ -300,7 +300,7 @@ struct feature_event_t { bool start; active_feature_t feature; - static int cmp (const void *pa, const void *pb) + HB_INTERNAL static int cmp (const void *pa, const void *pb) { const feature_event_t *a = (const feature_event_t *) pa; const feature_event_t *b = (const feature_event_t *) pb; @@ -396,18 +396,18 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name) memcpy(new_sfnt_data, orig_sfnt_data, length); OT::name &name = StructAtOffset<OT::name> (new_sfnt_data, name_table_offset); - name.format.set (0); - name.count.set (ARRAY_LENGTH (name_IDs)); - name.stringOffset.set (name.get_size ()); + name.format = 0; + name.count = ARRAY_LENGTH (name_IDs); + name.stringOffset = name.get_size (); for (unsigned int i = 0; i < ARRAY_LENGTH (name_IDs); i++) { OT::NameRecord &record = name.nameRecordZ[i]; - record.platformID.set (3); - record.encodingID.set (1); - record.languageID.set (0x0409u); /* English */ - record.nameID.set (name_IDs[i]); - record.length.set (name_str_len * 2); - record.offset.set (0); + record.platformID = 3; + record.encodingID = 1; + record.languageID = 0x0409u; /* English */ + record.nameID = name_IDs[i]; + record.length = name_str_len * 2; + record.offset = 0; } /* Copy string data from new_name, converting wchar_t to UTF16BE. */ @@ -431,8 +431,8 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name) { OT::TableRecord &record = const_cast<OT::TableRecord &> (face.get_table (index)); record.checkSum.set_for_data (&name, padded_name_table_length); - record.offset.set (name_table_offset); - record.length.set (name_table_length); + record.offset = name_table_offset; + record.length = name_table_length; } else if (face_index == 0) /* Fail if first face doesn't have 'name' table. */ { @@ -698,7 +698,7 @@ _hb_uniscribe_shape (hb_shape_plan_t *shape_plan, { active_feature_t *feature = active_features.find (&event->feature); if (feature) - active_features.remove (feature - active_features.arrayZ ()); + active_features.remove (feature - active_features.arrayZ); } } @@ -728,12 +728,12 @@ retry: #define ALLOCATE_ARRAY(Type, name, len) \ Type *name = (Type *) scratch; \ - { \ + do { \ unsigned int _consumed = DIV_CEIL ((len) * sizeof (Type), sizeof (*scratch)); \ assert (_consumed <= scratch_size); \ scratch += _consumed; \ scratch_size -= _consumed; \ - } + } while (0) #define utf16_index() var1.u32 @@ -889,8 +889,8 @@ retry: &items[i].a, script_tags[i], language_tag, - range_char_counts.arrayZ (), - range_properties.arrayZ (), + range_char_counts.arrayZ, + range_properties.arrayZ, range_properties.length, pchars + chars_offset, item_chars_len, @@ -930,8 +930,8 @@ retry: &items[i].a, script_tags[i], language_tag, - range_char_counts.arrayZ (), - range_properties.arrayZ (), + range_char_counts.arrayZ, + range_properties.arrayZ, range_properties.length, pchars + chars_offset, log_clusters + chars_offset, @@ -967,7 +967,7 @@ retry: vis_clusters[i] = (uint32_t) -1; for (unsigned int i = 0; i < buffer->len; i++) { uint32_t *p = &vis_clusters[log_clusters[buffer->info[i].utf16_index()]]; - *p = MIN (*p, buffer->info[i].cluster); + *p = hb_min (*p, buffer->info[i].cluster); } for (unsigned int i = 1; i < glyphs_len; i++) if (vis_clusters[i] == (uint32_t) -1) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh index 2fd739b5c1f..de16c97ddfa 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh @@ -38,61 +38,109 @@ struct hb_vector_t typedef Type item_t; static constexpr unsigned item_size = hb_static_size (Type); - HB_NO_COPY_ASSIGN_TEMPLATE (hb_vector_t, Type); hb_vector_t () { init (); } + hb_vector_t (const hb_vector_t &o) + { + init (); + alloc (o.length); + hb_copy (o, *this); + } + hb_vector_t (hb_vector_t &&o) + { + allocated = o.allocated; + length = o.length; + arrayZ = o.arrayZ; + o.init (); + } ~hb_vector_t () { fini (); } - unsigned int length; private: int allocated; /* == -1 means allocation failed. */ - Type *arrayZ_; public: + unsigned int length; + public: + Type *arrayZ; void init () { allocated = length = 0; - arrayZ_ = nullptr; + arrayZ = nullptr; } void fini () { - if (arrayZ_) - free (arrayZ_); + free (arrayZ); init (); } void fini_deep () { - Type *array = arrayZ(); unsigned int count = length; for (unsigned int i = 0; i < count; i++) - array[i].fini (); + arrayZ[i].fini (); + fini (); + } + + void reset () { resize (0); } + + hb_vector_t& operator = (const hb_vector_t &o) + { + reset (); + alloc (o.length); + hb_copy (o, *this); + return *this; + } + hb_vector_t& operator = (hb_vector_t &&o) + { fini (); + allocated = o.allocated; + length = o.length; + arrayZ = o.arrayZ; + o.init (); + return *this; } - const Type * arrayZ () const { return arrayZ_; } - Type * arrayZ () { return arrayZ_; } + hb_bytes_t as_bytes () const + { return hb_bytes_t ((const char *) arrayZ, length * item_size); } + + bool operator == (const hb_vector_t &o) const { return as_array () == o.as_array (); } + bool operator != (const hb_vector_t &o) const { return !(*this == o); } + uint32_t hash () const { return as_array ().hash (); } Type& operator [] (int i_) { unsigned int i = (unsigned int) i_; if (unlikely (i >= length)) return Crap (Type); - return arrayZ()[i]; + return arrayZ[i]; } const Type& operator [] (int i_) const { unsigned int i = (unsigned int) i_; if (unlikely (i >= length)) return Null(Type); - return arrayZ()[i]; + return arrayZ[i]; } - explicit_operator bool () const { return length; } + Type& tail () { return (*this)[length - 1]; } + const Type& tail () const { return (*this)[length - 1]; } - hb_array_t<Type> as_array () - { return hb_array (arrayZ(), length); } - hb_array_t<const Type> as_array () const - { return hb_array (arrayZ(), length); } + explicit operator bool () const { return length; } + unsigned get_size () const { return length * item_size; } + + /* Sink interface. */ + template <typename T> + hb_vector_t& operator << (T&& v) { push (hb_forward<T> (v)); return *this; } + + hb_array_t< Type> as_array () { return hb_array (arrayZ, length); } + hb_array_t<const Type> as_array () const { return hb_array (arrayZ, length); } + + /* Iterator. */ + typedef hb_array_t<const Type> iter_t; + typedef hb_array_t< Type> writer_t; + iter_t iter () const { return as_array (); } + writer_t writer () { return as_array (); } + operator iter_t () const { return iter (); } + operator writer_t () { return writer (); } hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const { return as_array ().sub_array (start_offset, count);} @@ -104,37 +152,27 @@ struct hb_vector_t { return as_array ().sub_array (start_offset, count);} hb_sorted_array_t<Type> as_sorted_array () - { return hb_sorted_array (arrayZ(), length); } + { return hb_sorted_array (arrayZ, length); } hb_sorted_array_t<const Type> as_sorted_array () const - { return hb_sorted_array (arrayZ(), length); } - - hb_array_t<const Type> sorted_sub_array (unsigned int start_offset, unsigned int count) const - { return as_sorted_array ().sorted_sub_array (start_offset, count);} - hb_array_t<const Type> sorted_sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const - { return as_sorted_array ().sorted_sub_array (start_offset, count);} - hb_array_t<Type> sorted_sub_array (unsigned int start_offset, unsigned int count) - { return as_sorted_array ().sorted_sub_array (start_offset, count);} - hb_array_t<Type> sorted_sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) - { return as_sorted_array ().sorted_sub_array (start_offset, count);} + { return hb_sorted_array (arrayZ, length); } - template <typename T> explicit_operator T * () { return arrayZ(); } - template <typename T> explicit_operator const T * () const { return arrayZ(); } - operator hb_array_t<Type> () { return as_array (); } - operator hb_array_t<const Type> () const { return as_array (); } + template <typename T> explicit operator T * () { return arrayZ; } + template <typename T> explicit operator const T * () const { return arrayZ; } - Type * operator + (unsigned int i) { return arrayZ() + i; } - const Type * operator + (unsigned int i) const { return arrayZ() + i; } + Type * operator + (unsigned int i) { return arrayZ + i; } + const Type * operator + (unsigned int i) const { return arrayZ + i; } Type *push () { if (unlikely (!resize (length + 1))) return &Crap(Type); - return &arrayZ()[length - 1]; + return &arrayZ[length - 1]; } - Type *push (const Type& v) + template <typename T> + Type *push (T&& v) { Type *p = push (); - *p = v; + *p = hb_forward<T> (v); return p; } @@ -161,7 +199,7 @@ struct hb_vector_t (new_allocated < (unsigned) allocated) || hb_unsigned_mul_overflows (new_allocated, sizeof (Type)); if (likely (!overflows)) - new_array = (Type *) realloc (arrayZ_, new_allocated * sizeof (Type)); + new_array = (Type *) realloc (arrayZ, new_allocated * sizeof (Type)); if (unlikely (!new_array)) { @@ -169,7 +207,7 @@ struct hb_vector_t return false; } - arrayZ_ = new_array; + arrayZ = new_array; allocated = new_allocated; return true; @@ -182,25 +220,24 @@ struct hb_vector_t return false; if (size > length) - memset (arrayZ() + length, 0, (size - length) * sizeof (*arrayZ())); + memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ)); length = size; return true; } - void pop () + Type pop () { - if (!length) return; - length--; + if (!length) return Null(Type); + return hb_move (arrayZ[--length]); /* Does this move actually work? */ } void remove (unsigned int i) { if (unlikely (i >= length)) return; - Type *array = arrayZ(); - memmove (static_cast<void *> (&array[i]), - static_cast<void *> (&array[i + 1]), + memmove (static_cast<void *> (&arrayZ[i]), + static_cast<void *> (&arrayZ[i + 1]), (length - i - 1) * sizeof (Type)); length--; } @@ -215,19 +252,17 @@ struct hb_vector_t template <typename T> Type *find (T v) { - Type *array = arrayZ(); for (unsigned int i = 0; i < length; i++) - if (array[i] == v) - return &array[i]; + if (arrayZ[i] == v) + return &arrayZ[i]; return nullptr; } template <typename T> const Type *find (T v) const { - const Type *array = arrayZ(); for (unsigned int i = 0; i < length; i++) - if (array[i] == v) - return &array[i]; + if (arrayZ[i] == v) + return &arrayZ[i]; return nullptr; } @@ -242,19 +277,34 @@ struct hb_vector_t template <typename T> const Type *lsearch (const T &x, const Type *not_found = nullptr) const { return as_array ().lsearch (x, not_found); } +}; + +template <typename Type> +struct hb_sorted_vector_t : hb_vector_t<Type> +{ + hb_sorted_array_t< Type> as_array () { return hb_sorted_array (this->arrayZ, this->length); } + hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->length); } + + /* Iterator. */ + typedef hb_sorted_array_t<const Type> const_iter_t; + typedef hb_sorted_array_t< Type> iter_t; + const_iter_t iter () const { return as_array (); } + const_iter_t citer () const { return as_array (); } + iter_t iter () { return as_array (); } + operator iter_t () { return iter (); } + operator const_iter_t () const { return iter (); } template <typename T> Type *bsearch (const T &x, Type *not_found = nullptr) - { return as_sorted_array ().bsearch (x, not_found); } + { return as_array ().bsearch (x, not_found); } template <typename T> const Type *bsearch (const T &x, const Type *not_found = nullptr) const - { return as_sorted_array ().bsearch (x, not_found); } + { return as_array ().bsearch (x, not_found); } template <typename T> bool bfind (const T &x, unsigned int *i = nullptr, hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE, unsigned int to_store = (unsigned int) -1) const - { return as_sorted_array ().bfind (x, i, not_found, to_store); } + { return as_array ().bfind (x, i, not_found, to_store); } }; - #endif /* HB_VECTOR_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-warning.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-warning.cc index 9fb41003808..60c7445b789 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-warning.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-warning.cc @@ -26,12 +26,12 @@ #include "hb.hh" -#if defined(HB_ATOMIC_INT_NIL) +#ifdef HB_ATOMIC_INT_NIL #error "Could not find any system to define atomic_int macros, library WILL NOT be thread-safe" #error "Check hb-atomic.hh for possible resolutions." #endif -#if defined(HB_MUTEX_IMPL_NIL) +#ifdef HB_MUTEX_IMPL_NIL #error "Could not find any system to define mutex macros, library WILL NOT be thread-safe" #error "Check hb-mutex.hh for possible resolutions." #endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh index ec24c1ae0f3..e6d22fe3b33 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh @@ -29,8 +29,9 @@ #ifndef HB_HH #define HB_HH + #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC -#if defined(_MSC_VER) +#ifdef _MSC_VER #pragma warning( disable: 4068 ) /* Unknown pragma */ #endif #if defined(__GNUC__) || defined(__clang__) @@ -65,9 +66,12 @@ #pragma GCC diagnostic error "-Wcast-align" #pragma GCC diagnostic error "-Wcast-function-type" #pragma GCC diagnostic error "-Wdelete-non-virtual-dtor" +#pragma GCC diagnostic error "-Wdouble-promotion" +#pragma GCC diagnostic error "-Wextra-semi-stmt" #pragma GCC diagnostic error "-Wformat-security" #pragma GCC diagnostic error "-Wimplicit-function-declaration" #pragma GCC diagnostic error "-Winit-self" +#pragma GCC diagnostic error "-Winjected-class-name" #pragma GCC diagnostic error "-Wmissing-braces" #pragma GCC diagnostic error "-Wmissing-declarations" #pragma GCC diagnostic error "-Wmissing-prototypes" @@ -93,6 +97,7 @@ /* Warning. To be investigated if happens. */ #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_WARNING #pragma GCC diagnostic warning "-Wbuiltin-macro-redefined" +#pragma GCC diagnostic warning "-Wdeprecated" #pragma GCC diagnostic warning "-Wdisabled-optimization" #pragma GCC diagnostic warning "-Wformat=2" #pragma GCC diagnostic warning "-Wignored-pragma-optimize" @@ -120,14 +125,15 @@ #pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang #pragma GCC diagnostic ignored "-Wstrict-aliasing" #pragma GCC diagnostic ignored "-Wtype-limits" +#pragma GCC diagnostic ignored "-Wc++11-compat" // only gcc raises it #endif #endif #endif -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif + +#include "hb-config.hh" + /* * Following added based on what AC_USE_SYSTEM_EXTENSIONS adds to @@ -166,8 +172,7 @@ #include "hb-aat.h" #define HB_AAT_H_IN -#include "hb-aat.h" - +#include <limits.h> #include <math.h> #include <stdlib.h> #include <stddef.h> @@ -200,7 +205,7 @@ extern "C" void hb_free_impl(void *ptr); #define realloc hb_realloc_impl #define free hb_free_impl -#if defined(hb_memalign_impl) +#ifdef hb_memalign_impl extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size); #define posix_memalign hb_memalign_impl #else @@ -214,59 +219,6 @@ extern "C" int hb_memalign_impl(void **memptr, size_t alignment, size_t size); * Compiler attributes */ -/* https://github.com/harfbuzz/harfbuzz/issues/1634 */ -#if __cplusplus < 201103L && !defined(_MSC_VER) - -#ifndef nullptr -#define nullptr NULL -#endif - -#ifndef constexpr -#define constexpr const -#endif - -#ifndef static_assert -#define static_assert(e, msg) \ - HB_UNUSED typedef int HB_PASTE(static_assertion_failed_at_line_, __LINE__) [(e) ? 1 : -1] -#endif // static_assert - -#if defined(__GNUC__) -#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)) -#define thread_local __thread -#endif -#else -#define thread_local -#endif - -template <typename T> -struct _hb_alignof -{ - struct s - { - char c; - T t; - }; - static constexpr size_t value = offsetof (s, t); -}; -#ifndef alignof -#define alignof(x) (_hb_alignof<x>::value) -#endif - -/* https://github.com/harfbuzz/harfbuzz/issues/1127 */ -#ifndef explicit_operator -#define explicit_operator operator -#endif - -#else /* __cplusplus >= 201103L */ - -/* https://github.com/harfbuzz/harfbuzz/issues/1127 */ -#ifndef explicit_operator -#define explicit_operator explicit operator -#endif - -#endif /* __cplusplus < 201103L */ - - #if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__) #define likely(expr) (__builtin_expect (!!(expr), 1)) #define unlikely(expr) (__builtin_expect (!!(expr), 0)) @@ -312,6 +264,13 @@ struct _hb_alignof # endif #endif +/* https://github.com/harfbuzz/harfbuzz/issues/1651 */ +#if defined(__clang__) && __clang_major__ < 10 +#define static_const static +#else +#define static_const static const +#endif + #if defined(__GNUC__) && (__GNUC__ >= 3) #define HB_FUNC __PRETTY_FUNCTION__ #elif defined(_MSC_VER) @@ -358,7 +317,7 @@ struct _hb_alignof # define HB_FALLTHROUGH /* FALLTHROUGH */ #endif -#if defined(__clang__) +#ifdef __clang__ /* Disable certain sanitizer errors. */ /* https://github.com/harfbuzz/harfbuzz/issues/1247 */ #define HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW __attribute__((no_sanitize("signed-integer-overflow"))) @@ -389,19 +348,27 @@ struct _hb_alignof # if defined(_WIN32_WCE) /* Some things not defined on Windows CE. */ # define vsnprintf _vsnprintf -# define getenv(Name) nullptr +# ifndef HB_NO_GETENV +# define HB_NO_GETENV +# endif # if _WIN32_WCE < 0x800 # define setlocale(Category, Locale) "C" static int errno = 0; /* Use something better? */ # endif # elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) -# define getenv(Name) nullptr +# ifndef HB_NO_GETENV +# define HB_NO_GETENV +# endif # endif # if defined(_MSC_VER) && _MSC_VER < 1900 # define snprintf _snprintf # endif #endif +#ifdef HB_NO_GETENV +#define getenv(Name) nullptr +#endif + #if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT) /* atexit() is only safe to be called from shared libraries on certain * platforms. Whitelist. @@ -460,45 +427,13 @@ static_assert ((sizeof (hb_position_t) == 4), ""); static_assert ((sizeof (hb_mask_t) == 4), ""); static_assert ((sizeof (hb_var_int_t) == 4), ""); - -#if __cplusplus >= 201103L - -/* We only enable these with C++11 or later, since earlier language - * does not allow structs with constructors in unions, and we need - * those. */ - -#define HB_NO_COPY_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) -#define HB_NO_COPY_ASSIGN_TEMPLATE(TypeName, T) \ - TypeName(const TypeName<T>&); \ - void operator=(const TypeName<T>&) -#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \ - TypeName(const TypeName<T1, T2>&); \ - void operator=(const TypeName<T1, T2>&) -#define HB_NO_CREATE_COPY_ASSIGN(TypeName) \ - TypeName(); \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) -#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE(TypeName, T) \ - TypeName(); \ - TypeName(const TypeName<T>&); \ - void operator=(const TypeName<T>&) -#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \ - TypeName(); \ - TypeName(const TypeName<T1, T2>&); \ - void operator=(const TypeName<T1, T2>&) - -#else /* __cpluspplus >= 201103L */ - -#define HB_NO_COPY_ASSIGN(TypeName) static_assert (true, "") -#define HB_NO_COPY_ASSIGN_TEMPLATE(TypeName, T) static_assert (true, "") -#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) static_assert (true, "") -#define HB_NO_CREATE_COPY_ASSIGN(TypeName) static_assert (true, "") -#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE(TypeName, T) static_assert (true, "") -#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) static_assert (true, "") - -#endif /* __cpluspplus >= 201103L */ +#define HB_DELETE_COPY_ASSIGN(TypeName) \ + TypeName(const TypeName&) = delete; \ + void operator=(const TypeName&) = delete +#define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) \ + TypeName() = delete; \ + TypeName(const TypeName&) = delete; \ + void operator=(const TypeName&) = delete /* @@ -512,12 +447,12 @@ static_assert ((sizeof (hb_var_int_t) == 4), ""); * * https://bugs.chromium.org/p/chromium/issues/detail?id=860184 */ -#if !defined(HB_VECTOR_SIZE) +#ifndef HB_VECTOR_SIZE # define HB_VECTOR_SIZE 0 #endif /* The `vector_size' attribute was introduced in gcc 3.1. */ -#if !defined(HB_VECTOR_SIZE) +#ifndef HB_VECTOR_SIZE # if defined( __GNUC__ ) && ( __GNUC__ >= 4 ) # define HB_VECTOR_SIZE 128 # else @@ -533,16 +468,6 @@ typedef uint64_t hb_vector_size_impl_t; #endif -/* HB_NDEBUG disables some sanity checks that are very safe to disable and - * should be disabled in production systems. If NDEBUG is defined, enable - * HB_NDEBUG; but if it's desirable that normal assert()s (which are very - * light-weight) to be enabled, then HB_DEBUG can be defined to disable - * the costlier checks. */ -#ifdef NDEBUG -#define HB_NDEBUG 1 -#endif - - /* Flags */ /* Enable bitwise ops on enums marked as flags_t */ @@ -624,6 +549,95 @@ _hb_memalign(void **memptr, size_t alignment, size_t size) /* + * Big-endian integers. Here because fundamental. + */ + +template <typename Type, int Bytes> struct BEInt; + +template <typename Type> +struct BEInt<Type, 1> +{ + public: + BEInt<Type, 1>& operator = (Type V) + { + v = V; + return *this; + } + operator Type () const { return v; } + private: uint8_t v; +}; +template <typename Type> +struct BEInt<Type, 2> +{ + public: + BEInt<Type, 2>& operator = (Type V) + { + v[0] = (V >> 8) & 0xFF; + v[1] = (V ) & 0xFF; + return *this; + } + operator Type () const + { +#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \ + defined(__BYTE_ORDER) && \ + (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN) + /* Spoon-feed the compiler a big-endian integer with alignment 1. + * https://github.com/harfbuzz/harfbuzz/pull/1398 */ + struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; +#if __BYTE_ORDER == __LITTLE_ENDIAN + return __builtin_bswap16 (((packed_uint16_t *) this)->v); +#else /* __BYTE_ORDER == __BIG_ENDIAN */ + return ((packed_uint16_t *) this)->v; +#endif +#endif + return (v[0] << 8) + + (v[1] ); + } + private: uint8_t v[2]; +}; +template <typename Type> +struct BEInt<Type, 3> +{ + public: + BEInt<Type, 3>& operator = (Type V) + { + v[0] = (V >> 16) & 0xFF; + v[1] = (V >> 8) & 0xFF; + v[2] = (V ) & 0xFF; + return *this; + } + operator Type () const + { + return (v[0] << 16) + + (v[1] << 8) + + (v[2] ); + } + private: uint8_t v[3]; +}; +template <typename Type> +struct BEInt<Type, 4> +{ + public: + BEInt<Type, 4>& operator = (Type V) + { + v[0] = (V >> 24) & 0xFF; + v[1] = (V >> 16) & 0xFF; + v[2] = (V >> 8) & 0xFF; + v[3] = (V ) & 0xFF; + return *this; + } + operator Type () const + { + return (v[0] << 24) + + (v[1] << 16) + + (v[2] << 8) + + (v[3] ); + } + private: uint8_t v[4]; +}; + + +/* * For lack of a better place, put Zawgyi script hack here. * https://github.com/harfbuzz/harfbuzz/issues/1162 */ @@ -631,28 +645,17 @@ _hb_memalign(void **memptr, size_t alignment, size_t size) #define HB_SCRIPT_MYANMAR_ZAWGYI ((hb_script_t) HB_TAG ('Q','a','a','g')) -/* Some really basic things everyone wants. */ -template <typename T> struct hb_remove_const { typedef T value; }; -template <typename T> struct hb_remove_const<const T> { typedef T value; }; -#define hb_remove_const(T) hb_remove_const<T>::value -template <typename T> struct hb_remove_reference { typedef T value; }; -template <typename T> struct hb_remove_reference<T &> { typedef T value; }; -#define hb_remove_reference(T) hb_remove_reference<T>::value -template <typename T> struct hb_remove_pointer { typedef T value; }; -template <typename T> struct hb_remove_pointer<T *> { typedef T value; }; -#define hb_remove_pointer(T) hb_remove_pointer<T>::value - - /* Headers we include for everyone. Keep topologically sorted by dependency. * They express dependency amongst themselves, but no other file should include * them directly.*/ -#include "hb-atomic.hh" +#include "hb-meta.hh" #include "hb-mutex.hh" -#include "hb-null.hh" -#include "hb-dsalgs.hh" // Requires: hb-null -#include "hb-iter.hh" // Requires: hb-null -#include "hb-debug.hh" // Requires: hb-atomic hb-dsalgs -#include "hb-array.hh" // Requires: hb-dsalgs hb-iter hb-null +#include "hb-atomic.hh" // Requires: hb-meta +#include "hb-null.hh" // Requires: hb-meta +#include "hb-algs.hh" // Requires: hb-meta hb-null +#include "hb-iter.hh" // Requires: hb-algs hb-meta +#include "hb-debug.hh" // Requires: hb-algs hb-atomic +#include "hb-array.hh" // Requires: hb-algs hb-iter hb-null #include "hb-vector.hh" // Requires: hb-array hb-null #include "hb-object.hh" // Requires: hb-atomic hb-mutex hb-vector diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-algs.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-algs.cc new file mode 100644 index 00000000000..333a892429d --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-algs.cc @@ -0,0 +1,91 @@ +/* + * Copyright © 2019 Facebook, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Facebook Author(s): Behdad Esfahbod + */ + +#include "hb.hh" +#include "hb-algs.hh" + + +static char * +test_func (int a, char **b) +{ + return b ? b[a] : nullptr; +} + +struct A +{ + void a () {} +}; + +int +main (int argc, char **argv) +{ + int i = 1; + auto p = hb_pair (1, i); + + p.second = 2; + assert (i == 2); + + const int c = 3; + auto pc = hb_pair (1, c); + assert (pc.second == 3); + + auto q = p; + assert (&q != &p); + q.second = 4; + assert (i == 4); + + hb_invoke (test_func, 0, nullptr); + + A a; + hb_invoke (&A::a, a); + + assert (1 == hb_min (8, 1)); + assert (8 == hb_max (8, 1)); + + int x = 1, y = 2; + hb_min (x, 3); + hb_min (3, x); + hb_min (x, 4 + 3); + int &z = hb_min (x, y); + z = 3; + assert (x == 3); + + hb_pair_t<const int*, int> xp = hb_pair_t<int *, long> (nullptr, 0); + xp = hb_pair_t<int *, double> (nullptr, 1); + xp = hb_pair_t<const int*, int> (nullptr, 1); + + assert (3 == hb_partial (hb_min, 3) (4)); + assert (3 == hb_partial<1> (hb_min, 4) (3)); + + auto M0 = hb_partial<2> (hb_max, 0); + assert (M0 (-2) == 0); + assert (M0 (+2) == 2); + + assert (hb_add (2) (5) == 7); + assert (hb_add (5) (2) == 7); + + return 0; +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-size-params.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gpos-size-params.cc index 12eec618838..12eec618838 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-size-params.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gpos-size-params.cc diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-would-substitute.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gsub-would-substitute.cc index 268f7db9805..268f7db9805 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-would-substitute.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gsub-would-substitute.cc diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-iter.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-iter.cc index 05430b009c7..156a5fcadda 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-iter.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-iter.cc @@ -29,19 +29,21 @@ #include "hb-array.hh" #include "hb-set.hh" +#include "hb-ot-layout-common.hh" template <typename T> -struct array_iter_t : hb_iter_t<array_iter_t<T>, T>, hb_iter_mixin_t<array_iter_t<T>, T> +struct array_iter_t : hb_iter_with_fallback_t<array_iter_t<T>, T&> { array_iter_t (hb_array_t<T> arr_) : arr (arr_) {} - typedef T __item_type__; + typedef T& __item_t__; + static constexpr bool is_random_access_iterator = true; T& __item_at__ (unsigned i) const { return arr[i]; } void __forward__ (unsigned n) { arr += n; } void __rewind__ (unsigned n) { arr -= n; } unsigned __len__ () const { return arr.length; } - bool __random_access__ () const { return true; } + bool operator != (const array_iter_t& o) { return arr != o.arr; } private: hb_array_t<T> arr; @@ -55,12 +57,63 @@ struct some_array_t typedef array_iter_t<T> iter_t; array_iter_t<T> iter () { return array_iter_t<T> (arr); } operator array_iter_t<T> () { return iter (); } - operator hb_iter_t<array_iter_t<T> > () { return iter (); } + operator hb_iter_t<array_iter_t<T>> () { return iter (); } private: hb_array_t<T> arr; }; + +template <typename Iter, + hb_requires (hb_is_iterator (Iter))> +static void +test_iterator_non_default_constructable (Iter it) +{ + /* Iterate over a copy of it. */ + for (auto c = it.iter (); c; c++) + *c; + + /* Same. */ + for (auto c = +it; c; c++) + *c; + + /* Range-based for over a copy. */ + for (auto _ : +it) + (void) _; + + it += it.len (); + it = it + 10; + it = 10 + it; + + assert (*it == it[0]); + + static_assert (true || it.is_random_access_iterator, ""); + static_assert (true || it.is_sorted_iterator, ""); +} + +template <typename Iter, + hb_requires (hb_is_iterator (Iter))> +static void +test_iterator (Iter it) +{ + Iter default_constructed; + assert (!default_constructed); + + test_iterator_non_default_constructable (it); +} + +template <typename Iterable, + hb_requires (hb_is_iterable (Iterable))> +static void +test_iterable (const Iterable &lst = Null(Iterable)) +{ + for (auto _ : lst) + (void) _; + + // Test that can take iterator from. + test_iterator (lst.iter ()); +} + int main (int argc, char **argv) { @@ -72,13 +125,157 @@ main (int argc, char **argv) array_iter_t<const int> s2 (v); /* Implicit conversion from vector. */ array_iter_t<int> t (dst); + static_assert (array_iter_t<int>::is_random_access_iterator, ""); + some_array_t<const int> a (src); s2 = s; + hb_iter (src); + hb_iter (src, 2); + hb_fill (t, 42); - hb_copy (t, s); - // hb_copy (t, a.iter ()); + hb_copy (s, t); + hb_copy (a.iter (), t); + + test_iterable (v); + hb_set_t st; + st << 1 << 15 << 43; + test_iterable (st); + hb_sorted_array_t<int> sa; + (void) static_cast<hb_iter_t<hb_sorted_array_t<int>, hb_sorted_array_t<int>::item_t>&> (sa); + (void) static_cast<hb_iter_t<hb_sorted_array_t<int>, hb_sorted_array_t<int>::__item_t__>&> (sa); + (void) static_cast<hb_iter_t<hb_sorted_array_t<int>, int&>&>(sa); + (void) static_cast<hb_iter_t<hb_sorted_array_t<int>>&>(sa); + (void) static_cast<hb_iter_t<hb_array_t<int>, int&>&> (sa); + test_iterable (sa); + + test_iterable<hb_array_t<int>> (); + test_iterable<hb_sorted_array_t<const int>> (); + test_iterable<hb_vector_t<float>> (); + test_iterable<hb_set_t> (); + test_iterable<OT::Coverage> (); + + test_iterator (hb_zip (st, v)); + test_iterator_non_default_constructable (hb_enumerate (st)); + test_iterator_non_default_constructable (hb_enumerate (st, -5)); + test_iterator_non_default_constructable (hb_enumerate (hb_iter (st))); + test_iterator_non_default_constructable (hb_enumerate (hb_iter (st) + 1)); + test_iterator_non_default_constructable (hb_iter (st) | hb_filter ()); + test_iterator_non_default_constructable (hb_iter (st) | hb_map (hb_lidentity)); + + assert (true == hb_all (st)); + assert (false == hb_all (st, 42u)); + assert (true == hb_any (st)); + assert (false == hb_any (st, 14u)); + assert (true == hb_any (st, 14u, [] (unsigned _) { return _ - 1u; })); + assert (true == hb_any (st, [] (unsigned _) { return _ == 15u; })); + assert (true == hb_any (st, 15u)); + assert (false == hb_none (st)); + assert (false == hb_none (st, 15u)); + assert (true == hb_none (st, 17u)); + + hb_array_t<hb_vector_t<int>> pa; + pa->as_array (); + + hb_map_t m; + + hb_iter (st); + hb_iter (&st); + + + hb_iter (src) + | hb_map (m) + | hb_map (&m) + | hb_filter () + | hb_filter (st) + | hb_filter (&st) + | hb_filter (hb_bool) + | hb_filter (hb_bool, hb_identity) + | hb_sink (st) + ; + + + hb_iter (src) + | hb_sink (hb_array (dst)) + ; + + + hb_iter (src) + | hb_apply (&st) + ; + + + hb_iter (src) + | hb_map ([] (int i) { return 1; }) + | hb_reduce ([=] (int acc, int value) { return acc; }, 2) + ; + + using map_pair_t = hb_item_type<hb_map_t>; + + hb_iter (m) + | hb_map ([] (map_pair_t p) { return p.first * p.second; }) + ; + + m.keys (); + using map_key_t = decltype (*m.keys()); + + hb_iter (m.keys ()) + | hb_filter ([] (map_key_t k) { return k < 42; }) + | hb_drain + ; + + m.values (); + using map_value_t = decltype (*m.values()); + + hb_iter (m.values ()) + | hb_filter ([] (map_value_t k) { return k < 42; }) + | hb_drain + ; + + unsigned int temp1 = 10; + unsigned int temp2 = 0; + hb_map_t *result = + + hb_iter (src) + | hb_map ([&] (int i) -> hb_set_t * + { + hb_set_t *set = hb_set_create (); + for (unsigned int i = 0; i < temp1; ++i) + hb_set_add (set, i); + temp1++; + return set; + }) + | hb_reduce ([&] (hb_map_t *acc, hb_set_t *value) -> hb_map_t * + { + hb_map_set (acc, temp2++, hb_set_get_population (value)); + /* This is not a memory managed language, take care! */ + hb_set_destroy (value); + return acc; + }, hb_map_create ()) + ; + /* The result should be something like 0->10, 1->11, ..., 9->19 */ + assert (hb_map_get (result, 9) == 19); + + unsigned int temp3 = 0; + + hb_iter(src) + | hb_map([&] (int i) { return ++temp3; }) + | hb_reduce([&] (float acc, int value) { return acc + value; }, 0) + ; + hb_map_destroy (result); + + + hb_iter (src) + | hb_drain + ; + + t << 1; + long vl; + s >> vl; + + hb_iota (); + hb_iota (3); + hb_iota (3, 2); + hb_range (); + assert (hb_range (9).len () == 9); + assert (hb_range (2, 9).len () == 7); + assert (hb_range (2, 9, 3).len () == 3); + assert (hb_range (2, 8, 3).len () == 2); + assert (hb_range (2, 7, 3).len () == 2); + assert (hb_range (-2, -9, -3).len () == 3); + assert (hb_range (-2, -8, -3).len () == 2); + assert (hb_range (-2, -7, -3).len () == 2); return 0; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-meta.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-meta.cc new file mode 100644 index 00000000000..0b6e02c269c --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-meta.cc @@ -0,0 +1,128 @@ +/* + * Copyright © 2019 Facebook, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Facebook Author(s): Behdad Esfahbod + */ + +#include "hb.hh" +#include "hb-meta.hh" + +#include <type_traits> + +int +main (int argc, char **argv) +{ + static_assert (hb_is_convertible (void, void), ""); + static_assert (hb_is_convertible (void, const void), ""); + static_assert (hb_is_convertible (const void, void), ""); + + static_assert (hb_is_convertible (int, int), ""); + static_assert (hb_is_convertible (char, int), ""); + static_assert (hb_is_convertible (long, int), ""); + + static_assert (hb_is_convertible (int, int), ""); + + static_assert (hb_is_convertible (const int, int), ""); + static_assert (hb_is_convertible (int, const int), ""); + static_assert (hb_is_convertible (const int, const int), ""); + + static_assert (hb_is_convertible (int&, int), ""); + static_assert (!hb_is_convertible (int, int&), ""); + + static_assert (hb_is_convertible (int, const int&), ""); + static_assert (!hb_is_convertible (const int, int&), ""); + static_assert (hb_is_convertible (const int, const int&), ""); + static_assert (hb_is_convertible (int&, const int), ""); + static_assert (hb_is_convertible (const int&, int), ""); + static_assert (hb_is_convertible (const int&, const int), ""); + static_assert (hb_is_convertible (const int&, const int), ""); + + struct X {}; + struct Y : X {}; + + static_assert (hb_is_convertible (const X &, const X), ""); + static_assert (hb_is_convertible (X &, const X), ""); + static_assert (hb_is_convertible (X &, const X &), ""); + static_assert (hb_is_convertible (X, const X &), ""); + static_assert (hb_is_convertible (const X, const X &), ""); + static_assert (!hb_is_convertible (const X, X &), ""); + static_assert (!hb_is_convertible (X, X &), ""); + static_assert (hb_is_convertible (X &, X &), ""); + + static_assert (hb_is_convertible (int&, long), ""); + static_assert (!hb_is_convertible (int&, long&), ""); + + static_assert (hb_is_convertible (int *, int *), ""); + static_assert (hb_is_convertible (int *, const int *), ""); + static_assert (!hb_is_convertible (const int *, int *), ""); + static_assert (!hb_is_convertible (int *, long *), ""); + static_assert (hb_is_convertible (int *, void *), ""); + static_assert (!hb_is_convertible (void *, int *), ""); + + static_assert (hb_is_base_of (void, void), ""); + static_assert (hb_is_base_of (void, int), ""); + static_assert (!hb_is_base_of (int, void), ""); + + static_assert (hb_is_base_of (int, int), ""); + static_assert (hb_is_base_of (const int, int), ""); + static_assert (hb_is_base_of (int, const int), ""); + + static_assert (hb_is_base_of (X, X), ""); + static_assert (hb_is_base_of (X, Y), ""); + static_assert (hb_is_base_of (const X, Y), ""); + static_assert (hb_is_base_of (X, const Y), ""); + static_assert (!hb_is_base_of (Y, X), ""); + + static_assert (hb_is_constructible (int), ""); + static_assert (hb_is_constructible (int, int), ""); + static_assert (hb_is_constructible (int, char), ""); + static_assert (hb_is_constructible (int, long), ""); + static_assert (!hb_is_constructible (int, X), ""); + static_assert (!hb_is_constructible (int, int, int), ""); + static_assert (hb_is_constructible (X), ""); + static_assert (!hb_is_constructible (X, int), ""); + static_assert (hb_is_constructible (X, X), ""); + static_assert (!hb_is_constructible (X, X, X), ""); + static_assert (hb_is_constructible (X, Y), ""); + static_assert (!hb_is_constructible (Y, X), ""); + + static_assert (hb_is_trivially_default_constructible (X), ""); + static_assert (hb_is_trivially_default_constructible (Y), ""); + static_assert (hb_is_trivially_copy_constructible (X), ""); + static_assert (hb_is_trivially_copy_constructible (Y), ""); + static_assert (hb_is_trivially_move_constructible (X), ""); + static_assert (hb_is_trivially_move_constructible (Y), ""); + static_assert (hb_is_trivially_destructible (Y), ""); + + static_assert (hb_is_trivially_copyable (int), ""); + static_assert (hb_is_trivially_copyable (X), ""); + static_assert (hb_is_trivially_copyable (Y), ""); + + static_assert (hb_is_trivial (int), ""); + static_assert (hb_is_trivial (X), ""); + static_assert (hb_is_trivial (Y), ""); + + /* TODO Add more meaningful tests. */ + + return 0; +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-name.cc index 518e4eb6e64..518e4eb6e64 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-name.cc diff --git a/Build/source/libs/harfbuzz/version.ac b/Build/source/libs/harfbuzz/version.ac index 73da7fa86c5..1c8c2203670 100644 --- a/Build/source/libs/harfbuzz/version.ac +++ b/Build/source/libs/harfbuzz/version.ac @@ -8,4 +8,4 @@ dnl dnl -------------------------------------------------------- dnl dnl m4-include this file to define the current harfbuzz version -m4_define([harfbuzz_version], [2.4.0]) +m4_define([harfbuzz_version], [2.5.0]) |