diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2018-03-07 22:32:14 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2018-03-07 22:32:14 +0000 |
commit | ef9282421b00185a4962b7d22b96e979687258e2 (patch) | |
tree | b6d0d8c700086d3141e228187693a26b102c971f /Build/source/libs | |
parent | 55fbdeae2498166ec7c7301fd48d990fc9010058 (diff) |
harfbuzz-1.7.6
git-svn-id: svn://tug.org/texlive/trunk@46877 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs')
114 files changed, 13175 insertions, 2170 deletions
diff --git a/Build/source/libs/README b/Build/source/libs/README index 37b028e7cb1..3bcce12c104 100644 --- a/Build/source/libs/README +++ b/Build/source/libs/README @@ -24,7 +24,7 @@ gmp 6.1.2 - checked 16dec16 graphite2 1.3.11 - checked 05mar18 http://sourceforge.net/projects/silgraphite/files/graphite2/ -harfbuzz 1.7.5 - checked 31jan18 +harfbuzz 1.7.6 - checked 07mar18 http://www.freedesktop.org/software/harfbuzz/release/ icu 60.2 - checked 11jan18 diff --git a/Build/source/libs/harfbuzz/ChangeLog b/Build/source/libs/harfbuzz/ChangeLog index 0b079e98408..cb2556c0715 100644 --- a/Build/source/libs/harfbuzz/ChangeLog +++ b/Build/source/libs/harfbuzz/ChangeLog @@ -1,3 +1,8 @@ +2018-03-07 Akira Kakuto <kakuto@fuk.kindai.ac.jp> + + Import harfbuzz-1.7.6. + * Makefile.am, version.ac, include/Makefile.am: Adjusted. + 2018-01-31 Akira Kakuto <kakuto@fuk.kindai.ac.jp> Import harfbuzz-1.7.5. diff --git a/Build/source/libs/harfbuzz/Makefile.am b/Build/source/libs/harfbuzz/Makefile.am index fa7143c29fd..fcd01b7cf73 100644 --- a/Build/source/libs/harfbuzz/Makefile.am +++ b/Build/source/libs/harfbuzz/Makefile.am @@ -31,6 +31,10 @@ 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/dump-indic-data.cc \ + @HARFBUZZ_TREE@/src/dump-khmer-data.cc \ + @HARFBUZZ_TREE@/src/dump-myanmar-data.cc \ + @HARFBUZZ_TREE@/src/dump-use-data.cc \ @HARFBUZZ_TREE@/src/hb-atomic-private.hh \ @HARFBUZZ_TREE@/src/hb-blob.cc \ @HARFBUZZ_TREE@/src/hb-buffer-deserialize-json.hh \ @@ -50,16 +54,24 @@ libharfbuzz_a_SOURCES = \ @HARFBUZZ_TREE@/src/hb-object-private.hh \ @HARFBUZZ_TREE@/src/hb-open-file-private.hh \ @HARFBUZZ_TREE@/src/hb-open-type-private.hh \ - @HARFBUZZ_TREE@/src/hb-ot-cbdt-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color-cbdt-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color-colr-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color-cpal-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color.cc \ + @HARFBUZZ_TREE@/src/hb-ot-hdmx-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-head-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-hhea-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-hmtx-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-layout-base-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-name-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-os2-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-os2-unicode-ranges.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-macroman.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-private.hh \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-private.hh \ @HARFBUZZ_TREE@/src/hb-ot-var-mvar-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-tag.cc \ @HARFBUZZ_TREE@/src/hb-private.hh \ @@ -74,6 +86,14 @@ libharfbuzz_a_SOURCES = \ @HARFBUZZ_TREE@/src/hb-shaper-private.hh \ @HARFBUZZ_TREE@/src/hb-shaper.cc \ @HARFBUZZ_TREE@/src/hb-string-array.hh \ + @HARFBUZZ_TREE@/src/hb-subset-glyf.cc \ + @HARFBUZZ_TREE@/src/hb-subset-glyf.hh \ + @HARFBUZZ_TREE@/src/hb-subset-input.cc \ + @HARFBUZZ_TREE@/src/hb-subset-plan.cc \ + @HARFBUZZ_TREE@/src/hb-subset-plan.hh \ + @HARFBUZZ_TREE@/src/hb-subset-private.hh \ + @HARFBUZZ_TREE@/src/hb-subset.cc \ + @HARFBUZZ_TREE@/src/hb-subset.h \ @HARFBUZZ_TREE@/src/hb-unicode-private.hh \ @HARFBUZZ_TREE@/src/hb-unicode.cc \ @HARFBUZZ_TREE@/src/hb-utf-private.hh \ diff --git a/Build/source/libs/harfbuzz/Makefile.in b/Build/source/libs/harfbuzz/Makefile.in index c0229775103..b03404134df 100644 --- a/Build/source/libs/harfbuzz/Makefile.in +++ b/Build/source/libs/harfbuzz/Makefile.in @@ -120,18 +120,28 @@ am__v_AR_1 = libharfbuzz_a_AR = $(AR) $(ARFLAGS) libharfbuzz_a_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp -am_libharfbuzz_a_OBJECTS = @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT) \ +am_libharfbuzz_a_OBJECTS = \ + @HARFBUZZ_TREE@/src/dump-indic-data.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/dump-khmer-data.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/dump-myanmar-data.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/dump-use-data.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-buffer-serialize.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-buffer.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-common.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-face.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-fallback-shape.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-font.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-ot-color.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-tag.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-set.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-shape.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-shape-plan.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-shaper.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-subset-glyf.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-subset-input.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-subset-plan.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-subset.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-unicode.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-warning.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-font.$(OBJEXT) \ @@ -649,7 +659,11 @@ 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-private.hh \ +libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/dump-indic-data.cc \ + @HARFBUZZ_TREE@/src/dump-khmer-data.cc \ + @HARFBUZZ_TREE@/src/dump-myanmar-data.cc \ + @HARFBUZZ_TREE@/src/dump-use-data.cc \ + @HARFBUZZ_TREE@/src/hb-atomic-private.hh \ @HARFBUZZ_TREE@/src/hb-blob.cc \ @HARFBUZZ_TREE@/src/hb-buffer-deserialize-json.hh \ @HARFBUZZ_TREE@/src/hb-buffer-deserialize-text.hh \ @@ -668,16 +682,24 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic-private.hh \ @HARFBUZZ_TREE@/src/hb-object-private.hh \ @HARFBUZZ_TREE@/src/hb-open-file-private.hh \ @HARFBUZZ_TREE@/src/hb-open-type-private.hh \ - @HARFBUZZ_TREE@/src/hb-ot-cbdt-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color-cbdt-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color-colr-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color-cpal-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-color.cc \ + @HARFBUZZ_TREE@/src/hb-ot-hdmx-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-head-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-hhea-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-hmtx-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-layout-base-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-name-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-os2-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-os2-unicode-ranges.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-macroman.hh \ @HARFBUZZ_TREE@/src/hb-ot-post-table.hh \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-private.hh \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-private.hh \ @HARFBUZZ_TREE@/src/hb-ot-var-mvar-table.hh \ @HARFBUZZ_TREE@/src/hb-ot-tag.cc \ @HARFBUZZ_TREE@/src/hb-private.hh \ @@ -691,6 +713,14 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic-private.hh \ @HARFBUZZ_TREE@/src/hb-shaper-private.hh \ @HARFBUZZ_TREE@/src/hb-shaper.cc \ @HARFBUZZ_TREE@/src/hb-string-array.hh \ + @HARFBUZZ_TREE@/src/hb-subset-glyf.cc \ + @HARFBUZZ_TREE@/src/hb-subset-glyf.hh \ + @HARFBUZZ_TREE@/src/hb-subset-input.cc \ + @HARFBUZZ_TREE@/src/hb-subset-plan.cc \ + @HARFBUZZ_TREE@/src/hb-subset-plan.hh \ + @HARFBUZZ_TREE@/src/hb-subset-private.hh \ + @HARFBUZZ_TREE@/src/hb-subset.cc \ + @HARFBUZZ_TREE@/src/hb-subset.h \ @HARFBUZZ_TREE@/src/hb-unicode-private.hh \ @HARFBUZZ_TREE@/src/hb-unicode.cc \ @HARFBUZZ_TREE@/src/hb-utf-private.hh \ @@ -826,6 +856,18 @@ clean-noinstLIBRARIES: @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) @HARFBUZZ_TREE@/src/$(DEPDIR) @: > @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/dump-indic-data.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/dump-khmer-data.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/dump-myanmar-data.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/dump-use-data.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @@ -847,6 +889,9 @@ clean-noinstLIBRARIES: @HARFBUZZ_TREE@/src/hb-font.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/hb-ot-color.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @HARFBUZZ_TREE@/src/hb-ot-tag.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @@ -862,6 +907,18 @@ clean-noinstLIBRARIES: @HARFBUZZ_TREE@/src/hb-shaper.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/hb-subset-glyf.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/hb-subset-input.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/hb-subset-plan.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/hb-subset.$(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) @@ -956,6 +1013,10 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hbtest-dummy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hbtest-hbtest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-indic-data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-khmer-data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-myanmar-data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-use-data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-blob.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer-serialize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer.Po@am__quote@ @@ -965,6 +1026,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-font.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-graphite2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-icu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-color.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-font.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po@am__quote@ @@ -990,6 +1052,10 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-shape-plan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-shape.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-shaper.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-glyf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-plan.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-unicode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-warning.Po@am__quote@ diff --git a/Build/source/libs/harfbuzz/TLpatches/ChangeLog b/Build/source/libs/harfbuzz/TLpatches/ChangeLog index 2b5461a8cde..e2f853fe62f 100644 --- a/Build/source/libs/harfbuzz/TLpatches/ChangeLog +++ b/Build/source/libs/harfbuzz/TLpatches/ChangeLog @@ -1,3 +1,8 @@ +2018-03-07 Akira Kakuto <kakuto@fuk.kindai.ac.jp> + + Imported harfbuzz-1.7.6 source tree from: + http://www.freedesktop.org/software/harfbuzz/release/ + 2018-01-31 Akira Kakuto <kakuto@fuk.kindai.ac.jp> Imported harfbuzz-1.7.5 source tree from: diff --git a/Build/source/libs/harfbuzz/TLpatches/TL-Changes b/Build/source/libs/harfbuzz/TLpatches/TL-Changes index 9dc1503638e..200ff39b9ea 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-1.7.5/ tree as obtained from: +Changes applied to the harfbuzz-1.7.6/ tree as obtained from: http://www.freedesktop.org/software/harfbuzz/release/ Removed: diff --git a/Build/source/libs/harfbuzz/configure b/Build/source/libs/harfbuzz/configure index c07afa0794c..4b0d461b912 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) 1.7.5. +# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 1.7.6. # # 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='1.7.5' -PACKAGE_STRING='harfbuzz (TeX Live) 1.7.5' +PACKAGE_VERSION='1.7.6' +PACKAGE_STRING='harfbuzz (TeX Live) 1.7.6' 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) 1.7.5 to adapt to many kinds of systems. +\`configure' configures harfbuzz (TeX Live) 1.7.6 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) 1.7.5:";; + short | recursive ) echo "Configuration of harfbuzz (TeX Live) 1.7.6:";; 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 1.7.5 +harfbuzz (TeX Live) configure 1.7.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2085,7 +2085,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 1.7.5, which was +It was created by harfbuzz (TeX Live) $as_me 1.7.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -4008,7 +4008,7 @@ fi # Define the identity of the package. PACKAGE='harfbuzz--tex-live-' - VERSION='1.7.5' + VERSION='1.7.6' # Some tools Automake needs. @@ -4202,8 +4202,8 @@ WARNING_CFLAGS=$kpse_cv_warning_cflags HB_VERSION_MAJOR=1 HB_VERSION_MINOR=7 -HB_VERSION_MICRO=5 -HB_VERSION=1.7.5 +HB_VERSION_MICRO=6 +HB_VERSION=1.7.6 ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -8065,7 +8065,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 1.7.5, which was +This file was extended by harfbuzz (TeX Live) $as_me 1.7.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -8131,7 +8131,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 1.7.5 +harfbuzz (TeX Live) config.status 1.7.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt index 3a59366691c..defd5d6c62b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt +++ b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt @@ -91,6 +91,7 @@ add_definitions(-DHAVE_OT) add_definitions(-DHAVE_FALLBACK) +## Functions and headers include (CheckFunctionExists) include (CheckIncludeFile) macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools @@ -102,16 +103,15 @@ macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools endif () endforeach () endmacro () -check_funcs(atexit mprotect sysconf mmap strtod_l) #TODO: getpagesize newlocale isatty - -check_include_file(unistd.h HAVE_UNIST_H) -if (${HAVE_UNIST_H}) - add_definitions(-DHAVE_UNIST_H) +check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l) +check_include_file(unistd.h HAVE_UNISTD_H) +if (${HAVE_UNISTD_H}) + add_definitions(-DHAVE_UNISTD_H) +endif () +check_include_file(sys/mman.h HAVE_SYS_MMAN_H) +if (${HAVE_SYS_MMAN_H}) + add_definitions(-DHAVE_SYS_MMAN_H) endif () -#check_include_file(sys/mman.h HAVE_SYS_MMAN_H) -#if (${HAVE_SYS_MMAN_H}) -# add_definitions(-DHAVE_SYS_MMAN_H) -#endif () check_include_file(xlocale.h HAVE_XLOCALE_H) if (${HAVE_XLOCALE_H}) add_definitions(-DHAVE_XLOCALE_H) @@ -132,12 +132,11 @@ endif () ## Detect if we are running inside a distribution or regular repository folder -set (IN_HB_DIST FALSE) -if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog") - # perhaps we are on dist directory - set (IN_HB_DIST TRUE) - set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h") -endif () +# if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog") +# # perhaps we are on dist directory +# set (IN_HB_DIST TRUE) +# #set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h") +# endif () ## Extract variables from Makefile files @@ -171,20 +170,28 @@ add_prefix_to_list(HB_OT_sources "${PROJECT_SOURCE_DIR}/src/") extract_make_variable(HB_OT_headers ${SRCSOURCES}) add_prefix_to_list(HB_OT_headers "${PROJECT_SOURCE_DIR}/src/") +extract_make_variable(HB_SUBSET_sources ${SRCSOURCES}) +add_prefix_to_list(HB_SUBSET_sources "${PROJECT_SOURCE_DIR}/src/") + +extract_make_variable(HB_SUBSET_headers ${SRCSOURCES}) +add_prefix_to_list(HB_SUBSET_headers "${PROJECT_SOURCE_DIR}/src/") + extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES}) extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES}) -if (IN_HB_DIST) +#if (IN_HB_DIST) add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/") add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/") -else () - add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/") - add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/") -endif () +#else () +# add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/") +# add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/") +#endif () extract_make_variable(HB_VIEW_sources ${UTILSOURCES}) add_prefix_to_list(HB_VIEW_sources "${PROJECT_SOURCE_DIR}/util/") extract_make_variable(HB_SHAPE_sources ${UTILSOURCES}) add_prefix_to_list(HB_SHAPE_sources "${PROJECT_SOURCE_DIR}/util/") +extract_make_variable(HB_SUBSET_CLI_sources ${UTILSOURCES}) +add_prefix_to_list(HB_SUBSET_CLI_sources "${PROJECT_SOURCE_DIR}/util/") extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES}) add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/") @@ -201,41 +208,33 @@ set (HB_VERSION_MICRO ${CMAKE_MATCH_4}) ## Define ragel tasks -if (NOT IN_HB_DIST) - find_program(RAGEL "ragel" CMAKE_FIND_ROOT_PATH_BOTH) +# if (NOT IN_HB_DIST) +# foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources}) +# string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output}) +# set (target_name ${CMAKE_MATCH_1}) +# add_custom_command(OUTPUT ${ragel_output} +# COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN} +# DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl +# ) +# add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name}) +# endforeach () - if (RAGEL) - message(STATUS "ragel found at: ${RAGEL}") - else () - message(FATAL_ERROR "ragel not found, get it here -- http://www.complang.org/ragel/ or, use harfbuzz releases https://github.com/harfbuzz/harfbuzz/releases") - endif () - - foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources}) - string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output}) - set (target_name ${CMAKE_MATCH_1}) - add_custom_command(OUTPUT ${ragel_output} - COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN} - DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl - ) - add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name}) - endforeach () - - mark_as_advanced(RAGEL) -endif () +# mark_as_advanced(RAGEL) +# endif () ## Generate hb-version.h -if (NOT IN_HB_DIST) - set (HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in") - set (HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h") - set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true) - configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY) - execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "${HB_VERSION_H}.tmp" - "${HB_VERSION_H}" - ) - file(REMOVE "${HB_VERSION_H}.tmp") -endif () +# if (NOT IN_HB_DIST) +# set (HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in") +# set (HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h") +# set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true) +# configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY) +# execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different +# "${HB_VERSION_H}.tmp" +# "${HB_VERSION_H}" +# ) +# file(REMOVE "${HB_VERSION_H}.tmp") +# endif () ## Define sources and headers of the project @@ -248,15 +247,23 @@ set (project_sources ${HB_OT_RAGEL_GENERATED_sources} ) +set (subset_project_sources + ${HB_SUBSET_sources} +) + set (project_extra_sources) set (project_headers - ${HB_VERSION_H} + #${HB_VERSION_H} ${HB_BASE_headers} ${HB_OT_headers} ) +set (subset_project_headers + ${HB_SUBSET_headers} +) + ## Find and include needed header folders and libraries if (HB_HAVE_FREETYPE) @@ -519,25 +526,28 @@ endif () add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers}) target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS}) +## Define harfbuzz-subset library +add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers}) +add_dependencies(harfbuzz-subset harfbuzz) +target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS}) + if (UNIX OR MINGW) # Make symbols link locally link_libraries(-Bsymbolic-functions) - # Make sure we don't link to libstdc++ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + # Make sure we don't link to libstdc++ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions") set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "") set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C) - endif () + set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C) - # No threadsafe statics as we do it ourselves - if (BUILD_SHARED_LIBS) + # No threadsafe statics as we do it ourselves set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics") endif () endif () - ## Define harfbuzz-gobject library if (HB_HAVE_GOBJECT) add_library(harfbuzz-gobject @@ -708,6 +718,9 @@ if (HB_BUILD_UTILS) add_executable(hb-shape ${HB_SHAPE_sources}) target_link_libraries(hb-shape harfbuzz) + add_executable(hb-subset ${HB_SUBSET_CLI_sources}) + target_link_libraries(hb-subset harfbuzz harfbuzz-subset) + add_executable(hb-ot-shape-closure ${HB_OT_SHAPE_CLOSURE_sources}) target_link_libraries(hb-ot-shape-closure harfbuzz) @@ -785,7 +798,7 @@ endif () ## src/ executables -foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag) +foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges) set (prog_name ${prog}) if (${prog_name} STREQUAL "test") # test can not be used as a valid executable name on cmake, lets special case it @@ -796,7 +809,6 @@ foreach (prog main test test-would-substitute test-size-params test-buffer-seria endforeach () set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN") - ## Tests if (UNIX OR MINGW) if (BUILD_SHARED_LIBS) @@ -812,10 +824,12 @@ if (UNIX OR MINGW) ) add_test(NAME check-libstdc++.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-libstdc++.sh) add_test(NAME check-symbols.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-symbols.sh) - add_test(NAME check-defs.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-defs.sh) - set_tests_properties(check-static-inits.sh check-libstdc++.sh check-symbols.sh check-defs.sh - PROPERTIES ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src") + set_tests_properties( + check-static-inits.sh check-libstdc++.sh check-symbols.sh + PROPERTIES + ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src" + SKIP_RETURN_CODE 77) endif () add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh) @@ -824,7 +838,9 @@ if (UNIX OR MINGW) add_test(NAME check-includes.sh COMMAND ./check-includes.sh) set_tests_properties( check-c-linkage-decls.sh check-header-guards.sh check-externs.sh check-includes.sh - PROPERTIES WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src) + PROPERTIES + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src + SKIP_RETURN_CODE 77) endif () # Needs to come last so that variables defined above are passed to diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog index f984c138bf4..02300c32d03 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog +++ b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog @@ -1,3 +1,5356 @@ +commit ac2ece3e153167224c85cc384e2826ea9711a8b5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:52:42 2018 +0100 + + [ot] Comment out AAT include + + src/hb-ot-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 23a9ac993862b4a9032d38e80491a769b7ee86da +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:51:42 2018 +0100 + + Remove hb-ot-color.h + + So I can make a release. + + src/Makefile.sources | 1 - + src/hb-ot-color-cpal-table.hh | 48 +++++++++++++++++++++++++ + src/hb-ot-color.h | 81 + ------------------------------------------- + src/hb-ot.h | 1 - + 4 files changed, 48 insertions(+), 83 deletions(-) + +commit 790a11700773dd664e4d5edac63c404c5ebce080 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 15:31:15 2018 +0100 + + [ot] Remove hb-ot-base.h + + BASE table API will go into hb-ot-layout.h. + + src/Makefile.sources | 1 - + src/hb-ot-base.h | 56 + ------------------------------------------ + src/hb-ot-layout-base-table.hh | 1 - + src/hb-ot-layout.h | 16 ++++++++++++ + src/hb-ot.h | 1 - + 5 files changed, 16 insertions(+), 59 deletions(-) + +commit f014a124f582215fa96afc28b534a1ca0bf17167 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 10:49:26 2018 +0100 + + [set] Fix algebra + + Was totally b0rked. Ouch! + + Fixes https://github.com/harfbuzz/harfbuzz/issues/863 + + src/hb-set-private.hh | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +commit 7587683cdce8ee9b7f07bae82aa1bb163e79ab92 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 09:55:22 2018 +0100 + + [set] Minor + + In preparation to fix https://github.com/harfbuzz/harfbuzz/issues/863 + + Binary operations are sets are completely broken. Ouch. + + src/hb-set-private.hh | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +commit e4cbb87bd3512c3a6e97ea3923ecd1b26b0a1251 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 09:37:22 2018 +0100 + + Minor + + src/hb-ot-color-colr-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c6150333c29b458ed34858f24e94acc0f771aa0b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Mar 7 09:27:16 2018 +0100 + + Sign + + src/test-unicode-ranges.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9a6f9b4d4284f0378a71a181fe216d97c913669e +Author: Garret Rieger <grieger@google.com> +Date: Tue Mar 6 13:46:51 2018 -0800 + + [set] add a test demonstrating a bug in hb_set_union. + + test/api/test-set.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 9b4a5d7ef1ec068042e3c793845a4dbc3308d4b7 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Mar 7 00:23:40 2018 +0330 + + [ci] Enable -Werror=unused (#862) + + .travis.yml | 4 ++-- + src/hb-ot-glyf-table.hh | 1 - + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 54cbe6702c1e4c934c60512367abaf801294c1bb +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Mar 6 16:41:08 2018 +0330 + + [ot-color] Further improvements on COLR/CPAL implementation (#859) + + * Implemented a bsearch on get_base_glyph_record + * Made get_color_record_argb actually work + + src/hb-ot-color-colr-table.hh | 35 ++++++++++++++----------- + src/hb-ot-color-cpal-table.hh | 59 + +++++++++++++++---------------------------- + src/hb-ot-color.h | 12 ++------- + 3 files changed, 42 insertions(+), 64 deletions(-) + +commit 18d14b8e0d5d28106800ebf835ff3155a4f4de7c +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Mar 5 14:25:11 2018 +0330 + + [dev-run] an option to open using a GUI app + + src/dev-run.sh | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +commit 1db83954948dfae3f75f61c535c5de1b3a843a69 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Mar 5 13:02:50 2018 +0330 + + [ci] minor, bring back the removed assertion + + .ci/run-coveralls.sh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5895fe3d4d0441dacf8989740cf4150193397796 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Mar 5 12:58:34 2018 +0330 + + [ci] minor + + .ci/trigger-coverity.sh | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit a3e29fd38f01b26b6306f9f7142a54cc7d6c6080 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Mar 4 02:56:27 2018 +0330 + + [aat/kerx] Add a TODO + + src/hb-aat-layout-kerx-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 0ef6ab25ab4456e387711ae246900486ad738d26 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Mar 4 02:47:26 2018 +0330 + + [ot-color] Move cbdt to the namespace (#860) + + src/Makefile.sources | 2 +- + src/{hb-ot-cbdt-table.hh => hb-ot-color-cbdt-table.hh} | 6 +++--- + src/hb-ot-font.cc | 3 ++- + 3 files changed, 6 insertions(+), 5 deletions(-) + +commit 6659cb56fae0c900ae88e95bedcb3b76234c8838 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Mar 4 02:31:53 2018 +0330 + + [ci] Remove --coverage as use of --enable-code-coverage + + .travis.yml | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 00dd321ace75ff0d1824cf75cd41490c5dd6ad76 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 23:26:11 2018 +0330 + + [ci] Don't run coveralls on freetype folder + + .travis.yml | 1 + + 1 file changed, 1 insertion(+) + +commit f50aedd371f1a6894d1bf7732f017b51cbdd59bd +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 23:17:36 2018 +0330 + + [ci] Remove failing check on run-coveralls + + .ci/run-coveralls.sh | 2 -- + 1 file changed, 2 deletions(-) + +commit a0031c120e3ac5c059b81a004b9386fab3d662fc +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 23:09:25 2018 +0330 + + Add lcov tool for coverage tests + + .travis.yml | 1 + + 1 file changed, 1 insertion(+) + +commit ecef95b21264347f9505e3ed4fb25ec7e4ccca5d +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 23:03:13 2018 +0330 + + [ci] Enable code coverage on Travis Linux builds + + .travis.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f7399796a1ed36cfc4f1ef7631584569baa80981 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 22:55:09 2018 +0330 + + Enable coverage test on autotools (#857) + + configure.ac | 1 + + m4/ax_code_coverage.m4 | 264 + +++++++++++++++++++++++++++++++++++++++++++++++++ + src/Makefile.am | 6 +- + 3 files changed, 269 insertions(+), 2 deletions(-) + +commit c446c23f0f09e541891b49184febdfc75cb3505f +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 22:43:23 2018 +0330 + + [ot-color] Move the related tables to hb-ot-color-* (#858) + + src/Makefile.sources | 4 ++-- + src/{hb-ot-colr-table.hh => hb-ot-color-colr-table.hh} | 6 +++--- + src/{hb-ot-cpal-table.hh => hb-ot-color-cpal-table.hh} | 6 +++--- + src/hb-ot-color.cc | 4 ++-- + src/hb-ot-layout.cc | 4 ++-- + 5 files changed, 12 insertions(+), 12 deletions(-) + +commit 48ed15a2bcdc1999e2d39fdcb2644ba4c3beccfe +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 22:00:29 2018 +0330 + + [COLR/CPAL] Provide enough helper for rasterization (#855) + + src/hb-ot-colr-table.hh | 47 + ++++++++++++++++++++++++++++++++++++++++++++--- + src/hb-ot-cpal-table.hh | 18 +++++++++++++++--- + 2 files changed, 59 insertions(+), 6 deletions(-) + +commit 432758a7ac3c1a857e67069f157efbf4ebf5521b +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Mar 3 01:05:59 2018 +0330 + + [COLR] Revert previous sanitization on the table + + That sanitization wasn't right, firstLayerIndex is an index from + beginning of the Layer Records + not the table itself. + + src/hb-ot-colr-table.hh | 23 ++++++----------------- + 1 file changed, 6 insertions(+), 17 deletions(-) + +commit 71b4598ea37b316571bae22ced2f1b38185c9f44 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Mar 2 11:04:09 2018 +0330 + + [aat/kerx] Improve format 6 subtable + + src/hb-aat-layout-kerx-table.hh | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit b73a5a1c240478616827529c94f0133018f9f790 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Mar 2 00:07:26 2018 +0330 + + [aat/kerx] Make parsing of the table actually work (#850) + + src/hb-aat-layout-kerx-table.hh | 298 + +++++++++++++++++----------------------- + 1 file changed, 124 insertions(+), 174 deletions(-) + +commit a570edcde2f89e59b5ccd4867a8c0eed084bf35d +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Mar 2 00:06:03 2018 +0330 + + [COLR] Sanitize BaseGlyphRecord (#854) + + src/hb-ot-colr-table.hh | 27 ++++++++++++++++++--------- + 1 file changed, 18 insertions(+), 9 deletions(-) + +commit 7e958646a4a825bfe3aac56ddb96100d68c5592c +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Mar 1 10:27:18 2018 +0330 + + [CPAL] Fix version checking logic on sanitizer (#851) + + src/hb-ot-cpal-table.hh | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit bcf578fefe6d7af0a962329ceb9989ce61ec467d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 28 16:31:46 2018 -0800 + + [test] Add test suite for Brahmi Number Joiners + + https://github.com/harfbuzz/harfbuzz/pull/660 + + .../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf | Bin 0 -> + 2768 bytes + test/shaping/data/in-house/tests/use-syllable.tests | 1 + + test/shaping/record-test.sh | 2 +- + 3 files changed, 2 insertions(+), 1 deletion(-) + +commit b4ba71ea7ccce70e24138373774741c7f03dd24e +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 28 15:44:00 2018 -0800 + + [subset] In subset integration test pass output through ots-sanitize + if present. + + test/subset/run-tests.py | 25 +++++++++++++++++++++++-- + 1 file changed, 23 insertions(+), 2 deletions(-) + +commit 588a4e0f9b2d71362503a274de7200f3eb4367f7 +Merge: 55a4dfa3 b3f1a045 +Author: rsheeter <rsheeter@google.com> +Date: Wed Feb 28 13:52:29 2018 -0800 + + Merge pull request #845 from googlefonts/drophints + + [subset] drop hints from composites + +commit b3f1a045a8b86747afce6bc154f2a166ea678efb +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 28 11:41:24 2018 -0800 + + [subset] kick the build + + src/hb-subset-glyf.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 20d57399235b410d2bdc98103c8bb3dfd1c34176 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 28 11:15:08 2018 -0800 + + [subset] extract a method to flip off composite instruction flag + + src/hb-subset-glyf.cc | 24 +++++++++++++++--------- + 1 file changed, 15 insertions(+), 9 deletions(-) + +commit 55a4dfa374bae1db846c3b848b7e59fb0014b627 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Feb 28 15:43:23 2018 +0330 + + Use old project location of coverity + + https://github.com/harfbuzz/harfbuzz/commit/8089711a61687d565f207c56d3d2b658f514d7ab#commitcomment-27835452 + + .travis.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3821978bcd92cbdb607111452796e051c456f391 +Merge: 77227462 f671f7f0 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Feb 28 13:30:17 2018 +0330 + + Merge pull request #847 from ebraminio/colr + + [colr] Implement + +commit f671f7f0a8caa7b5763e00146e1ec4b9a7258227 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Feb 28 13:19:40 2018 +0330 + + [colr] Implement + + src/Makefile.sources | 1 + + src/hb-ot-color.cc | 9 +++++ + src/hb-ot-color.h | 9 ----- + src/hb-ot-colr-table.hh | 98 + +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-cpal-table.hh | 6 +-- + src/hb-ot-layout-private.hh | 6 ++- + src/hb-ot-layout.cc | 11 +++-- + 7 files changed, 122 insertions(+), 18 deletions(-) + +commit 772274625e9f17d726f2a1da8192ec3ec24793a3 +Merge: 0eec3315 5b9c2340 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Feb 28 12:05:49 2018 +0330 + + Merge pull request #841 from ebraminio/color + + Support CPAL table + +commit 0eec33154a418fba97a08be7169b59e748b7e785 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Feb 28 11:53:39 2018 +0330 + + [cmake] cleanup (#846) + + CMakeLists.txt | 70 + ++++++++++++++++++++----------------------------- + test/api/CMakeLists.txt | 2 +- + 2 files changed, 30 insertions(+), 42 deletions(-) + +commit 5b9c234043d0483e53e9da5fe4afd7743190b538 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 27 22:56:17 2018 +0330 + + [CPAL] Refactor and address the reviews + + NEWS | 3 +- + src/Makefile.am | 1 - + src/hb-ot-color.cc | 70 +++---------- + src/hb-ot-color.h | 31 +++--- + src/hb-ot-cpal-table.hh | 116 + +++++++++++++++------ + src/hb-ot-layout-private.hh | 3 +- + src/hb-ot-layout.cc | 5 +- + test/api/hb-test.h | 2 + + test/api/test-ot-color.c | 39 +++---- + .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf | Bin + .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf | Bin + 11 files changed, 141 insertions(+), 129 deletions(-) + +commit 6836a821428b714b9f2e95d5c4ebbd73867d9a53 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Feb 27 20:51:12 2018 -0800 + + [subset] remove WE_HAVE_INSTRUCTIONS from composites when dropping + hints + + src/hb-subset-glyf.cc | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit ffcb5cbf71b312cdd4606a3285e10e201ff5bccd +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Feb 27 20:17:04 2018 -0800 + + [subset] update the test file for composite, fix an offset calculation + + src/hb-ot-glyf-table.hh | 2 +- + test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf | Bin 0 -> + 932 bytes + test/api/test-subset-glyf.c | 5 ++--- + 3 files changed, 3 insertions(+), 4 deletions(-) + +commit c8b230e4377bc8e80d37835a229511ce0e30cc47 +Merge: b3790a65 904dd7be +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Feb 27 17:25:32 2018 -0800 + + Merge branch 'expand-tests' of github.com:googlefonts/harfbuzz + into drophints + +commit 904dd7beea756fd7429fad36f5c37321aedb4e81 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 14:33:36 2018 -0800 + + [subset] Add drop hinting profile to full-font.tests + + .../Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf | Bin 0 -> + 2152 bytes + .../full-font/Roboto-Regular.drop-hints.61,62,63.ttf | Bin 0 -> + 1968 bytes + test/subset/data/tests/full-font.tests | 1 + + 3 files changed, 1 insertion(+) + +commit 70a1049b3f8dc241fcb9b524bd010f0c1606f6ad +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 14:28:50 2018 -0800 + + [subset] Add a drop hints profile to basics.tests + + .../basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf | Bin 0 -> + 876 bytes + .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf | Bin 0 -> + 792 bytes + .../expected/basics/Roboto-Regular.abc.drop-hints.61.ttf | Bin 0 -> + 684 bytes + .../expected/basics/Roboto-Regular.abc.drop-hints.62.ttf | Bin 0 -> + 652 bytes + .../expected/basics/Roboto-Regular.abc.drop-hints.63.ttf | Bin 0 -> + 656 bytes + test/subset/data/profiles/drop-hints.txt | 1 + + test/subset/data/tests/basics.tests | 1 + + 7 files changed, 2 insertions(+) + +commit 5241d7f4b999d5457de564bd950b60d70f9d0e19 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 13:15:40 2018 -0800 + + [subset] apply subset profiles (flags) to the subset integration + tests. + + test/subset/generate-expected-outputs.py | 27 ++++++++++++++------------- + test/subset/run-tests.py | 3 ++- + test/subset/subset_test_suite.py | 11 ++++++++--- + 3 files changed, 24 insertions(+), 17 deletions(-) + +commit a4aca190a93f94c25c906ec0269183d8b2d0b5e8 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 11:36:16 2018 -0800 + + [subset] add expected/full-font to dist files. + + test/subset/data/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit d31ace32740b1777ebb023ffdb10cd0cfec3997e +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 18:51:56 2018 -0800 + + [subset] Add subset integration tests using the full roboto font. + + test/subset/data/Makefile.sources | 1 + + .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf | Bin 0 -> + 3700 bytes + .../full-font/Roboto-Regular.default.61,62,63.ttf | Bin 0 -> + 3320 bytes + test/subset/data/fonts/Roboto-Regular.ttf | Bin 0 -> + 171676 bytes + test/subset/data/tests/full-font.tests | 10 ++++++++++ + test/subset/generate-expected-outputs.py | 12 ++++++++---- + 6 files changed, 19 insertions(+), 4 deletions(-) + +commit 33f4381314c5248b8b112e344af7548806f93a82 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 18:39:09 2018 -0800 + + [subset] Add some more variations of the basic test. + + .../basics/Roboto-Regular.abc.default.61,62,63.ttf | Bin 0 -> + 2120 bytes + .../expected/basics/Roboto-Regular.abc.default.61,63.ttf | Bin 0 -> + 1932 bytes + .../expected/basics/Roboto-Regular.abc.default.61.ttf | Bin 0 -> + 1744 bytes + .../expected/basics/Roboto-Regular.abc.default.63.ttf | Bin 0 -> + 1668 bytes + test/subset/data/tests/basics.tests | 4 ++++ + 5 files changed, 4 insertions(+) + +commit b3790a65a18e8402b2b09dfc24aaea40a51de569 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Feb 27 17:23:30 2018 -0800 + + [subset] add a (failing for now) test for composite glyf hint dropping + + src/hb-ot-glyf-table.hh | 8 ++++---- + test/api/test-subset-glyf.c | 27 +++++++++++++++++++++++++-- + 2 files changed, 29 insertions(+), 6 deletions(-) + +commit 4c6023f861a4b87782c17ac626ffee7e93f15fc8 +Merge: d7633d0a 921b65cb +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 17:06:27 2018 -0700 + + Merge pull request #842 from googlefonts/maxp + + [subset] when dropping hints, clear hint related fields in maxp. + +commit 921b65cbc29f0c2c9c13e9fb272dafe4c8a14591 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 14:37:18 2018 -0800 + + [subset] minor fixes in hb-ot-maxp-table.hh + + src/hb-ot-maxp-table.hh | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +commit b26db48bfff804e139331817a86ecc811547afcd +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 14:14:05 2018 -0800 + + [subset] whitespace for hb-ot-maxp-table.hh + + src/hb-ot-maxp-table.hh | 30 +++++++++++++++--------------- + 1 file changed, 15 insertions(+), 15 deletions(-) + +commit a76344da796670f33b2fa48a9b1676545dac93c2 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 14:11:36 2018 -0800 + + [subset] Add maxpV1Tail instead of defining a struct inside maxp + for v1 data. + + src/hb-ot-maxp-table.hh | 81 + ++++++++++++++++++++++++++++++------------------- + 1 file changed, 49 insertions(+), 32 deletions(-) + +commit f14d1b64c2d148ffdec95c17adbee3f185d5d436 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 27 13:49:00 2018 -0800 + + [subset] when dropping hints, clear hint related fields in maxp. + + src/hb-ot-maxp-table.hh | 43 + ++++++++++++++++++++++++++++++++++++++++--- + test/api/test-subset-glyf.c | 30 +++++++++++++++++++++++------- + 2 files changed, 63 insertions(+), 10 deletions(-) + +commit d7633d0a4091c025638ba3fc8fb0d8e9a0e9ff8c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 12:50:57 2018 -0800 + + [BASE] More + + src/hb-ot-layout-base-table.hh | 153 + ++++------------------------------------- + 1 file changed, 12 insertions(+), 141 deletions(-) + +commit 7a70c20fec6ece9e729dc2634e2896a8d8eb9962 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 27 12:45:26 2018 -0800 + + [BASE] Clean up first 29% + + src/hb-ot-layout-base-table.hh | 262 + +++++++++++++++++++---------------------- + src/hb-ot-layout-gsub-table.hh | 2 +- + 2 files changed, 125 insertions(+), 139 deletions(-) + +commit 101850f9e6b9e0932fe1dd4169f88d6764c669c1 +Merge: 5967eaba f110c0c8 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 27 20:15:54 2018 +0330 + + Merge with master + +commit f110c0c8866c853c0d5a930564a2b69231a33322 +Merge: 4a1d51ef 0ad8c663 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 27 11:41:12 2018 +0330 + + Merge pull request #838 from harfbuzz/BASE + + BASE table + +commit 0ad8c663e0b4602e2a413e77a8158bf8a46755d5 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 26 12:45:08 2018 +0330 + + Remove public API of the branch + + src/hb-ot-base.h | 4 ++-- + src/hb-ot-layout-base-table.hh | 20 +++++++++--------- + src/hb-ot-layout.cc | 48 + ++++++++++++++++++++---------------------- + 3 files changed, 35 insertions(+), 37 deletions(-) + +commit 4a1d51ef15a423706406f784a146078073147885 +Merge: d0caf7e5 903771b6 +Author: rsheeter <rsheeter@google.com> +Date: Mon Feb 26 20:23:41 2018 -0800 + + Merge pull request #818 from googlefonts/drophints + + [subset] Drop hints + +commit 903771b6c7689b9eee9a11bac128c42f39833b2e +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 26 19:50:06 2018 -0800 + + [subset] clearer name for trim() and better comment about composite + handling, per review feedback + + src/hb-ot-glyf-table.hh | 8 +++++--- + src/hb-subset-glyf.cc | 17 ++++++++--------- + 2 files changed, 13 insertions(+), 12 deletions(-) + +commit d0caf7e5e3294c25230ed0e5580c647fa0f1a2c8 +Merge: 6c844ae8 44dc36dd +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 19:24:18 2018 -0700 + + Merge pull request #840 from googlefonts/os2 + + [subset] During os2 subsetting update ulUnicodeRange[]c + +commit 44dc36dd82fc948a15e2ad0d605eb4a466b3553d +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 17:56:23 2018 -0800 + + [subset] update to comment in hb-ot-os2-unicode-ranges.hh + + src/hb-ot-os2-unicode-ranges.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ad3f2f77dafdee524e836e732077ee9670602369 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 17:51:27 2018 -0800 + + [subset] small cleanups in hb-ot-os2-table. + + src/hb-ot-os2-table.hh | 5 +++-- + src/hb-ot-os2-unicode-ranges.hh | 2 +- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit f1c8fc3487d5c5efb8ee1804acb07e6e282d3bc5 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 17:48:51 2018 -0800 + + [subset] small updates to gen-unicode-ranges.py + + src/gen-unicode-ranges.py | 6 ++++-- + src/hb-ot-os2-unicode-ranges.hh | 3 ++- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 0c0fe2ff8209228f2ddfce464b7b6f1b1ee1654a +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 17:47:10 2018 -0800 + + [subset] Move util/generated-unicode-ranges.py to + src/gen-unicode-ranges.py + + util/generate-unicode-ranges.py => src/gen-unicode-ranges.py | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit f630ae5161bfc8420f9ae0127fd8c7f447874fdd +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 17:46:17 2018 -0800 + + [subset] unsigned int -> hb_codepoint_t. + + src/hb-ot-os2-unicode-ranges.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6368ce4c927b1457cf19945d5957e91d4621dc8b +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 17:44:39 2018 -0800 + + [subset] const in _compare_range. + + src/hb-ot-os2-unicode-ranges.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 0be9fea0a96701b159a9db190e55b1c3efc38a28 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 16:15:09 2018 -0800 + + [subset] Add comment to os2UnicodeRangesSorted. + + src/hb-ot-os2-unicode-ranges.hh | 1 + + 1 file changed, 1 insertion(+) + +commit e20ab71d12b032371b830b76462e5e979d963b58 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 16:13:10 2018 -0800 + + [subset] Fix incorrect index. + + src/hb-ot-os2-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 074b5a29a166d1812abc7229a71af4a3bb311536 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 16:11:24 2018 -0800 + + [subset] Add special case handling of bit 57 in os2 ulUnicodeRange. + + src/hb-ot-os2-table.hh | 7 +++++++ + src/test-unicode-ranges.cc | 3 --- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit ddc4f2b9fc5566e70558a57133289f84d467cc98 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 15:59:32 2018 -0800 + + [subset] Add python util that was used to generated + hb-ot-os2-unicode-ranges.hh + + util/generate-unicode-ranges.py | 50 + +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 50 insertions(+) + +commit f757757eda5f00a89a156e3427bdf8c4313611ef +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 15:56:36 2018 -0800 + + [subset] Add cmake build def for test-unicode-ranges. + + CMakeLists.txt | 2 +- + src/Makefile.am | 1 - + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit f82f2a3e50805503d93aa1aa1ccb27da4967a14a +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 15:52:01 2018 -0800 + + [subset] Rename hb-os2-unicode-ranges.cc to test-unicode-ranges.cc. + + src/Makefile.am | 2 +- + src/{hb-ot-os2-unicode-ranges.cc => test-unicode-ranges.cc} | 0 + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 4014555ca083dea3e4f42120aeaf52a2186b8a09 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 15:50:13 2018 -0800 + + [subset] set ulUnicodeRange[] in os2. + + src/Makefile.sources | 1 - + src/hb-ot-os2-table.hh | 23 ++++- + src/hb-ot-os2-unicode-ranges.cc | 221 + ++-------------------------------------- + src/hb-ot-os2-unicode-ranges.hh | 210 + +++++++++++++++++++++++++++++++++++++- + 4 files changed, 236 insertions(+), 219 deletions(-) + +commit a570142d0c6d819feeeeb9e209fc90a33c1c2b48 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 26 15:20:23 2018 -0800 + + [subset] Move hb-ot-os2-unicode-ranges into a cc file with a helper + methods and tests. + + src/Makefile.am | 9 +- + src/Makefile.sources | 2 + + src/hb-ot-os2-unicode-ranges.cc | 279 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-os2-unicode-ranges.hh | 189 +-------------------------- + 4 files changed, 292 insertions(+), 187 deletions(-) + +commit 8e81799b32f3dfaca000fa5d42943ceed9af8d17 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 18:35:41 2018 -0800 + + [subset] Add hb-ot-os2-unicode-ranges.hh, a map of os2 unicode ranges. + + src/hb-ot-os2-unicode-ranges.hh | 220 + ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 220 insertions(+) + +commit 6c844ae8e89f52f5f40eace66bb987544fc316e3 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 26 23:04:27 2018 +0330 + + [dev-run] show images using iTerm2 images feature + + src/dev-run.sh | 32 ++++++++++++++++++++++++++++---- + 1 file changed, 28 insertions(+), 4 deletions(-) + +commit 28c4245e9f76c6c53a4589e7745a60ed0e97414a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 26 01:10:42 2018 -0800 + + [aat/ankr] Define Anchor struct + + src/hb-aat-layout-ankr-table.hh | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit e347fb908b188f71df13215c8939b0f3a12c716f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 26 01:08:00 2018 -0800 + + Minor + + src/hb-ot-layout-gdef-table.hh | 4 ++-- + src/hb-ot-layout-gpos-table.hh | 12 ++++++------ + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit 05fbd14e715ed5d0f0f86388b1538ad8e8c7c506 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 26 01:04:16 2018 -0800 + + [aat/ankr] Minor + + DEFINE_SIZE_MIN is to be used only in rare cases. For fixed-size + structs + we want DEFINE_SIZE_STATIC. + + src/hb-aat-layout-ankr-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f90cd9b1f5ade8ad5e3b7caf0272936ad7a0f419 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 26 01:03:23 2018 -0800 + + [aat/ankr] Hook up Lookup table + + src/hb-aat-layout-ankr-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c36598450e9698168851c0ae7d0b4c9e562c4924 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 26 00:57:07 2018 -0800 + + [aat/ankr] Simplify + + src/hb-aat-layout-ankr-table.hh | 36 ++++++++---------------------------- + 1 file changed, 8 insertions(+), 28 deletions(-) + +commit fa3a69e2334ec4122d672670614a8e5a95611d75 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 26 00:32:11 2018 -0800 + + [aat/trak] Simplify sanitize() + + src/hb-aat-layout-trak-table.hh | 67 + ++++++++++------------------------------- + 1 file changed, 16 insertions(+), 51 deletions(-) + +commit f0bc6c0992c4302ae1a20f155ad256bfa331087c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 26 00:18:17 2018 -0800 + + [aat/trak] Clean up + + We always just used "unsigned int" for counter values. There's + no use for uint16_t outside of a struct. + + Also, no need for explict casting where implicit does. + + src/hb-aat-layout-trak-table.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit bb82f01383db7cf05040fbd5881e17e263ef6369 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Feb 25 12:30:33 2018 +0330 + + [aat] trak sanitization + + src/dev-run.sh | 4 +- + src/hb-aat-layout-trak-table.hh | 95 + ++++++++++++++++++++++++++++++++--------- + src/hb-aat-layout.cc | 2 +- + util/options.hh | 2 +- + 4 files changed, 78 insertions(+), 25 deletions(-) + +commit becb1d9eea15c07f9ea4e229be56f9aca0f768af +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 26 11:29:48 2018 +0330 + + [aat] minor + + Ops, this was done for testing + + src/hb-aat-layout-ankr-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df1c7d5b60520d2b3c756b700d5ac41668fc0983 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 25 19:06:25 2018 -0800 + + Minor + + src/hb-open-type-private.hh | 5 +++-- + src/hb-subset.cc | 2 +- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 6dd46fa598cacdd046ba4548bc6ddf7f37c46dee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 25 18:54:52 2018 -0800 + + [aat/trak] Minor + + Maybe we should make DEFINE_* make structs uncopyable. + + src/hb-aat-layout-trak-table.hh | 56 + +++++++++++++++++++++++------------------ + 1 file changed, 32 insertions(+), 24 deletions(-) + +commit ae14dd0fb0a176f6f0143690907b51626999d248 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 26 00:31:09 2018 +0330 + + [aat] Implement ankr + + src/Makefile.sources | 3 +- + src/hb-aat-layout-ankr-table.hh | 86 + +++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-aat-layout.cc | 37 +++++++++++++----- + src/hb-ot-layout-private.hh | 6 ++- + src/hb-ot-layout.cc | 6 ++- + 6 files changed, 124 insertions(+), 16 deletions(-) + +commit 551fa2d200a06d00d054f2c8e7aad1cb4d25249b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 25 16:32:17 2018 -0800 + + [BASE] Minor + + src/Makefile.sources | 1 - + src/hb-ot-base.cc | 58 ----------------------- + src/hb-ot-layout-base-table.hh | 103 + ++++++++++++++++++++++++++++------------- + src/hb-ot-layout.cc | 34 ++++++++++++++ + src/hb-ot-layout.h | 1 + + 5 files changed, 105 insertions(+), 92 deletions(-) + +commit 05699fd996ed9c0e5dde8918388ac188e58df1a7 +Merge: 83af6c23 3ebcd5a3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 24 12:01:54 2018 -0800 + + Merge remote-tracking branch 'eroux/add-base' + +commit a8d3c2c030d2c21c70e0b8bd43f7d05ff4818b75 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Feb 24 16:42:12 2018 +0330 + + [ci] Add clang O3/O0 testers (#834) + + .circleci/config.yml | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit c73255f3eb2f060ec72d18790b374f6b6e4032aa +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Sat Feb 24 00:44:07 2018 +0200 + + Workaround for old automake on Travis Linux images + + https://github.com/harfbuzz/harfbuzz/pull/821#issuecomment-368116538 + + .ci/fail.sh | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit cd28eb9f5dc237325c64380d9d87e673b8e94985 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Feb 24 14:17:54 2018 +0330 + + Add -Werror=unused-function check to Travis (#832) + + .travis.yml | 4 ++-- + src/hb-aat-layout.cc | 24 ++++++++++++------------ + test/api/test-set.c | 19 ++++++++++--------- + 3 files changed, 24 insertions(+), 23 deletions(-) + +commit 1ab16f4556ef3e54a40b63cf4570c0ae986894e7 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Feb 24 12:49:42 2018 +0330 + + [aat] Implement trak logic (#816) + + src/hb-aat-layout-kerx-table.hh | 7 ++++ + src/hb-aat-layout-private.hh | 3 ++ + src/hb-aat-layout-trak-table.hh | 78 + +++++++++++++++++++++++++++++++++++++++-- + src/hb-aat-layout.cc | 46 ++++++++++++++++++++++++ + src/hb-open-type-private.hh | 4 +-- + src/hb-ot-layout-private.hh | 22 ++++++++++++ + src/hb-ot-layout.cc | 4 +++ + src/hb-ot-shape.cc | 2 ++ + 8 files changed, 161 insertions(+), 5 deletions(-) + +commit b91e8da36e164168cd532fd6e6950c5d743a14dd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 22:51:17 2018 -0800 + + Include hb-version.h in git (#825) + + CMakeLists.txt | 36 ++++++++++++++-------------- + src/Makefile.am | 8 +++---- + src/Makefile.sources | 3 --- + src/hb-version.h | 66 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 87 insertions(+), 26 deletions(-) + +commit 5267520e078ed413df78f3a6781fd5370b6da63a +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 23 18:36:22 2018 -0800 + + [subset] update hdmx test to create input explicitly + + test/api/test-subset-hdmx.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2e3ee489f8374227fa94a8d8684e839e643888ea +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 23 18:18:54 2018 -0800 + + [subset] format tweak, doc string + + src/hb-subset-input.cc | 12 +++++++++--- + src/hb-subset.h | 2 +- + 2 files changed, 10 insertions(+), 4 deletions(-) + +commit d78393b5547135b8db0356b0ec14d5ed0d334768 +Merge: 1454d82a 83af6c23 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 23 17:53:26 2018 -0800 + + Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into + drophints + +commit 1454d82a9d3d9a47901b3d92ff7f2c05c596c0d5 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 23 17:49:23 2018 -0800 + + [subset] keep glyph trim separate of more general get_offset + + src/hb-ot-glyf-table.hh | 12 ++++-------- + src/hb-subset-glyf.cc | 6 ++++-- + 2 files changed, 8 insertions(+), 10 deletions(-) + +commit 0ac8c0c1e6a6c076ce33b16baa173ff8763ac04e +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 23 17:43:00 2018 -0800 + + [subset] zero glyf and loca memory before writing so pads are + clean. Test just the part of maxp we care about + + src/hb-ot-glyf-table.hh | 6 +++--- + src/hb-subset-glyf.cc | 4 ++-- + test/api/test-subset-glyf.c | 19 ++++++++++++++++--- + 3 files changed, 21 insertions(+), 8 deletions(-) + +commit 83af6c237f2bfd66af76a8647a62b3d1ab996744 +Merge: 7e5e1feb dc5c7927 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 18:33:25 2018 -0700 + + Merge pull request #829 from googlefonts/test-checksum + + [subset] Caclculate head table checksum adjustment + +commit dc5c7927e75ea09461e46fe6e56897091b4b4f00 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 16:42:06 2018 -0800 + + [subset] Caclculate head table checksum adjustment + + Test still fails, because we do not serialize tables in the same + order that fonttools subsetter does. + + src/hb-open-file-private.hh | 51 + ++++++++++++++++++++++++++++++++++----------- + src/hb-ot-head-table.hh | 2 ++ + src/hb-subset.cc | 2 ++ + 3 files changed, 43 insertions(+), 12 deletions(-) + +commit 7e5e1feb666d6a861b5cd64bf29a16e3854fb812 +Merge: ec2538c8 99967e21 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 17:59:08 2018 -0700 + + Merge pull request #828 from googlefonts/mem-fixes + + [subset] Fix several memory leaks in subsetting. + +commit ec2538c8803be254b6e09ca0ea724b07c35126da +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 15:51:26 2018 -0800 + + [subset] Fix checksum calc out-of-bounds access + + src/hb-open-file-private.hh | 18 ++++++++++-------- + src/hb-open-type-private.hh | 3 ++- + 2 files changed, 12 insertions(+), 9 deletions(-) + +commit 99967e21c6e3f6882d6eadf5c22f4120684b1fc5 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 15:45:45 2018 -0800 + + [subset] Fix memory leak in hb-subset-glyf. + + src/hb-subset-glyf.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit e61f360dc828bfd46477b7ddff56874da9f03538 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 15:44:21 2018 -0800 + + [subset] Fix memory leak in hb-subset-plan. + + src/hb-subset-plan.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 66b0a390793ab06692dd49e67baef52a6a7d82aa +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 15:41:52 2018 -0800 + + [subset] Fix memory leak in hb-subset. + + src/hb-subset.cc | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 0fb8a5ce192025ffd83ae714db932e4b86594ae1 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 15:37:43 2018 -0800 + + [subset] Fix memory leak in cmap subsetting. + + src/hb-ot-cmap-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 4665aaa19304bdf0362bdfcebcae65feb19a8964 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 15:36:14 2018 -0800 + + [subset] Fix memory leak in hmtx subsetting. + + src/hb-ot-hmtx-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 5a36b55fba03cd07c9b101f0222b8d189bcd3bbf +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 15:30:14 2018 -0800 + + [subset] Fix memory leak in subset face destroy. + + src/hb-subset.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit d38f37b2e37942a3fd13cd753c8b8587a06c0f3a +Author: Ben Boeckel <mathstuf@users.noreply.github.com> +Date: Fri Feb 23 16:55:53 2018 -0500 + + autoconf: provide a harfbuzz-config for use from CMake (#822) + + configure.ac | 2 ++ + src/Makefile.am | 4 ++- + src/harfbuzz-config.cmake.in | 82 + ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 87 insertions(+), 1 deletion(-) + +commit e0939d811f1fdeda9c5763e7e53887b3d3cb21eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 13:19:34 2018 -0800 + + Clean up check-defs and check-symbols (#821) + + Also, call c++filt on their results. + + Also build and fix and check harfbuzz-gobject.def + + Also changes harfbuzz-gobject to distribute generated enum sources. + + CMakeLists.txt | 3 +-- + src/Makefile.am | 33 ++++++++++++++++------------ + src/Makefile.sources | 9 +++++--- + src/check-defs.sh | 52 + --------------------------------------------- + src/check-symbols.sh | 30 ++++++++++++++++++++------ + src/hb-gobject-enums.h.tmpl | 3 ++- + src/hb-gobject-structs.h | 45 ++++++++++++++++++++++++++------------- + 7 files changed, 81 insertions(+), 94 deletions(-) + +commit 9bd6d25254d9bfc612004982dba286a3751d1d29 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 23 13:05:58 2018 -0800 + + [subset] clone trim logic from fonttools glyf handling + + src/hb-ot-glyf-table.hh | 92 + ++++++++++++++++++++++++++- + src/hb-subset-glyf.cc | 26 ++++---- + src/hb-subset-plan.cc | 3 + + src/hb-subset.cc | 13 ++-- + test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 1128 -> 848 bytes + test/api/hb-subset-test.h | 1 + + test/api/test-subset-glyf.c | 6 +- + 7 files changed, 117 insertions(+), 24 deletions(-) + +commit b1ec82105189053d648a798cf5b3ab2887046298 +Merge: e15e41ef c2e4713b +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 23 12:32:18 2018 -0700 + + Merge pull request #823 from googlefonts/hdmx + + [subset] Add hdmx subsetting. + +commit e15e41ef12e146333e355defef8db210378b5be0 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 18:41:50 2018 -0800 + + [subset] Remove commented code from run-tests.py. + + test/subset/run-tests.py | 3 --- + 1 file changed, 3 deletions(-) + +commit 2b844803433bd1557a7fd0c93a91c66ef5319b21 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 18:38:44 2018 -0800 + + [subset] Update expected files for subsetting integration test to + not include cmap 4. + + .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 -> + 1692 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit a88504c601ac95601730bd602861c13e5ac4fdd8 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 14:28:18 2018 -0800 + + [subset] Fix checksum clearning in subset test diff. Add an updated + expected file (has cmap4 restored). + + .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1692 -> + 1740 bytes + test/subset/run-tests.py | 7 +++++-- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 537698b60131bd3d7999919a04596c41dda6b2e4 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 14:07:52 2018 -0800 + + [subset] Don't compare actual to itself in Fix + test/subset/run-tests. Print a diff on failure. + + test/subset/run-tests.py | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit c2e4713b5b561675b0f7b358ccf83d64ef0b6c41 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 10:45:03 2018 -0800 + + [hdmx] Fix sanitize() + + src/hb-ot-hdmx-table.hh | 23 +++++++---------------- + 1 file changed, 7 insertions(+), 16 deletions(-) + +commit 84d4bb91ceca22484abb597c19eb18311e2514f1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 10:38:35 2018 -0800 + + [hdmx] Minor + + src/hb-ot-hdmx-table.hh | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit cf7a6e520e9601da9d27bc8f6bbe5d2eff23998d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 23 10:34:26 2018 -0800 + + [hdmx] Move DeviceRecord to toplevel again + + More readable. + + src/hb-ot-hdmx-table.hh | 112 + ++++++++++++++++++++++++------------------------ + 1 file changed, 57 insertions(+), 55 deletions(-) + +commit 96d7805a9235443972c6b6c5cd9502283c8836e9 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 16:48:28 2018 -0800 + + [subset] More complete sanitization implementation for hdmx. + + src/hb-ot-hdmx-table.hh | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit c02532a3d2325c8fb9332f63f687cbaec77b2239 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 16:40:50 2018 -0800 + + [subset] Formatting and comments in hdmx. + + src/hb-ot-hdmx-table.hh | 31 +++++++++++++++++++------------ + 1 file changed, 19 insertions(+), 12 deletions(-) + +commit 6b372f439b257808b048d02ebf5a867dabcd1231 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 12:00:00 2018 -0800 + + [subset] In hb-ot-hdmx-table, s/glyf/hdmx. + + src/hb-ot-hdmx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ec302ad5bda6bea870f6d33f9698a1782472a213 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 22 11:57:35 2018 -0800 + + [subset] Fail subset if a table fails to sanitize. + + src/hb-subset.cc | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +commit 15fc45bfedef433025145289fe916739907b573b +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 17:59:57 2018 -0800 + + [subset] Add a unit test for hdmx subsetting. + + test/api/Makefile.am | 2 ++ + test/api/test-subset-hdmx.c | 81 + +++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 83 insertions(+) + +commit aa4aa2353c52f86fd56446de6b7ff86a9e990b9c +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 17:43:32 2018 -0800 + + [subset] Enable hdmx subsetting. + + src/hb-subset.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit bd18b6adf8697c1ce3f4e3831b9f2a99d930e97d +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 17:42:58 2018 -0800 + + [subset] Move DeviceRecord inside of hdmx. + + src/hb-ot-hdmx-table.hh | 98 + +++++++++++++++++++++++++------------------------ + 1 file changed, 50 insertions(+), 48 deletions(-) + +commit 6704cded65985b2de262bdd3bb0887929e5a3b0b +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 16:00:10 2018 -0800 + + [subset] Add hdmx subsetting implementation. + + src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++++++++++++--- + 1 file changed, 26 insertions(+), 3 deletions(-) + +commit 84b68e58862647b4ede414b2e608c47d390fd60a +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 15:43:47 2018 -0800 + + [subset] In hdmx serialize set the correct value of sizeDeviceRecord. + + src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++------------- + 1 file changed, 16 insertions(+), 13 deletions(-) + +commit dddf44279f610e77e8b9a0819fd91f48802158b6 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 15:36:09 2018 -0800 + + [subset] When serializing a DeviceRecord in hdmx pad to make 32 + bit aligned. + + src/hb-ot-hdmx-table.hh | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +commit ab7a8f3b7419b604816e12cb93e77c0ba45a57af +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 15:15:22 2018 -0800 + + [subset] Begin implementing serialize for hdmx. + + src/hb-ot-hdmx-table.hh | 79 + +++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 77 insertions(+), 2 deletions(-) + +commit fe42862ab30d17483a1d0c2e2b1d859d01bbaff1 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 21 14:18:49 2018 -0800 + + [subset] Sketch out a basic hb-ot-hdmx.hh. + + src/Makefile.sources | 1 + + src/hb-ot-hdmx-table.hh | 77 + +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset.cc | 1 + + 3 files changed, 79 insertions(+) + +commit 4f6f7c3b22ec788f609bdffc7e0893816657b3a0 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Feb 23 02:54:12 2018 +0330 + + [util] Implement ppem/ptem on hb-{shape,view} (#811) + + util/options.cc | 33 ++++++++++++++++++++++++++++----- + util/options.hh | 6 ++++++ + 2 files changed, 34 insertions(+), 5 deletions(-) + +commit a6bd6bcee08c9522f9269b5c63f784688abddcff +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Feb 22 16:52:56 2018 +0330 + + [dev-run] minor + + src/dev-run.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa13a04cf3345311a2434f0d7f6346f967491c45 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Feb 22 16:48:03 2018 +0330 + + [dev-run] Add gdb/lldb shortcuts + + src/dev-run.sh | 40 +++++++++++++++++++++++++++++++--------- + 1 file changed, 31 insertions(+), 9 deletions(-) + +commit 4f07437dfebd3dc5923f40154c6f1b7e1dce1bd4 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 21 22:23:05 2018 -0800 + + [subset] sketch out dropping in-glyf instructions. Sometimes yields + differnet size glyphs than fonttools, possibly due to padding not + being corrected + + src/hb-ot-glyf-table.hh | 45 ++++++++++++++++ + src/hb-subset-glyf.cc | 78 + +++++++++++++++++++++------ + src/hb-subset-input.cc | 6 +++ + src/hb-subset.h | 2 + + test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 0 -> 1128 bytes + test/api/hb-subset-test.h | 15 +++--- + test/api/test-subset-cmap.c | 4 +- + test/api/test-subset-glyf.c | 32 +++++++++-- + test/api/test-subset-hmtx.c | 10 ++-- + test/api/test-subset-os2.c | 2 +- + 10 files changed, 160 insertions(+), 34 deletions(-) + +commit 2d0265242bb9a080886d6e0aa653c62e5770a15a +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 21 09:42:46 2018 -0800 + + [subset] keep the result of _subset + + src/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4fb97be78d9287e489c9f67d1bfe7682235bdf38 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 14:38:02 2018 -0800 + + Add two more ragel-generated headers + + Fixes https://github.com/harfbuzz/harfbuzz/issues/817 + + src/hb-buffer-deserialize-json.hh | 643 + ++++++++++++++++++++++++++++++++++++++ + src/hb-buffer-deserialize-text.hh | 571 +++++++++++++++++++++++++++++++++ + 2 files changed, 1214 insertions(+) + +commit 74e0c13a4a55848e797242c02c8f067e587ea603 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 21 11:19:18 2018 -0800 + + [subset] drop hint tables if so flagged. Still need to dump glyf + instructions. + + src/hb-subset-plan.cc | 1 + + src/hb-subset-plan.hh | 2 ++ + src/hb-subset-private.hh | 2 +- + src/hb-subset.cc | 11 +++++++++-- + util/hb-subset.cc | 2 +- + util/options.cc | 2 +- + util/options.hh | 4 ++-- + 7 files changed, 17 insertions(+), 7 deletions(-) + +commit edee28801e4dbb5b734b4038d93fe1594e267ab1 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Feb 21 22:13:58 2018 +0330 + + Add .editorconfig (#810) + + More information: http://editorconfig.org/ + + .editorconfig | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 0bd100e144885ed8144cf23e7e106014858a1724 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 21 10:34:00 2018 -0800 + + [subset] add --hinting flag + + src/hb-subset-private.hh | 1 + + util/hb-subset.cc | 6 +++++- + util/options.cc | 15 +++++++++++++++ + util/options.hh | 14 ++++++++++++++ + 4 files changed, 35 insertions(+), 1 deletion(-) + +commit 7ecca8c0a83a6c71154fcc80887a4f895c0c5a23 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 21 09:42:46 2018 -0800 + + [subset] keep the result of _subset + + src/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eada749e4642ea90300c9c68c226fa76a3e35a75 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 21 00:35:23 2018 -0800 + + Use HB_SET_VALUE_INVALID consistently + + src/hb-ot-layout-common-private.hh | 6 +++--- + src/hb-ot-shape.cc | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 2cc845f311b6dc4f0feda8b8fc5609fbd51b5923 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 20 18:13:41 2018 -0800 + + [subset] fix calculation of range shiftz. Should be 16 * len - + searchRange not 16 * (len - searchRange). + + src/hb-open-type-private.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8e614ade5aef102baed56f91c2fcb1f3d1788ea9 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 20 17:36:54 2018 -0800 + + [subset] Reverse table order for font serialization to match what + OTS expects. + + src/hb-open-file-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a998eeee4ad7bba4a1574c9735618891b6bd0948 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 20 16:48:52 2018 -0800 + + [subset] sanity check glyph data writes during glyph subsetting to + ensure they are inbounds. + + src/hb-subset-glyf.cc | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 0ab73e594275cf064e09b9df2e1df337a589745d +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 20 15:33:03 2018 -0800 + + [subset] Sanity check that loca writes are inbounds. + + src/hb-subset-glyf.cc | 55 + ++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 41 insertions(+), 14 deletions(-) + +commit 73e20ec6e9ad86bea023fc8b6fc10287889ed048 +Merge: 6ae4013f 69e443b2 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 20 17:34:59 2018 -0700 + + Merge pull request #812 from googlefonts/cleanup + + Clean up of glyf subsetting. + +commit 6ae4013f2e53d6496507a58b715298fee4eadcee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 20 15:02:25 2018 -0800 + + [aat] Cosmetic touch-ups to trak table + + src/hb-aat-layout-trak-table.hh | 31 +++++++++++++++++-------------- + 1 file changed, 17 insertions(+), 14 deletions(-) + +commit abc82b493e301e5588d689baa1434b3ce6577fcd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 20 14:34:16 2018 -0800 + + Add Ragel-generated files to git + + I know it's bad form; I know I've said no to this multiple times... + But this is part of an experiment to see if we can make rolling + HarfBuzz + into Chrome much faster. That will give us a lot more testing exposure + that currently Chrome does. + + Doing this while those files are still considered ignored by our + gitignore rules; will see how that flies. + + autogen.sh | 10 +- + src/Makefile.am | 3 +- + src/hb-ot-shape-complex-indic-machine.hh | 1319 + ++++++++++++++++++++++++++++ + src/hb-ot-shape-complex-khmer-machine.hh | 294 +++++++ + src/hb-ot-shape-complex-myanmar-machine.hh | 413 +++++++++ + src/hb-ot-shape-complex-use-machine.hh | 502 +++++++++++ + 6 files changed, 2535 insertions(+), 6 deletions(-) + +commit 69e443b254fceb29f26f6a0c0129fe3c93c19cfb +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 20 14:29:21 2018 -0800 + + [subset] Switch to hb_blob_copy_writable_or_fail in glyf subsetting. + + src/hb-ot-glyf-table.hh | 29 +++++++++++------------------ + src/hb-ot-maxp-table.hh | 3 +-- + 2 files changed, 12 insertions(+), 20 deletions(-) + +commit e3e0ac98238b78530a625a6b7e7647dbabbe1c4d +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 20 14:07:40 2018 -0800 + + [subset] Move glyf subsetting code into hb-ot-glyf-table.hh + + src/hb-ot-glyf-table.hh | 49 + +++++++++++++++++++++++++++++++++++++++++++++++- + src/hb-subset.cc | 50 + +------------------------------------------------ + 2 files changed, 49 insertions(+), 50 deletions(-) + +commit d1f16fce963092404bf0b59e449a3215ca031b54 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 20 10:32:09 2018 -0800 + + Don't use %zu + + Some of our bots / compilers don't like it. Wasn't caught by bots + because this + is only in debug code. + + https://github.com/harfbuzz/harfbuzz/pull/809/commits/825ad378e0f0e6e6bb690894a0d5d25f198be21b + + src/hb-ot-cmap-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c7e834a2fc5f8fb81f5316447e4075902d58d8a3 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 20 17:59:04 2018 +0330 + + [dev-run] minor + + src/dev-run.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 975c35214f8c8f0d90a8b114e1a8c06d5ecdecfd +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 20 17:49:29 2018 +0330 + + [dev-run] Support autotools builds + + src/dev-run.sh | 46 +++++++++++++++++++++++++++++++--------------- + 1 file changed, 31 insertions(+), 15 deletions(-) + +commit 25136d9b7265d8920a78f3f832f1c69da4ef1f5b +Author: Dominik Röttsches <drott@chromium.org> +Date: Tue Feb 20 10:26:07 2018 +0200 + + Use %zu format specifier for size_t to fix cross platform build + + Fixes Chromium Android builds, compare + https://ci.chromium.org/buildbot/tryserver.chromium.android/linux_android_rel_ng/491787 + + src/hb-ot-cmap-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53cf61b0299775f94c625de1bb0a7979b3b0c379 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 20 10:53:10 2018 +0330 + + Change Alpine and ArchLinux bot to test O3 and O0 on gcc, #801 + + .circleci/config.yml | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit a64eacd8a6cb9811bcaadf20b8b8ae56306cbd75 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 19 23:27:08 2018 +0330 + + [aat] First dig on 'trak' + + src/Makefile.sources | 3 +- + src/hb-aat-layout-trak-table.hh | 100 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout.cc | 3 +- + src/hb-ot-layout-private.hh | 6 ++- + 4 files changed, 108 insertions(+), 4 deletions(-) + +commit 0bff6991de308044b077ce74bd45d57d8c4afe5f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 19 11:51:25 2018 -0800 + + Ugh. Really fix build. + + src/hb-subset-private.hh | 2 +- + src/hb-subset.cc | 3 +-- + test/api/hb-subset-test.h | 1 + + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 4fcbd22b18040cbfd7410e6a090c5f9624eb9a0f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 19 11:49:25 2018 -0800 + + Fix build after previous commit + + src/hb-subset-plan.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 0bbf90ded00dd00ee3f79c1bd16c775d7c893278 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 19 11:38:53 2018 -0800 + + [subset] Don't include hb-subset.h from hb.h + + src/hb.h | 1 - + 1 file changed, 1 deletion(-) + +commit fde04777d1d429fd0981002194f5c19599fda350 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 19 20:00:07 2018 +0330 + + Check availability of entr instead now that this works with it + + src/dev-run.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b095ce59ebc5723a1b9c049eebb8f204455c9a72 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 19 11:58:20 2018 +0330 + + Simplify hb-fuzzer output printing and fix ArchLinux bot + + test/fuzzing/run-fuzzer-tests.py | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit be51f763a752bed1c395bff19afe3291a6063d00 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 19 11:06:13 2018 +0330 + + Test debug builds on ArchLinux bot + + Fixes #805 + + .circleci/config.yml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e2d2d819848ed0ff1c60b9bde1f9c8f9495ec5b4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 17:28:53 2018 -0800 + + Limit how much work sanitize() can do + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6022 + + src/Makefile.am | 2 ++ + src/hb-open-type-private.hh | 16 + ++++++++++++++-- + .../233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf | Bin 0 -> + 1048576 bytes + test/shaping/data/in-house/tests/fuzzed.tests | 1 + + 4 files changed, 17 insertions(+), 2 deletions(-) + +commit 7033fe5877c6f9500575f20f17135f74dc9c0547 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 17:12:04 2018 -0800 + + [aat] Minor + + src/hb-aat-layout-common-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6fa690c75a572a1076124b428b76929b2674e532 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 16:27:59 2018 -0800 + + Fix debug build + + Context needs to be called 'c'. The TRACE_* rely on that. + + src/hb-ot-cmap-table.hh | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 05d1e77db8f3e5280e93b6885ff4f7df113b612b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 16:26:04 2018 -0800 + + [aat] Silence warning + + src/hb-aat-layout-kerx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a21fceb05311f61ef179b2f3aa6497562555f241 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 16:10:15 2018 -0800 + + [ci] Make AppVeyor less noisy + + appveyor.yml | 3 +++ + 1 file changed, 3 insertions(+) + +commit 1c50a88623a881a9e2b2b0f1f6a783962626f03a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 15:57:09 2018 -0800 + + Readjust mark attachment heuristic a bit more + + Previously adjusted logic could fail if nothing around was ligated, + and something moved. This should take care of that. + + CC https://github.com/harfbuzz/harfbuzz/issues/740 + + src/hb-ot-layout-gpos-table.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 246e280d88b6b26757297a349f01e52c15eaec53 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 15:42:25 2018 -0800 + + [test] Add test for https://github.com/harfbuzz/harfbuzz/issues/740 + + .../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf | Bin 0 -> + 5680 bytes + test/shaping/data/in-house/tests/use.tests | 1 + + 2 files changed, 1 insertion(+) + +commit 79756c9039a628b0df441228ca1ea20b8a91e3e8 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 19 03:17:44 2018 +0330 + + [aat] First dig on 'kerx' (#704) + + src/Makefile.sources | 1 + + src/hb-aat-layout-kerx-table.hh | 377 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout.cc | 1 + + src/hb-ot-layout-private.hh | 2 + + 4 files changed, 381 insertions(+) + +commit 279c70a5b36446f444e5d2f4ac1db7614c8a3db8 +Merge: e9164478 89b82814 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 14:04:33 2018 -0800 + + Merge pull request #796 from ebraminio/dev-run + + Add a continuous builder using fswatch + +commit e91644786bf7c278e75962b851d5d47011ff175c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 12:41:24 2018 -0800 + + Remove unused check + + configure.ac | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 89b82814b605d2bfcc481a47607e642a928dff15 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Feb 16 12:53:33 2018 +0330 + + Add a continuous builder using fswatch + + CMakeLists.txt | 24 +++++++++++++----------- + src/dev-run.sh | 22 ++++++++++++++++++++++ + test/api/CMakeLists.txt | 2 +- + 3 files changed, 36 insertions(+), 12 deletions(-) + +commit 0bd2d76bdd83569366762416bf7c8fd8e90021aa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 11:55:26 2018 -0800 + + [test] Fix a couple of coverity_scan issues + + test/api/hb-subset-test.h | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +commit 8089711a61687d565f207c56d3d2b658f514d7ab +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Feb 18 23:25:15 2018 +0330 + + Another attempt on fixing coverity + + I hope I am in a correct direction at least + + .travis.yml | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 79d0d791b9ee920e1f687a93de5adf5d113cc829 +Merge: 21646cc4 97a71102 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 11:35:51 2018 -0800 + + Merge pull request #800 from harfbuzz/bitops + + Optimize set through optimized bit operations + +commit 97a71102153d28982297a190739c7d82e76b109e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 10:50:24 2018 -0800 + + Fix BitScanForward() usage + + Should fix Win64 bot. + + src/hb-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit fe8f40a4180e7b02831a264c0b3c66763156abb6 +Merge: cd11107b 21646cc4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 18 10:45:33 2018 -0800 + + Merge branch 'master' into bitops + +commit 21646cc4a6160088933774e179df9be4865a9f4b +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Fri Feb 16 12:08:55 2018 -0500 + + Do not mark the first glyph as unsafe to break + + Fixes #791. + + src/hb-buffer-private.hh | 3 +-- + src/hb-coretext.cc | 4 ---- + src/hb-directwrite.cc | 2 -- + src/hb-graphite2.cc | 1 - + src/hb-uniscribe.cc | 2 -- + 5 files changed, 1 insertion(+), 11 deletions(-) + +commit 04dedec96b76600eecdb739b72814a4a56b270ae +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 18:32:57 2018 -0800 + + [test] Remove unused var + + test/api/test-subset-hmtx.c | 1 - + 1 file changed, 1 deletion(-) + +commit 181b7471074cc814e0f498fc05fd6850c3f5e403 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 17:08:44 2018 -0800 + + Update outdated TODO file + + TODO | 29 +---------------------------- + 1 file changed, 1 insertion(+), 28 deletions(-) + +commit 6d56db8983e03fbebbeb61282bef8cb1f9abb8e2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 17:02:57 2018 -0800 + + [test/api] Distribute all fonts + + test/api/Makefile.am | 21 ++------------------- + 1 file changed, 2 insertions(+), 19 deletions(-) + +commit e5ab34fd3a104f7ff2f0b36c66770c88b2ea1051 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 16:58:17 2018 -0800 + + Misc fixes + + Should bring bag djgpp bot. + + src/hb-ot-os2-table.hh | 54 + +++++++++++++++++++++++++------------------------- + src/hb-subset-plan.cc | 16 +++++++-------- + 2 files changed, 34 insertions(+), 36 deletions(-) + +commit df9e22656de746bde65dee775a66f1a80f1c2e32 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 16 17:02:51 2018 -0700 + + [subset] add a glyf subsetting test for a font with composite glyphs. + + .../api/fonts/Roboto-Regular.components.subset.ttf | Bin 0 -> 2052 bytes + test/api/fonts/Roboto-Regular.components.ttf | Bin 0 -> 2572 bytes + test/api/test-subset-glyf.c | 21 + +++++++++++++++++++++ + 3 files changed, 21 insertions(+) + +commit c36d015b0e9c363431cd9d228b776ad419fde474 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 16 17:02:15 2018 -0700 + + [subset] missing return. + + test/api/hb-subset-test.h | 1 + + 1 file changed, 1 insertion(+) + +commit 2130392dcc30784ee34c487ab16316006c91f16d +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 16 17:01:00 2018 -0700 + + [subset] Add support for updating reference gids in components to + their new values. + + src/hb-subset-glyf.cc | 38 +++++++++++++++++++++++++++++++++----- + 1 file changed, 33 insertions(+), 5 deletions(-) + +commit 49544eb860e523838892d6ce88eeca72ffd19da4 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 16 16:56:15 2018 -0700 + + [subset] Refactor composite glyf iteration code into an Iterator + outside of the accelerator. + + src/hb-ot-glyf-table.hh | 110 + +++++++++++++++++++++++++----------------------- + src/hb-subset-plan.cc | 6 +-- + 2 files changed, 60 insertions(+), 56 deletions(-) + +commit dc6d67df1395faf38d7587b1dd3c6661ee7cd6f0 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 16 15:20:14 2018 -0700 + + [subset] Use gids_to_retain_sorted to produce old gid -> new gid + mapping since it now has the more complete set. + + src/hb-subset-plan.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit dcac9fe96429d4e272a3fbd60a6162f988f58f71 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 16 11:27:03 2018 -0700 + + [subset] Use complex glyph closure to populate gids_to_retain_sorted. + + src/hb-subset-plan.cc | 43 ++++++++++++++++++++++++------------------- + src/hb-subset-plan.hh | 6 ++++++ + 2 files changed, 30 insertions(+), 19 deletions(-) + +commit 58a54c9d4f72e228c012451c4469da730742d3d8 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 16 11:20:38 2018 -0700 + + [subset] add constant to get_composite and in_table methods in + hb-ot-glyf-table + + src/hb-ot-glyf-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 73e1434814eb37005b4159babf972a2743b25700 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 15 14:41:56 2018 -0800 + + [subset] Add a DFS search to produce a closure of composite glyphs. + + src/hb-subset-plan.cc | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit d3684141437fad6ebf5f9945f92125c9a42ea853 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 15 14:03:34 2018 -0800 + + [subset] add helper methods to glyf accelerator for reading composite + glyph information. + + src/hb-ot-glyf-table.hh | 115 + ++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 112 insertions(+), 3 deletions(-) + +commit cd11107bb44ac719709e10264e9e6ba6a1cfae0c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 18:28:58 2018 -0800 + + Another bitops fallback fix + + I'm confident that all bugs are hashed out now. + + src/hb-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4e517ecb6b7c27d4053a6476bb9262858e2567ed +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 18:20:12 2018 -0800 + + Another bitops fallback impl fix + + src/hb-private.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f18b9fbf6583dff72675be7859fc147ec24a0dd2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 18:14:41 2018 -0800 + + [set] Implement iteration using bitop intrinsics + + src/hb-set-private.hh | 55 + ++++++++++++++++++--------------------------------- + 1 file changed, 19 insertions(+), 36 deletions(-) + +commit 6a91a2eb04951f6e33706c2b8e9cd987b429fce9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 17:49:41 2018 -0800 + + Fix wide bitops implemenetation + + src/hb-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d25c3e69e9b0cb9d947e98845b9e3a14ce58e350 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 17:45:09 2018 -0800 + + [set] Readjust parameters + + src/hb-set-private.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 6d5c0bf8b18ed53e8d40dcbae83ec66ed2116843 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 17:33:26 2018 -0800 + + Fix bitops fallback impl + + src/hb-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 82eb1dac163cb4aef8a2e4ebad542378f4e28dca +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 16:52:09 2018 -0800 + + Flesh out other bit ops some more for 128bit as well + + src/hb-private.hh | 165 + +++++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 126 insertions(+), 39 deletions(-) + +commit 864a2dddae9eb1303c59d0d3717fce307a72a524 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 14:21:40 2018 -0800 + + Clean up bit functions + + Compile all code-paths possible, to better catch errors. + Also enable MSVC ones on mingw which seems to support them. + + src/hb-private.hh | 43 +++++++++++++++++++++++++++---------------- + 1 file changed, 27 insertions(+), 16 deletions(-) + +commit 978ace6fbbc828adc20f21591d138f41d8508ebc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 16:06:17 2018 -0800 + + Improve _hb_popcount() + + Support 128bit type. + + configure.ac | 3 ++- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-map.cc | 2 +- + src/hb-private.hh | 61 + +++++++++++++++++++++++++++--------------- + 4 files changed, 44 insertions(+), 24 deletions(-) + +commit 7b5ce7404716a17f91ff86d374c7b76ee7ce3247 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 15:37:22 2018 -0800 + + Fix warnings + + src/hb-ot-os2-table.hh | 2 +- + test/api/hb-subset-test.h | 3 ++- + test/api/hb-test.h | 9 +++++++-- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit 94d32d1b83892ed4f124463cf4322bf74b3e850d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 15:36:20 2018 -0800 + + Enable C99 if available + + Hopefully we can now mix-and-match code and declaration in the C + test files. + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit 926db874552519734fab6c04258887ea634f5324 +Merge: 882a3bf4 c7a633f9 +Author: rsheeter <rsheeter@google.com> +Date: Fri Feb 16 15:27:29 2018 -0800 + + Merge pull request #792 from googlefonts/master + + Support more tables in subsetter + +commit 882a3bf4abcdac60414db41d54dbbb7d2368c908 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 14:17:20 2018 -0800 + + That didn't work... + + RELEASING.md | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b1f186df78ed14cbc8be919e7f552df2bd7561e0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 16 14:13:38 2018 -0800 + + Add mingw32.sh and mingw64.sh + + RELEASING.md | 28 +--------------------------- + mingw32.sh | 22 ++++++++++++++++++++++ + mingw64.sh | 22 ++++++++++++++++++++++ + 3 files changed, 45 insertions(+), 27 deletions(-) + +commit d37310ac5d5f8a3fd1ce1e535647e7c6bb0d7926 +Author: Arkady Shapkin <arkady.shapkin@gmail.com> +Date: Fri Feb 16 21:45:08 2018 +0300 + + Remove checking macros __OPTIMIZE__ for MSVC + + Visual C++ compiler doesn't define macros __OPTIMIZE__ when + optimizations enabled + + src/hb-private.hh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 4eff0fc5b87084765ac2e36ba9f09d7d257f32fb +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Fri Feb 16 20:22:52 2018 +0200 + + Make this work for old versions of automake + + .ci/fail.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit f8077c97909778c117d37773c9da570d831dacd2 +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Thu Feb 15 11:47:08 2018 +0200 + + Print only the failed log + + .ci/fail.sh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 8e3b4c0e11642470069b866a73768a866ac3fdb3 +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Thu Feb 15 11:25:24 2018 +0200 + + Simplify calls to collect-logs.sh + + .ci/{collect-logs.sh => fail.sh} | 3 +++ + .circleci/config.yml | 13 +++++++++---- + .travis.yml | 6 +++--- + appveyor.yml | 2 +- + 4 files changed, 16 insertions(+), 8 deletions(-) + +commit c7a633f95710fcf2fe9151b41feba7db4b1bab0e +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 16 11:11:20 2018 -0800 + + [subset] try to get more info from bot where g_assert_cmpmem fails + + test/api/hb-subset-test.h | 12 +++++------- + test/api/hb-test.h | 11 ++++++++--- + 2 files changed, 13 insertions(+), 10 deletions(-) + +commit 0bb2d7ac12b7cf482580b6d2e8534eef8a233f96 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 16 06:26:02 2018 -0800 + + [subset] fix int type for blob length in hb-subset-test.h + + test/api/hb-subset-test.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit be0a01a67613f45db7f7e9be84cb883f0344c817 +Merge: 7acaa3b7 139c9928 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 16 06:01:41 2018 -0800 + + Merge branch 'master' of https://github.com/harfbuzz/harfbuzz + +commit 139c9928f6152088fa6eee0279e33cb821aeb541 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Feb 16 13:27:26 2018 +0330 + + Fix hb-private.hh compile issue + + src/hb-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6c10328eb88b0641586f31a782b63f45eada5609 +Author: Arkady Shapkin <arkady.shapkin@gmail.com> +Date: Thu Feb 15 23:17:46 2018 +0300 + + Use _BitScanForward and _BitScanReverse on MSVC + + src/hb-private.hh | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 7acaa3b781da835cdb11dbe523c819feb4eef996 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 15 14:28:29 2018 -0800 + + [subset] apparently C99 is too much to ask in 2018 + + src/hb-ot-hmtx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b1740106a9c825874faf3f1315770d1e3c790cf9 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 15 13:55:21 2018 -0800 + + [subset] fix format specifier for size_t + + src/hb-ot-hmtx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e00c37aaae3922b425c0528bfdd36d59cf9c5796 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 15 12:53:52 2018 -0800 + + [subset] fix no matching function MIN in djgpp + + src/hb-ot-hmtx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6122ad2442666d89ef39bdf5a2bb9d3f6d8e2b03 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 15 11:40:28 2018 -0800 + + [subset] add files to EXTRA_DIST + + test/api/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0758cbc4c2f52c629d05515b8d2816e8d6a2a2c1 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 15 11:29:01 2018 -0800 + + [subset] correct bug introduced to get_advance + + src/hb-ot-hmtx-table.hh | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 3fd11f4397aec9cda3a7d29246ab3ae56115ad36 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 15 11:15:12 2018 -0800 + + [subset] remove unused decl + + src/hb-subset-private.hh | 3 --- + 1 file changed, 3 deletions(-) + +commit 23d21a74b55eaf6d6d367097099e6b3bb78bae37 +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Thu Feb 15 02:52:15 2018 +0200 + + Move collect_logs to .ci dir + + Next to other CI scripts. + + .collect_logs => .ci/collect-logs.sh | 0 + .circleci/config.yml | 8 ++++---- + .travis.yml | 6 +++--- + appveyor.yml | 2 +- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit 0e088a63d10dd09e025515bfa8ae68aa2922eaf6 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 21:11:45 2018 -0800 + + [subset] hmtx space bracket. authors++ + + src/hb-ot-hmtx-table.hh | 40 ++++++++++++++++++++-------------------- + 1 file changed, 20 insertions(+), 20 deletions(-) + +commit 1725c35da0ea2f829b6d6b6c1963607fd6dfb577 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 19:36:33 2018 -0800 + + [subset] cmap space bracket + + src/hb-ot-cmap-table.hh | 72 + ++++++++++++++++++++++++------------------------- + 1 file changed, 36 insertions(+), 36 deletions(-) + +commit e158739bfb9e5d60989e179fcc8744f3125e2067 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 19:22:37 2018 -0800 + + [subset] space bracket + + src/hb-ot-hmtx-table.hh | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 2d6b1e2af74abea645a943d264e148d56d018101 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 19:14:01 2018 -0800 + + [subset] maxp copy writeable fn + + src/hb-ot-maxp-table.hh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 1efecd965fe81d65e2763be4f43df2d8c4d8be44 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 18:42:29 2018 -0800 + + [subset] hmtx use copy writeable fn instead of direct memory + + src/hb-ot-hmtx-table.hh | 23 ++++------------------- + 1 file changed, 4 insertions(+), 19 deletions(-) + +commit 27012526f9b3848676bc2a4fb8e68c630af18620 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 19:01:00 2018 -0800 + + [subset] whitespace + + test/api/test-subset-hmtx.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit b1bd0b5f506dad9d04fd3a6abcb92122f231e0f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 18:50:19 2018 -0800 + + [subset] Minor + + src/hb-ot-cmap-table.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 83f57e24bfc2000373192ec44b067fdd7dee8a65 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 18:43:53 2018 -0800 + + [test] Reinstate + test/shaping/data/in-house/tests/myanmar-syllable.tests + + test/shaping/data/in-house/tests/myanmar-syllable.tests | 1 + + 1 file changed, 1 insertion(+) + +commit 5ae6526ef4aa9b3c943cad984dc2fff09cdf597b +Merge: 2903b2f3 04c1ec2b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 18:42:32 2018 -0800 + + [subset] Merge remote-tracking branch 'googlefonts/master' + +commit 04c1ec2b7396c05f6e8afc9d87679422782aa1e8 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 17:00:18 2018 -0800 + + [subset] Don't fail on different checksum adjustment in subsetting + tests. + + .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 -> + 1692 bytes + test/subset/run-tests.py | 8 ++++++++ + 2 files changed, 8 insertions(+) + +commit 0775bc0f7a59241456142b48abced75fd3db5a42 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 16:37:35 2018 -0800 + + [subset] Fix hhea subsetting and clean up some memory leaks. + + src/hb-ot-hmtx-table.hh | 25 ++++++++++++++----------- + 1 file changed, 14 insertions(+), 11 deletions(-) + +commit b56c9384bcc177236debd26fdbbf14319e4c62b9 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 16:05:39 2018 -0800 + + [subset] Add missing face reference in hb-subset-plan plus ensure + all struct members are cleaned up on destroy. + + src/hb-subset-plan.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit e0ffebead6230b8e1ee8dd97425505706321793e +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 16:01:08 2018 -0800 + + [subset] In hb-subset-test use hb_set_union instead of manually + copying set. + + test/api/hb-subset-test.h | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit e330ef3711c543372f9f8550a967c512bbf87d83 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 15:57:11 2018 -0800 + + [subset] Restore hb_face_data_destroy to be internal. + + src/hb-subset.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 3ab7d2649bf5c92d3837b3132d65d4659d0fa003 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 15:48:57 2018 -0800 + + [subset] Fix memory leak in hb-ot-{maxp,os2}. Plus some formatting. + + src/hb-ot-maxp-table.hh | 6 ++++-- + src/hb-ot-os2-table.hh | 24 +++++++++++++----------- + 2 files changed, 17 insertions(+), 13 deletions(-) + +commit 2903b2f357eb495c9badac1b2f74e65e1d1075bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 15:46:27 2018 -0800 + + Another linker tweaking + + Trying to fix this warning: + cc1: warning: command line option ‘-fno-threadsafe-statics’ is + valid for C++/ObjC++ but not for C + + Let's see what the clang bots think of it. + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e1f1f96577a80846749782b6e199a661f4189ec0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 15:44:48 2018 -0800 + + [set] Tune size again + + Switch from a 128+64 hierarchy, to 32+32. New page size is 1024. + This should make set iteration faster, without affecting other op + performances much. + + src/hb-set-private.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 66e282df32410831f1c4e157e9dcf8c76f2bc3d8 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 15:31:13 2018 -0800 + + [subset] remove TODO that was already done + + src/hb-subset-plan.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 4696624ad9987b0eebcf5c84dafdb204b886f28e +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 15:30:49 2018 -0800 + + [subset] maxp wrong int type, note to use copy_writable_or_fail + + src/hb-ot-maxp-table.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3ed70e5e64910e1c22225f542a525807b000cb2a +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 15:24:49 2018 -0800 + + [subset] return bool not hb_bool_t from table::subset + + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-os2-table.hh | 2 +- + src/hb-subset.cc | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 88d56e241bd6bb768656d77cf8f99ccc97fb2446 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 15:20:43 2018 -0800 + + [subset] Use a supplier instead of memcpy and fix a few unnecessary + {}s for cmap + + src/hb-ot-cmap-table.hh | 24 ++++++------------------ + 1 file changed, 6 insertions(+), 18 deletions(-) + +commit 42a80f00d51317207c49611b76d6bba06230371b +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 15:04:35 2018 -0800 + + [subset] add free + + src/hb-ot-hmtx-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit d463e9f6b57bebb3aa4875fe11c927c26c3e3974 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 15:04:15 2018 -0800 + + [subset] Give Behdad credit again + + src/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa87770372a3156658412ff0d70e32083c6b0484 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 14:16:25 2018 -0800 + + [subset] First pass at hmtx + + src/hb-ot-cmap-table.hh | 19 +-- + src/hb-ot-hhea-table.hh | 6 +- + src/hb-ot-hmtx-table.hh | 163 + ++++++++++++++++++--- + src/hb-ot-maxp-table.hh | 8 +- + src/hb-ot-os2-table.hh | 8 +- + src/hb-subset-glyf.cc | 5 +- + src/hb-subset-glyf.hh | 1 - + src/hb-subset-plan.cc | 12 ++ + src/hb-subset-plan.hh | 10 ++ + src/hb-subset-private.hh | 11 ++ + src/hb-subset.cc | 85 ++++++----- + test/api/Makefile.am | 7 + + test/api/fonts/Inconsolata-Regular.ab.ttf | Bin 0 -> 5048 bytes + test/api/fonts/Inconsolata-Regular.abc.ttf | Bin 0 -> 5224 bytes + test/api/fonts/Inconsolata-Regular.abc.widerc.ttf | Bin 0 -> 5228 bytes + test/api/fonts/Inconsolata-Regular.ac.ttf | Bin 0 -> 4940 bytes + test/api/fonts/Inconsolata-Regular.ac.widerc.ttf | Bin 0 -> 4944 bytes + test/api/fonts/README | 2 + + test/api/test-subset-hmtx.c | 164 + ++++++++++++++++++++++ + 19 files changed, 422 insertions(+), 79 deletions(-) + +commit 20022575c658b29796db80c387641309d0c49586 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Feb 15 01:15:39 2018 +0330 + + Redirect email notifications to another mailing list dedicated for + this (#790) + + .travis.yml | 4 ++-- + appveyor.yml | 5 +++++ + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 581996ea7976847b6356c9cc81b564f0c278f0f3 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Feb 15 00:43:46 2018 +0330 + + Add .collect_logs and use it on CI bots, fixes #786 (#789) + + .circleci/config.yml | 8 ++++---- + .collect_logs | 6 ++++++ + .travis.yml | 6 +++--- + appveyor.yml | 2 +- + 4 files changed, 14 insertions(+), 8 deletions(-) + +commit e5edcc81bf14311c56bd2f50808552076c3c4d77 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 11:17:53 2018 -0800 + + [subset] Fix codepoint iteration in hb-subset-test. + + test/api/hb-subset-test.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ccae99fdadcf86aeda15dc230a3ddcd6ff176533 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 11:12:09 2018 -0800 + + Another try + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8b1dbbef1aec3b6880186070e7386a5553d67b15 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 11:04:12 2018 -0800 + + Fix compile error in hb-subset-test. + + test/api/hb-subset-test.h | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit f53627e19100df6eb7f32d58e7c4ce47a783f1a6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 10:59:22 2018 -0800 + + [test] Fix warning + + test/api/test-subset.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8c3612af650e4c8e01a9fdc127342b07b5c77962 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 10:57:34 2018 -0800 + + Tweak Makefile some more + + src/Makefile.am | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit d594f947b68ad36d32ce107847f5f02ec3528076 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 10:55:25 2018 -0800 + + [subset] Allow linking to libstdc++ + + We want to use it. + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a0fe3011bafbe36e7d5810acc7df21bea08c802a +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 14 10:52:41 2018 -0800 + + copy all cmap groups at once + + src/hb-ot-cmap-table.hh | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +commit d008b62887afe631f50009f40e605c8456ddd011 +Merge: b0eefacf 109314cb +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 14 10:38:52 2018 -0800 + + Merge remote-tracking branch 'upstream/master' into fixed + +commit b0eefacf4cb885f510f9551bf2e9216808ca61e8 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 18:15:58 2018 -0800 + + [subset] Drop GSUB, GDEF, GPOS, and DSIG from subsetter expected + test outputs. + + .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 2460 -> + 1740 bytes + test/subset/generate-expected-outputs.py | 1 + + 2 files changed, 1 insertion(+) + +commit 89f17e3965ba776565f2de2bf56a4b135f336e53 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 18:14:50 2018 -0800 + + [subset] capitalize dsig. + + src/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit df6d780355d7da805a9b9033452f8814c5360bba +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 17:56:17 2018 -0800 + + [subset] Extract maxp subsetting into hb-ot-maxp-table. + + src/hb-ot-maxp-table.hh | 19 ++++++++++++++++++- + src/hb-subset.cc | 28 ++-------------------------- + test/api/test-subset-glyf.c | 5 +++-- + 3 files changed, 23 insertions(+), 29 deletions(-) + +commit 865b6971ad5c2ec4bc33c36a78a36b90da5f5543 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 17:42:20 2018 -0800 + + [subset] Add a test for OS/2 fixes during subsetting. + + test/api/Makefile.am | 2 ++ + test/api/fonts/Roboto-Regular.b.ttf | Bin 0 -> 1996 bytes + test/api/test-subset-os2.c | 59 + ++++++++++++++++++++++++++++++++++++ + 3 files changed, 61 insertions(+) + +commit 343dfe89655683966836e44afb4fd32c47377844 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 17:33:48 2018 -0800 + + [subset] white and add inline in hb-ot-cmap-table. + + src/hb-ot-cmap-table.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 24904383df03c472c865bd97bfe844f5e86a7172 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 17:31:01 2018 -0800 + + [subset] Correct usFirstCharIndex and usLastCharIndex in OS2 table + when subsetting. + + src/hb-ot-os2-table.hh | 45 +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset.cc | 16 ++++++++++------ + 2 files changed, 55 insertions(+), 6 deletions(-) + +commit 109314cb55e6d95d5c3a87b9ed1ba4e74a880078 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Feb 14 21:05:11 2018 +0330 + + Another attempt on fixing the tests on Travis (#788) + + src/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 694eaf636713b8d0bbe13f38c2553b1a2f3d2d3a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 14 01:00:10 2018 -0800 + + [set] Add backwards iterator + + New API: + - hb_set_previous() + - hb_set_previous_range() + + docs/harfbuzz-sections.txt | 2 ++ + src/hb-set-private.hh | 79 + +++++++++++++++++++++++++++++++++++++++++++++- + src/hb-set.cc | 49 +++++++++++++++++++++++++++- + src/hb-set.h | 19 ++++++++--- + test/api/test-set.c | 53 +++++++++++++++++++++++++++++-- + 5 files changed, 194 insertions(+), 8 deletions(-) + +commit fe3bc524bd4f93bd67c13ed402720a13dd3484d3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 23:51:45 2018 -0800 + + [set] Allow starting iteration from a non-member of the set + + src/hb-set-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a989f3edec5864d5de8b217aa595c962d8fc4b0a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 22:12:36 2018 -0800 + + Add hb_blob_copy_writable_or_fail() + + New API: + - hb_blob_copy_writable_or_fail() + + docs/harfbuzz-sections.txt | 1 + + src/hb-blob.cc | 25 +++++++++++++++++++++++++ + src/hb-blob.h | 3 +++ + 3 files changed, 29 insertions(+) + +commit 9046e924421869bf167b52cd394e868796091f62 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 22:07:12 2018 -0800 + + [subset] Rename constructor to hb_subset_input_create_or_fail() + + To signify that unlike rest of library, returns nullptr on failure. + + src/hb-subset-input.cc | 6 ++---- + src/hb-subset.h | 2 +- + test/api/test-subset-glyf.c | 3 ++- + test/api/test-subset.c | 7 +++++-- + util/hb-subset.cc | 2 +- + 5 files changed, 11 insertions(+), 9 deletions(-) + +commit 507804479a81672ec0c089313adad9fa308d78fd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 21:46:28 2018 -0800 + + [use] Add dump-use-data + + src/Makefile.am | 4 ++++ + src/dump-use-data.cc | 38 + ++++++++++++++++++++++++++++++++++ + src/gen-use-table.py | 2 +- + src/hb-ot-shape-complex-use-private.hh | 2 +- + src/hb-ot-shape-complex-use-table.cc | 2 +- + src/hb-ot-shape-complex-use.cc | 4 ++-- + 6 files changed, 47 insertions(+), 5 deletions(-) + +commit 15ba4fbe01433c8627f9e6a60106ca77d3e1ad4c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 21:41:51 2018 -0800 + + [khmer] Add dump-khmer-data + + src/Makefile.am | 4 + + src/Makefile.sources | 1 + + src/dump-khmer-data.cc | 43 +++++++++++ + src/hb-ot-shape-complex-khmer-private.hh | 124 + +++++++++++++++++++++++++++++++ + src/hb-ot-shape-complex-khmer.cc | 98 +----------------------- + 5 files changed, 173 insertions(+), 97 deletions(-) + +commit effddd03bd6fb0aac14b46a16b281f3749e44780 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 21:38:15 2018 -0800 + + [myanmar] Add dump-myanmar-data + + src/Makefile.am | 4 + + src/Makefile.sources | 1 + + src/dump-myanmar-data.cc | 43 ++++++++ + src/hb-ot-shape-complex-indic-private.hh | 8 +- + src/hb-ot-shape-complex-myanmar-private.hh | 171 + +++++++++++++++++++++++++++++ + src/hb-ot-shape-complex-myanmar.cc | 138 +---------------------- + 6 files changed, 225 insertions(+), 140 deletions(-) + +commit c0e45b60a001a45c8ed1f12af8f2f222161eca6a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 21:23:38 2018 -0800 + + [indic] Rename print-indic-table to dump-indic-data + + Makes more sense given what this prints, err, dumps. + + src/Makefile.am | 8 ++++---- + src/{print-indic-table.cc => dump-indic-data.cc} | 0 + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 9b878bd2165236b067d59410673cf5cc54968fa7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 21:22:47 2018 -0800 + + [indic] Explicitly number indic_position_t + + So it's easier to cross-reference from output of print-indic-table. + + src/hb-ot-shape-complex-indic-private.hh | 32 + ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit 8634846a0a1049c42ea84ca34402957c981b4c73 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 21:18:00 2018 -0800 + + More tweaking linker and linker flags + + src/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit d830d3d2448b2248dff642c701b442e1260e2d85 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 19:01:03 2018 -0800 + + [indic] Share some copy/pasta code + + src/hb-ot-shape-complex-indic-private.hh | 29 + +++++++++++++++++++++++++++-- + src/hb-ot-shape-complex-indic.cc | 27 --------------------------- + src/hb-ot-shape-complex-khmer.cc | 30 + ++++++++---------------------- + src/hb-ot-shape-complex-myanmar.cc | 19 ++----------------- + 4 files changed, 37 insertions(+), 68 deletions(-) + +commit 397ed53e55b9450742867a43d164b498ec735f50 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 18:54:26 2018 -0800 + + [indic] Add print-indic-table + + src/Makefile.am | 14 ++- + src/hb-ot-shape-complex-indic-private.hh | 185 + ++++++++++++++++++++++++++++++ + src/hb-ot-shape-complex-indic.cc | 187 + ------------------------------- + src/print-indic-table.cc | 43 +++++++ + 4 files changed, 239 insertions(+), 190 deletions(-) + +commit fd0bde6325a7dfe3ba54b683646ca0693c414446 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 16:35:30 2018 -0800 + + [subset] Fix loca offsets + + Was writing source font's offsets. Ouch. + + src/hb-subset-glyf.cc | 30 +++++++++++------------------- + 1 file changed, 11 insertions(+), 19 deletions(-) + +commit aeed082e282b97e40c2e8590bdd8818affc7de6c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 14:02:59 2018 -0800 + + Another tweak at libstdc++ things + + To fix this warning: + + cc1: warning: command line option ‘-fno-threadsafe-statics’ is + valid for C++/ObjC++ but not for C + + src/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c7d7c9898e22905888dc4304f6d8e79b55654174 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 14:00:14 2018 -0800 + + [aat] Minor + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2dbfeecf96c6993d42594f43133d945d67ddbdbc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 13:59:39 2018 -0800 + + Minor + + src/hb-aat-layout-morx-table.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit d5b33f2fe1603e894e21f45afb4c00c8d670fb5c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 13:50:50 2018 -0800 + + [subset] hb_subset_input_t changes + + src/Makefile.sources | 1 + + src/hb-face.h | 1 - + src/hb-set.cc | 14 +++--- + src/hb-subset-input.cc | 109 + ++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset-plan.cc | 2 +- + src/hb-subset-private.hh | 11 ++++- + src/hb-subset.cc | 40 ++-------------- + src/hb-subset.h | 12 ++++- + test/api/test-subset-glyf.c | 4 +- + test/api/test-subset.c | 2 +- + util/hb-subset.cc | 20 ++++---- + 11 files changed, 153 insertions(+), 63 deletions(-) + +commit 28e63a1287fd38a98eed6725c2f4d0820066b0d8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 13 13:39:50 2018 -0800 + + Disable threadsafe static's for all libraries + + Even in libharfbuzz-subset, we still will handle our own threadsafety + for statics. + + src/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7caddb51b1e69a2803f86756e2ce2acff685c7d0 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 13 15:12:43 2018 +0330 + + Specify the project name for coverity, trying to fix #785 + + .travis.yml | 1 + + 1 file changed, 1 insertion(+) + +commit b969a82e30f0ff7bf6b2ea2600ef170764774a8c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 12 20:51:26 2018 -0800 + + Pass no-libstdc++ flags only to libraries suppressing it + + src/Makefile.am | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 97a2f0320056b591d7a747022869fe9cd8ecc6e1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 12 18:51:10 2018 -0800 + + [subset] Allocate bulk memory with malloc(), not calloc() + + We use calloc() to allocate simple structs and set them to zero. + For bulk memory, use malloc() that doesn't zero. + + src/hb-subset-glyf.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 96f1f52ea3a42b27f59aecffe65c918295e53b3b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 12 18:48:51 2018 -0800 + + Use hb_face_get_upem() instead of face->get_upem() + + Such that hmtx accelerator can be used from libharfbuzz-subset. + + src/hb-ot-cbdt-table.hh | 2 +- + src/hb-ot-hmtx-table.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 3d66f441cc4d4feb2fd4b03be9f764c91f4de8b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 12 18:43:42 2018 -0800 + + [subset] Remove unreachable code + + sanitizer.sanitize never return nullptr. + + src/hb-subset.cc | 4 ---- + 1 file changed, 4 deletions(-) + +commit 42040a273facc696d9a54fc4d89857665e87e3d1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 12 18:41:36 2018 -0800 + + Allow libharfbuzz-subset to link to libstdc++ + + We want to use it instead of reinventing hashmap... + + Also, don't change linker for ICU since libicu also uses libstdc++. + + src/Makefile.am | 2 -- + src/check-libstdc++.sh | 3 ++- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 4af3c5e25822cc5a401837da547c75a17b7f7b48 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 23:21:24 2018 +0330 + + Move linker specifying to a better place + + src/Makefile.am | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +commit 8cf8b78faaf3e7ee261bdc44a1ad5a1973eab1a2 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 16:30:21 2018 -0800 + + [subset] whitespace + + test/api/test-subset-cmap.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit d1a4d5616f792c6ad84bcc5011040167ddd7cc3f +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 16:25:32 2018 -0800 + + output format 12 as enc 10 to match how Roboto did it + + src/hb-ot-cmap-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 89ee20f1a39ac78268b57a9aebe8e7428f9944bf +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 16:01:15 2018 -0800 + + basic wiring for a (failing) cmap test + + test/api/Makefile.am | 2 + + test/api/fonts/README | 1 + + .../Roboto-Regular.abc.cmap-format12-only.ttf | Bin 0 -> 2412 bytes + .../fonts/Roboto-Regular.ac.cmap-format12-only.ttf | Bin 0 -> 2212 bytes + test/api/hb-subset-test.h | 3 +- + test/api/test-subset-cmap.c | 82 + +++++++++++++++++++++ + test/api/test-subset-glyf.c | 5 +- + .../data/in-house/tests/myanmar-syllable.tests | 1 - + 8 files changed, 87 insertions(+), 7 deletions(-) + +commit afb1da3a1891b7c0fdd047bcb7b3bde86e830444 +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 14:37:47 2018 -0800 + + auto-completed the wrong gids_to_retain + + src/hb-subset-plan.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1330edc4fe3ffbf18313d6432045606865c610c4 +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 14:29:23 2018 -0800 + + Use functions to get new gids. Avoid 0; fonttools drops it from cmap. + + src/hb-ot-cmap-table.hh | 24 ++++++++++++++++++------ + src/hb-subset-plan.cc | 25 ++++++++++++++++++++----- + src/hb-subset-plan.hh | 5 +++++ + src/hb-subset.cc | 2 +- + 4 files changed, 44 insertions(+), 12 deletions(-) + +commit 1639bdd33122dc8e5522b95c37660273d1fc609e +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 13:40:42 2018 -0800 + + [subset] Remove test-subset, testing is planned to be done at the + table level here with test/subset covering the complete subsetting + operation. + + test/api/Makefile.am | 1 - + test/api/test-subset.c | 73 + -------------------------------------------------- + 2 files changed, 74 deletions(-) + +commit 4cdd1b16c99f2681eb11d626c4408eebcc1672be +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 13:36:28 2018 -0800 + + [subset] added todo in test-subset-glyf. + + test/api/test-subset-glyf.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1714feef4f7ec9e758e65edcbe5d5591562f46ee +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 13:35:17 2018 -0800 + + [subset] re-enable test-subset-glyf. Refactor to use common functions + in hb-subset-test.h + + test/api/test-subset-glyf.c | 109 + +++++++++++--------------------------------- + 1 file changed, 27 insertions(+), 82 deletions(-) + +commit d8d8bd8405ec0db781c4c2bbb7ebd6ff520b3c2d +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 13:33:55 2018 -0800 + + [subset] Add some helper functions for writing tests around + subsetting. + + test/api/Makefile.am | 2 +- + test/api/hb-subset-test.h | 123 + ++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 124 insertions(+), 1 deletion(-) + +commit e8318188c0e53a267a01c45b0fc8d29ad775738a +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 11:38:28 2018 -0800 + + [subset] Fix loca generation, was previously writing the original + glyph starting offset. + + src/hb-subset-glyf.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 0b94d590d971de0b44b0db941c7a3e095f15fbc9 +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Mon Feb 12 16:45:36 2018 +0200 + + Rename --with-stdcpp → --with-libstdc++ + + Also improve wording a bit and fix make check in --with-libstdc++=yes. + + configure.ac | 11 ++++++----- + src/Makefile.am | 11 ++++++++--- + 2 files changed, 14 insertions(+), 8 deletions(-) + +commit a5713bc2cb4a3fd71d3bc94b9f155339b09eb71a +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 11:30:45 2018 -0800 + + we love all our groups + + src/hb-ot-cmap-table.hh | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 692f86e569847adb332186cbb08f344ebe41fa6c +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 11:29:23 2018 -0800 + + drop GDEF, GPOS, GSUB, and dsig + + src/hb-subset.cc | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 83e1ef92156d8688b96d14957efcdf7601768799 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 11:22:32 2018 -0800 + + [subset] Set the new number of glyphs in maxp. + + src/hb-ot-maxp-table.hh | 5 +++++ + src/hb-subset.cc | 37 ++++++++++++++++++++++++++++++++----- + 2 files changed, 37 insertions(+), 5 deletions(-) + +commit 427f9e4b90bfadb8af13cbd27b7c3ee0153ca8b1 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 11:18:28 2018 -0800 + + Don't force loca version to long. + + src/hb-subset-glyf.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 5df080bf155a12f98929b99438da492063ab9218 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 12 10:15:59 2018 -0800 + + Destroy the subset plan at the end of subsetting. + + src/hb-subset.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 0301e5be286f5080ec34e9f30c75e73f28d0218b +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 10:12:11 2018 -0800 + + Build a working cmap format 12 + + src/hb-ot-cmap-table.hh | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit ebd31d376d63c9698c0eae34ed295558f7230918 +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 10:10:08 2018 -0800 + + subset for real + + src/hb-subset.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 62c7d677e8699143e55e7bfa0cc3c1db75f32506 +Author: Rod Sheeter <rsheeter@google.com> +Date: Mon Feb 12 10:09:35 2018 -0800 + + C-style comments + + src/hb-open-file-private.hh | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit 91f0d51f0525097fef6173046379a89414cb515f +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 17:20:12 2018 +0330 + + Fix symbol exporting issue on msys2 and ✅ bringing all the bots + (#781) + + src/Makefile.am | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit 133e17fe2335abb77f61dbf1cff1955c21334137 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 15:24:22 2018 +0330 + + Minor + + src/check-defs.sh | 1 + + 1 file changed, 1 insertion(+) + +commit 16f5b53eec4c3238cf92438a17e6dc532e8a61f5 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 15:18:13 2018 +0330 + + Minor, don't skip the whole test when one .def file not found + + src/check-defs.sh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit a9b650d38407f6f2a26d8386e801600b1004d5d6 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 15:10:13 2018 +0330 + + Apply check-defs.sh to -icu and -subset, toward mingw fix (#780) + + CMakeLists.txt | 11 ++++++++--- + src/Makefile.am | 21 ++++++++++++++++----- + src/check-defs.sh | 12 +++++------- + src/gen-def.py | 9 ++++++--- + 4 files changed, 35 insertions(+), 18 deletions(-) + +commit 2efc8965506d8fd31934be1dba3322f922f3409d +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 12:00:07 2018 +0330 + + Add --with-stdcpp for ossfuzzer and mupdf use (#770) + + configure.ac | 12 ++++++------ + src/Makefile.am | 14 +++++++++++++- + 2 files changed, 19 insertions(+), 7 deletions(-) + +commit 82e04758c895ce2cd6bddde5f72e592c718fcb69 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 11:56:32 2018 +0330 + + minor + + .travis.yml | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 7daa2822f6320801dfed09782ae46687e7c8cbb3 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Feb 12 11:27:00 2018 +0330 + + Add Travis based Coverity trigger (#778) + + .ci/trigger-coverity.sh | 13 +++++++++++++ + .travis.yml | 14 ++++++++++++++ + 2 files changed, 27 insertions(+) + +commit 7747bdb11b0635738a14c099bfaf58461cadd79a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 19:12:52 2018 -0800 + + Remove linker selection from hb-ucdn + + Since this is a convenience library, it's not actually linked. Or + so I think. + Hoping this might fix this Appveyor failure: + + https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/job/9884jyb5vryja9pw + + Making all in hb-ucdn + make[4]: Entering directory '/c/projects/harfbuzz/src/hb-ucdn' + CC libhb_ucdn_la-ucdn.lo + GEN libhb-ucdn.la + /bin/sh: libhb_ucdn_la-ucdn.lo: command not found + make[4]: *** [Makefile:404: libhb-ucdn.la] Error 127 + make[4]: Leaving directory '/c/projects/harfbuzz/src/hb-ucdn' + make[3]: *** [Makefile:2548: all-recursive] Error 1 + make[3]: Leaving directory '/c/projects/harfbuzz/src' + make[2]: *** [Makefile:1382: all] Error 2 + make[2]: Leaving directory '/c/projects/harfbuzz/src' + make[1]: *** [Makefile:486: all-recursive] Error 1 + make[1]: Leaving directory '/c/projects/harfbuzz' + make: *** [Makefile:418: all] Error 2 + + src/hb-ucdn/Makefile.am | 11 ----------- + 1 file changed, 11 deletions(-) + +commit 90d1c740c370b97dfff52420db013ed50075b984 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 19:08:59 2018 -0800 + + Add MSVC to no-visibility list + + src/hb-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0db6c6f214a83ffeeefb7c3b77476567e534facb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 18:28:10 2018 -0800 + + Add Sun compiler to no-visibility as well + + Fixes https://github.com/harfbuzz/harfbuzz/pull/776 + + src/hb-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d33ba163611c42acd0125472191ea40745f905eb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 18:26:41 2018 -0800 + + Fix more warnings + + test/api/test-buffer.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit dde6448379c9eeb0fc7cc476688002be661229b8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 18:24:22 2018 -0800 + + Another try at fixing multiple-defintion of NullPool + + This one might do it... + + src/hb-open-type-private.hh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit b5f25844fbdd3167051c8d3586b404ae7f077b3b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 19:49:18 2018 -0600 + + [docs] Minor update + + docs/harfbuzz-sections.txt | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 41906cd5efc2fe17f5fff3fa5fe8488e0cdc6399 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 19:46:06 2018 -0600 + + [subset] Another fixup + + I broke this in c31fcf4c58d96eb7d9781a986991b1a79ac7be44 + + src/hb-ot-cmap-table.hh | 2 +- + test/subset/run-tests.py | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit cd32177a322b5fd70c92f67f21b64686bf5d5533 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 19:34:05 2018 -0600 + + Try at fixing multiple-definition of NullPool + + If we don't have visibility, make NullPool static. + + src/hb-open-type-private.hh | 8 +++++++- + src/hb-ot-layout.cc | 2 ++ + src/hb-private.hh | 4 +--- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit 3d421ce30713582484471baba76470c84dabc118 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 19:01:44 2018 -0600 + + [subset] Use auto_array_t where it does make sense + + Better fix for https://github.com/harfbuzz/harfbuzz/pull/775 + + src/hb-subset-plan.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 9aa2eb61e6cb3e4308140bed8a8531877ffd6adf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 11 19:00:42 2018 -0600 + + Minor + + src/hb-ot-cmap-table.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit ae6d0259b4f075885070f833d0f2a96333bf4af3 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Feb 11 15:40:55 2018 +0330 + + Install fonttools on two bots and enable cmake hb-subset test (#777) + + .circleci/config.yml | 6 ++++-- + test/subset/CMakeLists.txt | 8 ++++---- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit c8d4c2e32f1cea610a9c91dc6b0c32e9ffe84f20 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Feb 11 13:15:44 2018 +0330 + + Initialize bad_indices on hb-subset (#775) + + src/hb-subset-plan.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 5845e5ca3bac21c0b03e71eab282b02fb7e868a4 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Feb 11 12:03:33 2018 +0330 + + fix gobject compile issue (#773) + + src/hb-gobject-structs.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9b5af3ec7f80a7793d5d3891e762d83026de0a5b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 21:50:26 2018 -0600 + + [gpos] Adjust mark attachment heuristic + + Hopefully it... + fixes https://github.com/harfbuzz/harfbuzz/issues/740 + + src/hb-ot-layout-gpos-table.hh | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 70b06cc6e71e15f0d7550f67b113eed5e6f30a5f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 16:13:06 2018 -0600 + + More fixes + + util/hb-subset.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 6c1848b1e3b8969afc441f094b0d7b64b4b14933 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 15:52:35 2018 -0600 + + Misc warning fixes + + test/api/test-blob.c | 2 +- + test/api/test-buffer.c | 14 +++++++------- + test/api/test-ot-tag.c | 2 +- + 3 files changed, 9 insertions(+), 9 deletions(-) + +commit 7039803b51f23cb15dd7e12b105c379bd2e38d71 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 15:47:50 2018 -0600 + + Fix djgpp bot + + src/hb-subset-glyf.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cdab20df1e55da196ffc6bc00d580e5ef74c1975 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 15:45:17 2018 -0600 + + Minor + + src/hb-ot-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 203b647530b1550388bb3ce2f67e3b17e019d3e4 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Feb 11 01:00:03 2018 +0330 + + Favor use of static instead HB_INTERNAL + + src/hb-subset-glyf.cc | 8 ++++---- + src/hb-subset-plan.cc | 4 ++-- + src/hb-subset.cc | 2 +- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit 4c5bdb4b39a723b624346d9b9ff9ace964fff0fe +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 15:40:54 2018 -0600 + + [test] Disable test-subset-glyf for now + + test/api/test-subset-glyf.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 43314ff4c05076decbd1eb07ed78f732b6ebcba9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 15:40:03 2018 -0600 + + More fixes + + test-subset-glyf still failing. No idea why :( + + src/hb-subset.cc | 3 +-- + test/api/test-subset-glyf.c | 26 ++++++++++++++++---------- + 2 files changed, 17 insertions(+), 12 deletions(-) + +commit a981d798eab41b6a7c6484776f04fe178bd536ba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 15:17:28 2018 -0600 + + Fix more build issues + + Hopefully most bots come back with this... + + src/check-libstdc++.sh | 5 +++-- + src/check-symbols.sh | 2 +- + src/hb-buffer.h | 1 - + src/hb-gobject-structs.h | 6 ++++++ + src/hb-subset-plan.cc | 10 +++++++--- + src/hb-subset.cc | 6 +++--- + 6 files changed, 20 insertions(+), 10 deletions(-) + +commit 6c4ca6135a2ce846431b0ede6a288d3b2f97167e +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sun Feb 11 00:42:06 2018 +0330 + + Hide more symbols of hb-subset (#771) + + src/hb-subset-plan.cc | 2 +- + src/hb-subset.cc | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit c31fcf4c58d96eb7d9781a986991b1a79ac7be44 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 14:20:10 2018 -0600 + + [subset] Replace auto_array with prealloced_array + + auto_array has constructor/destructor. Cannot be used in POD object, + as the clang + bots all noticed... + + src/hb-ot-cmap-table.hh | 8 ++++---- + src/hb-subset-glyf.cc | 6 +++--- + src/hb-subset-plan.cc | 23 +++++++++++------------ + src/hb-subset-plan.hh | 9 +++------ + 4 files changed, 21 insertions(+), 25 deletions(-) + +commit 931d67900ee6d96b5962a475c1b71a58b821bcba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 14:11:16 2018 -0600 + + Fix some other bots + + src/hb-subset-glyf.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 4011d885b7fca87c717fdaa4bd0318a42308865a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 14:09:06 2018 -0600 + + [util] Remove use of ssize_t which was failing on MSVC + + util/hb-subset.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit bfa871634ce9ef9f4ed18348d898686952d6cbe3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 13:37:28 2018 -0600 + + Minor + + src/hb-subset-glyf.hh | 2 +- + src/hb-subset-plan.hh | 2 +- + src/hb-subset.cc | 3 +-- + src/hb-subset.h | 2 +- + 4 files changed, 4 insertions(+), 5 deletions(-) + +commit 844f48ea9a72d28e2c088497f6c403c54e1751a8 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Feb 10 23:13:12 2018 +0330 + + Fix symbol exporting and libstdc++ linkage of hb-subset (#769) + + CMakeLists.txt | 6 ++---- + src/Makefile.am | 3 +++ + src/check-defs.sh | 2 +- + src/check-libstdc++.sh | 20 +++++++++++--------- + src/check-symbols.sh | 28 +++++++++++++++------------- + src/hb-subset-glyf.cc | 8 ++++---- + src/hb-subset-glyf.hh | 2 +- + src/hb-subset-plan.cc | 4 ++-- + src/hb-subset-plan.hh | 8 ++++---- + src/hb-subset.cc | 2 +- + src/hb-ucdn/Makefile.am | 11 +++++++++++ + 11 files changed, 55 insertions(+), 39 deletions(-) + +commit 91519c6a5b130ced569cedc3710ab395b663240d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 13:35:17 2018 -0600 + + [aat] Add buffer messages + + src/hb-aat-layout-morx-table.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit af274507c4f4c5a582543affa71d81a87d6d9151 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 13:25:49 2018 -0600 + + Minor + + src/hb-private.hh | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit 570d523761b23a3c668d9071712d5f10944d21fc +Merge: 71130a20 d18decd2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 13:24:22 2018 -0600 + + [subset] Merge remote-tracking branch 'googlefonts/master' + +commit 71130a20fae7c256b0ab1aa397cc1ac2d11dd487 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 13:15:57 2018 -0600 + + Replace Supplier.advance with Supplier::operator+= + + src/hb-open-file-private.hh | 4 ++-- + src/hb-open-type-private.hh | 7 ++++--- + src/hb-ot-layout-common-private.hh | 4 ++-- + src/hb-ot-layout-gsub-table.hh | 10 +++++----- + 4 files changed, 13 insertions(+), 12 deletions(-) + +commit d0f3e7f59719bdb6a2105ee85a8f3ee799741dab +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Feb 10 12:45:28 2018 -0600 + + [util] Use setlinebuf() if present + + To work around mysterious bug on OS X. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/727 + + configure.ac | 6 ++---- + util/options.cc | 12 ++++++++++-- + 2 files changed, 12 insertions(+), 6 deletions(-) + +commit ad575a5f47a51ee553710873ac2672479b76ba5e +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Feb 10 19:50:11 2018 +0330 + + Fix cast warnings on clang (#768) + + src/hb-open-type-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d18decd2013f24f315dbd3b15cdd80c5a734e7e9 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 9 18:41:21 2018 -0800 + + In glyf subsetting add suport for writing out a short loca table + when possible. + + src/hb-subset-glyf.cc | 42 +++++++++++++++++++++++++++++++++--------- + 1 file changed, 33 insertions(+), 9 deletions(-) + +commit 9275bd03ea427eb607dde6a8e65f78a350b88323 +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 9 17:33:34 2018 -0800 + + First pass at building a cmap + + src/hb-ot-cmap-table.hh | 103 + ++++++++++++++++++++++++++++++++++++++++++++---- + src/hb-subset.cc | 37 +++++++++-------- + 2 files changed, 115 insertions(+), 25 deletions(-) + +commit d2170d14780ad6f8e0d17a1e011445c3bcc20871 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 9 17:24:16 2018 -0800 + + Check for failures from add table. + + src/hb-subset.cc | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 4816064c0e5464d032a55001a959a9abcef7f70e +Author: Rod Sheeter <rsheeter@google.com> +Date: Fri Feb 9 17:14:37 2018 -0800 + + add missing return + + src/hb-private.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 0089443756cdcef0182e55cf8480b96a64d31cc7 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 9 16:22:09 2018 -0800 + + Keep a second set of glyph ids in subset plan which is sorted by + glyph id and always has gid 0 + + src/hb-subset-glyf.cc | 2 +- + src/hb-subset-plan.cc | 34 +++++++++++++++++++++++++--------- + src/hb-subset-plan.hh | 1 + + 3 files changed, 27 insertions(+), 10 deletions(-) + +commit 3bc81558d836e27e77bda0d6da9c71f530719579 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 9 16:06:33 2018 -0800 + + Formatting for hb-subset-plan. + + src/hb-subset-plan.cc | 51 + +++++++++++++++++++++++++++------------------------ + 1 file changed, 27 insertions(+), 24 deletions(-) + +commit 8cef3a61995317d3a5724221108647d7e66fe24a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 9 16:04:23 2018 -0600 + + Try fixing build with Sun Studio + + Trying to fix: + https://circleci.com/gh/harfbuzz/harfbuzz/6635 + + Also part of: + https://github.com/harfbuzz/harfbuzz/issues/630 + + src/hb-private.hh | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 86aa4b3ba7cd075f01614874dae88a771b8c54fd +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 9 13:54:43 2018 -0800 + + Return empty face on hb_subset failure instead of null. Plus some + minor cleanups for _add_head_and_set_loca_version + + src/hb-subset.cc | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit d45f240e4e330cedad737fdb792b311c37a19e32 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 9 15:51:45 2018 -0600 + + Typo + + src/hb-buffer.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3b7aa651b4714b996816023a4929c0289065493f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 9 15:43:20 2018 -0600 + + [docs] Improve UNSAFE_TO_BREAK docs + + src/hb-buffer.h | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +commit 671f0a7733a496eb46b08dc88c3c46b804cdd895 +Author: bungeman <bungeman@chromium.org> +Date: Thu Feb 1 13:31:25 2018 -0500 + + Documentation for HB_GLYPH_FLAG_UNSAFE_TO_BREAK. + + HB_GLYPH_FLAG_UNSAFE_TO_BREAK means that the glyph with this flag is + somehow affected by the previous logical glyph (the previous index + in the buffer if ltr and the next index if the buffer is rtl). If + these two glyphs are separated by a break (line or otherwise) then the + underlying text should be re-shaped on both sides up to corresponding + position in the text of some glyph not marked with this flag. + + src/hb-buffer.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 1582eabee6017839518b821ef93a329a0a86a453 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 9 12:52:08 2018 -0800 + + Update head table with loca format selected by glyf+loca subsetting. + + src/hb-subset-glyf.cc | 7 +++---- + src/hb-subset-glyf.hh | 1 + + src/hb-subset.cc | 37 +++++++++++++++++++++++++++++++++++-- + 3 files changed, 39 insertions(+), 6 deletions(-) + +commit 335bbaa66f66e86d417cc123a2bf397e8b834f64 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 9 10:55:15 2018 -0800 + + Remove uneeded code in hb-subset. + + src/hb-subset.cc | 19 ------------------- + 1 file changed, 19 deletions(-) + +commit 3346ba9cd5198d27c7416b8c71fecb6c8d3cb335 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 9 11:05:17 2018 -0600 + + [test/text-rendering-tests] Update from upstream + + .../text-rendering-tests/fonts/TestMORXTwentysix.ttf | Bin 3260 -> + 3252 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 1cd98d05e07498653ba60a68b6342d1a90429eba +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 8 19:39:57 2018 -0800 + + Create the groups for a cmap format12. Does not yet build the + actual table. + + src/hb-ot-cmap-table.hh | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +commit 59c658c8d53481990fe0efa66422353d0687474b +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 8 19:22:47 2018 -0800 + + capture codepoints sorted so we can use them for cmap later. one + day we will have a map + + src/hb-ot-cmap-table.hh | 14 --------- + src/hb-private.hh | 61 +++++++++++++++++++++++++--------------- + src/hb-subset-glyf.cc | 16 +++++------ + src/hb-subset-plan.cc | 75 + ++++++++++++++++++++++++++++++++++--------------- + src/hb-subset-plan.hh | 8 ++++-- + src/hb-subset.cc | 29 ++++++++++++------- + 6 files changed, 123 insertions(+), 80 deletions(-) + +commit 8431c38cdc05ddcddb1aa5fbb72a95446b500fd2 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 8 19:20:58 2018 -0800 + + remove output noise + + util/hb-subset.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 5cca0c07afbe9ab4b28d333f6f853063ecd75aff +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 8 19:05:46 2018 -0800 + + fix comment + + src/hb-open-file-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a19138e668e77a0c05da2ab065c5366c8359b377 +Author: Rod Sheeter <rsheeter@google.com> +Date: Thu Feb 8 19:03:41 2018 -0800 + + comment the serialization of table + + src/hb-open-file-private.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 5a34114f9685680d4a8cdf85a8ac90172c5620d7 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 18:32:24 2018 -0800 + + Add an extra entry to the end of the loca table to identify the end + of the last glyph's data. + + src/hb-subset-glyf.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit aac7d962120aa137385324b33a173df4f19fd80b +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 18:18:16 2018 -0800 + + Apply per table subsetting while building the new face in hb_subset. + + src/hb-subset-glyf.cc | 1 + + src/hb-subset.cc | 105 + ++++++++++++++++++++++++++++++-------------------- + 2 files changed, 65 insertions(+), 41 deletions(-) + +commit 3e81832432a1cae0dc28242bb6ff279753effd27 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 15:55:12 2018 -0800 + + Disable subset tests on cmake for now. + + test/subset/CMakeLists.txt | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 2f941053111d60433ab39cc70edd69c962896961 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 15:55:12 2018 -0800 + + Disable subset tests on cmake for now. + + test/subset/CMakeLists.txt | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit e081c9e8fc84843740c8a55b49403acc3fe4f0b7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 17:44:24 2018 -0600 + + Oops! + + test/subset/run-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1c49afe179e7e1884ceeae1d93e50fa51f18f894 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 17:38:58 2018 -0600 + + Whitespace + + test/subset/run-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9682ef135f16cb3368b9c5970fdcec71301b687e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 17:35:57 2018 -0600 + + Minor fixups + + CMakeLists.txt | 2 +- + src/hb-ot-cmap-table.hh | 6 +++--- + src/hb-subset.cc | 6 +++--- + test/api/hb-test.h | 5 +++++ + test/api/test-subset-glyf.c | 4 ---- + test/api/test-subset.c | 4 ---- + 6 files changed, 12 insertions(+), 15 deletions(-) + +commit 35eeb893efcdfa2bf6a136cd2911d564334e573c +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 15:17:34 2018 -0800 + + Don't include subset headers in libharfbuzz. + + CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +commit 42234424a0fc43d298be082b4c7b1e288e94bbb6 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 15:11:15 2018 -0800 + + Fix include gaurds and include order in hb-subset-glyf and + hb-subset-plan + + src/hb-subset-glyf.hh | 6 ++++-- + src/hb-subset-plan.cc | 2 +- + src/hb-subset-plan.hh | 5 +++-- + 3 files changed, 8 insertions(+), 5 deletions(-) + +commit 0f3c756cbfe8a263ee388481acac7a24d9684c44 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 14:59:32 2018 -0800 + + Add CMake config for building a separate harfbuzz-subset. + + CMakeLists.txt | 17 ++++++++++++++--- + test/api/CMakeLists.txt | 2 +- + 2 files changed, 15 insertions(+), 4 deletions(-) + +commit d4d120ad79ff65c6987ca127da5d9ee30740b0b1 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 14:26:18 2018 -0800 + + Skip subset to fonttools comparison test if TTX is not present. + + test/subset/run-tests.py | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 29d915284e46fb9be01221a88c9e969080daa1b2 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 11:31:27 2018 -0800 + + Whitespace + + test/subset/run-tests.py | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit f9420d9effcfb3464d4b99e54decb3d90e4a410d +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 8 11:30:36 2018 -0800 + + In the hb-subset to fontTools comparison, use ttx to compare the + fonts. This allows for some binary differences such as re-ordered + tables. + + test/subset/run-tests.py | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +commit 8e9fd6f1ab491519cf7205467bc5d20056fce99d +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 19:01:21 2018 -0800 + + Implement basic loca (long version only) subsetting. + + src/hb-subset-glyf.cc | 66 + +++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 46 insertions(+), 20 deletions(-) + +commit f9c665fed1347f7af6d36ba129f9d174f4ac54dc +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 16:53:18 2018 -0800 + + Update interface to hb-subset-glyf to subset glyf and loca. + + src/hb-subset-glyf.cc | 10 +++++++--- + src/hb-subset-glyf.hh | 7 ++++--- + src/hb-subset.cc | 7 +++++-- + 3 files changed, 16 insertions(+), 8 deletions(-) + +commit f2ceb5ee4d745e0e6e754f0b0ea16b29dbedbf1b +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 16:47:31 2018 -0800 + + Comment out failing assert in test-subset-glyf for now. Should be + re-enabled once hb_subset is writing out a new face. + + test/api/test-subset-glyf.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 89dbebd4ad948ddad8e10323315a809c11d7cafa +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 16:32:56 2018 -0800 + + Add a basic test for glyf subsetting. + + test/api/Makefile.am | 4 + + test/api/fonts/Roboto-Regular.abc.ttf | Bin 0 -> 2460 bytes + test/api/fonts/Roboto-Regular.ac.ttf | Bin 0 -> 2268 bytes + test/api/test-subset-glyf.c | 134 + ++++++++++++++++++++++++++++++++++ + 4 files changed, 138 insertions(+) + +commit 217ed5e3c885532fa8b332cc0d0f9cb4eef32e2b +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 16:30:07 2018 -0800 + + Cleanups in hb-subset-glyf and hb-subset-plan. + + src/hb-subset-glyf.cc | 30 +++++++++++++++--------------- + src/hb-subset-plan.hh | 2 +- + 2 files changed, 16 insertions(+), 16 deletions(-) + +commit 13193a9b97302480cc11787787fa6826a97be4bb +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 7 16:09:52 2018 -0800 + + move to the hb_face_t dest pattern + + src/hb-ot-cmap-table.hh | 7 ++++++- + src/hb-subset.cc | 28 +++++++++++++--------------- + 2 files changed, 19 insertions(+), 16 deletions(-) + +commit 0859a006695097c2a66a07284f3cc5b8de8edb05 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 7 15:59:36 2018 -0800 + + sketch a subset<T> and call it for cmap. Add subset to cmap, albeit + not working even for the msot basic case just yet + + src/hb-ot-cmap-table.hh | 18 ++++++++++++++++-- + src/hb-subset.cc | 30 ++++++++++++++++++++++++++++++ + 2 files changed, 46 insertions(+), 2 deletions(-) + +commit c1ab95dd907b1c4a2e2de17447683fe803fe4087 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 17:22:07 2018 -0600 + + Fix overflow in space fallback shaping + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=657466 + + src/hb-ot-shape-fallback.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b220b5a44425db387b2149c4904a43ab369a2d6a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 17:14:52 2018 -0600 + + Avoid undefined-behavior in fallback mark positioning + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5584 + + src/hb-ot-shape-fallback.cc | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 3b68a03a1c5a23adbc73f4508009dd5b72bc9d81 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 17:00:37 2018 -0600 + + [fuzzer] Minor + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 194140d3f352b53b95757cccb7fff50425747cd6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 16:27:57 2018 -0600 + + [util] Minor + + util/hb-subset.cc | 2 +- + util/options.hh | 10 ++++++++-- + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit 5021ba2a2186a77d7d70be5602b960d14634d8b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 15:11:28 2018 -0600 + + [aat] Minor + + src/hb-aat-layout-common-private.hh | 10 +++++----- + src/hb-aat-layout-morx-table.hh | 7 +++---- + 2 files changed, 8 insertions(+), 9 deletions(-) + +commit 1242ad8424f5e8357fe6fd2143430aa8cfaf0954 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Feb 8 14:10:01 2018 -0600 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 2 ++ + test/shaping/data/text-rendering-tests/Makefile.sources | 2 ++ + .../text-rendering-tests/fonts/TestMORXTwentyfive.ttf | Bin 0 -> + 3260 bytes + .../text-rendering-tests/fonts/TestMORXTwentysix.ttf | Bin 0 -> + 3260 bytes + .../data/text-rendering-tests/tests/MORX-25.tests | 9 +++++++++ + .../data/text-rendering-tests/tests/MORX-26.tests | 2 ++ + 6 files changed, 15 insertions(+) + +commit 77ad8b5c8b3a9148cf2944abdd494618e642ee2c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 21:54:33 2018 -0600 + + TODO + + src/hb-open-file-private.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 941bbd9f257367f838e55d079751c6059974fe2f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 21:49:01 2018 -0600 + + [subset] Fix thinko + + src/hb-open-file-private.hh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 931f8b7eb5e740ce81e5be6bfec60dbe3ac7ebc4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 21:42:03 2018 -0600 + + Fix another thinko + + src/hb-open-file-private.hh | 2 +- + src/hb-private.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 39b86695cf56736170c772424c9a8b75bca0254c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 21:37:03 2018 -0600 + + [subset] Fix thinko + + src/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eeffabc87572193a9e95f22647e80ae44e5a0089 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 21:34:05 2018 -0600 + + Build + + src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c479a59988b0cf3e557e22e97e1977962c803fa7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 21:13:10 2018 -0600 + + [subset] Assemble font + + src/hb-open-file-private.hh | 50 + +++++++++++++++++++++++++++++++++++++++++++- + src/hb-open-type-private.hh | 33 +++++++++++++++++++++++------ + src/hb-ot-map-private.hh | 10 ++++----- + src/hb-private.hh | 20 +++++++++++------- + src/hb-set-private.hh | 8 +++---- + src/hb-subset.cc | 51 + +++++++++++++++++++++++++++++++++++++++------ + test/api/test-subset.c | 9 ++++++-- + 7 files changed, 150 insertions(+), 31 deletions(-) + +commit 34ac3548b7c9dbc57f277cf9a7a337cd1a8a04bb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 18:07:45 2018 -0600 + + [set] Respect stride + + Ouch! + + src/hb-set-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 577becaf7b5ccd9de8ba533447f944427b9e4452 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 17:38:40 2018 -0600 + + [subset] Fixup + + src/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c9acab3cfbe4a21e86ad309ebb452f103b1c1b04 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 17:12:55 2018 -0600 + + Whitespace + + src/hb-open-file-private.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7fd0b61dee18380c302009f8be9cd68dadab7308 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 16:44:52 2018 -0600 + + [subset] Create new face and copy all tables to it + + test-subset fails now because subset-face does not know how to + compile itself. + + src/hb-subset.cc | 37 ++++++++++++++++++++++++++----------- + 1 file changed, 26 insertions(+), 11 deletions(-) + +commit 4e1abe2ce0b5163cbbbb8f8be0e9f7deba5ab2cb +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 13:28:11 2018 -0800 + + Refactor subset glyf to remove multiple calls to glyf.fini() + + src/hb-subset-glyf.cc | 52 + +++++++++++++++++++++++++++++---------------------- + 1 file changed, 30 insertions(+), 22 deletions(-) + +commit 0a5d1440f829f07454592adde9dd3aa93ad74442 +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 13:09:54 2018 -0800 + + Add implementation of glyf subsetting. + + src/hb-subset-glyf.cc | 81 + +++++++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 76 insertions(+), 5 deletions(-) + +commit 05d65baa1bb64664ba838993fd35f3899d52eb8d +Author: Garret Rieger <grieger@google.com> +Date: Wed Feb 7 10:55:30 2018 -0800 + + Extract glyf offset calculation into it's own method. + + src/hb-ot-glyf-table.hh | 26 ++++++++++++++++++-------- + 1 file changed, 18 insertions(+), 8 deletions(-) + +commit 6d7c6e19dc769cf9997b7c1f8a4598eb44ca0b3c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 14:09:56 2018 -0600 + + Fix two undefined-behavior issues + + Fixes https://github.com/harfbuzz/harfbuzz/issues/761 + Fixes https://github.com/harfbuzz/harfbuzz/issues/762 + + src/hb-ot-hmtx-table.hh | 4 ++-- + src/hb-ot-layout-gsubgpos-private.hh | 10 +++++----- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit b87cbe2bec1d589621ba143af59443f63230ffeb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 14:11:26 2018 -0500 + + Try fixing build for platforms that have no visibility attributes + + src/hb-private.hh | 1 + + src/hb-subset.cc | 2 ++ + src/main.cc | 2 ++ + 3 files changed, 5 insertions(+) + +commit f70100417c71cff071c119607a7b75dcead05a05 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 13:58:23 2018 -0500 + + [test] Minor + + test/api/test-ot-tag.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6804b61d2e49fcf9eac9fa0b86497ba91b220bee +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 13:47:35 2018 -0500 + + [subset] Add hb_subset_face + + It's a hb_face_t that has add_table() and in the future knows how to + compile itself into a font blob. + + src/hb-private.hh | 9 ++++++ + src/hb-subset.cc | 88 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 97 insertions(+) + +commit af02812fc51812a7e2265a1100bbca1a5bf8af45 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 13:07:46 2018 -0500 + + [subset] Change hb_subset API to remove hb_subset_face_t + + src/hb-subset-plan.cc | 12 ++++++++--- + src/hb-subset-plan.hh | 2 +- + src/hb-subset-private.hh | 10 ---------- + src/hb-subset.cc | 52 + ++++++++---------------------------------------- + src/hb-subset.h | 25 ++++++----------------- + test/api/test-subset.c | 9 +++++---- + util/hb-subset.cc | 12 ++++++----- + 7 files changed, 36 insertions(+), 86 deletions(-) + +commit 2da0d87e769b2ced71e4281e336bdbca65de2b3f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 12:44:35 2018 -0500 + + Remove NullPool visibility hack + + We keep a separate private NullPool in libharfbuzz-subset.so + This can fire back later since now there are two separate null + objects, + and comparisons to the null pool can be confused. Something to deal + with when it comes up. Ouch! + + src/hb-open-type-private.hh | 4 +--- + src/hb-subset.cc | 4 ++++ + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit b95aa204ee284c47e63dc1e34b3c5b4bdf9e7ab7 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 7 09:37:06 2018 -0800 + + glyph ids to retain should most likely keep the glyph id not the + codepoint + + src/hb-subset-plan.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 91428713bd6975b3bbfbdce54701f6aef5457121 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 7 09:35:59 2018 -0800 + + Remove \ns leftover from fprintf + + src/hb-subset-plan.cc | 4 ++-- + src/hb-subset.cc | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit eb485bb9e90017abaf7dcdd7e39a82125d6807c3 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 7 09:32:36 2018 -0800 + + Horrid hack to assign new gids. Use DEBUG_MSG over fprintf + + src/hb-subset-plan.cc | 27 +++++++++++++++++++++++---- + src/hb-subset-plan.hh | 5 +++++ + src/hb-subset.cc | 9 +++++++++ + 3 files changed, 37 insertions(+), 4 deletions(-) + +commit 8b80cbb1dd13e2870a956825f5dafc4419b44200 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 7 09:31:31 2018 -0800 + + Add a subset debug category + + src/hb-debug.hh | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit ee433d36fa544c3138718cc3f796b29e6df8a195 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 12:30:18 2018 -0500 + + [aat] Set debug lookup_index + + src/hb-aat-layout-common-private.hh | 2 ++ + src/hb-aat-layout-morx-table.hh | 3 +++ + 2 files changed, 5 insertions(+) + +commit 38df1ec8e0b457be9140c67e2c5c19153714d90e +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Feb 7 07:58:58 2018 -0800 + + TEMPORARY: remove HB_INTERNAL from null pool so subset builds again + + src/hb-open-type-private.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 53aa0e95420c5c3bfe8af21cf7956535d35b06e6 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 6 17:05:22 2018 -0800 + + Add an instance of glyf::accelerator_t to hb-subset-glyf. + + src/hb-subset-glyf.cc | 13 ++++++++++--- + src/hb-subset-glyf.hh | 2 +- + src/hb-subset.cc | 4 +--- + 3 files changed, 12 insertions(+), 7 deletions(-) + +commit ef62dfed3fc7cfad7f7ce9292cb3bd1616f09384 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Feb 6 17:12:17 2018 -0800 + + add back assert_pod + + src/hb-subset-private.hh | 1 + + 1 file changed, 1 insertion(+) + +commit d0ce3c66e2af2785203f7bbb1d4abca5c226045d +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Feb 6 16:58:35 2018 -0800 + + Resolve codepoints:glyph ids. Does not compile; undefined reference + to OT::_hb_NullPool + + src/hb-subset-plan.cc | 25 +++++++++++++++++++------ + src/hb-subset-plan.hh | 2 +- + src/hb-subset-private.hh | 17 +++++++++++++++-- + src/hb-subset.cc | 13 ++++--------- + 4 files changed, 39 insertions(+), 18 deletions(-) + +commit 6a45e5df24ccc59c5a39bf42323c9b550f49e16d +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 6 16:04:09 2018 -0800 + + Add skeleton of hb-subset-glyf, call if from hb_subset(...) + + src/Makefile.sources | 2 ++ + src/hb-subset-glyf.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset-glyf.hh | 37 +++++++++++++++++++++++++++++++++++++ + src/hb-subset.cc | 18 ++++++++++++++++-- + 4 files changed, 100 insertions(+), 2 deletions(-) + +commit 31ec3c2ec41161c6ae75bc91d1c237bf2d245e37 +Author: Garret Rieger <grieger@google.com> +Date: Tue Feb 6 15:37:34 2018 -0800 + + Create a subset plan in hb_subset. + + src/hb-subset.cc | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 6c52d94fd11915b76e858bc45633ee60b8c1d8f4 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Feb 6 15:31:14 2018 -0800 + + capture the set of codepoints passed by --unicodes + + util/hb-subset.cc | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit 25e9173fe8446735f7e36ec963c7d3554c85631b +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 17:26:25 2018 -0800 + + Make hb-subset-plan private. + + src/Makefile.sources | 2 +- + src/hb-subset-plan.cc | 27 + ++++++++++++++++----------- + src/{hb-subset-plan.h => hb-subset-plan.hh} | 22 +++++++++++++--------- + 3 files changed, 30 insertions(+), 21 deletions(-) + +commit af46a4da5a47dd6e0dd98e1740f18e93c337e689 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 17:14:46 2018 -0800 + + Move definition of hb_subset_input into hb-subset-private.hh. + + src/Makefile.sources | 1 + + src/hb-subset-plan.cc | 2 +- + src/hb-subset-private.hh | 40 ++++++++++++++++++++++++++++++++++++++++ + src/hb-subset.cc | 12 ++---------- + 4 files changed, 44 insertions(+), 11 deletions(-) + +commit 7481f0ce21489d2b19b2e33d05358736ddee20bf +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 16:05:12 2018 -0800 + + Add codepoints to subset input. + + src/hb-subset.cc | 24 ++++++++++++++++-------- + src/hb-subset.h | 2 +- + test/api/test-subset.c | 2 +- + util/hb-subset.cc | 2 +- + 4 files changed, 19 insertions(+), 11 deletions(-) + +commit 1cfe650f020cf440bf157daa9907bffd6e35bd7a +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 15:22:30 2018 -0800 + + Add a basic sketch of hb-subset-plan. + + src/Makefile.sources | 2 ++ + src/hb-subset-plan.cc | 72 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset-plan.h | 49 +++++++++++++++++++++++++++++++++++ + 3 files changed, 123 insertions(+) + +commit 126ffdbe95020c04dc61413690febd8a56bf264f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Feb 7 12:26:41 2018 -0500 + + [aat] Fix debug compile + + src/hb-aat-layout-common-private.hh | 6 +++++- + src/hb-aat-layout-morx-table.hh | 2 +- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 8cb8bfd5b5eff75247cd447f3766294fdff2d644 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 6 20:40:42 2018 +0330 + + [test] Fix test-subset on old distros (#758) + + https://developer.gnome.org/glib/stable/glib-Testing.html#g-assert-cmpmem + + test/api/test-subset.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 2971e9da49d6ac07f8a9a4e9b00e167b800a5c7f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 6 11:48:04 2018 -0500 + + [aat] Adjust unsafe-to-break logic some more + + I believe I'm happy with it now. + + src/hb-aat-layout-common-private.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f49256d80f19bc265e6a197719345313ba26f9d6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 6 11:39:36 2018 -0500 + + [aat] Simplify unsafe-to-break logic + + src/hb-aat-layout-common-private.hh | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit cc1e0840baed881f2bfd8468a9645bfe94f47303 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Feb 6 10:20:48 2018 -0500 + + [buffer] Tweak diff re glyph_flags again + + We expect the buffer to have no flags that the reference doesn't... + Meh. Makes MORX tests pass now. Need to better define the behavior. + + src/hb-buffer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d49ae5154e0b069ffa2605ea3f66abb583319ec8 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 6 13:48:10 2018 +0330 + + Fix hb-buffer logic error + + src/hb-buffer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 70e13ade81a2a09e17d75bdc7e3fe45d8ec9e2c6 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Feb 6 13:20:38 2018 +0330 + + [subset] Fix Windows issue on endlines (#756) + + util/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f41b92134a276716b7e2d7ef54996b30f36a10a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 5 19:51:09 2018 -0500 + + Fix fallthrough compiler warning with gcc >= 7 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/755 + + src/hb-private.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit b7b7f0ac59ec85b224e13d9e6c3c4063e731ad32 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Feb 5 19:40:31 2018 -0500 + + [test] Minor + + test/api/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 0ff007daaa471d05cc0473beec4ba4d434b084b1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 20:22:07 2018 -0500 + + [subset] Minor + + src/hb-subset.h | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit fc1e82a5aef410138381bc8f5476dcff5679b464 +Merge: ae39fc81 2ea22893 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 15:35:13 2018 -0800 + + Merge pull request #754 from googlefonts/master + + Fix build for subsetting code. + +commit 2ea228935d41b55fed45b7423b69bc15b42e3abc +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 15:10:01 2018 -0800 + + ssize_t -> size_t + + util/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c25898eb54217e2a1c681233a6b9adcd7940652e +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 14:35:32 2018 -0800 + + Switch to fopen() instead of open() in subset test. open wasn't + compiling on windows. + + util/hb-subset.cc | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit fc04f11ce1999da042a39c5b271351223033292f +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 11:12:33 2018 -0800 + + Rename HB_SUBSET_sources -> HB_SUBSET_CLI_sources to match what + cmake is looking for. + + util/Makefile.am | 3 +-- + util/Makefile.sources | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit e428f7b1c21e0a7d6b9af507d98031b8eebcbeb5 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 10:24:16 2018 -0800 + + Wrap unistd.h include in ifdef. + + util/hb-subset.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5f6eb1256fb6c251303d3728fc27875fe7a9ffb8 +Author: Garret Rieger <grieger@google.com> +Date: Mon Feb 5 10:23:38 2018 -0800 + + Add libharfbuzz-subset.la to linking when building api tests. + + test/api/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ae39fc8171b2c26d4ae64954a8055732c9241bcc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 20:18:52 2018 -0500 + + [subset] Build hb-subset into separate libharfbuzz-subset.so + + src/Makefile.am | 19 +++++++++++++------ + src/harfbuzz-subset.pc.in | 12 ++++++++++++ + util/Makefile.am | 2 ++ + 3 files changed, 27 insertions(+), 6 deletions(-) + +commit eac20e459564134e0087497ed76b1c84195ad7e3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 20:08:50 2018 -0500 + + [subset] Minor + + util/Makefile.am | 2 +- + util/Makefile.sources | 2 +- + util/hb-subset.cc | 10 +++++----- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit 257022b1789f928975b04b5d214bbe9192e11997 +Merge: 3615f344 edcd3b80 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 20:01:35 2018 -0500 + + Merge pull request #745 from googlefonts/master + + Interface for hb_subset, skeleton for the hb-subset cli, and basic + testing rigging. + +commit 3615f344ec00059972d8ce75522022b5294764a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 17:19:58 2018 -0500 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 1 + + test/shaping/data/text-rendering-tests/Makefile.sources | 3 ++- + .../text-rendering-tests/fonts/TestMORXTwentythree.ttf | Bin 0 -> + 1836 bytes + .../data/text-rendering-tests/tests/MORX-23.tests | 1 + + 4 files changed, 4 insertions(+), 1 deletion(-) + +commit 54e6efadd6a30587736858d3fb497ed4e5e5f252 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 14:58:02 2018 -0500 + + [aat] Fix unsafe-to-break + + At any position, if state is not zero, mark unsafe-to-break before, + unless we can reason it safe. + + At any position, if there's an action entry for end-of-text, mark + unsafe to break. + + Also changes buffer diff impl to allow for flag differences as long + as the buffer glyph flags are superset of reference glyph flags. + + With this, all MORX tests pass. + + src/hb-aat-layout-common-private.hh | 31 +++++++++++++++++++++++++------ + src/hb-aat-layout-morx-table.hh | 35 + +++++++++++++++++++++++------------ + src/hb-buffer.cc | 2 +- + 3 files changed, 49 insertions(+), 19 deletions(-) + +commit edcd3b80e9617ec8c4c4a55536938fb510b6aeba +Author: Rod Sheeter <rsheeter@google.com> +Date: Sun Feb 4 12:31:24 2018 -0800 + + Actually call hb_subset + + util/hb-subset.cc | 51 + ++++++++++++++++++++++++++++++++++----------------- + 1 file changed, 34 insertions(+), 17 deletions(-) + +commit 7b01761adef6f64f1139b30c985aa5f52314073a +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 2 17:54:11 2018 -0800 + + Add CMakeLists.txt to dist files for subset test. + + test/subset/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit f83a43b56134188c2e1f3496d40ec0cd9109f250 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 2 17:50:45 2018 -0800 + + Add CMake configuration for all of the new subsetting code. + + CMakeLists.txt | 14 ++++++++++++++ + src/Makefile.sources | 9 +++++++-- + test/CMakeLists.txt | 1 + + test/subset/CMakeLists.txt | 9 +++++++++ + util/Makefile.am | 2 +- + util/Makefile.sources | 2 +- + 6 files changed, 33 insertions(+), 4 deletions(-) + +commit 5bc0cda179bca452145d4523eeba415986edb6e3 +Author: Garret Rieger <grieger@google.com> +Date: Fri Feb 2 17:49:14 2018 -0800 + + Add missing unistd header to hb-subset. + + util/hb-subset.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 06fe297f2a9fc6ee98179ddd26ef089b7fdb9e74 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 1 18:36:15 2018 -0800 + + Properly include subset test data files. + + test/subset/data/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 058b1260ad1105d0d8d6bf21f8f65a336e735bd2 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 1 18:22:14 2018 -0800 + + Re-write hb-subset utility to use main-font-text driver. + + test/subset/run-tests.py | 15 +++--- + util/Makefile.sources | 3 ++ + util/hb-subset.cc | 131 + +++++++++++++++++++++++++---------------------- + 3 files changed, 82 insertions(+), 67 deletions(-) + +commit ede84ffa426edb950c4ec4f89833c85475a1c64f +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 1 17:17:36 2018 -0800 + + Whitespace + + util/hb-subset.cc | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +commit 2763a2c5982c0db072697abe8ba01342d5977237 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 1 17:14:51 2018 -0800 + + Include subset test files in distribution. + + test/subset/Makefile.am | 7 ++++++- + test/subset/data/Makefile.am | 7 +++++++ + 2 files changed, 13 insertions(+), 1 deletion(-) + +commit 34fa7b3ad23b544b0914bc6002d60525224c68e1 +Author: Garret Rieger <grieger@google.com> +Date: Thu Feb 1 16:50:18 2018 -0800 + + Whitespace + + src/hb-subset.h | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit 8c3a6727377895f18e1b5c7076404d8aede17176 +Author: Garret Rieger <grieger@google.com> +Date: Wed Jan 31 15:43:24 2018 -0800 + + Get test-subset to pass. + + src/hb-subset.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 74d39ed2639857d5f1a90d9c0d864227a6482b40 +Author: Garret Rieger <grieger@google.com> +Date: Wed Jan 31 15:20:52 2018 -0800 + + Attach add a hb_face_t to hb_subset_face_t. + + src/hb-subset.cc | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +commit 76b84c36b9560e132918adb4c0c5a0d9bdfb0978 +Author: Garret Rieger <grieger@google.com> +Date: Wed Jan 31 14:53:28 2018 -0800 + + Whitespace + + test/api/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a2965f2ea5428c19be54f998ef9152c5ff6975ea +Author: Garret Rieger <grieger@google.com> +Date: Wed Jan 31 14:53:09 2018 -0800 + + Add a basic implementation of hb-subset to enable compilation of + test-subset. + + src/hb-subset.cc | 146 + +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset.h | 5 +- + test/api/Makefile.am | 1 + + test/api/test-subset.c | 12 ++-- + 4 files changed, 156 insertions(+), 8 deletions(-) + +commit 38af23b8df1a84f24d379d27d1a1e20f9ce07f34 +Author: Garret Rieger <grieger@google.com> +Date: Wed Jan 31 11:32:23 2018 -0800 + + Make the expected output for subsetting basics test be equal to the + input file for now. + + .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1996 -> + 2460 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit b59c08eb045db2b6c952de81510b8159a4f72fb1 +Author: Garret Rieger <grieger@google.com> +Date: Wed Jan 31 11:14:53 2018 -0800 + + Add the beginning of a unit test for hb-subset + + test/api/test-subset.c | 67 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 67 insertions(+) + +commit e9d154ac8ddd2712a34c53c95a17e469f95e5b30 +Author: Rod Sheeter <rsheeter@google.com> +Date: Tue Jan 30 19:27:11 2018 -0800 + + tweak test failure output. write to a temp file not stdout. test + still fails because expected is not just an identical copy of input + + test/subset/run-tests.py | 41 +++++++++++++++++++++++++++---------- + util/hb-subset.cc | 53 + +++++++++++++++++++++++++++++++++--------------- + 2 files changed, 67 insertions(+), 27 deletions(-) + +commit cf403e1a53381f293aceac5cdbe031bbb2a7af77 +Author: Garret Rieger <grieger@google.com> +Date: Tue Jan 30 18:40:23 2018 -0800 + + Add hb-subset.h to hb.h + + src/hb.h | 1 + + 1 file changed, 1 insertion(+) + +commit c02573516c05ac97acb243ef5dec26af86086ded +Author: Garret Rieger <grieger@google.com> +Date: Tue Jan 30 18:39:41 2018 -0800 + + Fix typo in hb-subset.h + + src/hb-subset.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 76351518ca9bc88aa6fbc975e1e35bd86432d652 +Author: Garret Rieger <grieger@google.com> +Date: Tue Jan 30 14:03:16 2018 -0800 + + Remove basic subset test from XFAIL + + test/subset/data/Makefile.sources | 1 - + 1 file changed, 1 deletion(-) + +commit b029b7c19a733a2a39860238ad300e6c4a3f7802 +Author: Garret Rieger <grieger@google.com> +Date: Mon Jan 29 13:31:49 2018 -0800 + + Whitespace + + test/subset/data/Makefile.sources | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0853260e997aded264f42bb369d4fcb39cccb7d6 +Author: Garret Rieger <grieger@google.com> +Date: Mon Jan 29 13:30:02 2018 -0800 + + Configure automake to run the new subset tests. + + configure.ac | 2 ++ + test/Makefile.am | 2 +- + test/subset/Makefile.am | 16 ++++++++++++++++ + test/subset/data/Makefile.am | 16 ++++++++++++++++ + test/subset/data/Makefile.sources | 10 ++++++++++ + test/subset/data/tests/{basics.txt => basics.tests} | 0 + 6 files changed, 45 insertions(+), 1 deletion(-) + +commit 5c63c37b2b5aba8bf2f8ff35b7da0d116ebfe8b5 +Author: Garret Rieger <grieger@google.com> +Date: Fri Jan 26 16:57:42 2018 -0800 + + WIP test runner for subset tests. + + test/subset/run-tests.py | 64 + ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 64 insertions(+) + +commit cc46cd88a1b84b02694fa6d88c4286e93336f096 +Author: Garret Rieger <grieger@google.com> +Date: Fri Jan 26 14:25:39 2018 -0800 + + In generate-expected-outputs read the test definition with utf8 + encoding. + + test/subset/generate-expected-outputs.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4cdae914e2e2fff1ff91e2f42648a8acb82a5494 +Author: Garret Rieger <grieger@google.com> +Date: Fri Jan 26 13:57:48 2018 -0800 + + Add basic directory structure for subsetter integration tests. Plus + a utility for generating expected output files. + + .../basics/Roboto-Regular.abc.default.62.ttf | Bin 0 -> 1996 bytes + test/subset/data/fonts/Roboto-Regular.abc.ttf | Bin 0 -> 2460 bytes + test/subset/data/profiles/default.txt | 0 + test/subset/data/tests/basics.txt | 8 ++ + test/subset/generate-expected-outputs.py | 40 ++++++++++ + test/subset/subset_test_suite.py | 82 + +++++++++++++++++++++ + 6 files changed, 130 insertions(+) + +commit 9ccb8366f603a9e4a7a3c3f96420a19d4f6fb390 +Author: Rod Sheeter <rsheeter@google.com> +Date: Wed Jan 17 22:09:07 2018 -0800 + + Start to sketch APIs for subsetting + + src/Makefile.am | 2 ++ + src/Makefile.sources | 4 +++ + src/hb-subset.cc | 0 + src/hb-subset.h | 88 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + util/Makefile.am | 3 ++ + util/Makefile.sources | 4 +++ + util/hb-subset.cc | 61 +++++++++++++++++++++++++++++++++++ + 7 files changed, 162 insertions(+) + +commit 89b1906d990658c763f35113c8978a5e21bffc22 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 14:45:02 2018 -0500 + + [aat] More adjustment to ContextualSubtable + + See comment. + + With this, MORX-20 passes if I turn --verify off. Our unsafe-to-break + logic is currently broken in presence of end-of-text actions. That's, + ugh, extra work to fix. Let me try... + + src/hb-aat-layout-morx-table.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 8be596f0b76543e19644c0b77c1bcf4d9e783c2b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 14:40:17 2018 -0500 + + [aat] In ContextualSubstitute, apply end-of-text action to last glyph + + src/hb-aat-layout-morx-table.hh | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit c0b1c7eb2eed67147adec3d2c9e02d01f279c8f4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 14:19:41 2018 -0500 + + [aat] Remove unneeded check + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fcb8be1a385cb4432dc6064fba77939716d27a02 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Feb 4 12:38:18 2018 -0500 + + [configure] Fix wording + + Fixes https://github.com/harfbuzz/harfbuzz/issues/741 + + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit aed32589af6d5fce3e68fe41865e258ea7eb2413 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 2 16:08:50 2018 -0500 + + [aat] In ContextualSubtable, mark mark after substituting mark + + Fixes MORX-21. + + src/hb-aat-layout-morx-table.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit fe5f9b1ae318939eaa23d0175a5eb7e1739177ac +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Feb 2 15:53:25 2018 -0500 + + [aat] Fix ContextualSubtable sanitization + + Fixes MORX-18, MORX-19, and MORX-22. + + src/hb-aat-layout-morx-table.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit cf943f682bcdd73e3ad1f6108c1a1870b991d5e4 +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Sun Feb 4 12:05:12 2018 +0200 + + Correctly show documentation build status + + Correctly show if building documentation is enabled or not in + configure + summary. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/741 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e8859fca3eafb5aab6d029563b31219ccca0d673 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Sun Feb 4 01:26:57 2018 +0700 + + Enable use of atexit() on macOS and related platforms. + + The atexit() man page indicates that this is expected to behave + in the expected way on unloading of shared libraries. + + src/hb-private.hh | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit a89573770b4c0f9c444ad6499bec5dc022087a97 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Sun Feb 4 01:31:53 2018 +0700 + + Use nullptr, not NULL. + + src/hb-aat-layout-common-private.hh | 2 +- + src/hb-buffer-deserialize-json.rl | 4 ++-- + src/hb-buffer-deserialize-text.rl | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 07885e65adf1d3cb324de99501f9867f1a2553f8 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Sat Feb 3 12:53:48 2018 +0330 + + [cmake] unistd typo fix (#747) + + CMakeLists.txt | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit ccb0367dae4cbb9c8215dbf20ac7f9acfba2fa14 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Fri Feb 2 12:04:04 2018 -0500 + + Let VS1 follow U+1031 MYANMAR VOWEL SIGN E + + src/hb-ot-shape-complex-myanmar-machine.rl | 2 +- + src/hb-ot-shape-complex-myanmar.cc | 5 +++++ + test/shaping/README.md | 10 +++++----- + test/shaping/data/in-house/Makefile.sources | 1 + + .../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf | Bin 0 -> + 1536 bytes + test/shaping/data/in-house/tests/myanmar-syllable.tests | 1 + + 6 files changed, 13 insertions(+), 6 deletions(-) + +commit c6dbf6e77cae30772ffa110c651cb4287ab3b0dc +Author: punchcutter <zarijoscha@gmail.com> +Date: Wed Jan 31 14:09:04 2018 -0800 + + Allow optional ZWJ in virama terminated cluster + + src/hb-ot-shape-complex-use-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dae20fb5a79caad9a4af14137a961b60fe256235 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Wed Jan 31 20:16:08 2018 +0700 + + Use nullptr instead of 0. + + src/hb-coretext.cc | 4 ++-- + src/test-buffer-serialize.cc | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 90218fa93cf8b5d4b192be12d31aed92d271d09e +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Wed Jan 31 20:44:45 2018 +0700 + + Fix typos. + + src/hb-blob.cc | 2 +- + src/hb-buffer-private.hh | 2 +- + src/hb-common.cc | 2 +- + src/hb-coretext.cc | 2 +- + src/hb-directwrite.cc | 2 +- + src/hb-ft.cc | 2 +- + src/hb-graphite2.cc | 2 +- + src/hb-ot-layout-common-private.hh | 2 +- + 8 files changed, 8 insertions(+), 8 deletions(-) + +commit 148ca61075d821a09e42e2c75fbc9be47cfc6003 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Wed Jan 31 22:24:51 2018 +0700 + + [ot-layout] Fix nullptr dereference. + + If the `calloc` for `gsub_accels` or `gpos_accels` fails, then the + unlikely branch afterwards can be taken, which frees up the + `hb_ot_layout_t`, but since those fields can now be `nullptr`, then + we don't want to dereference them. + + src/hb-ot-layout.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 0c66043a924fd114017a862d2cacd70f64b92370 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Wed Jan 31 20:24:27 2018 +0700 + + [coretext] Fix memory leaks. + + In `reference_table`, if the data is empty and we return early, + we still need to release the data object. + + In `hb_coretext_shape`, there two edge cases where an early + return should release the attributed string. + + src/hb-coretext.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + commit f0b700db394ccdff30ff83961a3e2ea9ff4ea472 Author: Behdad Esfahbod <behdad@behdad.org> Date: Tue Jan 30 11:16:51 2018 -0800 @@ -8497,6 +13850,30 @@ Date: Sun Mar 5 13:51:01 2017 -0800 src/hb-ot-layout-gsubgpos-private.hh | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) +commit 3ebcd5a381e2de27a0cfb5af3359331f0b7e7108 +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sun Mar 5 16:26:01 2017 +0100 + + first working version! + + src/hb-ot-layout.cc | 2 ++ + src/hb-ot.h | 1 + + 2 files changed, 3 insertions(+) + +commit e65aaaa00a3b5ac811b5c73b5186cd7d65731f7b +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sun Mar 5 14:53:39 2017 +0100 + + BASE: start api + + src/Makefile.sources | 2 ++ + src/hb-ot-base.cc | 58 + ++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-base.h | 56 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-layout-base-table.hh | 15 ++--------- + 4 files changed, 118 insertions(+), 13 deletions(-) + commit 5aec2fb8d0a4db52ae414d980b66018ca5ce1e9c Author: Behdad Esfahbod <behdad@behdad.org> Date: Thu Mar 2 11:46:33 2017 -0800 @@ -8521,6 +13898,25 @@ Date: Wed Mar 1 14:27:23 2017 -0800 test/shaping/tests/context-matching.tests | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) +commit f72726c52b104a71ebf5b39fa1e3eb9febd446fc +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sun Feb 26 15:08:43 2017 +0100 + + BASE: add function in main BASE object + + src/hb-ot-layout-base-table.hh | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit 3963315f1b2eae2504bc683760245c827cd1ef16 +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sun Feb 26 15:07:53 2017 +0100 + + BASE: first complete version + + src/hb-ot-layout-base-table.hh | 444 + +++++++++++++++++++++++++++++------------ + 1 file changed, 317 insertions(+), 127 deletions(-) + commit a11501444cfc4854bfe2b1d3ce0fc5a957e959d8 Author: Behdad Esfahbod <behdad@behdad.org> Date: Sat Feb 25 13:37:54 2017 -0800 @@ -8554,6 +13950,16 @@ Date: Sat Feb 25 13:30:38 2017 -0800 src/hb-ot-shape-complex-indic.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) +commit d34e35b47457e757781b1769a1fbaf107ec6e32f +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sat Feb 25 20:41:05 2017 +0100 + + BASE: WIP: more access functions + + src/hb-ot-layout-base-table.hh | 212 + +++++++++++++++++++++++++++++++++++++---- + 1 file changed, 191 insertions(+), 21 deletions(-) + commit 6685d281d6f50bf046bbfef4a5263e15d15f2f02 Author: Behdad Esfahbod <behdad@behdad.org> Date: Sat Feb 25 11:35:05 2017 -0800 @@ -8564,6 +13970,45 @@ Date: Sat Feb 25 11:35:05 2017 -0800 configure.ac | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) +commit bd15567ed6a3667e6f8332b7374aece6a6f2361b +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sat Feb 25 17:08:01 2017 +0100 + + BASE: align member's names + + src/hb-ot-layout-base-table.hh | 70 + +++++++++++++++++++++--------------------- + 1 file changed, 35 insertions(+), 35 deletions(-) + +commit 499b4bef2a5b6d49374ab4977509d1fbf7bd6038 +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sat Feb 25 16:48:22 2017 +0100 + + BASE: more consistent naming (with spec and Harfbuzz code base) + + src/hb-ot-layout-base-table.hh | 44 + +++++++++++++++++++++--------------------- + 1 file changed, 22 insertions(+), 22 deletions(-) + +commit a0bdd546c584eb7c7ea3ca7e19a178723e6fe77f +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sat Feb 25 16:34:58 2017 +0100 + + factorize horiz+vertAxis + + src/hb-ot-layout-base-table.hh | 31 +++++-------------------------- + 1 file changed, 5 insertions(+), 26 deletions(-) + +commit 1d30c6d935535743c73b2d18abcc6ae86a1cfc5b +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sat Feb 25 16:19:35 2017 +0100 + + BASE: sanitize + + src/hb-ot-layout-base-table.hh | 151 + ++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 148 insertions(+), 3 deletions(-) + commit a657f23ca31237d652b5c101ed24194b6aeadaf8 Author: Dominik Röttsches <d-r@roettsches.de> Date: Mon Feb 20 21:52:07 2017 +0200 @@ -8578,6 +14023,45 @@ Date: Mon Feb 20 21:52:07 2017 +0200 src/hb-ot-layout.cc | 3 +++ 1 file changed, 3 insertions(+) +commit f131f00b1779b44633223915e17cbce358ad063a +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sun Feb 19 10:12:22 2017 +0100 + + compile, move into hb-ot-layout.cc + + src/hb-ot-font.cc | 1 - + src/hb-ot-layout-base-table.hh | 57 + +++++++++++++++++++++++++++++++----------- + src/hb-ot-layout.cc | 1 + + 3 files changed, 43 insertions(+), 16 deletions(-) + +commit d0b97353e930d9b258f42f1cc1ac1a75306b76a8 +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sun Feb 19 08:48:22 2017 +0100 + + hb-ot-base-table.hh -> hb-ot-layout-base-table.hh + + per + https://github.com/behdad/harfbuzz/issues/418#issuecomment-280873811 + + src/Makefile.sources | 2 +- + src/hb-ot-font.cc | 2 +- + src/{hb-ot-base-table.hh => hb-ot-layout-base-table.hh} | 0 + 3 files changed, 2 insertions(+), 2 deletions(-) + +commit f748e11645a3361f94d6fb10ce59febbaa5ba8ca +Author: Elie Roux <elie.roux@telecom-bretagne.eu> +Date: Sat Feb 18 19:54:33 2017 +0100 + + bootstraping structure + + src/Makefile.sources | 1 + + src/hb-ot-base-table.hh | 238 + ++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-font.cc | 1 + + src/hb-ot-layout-private.hh | 2 + + 4 files changed, 242 insertions(+) + commit 70202983f57fe85b2d3b56a9c205effeee66222d Author: ebraminio <ebrahim@gnu.org> Date: Sat Feb 18 10:37:36 2017 +0330 @@ -11702,6 +17186,23 @@ Date: Mon Jun 27 03:54:15 2016 +0430 src/hb-directwrite.cc | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) +commit 5967eaba728ca3e4f5026142c25d455fa3a59764 +Author: Sascha Brawer <sascha@brawer.ch> +Date: Fri Jun 24 16:42:27 2016 +0200 + + [CPAL] Return 0xFFFF as name id for unnamed palettes + + The name id 0 is used as Copyright notice. It's quite unlikely that a + font supplies a color palette with the exact same name as the font's + copyright notice, but the API should not prevent this. + + Also, try to fix a problem with GObject introspection, where the + auto-generated Python bindings could not return palette colors. + + src/hb-ot-color.cc | 13 ++++++------- + test/api/test-ot-color.c | 14 +++++++------- + 2 files changed, 13 insertions(+), 14 deletions(-) + commit 07b724f3419a28c479cd8a75ae0eecb841a6d2f3 Author: Ebrahim Byagowi <ebrahim@gnu.org> Date: Fri Jun 24 12:23:25 2016 +0430 @@ -11759,6 +17260,29 @@ Date: Mon Jun 20 10:25:43 2016 +0300 Merge branch 'master' into conflictingFontFix +commit d34d3ac985a6c8c848ae49635b648a72e0c8f30d +Author: Sascha Brawer <sascha@brawer.ch> +Date: Mon Apr 25 18:20:57 2016 +0200 + + Support CPAL table + + NEWS | 6 +- + src/Makefile.am | 3 + + src/Makefile.sources | 3 + + src/hb-ot-color.cc | 213 ++++++++++++++ + src/hb-ot-color.h | 99 +++++++ + src/hb-ot-cpal-table.hh | 121 ++++++++ + src/hb-ot-layout-private.hh | 3 + + src/hb-ot-layout.cc | 7 + + src/hb-ot.h | 1 + + test/api/Makefile.am | 1 + + test/api/hb-test.h | 30 ++ + test/api/test-ot-color.c | 318 + +++++++++++++++++++++ + .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf | Bin 0 -> 2128 bytes + .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf | Bin 0 -> 1948 bytes + 14 files changed, 804 insertions(+), 1 deletion(-) + commit 07461d06d242cd5cfda7ccb891189f074a89b460 Author: Kelvin <kelvinsthirteen@gmail.com> Date: Sat Jun 18 22:46:38 2016 +0000 diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS index 9015c4ad2c5..fe09ab160f0 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS +++ b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS @@ -1,3 +1,18 @@ +Overview of changes leading to 1.7.6 +Wednesday, March 7, 2018 +==================================== + +- Fix to hb_set_t binary operations. Ouch. +- New experimental harfbuzz-subset library. All of hb-subset.h + is experimental right now and API WILL change. + +- New API: +hb_blob_copy_writable_or_fail() +HB_OT_TAG_BASE +hb_set_previous() +hb_set_previous_range() + + Overview of changes leading to 1.7.5 Tuesday, January 30, 2018 ==================================== diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md b/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md index 1863c6e3938..dedcca8f9e9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md +++ b/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md @@ -35,7 +35,7 @@ HarfBuzz release walk-through checklist: a. Put contents of [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) on your `~/.local/i686-w64-mingw32`, - b. Run `./MING32 --with-uniscribe` script (available below) to configure harfbuzz with mingw in a subdirector (eg. winbuild/), + b. Run `../mingw32.sh --with-uniscribe` script (available below) to configure harfbuzz with mingw in a subdirector (eg. winbuild/), c. make @@ -63,32 +63,6 @@ HarfBuzz release walk-through checklist: edit the tag, upload artefacts and NEWS entry and save. -## MING32 -```bash -#!/bin/bash - -target=i686-w64-mingw32 - -unset CC -unset CXX -unset CPP -unset LD -unset LDFLAGS -unset CFLAGS -unset CXXFLAGS -unset PKG_CONFIG_PATH - -# Removed -static from the following -export CFLAGS="-static-libgcc" -export CXXFLAGS="-static-libgcc -static-libstdc++" -export CPPFLAGS=-I$HOME/.local/$target/include -export LDFLAGS=-L$HOME/.local/$target/lib -export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig -export PATH=$HOME/.local/$target/bin:$PATH - -../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target "$@" -``` - ## UPDATE.sh ```bash #!/bin/bash diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/TODO b/Build/source/libs/harfbuzz/harfbuzz-src/TODO index 4f37f605b11..53ffbe9d00a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/TODO +++ b/Build/source/libs/harfbuzz/harfbuzz-src/TODO @@ -1,24 +1,14 @@ General fixes: ============= -- AAT 'morx' implementation. - -- Return "safe-to-break" bit from shaping. - - Implement 'rand' feature. -- mask propagation? (when ligation, "or" the masks). - API issues: =========== - API to accept a list of languages? -- Add init_func to font_funcs. Adjust ft. - -- 'const' for getter APIs? (use mutable internally) - - Remove hb_ot_shape_glyphs_closure()? @@ -39,7 +29,7 @@ API additions - Add query / enumeration API for aalt-like features? -- SFNT api? get_num_faces? get_table_tags? (there's something in stash) +- SFNT api? get_num_faces? - Add segmentation API @@ -50,20 +40,3 @@ hb-view / hb-shape enhancements: =============================== - Add --width, --height, --auto-size, --ink-box, --align, etc? - - -Tests to write: -============== - -- ot-layout enumeration API (needs font) - -- Finish test-shape.c, grep for TODO - -- Finish test-unicode.c, grep for TODO - -- GObject, FreeType, etc - -- hb_cache_t and relatives - -- hb_feature_to/from_string -- hb_buffer_[sg]et_contents diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh b/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh index cbc8627d53e..fd5c1983c73 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh @@ -7,11 +7,11 @@ test -n "$srcdir" || srcdir=. olddir=`pwd` cd $srcdir -echo -n "checking for ragel... " -which ragel || { - echo "You need to install ragel... See http://www.complang.org/ragel/" - exit 1 -} +#echo -n "checking for ragel... " +#which ragel || { +# echo "You need to install ragel... See http://www.complang.org/ragel/" +# exit 1 +#} echo -n "checking for pkg-config... " which pkg-config || { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in index d44d4c9a728..1515f8143b6 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in +++ b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in @@ -96,6 +96,9 @@ /* Have sched_yield */ #undef HAVE_SCHED_YIELD +/* Define to 1 if you have the `setlinebuf' function. */ +#undef HAVE_SETLINEBUF + /* Have Solaris __machine_*_barrier and atomic_* operations */ #undef HAVE_SOLARIS_ATOMIC_OPS diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac b/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac index d799cab0a20..1fb8a10a3df 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], - [1.7.5], + [1.7.6], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) @@ -11,6 +11,7 @@ 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_SILENT_RULES([yes]) +AX_CODE_COVERAGE # Initialize libtool m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) @@ -20,6 +21,7 @@ LT_INIT([disable-static]) # Check for programs AC_USE_SYSTEM_EXTENSIONS AC_PROG_CC +AC_PROG_CC_C99 AM_PROG_CC_C_O AC_PROG_CXX dnl AX_CXX_COMPILE_STDCXX(11, noext, optional) @@ -57,6 +59,13 @@ m4_define([hb_libtool_current], HB_LIBTOOL_VERSION_INFO=hb_libtool_current:hb_libtool_revision:hb_libtool_age AC_SUBST(HB_LIBTOOL_VERSION_INFO) +AC_ARG_WITH([libstdc++], + [AS_HELP_STRING([--with-libstdc++=@<:@yes/no@:>@], + [Allow linking with libstdc++ @<:@default=no@:>@])], + [with_libstdcxx=$withval], + [with_libstdcxx=no]) +AM_CONDITIONAL(WITH_LIBSTDCXX, [test "x$with_libstdcxx" = "xyes"]) + # Documentation have_gtk_doc=false m4_ifdef([GTK_DOC_CHECK], [ @@ -68,8 +77,8 @@ GTK_DOC_CHECK([1.15],[--flavour no-tmpl]) AM_CONDITIONAL([ENABLE_GTK_DOC], false) ]) -# Functions and headers -AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l) +# Functions, and headers +AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l setlinebuf) AC_CHECK_HEADERS(unistd.h sys/mman.h xlocale.h) # Compiler flags @@ -80,12 +89,6 @@ if test "x$GCC" = "xyes"; then # Make symbols link locally LDFLAGS="$LDFLAGS -Bsymbolic-functions" - # Make sure we don't link to libstdc++ - CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions" - - # No threadsafe statics and C++ as we do it ourselves - CXXFLAGS="$CXXFLAGS -fno-threadsafe-statics" - # Assorted warnings CXXFLAGS="$CXXFLAGS -Wcast-align" @@ -182,6 +185,7 @@ if $have_gobject; then AC_SUBST(GLIB_MKENUMS) fi AM_CONDITIONAL(HAVE_GOBJECT, $have_gobject) +AC_SUBST(have_gobject) dnl =========================================================================== @@ -355,9 +359,7 @@ if $have_freetype; then AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library]) save_libs=$LIBS LIBS="$LIBS $FREETYPE_LIBS" - AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates) - AC_CHECK_FUNCS(FT_Set_Var_Blend_Coordinates) - AC_CHECK_FUNCS(FT_Done_MM_Var) + AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var) LIBS=$save_libs fi AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype) @@ -491,6 +493,7 @@ AC_CONFIG_FILES([ Makefile src/Makefile src/hb-version.h +src/harfbuzz-config.cmake src/hb-ucdn/Makefile util/Makefile test/Makefile @@ -500,6 +503,8 @@ test/shaping/Makefile test/shaping/data/Makefile test/shaping/data/in-house/Makefile test/shaping/data/text-rendering-tests/Makefile +test/subset/Makefile +test/subset/data/Makefile docs/Makefile docs/version.xml ]) @@ -515,14 +520,14 @@ Unicode callbacks (you want at least one): Glib: ${have_glib} ICU: ${have_icu} -Font callbacks (the more the better): +Font callbacks (the more the merrier): FreeType: ${have_freetype} Tools used for command-line utilities: Cairo: ${have_cairo} Fontconfig: ${have_fontconfig} -Additional shapers (the more the better): +Additional shapers (the more the merrier): Graphite2: ${have_graphite2} Platform shapers (not normally needed): @@ -531,7 +536,7 @@ Platform shapers (not normally needed): DirectWrite: ${have_directwrite} Other features: - Documentation: ${have_gtk_doc} + Documentation: ${enable_gtk_doc} GObject bindings: ${have_gobject} Introspection: ${have_introspection} ]) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am index 833d1f9567d..afa104b83e4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am @@ -9,12 +9,14 @@ CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = DISTCHECK_CONFIGURE_FLAGS = --enable-introspection +TESTS = +check_PROGRAMS = # The following warning options are useful for debugging: -Wpadded #AM_CXXFLAGS = # Convenience targets: -lib: $(BUILT_SOURCES) libharfbuzz.la +lib: $(BUILT_SOURCES) libharfbuzz.la libharfbuzz-subset.la fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la lib_LTLIBRARIES = libharfbuzz.la @@ -28,7 +30,15 @@ HBDEPS = HBSOURCES = $(HB_BASE_sources) HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources) HBHEADERS = $(HB_BASE_headers) -HBNODISTHEADERS = $(HB_NODIST_headers) + +if WITH_LIBSTDCXX +HBNOLIBCXXCFLAGS = +else +# Make sure we don't link to libstdc++ +# No threadsafe statics in C++ as we do it ourselves +HBCFLAGS += -fno-exceptions +HBNOLIBCXXFLAGS = -fno-threadsafe-statics -fno-rtti +endif if HAVE_OT HBSOURCES += $(HB_OT_sources) @@ -114,31 +124,59 @@ HBLIBS += $(HBNONPCLIBS) if OS_WIN32 export_symbols = -export-symbols harfbuzz.def harfbuzz_def_dependency = harfbuzz.def -libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS) +export_symbols_subset = -export-symbols harfbuzz-subset.def +harfbuzz_subset_def_dependency = harfbuzz-subset.def +export_symbols_icu = -export-symbols harfbuzz-icu.def +harfbuzz_icu_def_dependency = harfbuzz-icu.def +export_symbols_gobject = -export-symbols harfbuzz-gobject.def +harfbuzz_gobject_def_dependency = harfbuzz-gobject.def +chosen_linker = $(CXXLINK) +else +if WITH_LIBSTDCXX +chosen_linker = $(CXXLINK) else -# Use a C linker for GCC, not C++; Don't link to libstdc++ if HAVE_GCC -libharfbuzz_la_LINK = $(LINK) $(libharfbuzz_la_LDFLAGS) +# Use a C linker for GCC, not C++; Don't link to libstdc++ +chosen_linker = $(LINK) else -libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS) +chosen_linker = $(CXXLINK) endif endif +endif + +@CODE_COVERAGE_RULES@ -libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) $(HBNODISTHEADERS) -libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) -libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) $(export_symbols) -no-undefined +base_link_flags = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined +libharfbuzz_la_LINK = $(chosen_linker) $(libharfbuzz_la_LDFLAGS) $(CODE_COVERAGE_LDFLAGS) +libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) +libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(CODE_COVERAGE_CFLAGS) +libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols) libharfbuzz_la_LIBADD = $(HBLIBS) EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency) pkginclude_HEADERS = $(HBHEADERS) -nodist_pkginclude_HEADERS = $(HBNODISTHEADERS) +nodist_pkginclude_HEADERS = pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = harfbuzz.pc -EXTRA_DIST += harfbuzz.pc.in +cmakedir = $(libdir)/cmake/harfbuzz +cmake_DATA = harfbuzz-config.cmake +EXTRA_DIST += harfbuzz.pc.in harfbuzz-config.cmake.in + +lib_LTLIBRARIES += libharfbuzz-subset.la +libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources) +libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS) +libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset) +libharfbuzz_subset_la_LIBADD = libharfbuzz.la +EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency) +pkginclude_HEADERS += $(HB_SUBSET_headers) +pkgconfig_DATA += harfbuzz-subset.pc +EXTRA_DIST += harfbuzz-subset.pc.in FUZZING_CPPFLAGS = \ -DHB_NDEBUG \ -DHB_MAX_NESTING_LEVEL=3 \ -DHB_SANITIZE_MAX_EDITS=3 \ + -DHB_SANITIZE_MAX_OPS_FACTOR=3 \ + -DHB_SANITIZE_MAX_OPS_MIN=128 \ -DHB_BUFFER_MAX_LEN_FACTOR=3 \ -DHB_BUFFER_MAX_LEN_MIN=8 \ -DHB_BUFFER_MAX_LEN_DEFAULT=128 \ @@ -147,10 +185,10 @@ FUZZING_CPPFLAGS = \ -DHB_BUFFER_MAX_OPS_DEFAULT=1024 \ $(NULL) EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la -libharfbuzz_fuzzing_la_LINK = $(libharfbuzz_la_LINK) +libharfbuzz_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_fuzzing_la_LDFLAGS) libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES) -libharfbuzz_fuzzing_la_CPPFLAGS = $(libharfbuzz_la_CPPFLAGS) $(FUZZING_CPPFLAGS) -libharfbuzz_fuzzing_la_LDFLAGS = $(libharfbuzz_la_LDFLAGS) +libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS) +libharfbuzz_fuzzing_la_LDFLAGS = $(AM_LDFLAGS) libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD) EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES) CLEANFILES += libharfbuzz-fuzzing.la @@ -164,9 +202,10 @@ HBHEADERS += $(HB_ICU_headers) else lib_LTLIBRARIES += libharfbuzz-icu.la libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources) -libharfbuzz_icu_la_CPPFLAGS = $(ICU_CFLAGS) -libharfbuzz_icu_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined +libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS) +libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu) libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la +EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency) pkginclude_HEADERS += $(HB_ICU_headers) pkgconfig_DATA += harfbuzz-icu.pc endif @@ -175,13 +214,15 @@ EXTRA_DIST += harfbuzz-icu.pc.in if HAVE_GOBJECT lib_LTLIBRARIES += libharfbuzz-gobject.la -libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_sources) -nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_ENUM_sources) -libharfbuzz_gobject_la_CPPFLAGS = $(GOBJECT_CFLAGS) -libharfbuzz_gobject_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined +libharfbuzz_gobject_la_LINK = $(chosen_linker) $(libharfbuzz_gobject_la_LDFLAGS) +libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_DIST_sources) +nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_NODIST_sources) +libharfbuzz_gobject_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(GOBJECT_CFLAGS) +libharfbuzz_gobject_la_LDFLAGS = $(base_link_flags) libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la -pkginclude_HEADERS += $(HB_GOBJECT_headers) -nodist_pkginclude_HEADERS += $(HB_GOBJECT_ENUM_headers) +EXTRA_libharfbuzz_gobject_la_DEPENDENCIES = $(harfbuzz_gobject_def_dependency) +pkginclude_HEADERS += $(HB_GOBJECT_DIST_headers) +nodist_pkginclude_HEADERS += $(HB_GOBJECT_NODIST_headers) pkgconfig_DATA += harfbuzz-gobject.pc BUILT_SOURCES += \ @@ -221,9 +262,20 @@ EXTRA_DIST += \ CLEANFILES += $(pkgconfig_DATA) -CLEANFILES += harfbuzz.def +DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def +if HAVE_GOBJECT +DEF_FILES += harfbuzz-gobject.def +endif +check: $(DEF_FILES) # For check-symbols.sh +CLEANFILES += $(DEF_FILES) harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS) $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@ +harfbuzz-subset.def: $(HB_SUBSET_headers) + $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@ +harfbuzz-icu.def: $(HB_ICU_headers) + $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@ +harfbuzz-gobject.def: $(HB_GOBJECT_headers) + $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@ GENERATORS = \ @@ -261,7 +313,8 @@ EXTRA_DIST += \ $(HB_BASE_RAGEL_sources) \ $(HB_OT_RAGEL_sources) \ $(NULL) -MAINTAINERCLEANFILES += $(RAGEL_GENERATED) +# We decided to add ragel-generated files to git... +#MAINTAINERCLEANFILES += $(RAGEL_GENERATED) $(srcdir)/%.hh: $(srcdir)/%.rl $(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \ || ($(RM) "$@"; false) @@ -295,32 +348,56 @@ test_buffer_serialize_SOURCES = test-buffer-serialize.cc test_buffer_serialize_CPPFLAGS = $(HBCFLAGS) test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS) -check: harfbuzz.def # For check-defs.sh - dist_check_SCRIPTS = \ check-c-linkage-decls.sh \ - check-defs.sh \ check-externs.sh \ check-header-guards.sh \ check-includes.sh \ - check-libstdc++.sh \ check-static-inits.sh \ check-symbols.sh \ $(NULL) +TESTS += $(dist_check_SCRIPTS) -check_PROGRAMS = \ - test-ot-tag \ +if !WITH_LIBSTDCXX +dist_check_SCRIPTS += \ + check-libstdc++.sh \ $(NULL) +endif + +check_PROGRAMS += \ + dump-indic-data \ + dump-khmer-data \ + dump-myanmar-data \ + dump-use-data \ + $(NULL) +dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc +dump_indic_data_CPPFLAGS = $(HBCFLAGS) +dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS) +dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc +dump_khmer_data_CPPFLAGS = $(HBCFLAGS) +dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS) +dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc +dump_myanmar_data_CPPFLAGS = $(HBCFLAGS) +dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS) +dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc +dump_use_data_CPPFLAGS = $(HBCFLAGS) +dump_use_data_LDADD = libharfbuzz.la $(HBLIBS) + +check_PROGRAMS += test-ot-tag test-unicode-ranges +TESTS += test-ot-tag test-unicode-ranges + test_ot_tag_SOURCES = hb-ot-tag.cc test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS) -TESTS = $(dist_check_SCRIPTS) $(check_PROGRAMS) +test_unicode_ranges_SOURCES = test-unicode-ranges.cc +test_unicode_ranges_LDADD = libharfbuzz.la $(HBLIBS) + TESTS_ENVIRONMENT = \ srcdir="$(srcdir)" \ MAKE="$(MAKE) $(AM_MAKEFLAGS)" \ HBSOURCES="$(HBSOURCES)" \ - HBHEADERS="$(HBHEADERS) $(HBNODISTHEADERS)" \ + HBHEADERS="$(HBHEADERS)" \ $(NULL) if HAVE_INTROSPECTION @@ -350,12 +427,9 @@ HarfBuzz_0_0_gir_LIBS = \ $(NULL) HarfBuzz_0_0_gir_FILES = \ $(HBHEADERS) \ - $(HBNODISTHEADERS) \ $(HBSOURCES) \ - $(HB_GOBJECT_ENUM_sources) \ - $(HB_GOBJECT_ENUM_headers) \ $(HB_GOBJECT_sources) \ - $(HB_GOBJECT_STRUCTS_headers) \ + $(HB_GOBJECT_headers) \ $(NULL) girdir = $(datadir)/gir-1.0 diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources index 213aa22f684..787c3c4bb52 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources @@ -17,9 +17,10 @@ HB_BASE_sources = \ hb-object-private.hh \ hb-open-file-private.hh \ hb-open-type-private.hh \ - hb-ot-cbdt-table.hh \ + hb-ot-color-cbdt-table.hh \ hb-ot-cmap-table.hh \ hb-ot-glyf-table.hh \ + hb-ot-hdmx-table.hh \ hb-ot-head-table.hh \ hb-ot-hhea-table.hh \ hb-ot-hmtx-table.hh \ @@ -27,6 +28,7 @@ HB_BASE_sources = \ hb-ot-maxp-table.hh \ hb-ot-name-table.hh \ hb-ot-os2-table.hh \ + hb-ot-os2-unicode-ranges.hh \ hb-ot-post-macroman.hh \ hb-ot-post-table.hh \ hb-ot-tag.cc \ @@ -69,9 +71,6 @@ HB_BASE_headers = \ hb-shape.h \ hb-shape-plan.h \ hb-unicode.h \ - $(NULL) - -HB_NODIST_headers = \ hb-version.h \ $(NULL) @@ -82,10 +81,14 @@ HB_FALLBACK_sources = \ HB_OT_sources = \ hb-aat-layout.cc \ hb-aat-layout-common-private.hh \ + hb-aat-layout-ankr-table.hh \ + hb-aat-layout-kerx-table.hh \ hb-aat-layout-morx-table.hh \ + hb-aat-layout-trak-table.hh \ hb-aat-layout-private.hh \ hb-ot-font.cc \ hb-ot-layout.cc \ + hb-ot-layout-base-table.hh \ hb-ot-layout-common-private.hh \ hb-ot-layout-gdef-table.hh \ hb-ot-layout-gpos-table.hh \ @@ -93,6 +96,9 @@ HB_OT_sources = \ hb-ot-layout-gsub-table.hh \ hb-ot-layout-jstf-table.hh \ hb-ot-layout-private.hh \ + hb-ot-color.cc \ + hb-ot-color-colr-table.hh \ + hb-ot-color-cpal-table.hh \ hb-ot-map.cc \ hb-ot-map-private.hh \ hb-ot-math.cc \ @@ -109,7 +115,9 @@ HB_OT_sources = \ hb-ot-shape-complex-indic.cc \ hb-ot-shape-complex-indic-private.hh \ hb-ot-shape-complex-indic-table.cc \ + hb-ot-shape-complex-khmer-private.hh \ hb-ot-shape-complex-khmer.cc \ + hb-ot-shape-complex-myanmar-private.hh \ hb-ot-shape-complex-myanmar.cc \ hb-ot-shape-complex-thai.cc \ hb-ot-shape-complex-tibetan.cc \ @@ -181,8 +189,26 @@ HB_UCDN_sources = hb-ucdn.cc HB_ICU_sources = hb-icu.cc HB_ICU_headers = hb-icu.h -HB_GOBJECT_sources = hb-gobject-structs.cc -HB_GOBJECT_STRUCTS_headers = hb-gobject-structs.h -HB_GOBJECT_headers = hb-gobject.h $(HB_GOBJECT_STRUCTS_headers) +# Sources for libharfbuzz-subset +HB_SUBSET_sources = \ + hb-subset.cc \ + hb-subset-glyf.cc \ + hb-subset-input.cc \ + hb-subset-plan.cc \ + $(NULL) + +HB_SUBSET_headers = \ + hb-subset.h \ + hb-subset-glyf.hh \ + hb-subset-plan.hh \ + hb-subset-private.hh \ + $(NULL) + +HB_GOBJECT_DIST_sources = hb-gobject-structs.cc +HB_GOBJECT_DIST_headers = hb-gobject.h hb-gobject-structs.h HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc HB_GOBJECT_ENUM_headers = hb-gobject-enums.h +HB_GOBJECT_NODIST_sources = $(HB_GOBJECT_ENUM_sources) +HB_GOBJECT_NODIST_headers = $(HB_GOBJECT_ENUM_headers) +HB_GOBJECT_sources = $(HB_GOBJECT_DIST_sources) $(HB_GOBJECT_NODIST_sources) +HB_GOBJECT_headers = $(HB_GOBJECT_DIST_headers) $(HB_GOBJECT_NODIST_headers) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh deleted file mode 100755 index c6697831fe1..00000000000 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh - -LC_ALL=C -export LC_ALL - -test -z "$srcdir" && srcdir=. -test -z "$libs" && libs=.libs -stat=0 - -if which nm 2>/dev/null >/dev/null; then - : -else - echo "check-defs.sh: 'nm' not found; skipping test" - exit 77 -fi - -defs="harfbuzz.def" -if ! test -f "$defs"; then - echo "check-defs.sh: '$defs' not found; skipping test" - exit 77 -fi - -tested=false -for def in $defs; do - lib=`echo "$def" | sed 's/[.]def$//;s@.*/@@'` - for suffix in so dylib; do - so=$libs/lib${lib}.$suffix - if ! test -f "$so"; then continue; fi - - # On mac, C symbols are prefixed with _ - if test $suffix = dylib; then prefix="_"; fi - - EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v " $prefix"'\(_fini\>\|_init\>\|_fdata\>\|_ftext\>\|_fbss\>\|__bss_start\>\|__bss_start__\>\|__bss_end__\>\|_edata\>\|_end\>\|_bss_end__\>\|__end__\>\|__gcov_flush\>\|llvm_\)' | cut -d' ' -f3`" - - if test -f "$so"; then - - echo "Checking that $so has the same symbol list as $def" - { - echo EXPORTS - echo "$EXPORTED_SYMBOLS" | sed -e "s/^${prefix}hb/hb/g" - # cheat: copy the last line from the def file! - tail -n1 "$def" - } | diff "$def" - >&2 || stat=1 - - tested=true - fi - done -done -if ! $tested; then - echo "check-defs.sh: libharfbuzz shared library not found; skipping test" - exit 77 -fi - -exit $stat diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh index e4aaeb2b4a1..ce0bdab755f 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh @@ -21,16 +21,20 @@ else fi tested=false -for suffix in so dylib; do - so=$libs/libharfbuzz.$suffix - if ! test -f "$so"; then continue; fi +# harfbuzz-icu links to libstdc++ because icu does. +# harfbuzz-subset uses libstdc++. +for soname in harfbuzz harfbuzz-gobject; do + for suffix in so dylib; do + so=$libs/lib$soname.$suffix + if ! test -f "$so"; then continue; fi - echo "Checking that we are not linking to libstdc++ or libc++" - if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then - echo "Ouch, linked to libstdc++ or libc++" - stat=1 - fi - tested=true + echo "Checking that we are not linking to libstdc++ or libc++ in $so" + if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then + echo "Ouch, linked to libstdc++ or libc++" + stat=1 + fi + tested=true + done done if ! $tested; then echo "check-libstdc++.sh: libharfbuzz shared library not found; skipping test" 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 3adf65f8744..bfc93b349ae 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh @@ -7,6 +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_.*' if which nm 2>/dev/null >/dev/null; then : @@ -15,29 +16,46 @@ else exit 77 fi -echo "Checking that we are not exposing internal symbols" tested=false -for suffix in so dylib; do - so=$libs/libharfbuzz.$suffix - if ! test -f "$so"; then continue; fi - - EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| _fbss\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>\| __gcov_flush\>\| ___gcov_flush\>\| llvm_\| _llvm_' | cut -d' ' -f3`" - - prefix=`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'` - - # On mac, C symbols are prefixed with _ - if test $suffix = dylib; then prefix="_$prefix"; fi - - echo "Processing $so" - if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}_"; then - echo "Ouch, internal symbols exposed" - stat=1 - fi - - tested=true +for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do + for suffix in so dylib; do + so=$libs/lib$soname.$suffix + if ! test -f "$so"; then continue; fi + + # On macOS, C symbols are prefixed with _ + symprefix= + if test $suffix = dylib; then symprefix=_; fi + + EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`" + + prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'` + + echo + echo "Checking that $so does not expose internal symbols" + if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}\(_\|$\)"; then + echo "Ouch, internal symbols exposed" + stat=1 + fi + + def=$soname.def + if ! test -f "$def"; then + echo "'$def' not found; skipping" + else + echo + echo "Checking that $so has the same symbol list as $def" + { + echo EXPORTS + echo "$EXPORTED_SYMBOLS" | sed -e "s/^${symprefix}hb/hb/g" + # cheat: copy the last line from the def file! + tail -n1 "$def" + } | c++filt | diff "$def" - >&2 || stat=1 + fi + + tested=true + done done if ! $tested; then - echo "check-symbols.sh: no shared library found; skipping test" + echo "check-symbols.sh: no shared libraries found; skipping test" exit 77 fi diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-indic-data.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-indic-data.cc new file mode 100644 index 00000000000..d57413884be --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-indic-data.cc @@ -0,0 +1,43 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-shape-complex-indic-private.hh" + +int +main (void) +{ + for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) + { + hb_glyph_info_t info; + info.codepoint = u; + set_indic_properties (info); + if (info.indic_category() != INDIC_SYLLABIC_CATEGORY_OTHER || + info.indic_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE) + printf("U+%04X %u %u\n", u, + info.indic_category(), + info.indic_position()); + } +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc new file mode 100644 index 00000000000..7dd09b2b5ca --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc @@ -0,0 +1,43 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-shape-complex-khmer-private.hh" + +int +main (void) +{ + for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) + { + hb_glyph_info_t info; + info.codepoint = u; + set_khmer_properties (info); + if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER || + info.khmer_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE) + printf("U+%04X %u %u\n", u, + info.khmer_category(), + info.khmer_position()); + } +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc new file mode 100644 index 00000000000..2df9cd987f3 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc @@ -0,0 +1,43 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-shape-complex-myanmar-private.hh" + +int +main (void) +{ + for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) + { + hb_glyph_info_t info; + info.codepoint = u; + set_myanmar_properties (info); + if (info.myanmar_category() != INDIC_SYLLABIC_CATEGORY_OTHER || + info.myanmar_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE) + printf("U+%04X %u %u\n", u, + info.myanmar_category(), + info.myanmar_position()); + } +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc new file mode 100644 index 00000000000..0e64688f1e0 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc @@ -0,0 +1,38 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-shape-complex-use-private.hh" + +int +main (void) +{ + for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) + { + unsigned int category = hb_use_get_category (u); + if (category != USE_O) + printf("U+%04X %u\n", u, category); + } +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py index ad1606ec3ff..1673537c963 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py @@ -9,8 +9,11 @@ for h in os.environ["headers"].split (' '): if h.endswith (".h"): with io.open(h, encoding='utf8') as f: headers_content.append (f.read ()) -result = ("EXPORTS\n" + - "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))) + - "\nLIBRARY libharfbuzz-0.dll") +result = """EXPORTS +%s +LIBRARY lib%s-0.dll""" % ( + "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))), + sys.argv[1].replace ('.def', '') +) with open (sys.argv[1], "w") as f: f.write (result) 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 5391f27eb3e..06817255c92 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 @@ -449,7 +449,7 @@ page_bits = 12 print "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy) print print "USE_TABLE_ELEMENT_TYPE" -print "hb_use_get_categories (hb_codepoint_t u)" +print "hb_use_get_category (hb_codepoint_t u)" print "{" print " switch (u >> %d)" % page_bits print " {" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-config.cmake.in b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-config.cmake.in new file mode 100644 index 00000000000..87b15721a3a --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-config.cmake.in @@ -0,0 +1,82 @@ +# Set these variables so that the `${prefix}/lib` expands to something we can +# remove. +set(_harfbuzz_remove_string "REMOVE_ME") +set(exec_prefix "${_harfbuzz_remove_string}") +set(prefix "${_harfbuzz_remove_string}") + +# Compute the installation prefix by stripping components from our current +# location. +get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY) +get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY) +set(_harfbuzz_libdir "@libdir@") +string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}") +set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}") +while (_harfbuzz_libdir_iter) + get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY) + get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY) +endwhile () +unset(_harfbuzz_libdir_iter) + +# Get the include subdir. +set(_harfbuzz_includedir "@includedir@") +string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}") + +# Extract version information from libtool. +set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@") +string(REPLACE ":" ";" _harfbuzz_version_info "${_harfbuzz_version_info}") +list(GET _harfbuzz_version_info 0 + _harfbuzz_current) +list(GET _harfbuzz_version_info 1 + _harfbuzz_revision) +list(GET _harfbuzz_version_info 2 + _harfbuzz_age) +unset(_harfbuzz_version_info) + +if (APPLE) + set(_harfbuzz_lib_suffix ".0${CMAKE_SHARED_LIBRARY_SUFFIX}") +elseif (UNIX) + set(_harfbuzz_lib_suffix "${CMAKE_SHARED_LIBRARY_SUFFIX}.0.${_harfbuzz_current}.${_harfbuzz_revision}") +else () + # Unsupported. + set(harfbuzz_FOUND 0) +endif () + +# Add the libraries. +add_library(harfbuzz::harfbuzz SHARED IMPORTED) +set_target_properties(harfbuzz::harfbuzz PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz${_harfbuzz_lib_suffix}") + +add_library(harfbuzz::icu SHARED IMPORTED) +set_target_properties(harfbuzz::icu PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-icu${_harfbuzz_lib_suffix}") + +add_library(harfbuzz::subset SHARED IMPORTED) +set_target_properties(harfbuzz::subset PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-subset${_harfbuzz_lib_suffix}") + +# Only add the gobject library if it was built. +set(_harfbuzz_have_gobject "@have_gobject@") +if (_harfbuzz_have_gobject) + add_library(harfbuzz::gobject SHARED IMPORTED) + set_target_properties(harfbuzz::gobject PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-gobject${_harfbuzz_lib_suffix}") +endif () + +# Clean out variables we used in our scope. +unset(_harfbuzz_lib_suffix) +unset(_harfbuzz_current) +unset(_harfbuzz_revision) +unset(_harfbuzz_age) +unset(_harfbuzz_includedir) +unset(_harfbuzz_libdir) +unset(_harfbuzz_prefix) +unset(exec_prefix) +unset(prefix) +unset(_harfbuzz_remove_string) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.pc.in b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.pc.in new file mode 100644 index 00000000000..5da64b3f126 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.pc.in @@ -0,0 +1,12 @@ +prefix=%prefix% +exec_prefix=%exec_prefix% +libdir=%libdir% +includedir=%includedir% + +Name: harfbuzz +Description: HarfBuzz font subsetter +Version: %VERSION% + +Requires: harfbuzz +Libs: -L${libdir} -lharfbuzz-subset +Cflags: -I${includedir}/harfbuzz 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 new file mode 100644 index 00000000000..d0453bd8807 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh @@ -0,0 +1,80 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_AAT_LAYOUT_ANKR_TABLE_HH +#define HB_AAT_LAYOUT_ANKR_TABLE_HH + +#include "hb-aat-layout-common-private.hh" + +#define HB_AAT_TAG_ankr HB_TAG('a','n','k','r') + + +namespace AAT { + + +/* + * ankr -- Anchor point + */ + +struct Anchor +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + FWORD xCoordinate; + FWORD yCoordinate; + public: + DEFINE_SIZE_STATIC (4); +}; + +struct ankr +{ + static const hb_tag_t tableTag = HB_AAT_TAG_ankr; + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && version == 0 && + lookupTable.sanitize (c, this) && + anchors.sanitize (c, this)); + } + + protected: + HBUINT16 version; /* Version number (set to zero) */ + HBUINT16 flags; /* Flags (currently unused; set to zero) */ + LOffsetTo<Lookup<HBUINT16> > lookupTable; /* Offset to the table's lookup table */ + LOffsetTo<ArrayOf<Anchor, HBUINT32> > + anchors; /* Offset to the glyph data table */ + + public: + DEFINE_SIZE_STATIC (12); +}; + +} /* namespace AAT */ + + +#endif /* HB_AAT_LAYOUT_ANKR_TABLE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh index b5395bba5bb..7c0dfa8b0cf 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh @@ -120,7 +120,7 @@ struct BinSearchArrayOf else return p; } - return NULL; + return nullptr; } private: @@ -563,9 +563,9 @@ struct StateTable unsigned int entry = 0; while (state < num_states) { - if (unlikely (!c->check_array (states + state * nClasses, - states[0].static_size, - nClasses * (num_states - state)))) + if (unlikely (!c->check_array (states, + states[0].static_size * nClasses, + num_states))) return_trace (false); { /* Sweep new states. */ const HBUINT16 *stop = &states[num_states * nClasses]; @@ -574,9 +574,9 @@ struct StateTable state = num_states; } - if (unlikely (!c->check_array (entries + entry, + if (unlikely (!c->check_array (entries, entries[0].static_size, - num_entries - entry))) + num_entries))) return_trace (false); { /* Sweep new entries. */ const Entry<Extra> *stop = &entries[num_entries]; @@ -614,8 +614,7 @@ struct StateTableDriver hb_face_t *face_) : machine (machine_), buffer (buffer_), - num_glyphs (face_->get_num_glyphs ()), - last_zero (0) {} + num_glyphs (face_->get_num_glyphs ()) {} template <typename context_t> inline void drive (context_t *c) @@ -629,9 +628,6 @@ struct StateTableDriver bool last_was_dont_advance = false; for (buffer->idx = 0;;) { - if (!state) - last_zero = buffer->idx; - unsigned int klass = buffer->idx < buffer->len ? machine.get_class (info[buffer->idx].codepoint, num_glyphs) : 0 /* End of text */; @@ -639,10 +635,29 @@ struct StateTableDriver if (unlikely (!entry)) break; + /* Unsafe-to-break before this if not in state 0, as things might + * go differently if we start from state 0 here. */ + if (state && buffer->idx) + { + /* If there's no action and we're just epsilon-transitioning to state 0, + * safe to break. */ + if (c->is_actionable (this, entry) || + !(entry->newState == 0 && entry->flags == context_t::DontAdvance)) + buffer->unsafe_to_break (buffer->idx - 1, buffer->idx + 1); + } + + /* Unsafe-to-break if end-of-text would kick in here. */ + if (buffer->idx + 2 <= buffer->len) + { + const Entry<EntryData> *end_entry = machine.get_entryZ (state, 0); + if (c->is_actionable (this, end_entry)) + buffer->unsafe_to_break (buffer->idx, buffer->idx + 2); + } + if (unlikely (!c->transition (this, entry))) break; - last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops--; + last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops-- > 0; state = entry->newState; @@ -665,7 +680,6 @@ struct StateTableDriver const StateTable<EntryData> &machine; hb_buffer_t *buffer; unsigned int num_glyphs; - unsigned int last_zero; }; @@ -684,17 +698,23 @@ struct hb_aat_apply_context_t : hb_buffer_t *buffer; hb_sanitize_context_t sanitizer; + /* Unused. For debug tracing only. */ + unsigned int lookup_index; + unsigned int debug_depth; + inline hb_aat_apply_context_t (hb_font_t *font_, hb_buffer_t *buffer_, hb_blob_t *table) : font (font_), face (font->face), buffer (buffer_), - sanitizer () + sanitizer (), lookup_index (0), debug_depth (0) { sanitizer.init (table); sanitizer.num_glyphs = face->get_num_glyphs (); sanitizer.start_processing (); } + inline void set_lookup_index (unsigned int i) { lookup_index = i; } + inline ~hb_aat_apply_context_t (void) { sanitizer.end_processing (); 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 new file mode 100644 index 00000000000..ce7ca105faa --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh @@ -0,0 +1,339 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_AAT_LAYOUT_KERX_TABLE_HH +#define HB_AAT_LAYOUT_KERX_TABLE_HH + +#include "hb-open-type-private.hh" +#include "hb-aat-layout-common-private.hh" + +#define HB_AAT_TAG_KERX HB_TAG('k','e','r','x') + + +namespace AAT { + +using namespace OT; + + +struct KerxFormat0Records +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + GlyphID left; + GlyphID right; + FWORD value; + public: + DEFINE_SIZE_STATIC (6); +}; + +struct KerxSubTableFormat0 +{ + // TODO(ebraminio) Enable when we got suitable BinSearchArrayOf + // inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const + // { + // hb_glyph_pair_t pair = {left, right}; + // int i = pairs.bsearch (pair); + // if (i == -1) + // return 0; + // return pairs[i].get_kerning (); + // } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + c->check_array (records, records[0].static_size, nPairs)); + } + + protected: + // TODO(ebraminio): A custom version of "BinSearchArrayOf<KerxPair> pairs;" is + // needed here to use HBUINT32 instead + HBUINT32 nPairs; /* The number of kerning pairs in this subtable */ + HBUINT32 searchRange; /* The largest power of two less than or equal to the value of nPairs, + * multiplied by the size in bytes of an entry in the subtable. */ + HBUINT32 entrySelector; /* This is calculated as log2 of the largest power of two less + * than or equal to the value of nPairs. */ + HBUINT32 rangeShift; /* The value of nPairs minus the largest power of two less than or equal to nPairs. */ + KerxFormat0Records records[VAR]; /* VAR=nPairs */ + public: + DEFINE_SIZE_ARRAY (16, records); +}; + +struct KerxSubTableFormat1 +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + stateHeader.sanitize (c)); + } + + protected: + StateTable<HBUINT16> stateHeader; + LOffsetTo<ArrayOf<HBUINT16> > valueTable; + public: + DEFINE_SIZE_STATIC (20); +}; + +// TODO(ebraminio): Maybe this can be replaced with Lookup<HBUINT16>? +struct KerxClassTable +{ + inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (firstGlyph.sanitize (c) && classes.sanitize (c)); + } + + protected: + HBUINT16 firstGlyph; /* First glyph in class range. */ + ArrayOf<HBUINT16> classes; /* Glyph classes. */ + public: + DEFINE_SIZE_ARRAY (4, classes); +}; + +struct KerxSubTableFormat2 +{ + inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const + { + unsigned int l = (this+leftClassTable).get_class (left); + unsigned int r = (this+leftClassTable).get_class (left); + unsigned int offset = l * rowWidth + r * sizeof (FWORD); + const FWORD *arr = &(this+array); + if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end)) + return 0; + const FWORD *v = &StructAtOffset<FWORD> (arr, offset); + if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end)) + return 0; + return *v; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + rowWidth.sanitize (c) && + leftClassTable.sanitize (c, this) && + rightClassTable.sanitize (c, this) && + array.sanitize (c, this)); + } + + protected: + HBUINT32 rowWidth; /* The width, in bytes, of a row in the table. */ + LOffsetTo<KerxClassTable> + leftClassTable; /* Offset from beginning of this subtable to + * left-hand class table. */ + LOffsetTo<KerxClassTable> + rightClassTable;/* Offset from beginning of this subtable to + * right-hand class table. */ + LOffsetTo<FWORD> + array; /* Offset from beginning of this subtable to + * the start of the kerning array. */ + public: + DEFINE_SIZE_STATIC (16); +}; + +struct KerxSubTableFormat4 +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + rowWidth.sanitize (c) && + leftClassTable.sanitize (c, this) && + rightClassTable.sanitize (c, this) && + array.sanitize (c, this)); + } + + protected: + HBUINT32 rowWidth; /* The width, in bytes, of a row in the table. */ + LOffsetTo<KerxClassTable> + leftClassTable; /* Offset from beginning of this subtable to + * left-hand class table. */ + LOffsetTo<KerxClassTable> + rightClassTable;/* Offset from beginning of this subtable to + * right-hand class table. */ + LOffsetTo<FWORD> + array; /* Offset from beginning of this subtable to + * the start of the kerning array. */ + public: + DEFINE_SIZE_STATIC (16); +}; + +struct KerxSubTableFormat6 +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + rowIndexTable.sanitize (c, this) && + columnIndexTable.sanitize (c, this) && + kerningArray.sanitize (c, this) && + kerningVector.sanitize (c, this)); + } + + protected: + HBUINT32 flags; + HBUINT16 rowCount; + HBUINT16 columnCount; + LOffsetTo<Lookup<HBUINT16> > rowIndexTable; + LOffsetTo<Lookup<HBUINT16> > columnIndexTable; + LOffsetTo<Lookup<HBUINT16> > kerningArray; + LOffsetTo<Lookup<HBUINT16> > kerningVector; + public: + DEFINE_SIZE_STATIC (24); +}; + +enum coverage_flags_t +{ + COVERAGE_VERTICAL_FLAG = 0x80u, + COVERAGE_CROSSSTREAM_FLAG = 0x40u, + COVERAGE_VARIATION_FLAG = 0x20u, + COVERAGE_PROCESS_DIRECTION = 0x10u, +}; + +struct KerxTable +{ + inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const + { + TRACE_APPLY (this); + /* TODO */ + return_trace (false); + } + + inline unsigned int get_size (void) const { return length; } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!c->check_struct (this)) + return_trace (false); + + switch (format) { + case 0: return u.format0.sanitize (c); + case 1: return u.format1.sanitize (c); + case 2: return u.format2.sanitize (c); + case 4: return u.format4.sanitize (c); + case 6: return u.format6.sanitize (c); + default:return_trace (false); + } + } + +protected: + HBUINT32 length; + HBUINT8 coverage; + HBUINT16 unused; + HBUINT8 format; + HBUINT32 tupleIndex; + union { + KerxSubTableFormat0 format0; + KerxSubTableFormat1 format1; + KerxSubTableFormat2 format2; + KerxSubTableFormat4 format4; + KerxSubTableFormat6 format6; + } u; +public: + DEFINE_SIZE_MIN (12); +}; + +struct SubtableGlyphCoverageArray +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + HBUINT32 length; + HBUINT32 coverage; + HBUINT32 tupleCount; + public: + DEFINE_SIZE_STATIC (12); +}; + +struct kerx +{ + static const hb_tag_t tableTag = HB_AAT_TAG_KERX; + + inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const + { + TRACE_APPLY (this); + const KerxTable &table = StructAfter<KerxTable> (*this); + return_trace (table.apply (c, ankr)); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!(c->check_struct (this))) + return_trace (false); + + /* TODO: Something like `morx`s ChainSubtable should be done here instead */ + const KerxTable *table = &StructAfter<KerxTable> (*this); + if (!(table->sanitize (c))) + return_trace (false); + + for (unsigned int i = 0; i < nTables - 1; ++i) + { + table = &StructAfter<KerxTable> (*table); + if (!(table->sanitize (c))) + return_trace (false); + } + + // If version is less than 3, we are done here; otherwise better to check footer also + if (version < 3) + return_trace (true); + + // TODO: Investigate why this just work on some fonts no matter of version + // const SubtableGlyphCoverageArray &footer = + // StructAfter<SubtableGlyphCoverageArray> (*table); + // return_trace (footer.sanitize (c)); + + return_trace (true); + } + + protected: + HBUINT16 version; + HBUINT16 padding; + HBUINT32 nTables; +/*KerxTable tables[VAR];*/ +/*SubtableGlyphCoverageArray coverage_array;*/ + public: + DEFINE_SIZE_STATIC (8); +}; + +} /* namespace AAT */ + + +#endif /* HB_AAT_LAYOUT_KERX_TABLE_HH */ diff --git a/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 c64dca06670..4cc2824214e 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 @@ -40,6 +40,8 @@ using namespace OT; struct RearrangementSubtable { + typedef void EntryData; + struct driver_context_t { static const bool in_place = true; @@ -58,20 +60,21 @@ struct RearrangementSubtable inline driver_context_t (const RearrangementSubtable *table) : ret (false), - start (0), end (0), - last_zero_before_start (0) {} + start (0), end (0) {} - inline bool transition (StateTableDriver<void> *driver, - const Entry<void> *entry) + inline bool is_actionable (StateTableDriver<EntryData> *driver, + const Entry<EntryData> *entry) + { + return (entry->flags & Verb) && start < end; + } + inline bool transition (StateTableDriver<EntryData> *driver, + const Entry<EntryData> *entry) { hb_buffer_t *buffer = driver->buffer; unsigned int flags = entry->flags; if (flags & MarkFirst) - { start = buffer->idx; - last_zero_before_start = driver->last_zero; - } if (flags & MarkLast) end = MIN (buffer->idx + 1, buffer->len); @@ -110,7 +113,7 @@ struct RearrangementSubtable if (end - start >= l + r) { - buffer->unsafe_to_break (last_zero_before_start, MIN (buffer->idx + 1, buffer->len)); + buffer->merge_clusters (start, MIN (buffer->idx + 1, buffer->len)); buffer->merge_clusters (start, end); hb_glyph_info_t *info = buffer->info; @@ -147,7 +150,6 @@ struct RearrangementSubtable private: unsigned int start; unsigned int end; - unsigned int last_zero_before_start; }; inline bool apply (hb_aat_apply_context_t *c) const @@ -169,7 +171,7 @@ struct RearrangementSubtable } protected: - StateTable<void> machine; + StateTable<EntryData> machine; public: DEFINE_SIZE_STATIC (16); }; @@ -198,20 +200,29 @@ struct ContextualSubtable inline driver_context_t (const ContextualSubtable *table) : ret (false), + mark_set (false), mark (0), - last_zero_before_mark (0), subs (table+table->substitutionTables) {} + inline bool is_actionable (StateTableDriver<EntryData> *driver, + const Entry<EntryData> *entry) + { + hb_buffer_t *buffer = driver->buffer; + + if (buffer->idx == buffer->len && !mark_set) + return false; + + return entry->data.markIndex != 0xFFFF || entry->data.currentIndex != 0xFFFF; + } inline bool transition (StateTableDriver<EntryData> *driver, const Entry<EntryData> *entry) { hb_buffer_t *buffer = driver->buffer; - if (entry->flags & SetMark) - { - mark = buffer->idx; - last_zero_before_mark = driver->last_zero; - } + /* Looks like CoreText applies neither mark nor current substitution for + * end-of-text if mark was not explicitly set. */ + if (buffer->idx == buffer->len && !mark_set) + return true; if (entry->data.markIndex != 0xFFFF) { @@ -220,32 +231,38 @@ struct ContextualSubtable const GlyphID *replacement = lookup.get_value (info[mark].codepoint, driver->num_glyphs); if (replacement) { - buffer->unsafe_to_break (last_zero_before_mark, MIN (buffer->idx + 1, buffer->len)); + buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len)); info[mark].codepoint = *replacement; ret = true; } } if (entry->data.currentIndex != 0xFFFF) { + unsigned int idx = MIN (buffer->idx, buffer->len - 1); const Lookup<GlyphID> &lookup = subs[entry->data.currentIndex]; hb_glyph_info_t *info = buffer->info; - const GlyphID *replacement = lookup.get_value (info[buffer->idx].codepoint, driver->num_glyphs); + const GlyphID *replacement = lookup.get_value (info[idx].codepoint, driver->num_glyphs); if (replacement) { - buffer->unsafe_to_break (driver->last_zero, MIN (buffer->idx + 1, buffer->len)); - info[buffer->idx].codepoint = *replacement; + info[idx].codepoint = *replacement; ret = true; } } + if (entry->flags & SetMark) + { + mark_set = true; + mark = buffer->idx; + } + return true; } public: bool ret; private: + bool mark_set; unsigned int mark; - unsigned int last_zero_before_mark; const UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32> &subs; }; @@ -265,8 +282,8 @@ struct ContextualSubtable { TRACE_SANITIZE (this); - unsigned int num_entries; - if (unlikely (!machine.sanitize (c, &num_entries))) return false; + unsigned int num_entries = 0; + if (unlikely (!machine.sanitize (c, &num_entries))) return_trace (false); unsigned int num_lookups = 0; @@ -275,8 +292,10 @@ struct ContextualSubtable { const EntryData &data = entries[i].data; - num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex); - num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex); + if (data.markIndex != 0xFFFF) + num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex); + if (data.currentIndex != 0xFFFF) + num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex); } return_trace (substitutionTables.sanitize (c, this, num_lookups)); @@ -333,6 +352,11 @@ struct LigatureSubtable ligature (table+table->ligature), match_length (0) {} + inline bool is_actionable (StateTableDriver<EntryData> *driver, + const Entry<EntryData> *entry) + { + return !!(entry->flags & PerformAction); + } inline bool transition (StateTableDriver<EntryData> *driver, const Entry<EntryData> *entry) { @@ -432,9 +456,8 @@ struct LigatureSubtable { TRACE_SANITIZE (this); /* The rest of array sanitizations are done at run-time. */ - return c->check_struct (this) && machine.sanitize (c) && - ligAction && component && ligature; - return_trace (true); + return_trace (c->check_struct (this) && machine.sanitize (c) && + ligAction && component && ligature); } protected: @@ -593,8 +616,18 @@ struct Chain unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { + if (!c->buffer->message (c->font, "start chain subtable %d", c->lookup_index)) + { + c->set_lookup_index (c->lookup_index + 1); + continue; + } + subtable->apply (c); subtable = &StructAfter<ChainSubtable> (*subtable); + + (void) c->buffer->message (c->font, "end chain subtable %d", c->lookup_index); + + c->set_lookup_index (c->lookup_index + 1); } } @@ -648,6 +681,7 @@ struct morx inline void apply (hb_aat_apply_context_t *c) const { + c->set_lookup_index (0); const Chain *chain = chains; unsigned int count = chainCount; for (unsigned int i = 0; i < count; i++) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh index c1c607a2f7a..ce75c8e7192 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh @@ -37,4 +37,7 @@ HB_INTERNAL void hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer); +HB_INTERNAL void +hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer); + #endif /* HB_AAT_LAYOUT_PRIVATE_HH */ diff --git a/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 new file mode 100644 index 00000000000..5767b116cbf --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh @@ -0,0 +1,201 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_AAT_LAYOUT_TRAK_TABLE_HH +#define HB_AAT_LAYOUT_TRAK_TABLE_HH + +#include "hb-aat-layout-common-private.hh" +#include "hb-open-type-private.hh" + +#define HB_AAT_TAG_trak HB_TAG('t','r','a','k') + + +namespace AAT { + + +struct TrackTableEntry +{ + inline bool sanitize (hb_sanitize_context_t *c, const void *base, unsigned int size) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && (values.sanitize (c, base, size))); + } + + inline float get_track_value () const + { + return track.to_float (); + } + + inline int get_value (const void *base, unsigned int index) const + { + return (base+values)[index]; + } + + protected: + Fixed track; /* Track value for this record. */ + HBUINT16 trackNameID; /* The 'name' table index for this track */ + OffsetTo<UnsizedArrayOf<FWORD> > + values; /* Offset from start of tracking table to + * per-size tracking values for this track. */ + + public: + DEFINE_SIZE_STATIC (8); +}; + +struct TrackData +{ + inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + sizeTable.sanitize (c, base, nSizes) && + trackTable.sanitize (c, nTracks, base, nSizes)); + } + + inline float get_tracking (const void *base, float ptem) const + { + /* CoreText points are CSS pixels (96 per inch), + * NOT typographic points (72 per inch). + * + * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html + */ + float csspx = ptem * 96.f / 72.f; + Fixed fixed_size; + fixed_size.set_float (csspx); + + /* XXX Clean this up. Make it work with nSizes==1 and 0. */ + + unsigned int sizes = nSizes; + + const TrackTableEntry *trackTableEntry = nullptr; + for (unsigned int i = 0; i < sizes; ++i) + // For now we only seek for track entries with zero tracking value + if (trackTable[i].get_track_value () == 0.) + trackTableEntry = &trackTable[0]; + + // We couldn't match any, exit + if (!trackTableEntry) return 0.; + + /* TODO bfind() */ + unsigned int size_index; + UnsizedArrayOf<Fixed> size_table = base+sizeTable; + for (size_index = 0; size_index < sizes; ++size_index) + if (size_table[size_index] >= fixed_size) + break; + + // TODO(ebraminio): We don't attempt to extrapolate to larger or + // smaller values for now but we should do, per spec + if (size_index == sizes) + return trackTableEntry->get_value (base, sizes - 1); + if (size_index == 0 || size_table[size_index] == fixed_size) + return trackTableEntry->get_value (base, size_index); + + float s0 = size_table[size_index - 1].to_float (); + float s1 = size_table[size_index].to_float (); + float t = (csspx - s0) / (s1 - s0); + return t * trackTableEntry->get_value (base, size_index) + + (1.0 - t) * trackTableEntry->get_value (base, size_index - 1); + } + + protected: + HBUINT16 nTracks; /* Number of separate tracks included in this table. */ + HBUINT16 nSizes; /* Number of point sizes included in this table. */ + LOffsetTo<UnsizedArrayOf<Fixed> > /* Offset to array[nSizes] of size values. */ + sizeTable; + UnsizedArrayOf<TrackTableEntry> + trackTable; /* Array[nTracks] of TrackTableEntry records. */ + + public: + DEFINE_SIZE_ARRAY (8, trackTable); +}; + +struct trak +{ + static const hb_tag_t tableTag = HB_AAT_TAG_trak; + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + + return_trace (c->check_struct (this) && + horizData.sanitize (c, this, this) && + vertData.sanitize (c, this, this)); + } + + inline bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + const float ptem = c->font->ptem; + if (ptem <= 0.f) + return_trace (false); + + hb_buffer_t *buffer = c->buffer; + if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction)) + { + const TrackData &trackData = this+horizData; + float tracking = trackData.get_tracking (this, ptem); + hb_position_t advance_to_add = c->font->em_scalef_x (tracking / 2); + foreach_grapheme (buffer, start, end) + { + /* TODO This is wrong. */ + buffer->pos[start].x_advance += advance_to_add; + buffer->pos[end].x_advance += advance_to_add; + } + } + else + { + const TrackData &trackData = this+vertData; + float tracking = trackData.get_tracking (this, ptem); + hb_position_t advance_to_add = c->font->em_scalef_y (tracking / 2); + foreach_grapheme (buffer, start, end) + { + /* TODO This is wrong. */ + buffer->pos[start].y_advance += advance_to_add; + buffer->pos[end].y_advance += advance_to_add; + } + } + + return_trace (true); + } + + protected: + FixedVersion<> version; /* Version of the tracking table--currently + * 0x00010000u for version 1.0. */ + HBUINT16 format; /* Format of the tracking table */ + OffsetTo<TrackData> horizData; /* TrackData for horizontal text */ + OffsetTo<TrackData> vertData; /* TrackData for vertical text */ + HBUINT16 reserved; /* Reserved. Set to 0. */ + + public: + DEFINE_SIZE_MIN (12); +}; + +} /* namespace AAT */ + + +#endif /* HB_AAT_LAYOUT_TRAK_TABLE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc index d882fa16681..45268e3e7ab 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 @@ -30,12 +30,48 @@ #include "hb-ot-layout-gsubgpos-private.hh" #include "hb-aat-layout-private.hh" +#include "hb-aat-layout-ankr-table.hh" +#include "hb-aat-layout-kerx-table.hh" #include "hb-aat-layout-morx-table.hh" +#include "hb-aat-layout-trak-table.hh" /* - * mort/morx + * morx/kerx/trak */ +static inline const AAT::ankr& +_get_ankr (hb_face_t *face, hb_blob_t **blob = nullptr) +{ + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) + { + if (blob) + *blob = hb_blob_get_empty (); + return OT::Null(AAT::ankr); + } + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + const AAT::ankr& ankr = *(layout->ankr.get ()); + if (blob) + *blob = layout->ankr.blob; + return ankr; +} + +static inline const AAT::kerx& +_get_kerx (hb_face_t *face, hb_blob_t **blob = nullptr) +{ + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) + { + if (blob) + *blob = hb_blob_get_empty (); + return OT::Null(AAT::kerx); + } + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + /* XXX this doesn't call set_num_glyphs on sanitizer. */ + const AAT::kerx& kerx = *(layout->kerx.get ()); + if (blob) + *blob = layout->kerx.blob; + return kerx; +} + static inline const AAT::morx& _get_morx (hb_face_t *face, hb_blob_t **blob = nullptr) { @@ -53,20 +89,36 @@ _get_morx (hb_face_t *face, hb_blob_t **blob = nullptr) return morx; } -static inline void -_hb_aat_layout_create (hb_face_t *face) +static inline const AAT::trak& +_get_trak (hb_face_t *face, hb_blob_t **blob = nullptr) { - OT::Sanitizer<AAT::morx> sanitizer; - sanitizer.set_num_glyphs (face->get_num_glyphs ()); - hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX)); - OT::Sanitizer<AAT::morx>::lock_instance (morx_blob); - - if (0) + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) { - OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ()); + if (blob) + *blob = hb_blob_get_empty (); + return OT::Null(AAT::trak); } + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + const AAT::trak& trak = *(layout->trak.get ()); + if (blob) + *blob = layout->trak.blob; + return trak; } +// static inline void +// _hb_aat_layout_create (hb_face_t *face) +// { +// OT::Sanitizer<AAT::morx> sanitizer; +// sanitizer.set_num_glyphs (face->get_num_glyphs ()); +// hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX)); +// OT::Sanitizer<AAT::morx>::lock_instance (morx_blob); + +// if (0) +// { +// OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ()); +// } +// } + void hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer) { @@ -76,3 +128,16 @@ hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer) AAT::hb_aat_apply_context_t c (font, buffer, blob); morx.apply (&c); } + +void +hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer) +{ + hb_blob_t *blob; + const AAT::ankr& ankr = _get_ankr (font->face, &blob); + const AAT::kerx& kerx = _get_kerx (font->face, &blob); + const AAT::trak& trak = _get_trak (font->face, &blob); + + AAT::hb_aat_apply_context_t c (font, buffer, blob); + kerx.apply (&c, &ankr); + trak.apply (&c); +} 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 4cf6d1e5451..b5291f650cc 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc @@ -171,6 +171,31 @@ hb_blob_create_sub_blob (hb_blob_t *parent, } /** + * hb_blob_copy_writable_or_fail: + * @blob: A blob. + * + * Makes a writable copy of @blob. + * + * Return value: New blob, or nullptr if allocation failed. + * + * Since: 1.8.0 + **/ +hb_blob_t * +hb_blob_copy_writable_or_fail (hb_blob_t *blob) +{ + blob = hb_blob_create (blob->data, + blob->length, + HB_MEMORY_MODE_DUPLICATE, + nullptr, + nullptr); + + if (unlikely (blob == hb_blob_get_empty ())) + blob = nullptr; + + return blob; +} + +/** * hb_blob_get_empty: * * Returns the singleton empty blob. @@ -222,7 +247,7 @@ hb_blob_reference (hb_blob_t *blob) * hb_blob_destroy: (skip) * @blob: a blob. * - * Descreases the reference count on @blob, and if it reaches zero, destroys + * Decreases the reference count on @blob, and if it reaches zero, destroys * @blob, freeing all memory, possibly calling the destroy-callback the blob * was created for if it has not been called already. * 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 53682d3eb1c..fd561f73869 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h @@ -83,6 +83,9 @@ hb_blob_create_sub_blob (hb_blob_t *parent, unsigned int length); HB_EXTERN hb_blob_t * +hb_blob_copy_writable_or_fail (hb_blob_t *blob); + +HB_EXTERN hb_blob_t * hb_blob_get_empty (void); HB_EXTERN hb_blob_t * diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh index 125a4192911..be374c77a5b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh @@ -34,397 +34,397 @@ #line 36 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { - 0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, - 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, - 9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, - 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, - 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, + 0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, + 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, + 9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, + 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, + 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0 }; static const char _deserialize_json_key_spans[] = { - 0, 115, 26, 7, 2, 1, 50, 49, - 10, 117, 117, 117, 1, 50, 49, 10, - 117, 117, 1, 1, 50, 49, 117, 117, - 2, 1, 50, 49, 10, 117, 117, 1, - 50, 49, 10, 117, 117, 1, 50, 49, + 0, 115, 26, 7, 2, 1, 50, 49, + 10, 117, 117, 117, 1, 50, 49, 10, + 117, 117, 1, 1, 50, 49, 117, 117, + 2, 1, 50, 49, 10, 117, 117, 1, + 50, 49, 10, 117, 117, 1, 50, 49, 58, 89, 117, 117, 85, 115, 0 }; static const short _deserialize_json_index_offsets[] = { - 0, 0, 116, 143, 151, 154, 156, 207, - 257, 268, 386, 504, 622, 624, 675, 725, - 736, 854, 972, 974, 976, 1027, 1077, 1195, - 1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, - 1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, + 0, 0, 116, 143, 151, 154, 156, 207, + 257, 268, 386, 504, 622, 624, 675, 725, + 736, 854, 972, 974, 976, 1027, 1077, 1195, + 1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, + 1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, 2119, 2178, 2268, 2386, 2504, 2590, 2706 }; static const char _deserialize_json_indicies[] = { - 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 1, 3, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 4, 1, - 5, 1, 6, 7, 1, 1, 8, 1, - 9, 10, 1, 11, 1, 11, 11, 11, - 11, 11, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 11, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 12, 1, - 12, 12, 12, 12, 12, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 12, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 13, 1, 1, 14, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 1, 16, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 1, 18, 18, 18, - 18, 18, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 18, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 19, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 20, 1, 21, 21, 21, 21, 21, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 21, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 22, - 1, 18, 18, 18, 18, 18, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 18, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 19, 1, 1, 1, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 20, 1, 23, - 1, 23, 23, 23, 23, 23, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 23, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 24, 1, 24, 24, 24, 24, - 24, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 24, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 25, 1, 1, 26, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 1, 28, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 1, 30, 30, 30, 30, 30, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 30, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 31, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 32, 1, 30, - 30, 30, 30, 30, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 30, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 31, 1, 1, 1, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 32, 1, 33, 1, 34, - 1, 34, 34, 34, 34, 34, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 34, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 35, 1, 35, 35, 35, 35, - 35, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 35, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 36, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 1, 38, 38, - 38, 38, 38, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 39, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 40, 1, 38, 38, 38, 38, - 38, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 38, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 39, - 1, 1, 1, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 40, 1, 42, 43, 1, 44, 1, 44, - 44, 44, 44, 44, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 44, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 45, 1, 45, 45, 45, 45, 45, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 45, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 46, 1, - 1, 47, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 1, 49, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 1, 51, - 51, 51, 51, 51, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 51, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 52, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 53, 1, 51, 51, 51, - 51, 51, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 51, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 52, 1, 1, 1, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 53, 1, 54, 1, 54, 54, 54, - 54, 54, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 54, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 55, 1, - 55, 55, 55, 55, 55, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 55, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 56, 1, 1, 57, - 58, 58, 58, 58, 58, 58, 58, 58, - 58, 1, 59, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 1, 61, 61, 61, - 61, 61, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 61, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 62, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 63, 1, 61, 61, 61, 61, 61, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 61, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 62, 1, - 1, 1, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 63, - 1, 64, 1, 64, 64, 64, 64, 64, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 64, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 65, 1, 65, 65, - 65, 65, 65, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 65, 1, 66, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 67, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 1, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 1, 1, 1, 1, 1, 1, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 1, 70, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 71, 71, - 1, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 1, 1, 1, 1, 1, - 1, 1, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 1, 1, 1, 1, - 71, 1, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 1, 72, 72, 72, - 72, 72, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 72, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 73, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 74, 1, 72, 72, 72, 72, 72, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 72, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 73, 1, - 1, 1, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 74, - 1, 76, 76, 76, 76, 76, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 76, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 77, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 78, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 3, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 1, 4, 1, + 5, 1, 6, 7, 1, 1, 8, 1, + 9, 10, 1, 11, 1, 11, 11, 11, + 11, 11, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 11, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 12, 1, + 12, 12, 12, 12, 12, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 12, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 13, 1, 1, 14, + 15, 15, 15, 15, 15, 15, 15, 15, + 15, 1, 16, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 1, 18, 18, 18, + 18, 18, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 18, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 19, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 20, 1, 21, 21, 21, 21, 21, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 21, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 22, + 1, 18, 18, 18, 18, 18, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 18, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 19, 1, 1, 1, + 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 20, 1, 23, + 1, 23, 23, 23, 23, 23, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 23, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 24, 1, 24, 24, 24, 24, + 24, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 24, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 25, 1, 1, 26, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 1, 28, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 1, 30, 30, 30, 30, 30, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 30, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 31, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 32, 1, 30, + 30, 30, 30, 30, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 30, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 31, 1, 1, 1, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 32, 1, 33, 1, 34, + 1, 34, 34, 34, 34, 34, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 34, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 35, 1, 35, 35, 35, 35, + 35, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 35, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 36, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 1, 38, 38, + 38, 38, 38, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 38, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 39, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 40, 1, 38, 38, 38, 38, + 38, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 38, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 39, + 1, 1, 1, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 40, 1, 42, 43, 1, 44, 1, 44, + 44, 44, 44, 44, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 44, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 45, 1, 45, 45, 45, 45, 45, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 45, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 46, 1, + 1, 47, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 1, 49, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 1, 51, + 51, 51, 51, 51, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 51, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 52, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 53, 1, 51, 51, 51, + 51, 51, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 51, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 52, 1, 1, 1, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 53, 1, 54, 1, 54, 54, 54, + 54, 54, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 54, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 55, 1, + 55, 55, 55, 55, 55, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 55, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 56, 1, 1, 57, + 58, 58, 58, 58, 58, 58, 58, 58, + 58, 1, 59, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 1, 61, 61, 61, + 61, 61, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 61, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 62, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 63, 1, 61, 61, 61, 61, 61, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 61, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 62, 1, + 1, 1, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 63, + 1, 64, 1, 64, 64, 64, 64, 64, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 64, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 65, 1, 65, 65, + 65, 65, 65, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 65, 1, 66, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 67, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 1, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 1, 1, 1, 1, 1, 1, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 1, 70, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 71, 71, + 1, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 1, 1, 1, 1, 1, + 1, 1, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 1, 1, 1, 1, + 71, 1, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 1, 72, 72, 72, + 72, 72, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 72, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 73, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 74, 1, 72, 72, 72, 72, 72, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 72, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 73, 1, + 1, 1, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 74, + 1, 76, 76, 76, 76, 76, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 76, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 77, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 78, 1, 0, + 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 0 }; static const char _deserialize_json_trans_targs[] = { - 1, 0, 2, 2, 3, 4, 18, 24, - 37, 5, 12, 6, 7, 8, 9, 11, - 9, 11, 10, 2, 44, 10, 44, 13, - 14, 15, 16, 17, 16, 17, 10, 2, - 44, 19, 20, 21, 22, 23, 10, 2, - 44, 23, 25, 31, 26, 27, 28, 29, - 30, 29, 30, 10, 2, 44, 32, 33, - 34, 35, 36, 35, 36, 10, 2, 44, - 38, 39, 40, 42, 43, 41, 10, 41, + 1, 0, 2, 2, 3, 4, 18, 24, + 37, 5, 12, 6, 7, 8, 9, 11, + 9, 11, 10, 2, 44, 10, 44, 13, + 14, 15, 16, 17, 16, 17, 10, 2, + 44, 19, 20, 21, 22, 23, 10, 2, + 44, 23, 25, 31, 26, 27, 28, 29, + 30, 29, 30, 10, 2, 44, 32, 33, + 34, 35, 36, 35, 36, 10, 2, 44, + 38, 39, 40, 42, 43, 41, 10, 41, 10, 2, 44, 43, 44, 45, 46 }; static const char _deserialize_json_trans_actions[] = { - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 2, - 0, 0, 3, 3, 4, 0, 5, 0, - 0, 2, 2, 2, 0, 0, 6, 6, - 7, 0, 0, 0, 2, 2, 8, 8, - 9, 0, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 10, 10, 11, 0, 0, - 2, 2, 2, 0, 0, 12, 12, 13, - 0, 0, 0, 2, 2, 2, 14, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 2, + 0, 0, 3, 3, 4, 0, 5, 0, + 0, 2, 2, 2, 0, 0, 6, 6, + 7, 0, 0, 0, 2, 2, 8, 8, + 9, 0, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 10, 10, 11, 0, 0, + 2, 2, 2, 0, 0, 12, 12, 13, + 0, 0, 0, 2, 2, 2, 14, 0, 15, 15, 16, 0, 0, 0, 0 }; @@ -461,7 +461,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer, int cs; hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; - + #line 466 "hb-buffer-deserialize-json.hh" { cs = deserialize_json_start; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl index 91b350f5ac0..0f7d48ee298 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl @@ -106,7 +106,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer, const char *p = buf, *pe = buf + buf_len; /* Ensure we have positions. */ - (void) hb_buffer_get_glyph_positions (buffer, NULL); + (void) hb_buffer_get_glyph_positions (buffer, nullptr); while (p < pe && ISSPACE (*p)) p++; @@ -115,7 +115,7 @@ _hb_buffer_deserialize_glyphs_json (hb_buffer_t *buffer, *end_ptr = ++p; } - const char *tok = NULL; + const char *tok = nullptr; int cs; hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh index 426b1375876..a6ab0bbde67 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh @@ -34,274 +34,274 @@ #line 36 "hb-buffer-deserialize-text.hh" static const unsigned char _deserialize_text_trans_keys[] = { - 0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, - 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, - 9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, + 0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, + 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, + 9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 0 }; static const char _deserialize_text_key_spans[] = { - 0, 114, 13, 10, 13, 10, 10, 13, - 10, 1, 13, 10, 14, 116, 116, 0, - 114, 116, 116, 116, 116, 116, 116, 116, + 0, 114, 13, 10, 13, 10, 10, 13, + 10, 1, 13, 10, 14, 116, 116, 0, + 114, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116 }; static const short _deserialize_text_index_offsets[] = { - 0, 0, 115, 129, 140, 154, 165, 176, - 190, 201, 203, 217, 228, 243, 360, 477, - 478, 593, 710, 827, 944, 1061, 1178, 1295, + 0, 0, 115, 129, 140, 154, 165, 176, + 190, 201, 203, 217, 228, 243, 360, 477, + 478, 593, 710, 827, 944, 1061, 1178, 1295, 1412, 1529, 1646 }; static const char _deserialize_text_indicies[] = { - 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 1, - 1, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 1, 1, 1, 1, 1, - 1, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 1, 5, 1, 1, 6, - 7, 7, 7, 7, 7, 7, 7, 7, - 7, 1, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 1, 10, 1, 1, - 11, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 1, 13, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 1, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 1, 17, 1, 1, 18, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 1, 20, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 1, 22, 1, 23, 1, 1, 24, - 25, 25, 25, 25, 25, 25, 25, 25, - 25, 1, 26, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 1, 22, 1, 1, - 1, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 1, 28, 28, 28, 28, - 28, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 28, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 29, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 30, 1, 1, 31, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 32, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 33, - 1, 34, 34, 34, 34, 34, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 34, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 35, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 36, 1, 1, 0, - 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 1, 1, 1, 1, 1, 1, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, - 4, 1, 28, 28, 28, 28, 28, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 28, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 29, 1, 1, 1, - 1, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 1, 1, 1, 30, 1, - 1, 31, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 32, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 33, 1, 38, - 38, 38, 38, 38, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 38, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 39, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 40, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 41, 1, 42, 42, 42, 42, - 42, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 42, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 43, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 44, - 1, 42, 42, 42, 42, 42, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 42, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 43, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 44, 1, 38, 38, - 38, 38, 38, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 38, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 39, 1, 1, 1, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 40, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 41, 1, 45, 45, 45, 45, 45, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 45, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 46, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 47, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 48, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 49, 1, - 50, 50, 50, 50, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 50, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 51, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 52, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 53, 1, 50, 50, 50, - 50, 50, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 50, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 51, - 1, 1, 1, 1, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 52, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 53, 1, 45, 45, 45, 45, 45, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 45, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 46, 1, 1, 1, - 1, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 1, 1, 1, 1, 1, - 1, 47, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 48, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 49, 1, 28, - 28, 28, 28, 28, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 28, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 29, 1, 55, 55, 1, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 1, 1, 1, 30, 1, 1, 31, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 1, 1, 32, 1, 55, 1, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 1, 1, 1, 1, + 1, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 1, 5, 1, 1, 6, + 7, 7, 7, 7, 7, 7, 7, 7, + 7, 1, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 1, 10, 1, 1, + 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 1, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 1, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 1, 17, 1, 1, 18, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 1, 20, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 1, 22, 1, 23, 1, 1, 24, + 25, 25, 25, 25, 25, 25, 25, 25, + 25, 1, 26, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 1, 22, 1, 1, + 1, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 1, 28, 28, 28, 28, + 28, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 28, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 29, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 30, 1, 1, 31, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 32, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 33, + 1, 34, 34, 34, 34, 34, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 34, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 35, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 36, 1, 1, 0, + 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 1, 1, 1, 1, 1, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 1, 28, 28, 28, 28, 28, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 28, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 29, 1, 1, 1, + 1, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 1, 1, 1, 30, 1, + 1, 31, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 32, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 33, 1, 38, + 38, 38, 38, 38, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 38, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 39, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 40, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 41, 1, 42, 42, 42, 42, + 42, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 42, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 43, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 44, + 1, 42, 42, 42, 42, 42, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 42, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 43, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 44, 1, 38, 38, + 38, 38, 38, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 38, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 39, 1, 1, 1, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 40, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 41, 1, 45, 45, 45, 45, 45, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 45, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 46, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 47, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 48, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 49, 1, + 50, 50, 50, 50, 50, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 50, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 51, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 52, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 53, 1, 50, 50, 50, + 50, 50, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 50, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 51, + 1, 1, 1, 1, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 52, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 53, 1, 45, 45, 45, 45, 45, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 45, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 46, 1, 1, 1, + 1, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 1, 1, 1, 1, 1, + 1, 47, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 48, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 49, 1, 28, + 28, 28, 28, 28, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 28, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 29, 1, 55, 55, 1, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 1, 1, 1, 30, 1, 1, 31, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 1, 1, 32, 1, 55, 1, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 1, 33, 1, 0 }; static const char _deserialize_text_trans_targs[] = { - 1, 0, 13, 17, 26, 3, 18, 21, - 18, 21, 5, 19, 20, 19, 20, 22, - 25, 8, 9, 12, 9, 12, 10, 11, - 23, 24, 23, 24, 14, 2, 6, 7, - 15, 16, 14, 15, 16, 17, 14, 4, - 15, 16, 14, 15, 16, 14, 2, 7, + 1, 0, 13, 17, 26, 3, 18, 21, + 18, 21, 5, 19, 20, 19, 20, 22, + 25, 8, 9, 12, 9, 12, 10, 11, + 23, 24, 23, 24, 14, 2, 6, 7, + 15, 16, 14, 15, 16, 17, 14, 4, + 15, 16, 14, 15, 16, 14, 2, 7, 15, 16, 14, 2, 15, 16, 25, 26 }; static const char _deserialize_text_trans_actions[] = { - 0, 0, 1, 1, 1, 2, 2, 2, - 0, 0, 2, 2, 2, 0, 0, 2, - 2, 2, 2, 2, 0, 0, 3, 2, - 2, 2, 0, 0, 4, 5, 5, 5, - 4, 4, 0, 0, 0, 0, 6, 7, - 6, 6, 8, 8, 8, 9, 10, 10, + 0, 0, 1, 1, 1, 2, 2, 2, + 0, 0, 2, 2, 2, 0, 0, 2, + 2, 2, 2, 2, 0, 0, 3, 2, + 2, 2, 0, 0, 4, 5, 5, 5, + 4, 4, 0, 0, 0, 0, 6, 7, + 6, 6, 8, 8, 8, 9, 10, 10, 9, 9, 11, 12, 11, 11, 0, 0 }; static const char _deserialize_text_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, - 0, 4, 6, 8, 8, 6, 9, 11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 4, 6, 8, 8, 6, 9, 11, 11, 9, 4 }; @@ -338,7 +338,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer, int cs; hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; - + #line 343 "hb-buffer-deserialize-text.hh" { cs = deserialize_text_start; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl index 8a682f7378a..fd9be42df14 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl @@ -100,7 +100,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer, const char *p = buf, *pe = buf + buf_len; /* Ensure we have positions. */ - (void) hb_buffer_get_glyph_positions (buffer, NULL); + (void) hb_buffer_get_glyph_positions (buffer, nullptr); while (p < pe && ISSPACE (*p)) p++; @@ -109,7 +109,7 @@ _hb_buffer_deserialize_glyphs_text (hb_buffer_t *buffer, *end_ptr = ++p; } - const char *eof = pe, *tok = NULL; + const char *eof = pe, *tok = nullptr; int cs; hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh index 9148ef31b65..af4767f5114 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh @@ -93,7 +93,7 @@ struct hb_buffer_t { hb_buffer_flags_t flags; /* BOT / EOT / etc. */ hb_buffer_cluster_level_t cluster_level; hb_codepoint_t replacement; /* U+FFFD or something else. */ - hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */ + hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */ unsigned int max_len; /* Maximum allowed len. */ int max_ops; /* Maximum allowed operations. */ @@ -344,8 +344,7 @@ struct hb_buffer_t { inline void unsafe_to_break_all (void) { - for (unsigned int i = 0; i < len; i++) - info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + unsafe_to_break_impl (0, len); } inline void safe_to_break_all (void) 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 7ead43b0184..dc0639f4f29 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc @@ -1933,7 +1933,7 @@ hb_buffer_diff (hb_buffer_t *buffer, result |= HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH; if (buf_info->cluster != ref_info->cluster) result |= HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH; - if ((buf_info->mask & HB_GLYPH_FLAG_DEFINED) != (ref_info->mask & HB_GLYPH_FLAG_DEFINED)) + if ((buf_info->mask & ~ref_info->mask & HB_GLYPH_FLAG_DEFINED)) result |= HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH; if (contains && ref_info->codepoint == dottedcircle_glyph) result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h index b2801ddf546..8a2d3e8690f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h @@ -71,6 +71,24 @@ typedef struct hb_glyph_info_t { hb_var_int_t var2; } hb_glyph_info_t; +/** + * hb_glyph_flags_t: + * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the + * beginning of the cluster this glyph is part of, + * then both sides need to be re-shaped, as the + * result might be different. On the flip side, + * it means that when this flag is not present, + * then it's safe to break the glyph-run at the + * beginning of this cluster, and the two sides + * represent the exact same result one would get + * if breaking input text at the beginning of + * this cluster and shaping the two sides + * separately. This can be used to optimize + * paragraph layout, by avoiding re-shaping + * of each line after line-breaking, or limiting + * the reshaping to a small piece around the + * breaking point only. + */ typedef enum { /*< flags >*/ HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001, 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 1d0e7264234..d1fcf799aac 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc @@ -879,7 +879,7 @@ parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *fea parse_bool (pp, end, &feature->value); /* CSS doesn't use equal-sign between tag and value. * If there was an equal-sign, then there *must* be a value. - * A value without an eqaul-sign is ok, but not required. */ + * A value without an equal-sign is ok, but not required. */ return !had_equal || had_value; } 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 44020176939..aba7cf44d3f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc @@ -74,7 +74,10 @@ reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) const char *data = reinterpret_cast<const char*> (CFDataGetBytePtr (cf_data)); const size_t length = CFDataGetLength (cf_data); if (!data || !length) + { + CFRelease (cf_data); return nullptr; + } return hb_blob_create (data, length, HB_MEMORY_MODE_READONLY, reinterpret_cast<void *> (const_cast<__CFData *> (cf_data)), @@ -311,7 +314,7 @@ _hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data) hb_font_t * hb_coretext_font_create (CTFontRef ct_font) { - CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, 0); + CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, nullptr); hb_face_t *face = hb_coretext_face_create (cg_font); CFRelease (cg_font); hb_font_t *font = hb_font_create (face); @@ -877,7 +880,10 @@ resize_and_retry: kCFStringEncodingUTF8, kCFAllocatorNull); if (unlikely (!lang)) + { + CFRelease (attr_string); FAIL ("CFStringCreateWithCStringNoCopy failed"); + } CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len), kCTLanguageAttributeName, lang); CFRelease (lang); @@ -946,7 +952,10 @@ resize_and_retry: &kCFTypeDictionaryValueCallBacks); CFRelease (level_number); if (unlikely (!options)) + { + CFRelease (attr_string); FAIL ("CFDictionaryCreate failed"); + } CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedStringAndOptions (attr_string, options); CFRelease (options); @@ -1036,7 +1045,7 @@ resize_and_retry: } if (!matched) { - CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0); + CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, nullptr); if (run_cg_font) { matched = CFEqual (run_cg_font, cg_font); @@ -1209,7 +1218,7 @@ resize_and_retry: } /* Mac OS 10.6 doesn't have kCTTypesetterOptionForcedEmbeddingLevel, - * or if it does, it doesn't resepct it. So we get runs with wrong + * or if it does, it doesn't respect it. So we get runs with wrong * directions. As such, disable the assert... It wouldn't crash, but * cursoring will be off... * @@ -1235,8 +1244,6 @@ resize_and_retry: pos->x_offset = info->var1.i32; pos->y_offset = info->var2.i32; - info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK; - info++, pos++; } else @@ -1246,8 +1253,6 @@ resize_and_retry: pos->x_offset = info->var1.i32; pos->y_offset = info->var2.i32; - info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK; - info++, pos++; } 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 6c425f7b9dd..c244347b348 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh @@ -396,6 +396,18 @@ struct hb_no_trace_t { #define TRACE_SERIALIZE(this) hb_no_trace_t<bool> trace #endif +#ifndef HB_DEBUG_SUBSET +#define HB_DEBUG_SUBSET (HB_DEBUG+0) +#endif +#if HB_DEBUG_SUBSET +#define TRACE_SUBSET(this) \ + hb_auto_trace_t<HB_DEBUG_SUBSET, bool> trace \ + (&c->debug_depth, c->get_name (), this, HB_FUNC, \ + " "); +#else +#define TRACE_SUBSET(this) hb_no_trace_t<bool> trace +#endif + #ifndef HB_DEBUG_WOULD_APPLY #define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0) #endif @@ -415,6 +427,7 @@ struct hb_no_trace_t { HB_DEBUG_COLLECT_GLYPHS + \ HB_DEBUG_SANITIZE + \ HB_DEBUG_SERIALIZE + \ + HB_DEBUG_SUBSET + \ HB_DEBUG_WOULD_APPLY + \ 0) #endif 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 0674ef9bcfc..69a8aa2081b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc @@ -370,7 +370,7 @@ public: { if (textPosition == 0 || textPosition > mTextLength) { // Either there is no text before here (== 0), or this - // is an invalid position. The query is considered valid thouh. + // is an invalid position. The query is considered valid though. *textString = nullptr; *textLength = 0; } @@ -878,8 +878,6 @@ retry_getglyphs: pos->x_offset = x_mult * (isRightToLeft ? -info->var1.i32 : info->var1.i32); pos->y_offset = y_mult * info->var2.i32; - - info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } if (isRightToLeft) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h index 9842d52b650..0ce8d0462d5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h @@ -71,7 +71,6 @@ hb_face_set_user_data (hb_face_t *face, hb_destroy_func_t destroy, hb_bool_t replace); - HB_EXTERN void * hb_face_get_user_data (hb_face_t *face, hb_user_data_key_t *key); 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 1c526cf37dc..fc4b11220a9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc @@ -58,7 +58,7 @@ * * - In the future, we should add constructors to create fonts in font space? * - * - FT_Load_Glyph() is exteremely costly. Do something about it? + * - FT_Load_Glyph() is extremely costly. Do something about it? */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl index e28510c2284..606727cd32d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl @@ -42,7 +42,8 @@ HB_BEGIN_DECLS /*** END file-header ***/ /*** BEGIN value-header ***/ -HB_EXTERN GType @enum_name@_get_type (void) G_GNUC_CONST; +HB_EXTERN GType +@enum_name@_get_type (void) G_GNUC_CONST; #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) /*** END value-header ***/ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h index 1c303219b7c..302dc9584e9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h @@ -45,7 +45,8 @@ HB_BEGIN_DECLS * * Since: 0.9.2 **/ -HB_EXTERN GType hb_gobject_blob_get_type (void); +HB_EXTERN GType +hb_gobject_blob_get_type (void); #define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ()) /** @@ -53,7 +54,8 @@ HB_EXTERN GType hb_gobject_blob_get_type (void); * * Since: 0.9.2 **/ -HB_EXTERN GType hb_gobject_buffer_get_type (void); +HB_EXTERN GType +hb_gobject_buffer_get_type (void); #define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ()) /** @@ -61,7 +63,8 @@ HB_EXTERN GType hb_gobject_buffer_get_type (void); * * Since: 0.9.2 **/ -HB_EXTERN GType hb_gobject_face_get_type (void); +HB_EXTERN GType +hb_gobject_face_get_type (void); #define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ()) /** @@ -69,7 +72,8 @@ HB_EXTERN GType hb_gobject_face_get_type (void); * * Since: 0.9.2 **/ -HB_EXTERN GType hb_gobject_font_get_type (void); +HB_EXTERN GType +hb_gobject_font_get_type (void); #define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ()) /** @@ -77,13 +81,16 @@ HB_EXTERN GType hb_gobject_font_get_type (void); * * Since: 0.9.2 **/ -HB_EXTERN GType hb_gobject_font_funcs_get_type (void); +HB_EXTERN GType +hb_gobject_font_funcs_get_type (void); #define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ()) -HB_EXTERN GType hb_gobject_set_get_type (void); +HB_EXTERN GType +hb_gobject_set_get_type (void); #define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ()) -HB_EXTERN GType hb_gobject_shape_plan_get_type (void); +HB_EXTERN GType +hb_gobject_shape_plan_get_type (void); #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ()) /** @@ -91,26 +98,40 @@ HB_EXTERN GType hb_gobject_shape_plan_get_type (void); * * Since: 0.9.2 **/ -HB_EXTERN GType hb_gobject_unicode_funcs_get_type (void); +HB_EXTERN GType +hb_gobject_unicode_funcs_get_type (void); #define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ()) /* Value types */ -HB_EXTERN GType hb_gobject_feature_get_type (void); +HB_EXTERN GType +hb_gobject_feature_get_type (void); #define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ()) -HB_EXTERN GType hb_gobject_glyph_info_get_type (void); +HB_EXTERN GType +hb_gobject_glyph_info_get_type (void); #define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ()) -HB_EXTERN GType hb_gobject_glyph_position_get_type (void); +HB_EXTERN GType +hb_gobject_glyph_position_get_type (void); #define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ()) -HB_EXTERN GType hb_gobject_segment_properties_get_type (void); +HB_EXTERN GType +hb_gobject_segment_properties_get_type (void); #define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ()) -HB_EXTERN GType hb_gobject_user_data_key_get_type (void); +HB_EXTERN GType +hb_gobject_user_data_key_get_type (void); #define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ()) +HB_EXTERN GType +hb_gobject_ot_math_glyph_variant_get_type (void); +#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT (hb_gobject_ot_math_glyph_variant_get_type ()) + +HB_EXTERN GType +hb_gobject_ot_math_glyph_part_get_type (void); +#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART (hb_gobject_ot_math_glyph_part_get_type ()) + HB_END_DECLS 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 62aaae9e87c..46fe1399913 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc @@ -80,7 +80,7 @@ static const void *hb_graphite2_get_table (const void *data, unsigned int tag, s p->tag = tag; /* TODO Not thread-safe, but fairly harmless. - * We can do the double-chcked pointer cmpexch thing here. */ + * We can do the double-checked pointer cmpexch thing here. */ p->next = face_data->tlist; face_data->tlist = p; } @@ -360,7 +360,6 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan, hb_glyph_info_t *info = &buffer->info[clusters[i].base_glyph + j]; info->codepoint = gids[clusters[i].base_glyph + j]; info->cluster = clusters[i].cluster; - info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK; info->var1.i32 = clusters[i].advance; // all glyphs in the cluster get the same advance } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh index 1e5676e8262..e2644eaf91e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh @@ -30,6 +30,7 @@ #define HB_OPEN_FILE_PRIVATE_HH #include "hb-open-type-private.hh" +#include "hb-ot-head-table.hh" namespace OT { @@ -54,7 +55,14 @@ struct TTCHeader; typedef struct TableRecord { int cmp (Tag t) const - { return t.cmp (tag); } + { return -t.cmp (tag); } + + static int cmp (const void *pa, const void *pb) + { + const TableRecord *a = (const TableRecord *) pa; + const TableRecord *b = (const TableRecord *) pb; + return b->cmp (a->tag); + } inline bool sanitize (hb_sanitize_context_t *c) const { @@ -64,9 +72,9 @@ typedef struct TableRecord Tag tag; /* 4-byte identifier. */ CheckSum checkSum; /* CheckSum for this table. */ - HBUINT32 offset; /* Offset from beginning of TrueType font + Offset32 offset; /* Offset from beginning of TrueType font * file. */ - HBUINT32 length; /* Length of this table. */ + HBUINT32 length; /* Length of this table. */ public: DEFINE_SIZE_STATIC (16); } OpenTypeTable; @@ -81,7 +89,7 @@ typedef struct OffsetTable { return tables[i]; } - inline unsigned int get_table_tags (unsigned int start_offset, + inline unsigned int get_table_tags (unsigned int start_offset, unsigned int *table_count, /* IN/OUT */ hb_tag_t *table_tags /* OUT */) const { @@ -118,6 +126,78 @@ typedef struct OffsetTable } public: + + inline bool serialize (hb_serialize_context_t *c, + hb_tag_t sfnt_tag, + Supplier<hb_tag_t> &tags, + Supplier<hb_blob_t *> &blobs, + unsigned int table_count) + { + TRACE_SERIALIZE (this); + /* Alloc 12 for the OTHeader. */ + if (unlikely (!c->extend_min (*this))) return_trace (false); + /* Write sfntVersion (bytes 0..3). */ + sfnt_version.set (sfnt_tag); + /* Take space for numTables, searchRange, entrySelector, RangeShift + * and the TableRecords themselves. */ + if (unlikely (!tables.serialize (c, table_count))) return_trace (false); + + const char *dir_end = (const char *) c->head; + HBUINT32 *checksum_adjustment = nullptr; + + /* Write OffsetTables, alloc for and write actual table blobs. */ + for (unsigned int i = 0; i < table_count; i++) + { + TableRecord &rec = tables.array[i]; + hb_blob_t *blob = blobs[i]; + rec.tag.set (tags[i]); + rec.length.set (hb_blob_get_length (blob)); + rec.offset.serialize (c, this); + + /* Allocate room for the table and copy it. */ + char *start = (char *) c->allocate_size<void> (rec.length); + if (unlikely (!start)) {return false;} + + memcpy (start, hb_blob_get_data (blob, nullptr), rec.length); + + /* 4-byte allignment. */ + if (rec.length % 4) + c->allocate_size<void> (4 - rec.length % 4); + const char *end = (const char *) c->head; + + if (tags[i] == HB_OT_TAG_head && end - start >= head::static_size) + { + head *h = (head *) start; + checksum_adjustment = &h->checkSumAdjustment; + checksum_adjustment->set (0); + } + + rec.checkSum.set_for_data (start, end - start); + } + tags += table_count; + blobs += table_count; + + tables.qsort (); + + if (checksum_adjustment) + { + CheckSum checksum; + + /* The following line is a slower version of the following block. */ + //checksum.set_for_data (this, (const char *) c->head - (const char *) this); + checksum.set_for_data (this, dir_end - (const char *) this); + for (unsigned int i = 0; i < table_count; i++) + { + TableRecord &rec = tables.array[i]; + checksum.set (checksum + rec.checkSum); + } + + checksum_adjustment->set (0xB1B0AFBAu - checksum); + } + + return_trace (true); + } + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -249,6 +329,18 @@ struct OpenTypeFontFile } } + inline bool serialize_single (hb_serialize_context_t *c, + hb_tag_t sfnt_tag, + Supplier<hb_tag_t> &tags, + Supplier<hb_blob_t *> &blobs, + unsigned int table_count) + { + TRACE_SERIALIZE (this); + assert (sfnt_tag != TTCTag); + if (unlikely (!c->extend_min (*this))) return_trace (false); + return_trace (u.fontFace.serialize (c, sfnt_tag, tags, blobs, table_count)); + } + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh index 04e4a4e1ba9..5d33199e128 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh @@ -134,7 +134,17 @@ static inline Type& StructAfter(TObject &X) #define HB_NULL_POOL_SIZE 264 static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE."); -extern HB_INTERNAL const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]; + +#ifdef HB_NO_VISIBILITY +static +#else +extern HB_INTERNAL +#endif +const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] +#ifdef HB_NO_VISIBILITY += {} +#endif +; /* Generic nul-content Null objects. */ template <typename Type> @@ -179,6 +189,12 @@ struct hb_dispatch_context_t #ifndef HB_SANITIZE_MAX_EDITS #define HB_SANITIZE_MAX_EDITS 32 #endif +#ifndef HB_SANITIZE_MAX_OPS_FACTOR +#define HB_SANITIZE_MAX_OPS_FACTOR 8 +#endif +#ifndef HB_SANITIZE_MAX_OPS_MIN +#define HB_SANITIZE_MAX_OPS_MIN 16384 +#endif struct hb_sanitize_context_t : hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE> @@ -186,7 +202,7 @@ struct hb_sanitize_context_t : inline hb_sanitize_context_t (void) : debug_depth (0), start (nullptr), end (nullptr), - writable (false), edit_count (0), + writable (false), edit_count (0), max_ops (0), blob (nullptr), num_glyphs (0) {} @@ -211,6 +227,8 @@ struct hb_sanitize_context_t : this->start = hb_blob_get_data (this->blob, nullptr); this->end = this->start + hb_blob_get_length (this->blob); assert (this->start <= this->end); /* Must not overflow. */ + this->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; @@ -234,7 +252,10 @@ struct hb_sanitize_context_t : inline bool check_range (const void *base, unsigned int len) const { const char *p = (const char *) base; - bool ok = this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len; + bool ok = this->max_ops-- > 0 && + this->start <= p && + p <= this->end && + (unsigned int) (this->end - p) >= len; DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s", @@ -298,6 +319,7 @@ struct hb_sanitize_context_t : const char *start, *end; bool writable; unsigned int edit_count; + mutable int max_ops; hb_blob_t *blob; unsigned int num_glyphs; }; @@ -499,23 +521,25 @@ struct hb_serialize_context_t template <typename Type> struct Supplier { - inline Supplier (const Type *array, unsigned int len_) + inline Supplier (const Type *array, unsigned int len_, unsigned int stride_=sizeof(Type)) { head = array; len = len_; + stride = stride_; } inline const Type operator [] (unsigned int i) const { if (unlikely (i >= len)) return Type (); - return head[i]; + return * (const Type *) (const void *) ((const char *) head + stride * i); } - inline void advance (unsigned int count) + inline Supplier<Type> & operator += (unsigned int count) { if (unlikely (count > len)) count = len; len -= count; - head += count; + head = (const Type *) (const void *) ((const char *) head + stride * count); + return *this; } private: @@ -523,6 +547,7 @@ struct Supplier inline Supplier<Type>& operator= (const Supplier<Type> &); /* Disallow copy */ unsigned int len; + unsigned int stride; const Type *head; }; @@ -667,8 +692,8 @@ struct F2DOT14 : HBINT16 /* 32-bit signed fixed-point number (16.16). */ struct Fixed: HBINT32 { - //inline float to_float (void) const { return ???; } - //inline void set_float (float f) { v.set (f * ???); } + inline float to_float (void) const { return ((int32_t) v) / 65536.0; } + inline void set_float (float f) { v.set (round (f * 65536.0)); } public: DEFINE_SIZE_STATIC (4); }; @@ -715,6 +740,14 @@ template <typename Type> struct Offset : Type { inline bool is_null (void) const { return 0 == *this; } + + inline void *serialize (hb_serialize_context_t *c, const void *base) + { + void *t = c->start_embed<void> (); + this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */ + return t; + } + public: DEFINE_SIZE_STATIC (sizeof(Type)); }; @@ -730,7 +763,8 @@ struct CheckSum : HBUINT32 static inline uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length) { uint32_t Sum = 0L; - const HBUINT32 *EndPtr = Table+((Length+3) & ~3) / HBUINT32::static_size; + assert (0 == (Length & 3)); + const HBUINT32 *EndPtr = Table + Length / HBUINT32::static_size; while (Table < EndPtr) Sum += *Table++; @@ -786,9 +820,7 @@ struct OffsetTo : Offset<OffsetType> inline Type& serialize (hb_serialize_context_t *c, const void *base) { - Type *t = c->start_embed<Type> (); - this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */ - return *t; + return * (Type *) Offset<OffsetType>::serialize (c, base); } inline bool sanitize (hb_sanitize_context_t *c, const void *base) const @@ -876,7 +908,7 @@ struct ArrayOf if (unlikely (!serialize (c, items_len))) return_trace (false); for (unsigned int i = 0; i < items_len; i++) array[i] = items[i]; - items.advance (items_len); + items += items_len; return_trace (true); } @@ -928,6 +960,11 @@ struct ArrayOf return -1; } + inline void qsort (void) + { + ::qsort (array, len, sizeof (Type), Type::cmp); + } + private: inline bool sanitize_shallow (hb_sanitize_context_t *c) const { @@ -994,7 +1031,7 @@ struct HeadlessArrayOf if (unlikely (!c->extend (*this))) return_trace (false); for (unsigned int i = 0; i < items_len - 1; i++) array[i] = items[i]; - items.advance (items_len - 1); + items += items_len - 1; return_trace (true); } @@ -1072,6 +1109,17 @@ struct BinSearchHeader return_trace (c->check_struct (this)); } + inline void set (unsigned int v) + { + len.set (v); + assert (len == v); + entrySelectorZ.set (MAX (1u, _hb_bit_storage (v)) - 1); + searchRangeZ.set (16 * (1u << entrySelectorZ)); + rangeShiftZ.set (v * 16 > searchRangeZ + ? 16 * v - searchRangeZ + : 0); + } + protected: HBUINT16 len; HBUINT16 searchRangeZ; 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 b9d6e248ae9..02079898683 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 @@ -28,7 +28,7 @@ #define HB_OT_CMAP_TABLE_HH #include "hb-open-type-private.hh" - +#include "hb-subset-plan.hh" namespace OT { @@ -61,7 +61,7 @@ struct CmapSubtableFormat0 HBUINT16 format; /* Format number is set to 0. */ HBUINT16 lengthZ; /* Byte length of this subtable. */ HBUINT16 languageZ; /* Ignore. */ - HBUINT8 glyphIdArray[256];/* An array that maps character + HBUINT8 glyphIdArray[256];/* An array that maps character * code to glyph index values. */ public: DEFINE_SIZE_STATIC (6 + 256); @@ -193,6 +193,7 @@ struct CmapSubtableLongGroup { friend struct CmapSubtableFormat12; friend struct CmapSubtableFormat13; + friend struct cmap; int cmp (hb_codepoint_t codepoint) const { @@ -253,6 +254,8 @@ struct CmapSubtableFormat10 : CmapSubtableTrimmed<HBUINT32 > {}; template <typename T> struct CmapSubtableLongSegmented { + friend struct cmap; + inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const { int i = groups.bsearch (codepoint); @@ -268,6 +271,16 @@ struct CmapSubtableLongSegmented return_trace (c->check_struct (this) && groups.sanitize (c)); } + inline bool serialize (hb_serialize_context_t *c, + hb_prealloced_array_t<CmapSubtableLongGroup> &group_data) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (*this))) return_trace (false); + Supplier<CmapSubtableLongGroup> supplier (group_data.array, group_data.len); + if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false); + return true; + } + protected: HBUINT16 format; /* Subtable format; set to 12. */ HBUINT16 reservedZ; /* Reserved; set to 0. */ @@ -422,12 +435,12 @@ struct CmapSubtable hb_codepoint_t *glyph) const { switch (u.format) { - case 0: return u.format0 .get_glyph(codepoint, glyph); - case 4: return u.format4 .get_glyph(codepoint, glyph); - case 6: return u.format6 .get_glyph(codepoint, glyph); - case 10: return u.format10.get_glyph(codepoint, glyph); - case 12: return u.format12.get_glyph(codepoint, glyph); - case 13: return u.format13.get_glyph(codepoint, glyph); + case 0: return u.format0 .get_glyph (codepoint, glyph); + case 4: return u.format4 .get_glyph (codepoint, glyph); + case 6: return u.format6 .get_glyph (codepoint, glyph); + case 10: return u.format10.get_glyph (codepoint, glyph); + case 12: return u.format12.get_glyph (codepoint, glyph); + case 13: return u.format13.get_glyph (codepoint, glyph); case 14: default: return false; } @@ -504,6 +517,114 @@ struct cmap encodingRecord.sanitize (c, this)); } + inline bool populate_groups (hb_subset_plan_t *plan, + hb_prealloced_array_t<CmapSubtableLongGroup> *groups) const + { + CmapSubtableLongGroup *group = nullptr; + for (unsigned int i = 0; i < plan->codepoints.len; i++) { + + hb_codepoint_t cp = plan->codepoints[i]; + if (!group || cp - 1 != group->endCharCode) + { + group = groups->push (); + group->startCharCode.set (cp); + group->endCharCode.set (cp); + hb_codepoint_t new_gid; + if (unlikely (!hb_subset_plan_new_gid_for_codepoint (plan, cp, &new_gid))) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp); + return false; + } + group->glyphID.set (new_gid); + } else + { + group->endCharCode.set (cp); + } + } + + DEBUG_MSG(SUBSET, nullptr, "cmap"); + for (unsigned int i = 0; i < groups->len; i++) { + CmapSubtableLongGroup& group = (*groups)[i]; + DEBUG_MSG(SUBSET, nullptr, " %d: U+%04X-U+%04X, gid %d-%d", i, (uint32_t) group.startCharCode, (uint32_t) group.endCharCode, (uint32_t) group.glyphID, (uint32_t) group.glyphID + ((uint32_t) group.endCharCode - (uint32_t) group.startCharCode)); + } + + return true; + } + + inline bool _subset (hb_prealloced_array_t<CmapSubtableLongGroup> &groups, + size_t dest_sz, + void *dest) const + { + hb_serialize_context_t c (dest, dest_sz); + + OT::cmap *cmap = c.start_serialize<OT::cmap> (); + if (unlikely (!c.extend_min (*cmap))) + { + return false; + } + + cmap->version.set (0); + + if (unlikely (!cmap->encodingRecord.serialize (&c, /* numTables */ 1))) return false; + + EncodingRecord &rec = cmap->encodingRecord[0]; + rec.platformID.set (3); // Windows + rec.encodingID.set (10); // Unicode UCS-4 + + /* capture offset to subtable */ + CmapSubtable &subtable = rec.subtable.serialize (&c, cmap); + + subtable.u.format.set (12); + + CmapSubtableFormat12 &format12 = subtable.u.format12; + if (unlikely (!c.extend_min (format12))) return false; + + format12.format.set (12); + format12.reservedZ.set (0); + format12.lengthZ.set (16 + 12 * groups.len); + + if (unlikely (!format12.serialize (&c, groups))) return false; + + c.end_serialize (); + + return true; + } + + inline bool subset (hb_subset_plan_t *plan) const + { + hb_auto_array_t<CmapSubtableLongGroup> groups; + + if (unlikely (!populate_groups (plan, &groups))) return false; + + // We now know how big our blob needs to be + // TODO use APIs from the structs to get size? + size_t dest_sz = 4 // header + + 8 // 1 EncodingRecord + + 16 // Format 12 header + + 12 * groups.len; // SequentialMapGroup records + void *dest = malloc (dest_sz); + if (unlikely (!dest)) { + DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for cmap subset output", (unsigned long) dest_sz); + return false; + } + + if (unlikely (!_subset (groups, dest_sz, dest))) + { + free (dest); + return false; + } + + // all done, write the blob into dest + hb_blob_t *cmap_prime = hb_blob_create ((const char *)dest, + dest_sz, + HB_MEMORY_MODE_READONLY, + dest, + free); + bool result = hb_subset_plan_add_table (plan, HB_OT_TAG_cmap, cmap_prime); + hb_blob_destroy (cmap_prime); + return result; + } + struct accelerator_t { inline void init (hb_face_t *face) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh index 6c2b9a88ee1..e7ab917e06e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh @@ -24,8 +24,8 @@ * Google Author(s): Seigo Nonaka */ -#ifndef HB_OT_CBDT_TABLE_HH -#define HB_OT_CBDT_TABLE_HH +#ifndef HB_OT_COLOR_CBDT_TABLE_HH +#define HB_OT_COLOR_CBDT_TABLE_HH #include "hb-open-type-private.hh" @@ -377,7 +377,7 @@ struct CBDT { inline void init (hb_face_t *face) { - upem = face->get_upem(); + upem = hb_face_get_upem (face); cblc_blob = Sanitizer<CBLC>().sanitize (face->reference_table (HB_OT_TAG_CBLC)); cbdt_blob = Sanitizer<CBDT>().sanitize (face->reference_table (HB_OT_TAG_CBDT)); @@ -468,4 +468,4 @@ struct CBDT } /* namespace OT */ -#endif /* HB_OT_CBDT_TABLE_HH */ +#endif /* HB_OT_COLOR_CBDT_TABLE_HH */ 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 new file mode 100644 index 00000000000..2c3b1cccae9 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh @@ -0,0 +1,142 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_OT_COLOR_COLR_TABLE_HH +#define HB_OT_COLOR_COLR_TABLE_HH + +#include "hb-open-type-private.hh" + +/* + * Color Palette + * http://www.microsoft.com/typography/otspec/colr.htm + */ + +#define HB_OT_TAG_COLR HB_TAG('C','O','L','R') + +namespace OT { + + +struct LayerRecord +{ + friend struct COLR; + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + GlyphID gID; /* Glyph ID of layer glyph */ + HBUINT16 paletteIndex; /* Index value to use with a selected color palette */ + public: + DEFINE_SIZE_STATIC (4); +}; + +struct BaseGlyphRecord +{ + friend struct COLR; + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + GlyphID gID; /* Glyph ID of reference glyph */ + HBUINT16 firstLayerIndex; /* Index to the layer record */ + HBUINT16 numLayers; /* Number of color layers associated with this glyph */ + public: + DEFINE_SIZE_STATIC (6); +}; + +struct COLR +{ + static const hb_tag_t tableTag = HB_OT_TAG_COLR; + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!(c->check_struct (this) && + c->check_array ((const void*) &layerRecordsOffsetZ, sizeof (LayerRecord), numLayerRecords) && + c->check_array ((const void*) &baseGlyphRecordsZ, sizeof (BaseGlyphRecord), numBaseGlyphRecords))) + return_trace (false); + + const BaseGlyphRecord* base_glyph_records = &baseGlyphRecordsZ (this); + for (unsigned int i = 0; i < numBaseGlyphRecords; ++i) + if (base_glyph_records[i].firstLayerIndex + + base_glyph_records[i].numLayers > numLayerRecords) + return_trace (false); + + return_trace (true); + } + + inline bool get_base_glyph_record ( + hb_codepoint_t glyph_id, unsigned int &first_layer, unsigned int &num_layers) const + { + const BaseGlyphRecord* base_glyph_records = &baseGlyphRecordsZ (this); + unsigned int min = 0, max = numBaseGlyphRecords - 1; + while (min <= max) + { + unsigned int mid = (min + max) / 2; + hb_codepoint_t gID = base_glyph_records[mid].gID; + if (gID > glyph_id) + max = mid - 1; + else if (gID < glyph_id) + min = mid + 1; + else + { + first_layer = base_glyph_records[mid].firstLayerIndex; + num_layers = base_glyph_records[mid].numLayers; + return true; + } + } + return false; + } + + inline void get_layer_record (int layer, + hb_codepoint_t &glyph_id, unsigned int &palette_index) const + { + const LayerRecord* records = &layerRecordsOffsetZ (this); + glyph_id = records[layer].gID; + palette_index = records[layer].paletteIndex; + } + + protected: + HBUINT16 version; /* Table version number */ + HBUINT16 numBaseGlyphRecords; /* Number of Base Glyph Records */ + LOffsetTo<BaseGlyphRecord> + baseGlyphRecordsZ; /* Offset to Base Glyph records. */ + LOffsetTo<LayerRecord> + layerRecordsOffsetZ; /* Offset to Layer Records */ + HBUINT16 numLayerRecords; /* Number of Layer Records */ + public: + DEFINE_SIZE_STATIC (14); +}; + +} /* namespace OT */ + + +#endif /* HB_OT_COLOR_COLR_TABLE_HH */ diff --git a/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 new file mode 100644 index 00000000000..e364c8a44d3 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh @@ -0,0 +1,208 @@ +/* + * Copyright © 2016 Google, Inc. + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Sascha Brawer + */ + +#ifndef HB_OT_COLOR_CPAL_TABLE_HH +#define HB_OT_COLOR_CPAL_TABLE_HH + +#include "hb-open-type-private.hh" + + +/* + * Following parts to be moved to a public header. + */ + +/** + * hb_ot_color_t: + * ARGB data type for holding color values. + * + * Since: REPLACEME + */ +typedef uint32_t hb_ot_color_t; + + +/** + * hb_ot_color_palette_flags_t: + * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special to note about a color palette. + * @HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND: flag indicating that the color palette is suitable for rendering text on light background. + * @HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND: flag indicating that the color palette is suitable for rendering text on dark background. + * + * Since: REPLACEME + */ +typedef enum { /*< flags >*/ + HB_OT_COLOR_PALETTE_FLAG_DEFAULT = 0x00000000u, + HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND = 0x00000001u, + HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND = 0x00000002u, +} hb_ot_color_palette_flags_t; + +// HB_EXTERN unsigned int +// hb_ot_color_get_palette_count (hb_face_t *face); + +// HB_EXTERN unsigned int +// hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette); + +// HB_EXTERN hb_ot_color_palette_flags_t +// hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette); + +// HB_EXTERN unsigned int +// hb_ot_color_get_palette_colors (hb_face_t *face, +// unsigned int palette, /* default=0 */ +// unsigned int start_offset, +// unsigned int *color_count /* IN/OUT */, +// hb_ot_color_t *colors /* OUT */); + + + + + +/* + * Color Palette + * http://www.microsoft.com/typography/otspec/cpal.htm + */ + +#define HB_OT_TAG_CPAL HB_TAG('C','P','A','L') + +namespace OT { + + +struct CPALV1Tail +{ + friend struct CPAL; + + inline bool sanitize (hb_sanitize_context_t *c, unsigned int palettes) const + { + TRACE_SANITIZE (this); + return_trace ( + c->check_struct (this) && + c->check_array ((const void*) &paletteFlags, sizeof (HBUINT32), palettes) && + c->check_array ((const void*) &paletteLabel, sizeof (HBUINT16), palettes) && + c->check_array ((const void*) &paletteEntryLabel, sizeof (HBUINT16), palettes)); + } + + private: + inline hb_ot_color_palette_flags_t + get_palette_flags (const void *base, unsigned int palette) const + { + const HBUINT32* flags = &paletteFlags (base); + return (hb_ot_color_palette_flags_t) (uint32_t) flags[palette]; + } + + inline unsigned int + get_palette_name_id (const void *base, unsigned int palette) const + { + const HBUINT16* name_ids = &paletteLabel (base); + return name_ids[palette]; + } + + protected: + LOffsetTo<HBUINT32> paletteFlags; + LOffsetTo<HBUINT16> paletteLabel; + LOffsetTo<HBUINT16> paletteEntryLabel; + public: + DEFINE_SIZE_STATIC (12); +}; + +typedef HBUINT32 BGRAColor; + +struct CPAL +{ + static const hb_tag_t tableTag = HB_OT_TAG_CPAL; + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!(c->check_struct (this) && // This checks colorRecordIndicesX sanity also, see #get_size + c->check_array ((const void*) &colorRecordsZ, sizeof (BGRAColor), numColorRecords))) + return_trace (false); + + // Check for indices sanity so no need for doing it runtime + for (unsigned int i = 0; i < numPalettes; ++i) + if (colorRecordIndicesX[i] + numPaletteEntries > numColorRecords) + return_trace (false); + + // If version is zero, we are done here; otherwise we need to check tail also + if (version == 0) + return_trace (true); + + const CPALV1Tail &v1 = StructAfter<CPALV1Tail> (*this); + return_trace (v1.sanitize (c, numPalettes)); + } + + inline unsigned int get_size (void) const + { + return min_size + numPalettes * sizeof (HBUINT16); + } + + inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette) const + { + if (version == 0 || palette >= numPalettes) + return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; + + const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this); + return cpal1.get_palette_flags (this, palette); + } + + inline unsigned int get_palette_name_id (unsigned int palette) const + { + if (version == 0 || palette >= numPalettes) + return 0xFFFF; + + const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this); + return cpal1.get_palette_name_id (this, palette); + } + + inline unsigned int get_palette_count () const + { + return numPalettes; + } + + inline hb_ot_color_t get_color_record_argb (unsigned int color_index, unsigned int palette) const + { + if (color_index >= numPaletteEntries || palette >= numPalettes) + return 0; + + const BGRAColor* records = &colorRecordsZ(this); + // No need for more range check as it is already done on #sanitize + return records[colorRecordIndicesX[palette] + color_index]; + } + + protected: + HBUINT16 version; + /* Version 0 */ + HBUINT16 numPaletteEntries; + HBUINT16 numPalettes; + HBUINT16 numColorRecords; + LOffsetTo<HBUINT32> colorRecordsZ; + HBUINT16 colorRecordIndicesX[VAR]; // VAR=numPalettes +/*CPALV1Tail v1[VAR];*/ + public: + DEFINE_SIZE_ARRAY (12, colorRecordIndicesX); +}; + +} /* namespace OT */ + + +#endif /* HB_OT_COLOR_CPAL_TABLE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc new file mode 100644 index 00000000000..ceebe0b7a02 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc @@ -0,0 +1,183 @@ +/* + * Copyright © 2016 Google, Inc. + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Sascha Brawer + */ + +#include "hb-open-type-private.hh" +#include "hb-ot-color-colr-table.hh" +#include "hb-ot-color-cpal-table.hh" +#include "hb-ot.h" + +#include <stdlib.h> +#include <string.h> + +#include "hb-ot-layout-private.hh" +#include "hb-shaper-private.hh" + +#if 0 +HB_MARK_AS_FLAG_T (hb_ot_color_palette_flags_t) +//HB_SHAPER_DATA_ENSURE_DECLARE(ot, face) Hmm? + + +static inline const OT::COLR& +_get_colr (hb_face_t *face) +{ + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::COLR); + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + return *(layout->colr.get ()); +} + +static inline const OT::CPAL& +_get_cpal (hb_face_t *face) +{ + if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::CPAL); + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + return *(layout->cpal.get ()); +} + + +/** + * hb_ot_color_get_palette_count: + * @face: a font face. + * + * Returns: the number of color palettes in @face, or zero if @face has + * no colors. + * + * Since: REPLACEME + */ +unsigned int +hb_ot_color_get_palette_count (hb_face_t *face) +{ + const OT::CPAL& cpal = _get_cpal (face); + return cpal.get_palette_count (); +} + + +/** + * hb_ot_color_get_palette_name_id: + * @face: a font face. + * @palette: the index of the color palette whose name is being requested. + * + * Retrieves the name id of a color palette. For example, a color font can + * have themed palettes like "Spring", "Summer", "Fall", and "Winter". + * + * Returns: an identifier within @face's `name` table. + * If the requested palette has no name, or if @face has no colors, + * or if @palette is not between 0 and hb_ot_color_get_palette_count(), + * the result is 0xFFFF. The implementation does not check whether + * the returned palette name id is actually in @face's `name` table. + * + * Since: REPLACEME + */ +unsigned int +hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette) +{ + const OT::CPAL& cpal = _get_cpal (face); + return cpal.get_palette_name_id (palette); +} + + +/** + * hb_ot_color_get_palette_flags: + * @face: a font face + * @palette: the index of the color palette whose flags are being requested + * + * Returns: the flags for the requested color palette. If @face has no colors, + * or if @palette is not between 0 and hb_ot_color_get_palette_count(), + * the result is #HB_OT_COLOR_PALETTE_FLAG_DEFAULT. + * + * Since: REPLACEME + */ +hb_ot_color_palette_flags_t +hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette) +{ + const OT::CPAL& cpal = _get_cpal(face); + return cpal.get_palette_flags (palette); +} + + +/** + * hb_ot_color_get_palette_colors: + * @face: a font face. + * @palette: the index of the color palette whose colors + * are being requested. + * @start_offset: the index of the first color being requested. + * @color_count: (inout) (optional): on input, how many colors + * can be maximally stored into the @colors array; + * on output, how many colors were actually stored. + * @colors: (array length=color_count) (optional): + * an array of #hb_ot_color_t records. After calling + * this function, @colors will be filled with + * the palette colors. If @colors is NULL, the function + * will just return the number of total colors + * without storing any actual colors; this can be used + * for allocating a buffer of suitable size before calling + * hb_ot_color_get_palette_colors() a second time. + * + * Retrieves the colors in a color palette. + * + * Returns: the total number of colors in the palette. All palettes in + * a font have the same number of colors. If @face has no colors, or if + * @palette is not between 0 and hb_ot_color_get_palette_count(), + * the result is zero. + * + * Since: REPLACEME + */ +unsigned int +hb_ot_color_get_palette_colors (hb_face_t *face, + unsigned int palette, /* default=0 */ + unsigned int start_offset, + unsigned int *color_count /* IN/OUT */, + hb_ot_color_t *colors /* OUT */) +{ + const OT::CPAL& cpal = _get_cpal(face); + if (unlikely (palette >= cpal.numPalettes)) + { + if (color_count) *color_count = 0; + return 0; + } + + const OT::ColorRecord* crec = &cpal.offsetFirstColorRecord (&cpal); + crec += cpal.colorRecordIndices[palette]; + + unsigned int num_results = 0; + if (likely (color_count && colors)) + { + for (unsigned int i = start_offset; + i < cpal.numPaletteEntries && num_results < *color_count; ++i) + { + hb_ot_color_t* result = &colors[num_results]; + result->red = crec[i].red; + result->green = crec[i].green; + result->blue = crec[i].blue; + result->alpha = crec[i].alpha; + ++num_results; + } + } + + if (likely (color_count)) *color_count = num_results; + return cpal.numPaletteEntries; +} +#endif 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 9864064b112..0e373d30f92 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 @@ -31,12 +31,13 @@ #include "hb-font-private.hh" #include "hb-ot-cmap-table.hh" -#include "hb-ot-cbdt-table.hh" #include "hb-ot-glyf-table.hh" #include "hb-ot-hmtx-table.hh" #include "hb-ot-kern-table.hh" #include "hb-ot-post-table.hh" +#include "hb-ot-color-cbdt-table.hh" + struct hb_ot_font_t { 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 67143c6393a..d62f24bd916 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 @@ -29,7 +29,9 @@ #include "hb-open-type-private.hh" #include "hb-ot-head-table.hh" - +#include "hb-subset-glyf.hh" +#include "hb-subset-plan.hh" +#include "hb-subset-private.hh" namespace OT { @@ -78,12 +80,50 @@ struct glyf return_trace (true); } + inline bool subset (hb_subset_plan_t *plan) const + { + 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 && hb_subset_plan_add_table (plan, HB_OT_TAG_glyf, glyf_prime); + success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_loca, loca_prime); + success = success && _add_head_and_set_loca_version (plan->source, use_short_loca, plan->dest); + } else { + success = false; + } + hb_blob_destroy (loca_prime); + hb_blob_destroy (glyf_prime); + + return success; + } + + static bool + _add_head_and_set_loca_version (hb_face_t *source, bool use_short_loca, hb_face_t *dest) + { + hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (hb_face_reference_table (source, HB_OT_TAG_head)); + hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob); + hb_blob_destroy (head_blob); + + if (unlikely (!head_prime_blob)) + return false; + + OT::head *head_prime = (OT::head *) hb_blob_get_data_writable (head_prime_blob, nullptr); + head_prime->indexToLocFormat.set (use_short_loca ? 0 : 1); + bool success = hb_subset_face_add_table (dest, HB_OT_TAG_head, head_prime_blob); + + hb_blob_destroy (head_prime_blob); + return success; + } + struct GlyphHeader { HBINT16 numberOfContours; /* If the number of contours is - * greater than or equal to zero, - * this is a simple glyph; if negative, - * this is a composite glyph. */ + * greater than or equal to zero, + * this is a simple glyph; if negative, + * this is a composite glyph. */ FWORD xMin; /* Minimum x for coordinate data. */ FWORD yMin; /* Minimum y for coordinate data. */ FWORD xMax; /* Maximum x for coordinate data. */ @@ -92,6 +132,102 @@ struct glyf DEFINE_SIZE_STATIC (10); }; + struct CompositeGlyphHeader + { + static const uint16_t ARG_1_AND_2_ARE_WORDS = 0x0001; + static const uint16_t ARGS_ARE_XY_VALUES = 0x0002; + static const uint16_t ROUND_XY_TO_GRID = 0x0004; + static const uint16_t WE_HAVE_A_SCALE = 0x0008; + static const uint16_t MORE_COMPONENTS = 0x0020; + static const uint16_t WE_HAVE_AN_X_AND_Y_SCALE = 0x0040; + static const uint16_t WE_HAVE_A_TWO_BY_TWO = 0x0080; + static const uint16_t WE_HAVE_INSTRUCTIONS = 0x0100; + static const uint16_t USE_MY_METRICS = 0x0200; + static const uint16_t OVERLAP_COMPOUND = 0x0400; + static const uint16_t SCALED_COMPONENT_OFFSET = 0x0800; + static const uint16_t UNSCALED_COMPONENT_OFFSET = 0x1000; + + HBUINT16 flags; + HBUINT16 glyphIndex; + + inline unsigned int get_size (void) const + { + unsigned int size = min_size; + if (flags & ARG_1_AND_2_ARE_WORDS) { + // arg1 and 2 are int16 + size += 4; + } else { + // arg1 and 2 are int8 + size += 2; + } + if (flags & WE_HAVE_A_SCALE) { + // One x 16 bit (scale) + size += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + // Two x 16 bit (xscale, yscale) + size += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + // Four x 16 bit (xscale, scale01, scale10, yscale) + size += 8; + } + return size; + } + + struct Iterator + { + const char *glyph_start; + const char *glyph_end; + const CompositeGlyphHeader *current; + + inline bool move_to_next () + { + if (current->flags & CompositeGlyphHeader::MORE_COMPONENTS) + { + const CompositeGlyphHeader *possible = + &StructAfter<CompositeGlyphHeader, CompositeGlyphHeader> (*current); + if (!in_range (possible)) + return false; + current = possible; + return true; + } + return false; + } + + inline bool in_range (const CompositeGlyphHeader *composite) const + { + return (const char *) composite >= glyph_start + && ((const char *) composite + CompositeGlyphHeader::min_size) <= glyph_end + && ((const char *) composite + composite->get_size()) <= glyph_end; + } + }; + + static inline bool get_iterator (const char * glyph_data, + unsigned int length, + CompositeGlyphHeader::Iterator *iterator /* OUT */) + { + if (length < GlyphHeader::static_size) + return false; /* Empty glyph; zero extents. */ + + const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph_data, 0); + if (glyph_header.numberOfContours < 0) + { + const CompositeGlyphHeader *possible = + &StructAfter<CompositeGlyphHeader, GlyphHeader> (glyph_header); + + iterator->glyph_start = glyph_data; + iterator->glyph_end = (const char *) glyph_data + length; + if (!iterator->in_range (possible)) + return false; + iterator->current = possible; + return true; + } + + return false; + } + + DEFINE_SIZE_MIN (4); + }; + struct accelerator_t { inline void init (hb_face_t *face) @@ -122,29 +258,186 @@ struct glyf hb_blob_destroy (glyf_blob); } - inline bool get_extents (hb_codepoint_t glyph, - hb_glyph_extents_t *extents) const + /* + * Returns true if the referenced glyph is a valid glyph and a composite glyph. + * If true is returned a pointer to the composite glyph will be written into + * composite. + */ + inline bool get_composite (hb_codepoint_t glyph, + CompositeGlyphHeader::Iterator *composite /* OUT */) const + { + unsigned int start_offset, end_offset; + if (!get_offsets (glyph, &start_offset, &end_offset)) + return false; /* glyph not found */ + + return CompositeGlyphHeader::get_iterator ((const char*) this->glyf_table + start_offset, + end_offset - start_offset, + composite); + } + + /* based on FontTools _g_l_y_f.py::trim */ + inline bool remove_padding(unsigned int start_offset, + unsigned int *end_offset) const + { + static const int FLAG_X_SHORT = 0x02; + static const int FLAG_Y_SHORT = 0x04; + static const int FLAG_REPEAT = 0x08; + static const int FLAG_X_SAME = 0x10; + static const int FLAG_Y_SAME = 0x20; + + if (*end_offset - start_offset < GlyphHeader::static_size) + return true; + + const char *glyph = ((const char *) glyf_table) + start_offset; + const char * const glyph_end = glyph + (*end_offset - start_offset); + const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph, 0); + int16_t num_contours = (int16_t) glyph_header.numberOfContours; + + if (num_contours < 0) + /* Trimming for composites not implemented. + * If removing hints it falls out of that. */ + return true; + else if (num_contours > 0) + { + /* simple glyph w/contours, possibly trimmable */ + glyph += GlyphHeader::static_size + 2 * num_contours; + + if (unlikely (glyph + 2 >= glyph_end)) return false; + uint16_t nCoordinates = (uint16_t) StructAtOffset<HBUINT16>(glyph - 2, 0) + 1; + uint16_t nInstructions = (uint16_t) StructAtOffset<HBUINT16>(glyph, 0); + + glyph += 2 + nInstructions; + if (unlikely (glyph + 2 >= glyph_end)) return false; + + unsigned int coordBytes = 0; + unsigned int coordsWithFlags = 0; + while (glyph < glyph_end) + { + uint8_t flag = (uint8_t) *glyph; + glyph++; + + unsigned int repeat = 1; + if (flag & FLAG_REPEAT) + { + if (glyph >= glyph_end) + { + DEBUG_MSG(SUBSET, nullptr, "Bad flag"); + return false; + } + repeat = ((uint8_t) *glyph) + 1; + glyph++; + } + + unsigned int xBytes, yBytes; + xBytes = yBytes = 0; + if (flag & FLAG_X_SHORT) + xBytes = 1; + else if ((flag & FLAG_X_SAME) == 0) + xBytes = 2; + + if (flag & FLAG_Y_SHORT) + yBytes = 1; + else if ((flag & FLAG_Y_SAME) == 0) + yBytes = 2; + + coordBytes += (xBytes + yBytes) * repeat; + coordsWithFlags += repeat; + if (coordsWithFlags >= nCoordinates) + break; + } + + if (coordsWithFlags != nCoordinates) + { + DEBUG_MSG(SUBSET, nullptr, "Expect %d coords to have flags, got flags for %d", nCoordinates, coordsWithFlags); + return false; + } + glyph += coordBytes; + + if (glyph < glyph_end) + *end_offset -= glyph_end - glyph; + } + return true; + } + + inline bool get_offsets (hb_codepoint_t glyph, + unsigned int *start_offset /* OUT */, + unsigned int *end_offset /* OUT */) const { if (unlikely (glyph >= num_glyphs)) return false; - unsigned int start_offset, end_offset; if (short_offset) { const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataX; - start_offset = 2 * offsets[glyph]; - end_offset = 2 * offsets[glyph + 1]; + *start_offset = 2 * offsets[glyph]; + *end_offset = 2 * offsets[glyph + 1]; } else { const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataX; - start_offset = offsets[glyph]; - end_offset = offsets[glyph + 1]; + + *start_offset = offsets[glyph]; + *end_offset = offsets[glyph + 1]; } - if (start_offset > end_offset || end_offset > glyf_len) + if (*start_offset > *end_offset || *end_offset > glyf_len) return false; + return true; + } + + inline bool get_instruction_offsets(unsigned int start_offset, + unsigned int end_offset, + unsigned int *instruction_start /* OUT */, + unsigned int *instruction_end /* OUT */) const + { + if (end_offset - start_offset < GlyphHeader::static_size) + { + *instruction_start = 0; + *instruction_end = 0; + return true; /* Empty glyph; no instructions. */ + } + const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset); + int16_t num_contours = (int16_t) glyph_header.numberOfContours; + if (num_contours < 0) + { + CompositeGlyphHeader::Iterator composite_it; + if (unlikely (!CompositeGlyphHeader::get_iterator ( + (const char*) this->glyf_table + start_offset, + end_offset - start_offset, &composite_it))) return false; + const CompositeGlyphHeader *last; + do { + last = composite_it.current; + } while (composite_it.move_to_next()); + + if ( (uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS) + *instruction_start = ((char *) last - (char *) glyf_table->dataX) + last->get_size(); + else + *instruction_start = end_offset; + *instruction_end = end_offset; + if (unlikely (*instruction_start > *instruction_end)) + { + DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset); + return false; + } + } + else + { + unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours; + const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (glyf_table, instruction_length_offset); + *instruction_start = instruction_length_offset + 2; + *instruction_end = *instruction_start + (uint16_t) instruction_length; + } + return true; + } + + inline bool get_extents (hb_codepoint_t glyph, + hb_glyph_extents_t *extents) const + { + unsigned int start_offset, end_offset; + if (!get_offsets (glyph, &start_offset, &end_offset)) + return false; + if (end_offset - start_offset < GlyphHeader::static_size) return true; /* Empty glyph; zero extents. */ 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 new file mode 100644 index 00000000000..f08fe39d8be --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh @@ -0,0 +1,198 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef HB_OT_HDMX_TABLE_HH +#define HB_OT_HDMX_TABLE_HH + +#include "hb-open-type-private.hh" + +namespace OT { + + +/* + * hdmx - Horizontal Device Metric + */ + +#define HB_OT_TAG_hdmx HB_TAG('h','d','m','x') + +struct DeviceRecord +{ + struct SubsetView + { + const DeviceRecord *source_device_record; + hb_subset_plan_t *subset_plan; + + inline void init(const DeviceRecord *source_device_record, + hb_subset_plan_t *subset_plan) + { + this->source_device_record = source_device_record; + this->subset_plan = subset_plan; + } + + inline unsigned int len () const + { + return this->subset_plan->gids_to_retain_sorted.len; + } + + inline const HBUINT8& operator [] (unsigned int i) const + { + if (unlikely (i >= len())) return Null(HBUINT8); + hb_codepoint_t gid = this->subset_plan->gids_to_retain_sorted [i]; + return this->source_device_record->widths[gid]; + } + }; + + static inline unsigned int get_size (unsigned int count) + { + unsigned int raw_size = min_size + count * HBUINT8::static_size; + if (raw_size % 4) + /* Align to 32 bits */ + return raw_size + (4 - (raw_size % 4)); + return raw_size; + } + + inline bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view) + { + TRACE_SERIALIZE (this); + + if (unlikely (!c->allocate_size<DeviceRecord> (get_size (subset_view.len())))) + return_trace (false); + + this->pixel_size.set (subset_view.source_device_record->pixel_size); + this->max_width.set (subset_view.source_device_record->max_width); + + for (unsigned int i = 0; i < subset_view.len(); i++) + widths[i].set (subset_view[i]); + + return_trace (true); + } + + inline bool sanitize (hb_sanitize_context_t *c, unsigned int size_device_record) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + c->check_range (this, size_device_record))); + } + + HBUINT8 pixel_size; /* Pixel size for following widths (as ppem). */ + HBUINT8 max_width; /* Maximum width. */ + HBUINT8 widths[VAR]; /* Array of widths (numGlyphs is from the 'maxp' table). */ + public: + DEFINE_SIZE_ARRAY (2, widths); +}; + + +struct hdmx +{ + static const hb_tag_t tableTag = HB_OT_TAG_hdmx; + + inline unsigned int get_size (void) const + { + return min_size + num_records * size_device_record; + } + + inline const DeviceRecord& operator [] (unsigned int i) const + { + if (unlikely (i >= num_records)) return Null(DeviceRecord); + return StructAtOffset<DeviceRecord> (this, min_size + i * size_device_record); + } + + inline bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan) + { + TRACE_SERIALIZE (this); + + if (unlikely (!c->extend_min ((*this)))) return_trace (false); + + this->version.set (source_hdmx->version); + this->num_records.set (source_hdmx->num_records); + this->size_device_record.set (DeviceRecord::get_size (plan->gids_to_retain_sorted.len)); + + for (unsigned int i = 0; i < source_hdmx->num_records; i++) + { + DeviceRecord::SubsetView subset_view; + subset_view.init (&(*source_hdmx)[i], plan); + + c->start_embed<DeviceRecord> ()->serialize (c, subset_view); + } + + return_trace (true); + } + + static inline size_t get_subsetted_size (hb_subset_plan_t *plan) + { + return min_size + DeviceRecord::get_size (plan->gids_to_retain_sorted.len); + } + + inline bool subset (hb_subset_plan_t *plan) const + { + size_t dest_size = get_subsetted_size (plan); + hdmx *dest = (hdmx *) malloc (dest_size); + if (unlikely (!dest)) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for hdmx subset output.", (unsigned long) dest_size); + return false; + } + + hb_serialize_context_t c (dest, dest_size); + hdmx *hdmx_prime = c.start_serialize<hdmx> (); + if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan)) { + free (dest); + return false; + } + c.end_serialize (); + + hb_blob_t *hdmx_prime_blob = hb_blob_create ((const char *) dest, + dest_size, + HB_MEMORY_MODE_READONLY, + dest, + free); + bool result = hb_subset_plan_add_table (plan, HB_OT_TAG_hdmx, hdmx_prime_blob); + hb_blob_destroy (hdmx_prime_blob); + + return result; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && version == 0 && + !_hb_unsigned_int_mul_overflows (num_records, size_device_record) && + c->check_range (this, get_size())); + } + + protected: + HBUINT16 version; /* Table version number (0) */ + HBUINT16 num_records; /* Number of device records. */ + HBUINT32 size_device_record; /* Size of a device record, 32-bit aligned. */ + HBUINT8 data[VAR]; /* Array of device records. */ + public: + DEFINE_SIZE_ARRAY (8, data); +}; + +} /* namespace OT */ + + +#endif /* HB_OT_HDMX_TABLE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh index 2024cea7e78..1d458404517 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh @@ -43,6 +43,8 @@ namespace OT { struct head { + friend struct OffsetTable; + static const hb_tag_t tableTag = HB_OT_TAG_head; inline unsigned int get_upem (void) const diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh index 54eb5eb7732..97952b4ebbb 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh @@ -41,7 +41,7 @@ namespace OT { #define HB_OT_TAG_hhea HB_TAG('h','h','e','a') #define HB_OT_TAG_vhea HB_TAG('v','h','e','a') - +template <typename T> struct _hea { inline bool sanitize (hb_sanitize_context_t *c) const @@ -84,10 +84,10 @@ struct _hea DEFINE_SIZE_STATIC (36); }; -struct hhea : _hea { +struct hhea : _hea<hhea> { static const hb_tag_t tableTag = HB_OT_TAG_hhea; }; -struct vhea : _hea { +struct vhea : _hea<vhea> { static const hb_tag_t tableTag = HB_OT_TAG_vhea; }; 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 934acde7792..3cd48a62e93 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 @@ -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, Roderick Sheeter */ #ifndef HB_OT_HMTX_TABLE_HH @@ -53,7 +53,7 @@ struct LongMetric DEFINE_SIZE_STATIC (4); }; -template <typename T> +template <typename T, typename H> struct hmtxvmtx { inline bool sanitize (hb_sanitize_context_t *c) const @@ -64,17 +64,128 @@ struct hmtxvmtx return_trace (true); } + + inline bool subset_update_header (hb_subset_plan_t *plan, + unsigned int num_hmetrics) const + { + hb_blob_t *src_blob = OT::Sanitizer<H> ().sanitize (plan->source->reference_table (H::tableTag)); + hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail(src_blob); + hb_blob_destroy (src_blob); + + if (unlikely (!dest_blob)) { + return false; + } + + unsigned int length; + H *table = (H *) hb_blob_get_data (dest_blob, &length); + table->numberOfLongMetrics.set (num_hmetrics); + + bool result = hb_subset_plan_add_table (plan, H::tableTag, dest_blob); + hb_blob_destroy (dest_blob); + + return result; + } + + inline bool subset (hb_subset_plan_t *plan) const + { + typename T::accelerator_t _mtx; + _mtx.init (plan->source); + + /* All the trailing glyphs with the same advance can use one LongMetric + * and just keep LSB */ + hb_prealloced_array_t<hb_codepoint_t> &gids = plan->gids_to_retain_sorted; + unsigned int num_advances = gids.len; + unsigned int last_advance = _mtx.get_advance (gids[num_advances - 1]); + while (num_advances > 1 + && last_advance == _mtx.get_advance (gids[num_advances - 2])) + { + num_advances--; + } + + /* alloc the new table */ + size_t dest_sz = num_advances * 4 + + (gids.len - num_advances) * 2; + void *dest = (void *) malloc (dest_sz); + if (unlikely (!dest)) + { + return false; + } + DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in src has %d advances, %d lsbs", HB_UNTAG(T::tableTag), _mtx.num_advances, _mtx.num_metrics - _mtx.num_advances); + DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in dest has %d advances, %d lsbs, %u bytes", HB_UNTAG(T::tableTag), num_advances, gids.len - num_advances, (unsigned int) dest_sz); + + const char *source_table = hb_blob_get_data (_mtx.blob, nullptr); + // Copy everything over + LongMetric * old_metrics = (LongMetric *) source_table; + FWORD *lsbs = (FWORD *) (old_metrics + _mtx.num_advances); + char * dest_pos = (char *) dest; + for (unsigned int i = 0; i < gids.len; i++) + { + /* the last metric or the one for gids[i] */ + LongMetric *src_metric = old_metrics + MIN ((hb_codepoint_t) _mtx.num_advances - 1, gids[i]); + if (gids[i] < _mtx.num_advances) + { + /* src is a LongMetric */ + if (i < num_advances) + { + /* dest is a LongMetric, copy it */ + *((LongMetric *) dest_pos) = *src_metric; + } + else + { + /* dest just lsb */ + *((FWORD *) dest_pos) = src_metric->lsb; + } + } + else + { + FWORD src_lsb = *(lsbs + gids[i] - _mtx.num_advances); + if (i < num_advances) + { + /* dest needs a full LongMetric */ + LongMetric *metric = (LongMetric *)dest_pos; + metric->advance = src_metric->advance; + metric->lsb = src_lsb; + } + else + { + /* dest just needs an lsb */ + *((FWORD *) dest_pos) = src_lsb; + } + } + dest_pos += (i < num_advances ? 4 : 2); + } + _mtx.fini (); + + // Amend header num hmetrics + if (unlikely (!subset_update_header (plan, num_advances))) + { + free (dest); + return false; + } + + hb_blob_t *result = hb_blob_create ((const char *)dest, + dest_sz, + HB_MEMORY_MODE_READONLY, + dest, + free); + bool success = hb_subset_plan_add_table (plan, T::tableTag, result); + hb_blob_destroy (result); + return success; + } + struct accelerator_t { + friend struct hmtxvmtx; + inline void init (hb_face_t *face, unsigned int default_advance_ = 0) { - default_advance = default_advance_ ? default_advance_ : face->get_upem (); + default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face); bool got_font_extents = false; if (T::os2Tag) { - hb_blob_t *os2_blob = Sanitizer<os2>().sanitize (face->reference_table (T::os2Tag)); + hb_blob_t *os2_blob = Sanitizer<os2> ().sanitize (face->reference_table (T::os2Tag)); const os2 *os2_table = Sanitizer<os2>::lock_instance (os2_blob); #define USE_TYPO_METRICS (1u<<7) if (0 != (os2_table->fsSelection & USE_TYPO_METRICS)) @@ -87,8 +198,8 @@ struct hmtxvmtx hb_blob_destroy (os2_blob); } - hb_blob_t *_hea_blob = Sanitizer<_hea>().sanitize (face->reference_table (T::headerTag)); - const _hea *_hea_table = Sanitizer<_hea>::lock_instance (_hea_blob); + hb_blob_t *_hea_blob = Sanitizer<H> ().sanitize (face->reference_table (H::tableTag)); + const H *_hea_table = Sanitizer<H>::lock_instance (_hea_blob); num_advances = _hea_table->numberOfLongMetrics; if (!got_font_extents) { @@ -101,7 +212,7 @@ struct hmtxvmtx has_font_extents = got_font_extents; - blob = Sanitizer<hmtxvmtx>().sanitize (face->reference_table (T::tableTag)); + blob = Sanitizer<hmtxvmtx> ().sanitize (face->reference_table (T::tableTag)); /* Cap num_metrics() and num_advances() based on table length. */ unsigned int len = hb_blob_get_length (blob); @@ -119,7 +230,7 @@ struct hmtxvmtx } table = Sanitizer<hmtxvmtx>::lock_instance (blob); - var_blob = Sanitizer<HVARVVAR>().sanitize (face->reference_table (T::variationsTag)); + var_blob = Sanitizer<HVARVVAR> ().sanitize (face->reference_table (T::variationsTag)); var_table = Sanitizer<HVARVVAR>::lock_instance (var_blob); } @@ -129,22 +240,31 @@ struct hmtxvmtx hb_blob_destroy (var_blob); } - inline unsigned int get_advance (hb_codepoint_t glyph, - hb_font_t *font) const + inline unsigned int get_advance (hb_codepoint_t glyph) const { if (unlikely (glyph >= num_metrics)) { - /* If num_metrics is zero, it means we don't have the metrics table - * for this direction: return default advance. Otherwise, it means that the - * glyph index is out of bound: return zero. */ - if (num_metrics) - return 0; - else - return default_advance; + /* If num_metrics is zero, it means we don't have the metrics table + * for this direction: return default advance. Otherwise, it means that the + * glyph index is out of bound: return zero. */ + if (num_metrics) + return 0; + else + return default_advance; } - return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance - + (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?! + return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance; + } + + inline unsigned int get_advance (hb_codepoint_t glyph, + hb_font_t *font) const + { + unsigned int advance = get_advance (glyph); + if (likely(glyph < num_metrics)) + { + advance += (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?! + } + return advance; } public: @@ -153,11 +273,12 @@ struct hmtxvmtx unsigned short descender; unsigned short line_gap; - private: + protected: unsigned int num_metrics; unsigned int num_advances; unsigned int default_advance; + private: const hmtxvmtx *table; hb_blob_t *blob; const HVARVVAR *var_table; @@ -173,7 +294,7 @@ struct hmtxvmtx * be in the array, but that entry is * required. The last entry applies to * all subsequent glyphs. */ - FWORD leadingBearingX[VAR]; /* Here the advance is assumed +/*FWORD leadingBearingX[VAR];*/ /* Here the advance is assumed * to be the same as the advance * for the last entry above. The * number of entries in this array is @@ -187,18 +308,16 @@ struct hmtxvmtx * font to vary the side bearing * values for each glyph. */ public: - DEFINE_SIZE_ARRAY2 (0, longMetric, leadingBearingX); + DEFINE_SIZE_ARRAY (0, longMetric); }; -struct hmtx : hmtxvmtx<hmtx> { +struct hmtx : hmtxvmtx<hmtx, hhea> { static const hb_tag_t tableTag = HB_OT_TAG_hmtx; - static const hb_tag_t headerTag = HB_OT_TAG_hhea; static const hb_tag_t variationsTag = HB_OT_TAG_HVAR; static const hb_tag_t os2Tag = HB_OT_TAG_os2; }; -struct vmtx : hmtxvmtx<vmtx> { +struct vmtx : hmtxvmtx<vmtx, vhea> { static const hb_tag_t tableTag = HB_OT_TAG_vmtx; - static const hb_tag_t headerTag = HB_OT_TAG_vhea; static const hb_tag_t variationsTag = HB_OT_TAG_VVAR; static const hb_tag_t os2Tag = HB_TAG_NONE; }; 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 new file mode 100644 index 00000000000..20b8bd76223 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh @@ -0,0 +1,655 @@ +/* + * Copyright © 2016 Elie Roux <elie.roux@telecom-bretagne.eu> + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_LAYOUT_BASE_TABLE_HH +#define HB_OT_LAYOUT_BASE_TABLE_HH + +#include "hb-open-type-private.hh" +#include "hb-ot-layout-common-private.hh" + +namespace OT { + +#define NOT_INDEXED ((unsigned int) -1) + +/* + * BASE -- The BASE Table + */ + +struct BaseCoordFormat1 +{ + inline int get_coord (void) const { return coordinate; } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 1 */ + HBINT16 coordinate; /* X or Y value, in design units */ + public: + DEFINE_SIZE_STATIC (4); +}; + +struct BaseCoordFormat2 +{ + inline int get_coord (void) const + { + /* TODO */ + return coordinate; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 2 */ + HBINT16 coordinate; /* X or Y value, in design units */ + GlyphID referenceGlyph; /* Glyph ID of control glyph */ + HBUINT16 coordPoint; /* Index of contour point on the + * reference glyph */ + public: + DEFINE_SIZE_STATIC (8); +}; + +struct BaseCoordFormat3 +{ + inline int get_coord (void) const + { + /* TODO */ + return coordinate; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && deviceTable.sanitize (c, this)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 3 */ + HBINT16 coordinate; /* X or Y value, in design units */ + OffsetTo<Device> deviceTable; /* Offset to Device table for X or + * Y value, from beginning of + * BaseCoord table (may be NULL). */ + public: + DEFINE_SIZE_STATIC (6); +}; + +struct BaseCoord +{ + inline int get_coord (void) const + { + switch (u.format) { + case 1: return u.format1.get_coord (); + case 2: return u.format2.get_coord (); + case 3: return u.format3.get_coord (); + default:return 0; + } + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!u.format.sanitize (c)) return_trace (false); + switch (u.format) { + case 1: return_trace (u.format1.sanitize (c)); + case 2: return_trace (u.format2.sanitize (c)); + case 3: return_trace (u.format3.sanitize (c)); + default:return_trace (false); + } + } + + protected: + union { + HBUINT16 format; + BaseCoordFormat1 format1; + BaseCoordFormat2 format2; + BaseCoordFormat3 format3; + } u; + public: + DEFINE_SIZE_UNION (2, format); +}; + +struct FeatMinMaxRecord +{ + inline int get_min_value (void) const + { return (this+minCoord).get_coord(); } + + inline int get_max_value (void) const + { return (this+maxCoord).get_coord(); } + + inline const Tag &get_tag () const + { return tag; } + + inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + minCoord.sanitize (c, base) && + maxCoord.sanitize (c, base)); + } + + protected: + Tag tag; /* 4-byte feature identification tag--must + * match feature tag in FeatureList */ + OffsetTo<BaseCoord> minCoord; /* Offset to BaseCoord table that defines + * the minimum extent value, from beginning + * of MinMax table (may be NULL) */ + OffsetTo<BaseCoord> maxCoord; /* Offset to BaseCoord table that defines + * the maximum extent value, from beginning + * of MinMax table (may be NULL) */ + public: + DEFINE_SIZE_STATIC (8); + +}; + +struct MinMax +{ + inline unsigned int get_feature_tag_index (Tag featureTableTag) const + { + /* TODO bsearch */ + unsigned int count = featMinMaxRecords.len; + for (unsigned int i = 0; i < count; i++) + { + Tag tag = featMinMaxRecords[i].get_tag(); + int cmp = tag.cmp(featureTableTag); + if (cmp == 0) return i; + if (cmp > 0) return NOT_INDEXED; + } + return NOT_INDEXED; + } + + inline int get_min_value (unsigned int featureTableTagIndex) const + { + if (featureTableTagIndex == NOT_INDEXED) + return (this+minCoord).get_coord(); + return featMinMaxRecords[featureTableTagIndex].get_min_value(); + } + + inline int get_max_value (unsigned int featureTableTagIndex) const + { + if (featureTableTagIndex == NOT_INDEXED) + return (this+maxCoord).get_coord(); + return featMinMaxRecords[featureTableTagIndex].get_max_value(); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + minCoord.sanitize (c, this) && + maxCoord.sanitize (c, this) && + featMinMaxRecords.sanitize (c, this)); + } + + protected: + OffsetTo<BaseCoord> minCoord; /* Offset to BaseCoord table that defines + * minimum extent value, from the beginning + * of MinMax table (may be NULL) */ + OffsetTo<BaseCoord> maxCoord; /* Offset to BaseCoord table that defines + * maximum extent value, from the beginning + * of MinMax table (may be NULL) */ + ArrayOf<FeatMinMaxRecord> + featMinMaxRecords; /* Array of FeatMinMaxRecords, in alphabetical + * order by featureTableTag */ + public: + DEFINE_SIZE_ARRAY (6, featMinMaxRecords); +}; + +/* TODO... */ +struct BaseLangSysRecord +{ + inline const Tag& get_tag(void) const + { return baseLangSysTag; } + + inline unsigned int get_feature_tag_index (Tag featureTableTag) const + { return (this+minMax).get_feature_tag_index(featureTableTag); } + + inline int get_min_value (unsigned int featureTableTagIndex) const + { return (this+minMax).get_min_value(featureTableTagIndex); } + + inline int get_max_value (unsigned int featureTableTagIndex) const + { return (this+minMax).get_max_value(featureTableTagIndex); } + + inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + minMax.sanitize (c, base)); + } + + protected: + Tag baseLangSysTag; + OffsetTo<MinMax> minMax; + public: + DEFINE_SIZE_STATIC (6); + +}; + +struct BaseValues +{ + inline unsigned int get_default_base_tag_index (void) const + { return defaultIndex; } + + inline int get_base_coord (unsigned int baselineTagIndex) const + { + return (this+baseCoords[baselineTagIndex]).get_coord(); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + defaultIndex <= baseCoordCount && + baseCoords.sanitize (c, this)); + } + + protected: + Index defaultIndex; + HBUINT16 baseCoordCount; + OffsetArrayOf<BaseCoord> baseCoords; + public: + DEFINE_SIZE_ARRAY (6, baseCoords); + +}; + +struct BaseScript { + + inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const + { + Tag tag; + int cmp; + for (unsigned int i = 0; i < baseLangSysCount; i++) { + tag = baseLangSysRecords[i].get_tag(); + // taking advantage of alphabetical order + cmp = tag.cmp(baseLangSysTag); + if (cmp == 0) return i; + if (cmp > 0) return NOT_INDEXED; + } + return NOT_INDEXED; + } + + inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const + { + if (baseLangSysIndex == NOT_INDEXED) { + if (unlikely(defaultMinMax)) return NOT_INDEXED; + return (this+defaultMinMax).get_feature_tag_index(featureTableTag); + } + if (unlikely(baseLangSysIndex >= baseLangSysCount)) return NOT_INDEXED; + return baseLangSysRecords[baseLangSysIndex].get_feature_tag_index(featureTableTag); + } + + inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + if (baseLangSysIndex == NOT_INDEXED) + return (this+defaultMinMax).get_min_value(featureTableTagIndex); + return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex); + } + + inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + if (baseLangSysIndex == NOT_INDEXED) + return (this+defaultMinMax).get_min_value(featureTableTagIndex); + return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex); + } + + inline unsigned int get_default_base_tag_index (void) const + { return (this+baseValues).get_default_base_tag_index(); } + + inline int get_base_coord (unsigned int baselineTagIndex) const + { return (this+baseValues).get_base_coord(baselineTagIndex); } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + baseValues.sanitize (c, this) && + defaultMinMax.sanitize (c, this) && + baseLangSysRecords.sanitize (c, this)); + } + + protected: + OffsetTo<BaseValues> baseValues; + OffsetTo<MinMax> defaultMinMax; + HBUINT16 baseLangSysCount; + ArrayOf<BaseLangSysRecord> baseLangSysRecords; + + public: + DEFINE_SIZE_ARRAY (8, baseLangSysRecords); +}; + + +struct BaseScriptRecord { + + inline const Tag& get_tag (void) const + { return baseScriptTag; } + + inline unsigned int get_default_base_tag_index(void) const + { return (this+baseScript).get_default_base_tag_index(); } + + inline int get_base_coord(unsigned int baselineTagIndex) const + { return (this+baseScript).get_base_coord(baselineTagIndex); } + + inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const + { return (this+baseScript).get_lang_tag_index(baseLangSysTag); } + + inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const + { return (this+baseScript).get_feature_tag_index(baseLangSysIndex, featureTableTag); } + + inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { return (this+baseScript).get_max_value(baseLangSysIndex, featureTableTagIndex); } + + inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { return (this+baseScript).get_min_value(baseLangSysIndex, featureTableTagIndex); } + + inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + baseScript != Null(OffsetTo<BaseScript>) && + baseScript.sanitize (c, base)); + } + + protected: + Tag baseScriptTag; + OffsetTo<BaseScript> baseScript; + + public: + DEFINE_SIZE_STATIC (6); +}; + +struct BaseScriptList { + + inline unsigned int get_base_script_index (Tag baseScriptTag) const + { + for (unsigned int i = 0; i < baseScriptCount; i++) + if (baseScriptRecords[i].get_tag() == baseScriptTag) + return i; + return NOT_INDEXED; + } + + inline unsigned int get_default_base_tag_index (unsigned int baseScriptIndex) const + { + if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED; + return baseScriptRecords[baseScriptIndex].get_default_base_tag_index(); + } + + inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const + { + return baseScriptRecords[baseScriptIndex].get_base_coord(baselineTagIndex); + } + + inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const + { + if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED; + return baseScriptRecords[baseScriptIndex].get_lang_tag_index(baseLangSysTag); + } + + inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const + { + if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED; + return baseScriptRecords[baseScriptIndex].get_feature_tag_index(baseLangSysIndex, featureTableTag); + } + + inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return baseScriptRecords[baseScriptIndex].get_max_value(baseLangSysIndex, featureTableTagIndex); + } + + inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return baseScriptRecords[baseScriptIndex].get_min_value(baseLangSysIndex, featureTableTagIndex); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + baseScriptRecords.sanitize (c, this)); + } + + protected: + HBUINT16 baseScriptCount; + ArrayOf<BaseScriptRecord> baseScriptRecords; + + public: + DEFINE_SIZE_ARRAY (4, baseScriptRecords); + +}; + +struct BaseTagList +{ + + inline unsigned int get_tag_index(Tag baselineTag) const + { + for (unsigned int i = 0; i < baseTagCount; i++) + if (baselineTags[i] == baselineTag) + return i; + return NOT_INDEXED; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + HBUINT16 baseTagCount; + SortedArrayOf<Tag> baselineTags; + + public: + DEFINE_SIZE_ARRAY (4, baselineTags); +}; + +struct Axis +{ + + inline unsigned int get_base_tag_index(Tag baselineTag) const + { + if (unlikely(baseTagList == Null(OffsetTo<BaseTagList>))) return NOT_INDEXED; + return (this+baseTagList).get_tag_index(baselineTag); + } + + inline unsigned int get_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const + { + if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED; + return (this+baseScriptList).get_default_base_tag_index(baseScriptIndex); + } + + inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const + { + return (this+baseScriptList).get_base_coord(baseScriptIndex, baselineTagIndex); + } + + inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const + { + if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED; + return (this+baseScriptList).get_lang_tag_index(baseScriptIndex, baseLangSysTag); + } + + inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const + { + if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED; + return (this+baseScriptList).get_feature_tag_index(baseScriptIndex, baseLangSysIndex, featureTableTag); + } + + inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return (this+baseScriptList).get_max_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + } + + inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return (this+baseScriptList).get_min_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + baseTagList.sanitize (c, this) && + baseScriptList.sanitize (c, this)); + } + + protected: + OffsetTo<BaseTagList> baseTagList; + OffsetTo<BaseScriptList> baseScriptList; + + public: + DEFINE_SIZE_STATIC (4); +}; + +struct BASE +{ + static const hb_tag_t tableTag = HB_OT_TAG_BASE; + + inline bool has_vert_axis(void) + { return vertAxis != Null(OffsetTo<Axis>); } + + inline bool has_horiz_axis(void) + { return horizAxis != Null(OffsetTo<Axis>); } + + // horizontal axis base coords: + + inline unsigned int get_horiz_base_tag_index(Tag baselineTag) const + { + if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+horizAxis).get_base_tag_index(baselineTag); + } + + inline unsigned int get_horiz_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const + { + if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+horizAxis).get_default_base_tag_index_for_script_index(baseScriptIndex); + } + + inline int get_horiz_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const + { + return (this+horizAxis).get_base_coord(baseScriptIndex, baselineTagIndex); + } + + // vertical axis base coords: + + inline unsigned int get_vert_base_tag_index(Tag baselineTag) const + { + if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+vertAxis).get_base_tag_index(baselineTag); + } + + inline unsigned int get_vert_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const + { + if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+vertAxis).get_default_base_tag_index_for_script_index(baseScriptIndex); + } + + inline int get_vert_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const + { + return (this+vertAxis).get_base_coord(baseScriptIndex, baselineTagIndex); + } + + // horizontal axis min/max coords: + + inline unsigned int get_horiz_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const + { + if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+horizAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag); + } + + inline unsigned int get_horiz_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const + { + if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+horizAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag); + } + + inline int get_horiz_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return (this+horizAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + } + + inline int get_horiz_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return (this+horizAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + } + + // vertical axis min/max coords: + + inline unsigned int get_vert_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const + { + if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+vertAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag); + } + + inline unsigned int get_vert_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const + { + if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED; + return (this+vertAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag); + } + + inline int get_vert_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return (this+vertAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + } + + inline int get_vert_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const + { + return (this+vertAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + likely (version.major == 1) && + horizAxis.sanitize (c, this) && + vertAxis.sanitize (c, this) && + (version.to_int () < 0x00010001u || varStore.sanitize (c, this))); + } + + protected: + FixedVersion<> version; + OffsetTo<Axis> horizAxis; + OffsetTo<Axis> vertAxis; + LOffsetTo<VariationStore> + varStore; /* Offset to the table of Item Variation + * Store--from beginning of BASE + * header (may be NULL). Introduced + * in version 0x00010001. */ + public: + DEFINE_SIZE_MIN (8); +}; + + +} /* namespace OT */ + + +#endif /* HB_OT_LAYOUT_BASE_TABLE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh index 31c436a09dd..c5e7f5217c9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh @@ -299,7 +299,7 @@ struct FeatureParamsSize * better. * * Assume that the offset to the size feature is according to specification, - * and make the following value checks. If it fails, assume the the size + * and make the following value checks. If it fails, assume the size * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it. * If this fails, reject the 'size' feature. The older makeOTF's calculated the * offset from the beginning of the FeatureList table, rather than from the @@ -700,7 +700,7 @@ struct CoverageFormat1 if (unlikely (!c->extend (glyphArray))) return_trace (false); for (unsigned int i = 0; i < num_glyphs; i++) glyphArray[i] = glyphs[i]; - glyphs.advance (num_glyphs); + glyphs += num_glyphs; return_trace (true); } @@ -789,7 +789,7 @@ struct CoverageFormat2 } else { rangeRecord[range].end = glyphs[i]; } - glyphs.advance (num_glyphs); + glyphs += num_glyphs; return_trace (true); } @@ -1057,7 +1057,7 @@ struct ClassDefFormat1 if (klass == 0) { /* Match if there's any glyph that is not listed! */ - hb_codepoint_t g = -1; + hb_codepoint_t g = HB_SET_VALUE_INVALID; if (!hb_set_next (glyphs, &g)) return false; if (g < startGlyph) @@ -1128,7 +1128,7 @@ struct ClassDefFormat2 if (klass == 0) { /* Match if there's any glyph that is not listed! */ - hb_codepoint_t g = (hb_codepoint_t) -1; + hb_codepoint_t g = HB_SET_VALUE_INVALID; for (unsigned int i = 0; i < count; i++) { if (!hb_set_next (glyphs, &g)) @@ -1137,7 +1137,7 @@ struct ClassDefFormat2 return true; g = rangeRecord[i].end; } - if (g != (hb_codepoint_t) -1 && hb_set_next (glyphs, &g)) + if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g)) return true; /* Fall through. */ } 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 aad7d60290d..2d6c66e6c99 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 @@ -110,7 +110,7 @@ struct CaretValueFormat1 protected: HBUINT16 caretValueFormat; /* Format identifier--format = 1 */ - HBINT16 coordinate; /* X or Y value, in design units */ + FWORD coordinate; /* X or Y value, in design units */ public: DEFINE_SIZE_STATIC (4); }; @@ -161,7 +161,7 @@ struct CaretValueFormat3 protected: HBUINT16 caretValueFormat; /* Format identifier--format = 3 */ - HBINT16 coordinate; /* X or Y value, in design units */ + FWORD coordinate; /* X or Y value, in design units */ OffsetTo<Device> deviceTable; /* Offset to Device table for X or Y * value--from beginning of CaretValue 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 3ef3d30b084..46ffcc66883 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 @@ -99,7 +99,7 @@ struct ValueFormat : HBUINT16 #endif inline unsigned int get_len (void) const - { return _hb_popcount32 ((unsigned int) *this); } + { return _hb_popcount ((unsigned int) *this); } inline unsigned int get_size (void) const { return get_len () * Value::static_size; } @@ -248,8 +248,8 @@ struct AnchorFormat1 protected: HBUINT16 format; /* Format identifier--format = 1 */ - HBINT16 xCoordinate; /* Horizontal value--in design units */ - HBINT16 yCoordinate; /* Vertical value--in design units */ + FWORD xCoordinate; /* Horizontal value--in design units */ + FWORD yCoordinate; /* Vertical value--in design units */ public: DEFINE_SIZE_STATIC (6); }; @@ -279,8 +279,8 @@ struct AnchorFormat2 protected: HBUINT16 format; /* Format identifier--format = 2 */ - HBINT16 xCoordinate; /* Horizontal value--in design units */ - HBINT16 yCoordinate; /* Vertical value--in design units */ + FWORD xCoordinate; /* Horizontal value--in design units */ + FWORD yCoordinate; /* Vertical value--in design units */ HBUINT16 anchorPoint; /* Index to glyph contour point */ public: DEFINE_SIZE_STATIC (8); @@ -309,8 +309,8 @@ struct AnchorFormat3 protected: HBUINT16 format; /* Format identifier--format = 3 */ - HBINT16 xCoordinate; /* Horizontal value--in design units */ - HBINT16 yCoordinate; /* Vertical value--in design units */ + FWORD xCoordinate; /* Horizontal value--in design units */ + FWORD yCoordinate; /* Vertical value--in design units */ OffsetTo<Device> xDeviceTable; /* Offset to Device table for X * coordinate-- from beginning of @@ -1072,9 +1072,17 @@ struct MarkBasePosFormat1 skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); do { if (!skippy_iter.prev ()) return_trace (false); - /* We only want to attach to the first of a MultipleSubst sequence. Reject others. */ + /* We only want to attach to the first of a MultipleSubst sequence. + * https://github.com/harfbuzz/harfbuzz/issues/740 + * Reject others. */ if (!_hb_glyph_info_multiplied (&buffer->info[skippy_iter.idx]) || - 0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx])) + 0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) || + (skippy_iter.idx == 0 || + _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]) != + _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx - 1]) || + _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) != + _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx - 1]) + 1 + )) break; skippy_iter.reject (); } while (1); 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 263e0a6e102..5f67aed21ed 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 @@ -114,7 +114,7 @@ struct SingleSubstFormat1 OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - HBINT16 deltaGlyphID; /* Add to original GlyphID to get + HBINT16 deltaGlyphID; /* Add to original GlyphID to get * substitute GlyphID */ public: DEFINE_SIZE_STATIC (6); @@ -386,7 +386,7 @@ struct MultipleSubstFormat1 if (unlikely (!sequence[i].serialize (c, this).serialize (c, substitute_glyphs_list, substitute_len_list[i]))) return_trace (false); - substitute_len_list.advance (num_glyphs); + substitute_len_list += num_glyphs; if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false); return_trace (true); } @@ -536,7 +536,7 @@ struct AlternateSubstFormat1 if (unlikely (!alternateSet[i].serialize (c, this).serialize (c, alternate_glyphs_list, alternate_len_list[i]))) return_trace (false); - alternate_len_list.advance (num_glyphs); + alternate_len_list += num_glyphs; if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false); return_trace (true); } @@ -757,8 +757,8 @@ struct LigatureSet ligatures[i], component_list, component_count_list[i]))) return_trace (false); - ligatures.advance (num_ligatures); - component_count_list.advance (num_ligatures); + ligatures += num_ligatures; + component_count_list += num_ligatures; return_trace (true); } @@ -850,7 +850,7 @@ struct LigatureSubstFormat1 component_count_list, ligature_per_first_glyph_count_list[i], component_list))) return_trace (false); - ligature_per_first_glyph_count_list.advance (num_first_glyphs); + ligature_per_first_glyph_count_list += num_first_glyphs; if (unlikely (!coverage.serialize (c, this).serialize (c, first_glyphs, num_first_glyphs))) return_trace (false); return_trace (true); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh index 8a005f5a27a..90546344d69 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh @@ -1212,7 +1212,7 @@ struct Rule lookupCount.sanitize (c) && c->check_range (inputZ, inputZ[0].static_size * inputCount + - lookupRecordX[0].static_size * lookupCount)); + LookupRecord::static_size * lookupCount)); } protected: @@ -1222,10 +1222,10 @@ struct Rule HBUINT16 lookupCount; /* Number of LookupRecords */ HBUINT16 inputZ[VAR]; /* Array of match inputs--start with * second glyph */ - LookupRecord lookupRecordX[VAR]; /* Array of LookupRecords--in +/*LookupRecord lookupRecordX[VAR];*/ /* Array of LookupRecords--in * design order */ public: - DEFINE_SIZE_ARRAY2 (4, inputZ, lookupRecordX); + DEFINE_SIZE_ARRAY (4, inputZ); }; struct RuleSet @@ -1556,10 +1556,10 @@ struct ContextFormat3 OffsetTo<Coverage> coverageZ[VAR]; /* Array of offsets to Coverage * table in glyph sequence order */ - LookupRecord lookupRecordX[VAR]; /* Array of LookupRecords--in +/*LookupRecord lookupRecordX[VAR];*/ /* Array of LookupRecords--in * design order */ public: - DEFINE_SIZE_ARRAY2 (6, coverageZ, lookupRecordX); + DEFINE_SIZE_ARRAY (6, coverageZ); }; struct Context diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh index 60119629cf5..870ba73fa88 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh @@ -122,6 +122,9 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font, */ namespace OT { + struct BASE; + struct COLR; + struct CPAL; struct GDEF; struct GSUB; struct GPOS; @@ -131,7 +134,10 @@ namespace OT { } namespace AAT { + struct ankr; + struct kerx; struct morx; + struct trak; } struct hb_ot_layout_lookup_accelerator_t @@ -166,10 +172,16 @@ struct hb_ot_layout_t const struct OT::GPOS *gpos; /* TODO Move the following out of this struct. */ + OT::hb_lazy_table_loader_t<struct OT::BASE> base; + OT::hb_lazy_table_loader_t<struct OT::COLR> colr; + OT::hb_lazy_table_loader_t<struct OT::CPAL> cpal; OT::hb_lazy_table_loader_t<struct OT::MATH> math; OT::hb_lazy_table_loader_t<struct OT::fvar> fvar; OT::hb_lazy_table_loader_t<struct OT::avar> avar; + OT::hb_lazy_table_loader_t<struct AAT::ankr> ankr; + OT::hb_lazy_table_loader_t<struct AAT::kerx> kerx; OT::hb_lazy_table_loader_t<struct AAT::morx> morx; + OT::hb_lazy_table_loader_t<struct AAT::trak> trak; unsigned int gsub_lookup_count; unsigned int gpos_lookup_count; @@ -359,6 +371,28 @@ _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info) return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0; } + +/* Loop over grapheme. Based on foreach_cluster(). */ +#define foreach_grapheme(buffer, start, end) \ + for (unsigned int \ + _count = buffer->len, \ + start = 0, end = _count ? _next_grapheme (buffer, 0) : 0; \ + start < _count; \ + start = end, end = _next_grapheme (buffer, start)) + +static inline unsigned int +_next_grapheme (hb_buffer_t *buffer, unsigned int start) +{ + hb_glyph_info_t *info = buffer->info; + unsigned int count = buffer->len; + + while (++start < count && _hb_glyph_info_is_unicode_mark (&info[start])) + ; + + return start; +} + + #define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info))) static inline bool 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 919ecbb4b57..1c9e950b29a 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 @@ -31,16 +31,21 @@ #include "hb-open-type-private.hh" #include "hb-ot-layout-private.hh" +#include "hb-ot-layout-base-table.hh" #include "hb-ot-layout-gdef-table.hh" #include "hb-ot-layout-gsub-table.hh" #include "hb-ot-layout-gpos-table.hh" #include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise. #include "hb-ot-name-table.hh" // Just so we compile it; unused otherwise. +#include "hb-ot-color-colr-table.hh" +#include "hb-ot-color-cpal-table.hh" #include "hb-ot-map-private.hh" +#ifndef HB_NO_VISIBILITY const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; +#endif hb_ot_layout_t * @@ -59,10 +64,16 @@ _hb_ot_layout_create (hb_face_t *face) layout->gpos_blob = OT::Sanitizer<OT::GPOS>().sanitize (face->reference_table (HB_OT_TAG_GPOS)); layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob); + layout->base.init (face); + layout->colr.init (face); + layout->cpal.init (face); layout->math.init (face); layout->fvar.init (face); layout->avar.init (face); + layout->ankr.init (face); + layout->kerx.init (face); layout->morx.init (face); + layout->trak.init (face); { /* @@ -195,10 +206,12 @@ _hb_ot_layout_create (hb_face_t *face) void _hb_ot_layout_destroy (hb_ot_layout_t *layout) { - for (unsigned int i = 0; i < layout->gsub_lookup_count; i++) - layout->gsub_accels[i].fini (); - for (unsigned int i = 0; i < layout->gpos_lookup_count; i++) - layout->gpos_accels[i].fini (); + if (layout->gsub_accels) + for (unsigned int i = 0; i < layout->gsub_lookup_count; i++) + layout->gsub_accels[i].fini (); + if (layout->gpos_accels) + for (unsigned int i = 0; i < layout->gpos_lookup_count; i++) + layout->gpos_accels[i].fini (); free (layout->gsub_accels); free (layout->gpos_accels); @@ -207,14 +220,28 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout) hb_blob_destroy (layout->gsub_blob); hb_blob_destroy (layout->gpos_blob); + layout->base.fini (); + layout->colr.fini (); + layout->cpal.fini (); layout->math.fini (); layout->fvar.fini (); layout->avar.fini (); + layout->ankr.fini (); + layout->kerx.fini (); layout->morx.fini (); + layout->trak.fini (); free (layout); } +// static inline const OT::BASE& +// _get_base (hb_face_t *face) +// { +// if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::BASE); +// hb_ot_layout_t * layout = hb_ot_layout_from_face (face); +// return *(layout->base.get ()); +// } + static inline const OT::GDEF& _get_gdef (hb_face_t *face) { @@ -1253,10 +1280,34 @@ void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_ apply (proxy, plan, font, buffer); } -HB_INTERNAL void +void hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c, const OT::SubstLookup &lookup, const hb_ot_layout_lookup_accelerator_t &accel) { apply_string<GSUBProxy> (c, lookup, accel); } + + + + +/* + * OT::BASE + */ + +// /** +// * hb_ot_base_has_data: +// * @face: #hb_face_t to test +// * +// * This function allows to verify the presence of an OpenType BASE table on the +// * face. +// * +// * Return value: true if face has a BASE table, false otherwise +// * +// * Since: XXX +// **/ +// hb_bool_t +// hb_ot_base_has_data (hb_face_t *face) +// { +// return &_get_base (face) != &OT::Null(OT::BASE); +// } 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 9861f0fc7bb..85938ba123e 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 @@ -38,6 +38,7 @@ HB_BEGIN_DECLS +#define HB_OT_TAG_BASE HB_TAG('B','A','S','E') #define HB_OT_TAG_GDEF HB_TAG('G','D','E','F') #define HB_OT_TAG_GSUB HB_TAG('G','S','U','B') #define HB_OT_TAG_GPOS HB_TAG('G','P','O','S') @@ -316,6 +317,22 @@ hb_ot_layout_get_size_params (hb_face_t *face, unsigned int *range_end /* OUT. May be NULL */); +/* + * BASE + */ +#if 0 + +#define HB_OT_TAG_BASE_HANG HB_TAG('h','a','n','g') +#define HB_OT_TAG_BASE_ICFB HB_TAG('i','c','f','b') +#define HB_OT_TAG_BASE_ICFT HB_TAG('i','c','f','t') +#define HB_OT_TAG_BASE_IDEO HB_TAG('i','d','e','o') +#define HB_OT_TAG_BASE_IDTB HB_TAG('i','d','t','b') +#define HB_OT_TAG_BASE_MATH HB_TAG('m','a','t','h') +#define HB_OT_TAG_BASE_ROMN HB_TAG('r','o','m','n') + +#endif + + HB_END_DECLS #endif /* HB_OT_LAYOUT_H */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh index a80ac720fe1..e6bd8ea5ef3 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh @@ -84,28 +84,28 @@ struct hb_ot_map_t inline hb_mask_t get_global_mask (void) const { return global_mask; } inline hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = nullptr) const { - const feature_map_t *map = features.bsearch (&feature_tag); + const feature_map_t *map = features.bsearch (feature_tag); if (shift) *shift = map ? map->shift : 0; return map ? map->mask : 0; } inline bool needs_fallback (hb_tag_t feature_tag) const { - const feature_map_t *map = features.bsearch (&feature_tag); + const feature_map_t *map = features.bsearch (feature_tag); return map ? map->needs_fallback : false; } inline hb_mask_t get_1_mask (hb_tag_t feature_tag) const { - const feature_map_t *map = features.bsearch (&feature_tag); + const feature_map_t *map = features.bsearch (feature_tag); return map ? map->_1_mask : 0; } inline unsigned int get_feature_index (unsigned int table_index, hb_tag_t feature_tag) const { - const feature_map_t *map = features.bsearch (&feature_tag); + const feature_map_t *map = features.bsearch (feature_tag); return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX; } inline unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const { - const feature_map_t *map = features.bsearch (&feature_tag); + const feature_map_t *map = features.bsearch (feature_tag); return map ? map->stage[table_index] : (unsigned int) -1; } 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 6f07a7e2281..54b0ce377d7 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 @@ -139,7 +139,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, { static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), ""); unsigned int global_bit_mask = HB_GLYPH_FLAG_DEFINED + 1; - unsigned int global_bit_shift = _hb_popcount32 (HB_GLYPH_FLAG_DEFINED); + unsigned int global_bit_shift = _hb_popcount (HB_GLYPH_FLAG_DEFINED); m.global_mask = global_bit_mask; 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 54b4f11ce65..881dedad54c 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 @@ -28,7 +28,7 @@ #define HB_OT_MAXP_TABLE_HH #include "hb-open-type-private.hh" - +#include "hb-subset-plan.hh" namespace OT { @@ -39,28 +39,104 @@ namespace OT { #define HB_OT_TAG_maxp HB_TAG('m','a','x','p') +struct maxpV1Tail +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + HBUINT16 maxPoints; /* Maximum points in a non-composite glyph. */ + HBUINT16 maxContours; /* Maximum contours in a non-composite glyph. */ + HBUINT16 maxCompositePoints; /* Maximum points in a composite glyph. */ + HBUINT16 maxCompositeContours; /* Maximum contours in a composite glyph. */ + HBUINT16 maxZones; /* 1 if instructions do not use the twilight zone (Z0), + * or 2 if instructions do use Z0; should be set to 2 in + * most cases. */ + HBUINT16 maxTwilightPoints; /* Maximum points used in Z0. */ + HBUINT16 maxStorage; /* Number of Storage Area locations. */ + HBUINT16 maxFunctionDefs; /* Number of FDEFs, equal to the highest function number + 1. */ + HBUINT16 maxInstructionDefs; /* Number of IDEFs. */ + HBUINT16 maxStackElements; /* Maximum stack depth. (This includes Font and CVT + * Programs, as well as the instructions for each glyph.) */ + HBUINT16 maxSizeOfInstructions; /* Maximum byte count for glyph instructions. */ + HBUINT16 maxComponentElements; /* Maximum number of components referenced at + * "top level" for any composite glyph. */ + HBUINT16 maxComponentDepth; /* Maximum levels of recursion; 1 for simple components. */ + public: + DEFINE_SIZE_STATIC (26); +}; + + struct maxp { - static const hb_tag_t tableTag = HB_OT_TAG_maxp; + static const hb_tag_t tableTag = HB_OT_TAG_maxp; inline unsigned int get_num_glyphs (void) const { return numGlyphs; } + inline void set_num_glyphs (unsigned int count) + { + numGlyphs.set (count); + } + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - likely (version.major == 1 || - (version.major == 0 && version.minor == 0x5000u))); + if (unlikely (!c->check_struct (this))) + return_trace (false); + + if (version.major == 1) + { + const maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*this); + return v1.sanitize (c); + } + return_trace (likely (version.major == 0 && version.minor == 0x5000u)); + } + + inline bool subset (hb_subset_plan_t *plan) const + { + hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_maxp)); + hb_blob_t *maxp_prime_blob = hb_blob_copy_writable_or_fail (maxp_blob); + hb_blob_destroy (maxp_blob); + + if (unlikely (!maxp_prime_blob)) { + return false; + } + OT::maxp *maxp_prime = (OT::maxp *) hb_blob_get_data (maxp_prime_blob, nullptr); + + maxp_prime->set_num_glyphs (plan->gids_to_retain_sorted.len); + if (plan->drop_hints) + drop_hint_fields (plan, maxp_prime); + + bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_maxp, maxp_prime_blob); + hb_blob_destroy (maxp_prime_blob); + return result; + } + + static inline void drop_hint_fields (hb_subset_plan_t *plan, OT::maxp *maxp_prime) + { + if (maxp_prime->version.major == 1) + { + maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*maxp_prime); + v1.maxZones.set (1); + v1.maxTwilightPoints.set (0); + v1.maxStorage.set (0); + v1.maxFunctionDefs.set (0); + v1.maxInstructionDefs.set (0); + v1.maxStackElements.set (0); + v1.maxSizeOfInstructions.set (0); + } } - /* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */ protected: FixedVersion<>version; /* Version of the maxp table (0.5 or 1.0), * 0x00005000u or 0x00010000u. */ HBUINT16 numGlyphs; /* The number of glyphs in the font. */ +/*maxpV1Tail v1Tail[VAR]; */ public: DEFINE_SIZE_STATIC (6); }; 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 5bed47013ea..6cb8d494958 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 @@ -28,7 +28,7 @@ #define HB_OT_OS2_TABLE_HH #include "hb-open-type-private.hh" - +#include "hb-ot-os2-unicode-ranges.hh" namespace OT { @@ -49,51 +49,127 @@ struct os2 return_trace (c->check_struct (this)); } + inline bool subset (hb_subset_plan_t *plan) const + { + hb_blob_t *os2_blob = OT::Sanitizer<OT::os2>().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_os2)); + hb_blob_t *os2_prime_blob = hb_blob_create_sub_blob (os2_blob, 0, -1); + // TODO(grieger): move to hb_blob_copy_writable_or_fail + hb_blob_destroy (os2_blob); + + OT::os2 *os2_prime = (OT::os2 *) hb_blob_get_data_writable (os2_prime_blob, nullptr); + if (unlikely (!os2_prime)) { + hb_blob_destroy (os2_prime_blob); + return false; + } + + uint16_t min_cp, max_cp; + find_min_and_max_codepoint (plan->codepoints, &min_cp, &max_cp); + os2_prime->usFirstCharIndex.set (min_cp); + os2_prime->usLastCharIndex.set (max_cp); + + _update_unicode_ranges (plan->codepoints, os2_prime->ulUnicodeRange); + bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_os2, os2_prime_blob); + + hb_blob_destroy (os2_prime_blob); + return result; + } + + inline void _update_unicode_ranges (const hb_prealloced_array_t<hb_codepoint_t> &codepoints, + HBUINT32 ulUnicodeRange[4]) const + { + for (unsigned int i = 0; i < 4; i++) + ulUnicodeRange[i].set (0); + + for (unsigned int i = 0; i < codepoints.len; i++) + { + hb_codepoint_t cp = codepoints[i]; + unsigned int bit = hb_get_unicode_range_bit (cp); + if (bit < 128) + { + unsigned int block = bit / 32; + unsigned int bit_in_block = bit % 32; + unsigned int mask = 1 << bit_in_block; + ulUnicodeRange[block].set (ulUnicodeRange[block] | mask); + } + if (cp >= 0x10000 && cp <= 0x110000) + { + /* the spec says that bit 57 ("Non Plane 0") implies that there's + at least one codepoint beyond the BMP; so I also include all + the non-BMP codepoints here */ + ulUnicodeRange[1].set (ulUnicodeRange[1] | (1 << 25)); + } + } + } + + static inline void find_min_and_max_codepoint (const hb_prealloced_array_t<hb_codepoint_t> &codepoints, + uint16_t *min_cp, /* OUT */ + uint16_t *max_cp /* OUT */) + { + hb_codepoint_t min = -1, max = 0; + + for (unsigned int i = 0; i < codepoints.len; i++) + { + hb_codepoint_t cp = codepoints[i]; + if (cp < min) + min = cp; + if (cp > max) + max = cp; + } + + if (min > 0xFFFF) + min = 0xFFFF; + if (max > 0xFFFF) + max = 0xFFFF; + + *min_cp = min; + *max_cp = max; + } + public: HBUINT16 version; /* Version 0 */ - HBINT16 xAvgCharWidth; + HBINT16 xAvgCharWidth; HBUINT16 usWeightClass; HBUINT16 usWidthClass; HBUINT16 fsType; - HBINT16 ySubscriptXSize; - HBINT16 ySubscriptYSize; - HBINT16 ySubscriptXOffset; - HBINT16 ySubscriptYOffset; - HBINT16 ySuperscriptXSize; - HBINT16 ySuperscriptYSize; - HBINT16 ySuperscriptXOffset; - HBINT16 ySuperscriptYOffset; - HBINT16 yStrikeoutSize; - HBINT16 yStrikeoutPosition; - HBINT16 sFamilyClass; - HBUINT8 panose[10]; - HBUINT32 ulUnicodeRange[4]; + HBINT16 ySubscriptXSize; + HBINT16 ySubscriptYSize; + HBINT16 ySubscriptXOffset; + HBINT16 ySubscriptYOffset; + HBINT16 ySuperscriptXSize; + HBINT16 ySuperscriptYSize; + HBINT16 ySuperscriptXOffset; + HBINT16 ySuperscriptYOffset; + HBINT16 yStrikeoutSize; + HBINT16 yStrikeoutPosition; + HBINT16 sFamilyClass; + HBUINT8 panose[10]; + HBUINT32 ulUnicodeRange[4]; Tag achVendID; HBUINT16 fsSelection; HBUINT16 usFirstCharIndex; HBUINT16 usLastCharIndex; - HBINT16 sTypoAscender; - HBINT16 sTypoDescender; - HBINT16 sTypoLineGap; + HBINT16 sTypoAscender; + HBINT16 sTypoDescender; + HBINT16 sTypoLineGap; HBUINT16 usWinAscent; HBUINT16 usWinDescent; /* Version 1 */ - //HBUINT32 ulCodePageRange1; - //HBUINT32 ulCodePageRange2; + //HBUINT32 ulCodePageRange1; + //HBUINT32 ulCodePageRange2; /* Version 2 */ - //HBINT16 sxHeight; - //HBINT16 sCapHeight; - //HBUINT16 usDefaultChar; - //HBUINT16 usBreakChar; - //HBUINT16 usMaxContext; + //HBINT16 sxHeight; + //HBINT16 sCapHeight; + //HBUINT16 usDefaultChar; + //HBUINT16 usBreakChar; + //HBUINT16 usMaxContext; /* Version 5 */ - //HBUINT16 usLowerOpticalPointSize; - //HBUINT16 usUpperOpticalPointSize; + //HBUINT16 usLowerOpticalPointSize; + //HBUINT16 usUpperOpticalPointSize; public: DEFINE_SIZE_STATIC (78); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh new file mode 100644 index 00000000000..2cf168f9c55 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh @@ -0,0 +1,247 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef HB_OT_OS2_UNICODE_RANGES_HH +#define HB_OT_OS2_UNICODE_RANGES_HH + +#include "hb-private.hh" +#include "hb-dsalgs.hh" + +namespace OT { + +struct Range { + hb_codepoint_t start; + hb_codepoint_t end; + unsigned int bit; +}; + +/* Note: The contents of this array was generated using src/gen-unicode-ranges.py. */ +static Range os2UnicodeRangesSorted[] = +{ + { 0x0, 0x7F, 0}, // Basic Latin + { 0x80, 0xFF, 1}, // Latin-1 Supplement + { 0x100, 0x17F, 2}, // Latin Extended-A + { 0x180, 0x24F, 3}, // Latin Extended-B + { 0x250, 0x2AF, 4}, // IPA Extensions + { 0x2B0, 0x2FF, 5}, // Spacing Modifier Letters + { 0x300, 0x36F, 6}, // Combining Diacritical Marks + { 0x370, 0x3FF, 7}, // Greek and Coptic + { 0x400, 0x4FF, 9}, // Cyrillic + { 0x500, 0x52F, 9}, // Cyrillic Supplement + { 0x530, 0x58F, 10}, // Armenian + { 0x590, 0x5FF, 11}, // Hebrew + { 0x600, 0x6FF, 13}, // Arabic + { 0x700, 0x74F, 71}, // Syriac + { 0x750, 0x77F, 13}, // Arabic Supplement + { 0x780, 0x7BF, 72}, // Thaana + { 0x7C0, 0x7FF, 14}, // NKo + { 0x900, 0x97F, 15}, // Devanagari + { 0x980, 0x9FF, 16}, // Bengali + { 0xA00, 0xA7F, 17}, // Gurmukhi + { 0xA80, 0xAFF, 18}, // Gujarati + { 0xB00, 0xB7F, 19}, // Oriya + { 0xB80, 0xBFF, 20}, // Tamil + { 0xC00, 0xC7F, 21}, // Telugu + { 0xC80, 0xCFF, 22}, // Kannada + { 0xD00, 0xD7F, 23}, // Malayalam + { 0xD80, 0xDFF, 73}, // Sinhala + { 0xE00, 0xE7F, 24}, // Thai + { 0xE80, 0xEFF, 25}, // Lao + { 0xF00, 0xFFF, 70}, // Tibetan + { 0x1000, 0x109F, 74}, // Myanmar + { 0x10A0, 0x10FF, 26}, // Georgian + { 0x1100, 0x11FF, 28}, // Hangul Jamo + { 0x1200, 0x137F, 75}, // Ethiopic + { 0x1380, 0x139F, 75}, // Ethiopic Supplement + { 0x13A0, 0x13FF, 76}, // Cherokee + { 0x1400, 0x167F, 77}, // Unified Canadian Aboriginal Syllabics + { 0x1680, 0x169F, 78}, // Ogham + { 0x16A0, 0x16FF, 79}, // Runic + { 0x1700, 0x171F, 84}, // Tagalog + { 0x1720, 0x173F, 84}, // Hanunoo + { 0x1740, 0x175F, 84}, // Buhid + { 0x1760, 0x177F, 84}, // Tagbanwa + { 0x1780, 0x17FF, 80}, // Khmer + { 0x1800, 0x18AF, 81}, // Mongolian + { 0x1900, 0x194F, 93}, // Limbu + { 0x1950, 0x197F, 94}, // Tai Le + { 0x1980, 0x19DF, 95}, // New Tai Lue + { 0x19E0, 0x19FF, 80}, // Khmer Symbols + { 0x1A00, 0x1A1F, 96}, // Buginese + { 0x1B00, 0x1B7F, 27}, // Balinese + { 0x1B80, 0x1BBF, 112}, // Sundanese + { 0x1C00, 0x1C4F, 113}, // Lepcha + { 0x1C50, 0x1C7F, 114}, // Ol Chiki + { 0x1D00, 0x1D7F, 4}, // Phonetic Extensions + { 0x1D80, 0x1DBF, 4}, // Phonetic Extensions Supplement + { 0x1DC0, 0x1DFF, 6}, // Combining Diacritical Marks Supplement + { 0x1E00, 0x1EFF, 29}, // Latin Extended Additional + { 0x1F00, 0x1FFF, 30}, // Greek Extended + { 0x2000, 0x206F, 31}, // General Punctuation + { 0x2070, 0x209F, 32}, // Superscripts And Subscripts + { 0x20A0, 0x20CF, 33}, // Currency Symbols + { 0x20D0, 0x20FF, 34}, // Combining Diacritical Marks For Symbols + { 0x2100, 0x214F, 35}, // Letterlike Symbols + { 0x2150, 0x218F, 36}, // Number Forms + { 0x2190, 0x21FF, 37}, // Arrows + { 0x2200, 0x22FF, 38}, // Mathematical Operators + { 0x2300, 0x23FF, 39}, // Miscellaneous Technical + { 0x2400, 0x243F, 40}, // Control Pictures + { 0x2440, 0x245F, 41}, // Optical Character Recognition + { 0x2460, 0x24FF, 42}, // Enclosed Alphanumerics + { 0x2500, 0x257F, 43}, // Box Drawing + { 0x2580, 0x259F, 44}, // Block Elements + { 0x25A0, 0x25FF, 45}, // Geometric Shapes + { 0x2600, 0x26FF, 46}, // Miscellaneous Symbols + { 0x2700, 0x27BF, 47}, // Dingbats + { 0x27C0, 0x27EF, 38}, // Miscellaneous Mathematical Symbols-A + { 0x27F0, 0x27FF, 37}, // Supplemental Arrows-A + { 0x2800, 0x28FF, 82}, // Braille Patterns + { 0x2900, 0x297F, 37}, // Supplemental Arrows-B + { 0x2980, 0x29FF, 38}, // Miscellaneous Mathematical Symbols-B + { 0x2A00, 0x2AFF, 38}, // Supplemental Mathematical Operators + { 0x2B00, 0x2BFF, 37}, // Miscellaneous Symbols and Arrows + { 0x2C00, 0x2C5F, 97}, // Glagolitic + { 0x2C60, 0x2C7F, 29}, // Latin Extended-C + { 0x2C80, 0x2CFF, 8}, // Coptic + { 0x2D00, 0x2D2F, 26}, // Georgian Supplement + { 0x2D30, 0x2D7F, 98}, // Tifinagh + { 0x2D80, 0x2DDF, 75}, // Ethiopic Extended + { 0x2DE0, 0x2DFF, 9}, // Cyrillic Extended-A + { 0x2E00, 0x2E7F, 31}, // Supplemental Punctuation + { 0x2E80, 0x2EFF, 59}, // CJK Radicals Supplement + { 0x2F00, 0x2FDF, 59}, // Kangxi Radicals + { 0x2FF0, 0x2FFF, 59}, // Ideographic Description Characters + { 0x3000, 0x303F, 48}, // CJK Symbols And Punctuation + { 0x3040, 0x309F, 49}, // Hiragana + { 0x30A0, 0x30FF, 50}, // Katakana + { 0x3100, 0x312F, 51}, // Bopomofo + { 0x3130, 0x318F, 52}, // Hangul Compatibility Jamo + { 0x3190, 0x319F, 59}, // Kanbun + { 0x31A0, 0x31BF, 51}, // Bopomofo Extended + { 0x31C0, 0x31EF, 61}, // CJK Strokes + { 0x31F0, 0x31FF, 50}, // Katakana Phonetic Extensions + { 0x3200, 0x32FF, 54}, // Enclosed CJK Letters And Months + { 0x3300, 0x33FF, 55}, // CJK Compatibility + { 0x3400, 0x4DBF, 59}, // CJK Unified Ideographs Extension A + { 0x4DC0, 0x4DFF, 99}, // Yijing Hexagram Symbols + { 0x4E00, 0x9FFF, 59}, // CJK Unified Ideographs + { 0xA000, 0xA48F, 83}, // Yi Syllables + { 0xA490, 0xA4CF, 83}, // Yi Radicals + { 0xA500, 0xA63F, 12}, // Vai + { 0xA640, 0xA69F, 9}, // Cyrillic Extended-B + { 0xA700, 0xA71F, 5}, // Modifier Tone Letters + { 0xA720, 0xA7FF, 29}, // Latin Extended-D + { 0xA800, 0xA82F, 100}, // Syloti Nagri + { 0xA840, 0xA87F, 53}, // Phags-pa + { 0xA880, 0xA8DF, 115}, // Saurashtra + { 0xA900, 0xA92F, 116}, // Kayah Li + { 0xA930, 0xA95F, 117}, // Rejang + { 0xAA00, 0xAA5F, 118}, // Cham + { 0xAC00, 0xD7AF, 56}, // Hangul Syllables + { 0xD800, 0xDFFF, 57}, // Non-Plane 0 * + { 0xE000, 0xF8FF, 60}, // Private Use Area (plane 0) + { 0xF900, 0xFAFF, 61}, // CJK Compatibility Ideographs + { 0xFB00, 0xFB4F, 62}, // Alphabetic Presentation Forms + { 0xFB50, 0xFDFF, 63}, // Arabic Presentation Forms-A + { 0xFE00, 0xFE0F, 91}, // Variation Selectors + { 0xFE10, 0xFE1F, 65}, // Vertical Forms + { 0xFE20, 0xFE2F, 64}, // Combining Half Marks + { 0xFE30, 0xFE4F, 65}, // CJK Compatibility Forms + { 0xFE50, 0xFE6F, 66}, // Small Form Variants + { 0xFE70, 0xFEFF, 67}, // Arabic Presentation Forms-B + { 0xFF00, 0xFFEF, 68}, // Halfwidth And Fullwidth Forms + { 0xFFF0, 0xFFFF, 69}, // Specials + { 0x10000, 0x1007F, 101}, // Linear B Syllabary + { 0x10080, 0x100FF, 101}, // Linear B Ideograms + { 0x10100, 0x1013F, 101}, // Aegean Numbers + { 0x10140, 0x1018F, 102}, // Ancient Greek Numbers + { 0x10190, 0x101CF, 119}, // Ancient Symbols + { 0x101D0, 0x101FF, 120}, // Phaistos Disc + { 0x10280, 0x1029F, 121}, // Lycian + { 0x102A0, 0x102DF, 121}, // Carian + { 0x10300, 0x1032F, 85}, // Old Italic + { 0x10330, 0x1034F, 86}, // Gothic + { 0x10380, 0x1039F, 103}, // Ugaritic + { 0x103A0, 0x103DF, 104}, // Old Persian + { 0x10400, 0x1044F, 87}, // Deseret + { 0x10450, 0x1047F, 105}, // Shavian + { 0x10480, 0x104AF, 106}, // Osmanya + { 0x10800, 0x1083F, 107}, // Cypriot Syllabary + { 0x10900, 0x1091F, 58}, // Phoenician + { 0x10920, 0x1093F, 121}, // Lydian + { 0x10A00, 0x10A5F, 108}, // Kharoshthi + { 0x12000, 0x123FF, 110}, // Cuneiform + { 0x12400, 0x1247F, 110}, // Cuneiform Numbers and Punctuation + { 0x1D000, 0x1D0FF, 88}, // Byzantine Musical Symbols + { 0x1D100, 0x1D1FF, 88}, // Musical Symbols + { 0x1D200, 0x1D24F, 88}, // Ancient Greek Musical Notation + { 0x1D300, 0x1D35F, 109}, // Tai Xuan Jing Symbols + { 0x1D360, 0x1D37F, 111}, // Counting Rod Numerals + { 0x1D400, 0x1D7FF, 89}, // Mathematical Alphanumeric Symbols + { 0x1F000, 0x1F02F, 122}, // Mahjong Tiles + { 0x1F030, 0x1F09F, 122}, // Domino Tiles + { 0x20000, 0x2A6DF, 59}, // CJK Unified Ideographs Extension B + { 0x2F800, 0x2FA1F, 61}, // CJK Compatibility Ideographs Supplement + { 0xE0000, 0xE007F, 92}, // Tags + { 0xE0100, 0xE01EF, 91}, // Variation Selectors Supplement + { 0xF0000, 0xFFFFD, 90}, // Private Use (plane 15) + {0x100000, 0x10FFFD, 90}, // Private Use (plane 16) +}; + +static int +_compare_range (const void *_key, const void *_item, void *_arg) +{ + hb_codepoint_t cp = *((hb_codepoint_t *) _key); + const Range *range = (Range *) _item; + + if (cp < range->start) + return -1; + else if (cp <= range->end) + return 0; + else + return 1; +} + +/** + * hb_get_unicode_range_bit: + * Returns the bit to be set in os/2 ulUnicodeRange for a given codepoint. + **/ +static unsigned int +hb_get_unicode_range_bit (hb_codepoint_t cp) +{ + Range *range = (Range*) hb_bsearch_r (&cp, os2UnicodeRangesSorted, + sizeof (os2UnicodeRangesSorted) / sizeof(Range), + sizeof(Range), + _compare_range, nullptr); + if (range != NULL) + return range->bit; + return -1; +} + +} /* namespace OT */ + +#endif /* HB_OT_OS2_UNICODE_RANGES_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh index a64e9d03919..867b936278b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh @@ -34,6 +34,11 @@ #include "hb-ot-shape-private.hh" /* XXX Remove */ +/* buffer var allocations */ +#define indic_category() complex_var_u8_0() /* indic_category_t */ +#define indic_position() complex_var_u8_1() /* indic_position_t */ + + #define INDIC_TABLE_ELEMENT_TYPE uint16_t /* Cateories used in the OpenType spec: @@ -77,29 +82,29 @@ enum indic_category_t { /* Visual positions in a syllable from left to right. */ enum indic_position_t { - POS_START, + POS_START = 0, - POS_RA_TO_BECOME_REPH, - POS_PRE_M, - POS_PRE_C, + POS_RA_TO_BECOME_REPH = 1, + POS_PRE_M = 2, + POS_PRE_C = 3, - POS_BASE_C, - POS_AFTER_MAIN, + POS_BASE_C = 4, + POS_AFTER_MAIN = 5, - POS_ABOVE_C, + POS_ABOVE_C = 6, - POS_BEFORE_SUB, - POS_BELOW_C, - POS_AFTER_SUB, + POS_BEFORE_SUB = 7, + POS_BELOW_C = 8, + POS_AFTER_SUB = 9, - POS_BEFORE_POST, - POS_POST_C, - POS_AFTER_POST, + POS_BEFORE_POST = 10, + POS_POST_C = 11, + POS_AFTER_POST = 12, - POS_FINAL_C, - POS_SMVD, + POS_FINAL_C = 13, + POS_SMVD = 14, - POS_END + POS_END = 15 }; /* Categories used in IndicSyllabicCategory.txt from UCD. */ @@ -186,4 +191,211 @@ enum indic_matra_category_t { HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE hb_indic_get_categories (hb_codepoint_t u); + +static inline bool +is_one_of (const hb_glyph_info_t &info, unsigned int flags) +{ + /* If it ligated, all bets are off. */ + if (_hb_glyph_info_ligated (&info)) return false; + return !!(FLAG_UNSAFE (info.indic_category()) & flags); +} + +static inline bool +is_joiner (const hb_glyph_info_t &info) +{ + return is_one_of (info, JOINER_FLAGS); +} + +static inline bool +is_consonant (const hb_glyph_info_t &info) +{ + return is_one_of (info, CONSONANT_FLAGS); +} + +static inline bool +is_halant (const hb_glyph_info_t &info) +{ + return is_one_of (info, FLAG (OT_H)); +} + +#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base)) + +#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u)) +#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u)) +#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u)) +#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u)) +#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u)) +#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u)) +#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u)) +#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u)) +#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u)) +#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u)) + + +#define MATRA_POS_LEFT(u) POS_PRE_M +#define MATRA_POS_RIGHT(u) ( \ + IS_DEVA(u) ? POS_AFTER_SUB : \ + IS_BENG(u) ? POS_AFTER_POST : \ + IS_GURU(u) ? POS_AFTER_POST : \ + IS_GUJR(u) ? POS_AFTER_POST : \ + IS_ORYA(u) ? POS_AFTER_POST : \ + IS_TAML(u) ? POS_AFTER_POST : \ + IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \ + IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \ + IS_MLYM(u) ? POS_AFTER_POST : \ + IS_SINH(u) ? POS_AFTER_SUB : \ + /*default*/ POS_AFTER_SUB \ + ) +#define MATRA_POS_TOP(u) ( /* BENG and MLYM don't have top matras. */ \ + IS_DEVA(u) ? POS_AFTER_SUB : \ + IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \ + IS_GUJR(u) ? POS_AFTER_SUB : \ + IS_ORYA(u) ? POS_AFTER_MAIN : \ + IS_TAML(u) ? POS_AFTER_SUB : \ + IS_TELU(u) ? POS_BEFORE_SUB : \ + IS_KNDA(u) ? POS_BEFORE_SUB : \ + IS_SINH(u) ? POS_AFTER_SUB : \ + /*default*/ POS_AFTER_SUB \ + ) +#define MATRA_POS_BOTTOM(u) ( \ + IS_DEVA(u) ? POS_AFTER_SUB : \ + IS_BENG(u) ? POS_AFTER_SUB : \ + IS_GURU(u) ? POS_AFTER_POST : \ + IS_GUJR(u) ? POS_AFTER_POST : \ + IS_ORYA(u) ? POS_AFTER_SUB : \ + IS_TAML(u) ? POS_AFTER_POST : \ + IS_TELU(u) ? POS_BEFORE_SUB : \ + IS_KNDA(u) ? POS_BEFORE_SUB : \ + IS_MLYM(u) ? POS_AFTER_POST : \ + IS_SINH(u) ? POS_AFTER_SUB : \ + /*default*/ POS_AFTER_SUB \ + ) + +static inline indic_position_t +matra_position_indic (hb_codepoint_t u, indic_position_t side) +{ + switch ((int) side) + { + case POS_PRE_C: return MATRA_POS_LEFT (u); + case POS_POST_C: return MATRA_POS_RIGHT (u); + case POS_ABOVE_C: return MATRA_POS_TOP (u); + case POS_BELOW_C: return MATRA_POS_BOTTOM (u); + }; + return side; +} + +/* XXX + * This is a hack for now. We should move this data into the main Indic table. + * Or completely remove it and just check in the tables. + */ +static const hb_codepoint_t ra_chars[] = { + 0x0930u, /* Devanagari */ + 0x09B0u, /* Bengali */ + 0x09F0u, /* Bengali */ + 0x0A30u, /* Gurmukhi */ /* No Reph */ + 0x0AB0u, /* Gujarati */ + 0x0B30u, /* Oriya */ + 0x0BB0u, /* Tamil */ /* No Reph */ + 0x0C30u, /* Telugu */ /* Reph formed only with ZWJ */ + 0x0CB0u, /* Kannada */ + 0x0D30u, /* Malayalam */ /* No Reph, Logical Repha */ + + 0x0DBBu, /* Sinhala */ /* Reph formed only with ZWJ */ +}; + +static inline bool +is_ra (hb_codepoint_t u) +{ + for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++) + if (u == ra_chars[i]) + return true; + return false; +} + +static inline void +set_indic_properties (hb_glyph_info_t &info) +{ + hb_codepoint_t u = info.codepoint; + unsigned int type = hb_indic_get_categories (u); + indic_category_t cat = (indic_category_t) (type & 0x7Fu); + indic_position_t pos = (indic_position_t) (type >> 8); + + + /* + * Re-assign category + */ + + /* The following act more like the Bindus. */ + if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u))) + cat = OT_SM; + /* The following act like consonants. */ + else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u, + 0x1CF5u, 0x1CF6u))) + cat = OT_C; + /* TODO: The following should only be allowed after a Visarga. + * For now, just treat them like regular tone marks. */ + else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u))) + cat = OT_A; + /* TODO: The following should only be allowed after some of + * the nasalization marks, maybe only for U+1CE9..U+1CF1. + * For now, just treat them like tone marks. */ + else if (unlikely (u == 0x1CEDu)) + cat = OT_A; + /* The following take marks in standalone clusters, similar to Avagraha. */ + else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u, + 0x1CE9u, 0x1CECu, + 0x1CEEu, 0x1CF1u))) + { + cat = OT_Symbol; + static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), ""); + } + else if (unlikely (u == 0x0A51u)) + { + /* https://github.com/harfbuzz/harfbuzz/issues/524 */ + cat = OT_M; + pos = POS_BELOW_C; + } + + /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil, + * so the Indic shaper needs to know their categories. */ + else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM; + else if (unlikely (u == 0x1133cu)) cat = OT_N; + + else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */ + + else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */ + else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */ + else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) + cat = OT_PLACEHOLDER; + else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE; + + + /* + * Re-assign position. + */ + + if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS)) + { + pos = POS_BASE_C; + if (is_ra (u)) + cat = OT_Ra; + } + else if (cat == OT_M) + { + pos = matra_position_indic (u, pos); + } + else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol)))) + { + pos = POS_SMVD; + } + + if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */ + + + + info.indic_category() = cat; + info.indic_position() = pos; +} + + #endif /* HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH */ 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 9d150e0d3c1..32ad86a5f32 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 @@ -27,226 +27,12 @@ #include "hb-ot-shape-complex-indic-private.hh" #include "hb-ot-layout-private.hh" -/* buffer var allocations */ -#define indic_category() complex_var_u8_0() /* indic_category_t */ -#define indic_position() complex_var_u8_1() /* indic_position_t */ - /* * Indic shaper. */ -#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base)) - -#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u)) -#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u)) -#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u)) -#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u)) -#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u)) -#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u)) -#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u)) -#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u)) -#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u)) -#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u)) - - -#define MATRA_POS_LEFT(u) POS_PRE_M -#define MATRA_POS_RIGHT(u) ( \ - IS_DEVA(u) ? POS_AFTER_SUB : \ - IS_BENG(u) ? POS_AFTER_POST : \ - IS_GURU(u) ? POS_AFTER_POST : \ - IS_GUJR(u) ? POS_AFTER_POST : \ - IS_ORYA(u) ? POS_AFTER_POST : \ - IS_TAML(u) ? POS_AFTER_POST : \ - IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \ - IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \ - IS_MLYM(u) ? POS_AFTER_POST : \ - IS_SINH(u) ? POS_AFTER_SUB : \ - /*default*/ POS_AFTER_SUB \ - ) -#define MATRA_POS_TOP(u) ( /* BENG and MLYM don't have top matras. */ \ - IS_DEVA(u) ? POS_AFTER_SUB : \ - IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \ - IS_GUJR(u) ? POS_AFTER_SUB : \ - IS_ORYA(u) ? POS_AFTER_MAIN : \ - IS_TAML(u) ? POS_AFTER_SUB : \ - IS_TELU(u) ? POS_BEFORE_SUB : \ - IS_KNDA(u) ? POS_BEFORE_SUB : \ - IS_SINH(u) ? POS_AFTER_SUB : \ - /*default*/ POS_AFTER_SUB \ - ) -#define MATRA_POS_BOTTOM(u) ( \ - IS_DEVA(u) ? POS_AFTER_SUB : \ - IS_BENG(u) ? POS_AFTER_SUB : \ - IS_GURU(u) ? POS_AFTER_POST : \ - IS_GUJR(u) ? POS_AFTER_POST : \ - IS_ORYA(u) ? POS_AFTER_SUB : \ - IS_TAML(u) ? POS_AFTER_POST : \ - IS_TELU(u) ? POS_BEFORE_SUB : \ - IS_KNDA(u) ? POS_BEFORE_SUB : \ - IS_MLYM(u) ? POS_AFTER_POST : \ - IS_SINH(u) ? POS_AFTER_SUB : \ - /*default*/ POS_AFTER_SUB \ - ) - -static inline indic_position_t -matra_position (hb_codepoint_t u, indic_position_t side) -{ - switch ((int) side) - { - case POS_PRE_C: return MATRA_POS_LEFT (u); - case POS_POST_C: return MATRA_POS_RIGHT (u); - case POS_ABOVE_C: return MATRA_POS_TOP (u); - case POS_BELOW_C: return MATRA_POS_BOTTOM (u); - }; - return side; -} - -/* XXX - * This is a hack for now. We should move this data into the main Indic table. - * Or completely remove it and just check in the tables. - */ -static const hb_codepoint_t ra_chars[] = { - 0x0930u, /* Devanagari */ - 0x09B0u, /* Bengali */ - 0x09F0u, /* Bengali */ - 0x0A30u, /* Gurmukhi */ /* No Reph */ - 0x0AB0u, /* Gujarati */ - 0x0B30u, /* Oriya */ - 0x0BB0u, /* Tamil */ /* No Reph */ - 0x0C30u, /* Telugu */ /* Reph formed only with ZWJ */ - 0x0CB0u, /* Kannada */ - 0x0D30u, /* Malayalam */ /* No Reph, Logical Repha */ - - 0x0DBBu, /* Sinhala */ /* Reph formed only with ZWJ */ -}; - -static inline bool -is_ra (hb_codepoint_t u) -{ - for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++) - if (u == ra_chars[i]) - return true; - return false; -} - -static inline bool -is_one_of (const hb_glyph_info_t &info, unsigned int flags) -{ - /* If it ligated, all bets are off. */ - if (_hb_glyph_info_ligated (&info)) return false; - return !!(FLAG_UNSAFE (info.indic_category()) & flags); -} - -static inline bool -is_joiner (const hb_glyph_info_t &info) -{ - return is_one_of (info, JOINER_FLAGS); -} - -static inline bool -is_consonant (const hb_glyph_info_t &info) -{ - return is_one_of (info, CONSONANT_FLAGS); -} - -static inline bool -is_halant (const hb_glyph_info_t &info) -{ - return is_one_of (info, FLAG (OT_H)); -} - -static inline void -set_indic_properties (hb_glyph_info_t &info) -{ - hb_codepoint_t u = info.codepoint; - unsigned int type = hb_indic_get_categories (u); - indic_category_t cat = (indic_category_t) (type & 0x7Fu); - indic_position_t pos = (indic_position_t) (type >> 8); - - - /* - * Re-assign category - */ - - /* The following act more like the Bindus. */ - if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u))) - cat = OT_SM; - /* The following act like consonants. */ - else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u, - 0x1CF5u, 0x1CF6u))) - cat = OT_C; - /* TODO: The following should only be allowed after a Visarga. - * For now, just treat them like regular tone marks. */ - else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u))) - cat = OT_A; - /* TODO: The following should only be allowed after some of - * the nasalization marks, maybe only for U+1CE9..U+1CF1. - * For now, just treat them like tone marks. */ - else if (unlikely (u == 0x1CEDu)) - cat = OT_A; - /* The following take marks in standalone clusters, similar to Avagraha. */ - else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u, - 0x1CE9u, 0x1CECu, - 0x1CEEu, 0x1CF1u))) - { - cat = OT_Symbol; - static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), ""); - } - else if (unlikely (u == 0x0A51u)) - { - /* https://github.com/harfbuzz/harfbuzz/issues/524 */ - cat = OT_M; - pos = POS_BELOW_C; - } - - /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil, - * so the Indic shaper needs to know their categories. */ - else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM; - else if (unlikely (u == 0x1133cu)) cat = OT_N; - - else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */ - - else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */ - else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */ - else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) - cat = OT_PLACEHOLDER; - else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE; - - - /* - * Re-assign position. - */ - - if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS)) - { - pos = POS_BASE_C; - if (is_ra (u)) - cat = OT_Ra; - } - else if (cat == OT_M) - { - pos = matra_position (u, pos); - } - else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol)))) - { - pos = POS_SMVD; - } - - if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */ - - - - info.indic_category() = cat; - info.indic_position() = pos; -} - -/* - * Things above this line should ideally be moved to the Indic table itself. - */ - - /* * Indic configurations. Note that we do not want to keep every single script-specific * behavior in these tables necessarily. This should mainly be used for per-script diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-private.hh new file mode 100644 index 00000000000..f90ef967440 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-private.hh @@ -0,0 +1,124 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH +#define HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH + +#include "hb-private.hh" + +#include "hb-ot-shape-complex-indic-private.hh" + + +/* buffer var allocations */ +#define khmer_category() indic_category() /* khmer_category_t */ +#define khmer_position() indic_position() /* khmer_position_t */ + + +typedef indic_category_t khmer_category_t; +typedef indic_position_t khmer_position_t; + + +static inline khmer_position_t +matra_position_khmer (khmer_position_t side) +{ + switch ((int) side) + { + case POS_PRE_C: + return POS_PRE_M; + + case POS_POST_C: + case POS_ABOVE_C: + case POS_BELOW_C: + return POS_AFTER_POST; + + default: + return side; + }; +} + +static inline bool +is_consonant_or_vowel (const hb_glyph_info_t &info) +{ + return is_one_of (info, CONSONANT_FLAGS | FLAG (OT_V)); +} + +static inline bool +is_coeng (const hb_glyph_info_t &info) +{ + return is_one_of (info, FLAG (OT_Coeng)); +} + +static inline void +set_khmer_properties (hb_glyph_info_t &info) +{ + hb_codepoint_t u = info.codepoint; + unsigned int type = hb_indic_get_categories (u); + khmer_category_t cat = (khmer_category_t) (type & 0x7Fu); + khmer_position_t pos = (khmer_position_t) (type >> 8); + + + /* + * Re-assign category + */ + + if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */ + else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) || + u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */ + { + /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier. + * https://github.com/roozbehp/unicode-data/issues/5 */ + cat = OT_M; + pos = POS_ABOVE_C; + } + else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER; + else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE; + + + /* + * Re-assign position. + */ + + if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS)) + { + pos = POS_BASE_C; + if (u == 0x179Au) + cat = OT_Ra; + } + else if (cat == OT_M) + { + pos = matra_position_khmer (pos); + } + else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_A) | FLAG (OT_Symbol)))) + { + pos = POS_SMVD; + } + + info.khmer_category() = cat; + info.khmer_position() = pos; +} + + +#endif /* HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH */ diff --git a/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 2db4f6097d8..304879d8fbb 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 @@ -24,119 +24,9 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-ot-shape-complex-indic-private.hh" +#include "hb-ot-shape-complex-khmer-private.hh" #include "hb-ot-layout-private.hh" -/* buffer var allocations */ -#define khmer_category() complex_var_u8_0() /* khmer_category_t */ -#define khmer_position() complex_var_u8_1() /* khmer_position_t */ - - -/* - * Khmer shaper. - */ - -typedef indic_category_t khmer_category_t; -typedef indic_position_t khmer_position_t; - - -static inline khmer_position_t -matra_position (khmer_position_t side) -{ - switch ((int) side) - { - case POS_PRE_C: - return POS_PRE_M; - - case POS_POST_C: - case POS_ABOVE_C: - case POS_BELOW_C: - return POS_AFTER_POST; - - default: - return side; - }; -} - -static inline bool -is_one_of (const hb_glyph_info_t &info, unsigned int flags) -{ - /* If it ligated, all bets are off. */ - if (_hb_glyph_info_ligated (&info)) return false; - return !!(FLAG_UNSAFE (info.khmer_category()) & flags); -} - -static inline bool -is_joiner (const hb_glyph_info_t &info) -{ - return is_one_of (info, JOINER_FLAGS); -} - -static inline bool -is_consonant (const hb_glyph_info_t &info) -{ - return is_one_of (info, CONSONANT_FLAGS | FLAG (OT_V)); -} - -static inline bool -is_coeng (const hb_glyph_info_t &info) -{ - return is_one_of (info, FLAG (OT_Coeng)); -} - -static inline void -set_khmer_properties (hb_glyph_info_t &info) -{ - hb_codepoint_t u = info.codepoint; - unsigned int type = hb_indic_get_categories (u); - khmer_category_t cat = (khmer_category_t) (type & 0x7Fu); - khmer_position_t pos = (khmer_position_t) (type >> 8); - - - /* - * Re-assign category - */ - - if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */ - else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) || - u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */ - { - /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier. - * https://github.com/roozbehp/unicode-data/issues/5 */ - cat = OT_M; - pos = POS_ABOVE_C; - } - else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER; - else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE; - - - /* - * Re-assign position. - */ - - if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS)) - { - pos = POS_BASE_C; - if (u == 0x179Au) - cat = OT_Ra; - } - else if (cat == OT_M) - { - pos = matra_position (pos); - } - else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_A) | FLAG (OT_Symbol)))) - { - pos = POS_SMVD; - } - - info.khmer_category() = cat; - info.khmer_position() = pos; -} - -/* - * Things above this line should ideally be moved to the Indic table itself. - */ - /* * Khmer shaper. @@ -404,7 +294,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, /* Mark all subsequent consonants as below. */ for (unsigned int i = base + 1; i < end; i++) - if (is_consonant (info[i])) + if (is_consonant_or_vowel (info[i])) info[i].khmer_position() = POS_BELOW_C; /* Mark final consonants. A final consonant is one appearing after a matra, @@ -412,7 +302,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, for (unsigned int i = base + 1; i < end; i++) if (info[i].khmer_category() == OT_M) { for (unsigned int j = i + 1; j < end; j++) - if (is_consonant (info[j])) { + if (is_consonant_or_vowel (info[j])) { info[j].khmer_position() = POS_FINAL_C; break; } @@ -455,7 +345,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, { unsigned int last = base; for (unsigned int i = base + 1; i < end; i++) - if (is_consonant (info[i])) + if (is_consonant_or_vowel (info[i])) { for (unsigned int j = last + 1; j < i; j++) if (info[j].khmer_position() < POS_SMVD) 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 ed87404305b..fb67dd42e64 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 @@ -36,28 +36,29 @@ static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 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, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, 0 + 3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, + 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, + 0 }; static const char _myanmar_syllable_machine_key_spans[] = { 32, 28, 25, 4, 25, 23, 21, 21, 27, 27, 27, 27, 16, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 25, 4, - 25, 23, 21, 21, 27, 27, 27, 27, - 28, 27, 32, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 32, 1 + 27, 27, 28, 27, 27, 27, 27, 25, + 4, 25, 23, 21, 21, 27, 27, 27, + 27, 28, 27, 32, 27, 27, 27, 27, + 27, 28, 27, 27, 27, 27, 32, 1 }; static const short _myanmar_syllable_machine_index_offsets[] = { 0, 33, 62, 88, 93, 119, 143, 165, 187, 215, 243, 271, 299, 316, 344, 372, - 400, 428, 456, 484, 512, 540, 568, 594, - 599, 625, 649, 671, 693, 721, 749, 777, - 805, 834, 862, 895, 923, 951, 979, 1007, - 1035, 1063, 1091, 1119, 1147, 1180 + 400, 428, 456, 485, 513, 541, 569, 597, + 623, 628, 654, 678, 700, 722, 750, 778, + 806, 834, 863, 891, 924, 952, 980, 1008, + 1036, 1064, 1093, 1121, 1149, 1177, 1205, 1238 }; static const char _myanmar_syllable_machine_indicies[] = { @@ -105,7 +106,7 @@ static const char _myanmar_syllable_machine_indicies[] = { 21, 21, 21, 27, 21, 21, 28, 29, 30, 31, 32, 33, 34, 35, 36, 21, 22, 21, 24, 24, 21, 25, 21, 26, - 21, 21, 21, 21, 21, 21, 21, 35, + 21, 21, 21, 21, 21, 21, 21, 43, 21, 21, 21, 21, 21, 21, 32, 33, 34, 35, 36, 21, 22, 21, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, @@ -119,106 +120,114 @@ static const char _myanmar_syllable_machine_indicies[] = { 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 32, 21, 34, 21, 36, 21, 22, 21, 24, 24, 21, 25, 21, 26, - 21, 21, 21, 21, 21, 21, 21, 35, - 21, 21, 28, 21, 30, 21, 32, 33, - 34, 35, 36, 21, 22, 21, 24, 24, - 21, 25, 21, 26, 21, 21, 21, 21, - 21, 21, 21, 35, 21, 21, 28, 21, - 21, 21, 32, 33, 34, 35, 36, 21, - 22, 21, 24, 24, 21, 25, 21, 26, - 21, 21, 21, 21, 21, 21, 21, 35, - 21, 21, 28, 29, 30, 21, 32, 33, - 34, 35, 36, 21, 22, 23, 24, 24, - 21, 25, 21, 26, 21, 21, 21, 21, - 21, 21, 21, 27, 21, 21, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 21, - 3, 3, 43, 5, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 44, 43, 43, - 43, 43, 43, 43, 14, 43, 43, 43, - 18, 43, 3, 3, 43, 5, 43, 3, - 3, 43, 5, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 14, 43, 43, 43, 18, - 43, 45, 43, 3, 3, 43, 5, 43, - 14, 43, 43, 43, 43, 43, 43, 43, - 46, 43, 43, 43, 43, 43, 43, 14, - 43, 3, 3, 43, 5, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 46, 43, - 43, 43, 43, 43, 43, 14, 43, 3, - 3, 43, 5, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 14, 43, 2, 43, 3, - 3, 43, 5, 43, 6, 43, 43, 43, - 43, 43, 43, 43, 47, 43, 43, 47, - 43, 43, 43, 14, 48, 43, 43, 18, - 43, 2, 43, 3, 3, 43, 5, 43, - 6, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 14, - 43, 43, 43, 18, 43, 2, 43, 3, - 3, 43, 5, 43, 6, 43, 43, 43, - 43, 43, 43, 43, 47, 43, 43, 43, - 43, 43, 43, 14, 48, 43, 43, 18, - 43, 2, 43, 3, 3, 43, 5, 43, - 6, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 14, - 48, 43, 43, 18, 43, 22, 23, 24, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 32, 33, + 34, 35, 36, 43, 21, 22, 21, 24, + 24, 21, 25, 21, 26, 21, 21, 21, + 21, 21, 21, 21, 43, 21, 21, 28, + 21, 30, 21, 32, 33, 34, 35, 36, + 21, 22, 21, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 43, 21, 21, 28, 21, 21, 21, 32, + 33, 34, 35, 36, 21, 22, 21, 24, 24, 21, 25, 21, 26, 21, 21, 21, - 21, 21, 21, 21, 49, 21, 21, 28, - 29, 30, 31, 32, 33, 34, 35, 36, - 37, 21, 22, 50, 24, 24, 21, 25, + 21, 21, 21, 21, 43, 21, 21, 28, + 29, 30, 21, 32, 33, 34, 35, 36, + 21, 22, 23, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 27, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 21, 3, 3, 44, + 5, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 45, 44, 44, 44, 44, 44, + 44, 14, 44, 44, 44, 18, 44, 3, + 3, 44, 5, 44, 3, 3, 44, 5, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 14, 44, 44, 44, 18, 44, 46, 44, + 3, 3, 44, 5, 44, 14, 44, 44, + 44, 44, 44, 44, 44, 47, 44, 44, + 44, 44, 44, 44, 14, 44, 3, 3, + 44, 5, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 47, 44, 44, 44, 44, + 44, 44, 14, 44, 3, 3, 44, 5, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 14, 44, 2, 44, 3, 3, 44, 5, + 44, 6, 44, 44, 44, 44, 44, 44, + 44, 48, 44, 44, 48, 44, 44, 44, + 14, 49, 44, 44, 18, 44, 2, 44, + 3, 3, 44, 5, 44, 6, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 44, 44, 44, + 18, 44, 2, 44, 3, 3, 44, 5, + 44, 6, 44, 44, 44, 44, 44, 44, + 44, 48, 44, 44, 44, 44, 44, 44, + 14, 49, 44, 44, 18, 44, 2, 44, + 3, 3, 44, 5, 44, 6, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 14, 49, 44, 44, + 18, 44, 22, 23, 24, 24, 21, 25, 21, 26, 21, 21, 21, 21, 21, 21, - 21, 27, 21, 21, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 21, 1, 1, - 2, 3, 3, 3, 43, 5, 43, 6, - 1, 43, 43, 43, 43, 1, 43, 8, - 43, 43, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 43, 1, 43, 2, - 43, 3, 3, 43, 5, 43, 6, 43, - 43, 43, 43, 43, 43, 43, 8, 43, - 43, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 43, 2, 43, 3, 3, 43, - 5, 43, 6, 43, 43, 43, 43, 43, - 43, 43, 17, 43, 43, 43, 43, 43, - 43, 14, 15, 16, 17, 18, 43, 2, - 43, 3, 3, 43, 5, 43, 6, 43, - 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 14, 15, 16, - 17, 18, 43, 2, 43, 3, 3, 43, - 5, 43, 6, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, - 43, 14, 15, 16, 43, 18, 43, 2, - 43, 3, 3, 43, 5, 43, 6, 43, - 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 14, 43, 16, - 43, 18, 43, 2, 43, 3, 3, 43, - 5, 43, 6, 43, 43, 43, 43, 43, - 43, 43, 17, 43, 43, 10, 43, 12, - 43, 14, 15, 16, 17, 18, 43, 2, - 43, 3, 3, 43, 5, 43, 6, 43, - 43, 43, 43, 43, 43, 43, 17, 43, - 43, 10, 43, 43, 43, 14, 15, 16, - 17, 18, 43, 2, 43, 3, 3, 43, - 5, 43, 6, 43, 43, 43, 43, 43, - 43, 43, 17, 43, 43, 10, 11, 12, - 43, 14, 15, 16, 17, 18, 43, 2, - 3, 3, 3, 43, 5, 43, 6, 43, - 43, 43, 43, 43, 43, 43, 8, 43, - 43, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 43, 1, 1, 51, 51, 51, - 51, 51, 51, 51, 51, 1, 51, 51, - 51, 51, 1, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 1, 51, 52, 51, 0 + 21, 50, 21, 21, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 21, 22, + 51, 24, 24, 21, 25, 21, 26, 21, + 21, 21, 21, 21, 21, 21, 27, 21, + 21, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 21, 1, 1, 2, 3, 3, + 3, 44, 5, 44, 6, 1, 44, 44, + 44, 44, 1, 44, 8, 44, 44, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 19, 44, 1, 44, 2, 44, 3, 3, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 8, 44, 44, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 44, + 2, 44, 3, 3, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 52, + 44, 44, 44, 44, 44, 44, 14, 15, + 16, 17, 18, 44, 2, 44, 3, 3, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 15, 16, 17, 18, 44, + 2, 44, 3, 3, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 14, 15, + 16, 44, 18, 44, 2, 44, 3, 3, + 44, 5, 44, 6, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 14, 44, 16, 44, 18, 44, + 2, 44, 3, 3, 44, 5, 44, 6, + 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 14, 15, + 16, 17, 18, 52, 44, 2, 44, 3, + 3, 44, 5, 44, 6, 44, 44, 44, + 44, 44, 44, 44, 52, 44, 44, 10, + 44, 12, 44, 14, 15, 16, 17, 18, + 44, 2, 44, 3, 3, 44, 5, 44, + 6, 44, 44, 44, 44, 44, 44, 44, + 52, 44, 44, 10, 44, 44, 44, 14, + 15, 16, 17, 18, 44, 2, 44, 3, + 3, 44, 5, 44, 6, 44, 44, 44, + 44, 44, 44, 44, 52, 44, 44, 10, + 11, 12, 44, 14, 15, 16, 17, 18, + 44, 2, 3, 3, 3, 44, 5, 44, + 6, 44, 44, 44, 44, 44, 44, 44, + 8, 44, 44, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 44, 1, 1, 53, + 53, 53, 53, 53, 53, 53, 53, 1, + 53, 53, 53, 53, 1, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 1, 53, 54, 53, + 0 }; static const char _myanmar_syllable_machine_trans_targs[] = { - 0, 1, 22, 0, 0, 23, 29, 32, - 35, 44, 36, 40, 41, 42, 25, 38, - 39, 37, 28, 43, 45, 0, 2, 12, - 0, 3, 9, 13, 14, 18, 19, 20, - 5, 16, 17, 15, 8, 21, 4, 6, - 7, 10, 11, 0, 24, 26, 27, 30, - 31, 33, 34, 0, 0 + 0, 1, 23, 0, 0, 24, 30, 33, + 36, 46, 37, 42, 43, 44, 26, 39, + 40, 41, 29, 45, 47, 0, 2, 12, + 0, 3, 9, 13, 14, 19, 20, 21, + 5, 16, 17, 18, 8, 22, 4, 6, + 7, 10, 11, 15, 0, 25, 27, 28, + 31, 32, 34, 35, 38, 0, 0 }; static const char _myanmar_syllable_machine_trans_actions[] = { @@ -227,8 +236,8 @@ static const char _myanmar_syllable_machine_trans_actions[] = { 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 0, 0, 0, 0, - 0, 0, 0, 9, 10 + 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 10 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -237,7 +246,7 @@ static const char _myanmar_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { @@ -246,16 +255,16 @@ static const char _myanmar_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0 }; static const short _myanmar_syllable_machine_eof_trans[] = { 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 22, 22, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 52, 52 + 22, 22, 22, 22, 22, 22, 22, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 22, 22, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 54, 54 }; static const int myanmar_syllable_machine_start = 0; @@ -289,7 +298,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 293 "hb-ot-shape-complex-myanmar-machine.hh" +#line 302 "hb-ot-shape-complex-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -306,7 +315,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 310 "hb-ot-shape-complex-myanmar-machine.hh" +#line 319 "hb-ot-shape-complex-myanmar-machine.hh" { int _slen; int _trans; @@ -320,7 +329,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 324 "hb-ot-shape-complex-myanmar-machine.hh" +#line 333 "hb-ot-shape-complex-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -370,7 +379,7 @@ _eof_trans: #line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (non_myanmar_cluster); }} break; -#line 374 "hb-ot-shape-complex-myanmar-machine.hh" +#line 383 "hb-ot-shape-complex-myanmar-machine.hh" } _again: @@ -379,7 +388,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 383 "hb-ot-shape-complex-myanmar-machine.hh" +#line 392 "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 45733ac733e..0cd84fa1b88 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 @@ -70,7 +70,7 @@ k = (Ra As H); # Kinzi c = C|Ra; # is_consonant medial_group = MY? MR? MW? MH? As?; -main_vowel_group = VPre* VAbv* VBlw* A* (DB As?)?; +main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?; post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?; pwo_tone_group = PT A* DB? As?; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-private.hh new file mode 100644 index 00000000000..04f81bd1227 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-private.hh @@ -0,0 +1,171 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH +#define HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH + +#include "hb-private.hh" + +#include "hb-ot-shape-complex-indic-private.hh" + + +/* buffer var allocations */ +#define myanmar_category() indic_category() /* myanmar_category_t */ +#define myanmar_position() indic_position() /* myanmar_position_t */ + + +/* Note: This enum is duplicated in the -machine.rl source file. + * Not sure how to avoid duplication. */ +enum myanmar_category_t { + OT_As = 18, /* Asat */ + OT_D0 = 20, /* Digit zero */ + OT_DB = OT_N, /* Dot below */ + OT_GB = OT_PLACEHOLDER, + OT_MH = 21, /* Various consonant medial types */ + OT_MR = 22, /* Various consonant medial types */ + OT_MW = 23, /* Various consonant medial types */ + OT_MY = 24, /* Various consonant medial types */ + OT_PT = 25, /* Pwo and other tones */ + OT_VAbv = 26, + OT_VBlw = 27, + OT_VPre = 28, + OT_VPst = 29, + OT_VS = 30, /* Variation selectors */ + OT_P = 31, /* Punctuation */ + OT_D = 32, /* Digits except zero */ +}; + + +static inline void +set_myanmar_properties (hb_glyph_info_t &info) +{ + hb_codepoint_t u = info.codepoint; + unsigned int type = hb_indic_get_categories (u); + indic_category_t cat = (indic_category_t) (type & 0x7Fu); + indic_position_t pos = (indic_position_t) (type >> 8); + + /* Myanmar + * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze + */ + if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu))) + cat = (indic_category_t) OT_VS; + + switch (u) + { + case 0x104Eu: + cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */ + break; + + case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u: + case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u: + case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu: + case 0x25FEu: + cat = (indic_category_t) OT_GB; + break; + + case 0x1004u: case 0x101Bu: case 0x105Au: + cat = (indic_category_t) OT_Ra; + break; + + case 0x1032u: case 0x1036u: + cat = (indic_category_t) OT_A; + break; + + case 0x1039u: + cat = (indic_category_t) OT_H; + break; + + case 0x103Au: + cat = (indic_category_t) OT_As; + break; + + case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u: + case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u: + case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u: + case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u: + case 0x1097u: case 0x1098u: case 0x1099u: + cat = (indic_category_t) OT_D; + break; + + case 0x1040u: + cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */ + break; + + case 0x103Eu: case 0x1060u: + cat = (indic_category_t) OT_MH; + break; + + case 0x103Cu: + cat = (indic_category_t) OT_MR; + break; + + case 0x103Du: case 0x1082u: + cat = (indic_category_t) OT_MW; + break; + + case 0x103Bu: case 0x105Eu: case 0x105Fu: + cat = (indic_category_t) OT_MY; + break; + + case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au: + case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu: + cat = (indic_category_t) OT_PT; + break; + + case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u: + case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du: + case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu: + cat = (indic_category_t) OT_SM; + break; + + case 0x104Au: case 0x104Bu: + cat = (indic_category_t) OT_P; + break; + + case 0xAA74u: case 0xAA75u: case 0xAA76u: + /* https://github.com/roozbehp/unicode-data/issues/3 */ + cat = (indic_category_t) OT_C; + break; + } + + if (cat == OT_M) + { + switch ((int) pos) + { + case POS_PRE_C: cat = (indic_category_t) OT_VPre; + pos = POS_PRE_M; break; + case POS_ABOVE_C: cat = (indic_category_t) OT_VAbv; break; + case POS_BELOW_C: cat = (indic_category_t) OT_VBlw; break; + case POS_POST_C: cat = (indic_category_t) OT_VPst; break; + } + } + + info.myanmar_category() = (myanmar_category_t) cat; + info.myanmar_position() = pos; +} + + +#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH */ 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 5ea1dbff27a..3c57bc1ff66 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 @@ -24,11 +24,7 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-ot-shape-complex-indic-private.hh" - -/* buffer var allocations */ -#define myanmar_category() complex_var_u8_0() /* myanmar_category_t */ -#define myanmar_position() complex_var_u8_1() /* myanmar_position_t */ +#include "hb-ot-shape-complex-myanmar-private.hh" /* @@ -127,153 +123,6 @@ enum syllable_type_t { #include "hb-ot-shape-complex-myanmar-machine.hh" -/* Note: This enum is duplicated in the -machine.rl source file. - * Not sure how to avoid duplication. */ -enum myanmar_category_t { - OT_As = 18, /* Asat */ - OT_D0 = 20, /* Digit zero */ - OT_DB = OT_N, /* Dot below */ - OT_GB = OT_PLACEHOLDER, - OT_MH = 21, /* Various consonant medial types */ - OT_MR = 22, /* Various consonant medial types */ - OT_MW = 23, /* Various consonant medial types */ - OT_MY = 24, /* Various consonant medial types */ - OT_PT = 25, /* Pwo and other tones */ - OT_VAbv = 26, - OT_VBlw = 27, - OT_VPre = 28, - OT_VPst = 29, - OT_VS = 30, /* Variation selectors */ - OT_P = 31, /* Punctuation */ - OT_D = 32, /* Digits except zero */ -}; - - -static inline bool -is_one_of (const hb_glyph_info_t &info, unsigned int flags) -{ - /* If it ligated, all bets are off. */ - if (_hb_glyph_info_ligated (&info)) return false; - return !!(FLAG_UNSAFE (info.myanmar_category()) & flags); -} - -static inline bool -is_consonant (const hb_glyph_info_t &info) -{ - return is_one_of (info, CONSONANT_FLAGS); -} - - -static inline void -set_myanmar_properties (hb_glyph_info_t &info) -{ - hb_codepoint_t u = info.codepoint; - unsigned int type = hb_indic_get_categories (u); - indic_category_t cat = (indic_category_t) (type & 0x7Fu); - indic_position_t pos = (indic_position_t) (type >> 8); - - /* Myanmar - * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze - */ - if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu))) - cat = (indic_category_t) OT_VS; - - switch (u) - { - case 0x104Eu: - cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */ - break; - - case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u: - case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u: - case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu: - case 0x25FEu: - cat = (indic_category_t) OT_GB; - break; - - case 0x1004u: case 0x101Bu: case 0x105Au: - cat = (indic_category_t) OT_Ra; - break; - - case 0x1032u: case 0x1036u: - cat = (indic_category_t) OT_A; - break; - - case 0x1039u: - cat = (indic_category_t) OT_H; - break; - - case 0x103Au: - cat = (indic_category_t) OT_As; - break; - - case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u: - case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u: - case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u: - case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u: - case 0x1097u: case 0x1098u: case 0x1099u: - cat = (indic_category_t) OT_D; - break; - - case 0x1040u: - cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */ - break; - - case 0x103Eu: case 0x1060u: - cat = (indic_category_t) OT_MH; - break; - - case 0x103Cu: - cat = (indic_category_t) OT_MR; - break; - - case 0x103Du: case 0x1082u: - cat = (indic_category_t) OT_MW; - break; - - case 0x103Bu: case 0x105Eu: case 0x105Fu: - cat = (indic_category_t) OT_MY; - break; - - case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au: - case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu: - cat = (indic_category_t) OT_PT; - break; - - case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u: - case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du: - case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu: - cat = (indic_category_t) OT_SM; - break; - - case 0x104Au: case 0x104Bu: - cat = (indic_category_t) OT_P; - break; - - case 0xAA74u: case 0xAA75u: case 0xAA76u: - /* https://github.com/roozbehp/unicode-data/issues/3 */ - cat = (indic_category_t) OT_C; - break; - } - - if (cat == OT_M) - { - switch ((int) pos) - { - case POS_PRE_C: cat = (indic_category_t) OT_VPre; - pos = POS_PRE_M; break; - case POS_ABOVE_C: cat = (indic_category_t) OT_VAbv; break; - case POS_BELOW_C: cat = (indic_category_t) OT_VBlw; break; - case POS_POST_C: cat = (indic_category_t) OT_VPst; break; - } - } - - info.myanmar_category() = (myanmar_category_t) cat; - info.myanmar_position() = pos; -} - - - static void setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_buffer_t *buffer, @@ -374,6 +223,11 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer, { continue; } + if (info[i].myanmar_category() == OT_VS) + { + info[i].myanmar_position() = info[i - 1].myanmar_position(); + continue; + } if (pos == POS_AFTER_MAIN && info[i].myanmar_category() == OT_VBlw) { 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 e767865bc4b..0bf3ad3024a 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,281 +36,279 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 1u, 1u, 12u, 12u, 1u, 15u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, - 8u, 39u, 8u, 39u, 1u, 15u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, - 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, + 12u, 12u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, + 1u, 15u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, - 42u, 42u, 1u, 5u, 0 + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, + 8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 42u, 42u, + 1u, 5u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 1, 1, 15, 15, 1, 1, 44, 1, - 32, 32, 15, 32, 32, 32, 19, 19, - 19, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 9, 1, 1, - 32, 32, 32, 32, 19, 19, 19, 32, + 1, 15, 1, 1, 44, 1, 32, 32, + 15, 1, 32, 32, 32, 19, 19, 19, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 9, 1, 1, 32, + 32, 32, 32, 19, 19, 19, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 15, 1, 39, 32, 22, 2, - 1, 5 + 32, 15, 1, 39, 32, 22, 2, 1, + 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 2, 4, 20, 36, 38, 40, 85, - 87, 120, 153, 169, 202, 235, 268, 288, - 308, 328, 361, 394, 427, 460, 493, 526, - 559, 592, 625, 658, 691, 724, 734, 736, - 738, 771, 804, 837, 870, 890, 910, 930, - 963, 996, 1029, 1062, 1095, 1128, 1161, 1194, - 1227, 1260, 1293, 1309, 1311, 1351, 1384, 1407, - 1410, 1412 + 0, 2, 18, 20, 22, 67, 69, 102, + 135, 151, 153, 186, 219, 252, 272, 292, + 312, 345, 378, 411, 444, 477, 510, 543, + 576, 609, 642, 675, 708, 718, 720, 722, + 755, 788, 821, 854, 874, 894, 914, 947, + 980, 1013, 1046, 1079, 1112, 1145, 1178, 1211, + 1244, 1277, 1293, 1295, 1335, 1368, 1391, 1394, + 1396 }; static const char _use_syllable_machine_indicies[] = { - 1, 0, 3, 2, 1, 2, 2, 2, + 1, 0, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 4, 2, 5, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 5, 0, 8, 7, - 9, 10, 11, 9, 12, 10, 11, 11, - 13, 11, 11, 5, 14, 11, 11, 15, - 9, 9, 16, 17, 11, 11, 18, 19, - 20, 21, 22, 23, 24, 18, 25, 26, - 27, 28, 29, 30, 11, 31, 32, 33, - 11, 11, 11, 34, 11, 36, 35, 38, - 37, 37, 1, 39, 37, 37, 40, 37, - 37, 37, 37, 37, 41, 42, 43, 44, - 45, 46, 47, 48, 42, 49, 41, 50, - 51, 52, 53, 37, 54, 55, 56, 37, - 38, 37, 37, 1, 39, 37, 37, 40, - 37, 37, 37, 37, 37, 57, 42, 43, - 44, 45, 46, 47, 48, 42, 49, 50, - 50, 51, 52, 53, 37, 54, 55, 56, - 37, 1, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 4, - 58, 38, 37, 37, 1, 39, 37, 37, - 40, 37, 37, 37, 37, 37, 37, 42, - 43, 44, 45, 46, 47, 48, 42, 49, - 50, 50, 51, 52, 53, 37, 54, 55, - 56, 37, 38, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 42, 43, 44, 45, 46, 37, 37, 37, - 37, 37, 37, 51, 52, 53, 37, 54, - 55, 56, 37, 38, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 43, 44, 45, 46, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 54, 55, 56, 37, 38, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 44, 45, 46, 37, - 38, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 45, 46, 37, 38, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 46, 37, - 38, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 44, 45, 46, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 54, 55, 56, - 37, 38, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 44, 45, 46, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 55, - 56, 37, 38, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 44, 45, 46, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 56, 37, 38, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 43, 44, 45, 46, 37, 37, - 37, 37, 37, 37, 51, 52, 53, 37, - 54, 55, 56, 37, 38, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 43, 44, 45, 46, 37, - 37, 37, 37, 37, 37, 37, 52, 53, - 37, 54, 55, 56, 37, 38, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 43, 44, 45, 46, - 37, 37, 37, 37, 37, 37, 37, 37, - 53, 37, 54, 55, 56, 37, 38, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 42, 43, 44, 45, - 46, 37, 48, 42, 37, 37, 37, 51, - 52, 53, 37, 54, 55, 56, 37, 38, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 42, 43, 44, - 45, 46, 37, 59, 42, 37, 37, 37, - 51, 52, 53, 37, 54, 55, 56, 37, - 38, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 42, 43, - 44, 45, 46, 37, 37, 42, 37, 37, - 37, 51, 52, 53, 37, 54, 55, 56, - 37, 38, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 42, - 43, 44, 45, 46, 47, 48, 42, 37, - 37, 37, 51, 52, 53, 37, 54, 55, - 56, 37, 38, 37, 37, 1, 39, 37, - 37, 40, 37, 37, 37, 37, 37, 37, - 42, 43, 44, 45, 46, 47, 48, 42, - 49, 37, 50, 51, 52, 53, 37, 54, - 55, 56, 37, 38, 37, 37, 1, 39, - 37, 37, 40, 37, 37, 37, 37, 37, - 37, 42, 43, 44, 45, 46, 47, 48, - 42, 49, 41, 50, 51, 52, 53, 37, - 54, 55, 56, 37, 61, 60, 60, 60, - 60, 60, 60, 60, 62, 60, 12, 63, - 61, 60, 13, 64, 64, 5, 8, 64, - 64, 65, 64, 64, 64, 64, 64, 66, - 18, 19, 20, 21, 22, 23, 24, 18, - 25, 27, 27, 28, 29, 30, 64, 31, - 32, 33, 64, 13, 64, 64, 5, 8, - 64, 64, 65, 64, 64, 64, 64, 64, - 64, 18, 19, 20, 21, 22, 23, 24, - 18, 25, 27, 27, 28, 29, 30, 64, - 31, 32, 33, 64, 13, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 18, 19, 20, 21, 22, 64, - 64, 64, 64, 64, 64, 28, 29, 30, - 64, 31, 32, 33, 64, 13, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 19, 20, 21, 22, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 31, 32, 33, 64, 13, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 20, 21, - 22, 64, 13, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 21, 22, 64, 13, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 22, 64, 13, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 20, 21, 22, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 31, - 32, 33, 64, 13, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 20, 21, 22, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 32, 33, 64, 13, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 20, 21, 22, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 33, 64, 13, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 19, 20, 21, 22, - 64, 64, 64, 64, 64, 64, 28, 29, - 30, 64, 31, 32, 33, 64, 13, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 19, 20, 21, - 22, 64, 64, 64, 64, 64, 64, 64, - 29, 30, 64, 31, 32, 33, 64, 13, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 19, 20, - 21, 22, 64, 64, 64, 64, 64, 64, - 64, 64, 30, 64, 31, 32, 33, 64, - 13, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 18, 19, - 20, 21, 22, 64, 24, 18, 64, 64, - 64, 28, 29, 30, 64, 31, 32, 33, - 64, 13, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 18, - 19, 20, 21, 22, 64, 67, 18, 64, - 64, 64, 28, 29, 30, 64, 31, 32, - 33, 64, 13, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 18, 19, 20, 21, 22, 64, 64, 18, - 64, 64, 64, 28, 29, 30, 64, 31, - 32, 33, 64, 13, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 18, 19, 20, 21, 22, 23, 24, - 18, 64, 64, 64, 28, 29, 30, 64, - 31, 32, 33, 64, 13, 64, 64, 5, - 8, 64, 64, 65, 64, 64, 64, 64, - 64, 64, 18, 19, 20, 21, 22, 23, - 24, 18, 25, 64, 27, 28, 29, 30, - 64, 31, 32, 33, 64, 5, 68, 68, + 4, 2, 3, 2, 6, 5, 7, 8, + 9, 7, 10, 8, 9, 9, 11, 9, + 9, 3, 12, 9, 9, 13, 7, 7, + 14, 15, 9, 9, 16, 17, 18, 19, + 20, 21, 22, 16, 23, 24, 25, 26, + 27, 28, 9, 29, 30, 31, 9, 9, + 9, 32, 9, 34, 33, 36, 35, 35, + 37, 1, 35, 35, 38, 35, 35, 35, + 35, 35, 39, 40, 41, 42, 43, 44, + 45, 46, 40, 47, 39, 48, 49, 50, + 51, 35, 52, 53, 54, 35, 36, 35, + 35, 37, 1, 35, 35, 38, 35, 35, + 35, 35, 35, 55, 40, 41, 42, 43, + 44, 45, 46, 40, 47, 48, 48, 49, + 50, 51, 35, 52, 53, 54, 35, 37, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 57, 56, 37, + 56, 36, 35, 35, 37, 1, 35, 35, + 38, 35, 35, 35, 35, 35, 35, 40, + 41, 42, 43, 44, 45, 46, 40, 47, + 48, 48, 49, 50, 51, 35, 52, 53, + 54, 35, 36, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 40, 41, 42, 43, 44, 35, 35, 35, + 35, 35, 35, 49, 50, 51, 35, 52, + 53, 54, 35, 36, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 41, 42, 43, 44, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 52, 53, 54, 35, 36, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 42, 43, 44, 35, + 36, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 43, 44, 35, 36, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 44, 35, + 36, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 42, 43, 44, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 52, 53, 54, + 35, 36, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 42, 43, 44, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 53, + 54, 35, 36, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 42, 43, 44, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 54, 35, 36, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 41, 42, 43, 44, 35, 35, + 35, 35, 35, 35, 49, 50, 51, 35, + 52, 53, 54, 35, 36, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 41, 42, 43, 44, 35, + 35, 35, 35, 35, 35, 35, 50, 51, + 35, 52, 53, 54, 35, 36, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 41, 42, 43, 44, + 35, 35, 35, 35, 35, 35, 35, 35, + 51, 35, 52, 53, 54, 35, 36, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 40, 41, 42, 43, + 44, 35, 46, 40, 35, 35, 35, 49, + 50, 51, 35, 52, 53, 54, 35, 36, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 40, 41, 42, + 43, 44, 35, 58, 40, 35, 35, 35, + 49, 50, 51, 35, 52, 53, 54, 35, + 36, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 40, 41, + 42, 43, 44, 35, 35, 40, 35, 35, + 35, 49, 50, 51, 35, 52, 53, 54, + 35, 36, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 40, + 41, 42, 43, 44, 45, 46, 40, 35, + 35, 35, 49, 50, 51, 35, 52, 53, + 54, 35, 36, 35, 35, 37, 1, 35, + 35, 38, 35, 35, 35, 35, 35, 35, + 40, 41, 42, 43, 44, 45, 46, 40, + 47, 35, 48, 49, 50, 51, 35, 52, + 53, 54, 35, 36, 35, 35, 37, 1, + 35, 35, 38, 35, 35, 35, 35, 35, + 35, 40, 41, 42, 43, 44, 45, 46, + 40, 47, 39, 48, 49, 50, 51, 35, + 52, 53, 54, 35, 60, 59, 59, 59, + 59, 59, 59, 59, 61, 59, 10, 62, + 60, 59, 11, 63, 63, 3, 6, 63, + 63, 64, 63, 63, 63, 63, 63, 65, + 16, 17, 18, 19, 20, 21, 22, 16, + 23, 25, 25, 26, 27, 28, 63, 29, + 30, 31, 63, 11, 63, 63, 3, 6, + 63, 63, 64, 63, 63, 63, 63, 63, + 63, 16, 17, 18, 19, 20, 21, 22, + 16, 23, 25, 25, 26, 27, 28, 63, + 29, 30, 31, 63, 11, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 16, 17, 18, 19, 20, 63, + 63, 63, 63, 63, 63, 26, 27, 28, + 63, 29, 30, 31, 63, 11, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 17, 18, 19, 20, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 29, 30, 31, 63, 11, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 18, 19, + 20, 63, 11, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 19, 20, 63, 11, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 20, 63, 11, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 18, 19, 20, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 29, + 30, 31, 63, 11, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 18, 19, 20, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 30, 31, 63, 11, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 18, 19, 20, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 31, 63, 11, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 17, 18, 19, 20, + 63, 63, 63, 63, 63, 63, 26, 27, + 28, 63, 29, 30, 31, 63, 11, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 17, 18, 19, + 20, 63, 63, 63, 63, 63, 63, 63, + 27, 28, 63, 29, 30, 31, 63, 11, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 17, 18, + 19, 20, 63, 63, 63, 63, 63, 63, + 63, 63, 28, 63, 29, 30, 31, 63, + 11, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 16, 17, + 18, 19, 20, 63, 22, 16, 63, 63, + 63, 26, 27, 28, 63, 29, 30, 31, + 63, 11, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 16, + 17, 18, 19, 20, 63, 66, 16, 63, + 63, 63, 26, 27, 28, 63, 29, 30, + 31, 63, 11, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 16, 17, 18, 19, 20, 63, 63, 16, + 63, 63, 63, 26, 27, 28, 63, 29, + 30, 31, 63, 11, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 16, 17, 18, 19, 20, 21, 22, + 16, 63, 63, 63, 26, 27, 28, 63, + 29, 30, 31, 63, 11, 63, 63, 3, + 6, 63, 63, 64, 63, 63, 63, 63, + 63, 63, 16, 17, 18, 19, 20, 21, + 22, 16, 23, 63, 25, 26, 27, 28, + 63, 29, 30, 31, 63, 3, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 4, 67, 6, 67, 8, + 63, 63, 63, 8, 63, 63, 11, 63, + 63, 3, 6, 63, 63, 64, 63, 63, + 63, 63, 63, 63, 16, 17, 18, 19, + 20, 21, 22, 16, 23, 24, 25, 26, + 27, 28, 63, 29, 30, 31, 63, 11, + 63, 63, 3, 6, 63, 63, 64, 63, + 63, 63, 63, 63, 63, 16, 17, 18, + 19, 20, 21, 22, 16, 23, 24, 25, + 26, 27, 28, 63, 29, 30, 31, 63, + 69, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 6, 68, 8, 68, 10, - 64, 64, 64, 10, 64, 64, 13, 64, - 64, 5, 8, 64, 64, 65, 64, 64, - 64, 64, 64, 64, 18, 19, 20, 21, - 22, 23, 24, 18, 25, 26, 27, 28, - 29, 30, 64, 31, 32, 33, 64, 13, - 64, 64, 5, 8, 64, 64, 65, 64, - 64, 64, 64, 64, 64, 18, 19, 20, - 21, 22, 23, 24, 18, 25, 26, 27, - 28, 29, 30, 64, 31, 32, 33, 64, - 70, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 70, 71, 69, 70, - 71, 69, 71, 69, 10, 68, 68, 68, - 10, 68, 0 + 68, 68, 68, 68, 69, 70, 68, 69, + 70, 68, 70, 68, 8, 67, 67, 67, + 8, 67, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 6, 9, 6, 2, 0, 32, 4, 6, - 3, 7, 8, 6, 29, 6, 50, 51, - 52, 54, 34, 35, 36, 37, 38, 45, - 46, 48, 53, 49, 42, 43, 44, 39, - 40, 41, 57, 6, 6, 6, 6, 10, - 1, 28, 12, 13, 14, 15, 16, 23, - 24, 26, 27, 20, 21, 22, 17, 18, - 19, 11, 6, 25, 6, 30, 31, 6, - 6, 5, 33, 47, 6, 6, 55, 56 + 4, 8, 4, 31, 2, 4, 1, 5, + 6, 4, 28, 4, 49, 50, 51, 53, + 33, 34, 35, 36, 37, 44, 45, 47, + 52, 48, 41, 42, 43, 38, 39, 40, + 56, 4, 4, 4, 4, 7, 0, 27, + 11, 12, 13, 14, 15, 22, 23, 25, + 26, 19, 20, 21, 16, 17, 18, 10, + 4, 9, 24, 4, 29, 30, 4, 4, + 3, 32, 46, 4, 4, 54, 55 }; static const char _use_syllable_machine_trans_actions[] = { - 1, 2, 3, 0, 0, 4, 0, 5, - 0, 0, 2, 8, 0, 9, 10, 10, - 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 0, 0, 0, 0, - 0, 0, 0, 11, 12, 13, 14, 15, - 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 2, 16, 0, 17, 0, 0, 18, - 19, 0, 4, 0, 20, 21, 0, 0 + 1, 0, 2, 3, 0, 4, 0, 0, + 7, 8, 0, 9, 10, 10, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 0, 0, 0, 0, 0, + 0, 11, 12, 13, 14, 7, 0, 7, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 7, + 15, 0, 0, 16, 0, 0, 17, 18, + 0, 3, 0, 19, 20, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { - 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 + 0 }; static const char _use_syllable_machine_from_state_actions[] = { - 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 + 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 3, 3, 1, 1, 8, 0, 36, - 38, 38, 59, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 61, 64, 61, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 69, 69, 65, 65, 70, 70, - 70, 69 + 1, 3, 3, 6, 0, 34, 36, 36, + 57, 57, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 60, 63, 60, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 68, 68, 64, 64, 69, 69, 69, + 68 }; -static const int use_syllable_machine_start = 6; -static const int use_syllable_machine_first_final = 6; +static const int use_syllable_machine_start = 4; +static const int use_syllable_machine_first_final = 4; static const int use_syllable_machine_error = -1; -static const int use_syllable_machine_en_main = 6; +static const int use_syllable_machine_en_main = 4; #line 38 "hb-ot-shape-complex-use-machine.rl" @@ -337,7 +335,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 341 "hb-ot-shape-complex-use-machine.hh" +#line 339 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -354,7 +352,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 358 "hb-ot-shape-complex-use-machine.hh" +#line 356 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -364,11 +362,11 @@ find_syllables (hb_buffer_t *buffer) goto _test_eof; _resume: switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 7: + case 6: #line 1 "NONE" {ts = p;} break; -#line 372 "hb-ot-shape-complex-use-machine.hh" +#line 370 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -386,6 +384,10 @@ _eof_trans: goto _again; switch ( _use_syllable_machine_trans_actions[_trans] ) { + case 7: +#line 1 "NONE" + {te = p+1;} + break; case 12: #line 130 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} @@ -406,7 +408,7 @@ _eof_trans: #line 130 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (independent_cluster); }} break; - case 16: + case 15: #line 131 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; @@ -414,43 +416,37 @@ _eof_trans: #line 132 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (standard_cluster); }} break; - case 18: + case 17: #line 133 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; - case 17: + case 16: #line 134 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; - case 21: + case 20: #line 135 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 19: + case 18: #line 136 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 20: + case 19: #line 137 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; - case 3: + case 1: #line 132 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (standard_cluster); }} break; - case 5: + case 4: #line 136 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; - case 1: + case 2: #line 1 "NONE" { switch( act ) { - case 2: - {{p = ((te))-1;} found_syllable (virama_terminated_cluster); } - break; - case 3: - {{p = ((te))-1;} found_syllable (standard_cluster); } - break; case 7: {{p = ((te))-1;} found_syllable (broken_cluster); } break; @@ -460,19 +456,7 @@ _eof_trans: } } break; - case 15: -#line 1 "NONE" - {te = p+1;} -#line 131 "hb-ot-shape-complex-use-machine.rl" - {act = 2;} - break; - case 2: -#line 1 "NONE" - {te = p+1;} -#line 132 "hb-ot-shape-complex-use-machine.rl" - {act = 3;} - break; - case 4: + case 3: #line 1 "NONE" {te = p+1;} #line 136 "hb-ot-shape-complex-use-machine.rl" @@ -484,16 +468,16 @@ _eof_trans: #line 137 "hb-ot-shape-complex-use-machine.rl" {act = 8;} break; -#line 488 "hb-ot-shape-complex-use-machine.hh" +#line 472 "hb-ot-shape-complex-use-machine.hh" } _again: switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 6: + case 5: #line 1 "NONE" {ts = 0;} break; -#line 497 "hb-ot-shape-complex-use-machine.hh" +#line 481 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) 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 89b776390b7..11fb47020ac 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 @@ -100,7 +100,7 @@ final_consonants = FAbv* FBlw* FPst* FM?; virama_terminated_cluster = (R|CS)? (B | GB) VS? consonant_modifiers - H + ZWJ?.H.ZWJ? ; standard_cluster = (R|CS)? (B | GB) VS? diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh index 3e763ae3936..f7ded133d6b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh @@ -92,6 +92,6 @@ enum use_category_t { }; HB_INTERNAL USE_TABLE_ELEMENT_TYPE -hb_use_get_categories (hb_codepoint_t u); +hb_use_get_category (hb_codepoint_t u); #endif /* HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH */ 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 a67ef061122..6823392f4b4 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 @@ -690,7 +690,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { }; /* Table items: 5424; occupancy: 73% */ USE_TABLE_ELEMENT_TYPE -hb_use_get_categories (hb_codepoint_t u) +hb_use_get_category (hb_codepoint_t u) { switch (u >> 12) { 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 62acd697bdd..ee7653b51ce 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 @@ -262,7 +262,7 @@ setup_masks_use (const hb_ot_shape_plan_t *plan, unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) - info[i].use_category() = hb_use_get_categories (info[i].codepoint); + info[i].use_category() = hb_use_get_category (info[i].codepoint); } static void @@ -505,7 +505,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_glyph_info_t dottedcircle = {0}; if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint)) return; - dottedcircle.use_category() = hb_use_get_categories (0x25CC); + dottedcircle.use_category() = hb_use_get_category (0x25CC); buffer->clear_output (); 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 6b228790af8..c7b46053d8c 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 @@ -200,8 +200,7 @@ position_mark (const hb_ot_shape_plan_t *plan, unsigned int combining_class) { hb_glyph_extents_t mark_extents; - if (!font->get_glyph_extents (buffer->info[i].codepoint, - &mark_extents)) + if (!font->get_glyph_extents (buffer->info[i].codepoint, &mark_extents)) return; hb_position_t y_gap = font->y_scale / 16; @@ -322,7 +321,9 @@ position_around_base (const hb_ot_shape_plan_t *plan, base_extents.y_bearing += buffer->pos[base].y_offset; unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[base]); - unsigned int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]); + /* Use integer for num_lig_components such that it doesn't convert to unsigned + * when we divide or multiply by it. */ + int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]); hb_position_t x_offset = 0, y_offset = 0; if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) { @@ -331,7 +332,7 @@ position_around_base (const hb_ot_shape_plan_t *plan, } hb_glyph_extents_t component_extents = base_extents; - unsigned int last_lig_component = (unsigned int) -1; + int last_lig_component = -1; unsigned int last_combining_class = 255; hb_glyph_extents_t cluster_extents = base_extents; /* Initialization is just to shut gcc up. */ hb_glyph_info_t *info = buffer->info; @@ -340,7 +341,7 @@ position_around_base (const hb_ot_shape_plan_t *plan, { if (num_lig_components > 1) { unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&info[i]); - unsigned int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1; + int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1; /* Conditions for attaching to the last component. */ if (!lig_id || lig_id != this_lig_id || this_lig_component >= num_lig_components) this_lig_component = num_lig_components - 1; @@ -526,7 +527,7 @@ _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan, break; case t::SPACE_4_EM_18: - pos[i].x_advance = font->x_scale * 4 / 18; + pos[i].x_advance = (int64_t) font->x_scale * 4 / 18; break; case t::SPACE_FIGURE: 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 fc5dd1084d2..263d65c0ccb 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 @@ -41,7 +41,7 @@ #include "hb-set-private.hh" #include "hb-ot-layout-gsubgpos-private.hh" -#include "hb-aat-layout-private.hh" +//#include "hb-aat-layout-private.hh" static hb_tag_t common_features[] = { HB_TAG('c','c','m','p'), @@ -787,6 +787,8 @@ hb_ot_position (hb_ot_shape_context_t *c) _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer); _hb_buffer_deallocate_gsubgpos_vars (c->buffer); + + //hb_aat_layout_position (c->font, c->buffer); } static inline void @@ -957,7 +959,7 @@ hb_ot_shape_glyphs_closure (hb_font_t *font, hb_set_t *copy = hb_set_create (); do { copy->set (glyphs); - for (hb_codepoint_t lookup_index = -1; hb_set_next (lookups, &lookup_index);) + for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);) hb_ot_layout_lookup_substitute_closure (font->face, lookup_index, glyphs); } while (!copy->is_equal (glyphs)); hb_set_destroy (copy); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh index 62c9fb278fc..daa496e98cd 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh @@ -51,6 +51,9 @@ #include <stdio.h> #include <stdarg.h> +#if defined(_MSC_VER) || defined(__MINGW32__) +#include <intrin.h> +#endif #define HB_PASTE1(a,b) a##b #define HB_PASTE(a,b) HB_PASTE1(a,b) @@ -120,10 +123,11 @@ extern "C" void hb_free_impl(void *ptr); #endif #ifndef HB_INTERNAL -# if !defined(__MINGW32__) && !defined(__CYGWIN__) +# if !defined(HB_NO_VISIBILITY) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_MSC_VER) && !defined(__SUNPRO_CC) # define HB_INTERNAL __attribute__((__visibility__("hidden"))) # else # define HB_INTERNAL +# define HB_NO_VISIBILITY 1 # endif #endif @@ -135,6 +139,11 @@ extern "C" void hb_free_impl(void *ptr); #define HB_FUNC __func__ #endif +#ifdef __SUNPRO_CC +/* https://github.com/harfbuzz/harfbuzz/issues/630 */ +#define __restrict +#endif + /* * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411 * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch @@ -154,6 +163,9 @@ extern "C" void hb_free_impl(void *ptr); #if defined(__clang__) && __cplusplus >= 201103L /* clang's fallthrough annotations are only available starting in C++11. */ # define HB_FALLTHROUGH [[clang::fallthrough]] +#elif __GNUC__ >= 7 + /* GNU fallthrough attribute is available from GCC7 */ +# define HB_FALLTHROUGH __attribute__((fallthrough)) #elif defined(_MSC_VER) /* * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis): @@ -221,6 +233,12 @@ static int errno = 0; /* Use something better? */ * https://developer.android.com/tools/sdk/ndk/index.html */ # define HB_USE_ATEXIT 1 +# elif defined(__APPLE__) +/* For macOS and related platforms, the atexit man page indicates + * that it will be invoked when the library is unloaded, not only + * at application exit. + */ +# define HB_USE_ATEXIT 1 # endif #endif @@ -304,64 +322,189 @@ static_assert ((sizeof (hb_var_int_t) == 4), ""); typedef const struct _hb_void_t *hb_void_t; #define HB_VOID ((const _hb_void_t *) nullptr) -/* Return the number of 1 bits in mask. */ -static inline HB_CONST_FUNC unsigned int -_hb_popcount32 (uint32_t mask) -{ -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) - return __builtin_popcount (mask); -#else - /* "HACKMEM 169" */ - uint32_t y; - y = (mask >> 1) &033333333333; - y = mask - y - ((y >>1) & 033333333333); - return (((y + (y >> 3)) & 030707070707) % 077); -#endif -} +/* Return the number of 1 bits in v. */ +template <typename T> static inline HB_CONST_FUNC unsigned int -_hb_popcount64 (uint64_t mask) +_hb_popcount (T v) { -#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) - if (sizeof (long) >= sizeof (mask)) - return __builtin_popcountl (mask); +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined(__OPTIMIZE__) + if (sizeof (T) <= sizeof (unsigned int)) + return __builtin_popcount (v); + + if (sizeof (T) <= sizeof (unsigned long)) + return __builtin_popcountl (v); + + if (sizeof (T) <= sizeof (unsigned long long)) + return __builtin_popcountll (v); #endif - return _hb_popcount32 (mask & 0xFFFFFFFF) + _hb_popcount32 (mask >> 32); + + if (sizeof (T) <= 4) + { + /* "HACKMEM 169" */ + uint32_t y; + y = (v >> 1) &033333333333; + y = v - y - ((y >>1) & 033333333333); + return (((y + (y >> 3)) & 030707070707) % 077); + } + + if (sizeof (T) == 8) + { + unsigned int shift = 32; + return _hb_popcount<uint32_t> ((uint32_t) v) + _hb_popcount ((uint32_t) (v >> shift)); + } + + if (sizeof (T) == 16) + { + unsigned int shift = 64; + return _hb_popcount<uint64_t> ((uint64_t) v) + _hb_popcount ((uint64_t) (v >> shift)); + } + + assert (0); } -template <typename T> static inline unsigned int _hb_popcount (T mask); -template <> inline unsigned int _hb_popcount<uint32_t> (uint32_t mask) { return _hb_popcount32 (mask); } -template <> inline unsigned int _hb_popcount<uint64_t> (uint64_t mask) { return _hb_popcount64 (mask); } /* Returns the number of bits needed to store number */ +template <typename T> static inline HB_CONST_FUNC unsigned int -_hb_bit_storage (unsigned int number) +_hb_bit_storage (T v) { + if (unlikely (!v)) return 0; + #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__) - return likely (number) ? (sizeof (unsigned int) * 8 - __builtin_clz (number)) : 0; -#else - unsigned int n_bits = 0; - while (number) { - n_bits++; - number >>= 1; + if (sizeof (T) <= sizeof (unsigned int)) + return sizeof (unsigned int) * 8 - __builtin_clz (v); + + if (sizeof (T) <= sizeof (unsigned long)) + return sizeof (unsigned long) * 8 - __builtin_clzl (v); + + if (sizeof (T) <= sizeof (unsigned long long)) + return sizeof (unsigned long long) * 8 - __builtin_clzll (v); +#endif + +#if defined(_MSC_VER) || defined(__MINGW32__) + if (sizeof (T) <= sizeof (unsigned int)) + { + unsigned long where; + _BitScanReverse (&where, v); + return 1 + where; } - return n_bits; +# if _WIN64 + if (sizeof (T) <= 8) + { + unsigned long where; + _BitScanReverse64 (&where, v); + return 1 + where; + } +# endif #endif + + if (sizeof (T) <= 4) + { + /* "bithacks" */ + const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000}; + const unsigned int S[] = {1, 2, 4, 8, 16}; + unsigned int r = 0; + for (int i = 4; i >= 0; i--) + if (v & b[i]) + { + v >>= S[i]; + r |= S[i]; + } + return r + 1; + } + if (sizeof (T) <= 8) + { + /* "bithacks" */ + const uint64_t b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000, 0xFFFFFFFF00000000}; + const unsigned int S[] = {1, 2, 4, 8, 16, 32}; + unsigned int r = 0; + for (int i = 5; i >= 0; i--) + if (v & b[i]) + { + v >>= S[i]; + r |= S[i]; + } + return r + 1; + } + if (sizeof (T) == 16) + { + unsigned int shift = 64; + return (v >> shift) ? _hb_bit_storage<uint64_t> ((uint64_t) v >> shift) + shift : + _hb_bit_storage<uint64_t> ((uint64_t) v); + } + + assert (0); } -/* Returns the number of zero bits in the least significant side of number */ +/* Returns the number of zero bits in the least significant side of v */ +template <typename T> static inline HB_CONST_FUNC unsigned int -_hb_ctz (unsigned int number) +_hb_ctz (T v) { + if (unlikely (!v)) return 0; + #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__) - return likely (number) ? __builtin_ctz (number) : 0; -#else - unsigned int n_bits = 0; - if (unlikely (!number)) return 0; - while (!(number & 1)) { - n_bits++; - number >>= 1; + if (sizeof (T) <= sizeof (unsigned int)) + return __builtin_ctz (v); + + if (sizeof (T) <= sizeof (unsigned long)) + return __builtin_ctzl (v); + + if (sizeof (T) <= sizeof (unsigned long long)) + return __builtin_ctzll (v); +#endif + +#if defined(_MSC_VER) || defined(__MINGW32__) + if (sizeof (T) <= sizeof (unsigned int)) + { + unsigned long where; + _BitScanForward (&where, v); + return where; } - return n_bits; +# if _WIN64 + if (sizeof (T) <= 8) + { + unsigned long where; + _BitScanForward64 (&where, v); + return where; + } +# endif #endif + + if (sizeof (T) <= 4) + { + /* "bithacks" */ + unsigned int c = 32; + v &= - (int32_t) v; + if (v) c--; + if (v & 0x0000FFFF) c -= 16; + if (v & 0x00FF00FF) c -= 8; + if (v & 0x0F0F0F0F) c -= 4; + if (v & 0x33333333) c -= 2; + if (v & 0x55555555) c -= 1; + return c; + } + if (sizeof (T) <= 8) + { + /* "bithacks" */ + unsigned int c = 64; + v &= - (int64_t) (v); + if (v) c--; + if (v & 0x00000000FFFFFFFF) c -= 32; + if (v & 0x0000FFFF0000FFFF) c -= 16; + if (v & 0x00FF00FF00FF00FF) c -= 8; + if (v & 0x0F0F0F0F0F0F0F0F) c -= 4; + if (v & 0x3333333333333333) c -= 2; + if (v & 0x5555555555555555) c -= 1; + return c; + } + if (sizeof (T) == 16) + { + unsigned int shift = 64; + return (uint64_t) v ? _hb_bit_storage<uint64_t> ((uint64_t) v) : + _hb_bit_storage<uint64_t> ((uint64_t) v >> shift) + shift; + } + + assert (0); } static inline bool @@ -370,6 +513,12 @@ _hb_unsigned_int_mul_overflows (unsigned int count, unsigned int size) return (size > 0) && (count >= ((unsigned int) -1) / size); } +static inline unsigned int +_hb_ceil_to_4 (unsigned int v) +{ + return ((v - 1) | 3) + 1; +} + /* arrays and maps */ @@ -402,36 +551,45 @@ struct hb_prealloced_array_t return &array[len - 1]; } - inline bool resize (unsigned int size) + /* Allocate for size but don't adjust len. */ + inline bool alloc(unsigned int size) { - if (unlikely (size > allocated)) - { - /* Need to reallocate */ - - unsigned int new_allocated = allocated; - while (size >= new_allocated) - new_allocated += (new_allocated >> 1) + 8; - - Type *new_array = nullptr; - - if (array == static_array) { - new_array = (Type *) calloc (new_allocated, sizeof (Type)); - if (new_array) - memcpy (new_array, array, len * sizeof (Type)); - } else { - bool overflows = (new_allocated < allocated) || _hb_unsigned_int_mul_overflows (new_allocated, sizeof (Type)); - if (likely (!overflows)) { - new_array = (Type *) realloc (array, new_allocated * sizeof (Type)); - } - } + if (likely (size <= allocated)) + return true; + + /* Reallocate */ + + unsigned int new_allocated = allocated; + while (size >= new_allocated) + new_allocated += (new_allocated >> 1) + 8; - if (unlikely (!new_array)) - return false; + Type *new_array = nullptr; - array = new_array; - allocated = new_allocated; + if (array == static_array) { + new_array = (Type *) calloc (new_allocated, sizeof (Type)); + if (new_array) + memcpy (new_array, array, len * sizeof (Type)); + } else { + bool overflows = (new_allocated < allocated) || _hb_unsigned_int_mul_overflows (new_allocated, sizeof (Type)); + if (likely (!overflows)) { + new_array = (Type *) realloc (array, new_allocated * sizeof (Type)); + } } + if (unlikely (!new_array)) + return false; + + array = new_array; + allocated = new_allocated; + + return true; + } + + inline bool resize (unsigned int size) + { + if (!alloc (size)) + return false; + len = size; return true; } @@ -472,6 +630,11 @@ struct hb_prealloced_array_t return nullptr; } + inline void qsort (int (*cmp)(const void*, const void*)) + { + ::qsort (array, len, sizeof (Type), cmp); + } + inline void qsort (void) { ::qsort (array, len, sizeof (Type), Type::cmp); @@ -483,25 +646,34 @@ struct hb_prealloced_array_t } template <typename T> - inline Type *bsearch (T *x) + inline Type *lsearch (const T &x) + { + for (unsigned int i = 0; i < len; i++) + if (0 == this->array[i].cmp (&x)) + return &array[i]; + return nullptr; + } + + template <typename T> + inline Type *bsearch (const T &x) { unsigned int i; return bfind (x, &i) ? &array[i] : nullptr; } template <typename T> - inline const Type *bsearch (T *x) const + inline const Type *bsearch (const T &x) const { unsigned int i; return bfind (x, &i) ? &array[i] : nullptr; } template <typename T> - inline bool bfind (T *x, unsigned int *i) const + inline bool bfind (const T &x, unsigned int *i) const { int min = 0, max = (int) this->len - 1; while (min <= max) { int mid = (min + max) / 2; - int c = this->array[mid].cmp (x); + int c = this->array[mid].cmp (&x); if (c < 0) max = mid - 1; else if (c > 0) @@ -512,7 +684,7 @@ struct hb_prealloced_array_t return true; } } - if (max < 0 || (max < (int) this->len && this->array[max].cmp (x) > 0)) + if (max < 0 || (max < (int) this->len && this->array[max].cmp (&x) > 0)) max++; *i = max; return false; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh index 576c169e678..3615c50e9e2 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh @@ -109,51 +109,60 @@ struct hb_set_t unsigned int i = m / ELT_BITS; unsigned int j = m & ELT_MASK; - for (; j < ELT_BITS; j++) - if (v[i] & (elt_t (1) << j)) - goto found; - for (i++; i < len (); i++) - if (v[i]) - for (j = 0; j < ELT_BITS; j++) - if (v[i] & (elt_t (1) << j)) - goto found; + const elt_t vv = v[i] & ~((elt_t (1) << j) - 1); + for (const elt_t *p = &vv; i < len (); p = &v[++i]) + if (*p) + { + *codepoint = i * ELT_BITS + elt_get_min (*p); + return true; + } *codepoint = INVALID; return false; + } + inline bool previous (hb_codepoint_t *codepoint) const + { + unsigned int m = (*codepoint - 1) & MASK; + if (m == MASK) + { + *codepoint = INVALID; + return false; + } + unsigned int i = m / ELT_BITS; + unsigned int j = m & ELT_MASK; - found: - *codepoint = i * ELT_BITS + j; - return true; + const elt_t vv = v[i] & ((elt_t (1) << (j + 1)) - 1); + for (const elt_t *p = &vv; (int) i >= 0; p = &v[--i]) + if (*p) + { + *codepoint = i * ELT_BITS + elt_get_max (*p); + return true; + } + + *codepoint = INVALID; + return false; } inline hb_codepoint_t get_min (void) const { for (unsigned int i = 0; i < len (); i++) if (v[i]) - { - elt_t e = v[i]; - for (unsigned int j = 0; j < ELT_BITS; j++) - if (e & (elt_t (1) << j)) - return i * ELT_BITS + j; - } + return i * ELT_BITS + elt_get_min (v[i]); return INVALID; } inline hb_codepoint_t get_max (void) const { for (int i = len () - 1; i >= 0; i--) if (v[i]) - { - elt_t e = v[i]; - for (int j = ELT_BITS - 1; j >= 0; j--) - if (e & (elt_t (1) << j)) - return i * ELT_BITS + j; - } + return i * ELT_BITS + elt_get_max (v[i]); return 0; } - static const unsigned int PAGE_BITS = 8192; /* Use to tune. */ + typedef unsigned long long elt_t; + static const unsigned int PAGE_BITS = 1024; static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, ""); - typedef uint64_t elt_t; + static inline unsigned int elt_get_min (const elt_t &elt) { return _hb_ctz (elt); } + static inline unsigned int elt_get_max (const elt_t &elt) { return _hb_bit_storage (elt) - 1; } #if 0 && HAVE_VECTOR_SIZE /* The vectorized version does not work with clang as non-const @@ -273,7 +282,7 @@ struct hb_set_t { page->add (g); - array++; + array = (const T *) ((const char *) array + stride); count--; } while (count && (g = *array, start <= g && g < end)); @@ -302,7 +311,7 @@ struct hb_set_t last_g = g; page->add (g); - array++; + array = (const T *) ((const char *) array + stride); count--; } while (count && (g = *array, g < end)); @@ -380,6 +389,7 @@ struct hb_set_t unsigned int na = pages.len; unsigned int nb = other->pages.len; + unsigned int next_page = na; unsigned int count = 0; unsigned int a = 0, b = 0; @@ -421,27 +431,47 @@ struct hb_set_t { a--; b--; - Op::process (page_at (--count).v, page_at (a).v, other->page_at (b).v); + count--; + page_map[count] = page_map[a]; + Op::process (page_at (count).v, page_at (a).v, other->page_at (b).v); } else if (page_map[a - 1].major > other->page_map[b - 1].major) { - a--; - if (Op::passthru_left) - page_at (--count).v = page_at (a).v; + a--; + if (Op::passthru_left) + { + count--; + page_map[count] = page_map[a]; + } } else { - b--; - if (Op::passthru_right) - page_at (--count).v = other->page_at (b).v; + b--; + if (Op::passthru_right) + { + count--; + page_map[count].major = other->page_map[b].major; + page_map[count].index = next_page++; + page_at (count).v = other->page_at (b).v; + } } } if (Op::passthru_left) while (a) - page_at (--count).v = page_at (--a).v; + { + a--; + count--; + page_map[count] = page_map [a]; + } if (Op::passthru_right) while (b) - page_at (--count).v = other->page_at (--b).v; + { + b--; + count--; + page_map[count].major = other->page_map[b].major; + page_map[count].index = next_page++; + page_at (count).v = other->page_at (b).v; + } assert (!count); } @@ -470,13 +500,13 @@ struct hb_set_t page_map_t map = {get_major (*codepoint), 0}; unsigned int i; - page_map.bfind (&map, &i); - if (i < page_map.len) + page_map.bfind (map, &i); + if (i < page_map.len && page_map[i].major == map.major) { if (pages[page_map[i].index].next (codepoint)) { *codepoint += page_map[i].major * page_t::PAGE_BITS; - return true; + return true; } i++; } @@ -492,6 +522,37 @@ struct hb_set_t *codepoint = INVALID; return false; } + inline bool previous (hb_codepoint_t *codepoint) const + { + if (unlikely (*codepoint == INVALID)) { + *codepoint = get_max (); + return *codepoint != INVALID; + } + + page_map_t map = {get_major (*codepoint), 0}; + unsigned int i; + page_map.bfind (map, &i); + if (i < page_map.len && page_map[i].major == map.major) + { + if (pages[page_map[i].index].previous (codepoint)) + { + *codepoint += page_map[i].major * page_t::PAGE_BITS; + return true; + } + } + i--; + for (; (int) i >= 0; i--) + { + hb_codepoint_t m = pages[page_map[i].index].get_max (); + if (m != INVALID) + { + *codepoint = page_map[i].major * page_t::PAGE_BITS + m; + return true; + } + } + *codepoint = INVALID; + return false; + } inline bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const { hb_codepoint_t i; @@ -503,12 +564,31 @@ struct hb_set_t return false; } + /* TODO Speed up. */ *last = *first = i; while (next (&i) && i == *last + 1) (*last)++; return true; } + inline bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const + { + hb_codepoint_t i; + + i = *first; + if (!previous (&i)) + { + *last = *first = INVALID; + return false; + } + + /* TODO Speed up. */ + *last = *first = i; + while (previous (&i) && i == *first - 1) + (*first)--; + + return true; + } inline unsigned int get_population (void) const { @@ -541,7 +621,7 @@ struct hb_set_t { page_map_t map = {get_major (g), pages.len}; unsigned int i; - if (!page_map.bfind (&map, &i)) + if (!page_map.bfind (map, &i)) { if (!resize (pages.len + 1)) return nullptr; @@ -555,7 +635,7 @@ struct hb_set_t inline page_t *page_for (hb_codepoint_t g) { page_map_t key = {get_major (g)}; - const page_map_t *found = page_map.bsearch (&key); + const page_map_t *found = page_map.bsearch (key); if (found) return &pages[found->index]; return nullptr; @@ -563,7 +643,7 @@ struct hb_set_t inline const page_t *page_for (hb_codepoint_t g) const { page_map_t key = {get_major (g)}; - const page_map_t *found = page_map.bsearch (&key); + const page_map_t *found = page_map.bsearch (key); if (found) return &pages[found->index]; return nullptr; 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 0b4f871e852..07cf9d09b55 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc @@ -50,6 +50,13 @@ hb_set_create (void) return set; } +static const hb_set_t _hb_set_nil = { + HB_OBJECT_HEADER_STATIC, + true, /* in_error */ + + {0} /* elts */ +}; + /** * hb_set_get_empty: * @@ -60,13 +67,6 @@ hb_set_create (void) hb_set_t * hb_set_get_empty (void) { - static const hb_set_t _hb_set_nil = { - HB_OBJECT_HEADER_STATIC, - true, /* in_error */ - - {0} /* elts */ - }; - return const_cast<hb_set_t *> (&_hb_set_nil); } @@ -437,7 +437,9 @@ hb_set_get_max (const hb_set_t *set) * @set: a set. * @codepoint: (inout): * - * + * Gets the next number in @set that is greater than current value of @codepoint. + * + * Set @codepoint to %HB_SET_VALUE_INVALID to get started. * * Return value: whether there was a next value. * @@ -451,6 +453,26 @@ hb_set_next (const hb_set_t *set, } /** + * hb_set_previous: + * @set: a set. + * @codepoint: (inout): + * + * Gets the previous number in @set that is slower than current value of @codepoint. + * + * Set @codepoint to %HB_SET_VALUE_INVALID to get started. + * + * Return value: whether there was a previous value. + * + * Since: 1.8.0 + **/ +hb_bool_t +hb_set_previous (const hb_set_t *set, + hb_codepoint_t *codepoint) +{ + return set->previous (codepoint); +} + +/** * hb_set_next_range: * @set: a set. * @first: (out): output first codepoint in the range. @@ -459,6 +481,8 @@ hb_set_next (const hb_set_t *set, * Gets the next consecutive range of numbers in @set that * are greater than current value of @last. * + * Set @last to %HB_SET_VALUE_INVALID to get started. + * * Return value: whether there was a next range. * * Since: 0.9.7 @@ -470,3 +494,26 @@ hb_set_next_range (const hb_set_t *set, { return set->next_range (first, last); } + +/** + * hb_set_previous_range: + * @set: a set. + * @first: (inout): input current first and output first codepoint in the range. + * @last: (out): output last codepoint in the range. + * + * Gets the previous consecutive range of numbers in @set that + * are greater than current value of @last. + * + * Set @first to %HB_SET_VALUE_INVALID to get started. + * + * Return value: whether there was a previous range. + * + * Since: 1.8.0 + **/ +hb_bool_t +hb_set_previous_range (const hb_set_t *set, + hb_codepoint_t *first, + hb_codepoint_t *last) +{ + return set->previous_range (first, last); +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h index 2ce406073ce..b0f82f82208 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h @@ -129,25 +129,36 @@ hb_set_symmetric_difference (hb_set_t *set, HB_EXTERN unsigned int hb_set_get_population (const hb_set_t *set); -/* Returns -1 if set empty. */ +/* Returns HB_SET_VALUE_INVALID if set empty. */ HB_EXTERN hb_codepoint_t hb_set_get_min (const hb_set_t *set); -/* Returns -1 if set empty. */ +/* Returns HB_SET_VALUE_INVALID if set empty. */ HB_EXTERN hb_codepoint_t hb_set_get_max (const hb_set_t *set); -/* Pass -1 in to get started. */ +/* Pass HB_SET_VALUE_INVALID in to get started. */ HB_EXTERN hb_bool_t hb_set_next (const hb_set_t *set, hb_codepoint_t *codepoint); -/* Pass -1 for first and last to get started. */ +/* Pass HB_SET_VALUE_INVALID in to get started. */ +HB_EXTERN hb_bool_t +hb_set_previous (const hb_set_t *set, + hb_codepoint_t *codepoint); + +/* Pass HB_SET_VALUE_INVALID for first and last to get started. */ HB_EXTERN hb_bool_t hb_set_next_range (const hb_set_t *set, hb_codepoint_t *first, hb_codepoint_t *last); +/* Pass HB_SET_VALUE_INVALID for first and last to get started. */ +HB_EXTERN hb_bool_t +hb_set_previous_range (const hb_set_t *set, + hb_codepoint_t *first, + hb_codepoint_t *last); + HB_END_DECLS 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 new file mode 100644 index 00000000000..0b84c856c2b --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc @@ -0,0 +1,307 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger, Roderick Sheeter + */ + +#include "hb-open-type-private.hh" +#include "hb-ot-glyf-table.hh" +#include "hb-set.h" +#include "hb-subset-glyf.hh" +#include "hb-subset-plan.hh" + +static bool +_calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf, + hb_prealloced_array_t<hb_codepoint_t> &glyph_ids, + hb_bool_t drop_hints, + bool *use_short_loca /* OUT */, + unsigned int *glyf_size /* OUT */, + unsigned int *loca_size /* OUT */, + hb_prealloced_array_t<unsigned int> *instruction_ranges /* OUT */) +{ + unsigned int total = 0; + for (unsigned int i = 0; i < glyph_ids.len; i++) + { + hb_codepoint_t next_glyph = glyph_ids[i]; + unsigned int *instruction_start = instruction_ranges->push(); + unsigned int *instruction_end = instruction_ranges->push(); + *instruction_start = 0; + *instruction_end = 0; + + unsigned int start_offset, end_offset; + if (unlikely (!(glyf.get_offsets(next_glyph, &start_offset, &end_offset) + && glyf.remove_padding(start_offset, &end_offset)))) + { + DEBUG_MSG(SUBSET, nullptr, "Invalid gid %d", next_glyph); + continue; + } + if (end_offset - start_offset < OT::glyf::GlyphHeader::static_size) + continue; /* 0-length glyph */ + + if (drop_hints) + { + if (unlikely (!glyf.get_instruction_offsets(start_offset, end_offset, + instruction_start, instruction_end))) + { + DEBUG_MSG(SUBSET, nullptr, "Unable to get instruction offsets for %d", next_glyph); + return false; + } + } + + total += end_offset - start_offset - (*instruction_end - *instruction_start); + /* round2 so short loca will work */ + total += total % 2; + } + + *glyf_size = total; + *use_short_loca = (total <= 131070); + *loca_size = (glyph_ids.len + 1) + * (*use_short_loca ? sizeof(OT::HBUINT16) : sizeof(OT::HBUINT32)); + + DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca", + total, + *loca_size, + *use_short_loca ? "short" : "long"); + return true; +} + +static bool +_write_loca_entry (unsigned int id, + unsigned int offset, + bool is_short, + void *loca_prime, + unsigned int loca_size) +{ + unsigned int entry_size = is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32); + if ((id + 1) * entry_size <= loca_size) + { + if (is_short) { + ((OT::HBUINT16*) loca_prime) [id].set (offset / 2); + } else { + ((OT::HBUINT32*) loca_prime) [id].set (offset); + } + return true; + } + + // Offset was not written because the write is out of bounds. + DEBUG_MSG (SUBSET, + nullptr, + "WARNING: Attempted to write an out of bounds loca entry at index %d. Loca size is %d.", + id, + loca_size); + return false; +} + +static void +_update_components (hb_subset_plan_t * plan, + char * glyph_start, + unsigned int length) + +{ + OT::glyf::CompositeGlyphHeader::Iterator iterator; + if (OT::glyf::CompositeGlyphHeader::get_iterator (glyph_start, + length, + &iterator)) + { + do + { + hb_codepoint_t new_gid; + if (!hb_subset_plan_new_gid_for_old_id (plan, + iterator.current->glyphIndex, + &new_gid)) + continue; + + ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex.set (new_gid); + } while (iterator.move_to_next()); + } +} + +static bool _remove_composite_instruction_flag(char *glyf_prime, unsigned int length) +{ + /* remove WE_HAVE_INSTRUCTIONS from flags in dest */ + OT::glyf::CompositeGlyphHeader::Iterator composite_it; + if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (glyf_prime, length, &composite_it))) return false; + const OT::glyf::CompositeGlyphHeader *glyph; + do { + glyph = composite_it.current; + OT::HBUINT16 *flags = const_cast<OT::HBUINT16 *> (&glyph->flags); + flags->set ( (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS); + } while (composite_it.move_to_next()); + return true; +} + +static bool +_write_glyf_and_loca_prime (hb_subset_plan_t *plan, + const OT::glyf::accelerator_t &glyf, + const char *glyf_data, + bool use_short_loca, + hb_prealloced_array_t<unsigned int> &instruction_ranges, + unsigned int glyf_prime_size, + char *glyf_prime_data /* OUT */, + unsigned int loca_prime_size, + char *loca_prime_data /* OUT */) +{ + hb_prealloced_array_t<hb_codepoint_t> &glyph_ids = plan->gids_to_retain_sorted; + char *glyf_prime_data_next = glyf_prime_data; + + bool success = true; + for (unsigned int i = 0; i < glyph_ids.len; i++) + { + unsigned int start_offset, end_offset; + if (unlikely (!(glyf.get_offsets (glyph_ids[i], &start_offset, &end_offset) + && glyf.remove_padding(start_offset, &end_offset)))) + end_offset = start_offset = 0; + unsigned int instruction_start = instruction_ranges[i * 2]; + unsigned int instruction_end = instruction_ranges[i * 2 + 1]; + + int length = end_offset - start_offset - (instruction_end - instruction_start); + length += length % 2; + + if (glyf_prime_data_next + length > glyf_prime_data + glyf_prime_size) + { + DEBUG_MSG (SUBSET, + nullptr, + "WARNING: Attempted to write an out of bounds glyph entry for gid %d (length %d)", + i, length); + return false; + } + + if (instruction_start == instruction_end) + memcpy (glyf_prime_data_next, glyf_data + start_offset, length); + else + { + memcpy (glyf_prime_data_next, glyf_data + start_offset, instruction_start - start_offset); + memcpy (glyf_prime_data_next + instruction_start - start_offset, glyf_data + instruction_end, end_offset - instruction_end); + /* if the instructions end at the end this was a composite glyph, else simple */ + if (instruction_end == end_offset) + { + if (unlikely (!_remove_composite_instruction_flag (glyf_prime_data_next, length))) return false; + } + else + /* zero instruction length, which is just before instruction_start */ + memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2); + } + + success = success && _write_loca_entry (i, + glyf_prime_data_next - glyf_prime_data, + use_short_loca, + loca_prime_data, + loca_prime_size); + _update_components (plan, glyf_prime_data_next, length); + + glyf_prime_data_next += length; + } + + success = success && _write_loca_entry (glyph_ids.len, + glyf_prime_data_next - glyf_prime_data, + use_short_loca, + loca_prime_data, + loca_prime_size); + return success; +} + +static bool +_hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf, + const char *glyf_data, + hb_subset_plan_t *plan, + bool *use_short_loca, + hb_blob_t **glyf_prime /* OUT */, + hb_blob_t **loca_prime /* OUT */) +{ + // TODO(grieger): Sanity check allocation size for the new table. + hb_prealloced_array_t<hb_codepoint_t> &glyphs_to_retain = plan->gids_to_retain_sorted; + + unsigned int glyf_prime_size; + unsigned int loca_prime_size; + hb_prealloced_array_t<unsigned int> instruction_ranges; + instruction_ranges.init(); + + if (unlikely (!_calculate_glyf_and_loca_prime_size (glyf, + glyphs_to_retain, + plan->drop_hints, + use_short_loca, + &glyf_prime_size, + &loca_prime_size, + &instruction_ranges))) { + instruction_ranges.finish(); + return false; + } + + char *glyf_prime_data = (char *) calloc (1, glyf_prime_size); + char *loca_prime_data = (char *) calloc (1, loca_prime_size); + if (unlikely (!_write_glyf_and_loca_prime (plan, glyf, glyf_data, + *use_short_loca, + instruction_ranges, + glyf_prime_size, glyf_prime_data, + loca_prime_size, loca_prime_data))) { + free (glyf_prime_data); + free (loca_prime_data); + instruction_ranges.finish(); + return false; + } + instruction_ranges.finish(); + + *glyf_prime = hb_blob_create (glyf_prime_data, + glyf_prime_size, + HB_MEMORY_MODE_READONLY, + glyf_prime_data, + free); + *loca_prime = hb_blob_create (loca_prime_data, + loca_prime_size, + HB_MEMORY_MODE_READONLY, + loca_prime_data, + free); + return true; +} + +/** + * hb_subset_glyf: + * Subsets the glyph table according to a provided plan. + * + * Return value: subsetted glyf table. + * + * Since: 1.7.5 + **/ +bool +hb_subset_glyf_and_loca (hb_subset_plan_t *plan, + bool *use_short_loca, /* OUT */ + hb_blob_t **glyf_prime, /* OUT */ + hb_blob_t **loca_prime /* OUT */) +{ + hb_blob_t *glyf_blob = OT::Sanitizer<OT::glyf>().sanitize (plan->source->reference_table (HB_OT_TAG_glyf)); + const char *glyf_data = hb_blob_get_data(glyf_blob, nullptr); + + OT::glyf::accelerator_t glyf; + glyf.init(plan->source); + bool result = _hb_subset_glyf_and_loca (glyf, + glyf_data, + plan, + use_short_loca, + glyf_prime, + loca_prime); + + hb_blob_destroy (glyf_blob); + glyf.fini(); + + return result; +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh new file mode 100644 index 00000000000..99b76db9bbe --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh @@ -0,0 +1,40 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef HB_SUBSET_GLYF_HH +#define HB_SUBSET_GLYF_HH + +#include "hb-private.hh" + +#include "hb-subset-plan.hh" + +HB_INTERNAL bool +hb_subset_glyf_and_loca (hb_subset_plan_t *plan, + bool *use_short_loca, /* OUT */ + hb_blob_t **glyf_prime /* OUT */, + hb_blob_t **loca_prime /* OUT */); + +#endif /* HB_SUBSET_GLYF_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc new file mode 100644 index 00000000000..c4003dd3ad1 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc @@ -0,0 +1,119 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod + */ + +#include "hb-object-private.hh" +#include "hb-subset-private.hh" +#include "hb-set-private.hh" + +/** + * hb_subset_input_create_or_fail: + * + * Return value: New subset input. + * + * Since: 1.8.0 + **/ +hb_subset_input_t * +hb_subset_input_create_or_fail (void) +{ + hb_subset_input_t *input = hb_object_create<hb_subset_input_t>(); + + if (unlikely (!input)) + return nullptr; + + input->unicodes = hb_set_create (); + input->glyphs = hb_set_create (); + + return input; +} + +/** + * hb_subset_input_reference: (skip) + * @subset_input: a subset_input. + * + * + * + * Return value: + * + * Since: 1.8.0 + **/ +hb_subset_input_t * +hb_subset_input_reference (hb_subset_input_t *subset_input) +{ + return hb_object_reference (subset_input); +} + +/** + * hb_subset_input_destroy: + * @subset_input: a subset_input. + * + * Since: 1.8.0 + **/ +void +hb_subset_input_destroy(hb_subset_input_t *subset_input) +{ + if (!hb_object_destroy (subset_input)) return; + + hb_set_destroy (subset_input->unicodes); + hb_set_destroy (subset_input->glyphs); + + free (subset_input); +} + +/** + * hb_subset_input_unicode_set: + * @subset_input: a subset_input. + * + * Since: 1.8.0 + **/ +HB_EXTERN hb_set_t * +hb_subset_input_unicode_set (hb_subset_input_t *subset_input) +{ + return subset_input->unicodes; +} + +/** + * hb_subset_input_glyph_set: + * @subset_input: a subset_input. + * + * Since: 1.8.0 + **/ +HB_EXTERN hb_set_t * +hb_subset_input_glyph_set (hb_subset_input_t *subset_input) +{ + return subset_input->glyphs; +} + +/** + * hb_subset_input_drop_hints: + * @subset_input: a subset_input. + * + * Since: 1.8.0 + **/ +HB_EXTERN hb_bool_t * +hb_subset_input_drop_hints (hb_subset_input_t *subset_input) +{ + return &subset_input->drop_hints; +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc new file mode 100644 index 00000000000..f8a09efe4d1 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc @@ -0,0 +1,227 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger, Roderick Sheeter + */ + +#include "hb-subset-private.hh" + +#include "hb-subset-plan.hh" +#include "hb-ot-cmap-table.hh" +#include "hb-ot-glyf-table.hh" + +static int +_hb_codepoint_t_cmp (const void *pa, const void *pb) +{ + hb_codepoint_t a = * (hb_codepoint_t *) pa; + hb_codepoint_t b = * (hb_codepoint_t *) pb; + + return a < b ? -1 : a > b ? +1 : 0; +} + +hb_bool_t +hb_subset_plan_new_gid_for_codepoint (hb_subset_plan_t *plan, + hb_codepoint_t codepoint, + hb_codepoint_t *new_gid) +{ + // TODO actual map, delete this garbage. + for (unsigned int i = 0; i < plan->codepoints.len; i++) + { + if (plan->codepoints[i] != codepoint) continue; + if (!hb_subset_plan_new_gid_for_old_id(plan, plan->gids_to_retain[i], new_gid)) + { + return false; + } + return true; + } + return false; +} + +hb_bool_t +hb_subset_plan_new_gid_for_old_id (hb_subset_plan_t *plan, + hb_codepoint_t old_gid, + hb_codepoint_t *new_gid) +{ + // the index in old_gids is the new gid; only up to codepoints.len are valid + for (unsigned int i = 0; i < plan->gids_to_retain_sorted.len; i++) + { + if (plan->gids_to_retain_sorted[i] == old_gid) + { + *new_gid = i; + return true; + } + } + return false; +} + +hb_bool_t +hb_subset_plan_add_table (hb_subset_plan_t *plan, + hb_tag_t tag, + hb_blob_t *contents) +{ + hb_blob_t *source_blob = plan->source->reference_table (tag); + DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes", HB_UNTAG(tag), hb_blob_get_length (contents), hb_blob_get_length (source_blob)); + hb_blob_destroy (source_blob); + return hb_subset_face_add_table(plan->dest, tag, contents); +} + +static void +_populate_codepoints (hb_set_t *input_codepoints, + hb_prealloced_array_t<hb_codepoint_t>& plan_codepoints) +{ + plan_codepoints.alloc (hb_set_get_population (input_codepoints)); + hb_codepoint_t cp = -1; + while (hb_set_next (input_codepoints, &cp)) { + hb_codepoint_t *wr = plan_codepoints.push(); + *wr = cp; + } + plan_codepoints.qsort (_hb_codepoint_t_cmp); +} + +static void +_add_gid_and_children (const OT::glyf::accelerator_t &glyf, + hb_codepoint_t gid, + hb_set_t *gids_to_retain) +{ + if (hb_set_has (gids_to_retain, gid)) + // Already visited this gid, ignore. + return; + + hb_set_add (gids_to_retain, gid); + + OT::glyf::CompositeGlyphHeader::Iterator composite; + if (glyf.get_composite (gid, &composite)) + { + do + { + _add_gid_and_children (glyf, (hb_codepoint_t) composite.current->glyphIndex, gids_to_retain); + } while (composite.move_to_next()); + } +} + +static void +_populate_gids_to_retain (hb_face_t *face, + hb_prealloced_array_t<hb_codepoint_t>& codepoints, + hb_prealloced_array_t<hb_codepoint_t>& old_gids, + hb_prealloced_array_t<hb_codepoint_t>& old_gids_sorted) +{ + OT::cmap::accelerator_t cmap; + OT::glyf::accelerator_t glyf; + cmap.init (face); + glyf.init (face); + + hb_auto_array_t<unsigned int> bad_indices; + + old_gids.alloc (codepoints.len); + for (unsigned int i = 0; i < codepoints.len; i++) + { + hb_codepoint_t gid; + if (!cmap.get_nominal_glyph (codepoints[i], &gid)) + { + gid = -1; + *(bad_indices.push ()) = i; + } + *(old_gids.push ()) = gid; + } + + /* Generally there shouldn't be any */ + while (bad_indices.len > 0) + { + unsigned int i = bad_indices[bad_indices.len - 1]; + bad_indices.pop (); + DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", codepoints[i]); + codepoints.remove (i); + old_gids.remove (i); + } + + // Populate a full set of glyphs to retain by adding all referenced + // composite glyphs. + // TODO expand with glyphs reached by G* + hb_set_t * all_gids_to_retain = hb_set_create (); + _add_gid_and_children (glyf, 0, all_gids_to_retain); + for (unsigned int i = 0; i < old_gids.len; i++) + _add_gid_and_children (glyf, old_gids[i], all_gids_to_retain); + + // Transfer to a sorted list. + old_gids_sorted.alloc (hb_set_get_population (all_gids_to_retain)); + hb_codepoint_t gid = HB_SET_VALUE_INVALID; + while (hb_set_next (all_gids_to_retain, &gid)) + *(old_gids_sorted.push ()) = gid; + + hb_set_destroy (all_gids_to_retain); + glyf.fini (); + cmap.fini (); +} + +/** + * hb_subset_plan_create: + * Computes a plan for subsetting the supplied face according + * to a provide profile and input. The plan describes + * which tables and glyphs should be retained. + * + * Return value: New subset plan. + * + * Since: 1.7.5 + **/ +hb_subset_plan_t * +hb_subset_plan_create (hb_face_t *face, + hb_subset_profile_t *profile, + hb_subset_input_t *input) +{ + hb_subset_plan_t *plan = hb_object_create<hb_subset_plan_t> (); + + plan->codepoints.init(); + plan->gids_to_retain.init(); + plan->gids_to_retain_sorted.init(); + plan->source = hb_face_reference (face); + plan->dest = hb_subset_face_create (); + plan->drop_hints = input->drop_hints; + + _populate_codepoints (input->unicodes, plan->codepoints); + _populate_gids_to_retain (face, + plan->codepoints, + plan->gids_to_retain, + plan->gids_to_retain_sorted); + + return plan; +} + +/** + * hb_subset_plan_destroy: + * + * Since: 1.7.5 + **/ +void +hb_subset_plan_destroy (hb_subset_plan_t *plan) +{ + if (!hb_object_destroy (plan)) return; + + plan->codepoints.finish (); + plan->gids_to_retain.finish (); + plan->gids_to_retain_sorted.finish (); + + hb_face_destroy (plan->source); + hb_face_destroy (plan->dest); + + free (plan); +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh new file mode 100644 index 00000000000..d1b66b44d54 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh @@ -0,0 +1,85 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger, Roderick Sheeter + */ + +#ifndef HB_SUBSET_PLAN_HH +#define HB_SUBSET_PLAN_HH + +#include "hb-private.hh" + +#include "hb-subset.h" + +#include "hb-object-private.hh" + +struct hb_subset_plan_t { + hb_object_header_t header; + ASSERT_POD (); + + hb_bool_t drop_hints; + + // TODO(Q1) actual map, drop this crap + // Look at me ma, I'm a poor mans map codepoint : new gid + // codepoints is sorted and aligned with gids_to_retain. + + // These first two lists provide a mapping from cp -> gid + // As a result it does not list the full set of glyphs to retain. + hb_prealloced_array_t<hb_codepoint_t> codepoints; + hb_prealloced_array_t<hb_codepoint_t> gids_to_retain; + + // This list contains the complete set of glyphs to retain and may contain + // more glyphs then the lists above. + hb_prealloced_array_t<hb_codepoint_t> gids_to_retain_sorted; + + // Plan is only good for a specific source/dest so keep them with it + hb_face_t *source; + hb_face_t *dest; +}; + +typedef struct hb_subset_plan_t hb_subset_plan_t; + +HB_INTERNAL hb_subset_plan_t * +hb_subset_plan_create (hb_face_t *face, + hb_subset_profile_t *profile, + hb_subset_input_t *input); + +HB_INTERNAL hb_bool_t +hb_subset_plan_new_gid_for_old_id(hb_subset_plan_t *plan, + hb_codepoint_t old_gid, + hb_codepoint_t *new_gid /* OUT */); + +HB_INTERNAL hb_bool_t +hb_subset_plan_new_gid_for_codepoint(hb_subset_plan_t *plan, + hb_codepoint_t codepont, + hb_codepoint_t *new_gid /* OUT */); + +HB_INTERNAL hb_bool_t +hb_subset_plan_add_table(hb_subset_plan_t *plan, + hb_tag_t tag, + hb_blob_t *contents); + +HB_INTERNAL void +hb_subset_plan_destroy (hb_subset_plan_t *plan); + +#endif /* HB_SUBSET_PLAN_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-private.hh new file mode 100644 index 00000000000..5fa72527671 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-private.hh @@ -0,0 +1,62 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger, Roderick Sheeter + */ + +#ifndef HB_SUBSET_PRIVATE_HH +#define HB_SUBSET_PRIVATE_HH + + +#include "hb-private.hh" + +#include "hb-subset.h" + +#include "hb-font-private.hh" + +typedef struct hb_subset_face_data_t hb_subset_face_data_t; + +struct hb_subset_input_t { + hb_object_header_t header; + ASSERT_POD (); + + hb_set_t *unicodes; + hb_set_t *glyphs; + + hb_bool_t drop_hints; + /* TODO + * + * features + * lookups + * nameIDs + * ... + */ +}; + +HB_INTERNAL hb_face_t * +hb_subset_face_create (void); + +HB_INTERNAL hb_bool_t +hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob); + +#endif /* HB_SUBSET_PRIVATE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc new file mode 100644 index 00000000000..9ebe5d31da2 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc @@ -0,0 +1,339 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger, Rod Sheeter, Behdad Esfahbod + */ + +#include "hb-private.hh" +#include "hb-object-private.hh" +#include "hb-open-type-private.hh" + +#include "hb-subset-glyf.hh" +#include "hb-subset-private.hh" +#include "hb-subset-plan.hh" + +#include "hb-open-file-private.hh" +#include "hb-ot-cmap-table.hh" +#include "hb-ot-glyf-table.hh" +#include "hb-ot-hdmx-table.hh" +#include "hb-ot-head-table.hh" +#include "hb-ot-hhea-table.hh" +#include "hb-ot-hmtx-table.hh" +#include "hb-ot-maxp-table.hh" +#include "hb-ot-os2-table.hh" + + +#ifndef HB_NO_VISIBILITY +const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; +#endif + + +struct hb_subset_profile_t { + hb_object_header_t header; + ASSERT_POD (); +}; + +/** + * hb_subset_profile_create: + * + * Return value: New profile with default settings. + * + * Since: 1.8.0 + **/ +hb_subset_profile_t * +hb_subset_profile_create () +{ + return hb_object_create<hb_subset_profile_t>(); +} + +/** + * hb_subset_profile_destroy: + * + * Since: 1.8.0 + **/ +void +hb_subset_profile_destroy (hb_subset_profile_t *profile) +{ + if (!hb_object_destroy (profile)) return; + + free (profile); +} + +template<typename TableType> +static bool +_subset (hb_subset_plan_t *plan) +{ + OT::Sanitizer<TableType> sanitizer; + + hb_blob_t *source_blob = sanitizer.sanitize (plan->source->reference_table (TableType::tableTag)); + const TableType *table = OT::Sanitizer<TableType>::lock_instance (source_blob); + + hb_bool_t result = false; + if (table != &OT::Null(TableType)) + result = table->subset(plan); + + hb_blob_destroy (source_blob); + hb_tag_t tag = TableType::tableTag; + DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG(tag), result ? "success" : "FAILED!"); + return result; +} + + +/* + * A face that has add_table(). + */ + +struct hb_subset_face_data_t +{ + struct table_entry_t + { + inline int cmp (const hb_tag_t *t) const + { + if (*t < tag) return -1; + if (*t > tag) return -1; + return 0; + } + + hb_tag_t tag; + hb_blob_t *blob; + }; + + hb_prealloced_array_t<table_entry_t, 32> tables; +}; + +static hb_subset_face_data_t * +_hb_subset_face_data_create (void) +{ + hb_subset_face_data_t *data = (hb_subset_face_data_t *) calloc (1, sizeof (hb_subset_face_data_t)); + if (unlikely (!data)) + return nullptr; + + return data; +} + +static void +_hb_subset_face_data_destroy (void *user_data) +{ + hb_subset_face_data_t *data = (hb_subset_face_data_t *) user_data; + + for (unsigned int i = 0; i < data->tables.len; i++) + hb_blob_destroy (data->tables[i].blob); + + data->tables.finish (); + + free (data); +} + +static hb_blob_t * +_hb_subset_face_data_reference_blob (hb_subset_face_data_t *data) +{ + + unsigned int table_count = data->tables.len; + unsigned int face_length = table_count * 16 + 12; + + for (unsigned int i = 0; i < table_count; i++) + face_length += _hb_ceil_to_4 (hb_blob_get_length (data->tables.array[i].blob)); + + char *buf = (char *) malloc (face_length); + if (unlikely (!buf)) + return nullptr; + + OT::hb_serialize_context_t c (buf, face_length); + OT::OpenTypeFontFile *f = c.start_serialize<OT::OpenTypeFontFile> (); + + bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2')); + hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag; + + OT::Supplier<hb_tag_t> tags_supplier (&data->tables[0].tag, table_count, sizeof (data->tables[0])); + OT::Supplier<hb_blob_t *> blobs_supplier (&data->tables[0].blob, table_count, sizeof (data->tables[0])); + bool ret = f->serialize_single (&c, + sfnt_tag, + tags_supplier, + blobs_supplier, + table_count); + + c.end_serialize (); + + if (unlikely (!ret)) + { + free (buf); + return nullptr; + } + + return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, free); +} + +static hb_blob_t * +_hb_subset_face_reference_table (hb_face_t *face, hb_tag_t tag, void *user_data) +{ + hb_subset_face_data_t *data = (hb_subset_face_data_t *) user_data; + + if (!tag) + return _hb_subset_face_data_reference_blob (data); + + hb_subset_face_data_t::table_entry_t *entry = data->tables.lsearch (tag); + if (entry) + return hb_blob_reference (entry->blob); + + return nullptr; +} + +/* TODO: Move this to hb-face.h and rename to hb_face_builder_create() + * with hb_face_builder_add_table(). */ +hb_face_t * +hb_subset_face_create (void) +{ + hb_subset_face_data_t *data = _hb_subset_face_data_create (); + if (unlikely (!data)) return hb_face_get_empty (); + + return hb_face_create_for_tables (_hb_subset_face_reference_table, + data, + _hb_subset_face_data_destroy); +} + +hb_bool_t +hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob) +{ + if (unlikely (face->destroy != _hb_subset_face_data_destroy)) + return false; + + hb_subset_face_data_t *data = (hb_subset_face_data_t *) face->user_data; + hb_subset_face_data_t::table_entry_t *entry = data->tables.push (); + if (unlikely (!entry)) + return false; + + entry->tag = tag; + entry->blob = hb_blob_reference (blob); + + return true; +} + +static bool +_subset_table (hb_subset_plan_t *plan, + hb_tag_t tag) +{ + DEBUG_MSG(SUBSET, nullptr, "begin subset %c%c%c%c", HB_UNTAG(tag)); + bool result = true; + switch (tag) { + case HB_OT_TAG_glyf: + result = _subset<const OT::glyf> (plan); + break; + case HB_OT_TAG_hdmx: + result = _subset<const OT::hdmx> (plan); + break; + case HB_OT_TAG_head: + // TODO that won't work well if there is no glyf + DEBUG_MSG(SUBSET, nullptr, "skip head, handled by glyf"); + result = true; + break; + case HB_OT_TAG_hhea: + DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx"); + return true; + case HB_OT_TAG_hmtx: + result = _subset<const OT::hmtx> (plan); + break; + case HB_OT_TAG_maxp: + result = _subset<const OT::maxp> (plan); + break; + case HB_OT_TAG_loca: + DEBUG_MSG(SUBSET, nullptr, "skip loca handled by glyf"); + return true; + case HB_OT_TAG_cmap: + result = _subset<const OT::cmap> (plan); + break; + case HB_OT_TAG_os2: + result = _subset<const OT::os2> (plan); + break; + default: + hb_blob_t *source_table = hb_face_reference_table(plan->source, tag); + if (likely (source_table)) + result = hb_subset_plan_add_table(plan, tag, source_table); + else + result = false; + hb_blob_destroy (source_table); + break; + } + DEBUG_MSG(SUBSET, nullptr, "subset %c%c%c%c %s", HB_UNTAG(tag), result ? "ok" : "FAILED"); + return result; +} + +static bool +_should_drop_table(hb_subset_plan_t *plan, hb_tag_t tag) +{ + switch (tag) { + case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */ + case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */ + case HB_TAG ('f', 'p', 'g', 'm'): /* hint table, fallthrough */ + case HB_TAG ('p', 'r', 'e', 'p'): /* hint table, fallthrough */ + case HB_TAG ('h', 'd', 'm', 'x'): /* hint table, fallthrough */ + case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */ + return plan->drop_hints; + case HB_TAG ('G', 'D', 'E', 'F'): /* temporary */ + case HB_TAG ('G', 'P', 'O', 'S'): /* temporary */ + case HB_TAG ('G', 'S', 'U', 'B'): /* temporary */ + case HB_TAG ('D', 'S', 'I', 'G'): + return true; + default: + return false; + } +} + +/** + * hb_subset: + * @source: font face data to be subset. + * @profile: profile to use for the subsetting. + * @input: input to use for the subsetting. + * + * Subsets a font according to provided profile and input. + **/ +hb_face_t * +hb_subset (hb_face_t *source, + hb_subset_profile_t *profile, + hb_subset_input_t *input) +{ + if (unlikely (!profile || !input || !source)) return hb_face_get_empty(); + + hb_subset_plan_t *plan = hb_subset_plan_create (source, profile, input); + + hb_tag_t table_tags[32]; + unsigned int offset = 0, count; + bool success = true; + do { + count = ARRAY_LENGTH (table_tags); + hb_face_get_table_tags (source, offset, &count, table_tags); + for (unsigned int i = 0; i < count; i++) + { + hb_tag_t tag = table_tags[i]; + if (_should_drop_table(plan, tag)) + { + DEBUG_MSG(SUBSET, nullptr, "drop %c%c%c%c", HB_UNTAG(tag)); + continue; + } + success = success && _subset_table (plan, tag); + } + } while (count == ARRAY_LENGTH (table_tags)); + + hb_face_t *result = success ? hb_face_reference(plan->dest) : hb_face_get_empty(); + hb_subset_plan_destroy (plan); + return result; +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h new file mode 100644 index 00000000000..55ce25b0a1a --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h @@ -0,0 +1,83 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Rod Sheeter + */ + +#ifndef HB_SUBSET_H +#define HB_SUBSET_H + +#include "hb.h" + +HB_BEGIN_DECLS + +/* + * hb_subset_profile_t + * Things that change based on target environment, e.g. OS. + * Threadsafe for multiple concurrent subset operations. + */ + +typedef struct hb_subset_profile_t hb_subset_profile_t; + +HB_EXTERN hb_subset_profile_t * +hb_subset_profile_create (void); + +HB_EXTERN void +hb_subset_profile_destroy (hb_subset_profile_t *profile); + +/* + * hb_subset_input_t + * + * Things that change based on the input. Characters to keep, etc. + */ + +typedef struct hb_subset_input_t hb_subset_input_t; + +HB_EXTERN hb_subset_input_t * +hb_subset_input_create_or_fail (void); + +HB_EXTERN hb_subset_input_t * +hb_subset_input_reference (hb_subset_input_t *subset_input); + +HB_EXTERN void +hb_subset_input_destroy (hb_subset_input_t *subset_input); + +HB_EXTERN hb_set_t * +hb_subset_input_unicode_set (hb_subset_input_t *subset_input); + +HB_EXTERN hb_set_t * +hb_subset_input_glyph_set (hb_subset_input_t *subset_input); + +HB_EXTERN hb_bool_t * +hb_subset_input_drop_hints (hb_subset_input_t *subset_input); + +/* hb_subset() */ + +HB_EXTERN hb_face_t * +hb_subset (hb_face_t *source, + hb_subset_profile_t *profile, + hb_subset_input_t *input); + +HB_END_DECLS + +#endif /* HB_SUBSET_H */ 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 5e05baa869b..cd25769db1a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc @@ -1025,8 +1025,6 @@ retry: pos->x_advance = x_mult * (int32_t) info->mask; pos->x_offset = x_mult * (backward ? -info->var1.i32 : info->var1.i32); pos->y_offset = y_mult * info->var2.i32; - - info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } if (backward) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc index 72de189d825..d221e9da221 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc @@ -37,7 +37,9 @@ using namespace OT; +#ifndef HB_NO_VISIBILITY const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {}; +#endif int main (int argc, char **argv) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc index 4b429eab3c2..636b0037542 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc @@ -101,7 +101,7 @@ main (int argc, char **argv) bool ret = true; char line[BUFSIZ], out[BUFSIZ]; - while (fgets (line, sizeof(line), stdin) != 0) + while (fgets (line, sizeof(line), stdin) != nullptr) { hb_buffer_clear_contents (buf); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/test-unicode-ranges.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-unicode-ranges.cc new file mode 100644 index 00000000000..dbc5fa426de --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/test-unicode-ranges.cc @@ -0,0 +1,67 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "hb-private.hh" + +#include "hb-ot-os2-unicode-ranges.hh" + +void +test (hb_codepoint_t cp, unsigned int bit) +{ + if (OT::hb_get_unicode_range_bit (cp) != bit) + { + fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.", + OT::hb_get_unicode_range_bit (cp), + cp, + bit); + abort(); + } +} + +void +test_get_unicode_range_bit (void) +{ + test (0x0000, 0); + test (0x0042, 0); + test (0x007F, 0); + test (0x0080, 1); + + test (0x30A0, 50); + test (0x30B1, 50); + test (0x30FF, 50); + + test (0x10FFFD, 90); + + test (0x30000, -1); + test (0x110000, -1); +} + +int +main (void) +{ + test_get_unicode_range_bit (); + return 0; +} diff --git a/Build/source/libs/harfbuzz/include/Makefile.am b/Build/source/libs/harfbuzz/include/Makefile.am index 4eeb971c669..0098cff3704 100644 --- a/Build/source/libs/harfbuzz/include/Makefile.am +++ b/Build/source/libs/harfbuzz/include/Makefile.am @@ -23,6 +23,7 @@ hdr_links = \ $(HARFBUZZ_SRC)/hb-set.h \ $(HARFBUZZ_SRC)/hb-shape.h \ $(HARFBUZZ_SRC)/hb-shape-plan.h \ + $(HARFBUZZ_SRC)/hb-subset.h \ $(HARFBUZZ_SRC)/hb-unicode.h \ $(HARFBUZZ_BLD)/hb-version.h diff --git a/Build/source/libs/harfbuzz/include/Makefile.in b/Build/source/libs/harfbuzz/include/Makefile.in index f2bca224fe9..dd6ca411819 100644 --- a/Build/source/libs/harfbuzz/include/Makefile.in +++ b/Build/source/libs/harfbuzz/include/Makefile.in @@ -255,12 +255,12 @@ hdr_links = $(HARFBUZZ_SRC)/hb.h $(HARFBUZZ_SRC)/hb-blob.h \ $(HARFBUZZ_SRC)/hb-deprecated.h $(HARFBUZZ_SRC)/hb-face.h \ $(HARFBUZZ_SRC)/hb-font.h $(HARFBUZZ_SRC)/hb-set.h \ $(HARFBUZZ_SRC)/hb-shape.h $(HARFBUZZ_SRC)/hb-shape-plan.h \ - $(HARFBUZZ_SRC)/hb-unicode.h $(HARFBUZZ_BLD)/hb-version.h \ - $(HARFBUZZ_SRC)/hb-ot.h $(HARFBUZZ_SRC)/hb-ot-font.h \ - $(HARFBUZZ_SRC)/hb-ot-layout.h $(HARFBUZZ_SRC)/hb-ot-math.h \ - $(HARFBUZZ_SRC)/hb-ot-shape.h $(HARFBUZZ_SRC)/hb-ot-tag.h \ - $(HARFBUZZ_SRC)/hb-ot-var.h $(HARFBUZZ_SRC)/hb-icu.h \ - $(HARFBUZZ_SRC)/hb-graphite2.h + $(HARFBUZZ_SRC)/hb-subset.h $(HARFBUZZ_SRC)/hb-unicode.h \ + $(HARFBUZZ_BLD)/hb-version.h $(HARFBUZZ_SRC)/hb-ot.h \ + $(HARFBUZZ_SRC)/hb-ot-font.h $(HARFBUZZ_SRC)/hb-ot-layout.h \ + $(HARFBUZZ_SRC)/hb-ot-math.h $(HARFBUZZ_SRC)/hb-ot-shape.h \ + $(HARFBUZZ_SRC)/hb-ot-tag.h $(HARFBUZZ_SRC)/hb-ot-var.h \ + $(HARFBUZZ_SRC)/hb-icu.h $(HARFBUZZ_SRC)/hb-graphite2.h all: all-am .SUFFIXES: diff --git a/Build/source/libs/harfbuzz/version.ac b/Build/source/libs/harfbuzz/version.ac index bbcfb6b50c5..e0d543f3a12 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], [1.7.5]) +m4_define([harfbuzz_version], [1.7.6]) |