diff options
Diffstat (limited to 'Build/source')
90 files changed, 8431 insertions, 2517 deletions
diff --git a/Build/source/libs/README b/Build/source/libs/README index e8ae0926dfe..f40a56be3b8 100644 --- a/Build/source/libs/README +++ b/Build/source/libs/README @@ -24,7 +24,7 @@ gmp 6.1.2 - checked 16dec16 graphite2 1.3.10 - checked 20jun17 http://sourceforge.net/projects/silgraphite/files/graphite2/ -harfbuzz 1.7.4 - checked 20dec17 +harfbuzz 1.7.5 - checked 31jan18 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 723456501eb..0b079e98408 100644 --- a/Build/source/libs/harfbuzz/ChangeLog +++ b/Build/source/libs/harfbuzz/ChangeLog @@ -1,3 +1,8 @@ +2018-01-31 Akira Kakuto <kakuto@fuk.kindai.ac.jp> + + Import harfbuzz-1.7.5. + * Makefile.am, version.ac: Adjusted. + 2018-01-09 Karl Berry <karl@freefriends.org> * configure.ac: use AX_CXX_COMPILE_STDCXX([11],,[optional]) diff --git a/Build/source/libs/harfbuzz/Makefile.am b/Build/source/libs/harfbuzz/Makefile.am index 3b9791c6c51..fa7143c29fd 100644 --- a/Build/source/libs/harfbuzz/Makefile.am +++ b/Build/source/libs/harfbuzz/Makefile.am @@ -108,6 +108,8 @@ libharfbuzz_a_SOURCES += \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-machine.hh \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-private.hh \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.cc \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-machine.hh \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.cc \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-machine.hh \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-private.hh \ diff --git a/Build/source/libs/harfbuzz/Makefile.in b/Build/source/libs/harfbuzz/Makefile.in index 13bf96b7ba3..c0229775103 100644 --- a/Build/source/libs/harfbuzz/Makefile.in +++ b/Build/source/libs/harfbuzz/Makefile.in @@ -145,6 +145,7 @@ am_libharfbuzz_a_OBJECTS = @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-hebrew.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.$(OBJEXT) \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-thai.$(OBJEXT) \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-tibetan.$(OBJEXT) \ @@ -721,6 +722,8 @@ libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic-private.hh \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-machine.hh \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-private.hh \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.cc \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-machine.hh \ + @HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.cc \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-machine.hh \ @HARFBUZZ_TREE@/src/hb-ot-shape-complex-private.hh \ @@ -898,6 +901,9 @@ clean-noinstLIBRARIES: @HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) +@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.$(OBJEXT): \ + @HARFBUZZ_TREE@/src/$(am__dirstamp) \ + @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.$(OBJEXT): \ @HARFBUZZ_TREE@/src/$(am__dirstamp) \ @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp) @@ -969,6 +975,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-hebrew.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic-table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-khmer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-myanmar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-thai.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-tibetan.Po@am__quote@ diff --git a/Build/source/libs/harfbuzz/TLpatches/ChangeLog b/Build/source/libs/harfbuzz/TLpatches/ChangeLog index e750d5ae21e..2b5461a8cde 100644 --- a/Build/source/libs/harfbuzz/TLpatches/ChangeLog +++ b/Build/source/libs/harfbuzz/TLpatches/ChangeLog @@ -1,3 +1,8 @@ +2018-01-31 Akira Kakuto <kakuto@fuk.kindai.ac.jp> + + Imported harfbuzz-1.7.5 source tree from: + http://www.freedesktop.org/software/harfbuzz/release/ + 2017-12-20 Akira Kakuto <kakuto@fuk.kindai.ac.jp> Imported harfbuzz-1.7.4 source tree from: diff --git a/Build/source/libs/harfbuzz/TLpatches/TL-Changes b/Build/source/libs/harfbuzz/TLpatches/TL-Changes index d316d2a2ad9..9dc1503638e 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.4/ tree as obtained from: +Changes applied to the harfbuzz-1.7.5/ 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 d63ffb40d03..c07afa0794c 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.4. +# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 1.7.5. # # 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.4' -PACKAGE_STRING='harfbuzz (TeX Live) 1.7.4' +PACKAGE_VERSION='1.7.5' +PACKAGE_STRING='harfbuzz (TeX Live) 1.7.5' 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.4 to adapt to many kinds of systems. +\`configure' configures harfbuzz (TeX Live) 1.7.5 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.4:";; + short | recursive ) echo "Configuration of harfbuzz (TeX Live) 1.7.5:";; 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.4 +harfbuzz (TeX Live) configure 1.7.5 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.4, which was +It was created by harfbuzz (TeX Live) $as_me 1.7.5, 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.4' + VERSION='1.7.5' # 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=4 -HB_VERSION=1.7.4 +HB_VERSION_MICRO=5 +HB_VERSION=1.7.5 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.4, which was +This file was extended by harfbuzz (TeX Live) $as_me 1.7.5, 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.4 +harfbuzz (TeX Live) config.status 1.7.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md b/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md index 9e5a55bd61e..8a6b5695a06 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md +++ b/Build/source/libs/harfbuzz/harfbuzz-src/BUILD.md @@ -1,9 +1,11 @@ On Linux, install the development packages for FreeType, Cairo, and GLib. For example, on Ubuntu / Debian, you would do: -* sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev + + sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do: -* sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel + + sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel on Windows, consider using [vcpkg](https://github.com/Microsoft/vcpkg), provided by Microsoft, for building HarfBuzz and other open-source libraries @@ -12,29 +14,37 @@ PATH and follow appveyor CI's cmake [build steps](https://github.com/harfbuzz/harfbuzz/blob/master/appveyor.yml). on macOS, using MacPorts: -* sudo port install freetype glib2 cairo + + sudo port install freetype glib2 cairo or using Homebrew: -* brew install freetype glib cairo + + brew install freetype glib cairo If you are using a tarball, you can now proceed to running configure and make as with any other standard package. That should leave you with a shared -library in src/, and a few utility programs including hb-view and hb-shape -under util/. +library in `src/`, and a few utility programs including `hb-view` and `hb-shape` +under `util/`. + If you are bootstraping from git, you need a few more tools before you can -run autogen.sh for the first time. Namely, pkg-config and ragel. Again, -on Ubuntu / Debian: -* sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools +run `autogen.sh` for the first time. Namely, `pkg-config` and `ragel`. + +Again, on Ubuntu / Debian: + + sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools and on Fedora, RHEL, CentOS: -* sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc + + sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc on the Mac, using MacPorts: -* sudo port install autoconf automake libtool pkgconfig ragel gtk-doc + + sudo port install autoconf automake libtool pkgconfig ragel gtk-doc or using Homebrew: -* brew install autoconf automake libtool pkgconfig ragel gtk-doc + + brew install autoconf automake libtool pkgconfig ragel gtk-doc To build the Python bindings, you also need: -* brew install pygobject3 + brew install pygobject3 diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt index 24ccb6fce65..3a59366691c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt +++ b/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt @@ -5,14 +5,15 @@ enable_testing() ## Limit framework build to Xcode generator if (BUILD_FRAMEWORK) - # for a framework on macOS, use `cmake .. -DBUILD_FRAMEWORK:BOOL=true -G Xcode` + # for a framework build on macOS, use: + # cmake -DBUILD_FRAMEWORK=ON -Bbuild -H. -GXcode && cmake --build build if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode") message(FATAL_ERROR "You should use Xcode generator with BUILD_FRAMEWORK enabled") endif () - set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)") - set(CMAKE_MACOSX_RPATH ON) - set(BUILD_SHARED_LIBS ON) + set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_64_BIT)") + set (CMAKE_MACOSX_RPATH ON) + set (BUILD_SHARED_LIBS ON) endif () @@ -39,6 +40,7 @@ option(HB_HAVE_GLIB "Enable glib unicode functions" OFF) option(HB_HAVE_ICU "Enable icu unicode functions" OFF) if (APPLE) option(HB_HAVE_CORETEXT "Enable CoreText shaper backend on macOS" ON) + set (CMAKE_MACOSX_RPATH ON) endif () if (WIN32) option(HB_HAVE_UNISCRIBE "Enable Uniscribe shaper backend on Windows" OFF) @@ -46,98 +48,156 @@ if (WIN32) endif () option(HB_BUILD_UTILS "Build harfbuzz utils, needs cairo, freetype, and glib properly be installed" OFF) if (HB_BUILD_UTILS) - set(HB_HAVE_GLIB ON) - set(HB_HAVE_FREETYPE ON) + set (HB_HAVE_GLIB ON) + set (HB_HAVE_FREETYPE ON) endif () option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF) if (HB_HAVE_GOBJECT) - set(HB_HAVE_GLIB ON) + set (HB_HAVE_GLIB ON) endif () option(HB_HAVE_INTROSPECTION "Enable building introspection (.gir/.typelib) files" OFF) if (HB_HAVE_INTROSPECTION) - set(HB_HAVE_GOBJECT ON) - set(HB_HAVE_GLIB ON) + set (HB_HAVE_GOBJECT ON) + set (HB_HAVE_GLIB ON) +endif () + +option(HB_CHECK OFF "Do a configuration suitable for testing (shared library and enable all options)") +if (HB_CHECK) + set (BUILD_SHARED_LIBS ON) + set (HB_BUILD_UTILS ON) + set (HB_BUILTIN_UCDN ON) + set (HB_HAVE_ICU) + set (HB_HAVE_GLIB ON) + #set (HB_HAVE_GOBJECT ON) + #set (HB_HAVE_INTROSPECTION ON) + set (HB_HAVE_FREETYPE ON) + set (HB_HAVE_GRAPHITE2 ON) + if (WIN32) + set (HB_HAVE_UNISCRIBE ON) + set (HB_HAVE_DIRECTWRITE ON) + elseif (APPLE) + set (HB_HAVE_CORETEXT ON) + endif () endif () include_directories(AFTER ${PROJECT_SOURCE_DIR}/src ${PROJECT_BINARY_DIR}/src - ) +) add_definitions(-DHAVE_OT) add_definitions(-DHAVE_FALLBACK) -if (BUILD_SHARED_LIBS) - add_definitions(-DHAVE_ATEXIT) + +include (CheckFunctionExists) +include (CheckIncludeFile) +macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools + foreach (func_name ${ARGN}) + string(TOUPPER ${func_name} definiton_to_add) + check_function_exists(${func_name} HAVE_${definiton_to_add}) + if (${HAVE_${definiton_to_add}}) + add_definitions(-DHAVE_${definiton_to_add}) + 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) +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) endif () + if (MSVC) add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS) endif () -if (WIN32 AND NOT MINGW AND BUILD_SHARED_LIBS) - add_definitions("-DHB_EXTERN=__declspec(dllexport) extern") +if (BUILD_SHARED_LIBS) + if (WIN32 AND NOT MINGW) + add_definitions("-DHB_EXTERN=__declspec(dllexport) extern") + else () + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden") + endif () endif () ## Detect if we are running inside a distribution or regular repository folder -set(IN_HB_DIST FALSE) +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") + set (IN_HB_DIST TRUE) + set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h") endif () ## Extract variables from Makefile files -# http://stackoverflow.com/a/27630120/1414809 -function (prepend var prefix) - set(listVar "") - foreach (f ${ARGN}) - list(APPEND listVar "${prefix}${f}") - endforeach () - set(${var} "${listVar}" PARENT_SCOPE) +function (extract_make_variable variable makefile_source) + string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${makefile_source}) + string(REGEX MATCHALL "[^ \n\t\\]+" listVar ${CMAKE_MATCH_1}) + set (${variable} ${listVar} PARENT_SCOPE) endfunction () -function (extract_make_variable variable file prefix) - string(REGEX MATCH "${variable} = ([^$]+)\\$" temp ${file}) - string(REGEX MATCHALL "[^ \n\t\\]+" list ${CMAKE_MATCH_1}) - prepend(list ${prefix} ${list}) - set(${variable} ${list} PARENT_SCOPE) +# http://stackoverflow.com/a/27630120 +function (add_prefix_to_list var prefix) + set (listVar "") + foreach (f ${${var}}) + list(APPEND listVar "${prefix}${f}") + endforeach () + set (${var} "${listVar}" PARENT_SCOPE) endfunction () file(READ ${PROJECT_SOURCE_DIR}/src/Makefile.sources SRCSOURCES) file(READ ${PROJECT_SOURCE_DIR}/util/Makefile.sources UTILSOURCES) file(READ ${PROJECT_SOURCE_DIR}/src/hb-ucdn/Makefile.sources UCDNSOURCES) -extract_make_variable(HB_BASE_sources ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/") -extract_make_variable(HB_BASE_headers ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/") -extract_make_variable(HB_FALLBACK_sources ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/") -extract_make_variable(HB_OT_sources ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/") -extract_make_variable(HB_OT_headers ${SRCSOURCES} "${PROJECT_SOURCE_DIR}/src/") - +extract_make_variable(HB_BASE_sources ${SRCSOURCES}) +add_prefix_to_list(HB_BASE_sources "${PROJECT_SOURCE_DIR}/src/") +extract_make_variable(HB_BASE_headers ${SRCSOURCES}) +add_prefix_to_list(HB_BASE_headers "${PROJECT_SOURCE_DIR}/src/") +extract_make_variable(HB_FALLBACK_sources ${SRCSOURCES}) +add_prefix_to_list(HB_FALLBACK_sources "${PROJECT_SOURCE_DIR}/src/") +extract_make_variable(HB_OT_sources ${SRCSOURCES}) +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_BASE_RAGEL_GENERATED_sources ${SRCSOURCES}) +extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES}) if (IN_HB_DIST) - set(RAGEL_GENERATED_DIR "${PROJECT_SOURCE_DIR}/src/") + 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 () - set(RAGEL_GENERATED_DIR "${PROJECT_BINARY_DIR}/src/") + 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_BASE_RAGEL_GENERATED_sources ${SRCSOURCES} ${RAGEL_GENERATED_DIR}) -extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES} ${RAGEL_GENERATED_DIR}) -extract_make_variable(HB_VIEW_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/") -extract_make_variable(HB_SHAPE_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/") -extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES} "${PROJECT_SOURCE_DIR}/util/") +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_OT_SHAPE_CLOSURE_sources ${UTILSOURCES}) +add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/") + +extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES}) +add_prefix_to_list(LIBHB_UCDN_sources "${PROJECT_SOURCE_DIR}/src/hb-ucdn/") -extract_make_variable(LIBHB_UCDN_sources ${UCDNSOURCES} "${PROJECT_SOURCE_DIR}/src/hb-ucdn/") file(READ configure.ac CONFIGUREAC) string(REGEX MATCH "\\[(([0-9]+)\\.([0-9]+)\\.([0-9]+))\\]" HB_VERSION_MATCH ${CONFIGUREAC}) -set(HB_VERSION ${CMAKE_MATCH_1}) -set(HB_VERSION_MAJOR ${CMAKE_MATCH_2}) -set(HB_VERSION_MINOR ${CMAKE_MATCH_3}) -set(HB_VERSION_MICRO ${CMAKE_MATCH_4}) +set (HB_VERSION ${CMAKE_MATCH_1}) +set (HB_VERSION_MAJOR ${CMAKE_MATCH_2}) +set (HB_VERSION_MINOR ${CMAKE_MATCH_3}) +set (HB_VERSION_MICRO ${CMAKE_MATCH_4}) ## Define ragel tasks @@ -152,11 +212,11 @@ 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}) + 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 () @@ -166,53 +226,57 @@ 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 (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 -set(project_sources +set (project_sources ${HB_BASE_sources} ${HB_BASE_RAGEL_GENERATED_sources} ${HB_FALLBACK_sources} ${HB_OT_sources} ${HB_OT_RAGEL_GENERATED_sources} - ) +) -set(project_extra_sources) +set (project_extra_sources) -set(project_headers +set (project_headers ${HB_VERSION_H} ${HB_BASE_headers} ${HB_OT_headers} - ) +) ## Find and include needed header folders and libraries if (HB_HAVE_FREETYPE) - - include(FindFreetype) + include (FindFreetype) if (NOT FREETYPE_FOUND) message(FATAL_ERROR "HB_HAVE_FREETYPE was set, but we failed to find it. Maybe add a CMAKE_PREFIX_PATH= to your Freetype2 install prefix") - endif() + endif () list(APPEND THIRD_PARTY_LIBS ${FREETYPE_LIBRARIES}) include_directories(AFTER ${FREETYPE_INCLUDE_DIRS}) - add_definitions(-DHAVE_FREETYPE=1 -DHAVE_FT_FACE_GETCHARVARIANTINDEX=1) + add_definitions(-DHAVE_FREETYPE=1) list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-ft.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-ft.h) + # So check_funcs can find its headers + set (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${FREETYPE_INCLUDE_DIRS}) + set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${FREETYPE_LIBRARIES}) + + check_funcs(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var) endif () if (HB_HAVE_GRAPHITE2) @@ -291,7 +355,7 @@ if (APPLE AND HB_HAVE_CORETEXT) if (APPLICATION_SERVICES_FRAMEWORK) list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK}) endif (APPLICATION_SERVICES_FRAMEWORK) - + mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK) endif () @@ -314,16 +378,16 @@ if (WIN32 AND HB_HAVE_DIRECTWRITE) endif () if (HB_HAVE_GOBJECT) - include(FindPythonInterp) - include(FindPerl) - + include (FindPythonInterp) + include (FindPerl) + # Use the hints from glib-2.0.pc to find glib-mkenums find_package(PkgConfig) pkg_check_modules(PC_GLIB QUIET glib-2.0) find_program(GLIB_MKENUMS glib-mkenums HINTS ${PC_glib_mkenums} - ) - set(GLIB_MKENUMS_CMD) + ) + set (GLIB_MKENUMS_CMD) if (WIN32 AND NOT MINGW) # In Visual Studio builds, shebang lines are not supported @@ -333,29 +397,29 @@ if (HB_HAVE_GOBJECT) execute_process(COMMAND "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}" --version RESULT_VARIABLE GLIB_MKENUMS_PYTHON OUTPUT_QUIET ERROR_QUIET - ) + ) if (GLIB_MKENUMS_PYTHON EQUAL 0) message("${GLIB_MKENUMS} is a Python script.") - set(GLIB_MKENUMS_CMD "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}") + set (GLIB_MKENUMS_CMD "${PYTHON_EXECUTABLE}" "${GLIB_MKENUMS}") else () execute_process(COMMAND "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}" --version RESULT_VARIABLE GLIB_MKENUMS_PERL OUTPUT_QUIET ERROR_QUIET - ) + ) if (GLIB_MKENUMS_PERL EQUAL 0) message("${GLIB_MKENUMS} is a PERL script.") - set(GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}") + set (GLIB_MKENUMS_CMD "${PERL_EXECUTABLE}" "${GLIB_MKENUMS}") endif () if (NOT GLIB_MKENUMS_PERL EQUAL 0 AND NOT GLIB_MKENUMS_PYTHON EQUAL 0) message(FATAL_ERROR "Unable to determine type of glib-mkenums script") endif () - endif () + endif () else () - set(GLIB_MKENUMS_CMD "${GLIB_MKENUMS}") + set (GLIB_MKENUMS_CMD "${GLIB_MKENUMS}") endif () if (NOT GLIB_MKENUMS_CMD) message(FATAL_ERROR "HB_HAVE_GOBJECT was set, but we failed to find glib-mkenums, which is required") - endif() + endif () pkg_check_modules(PC_GOBJECT QUIET gobject-2.0) @@ -368,19 +432,19 @@ if (HB_HAVE_GOBJECT) list(APPEND hb_gobject_sources ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.cc) list(APPEND hb_gobject_gen_sources ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc - ) + ) list(APPEND hb_gobject_structs_headers ${PROJECT_SOURCE_DIR}/src/hb-gobject-structs.h - ) + ) list(APPEND hb_gobject_headers ${PROJECT_SOURCE_DIR}/src/hb-gobject.h ${hb_gobject_structs_headers} - ) + ) list(APPEND hb_gobject_gen_headers ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h - ) + ) - add_custom_command ( + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h COMMAND ${GLIB_MKENUMS_CMD} --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl @@ -396,9 +460,9 @@ if (HB_HAVE_GOBJECT) DEPENDS ${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.h.tmpl ${hb_gobject_header} ${project_headers} - ) + ) - add_custom_command ( + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.cc COMMAND ${GLIB_MKENUMS_CMD} --template=${PROJECT_SOURCE_DIR}/src/hb-gobject-enums.cc.tmpl @@ -415,9 +479,10 @@ if (HB_HAVE_GOBJECT) ${CMAKE_CURRENT_BINARY_DIR}/src/hb-gobject-enums.h ${hb_gobject_header} ${project_headers} - ) + ) endif () + ## Atomic ops availability detection file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c" " void memory_barrier (void) { __sync_synchronize (); } @@ -428,7 +493,7 @@ file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c" ") try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives - SOURCES ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c) + ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c) if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES) add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES) endif () @@ -444,7 +509,7 @@ file(WRITE "${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c" ") try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops - SOURCES ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c) + ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c) if (HB_HAVE_SOLARIS_ATOMIC_OPS) add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS) endif () @@ -454,6 +519,25 @@ endif () add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers}) target_link_libraries(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") + 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 () + + # No threadsafe statics as we do it ourselves + if (BUILD_SHARED_LIBS) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics") + endif () +endif () + + ## Define harfbuzz-gobject library if (HB_HAVE_GOBJECT) add_library(harfbuzz-gobject @@ -461,7 +545,7 @@ if (HB_HAVE_GOBJECT) ${hb_gobject_gen_sources} ${hb_gobject_headers} ${hb_gobject_gen_headers} - ) + ) include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/src) add_dependencies(harfbuzz-gobject harfbuzz) target_link_libraries(harfbuzz-gobject harfbuzz ${GOBJECT_LIBRARIES} ${THIRD_PARTY_LIBS}) @@ -471,7 +555,7 @@ endif () if (WIN32) if (NOT BUILD_SHARED_LIBS) message("Building introspection files on Windows requires BUILD_SHARED_LIBS to be enabled.") - set(HB_HAVE_INTROSPECTION OFF) + set (HB_HAVE_INTROSPECTION OFF) endif () endif () @@ -482,23 +566,23 @@ if (HB_HAVE_INTROSPECTION) find_program(G_IR_SCANNER g-ir-scanner HINTS ${PC_g_ir_scanner} - ) + ) find_program(G_IR_COMPILER g-ir-compiler HINTS ${PC_g_ir_compiler} - ) + ) if (WIN32 AND NOT MINGW) # Note that since we already enable HB_HAVE_GOBJECT # we would already have PYTHON_EXECUTABLE handy - set(G_IR_SCANNER_CMD "${PYTHON_EXECUTABLE}" "${G_IR_SCANNER}") + set (G_IR_SCANNER_CMD "${PYTHON_EXECUTABLE}" "${G_IR_SCANNER}") else () - set(G_IR_SCANNER_CMD "${G_IR_SCANNER}") + set (G_IR_SCANNER_CMD "${G_IR_SCANNER}") endif () # We need to account for the varying output directories # when we build using Visual Studio projects - if("${CMAKE_GENERATOR}" MATCHES "Visual Studio*") + if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*") set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>") else () set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>") @@ -506,9 +590,9 @@ if (HB_HAVE_INTROSPECTION) # Get the CFlags that we used to build HarfBuzz/HarfBuzz-GObject set (hb_defines_cflags "") - foreach(hb_cflag ${hb_cflags}) + foreach (hb_cflag ${hb_cflags}) list(APPEND hb_defines_cflags "-D${hb_cflag}") - endforeach(hb_cflag) + endforeach (hb_cflag) # Get the other dependent libraries we used to build HarfBuzz/HarfBuzz-GObject set (extra_libs "") @@ -518,7 +602,7 @@ if (HB_HAVE_INTROSPECTION) list(APPEND extra_libs "--extra-library=${extra_lib_stripped}") endforeach () - set(introspected_sources) + set (introspected_sources) foreach (f ${project_headers} ${project_sources} @@ -526,7 +610,7 @@ if (HB_HAVE_INTROSPECTION) ${hb_gobject_gen_headers} ${hb_gobject_sources} ${hb_gobject_headers} - ) + ) if (WIN32) # Nasty issue: We need to make drive letters lower case, # otherwise g-ir-scanner won't like it and give us a bunch @@ -545,7 +629,7 @@ if (HB_HAVE_INTROSPECTION) endforeach () # Finally, build the introspection files... - add_custom_command ( + add_custom_command( TARGET harfbuzz-gobject POST_BUILD COMMAND ${G_IR_SCANNER_CMD} @@ -576,9 +660,9 @@ if (HB_HAVE_INTROSPECTION) ${introspected_sources} -o ${hb_libpath}/HarfBuzz-0.0.gir DEPENDS harfbuzz-gobject harfbuzz - ) + ) - add_custom_command ( + add_custom_command( TARGET harfbuzz-gobject POST_BUILD COMMAND "${G_IR_COMPILER}" @@ -587,20 +671,21 @@ if (HB_HAVE_INTROSPECTION) ${hb_libpath}/HarfBuzz-0.0.gir -o ${hb_libpath}/HarfBuzz-0.0.typelib DEPENDS ${hb_libpath}/HarfBuzz-0.0.gir harfbuzz-gobject - ) + ) endif () + ## Additional framework build configs if (BUILD_FRAMEWORK) - set(CMAKE_MACOSX_RPATH ON) + set (CMAKE_MACOSX_RPATH ON) set_target_properties(harfbuzz PROPERTIES FRAMEWORK TRUE PUBLIC_HEADER "${project_headers}" XCODE_ATTRIBUTE_INSTALL_PATH "@rpath" ) - set(MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz") - set(MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}") - set(MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}") + set (MACOSX_FRAMEWORK_IDENTIFIER "harfbuzz") + set (MACOSX_FRAMEWORK_SHORT_VERSION_STRING "${HB_VERSION}") + set (MACOSX_FRAMEWORK_BUNDLE_VERSION "${HB_VERSION}") endif () @@ -631,60 +716,117 @@ endif () ## Install +include (GNUInstallDirs) + if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL) - install(FILES ${project_headers} DESTINATION include/harfbuzz) + install(FILES ${project_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz) if (HB_HAVE_GOBJECT) - install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION include/harfbuzz) + install(FILES ${hb_gobject_headers} ${hb_gobject_gen_headers} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/harfbuzz) endif () endif () if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL) install(TARGETS harfbuzz - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} FRAMEWORK DESTINATION Library/Frameworks - ) + ) if (HB_BUILD_UTILS) install(TARGETS hb-view - RUNTIME DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(TARGETS hb-view - RUNTIME DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(TARGETS hb-shape - RUNTIME DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install(TARGETS hb-ot-shape-closure - RUNTIME DESTINATION bin + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) endif () if (HB_HAVE_GOBJECT) install(TARGETS harfbuzz-gobject - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) if (HB_HAVE_INTROSPECTION) - if("${CMAKE_GENERATOR}" MATCHES "Visual Studio*") + if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio*") set (hb_libpath "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIGURATION>") else () set (hb_libpath "$<TARGET_FILE_DIR:harfbuzz-gobject>") endif () install(FILES "${hb_libpath}/HarfBuzz-0.0.gir" - DESTINATION share/gir-1.0 - ) + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/gir-1.0 + ) install(FILES "${hb_libpath}/HarfBuzz-0.0.typelib" - DESTINATION lib/girepository-1.0 - ) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/girepository-1.0 + ) endif () endif () endif () +if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja") + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcolor-diagnostics") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcolor-diagnostics") + endif () + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color") + endif () +endif () + + +## src/ executables +foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag) + 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 + set (prog_name test-test) + endif () + add_executable(${prog_name} ${PROJECT_SOURCE_DIR}/src/${prog}.cc) + target_link_libraries(${prog_name} harfbuzz ${THIRD_PARTY_LIBS}) +endforeach () +set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN") + + +## Tests +if (UNIX OR MINGW) + if (BUILD_SHARED_LIBS) + # generate harfbuzz.def after build completion + string(REPLACE ";" " " space_separated_headers "${project_headers}") + add_custom_command(TARGET harfbuzz POST_BUILD + COMMAND ${CMAKE_COMMAND} -E env "headers=${space_separated_headers}" python ${PROJECT_SOURCE_DIR}/src/gen-def.py ${PROJECT_BINARY_DIR}/harfbuzz.def + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src) + + add_test(NAME check-static-inits.sh + COMMAND ${PROJECT_SOURCE_DIR}/src/check-static-inits.sh + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/harfbuzz.dir/src # ugly hack + ) + 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") + endif () + + add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh) + add_test(NAME check-header-guards.sh COMMAND ./check-header-guards.sh) + add_test(NAME check-externs.sh COMMAND ./check-externs.sh) + 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) +endif () + # Needs to come last so that variables defined above are passed to # subdirectories. add_subdirectory(test) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog index 5c011383313..f984c138bf4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog +++ b/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog @@ -1,3 +1,3001 @@ +commit f0b700db394ccdff30ff83961a3e2ea9ff4ea472 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 30 11:16:51 2018 -0800 + + 1.7.5 + + NEWS | 9 +++++++++ + configure.ac | 2 +- + 2 files changed, 10 insertions(+), 1 deletion(-) + +commit 585b5760987e1ddd31e11fc55a2ce55ddb5b1663 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 30 11:51:56 2018 -0800 + + Fix distcheck + + test/shaping/data/in-house/Makefile.am | 2 +- + test/shaping/data/text-rendering-tests/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit e89df6e1aee9cb6fe1268643ce19816808baf0c4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 30 10:58:44 2018 -0800 + + [aat] Limit number of DontAdvance transitions + + Remove the faulty loop-detection logic. Use max-ops for breaking + out of infinite loops or heavy work. + + https://twitter.com/behdadesfahbod/status/958065026262183936 + + src/hb-aat-layout-common-private.hh | 33 + ++------------------------------- + 1 file changed, 2 insertions(+), 31 deletions(-) + +commit e00743b47d25a2487b7f232a514a042e2962a089 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 29 10:07:05 2018 -0800 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 7 +++++++ + test/shaping/data/text-rendering-tests/Makefile.sources | 7 +++++++ + .../data/text-rendering-tests/fonts/TestMORXEighteen.ttf | Bin 0 -> + 3256 bytes + .../text-rendering-tests/fonts/TestMORXSeventeen.ttf | Bin 0 -> + 1788 bytes + .../data/text-rendering-tests/fonts/TestMORXSixteen.ttf | Bin 0 -> + 1812 bytes + .../data/text-rendering-tests/fonts/TestMORXTwenty.ttf | Bin 0 -> + 3232 bytes + .../text-rendering-tests/fonts/TestMORXTwentyone.ttf | Bin 0 -> + 3244 bytes + .../text-rendering-tests/fonts/TestMORXTwentytwo.ttf | Bin 0 -> + 3256 bytes + .../data/text-rendering-tests/tests/MORX-14.tests | 1 + + .../data/text-rendering-tests/tests/MORX-16.tests | 1 + + .../data/text-rendering-tests/tests/MORX-17.tests | 1 + + .../data/text-rendering-tests/tests/MORX-18.tests | 4 ++++ + .../data/text-rendering-tests/tests/MORX-19.tests | 2 ++ + .../data/text-rendering-tests/tests/MORX-20.tests | 7 +++++++ + .../data/text-rendering-tests/tests/MORX-21.tests | 1 + + .../data/text-rendering-tests/tests/MORX-22.tests | 1 + + 16 files changed, 32 insertions(+) + +commit 29d901286e632fa4de5ea198cc455cae56bc09a8 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Jan 30 10:01:46 2018 +0330 + + [cmake] Build src/ executables (#733) + + CMakeLists.txt | 40 ++++++++++++++++++++++++++-------------- + 1 file changed, 26 insertions(+), 14 deletions(-) + +commit 55cae0d72eecb5116008815b598481dd1404fc6a +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Jan 29 18:05:24 2018 +0330 + + [test] Use 'otool -L' where ldd doesn't exist (macOS) (#732) + + src/check-libstdc++.sh | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 2ec7dd1f6cb78ee6a0621aa98f18500d3318c90c +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Sun Jan 28 17:48:28 2018 -0500 + + Fix Travis build on macOS (#731) + + .travis.yml | 2 +- + src/check-defs.sh | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 12757b692905062fe0fc266a6230238b3492abfd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 26 18:14:05 2018 -0800 + + Misc warning fixes + + Fixes https://github.com/harfbuzz/harfbuzz/issues/712 + + src/hb-ot-layout-gsubgpos-private.hh | 9 ++++----- + src/hb-ot-map-private.hh | 1 - + src/hb-ot-map.cc | 5 ++--- + 3 files changed, 6 insertions(+), 9 deletions(-) + +commit 85be365ed9238caf0283346ab4e5c5127096fc8a +Author: bungeman <bungeman@chromium.org> +Date: Fri Jan 26 13:38:06 2018 -0500 + + Use KernSubTableFormat2::rightClassTable + + Issue originally reported at http://cppfiles.com/chromium.txt . + + This fixes what appears to be a copy - paste issue which causes both + KernSubTableFormat2::rightClassTable and the 'right' argument to + KernSubTableFormat2::get_kerning to go unused. + + src/hb-ot-kern-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c41b7fc10588323b5d8c0007befa701994115f7b +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Jan 25 09:53:32 2018 +0330 + + [cmake] Use -fvisibility-inlines-hidden instead (#726) + + CMakeLists.txt | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 3d615766060e34a6e716c8737f651b6d6871ae85 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Jan 22 21:23:19 2018 +0330 + + [cmake] fix symbol exporting issue on newer gcc (#724) + + CMakeLists.txt | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 8b60e7c2c301a24906d591c80c42fd5e506072d2 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Jan 22 18:37:26 2018 +0330 + + [ci] minor, less hacks (#722) + + .circleci/config.yml | 20 ++++++-------------- + .travis.yml | 8 ++++---- + CMakeLists.txt | 11 +++++++---- + 3 files changed, 17 insertions(+), 22 deletions(-) + +commit aaf934de3b9e3447897b4da566655d6d0494e87b +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Jan 22 13:16:54 2018 +0330 + + [ci] minor (#721) + + .circleci/config.yml | 4 ++-- + .travis.yml | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit bd752db733e3d8c2c8773d831aebdd8a5cbb5e04 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Jan 22 13:08:35 2018 +0330 + + [ci] unbreak bots with outdated freetype version (#718) + + .circleci/config.yml | 10 +++++++++- + .travis.yml | 10 +++++++++- + 2 files changed, 18 insertions(+), 2 deletions(-) + +commit 19a93fcf1946ad29f07306a0b6c65377bdaa49f0 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Sun Jan 21 20:40:34 2018 +0700 + + Fix typos. + + src/hb-blob.h | 2 +- + src/hb-buffer.h | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 51ce3828e67a8ca7e4ea4b69e88c395e243bf01f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 19 18:36:39 2018 -0800 + + [aat] Fix Ligature matching + + I hope... Makes "ffi" work with Zapfino. I'm not sure if doing it + correctly though... + + src/hb-aat-layout-morx-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bef509855c7a2c4400a947d2527d1dc048da1284 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 19 18:24:00 2018 -0800 + + [aat] Add TODO + + src/hb-aat-layout-morx-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit e6f283ed7db6f8e2f8016dcbf07e589c40976aa6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 19 18:08:56 2018 -0800 + + [aat] Implement LigatureSubtable + + We form the Zapfino ligature now. Yay! No further testing done. + + src/hb-aat-layout-common-private.hh | 25 ++++++--- + src/hb-aat-layout-morx-table.hh | 108 + +++++++++++++++++++++++++++++++++--- + 2 files changed, 115 insertions(+), 18 deletions(-) + +commit f07ce661a2056965c573c99bdb721c065563ea7b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 19 16:52:01 2018 -0800 + + [aat] Embed a sanitizer context in hb_aat_apply_context_t + + For run-time checking. + + src/hb-aat-layout-common-private.hh | 22 ++++++++++++++++------ + src/hb-aat-layout.cc | 16 ++++++++-------- + 2 files changed, 24 insertions(+), 14 deletions(-) + +commit 046690a4df0fdc93e3490210ef105f26057b1462 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 17 16:59:55 2018 -0800 + + [aat] Add hb_aat_apply_context_t + + src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++++++ + src/hb-aat-layout-morx-table.hh | 27 +++++++++++++-------------- + src/hb-aat-layout-private.hh | 2 +- + src/hb-aat-layout.cc | 8 +++++--- + src/hb-ot-shape.cc | 3 +-- + 5 files changed, 43 insertions(+), 20 deletions(-) + +commit fd034490942c06e31cfb42f32023c78734f8aeeb +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 17 16:46:51 2018 -0800 + + Rename hb_apply_context_t to hb_ot_apply_context_t + + src/hb-aat-layout-morx-table.hh | 16 ++++----- + src/hb-aat-layout-private.hh | 2 +- + src/hb-aat-layout.cc | 2 +- + src/hb-ot-layout-gpos-table.hh | 48 ++++++++++++------------- + src/hb-ot-layout-gsub-table.hh | 24 ++++++------- + src/hb-ot-layout-gsubgpos-private.hh | 58 + +++++++++++++++--------------- + src/hb-ot-layout-private.hh | 4 +-- + src/hb-ot-layout.cc | 16 ++++----- + src/hb-ot-shape-complex-arabic-fallback.hh | 2 +- + src/hb-ot-shape-fallback.cc | 4 +-- + src/hb-ot-shape.cc | 2 +- + 11 files changed, 89 insertions(+), 89 deletions(-) + +commit 94b49beee972fec98cbb80658df3d8491b45485d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 17 12:46:08 2018 -0800 + + Whitespace + + src/hb-ot-head-table.hh | 20 +++++++++----------- + src/hb-ot-post-table.hh | 10 +++++----- + 2 files changed, 14 insertions(+), 16 deletions(-) + +commit e849b8a85bb66219db4d797d86ddd60ed7c26a2e +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Jan 19 16:12:24 2018 +0330 + + [cmake] Always put test/api/CMakeLists.txt on distributions + + test/api/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c8f2a4f5b99d3be3079286817386b4185d35a545 +Author: Cosimo Lupo <cosimo@anthrotype.com> +Date: Thu Jan 18 22:49:40 2018 +0100 + + hb-common.cc: Hatran script is right-to-left (#714) + + "Hatran is written from right to left horizontally" + + http://www.unicode.org/L2/L2012/12312-n4324-hatran.pdf + + This ancient script was added with Unicode 8.0. + + Also this spreadsheet (referenced in an inline comment in the + source code) has it as RTL: http://goo.gl/x9ilM + + src/hb-common.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 00806149b9b591e4ec15996d3d56bdbd60687821 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Jan 19 01:12:31 2018 +0330 + + Improve avoiding C++ linkage, definition creation and cmake tests + (#710) + + .circleci/config.yml | 4 ++-- + CMakeLists.txt | 46 ++++++++++++++++++++++++++-------------------- + configure.ac | 3 +++ + src/Makefile.am | 11 ++--------- + src/check-defs.sh | 37 +++++++++++++++++++++++-------------- + src/gen-def.py | 16 ++++++++++++++++ + 6 files changed, 72 insertions(+), 45 deletions(-) + +commit 9b693212a834a96252f4ebe0b006b85e9f35fc91 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Thu Jan 18 16:34:13 2018 -0500 + + Update record-test.sh to the new directory layout (#716) + + test/shaping/README.md | 11 ++++++----- + test/shaping/record-test.sh | 17 +++++++++++++---- + 2 files changed, 19 insertions(+), 9 deletions(-) + +commit 461a605fdec3361a038d3715adf615353c4f91fa +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 17 10:02:48 2018 -0800 + + [aat] Allocate set dynamically + + src/hb-aat-layout-common-private.hh | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +commit 4c4a9fc8617fed9bc1a7805c9aed294b4f6b66ea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 17 09:47:50 2018 -0800 + + Typo + + Fixes https://github.com/harfbuzz/harfbuzz/issues/711 + + util/options.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 90f01bad637c8b1214f46d4df6d9552a6a728e29 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Jan 16 22:00:21 2018 +0330 + + [cmake] don't link to libstdc++ (#707) + + CMakeLists.txt | 38 +++++++++++++++++++++++++------------- + 1 file changed, 25 insertions(+), 13 deletions(-) + +commit 5e14e5f65d3dd1ed471ed73fab7e3207ae04e8fb +Author: rdb <rdb@users.noreply.github.com> +Date: Tue Jan 16 17:04:33 2018 +0100 + + [cmake] Fix for CMake 3.0 and below (#706) + + CMakeLists.txt | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c97a7eca7f7b6fc1c50a4ac7fccf3fa2d777430e +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Jan 16 14:18:09 2018 +0330 + + [cmake] Fix symbols visibility and enable check-symbols.sh test (#705) + + .circleci/config.yml | 2 +- + CMakeLists.txt | 22 ++++++++++++++-------- + 2 files changed, 15 insertions(+), 9 deletions(-) + +commit 60f84ef014f9280da24d5eb9ce833a7f37210242 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 15 20:46:58 2018 -0500 + + Disable MORX-13/14 + + Really, need better way to catch these :(. + + test/shaping/data/text-rendering-tests/DISABLED | 2 ++ + test/shaping/data/text-rendering-tests/Makefile.sources | 4 ++-- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit 949f6af2897b8982c81a059ea98e1c29bbce4772 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 15 20:44:10 2018 -0500 + + Disallow sanitize recursing into Extension subtables multiple times + + Fixes https://oss-fuzz.com/v2/testcase-detail/5216838347653120 + which is a stack overflow, not by way of infinite recursion, just + being deep. That's disallowed anyway, so catch it as it happens, + not afterwards. + + src/hb-ot-layout-gsub-table.hh | 5 ++--- + src/hb-ot-layout-gsubgpos-private.hh | 4 +++- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit bcb6f1ae0a08e5c7af88a7affaad42a67c5adac5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 15 20:34:05 2018 -0500 + + Whitespace + + src/hb-ot-layout-gsubgpos-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 12fffce10eb6ffebdedd655d0b1f10a99adf1808 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 15 15:41:51 2018 -0500 + + [aat] Sanitize classTable in StateTable + + src/hb-aat-layout-common-private.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e6263c7142ca22efd9a3c93353a513f475c1c48d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 15 15:37:55 2018 -0500 + + [aat] Wire up table length to apply() + + src/hb-aat-layout-morx-table.hh | 17 +++++++++-------- + src/hb-aat-layout.cc | 20 +++++++++++++++----- + src/hb-open-type-private.hh | 6 +++--- + 3 files changed, 27 insertions(+), 16 deletions(-) + +commit 679ae744d07db7746a983ece54c22635a9dc3cff +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Jan 14 15:03:31 2018 -0500 + + [aat] Towards implementing LigatureSubtable + + src/hb-aat-layout-morx-table.hh | 61 + +++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 58 insertions(+), 3 deletions(-) + +commit c9e12a2b9b34d73d37def2261a5c1a7ef20b8349 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 13 17:05:12 2018 +0000 + + Fix set initializer + + src/hb-set-private.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 54a1e250a839f030b43dbeba66cadc50ab5f90f6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sat Jan 13 14:44:39 2018 +0000 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/Makefile.sources | 2 ++ + .../data/text-rendering-tests/fonts/TestMORXFourteen.ttf | Bin 0 -> + 1816 bytes + .../data/text-rendering-tests/fonts/TestMORXThirteen.ttf | Bin 0 -> + 1820 bytes + .../data/text-rendering-tests/tests/MORX-13.tests | 1 + + .../data/text-rendering-tests/tests/MORX-14.tests | 1 + + 5 files changed, 4 insertions(+) + +commit 9009b341c46caaa81deae8ea55e6f7dd98565f59 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 12:04:53 2018 +0100 + + [aat] Fix some struct sizes + + I hate it that with my compiler at least, it doesn't catch totally + uncompilable + statements in templates if they are not used... + + src/hb-aat-layout-common-private.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 57051b4f672d7d9dd10c45cc95b1e50e32cd42a9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 11:42:25 2018 +0100 + + [aat] Flush rest of buffer if state machine failed + + src/hb-aat-layout-common-private.hh | 12 +++++++++--- + src/hb-aat-layout-morx-table.hh | 2 ++ + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit 369dfab0f8b7f22338bbd7a58a27e2e02e1efc29 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 11:37:01 2018 +0100 + + Minor + + docs/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 25364c4f0020a66bd6f4bce1656ea47f1093396d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 11:31:20 2018 +0100 + + [aat] Fix symbol visibility + + Not sure why only one of the bots sees this as visible... + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ee16b9d8d35af1e74369edf7b733886c4b743a68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 11:28:09 2018 +0100 + + Revert accidental morx enablement + + src/hb-ot-shape.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 44f0ee346f53c51ec4abccc81cc24abf6f018e85 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 11:27:51 2018 +0100 + + Fix docs + + docs/harfbuzz-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit cdfa801ff4fe301d7bd41c9eee57cae75001ce4b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 11:12:20 2018 +0100 + + [aat] Tweak previous commit + + src/hb-aat-layout-common-private.hh | 2 ++ + src/hb-ot-shape.cc | 4 ++-- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit f7600228a4b37e6f6b65394aceeeb14bf4133c23 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 11:09:21 2018 +0100 + + [aat] Detect infinite-loops in state machine + + src/hb-aat-layout-common-private.hh | 36 + +++++++++++++++++++++++++++++------- + 1 file changed, 29 insertions(+), 7 deletions(-) + +commit d514f1480cffb81850ef212155c66ee9e0383350 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 10:55:44 2018 +0100 + + [circleci] cat test logs on failure on autotools-based builds + + .circleci/config.yml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1facef337862a0ceee9a8ac1d4dc94ff94fcb3b3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 10:53:52 2018 +0100 + + [travis] On test failure, cat all .log files + + .travis.yml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit cdd86bf3a28961e85a8918d77937587df313d47b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 10:51:51 2018 +0100 + + [travis] Update cat'ing test-suite.log files + + .travis.yml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 22d8c765e7b556601173a3e70f5bc9f310263a98 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 09:46:38 2018 +0100 + + Disable C++11 + + To better catch errors locally. + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dd38db523a1001178bf4cae3721c098466534736 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 09:45:42 2018 +0100 + + [aat] Fix more builds + + Maybe I should disable C++11 detection such that my compiler also + catches + these. Doesn't look like we can switch to it for a while anyway... + + src/hb-aat-layout-common-private.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 18 +++++++++--------- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit 72cb2b1f57ba79938c74e0406fc7457fce287f69 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 09:38:55 2018 +0100 + + [aat] Fix builds + + src/hb-aat-layout-morx-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e3a15d0c6d088963e61f7fbebe25e1096d8e2903 +Author: Ting-Wei Lan <lantw@src.gnome.org> +Date: Fri Jan 12 15:33:16 2018 +0800 + + Update _POSIX_C_SOURCE to the latest version + + Defining _POSIX_C_SOURCE to an old version on FreeBSD can cause C99 to + be disabled in libc. + + src/hb-blob.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c70d58f97da7dcbdd7ea72a44f39130a75a279f7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 00:08:22 2018 +0100 + + [aat] Port RearrangementSubtable to StateTableDriver + + src/hb-aat-layout-morx-table.hh | 91 + ++++++++++++++++++++--------------------- + 1 file changed, 44 insertions(+), 47 deletions(-) + +commit 117cfe7bb7cef682eb151b94f1eb12363ba3af67 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 12 00:01:36 2018 +0100 + + [aat] Add StateTableDriver and convert ContextualSubtable to it + + src/hb-aat-layout-common-private.hh | 51 ++++++++++++++++++++ + src/hb-aat-layout-morx-table.hh | 93 + ++++++++++++++++++------------------- + 2 files changed, 95 insertions(+), 49 deletions(-) + +commit 0d39ac224c680b1f0134b58e78391497fbe47370 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 22:47:08 2018 +0100 + + [test/text-rendering-tests] Update README + + test/shaping/data/text-rendering-tests/README | 3 +++ + 1 file changed, 3 insertions(+) + +commit 17a66f133c7e523403b6c90b011fcf0acb6356c6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 22:46:19 2018 +0100 + + [test] Disable MORX-12 + + Ouch. I need a better workflow for this. + + test/shaping/data/text-rendering-tests/Makefile.sources | 1 - + 1 file changed, 1 deletion(-) + +commit 1f1c85a54aad8a25a67041cbb9c4277d28c1c761 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 22:43:57 2018 +0100 + + [aat] Remove 'mort' support + + It's dead, Jim! + + src/hb-aat-layout-common-private.hh | 55 +++++----------- + src/hb-aat-layout-morx-table.hh | 122 + ++++++++++-------------------------- + 2 files changed, 46 insertions(+), 131 deletions(-) + +commit 7e2fed6d73f89986e5777028cdcd24e3baf2f86c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 19:25:21 2018 +0100 + + [aat] Allow DontAdvance + + Apparently CoreText does allow these. To be done: detect infinite + loops. + + Fixes MORX-12 test. + + src/hb-aat-layout-morx-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1387fe8f9c474e88f86828733d4c01bd56f44432 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 19:22:37 2018 +0100 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 1 + + test/shaping/data/text-rendering-tests/Makefile.sources | 2 ++ + .../data/text-rendering-tests/fonts/TestMORXTwelve.ttf | Bin 0 -> + 2200 bytes + .../data/text-rendering-tests/tests/MORX-12.tests | 3 +++ + 4 files changed, 6 insertions(+) + +commit 17f01aff910b3871d0a6c45fd4305304b7f68ab5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 18:54:49 2018 +0100 + + [aat] Sanitize ContextualSubtable + + src/hb-aat-layout-common-private.hh | 23 +++++++++++++++++++---- + src/hb-aat-layout-morx-table.hh | 34 + ++++++++++++++++++++++++---------- + 2 files changed, 43 insertions(+), 14 deletions(-) + +commit 9b82aa19d812e70b7fade4b7669a9ce27855951e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 18:19:42 2018 +0100 + + More warning fixes + + src/hb-open-type-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 680cbc2eb325edc6b8562f39485b146aa56b3872 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 18:15:53 2018 +0100 + + [aat] Sanitize StateTable + + src/hb-aat-layout-common-private.hh | 43 + ++++++++++++++++++++++++++++++++++--- + 1 file changed, 40 insertions(+), 3 deletions(-) + +commit 0e3b3379a04a67a22e44e17d6bf849359f4fca68 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 18:01:10 2018 +0100 + + [aat] Actually fix d887f931485b715775e922516a4b0de5bb92c34f + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1eb98c9916c6cb447f999170840b7f37de4b282d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 17:59:03 2018 +0100 + + [test/text-rendering-tests] Actually disable MORX-11 + + test/shaping/data/text-rendering-tests/Makefile.sources | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3f291ffd5a9480ac0f528eaedd43c7e9af738ee2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 17:57:46 2018 +0100 + + [buffer] Fix compiler warnings + + line 323: Warning: info hides hb_buffer_t::info + ... + + src/hb-buffer-private.hh | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit d887f931485b715775e922516a4b0de5bb92c34f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 17:41:34 2018 +0100 + + [aat] Make bots happy + + Don't know why this is not caught by my compiler. Looks like clang + catches it + while gcc doesn't. + + In file included from ../src/hb-aat-layout-morx-table.hh:31: + ../src/hb-aat-layout-common-private.hh:523:30: error: no member named + 'static_size' in 'AAT::ContextualSubtable<AAT::MorxTypes>::EntryData' + DEFINE_SIZE_STATIC (4 + T::static_size); + ~~~^ + + src/hb-aat-layout-morx-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit f6be730994434e706cc27d68b796492d876e82b6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 15:23:24 2018 +0100 + + [aat] In NoncontextualSubtable, handle MarkLast with end-of-line + transition + + Fixes MORX-11 test. + + src/hb-aat-layout-morx-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1d20d109a07bf9c775ab91dfbbb55f7bd80fd9d6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 15:18:22 2018 +0100 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 3 ++- + test/shaping/data/text-rendering-tests/Makefile.sources | 3 ++- + .../data/text-rendering-tests/fonts/TestMORXEleven.ttf | Bin 0 -> + 1624 bytes + .../data/text-rendering-tests/tests/MORX-11.tests | 1 + + 4 files changed, 5 insertions(+), 2 deletions(-) + +commit f9be673814aeb2c8abab52a672598576c6ed20c2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 15:15:07 2018 +0100 + + [aat] Implement ContextualSubtable + + Tested with Zapfino and text "2nd". Sascha will create tests later. + + src/hb-aat-layout-morx-table.hh | 70 + ++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 66 insertions(+), 4 deletions(-) + +commit 335a9c1fe489db53549801b4996dd0f6f5eded62 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 14:50:47 2018 +0100 + + [aat] Towards implementing ContextualSubtable + + src/hb-aat-layout-common-private.hh | 58 ++++++++++++++++++++++-- + src/hb-aat-layout-morx-table.hh | 88 + ++++++++++++++++++++++++++----------- + 2 files changed, 117 insertions(+), 29 deletions(-) + +commit 62348f647f7b1604e008dbed46a54eff245fc106 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 12:00:28 2018 +0100 + + [aat] Implement end-of-text in state machine + + Passes MORX-10 test now. + + src/hb-aat-layout-morx-table.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit fc405b7ca77088135cb7de11cb32c254b85272fd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 11:55:29 2018 +0100 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 1 + + test/shaping/data/text-rendering-tests/Makefile.sources | 11 + ++++++----- + .../data/text-rendering-tests/fonts/TestMORXTen.ttf | Bin 0 -> + 1620 bytes + .../data/text-rendering-tests/tests/MORX-10.tests | 1 + + 4 files changed, 8 insertions(+), 5 deletions(-) + +commit 9adbd938fafe1de4e279489fc37ae33c900e22f0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 11:55:10 2018 +0100 + + Minor + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4177f646aa60180f094e064a53e54c5402fe53c6 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Jan 11 15:43:23 2018 +0330 + + [cmake] Update and unbreak (#700) + + test/shaping/CMakeLists.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 94644d7ea4cf217e4d6c6ff57d65e1e20866ea6d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 11:49:07 2018 +0100 + + [aat] Generate finegrained unsafe-to-break in state-machine! + + Neato. + + src/hb-aat-layout-morx-table.hh | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit 994eb7744c530bbaa5d6d8b8e07ca936e81aade8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 11:37:12 2018 +0100 + + [buffer] Fix crash + + src/hb-buffer-serialize.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d6076747ac6706b4d8361714d46aced9683c44a8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 10:51:46 2018 +0100 + + [test/text-rendering-tests] Add DISABLED list + + test/shaping/data/text-rendering-tests/DISABLED | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit de02b5093c42a527ae67084b30943369ed59efe6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 10:48:42 2018 +0100 + + [test/in-house] Add Makefile.sources + + test/shaping/data/in-house/Makefile.am | 46 + ++--------------------------- + test/shaping/data/in-house/Makefile.sources | 46 + +++++++++++++++++++++++++++++ + 2 files changed, 48 insertions(+), 44 deletions(-) + +commit 7c32e01d04deaab511d41f5dec0dfd9fc0469f39 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 10:47:31 2018 +0100 + + Minor + + src/Makefile.am | 1 + + src/Makefile.sources | 2 -- + test/shaping/data/text-rendering-tests/update.sh | 2 -- + util/Makefile.am | 1 + + util/Makefile.sources | 2 -- + 5 files changed, 2 insertions(+), 6 deletions(-) + +commit a5adc5aa84c03184fd1c8a486be80ff0af1f448c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 10:30:22 2018 +0100 + + [test/text-rendering-tests] Update from upstream + + Also adds an update.sh script that does this automatically. + + test/shaping/data/text-rendering-tests/Makefile.am | 52 + +++------------------ + .../data/text-rendering-tests/Makefile.sources | 51 + ++++++++++++++++++++ + .../text-rendering-tests/fonts/TestMORXEight.ttf | Bin 0 -> 2184 bytes + .../text-rendering-tests/fonts/TestMORXNine.ttf | Bin 0 -> 1624 bytes + .../data/text-rendering-tests/tests/MORX-5.tests | 25 ++++++++++ + .../data/text-rendering-tests/tests/MORX-6.tests | 1 + + .../data/text-rendering-tests/tests/MORX-7.tests | 1 + + .../data/text-rendering-tests/tests/MORX-8.tests | 3 ++ + .../data/text-rendering-tests/tests/MORX-9.tests | 1 + + test/shaping/data/text-rendering-tests/update.sh | 48 + +++++++++++++++++++ + 10 files changed, 136 insertions(+), 46 deletions(-) + +commit c861daacc4255d41d2358868b917277422949dc9 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 10:11:01 2018 +0100 + + [test/text-rendering-tests] Add README and COPYING + + test/shaping/data/text-rendering-tests/COPYING | 13 +++++++++++++ + test/shaping/data/text-rendering-tests/Makefile.am | 2 ++ + test/shaping/data/text-rendering-tests/README | 4 ++++ + 3 files changed, 19 insertions(+) + +commit 14b4d84eef18bd54287c10ce44eaef4f642f6238 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 10:08:25 2018 +0100 + + [aat] Fix RearrangementSubtable action + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ea3e86c6401d41cf54d82692eccbf44c87be2fd5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 09:58:42 2018 +0100 + + Minor + + test/shaping/data/Makefile.am | 4 ++++ + test/shaping/data/in-house/Makefile.am | 4 ++++ + test/shaping/data/text-rendering-tests/Makefile.am | 4 ++++ + 3 files changed, 12 insertions(+) + +commit 800e4ae80232f022404be155afd497b0421a6a64 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 09:57:55 2018 +0100 + + [aat] Mark state-machine-based lookup as completely unsafe-to-break + + To be improved later. + + src/hb-aat-layout-morx-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit ca42d961293a9e4dfd0817c1a02d454008583282 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 11 09:15:34 2018 +0100 + + [aat] Implement RearrangementSubtable + + src/hb-aat-layout-common-private.hh | 89 ++++++++++++++++- + src/hb-aat-layout-morx-table.hh | 192 + +++++++++++++++++++++++++++++++----- + src/hb-open-type-private.hh | 2 - + src/hb-private.hh | 7 +- + 4 files changed, 254 insertions(+), 36 deletions(-) + +commit 5dbbd0fdb9a343554112a846b392803f11c13197 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Jan 11 12:33:22 2018 +0330 + + Move the #define of _GNU_SOURCE to the top of hb-private.hh (#697) + + This fixes the build on Cygwin. + + src/hb-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 90e3c9e69e93e05d9fb534fd43b5c99cf58a7cb4 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Jan 11 12:31:05 2018 +0330 + + [cmake] Fix hb-blob test (#699) + + CMakeLists.txt | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 1461965c2220cd957c26b3fe5835200e426bc715 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Jan 11 08:48:22 2018 +0330 + + [test] Better tests output by converting stderr to stdout (#696) + + https://gitlab.kitware.com/cmake/cmake/issues/17630 + + test/shaping/run-tests.py | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit ebb9b7d6335536804b50002fb83dd30da42a8ad5 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Jan 11 08:15:06 2018 +0330 + + [test] Print shaping output on CI fails (#695) + + .circleci/config.yml | 4 ++-- + test/shaping/run-tests.py | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit e24bea8e91ba9f447f1f7f252bdefacef1f83593 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Jan 10 23:51:56 2018 +0330 + + [cmake] Another try on making sure feature testing is working (#691) + + .circleci/config.yml | 131 + ++++++++++++++++++++++++++++----------------------- + CMakeLists.txt | 17 ++++--- + 2 files changed, 79 insertions(+), 69 deletions(-) + +commit 746a37d5bdd2e965aa316e95ba5a7bad809d76a7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 16:47:47 2018 +0100 + + [util] Replace setlinebuf + + util/options.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ff2083c53eecc67c011b96b0b9a58331043e53cf +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 13:54:36 2018 +0100 + + [util] Set stdio files to line buffering + + So we can stream lines to hb-shape and read output. + + util/options.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 80fd5743200cbe221ae3adf057fe0e5ef54a894c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 11:09:53 2018 +0100 + + [aat] Add Class subtable thingy + + From old 'mort' table. + + src/hb-aat-layout-common-private.hh | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +commit 71e0ed9cbad8438239dcedf1bcfa8e19b9dfdc89 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Jan 10 15:45:12 2018 +0330 + + [cmake] Add header existence tests (#685) + + .circleci/config.yml | 4 ++-- + CMakeLists.txt | 53 + ++++++++++++++++++++++++++++++--------------- + test/shaping/CMakeLists.txt | 1 - + 3 files changed, 37 insertions(+), 21 deletions(-) + +commit a073621b5dc2865a014821307128a8fdd1d7d992 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Wed Jan 10 12:13:28 2018 +0330 + + [cmake] Fix tests against latest changes (#690) + + test/shaping/CMakeLists.txt | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit 0b22da954142ad7a1e949a56448cee4e836fff75 +Author: Khaled Hosny <khaledhosny@eglug.org> +Date: Wed Jan 10 07:12:07 2018 +0200 + + Improve HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES docs + + Add the note about absolute glyph positions from the commit message. + + src/hb-buffer.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6db0b17c4ce56bd7477941e7a2fc85997c04588e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 05:40:43 2018 +0100 + + [test] Move test handling to sundirectories + + configure.ac | 3 + + test/shaping/Makefile.am | 98 + +--------------------- + test/shaping/data/Makefile.am | 9 ++ + test/shaping/data/in-house/Makefile.am | 58 +++++++++++++ + test/shaping/data/text-rendering-tests/Makefile.am | 60 +++++++++++++ + 5 files changed, 131 insertions(+), 97 deletions(-) + +commit 4c982b4867707fcd2259b344b06e5bba8dd0c1e3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 05:26:55 2018 +0100 + + [test] Whitelist one more passing test + + test/shaping/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 188ee6e5eeef3c63c332cfa30795d37da1bc1682 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 05:13:47 2018 +0100 + + Calculate anchor positions in float, then round + + Hoping to reduce rounding error, to make tests happier... + No luck. + + src/hb-font-private.hh | 6 ++++++ + src/hb-ot-layout-gpos-table.hh | 44 + +++++++++++++++++++++--------------------- + 2 files changed, 28 insertions(+), 22 deletions(-) + +commit 0b28e1199d62765db4e855756b96022e423dcc17 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 05:02:42 2018 +0100 + + [test] Whitelist one more passing test + + test/shaping/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7cdd6ab068500aa18de9a856bfbe730d0aac9a27 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 04:33:08 2018 +0100 + + Round, instead of floor, when applying variations + + Hoping this would fix remaining text-rendering-tests failures, + but so far no luck. + + src/hb-font-private.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-private.hh | 1 + + 3 files changed, 3 insertions(+), 2 deletions(-) + +commit 6dc6f0c9f844a006b4518ce789e319fcef6e9680 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 04:12:35 2018 +0100 + + [test] Whitelist one passing test + + test/shaping/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ec939761e4d1b2f825db715290d70e18b1c9dd12 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:56:43 2018 +0100 + + Minor + + test/shaping/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit c4eac531dfad55f691557a684b3a6bde83c4bcea +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:51:09 2018 +0100 + + Minor + + test/shaping/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 285a0bd799426c544d896f8fbcc27f4613a28e9a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:49:32 2018 +0100 + + [test] Another try + + Making cmake happy this time. + + test/shaping/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 95b32b00557d6afcfc469f8dcc51d8bfa8243a00 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:48:09 2018 +0100 + + [test] Fix text disabling + + Ouch, make! + + test/shaping/Makefile.am | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +commit a938d105b8d6e2d654079ea7d89e2e3ef5e0aed4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:41:55 2018 +0100 + + [test/text-rendering-tests] Disable failing tests + + test/shaping/Makefile.am | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit ed95d5e374a10770eb305dfa43a9f5b39933aac7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:38:52 2018 +0100 + + [test/text-rendering-tests] Disable failing tests + + test/shaping/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3b1e97f364e5ffdc08b52f889e3fea80a7e83e99 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:35:20 2018 +0100 + + Add HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES + + New API: + HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES + hb-shape / hb-view --remove-default-ignorables + + One more text-rendering-tests test passing. Eleven failing. + + src/hb-buffer.h | 17 ++++-- + src/hb-ot-shape.cc | 6 +- + .../data/text-rendering-tests/extract-tests.py | 2 +- + .../data/text-rendering-tests/tests/AVAR-1.tests | 34 +++++------ + .../data/text-rendering-tests/tests/CFF-1.tests | 26 ++++----- + .../data/text-rendering-tests/tests/CFF-2.tests | 26 ++++----- + .../data/text-rendering-tests/tests/CFF2-1.tests | 18 +++--- + .../data/text-rendering-tests/tests/CMAP-1.tests | 8 +-- + .../data/text-rendering-tests/tests/CMAP-2.tests | 4 +- + .../data/text-rendering-tests/tests/CMAP-3.tests | 40 ++++++------- + .../data/text-rendering-tests/tests/CVAR-1.tests | 6 +- + .../data/text-rendering-tests/tests/CVAR-2.tests | 6 +- + .../data/text-rendering-tests/tests/GLYF-1.tests | 2 +- + .../data/text-rendering-tests/tests/GPOS-1.tests | 38 ++++++------ + .../data/text-rendering-tests/tests/GPOS-2.tests | 6 +- + .../data/text-rendering-tests/tests/GPOS-3.tests | 8 +-- + .../data/text-rendering-tests/tests/GPOS-4.tests | 8 +-- + .../data/text-rendering-tests/tests/GPOS-5.tests | 10 ++-- + .../data/text-rendering-tests/tests/GSUB-1.tests | 2 +- + .../data/text-rendering-tests/tests/GSUB-2.tests | 22 +++---- + .../data/text-rendering-tests/tests/GVAR-1.tests | 18 +++--- + .../data/text-rendering-tests/tests/GVAR-2.tests | 18 +++--- + .../data/text-rendering-tests/tests/GVAR-3.tests | 18 +++--- + .../data/text-rendering-tests/tests/GVAR-4.tests | 22 +++---- + .../data/text-rendering-tests/tests/GVAR-5.tests | 22 +++---- + .../data/text-rendering-tests/tests/GVAR-6.tests | 22 +++---- + .../data/text-rendering-tests/tests/GVAR-7.tests | 14 ++--- + .../data/text-rendering-tests/tests/GVAR-8.tests | 12 ++-- + .../data/text-rendering-tests/tests/GVAR-9.tests | 20 +++---- + .../data/text-rendering-tests/tests/HVAR-1.tests | 12 ++-- + .../data/text-rendering-tests/tests/HVAR-2.tests | 12 ++-- + .../data/text-rendering-tests/tests/KERN-1.tests | 2 +- + .../data/text-rendering-tests/tests/KERN-2.tests | 2 +- + .../data/text-rendering-tests/tests/MORX-1.tests | 2 +- + .../data/text-rendering-tests/tests/MORX-2.tests | 32 +++++----- + .../data/text-rendering-tests/tests/MORX-3.tests | 32 +++++----- + .../data/text-rendering-tests/tests/MORX-4.tests | 30 +++++----- + .../data/text-rendering-tests/tests/SHARAN-1.tests | 12 ++-- + .../data/text-rendering-tests/tests/SHBALI-1.tests | 44 +++++++------- + .../data/text-rendering-tests/tests/SHBALI-2.tests | 24 ++++---- + .../data/text-rendering-tests/tests/SHBALI-3.tests | 18 +++--- + .../data/text-rendering-tests/tests/SHKNDA-1.tests | 68 + +++++++++++----------- + .../data/text-rendering-tests/tests/SHKNDA-2.tests | 32 +++++----- + .../data/text-rendering-tests/tests/SHKNDA-3.tests | 62 + ++++++++++---------- + util/options.cc | 1 + + util/options.hh | 14 +++-- + 46 files changed, 435 insertions(+), 419 deletions(-) + +commit 46e4ed552fb1205eb6cbc16450bb231998fc7347 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:22:08 2018 +0100 + + [test/text-rendering-tests] Hook up font variations + + Six more passing. Twelve failing now. + + .../data/text-rendering-tests/extract-tests.py | 6 +++- + .../data/text-rendering-tests/tests/AVAR-1.tests | 34 + +++++++++++----------- + .../data/text-rendering-tests/tests/CFF2-1.tests | 18 ++++++------ + .../data/text-rendering-tests/tests/CVAR-1.tests | 6 ++-- + .../data/text-rendering-tests/tests/CVAR-2.tests | 6 ++-- + .../data/text-rendering-tests/tests/GPOS-5.tests | 10 +++---- + .../data/text-rendering-tests/tests/GVAR-1.tests | 18 ++++++------ + .../data/text-rendering-tests/tests/GVAR-2.tests | 18 ++++++------ + .../data/text-rendering-tests/tests/GVAR-3.tests | 18 ++++++------ + .../data/text-rendering-tests/tests/GVAR-4.tests | 22 +++++++------- + .../data/text-rendering-tests/tests/GVAR-5.tests | 22 +++++++------- + .../data/text-rendering-tests/tests/GVAR-6.tests | 22 +++++++------- + .../data/text-rendering-tests/tests/GVAR-7.tests | 14 ++++----- + .../data/text-rendering-tests/tests/GVAR-8.tests | 12 ++++---- + .../data/text-rendering-tests/tests/GVAR-9.tests | 20 ++++++------- + .../data/text-rendering-tests/tests/HVAR-1.tests | 12 ++++---- + .../data/text-rendering-tests/tests/HVAR-2.tests | 12 ++++---- + 17 files changed, 137 insertions(+), 133 deletions(-) + +commit 2b3f62fc4de8f10c2168f212b1368478312e6dec +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:16:56 2018 +0100 + + [test] Add tests from text-rendering-tests repo + + https://github.com/unicode-org/text-rendering-tests + + test/shaping/Makefile.am | 44 ++++++++++++++- + .../fonts/AdobeVFPrototype-Subset.otf | Bin 0 -> 7096 bytes + .../text-rendering-tests/fonts/FDArrayTest257.otf | Bin 0 -> 145212 + bytes + .../fonts/FDArrayTest65535.otf | Bin 0 -> 492740 + bytes + .../fonts/NotoSansBalinese-Regular.ttf | Bin 0 -> 32304 bytes + .../fonts/NotoSansKannada-Regular.ttf | Bin 0 -> 83868 bytes + .../fonts/NotoSerifKannada-Regular.ttf | Bin 0 -> 96936 bytes + .../text-rendering-tests/fonts/Selawik-README.md | 60 + +++++++++++++++++++++ + .../fonts/Selawik-variable.ttf | Bin 0 -> 481504 + bytes + .../data/text-rendering-tests/fonts/TestAVAR.ttf | Bin 0 -> 1608 bytes + .../data/text-rendering-tests/fonts/TestCMAP14.otf | Bin 0 -> 1628 bytes + .../fonts/TestCMAPMacTurkish.ttf | Bin 0 -> 19644 bytes + .../text-rendering-tests/fonts/TestCVARGVAROne.ttf | Bin 0 -> 12336 bytes + .../text-rendering-tests/fonts/TestCVARGVARTwo.ttf | Bin 0 -> 12256 bytes + .../text-rendering-tests/fonts/TestGLYFOne.ttf | Bin 0 -> 1516 bytes + .../text-rendering-tests/fonts/TestGPOSFour.ttf | Bin 0 -> 315020 + bytes + .../text-rendering-tests/fonts/TestGPOSOne.ttf | Bin 0 -> 10384 bytes + .../text-rendering-tests/fonts/TestGPOSThree.ttf | Bin 0 -> 3500 bytes + .../text-rendering-tests/fonts/TestGPOSTwo.otf | Bin 0 -> 1680 bytes + .../text-rendering-tests/fonts/TestGSUBOne.otf | Bin 0 -> 1788 bytes + .../text-rendering-tests/fonts/TestGVAREight.ttf | Bin 0 -> 4692 bytes + .../text-rendering-tests/fonts/TestGVARFour.ttf | Bin 0 -> 3204 bytes + .../text-rendering-tests/fonts/TestGVARNine.ttf | Bin 0 -> 2168 bytes + .../text-rendering-tests/fonts/TestGVAROne.ttf | Bin 0 -> 14312 bytes + .../text-rendering-tests/fonts/TestGVARThree.ttf | Bin 0 -> 14336 bytes + .../text-rendering-tests/fonts/TestGVARTwo.ttf | Bin 0 -> 15668 bytes + .../text-rendering-tests/fonts/TestHVAROne.otf | Bin 0 -> 3984 bytes + .../text-rendering-tests/fonts/TestHVARTwo.ttf | Bin 0 -> 4004 bytes + .../text-rendering-tests/fonts/TestKERNOne.otf | Bin 0 -> 1380 bytes + .../text-rendering-tests/fonts/TestMORXFour.ttf | Bin 0 -> 4764 bytes + .../text-rendering-tests/fonts/TestMORXOne.ttf | Bin 0 -> 2404 bytes + .../text-rendering-tests/fonts/TestMORXThree.ttf | Bin 0 -> 4104 bytes + .../text-rendering-tests/fonts/TestMORXTwo.ttf | Bin 0 -> 4960 bytes + .../text-rendering-tests/fonts/TestShapeAran.ttf | Bin 0 -> 116044 + bytes + .../text-rendering-tests/fonts/TestShapeEthi.ttf | Bin 0 -> 5292 bytes + .../data/text-rendering-tests/fonts/Zycon.ttf | Bin 0 -> 21036 bytes + .../data/text-rendering-tests/tests/AVAR-1.tests | 17 ++++++ + .../data/text-rendering-tests/tests/CFF-1.tests | 13 +++++ + .../data/text-rendering-tests/tests/CFF-2.tests | 13 +++++ + .../data/text-rendering-tests/tests/CFF2-1.tests | 9 ++++ + .../data/text-rendering-tests/tests/CMAP-1.tests | 4 ++ + .../data/text-rendering-tests/tests/CMAP-2.tests | 2 + + .../data/text-rendering-tests/tests/CMAP-3.tests | 20 +++++++ + .../data/text-rendering-tests/tests/CVAR-1.tests | 3 ++ + .../data/text-rendering-tests/tests/CVAR-2.tests | 3 ++ + .../data/text-rendering-tests/tests/GLYF-1.tests | 1 + + .../data/text-rendering-tests/tests/GPOS-1.tests | 19 +++++++ + .../data/text-rendering-tests/tests/GPOS-2.tests | 3 ++ + .../data/text-rendering-tests/tests/GPOS-3.tests | 4 ++ + .../data/text-rendering-tests/tests/GPOS-4.tests | 4 ++ + .../data/text-rendering-tests/tests/GPOS-5.tests | 5 ++ + .../data/text-rendering-tests/tests/GSUB-1.tests | 1 + + .../data/text-rendering-tests/tests/GSUB-2.tests | 11 ++++ + .../data/text-rendering-tests/tests/GVAR-1.tests | 9 ++++ + .../data/text-rendering-tests/tests/GVAR-2.tests | 9 ++++ + .../data/text-rendering-tests/tests/GVAR-3.tests | 9 ++++ + .../data/text-rendering-tests/tests/GVAR-4.tests | 11 ++++ + .../data/text-rendering-tests/tests/GVAR-5.tests | 11 ++++ + .../data/text-rendering-tests/tests/GVAR-6.tests | 11 ++++ + .../data/text-rendering-tests/tests/GVAR-7.tests | 7 +++ + .../data/text-rendering-tests/tests/GVAR-8.tests | 6 +++ + .../data/text-rendering-tests/tests/GVAR-9.tests | 10 ++++ + .../data/text-rendering-tests/tests/HVAR-1.tests | 6 +++ + .../data/text-rendering-tests/tests/HVAR-2.tests | 6 +++ + .../data/text-rendering-tests/tests/KERN-1.tests | 1 + + .../data/text-rendering-tests/tests/KERN-2.tests | 1 + + .../data/text-rendering-tests/tests/MORX-1.tests | 1 + + .../data/text-rendering-tests/tests/MORX-2.tests | 16 ++++++ + .../data/text-rendering-tests/tests/MORX-3.tests | 16 ++++++ + .../data/text-rendering-tests/tests/MORX-4.tests | 15 ++++++ + .../data/text-rendering-tests/tests/SHARAN-1.tests | 6 +++ + .../data/text-rendering-tests/tests/SHBALI-1.tests | 22 ++++++++ + .../data/text-rendering-tests/tests/SHBALI-2.tests | 12 +++++ + .../data/text-rendering-tests/tests/SHBALI-3.tests | 9 ++++ + .../data/text-rendering-tests/tests/SHKNDA-1.tests | 34 ++++++++++++ + .../data/text-rendering-tests/tests/SHKNDA-2.tests | 16 ++++++ + .../data/text-rendering-tests/tests/SHKNDA-3.tests | 31 +++++++++++ + 77 files changed, 510 insertions(+), 1 deletion(-) + +commit 6b19178ee35fec3b2115d6a06a86db36dc838b38 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 03:07:30 2018 +0100 + + Prefix int types with HB + + Such a headache that Windows defines UINT8, ...; Just prefix it. + + src/hb-aat-layout-common-private.hh | 29 +++--- + src/hb-aat-layout-morx-table.hh | 65 +++++++------ + src/hb-open-file-private.hh | 6 +- + src/hb-open-type-private.hh | 70 +++++++------- + src/hb-ot-cbdt-table.hh | 78 ++++++++-------- + src/hb-ot-cmap-table.hh | 90 +++++++++--------- + src/hb-ot-glyf-table.hh | 10 +- + src/hb-ot-head-table.hh | 28 +++--- + src/hb-ot-hhea-table.hh | 18 ++-- + src/hb-ot-kern-table.hh | 36 ++++---- + src/hb-ot-layout-common-private.hh | 120 ++++++++++++------------ + src/hb-ot-layout-gdef-table.hh | 22 ++--- + src/hb-ot-layout-gpos-table.hh | 94 +++++++++---------- + src/hb-ot-layout-gsub-table.hh | 30 +++--- + src/hb-ot-layout-gsubgpos-private.hh | 172 + +++++++++++++++++------------------ + src/hb-ot-math-table.hh | 26 +++--- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-name-table.hh | 16 ++-- + src/hb-ot-os2-table.hh | 70 +++++++------- + src/hb-ot-post-table.hh | 16 ++-- + src/hb-ot-var-avar-table.hh | 4 +- + src/hb-ot-var-fvar-table.hh | 20 ++-- + src/hb-ot-var-hvar-table.hh | 8 +- + src/hb-ot-var-mvar-table.hh | 10 +- + 24 files changed, 517 insertions(+), 523 deletions(-) + +commit 81e321c802afcc43186737e6900f8d7e2f9d4fd3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 02:56:29 2018 +0100 + + [aat] Try fixing VC bots + + c:\projects\harfbuzz\src\hb-aat-layout-common-private.hh(51): + error C2872: 'UINT16': ambiguous symbol + [C:\projects\harfbuzz\build\harfbuzz.vcxproj] + C:\Program Files (x86)\Windows + Kits\10\Include\10.0.14393.0\shared\basetsd.h(80): note: could be + 'unsigned short UINT16' + c:\projects\harfbuzz\src\hb-open-type-private.hh(648): note: or + 'OT::UINT16' + + src/hb-aat-layout-common-private.hh | 3 +++ + src/hb-aat-layout-morx-table.hh | 3 +++ + 2 files changed, 6 insertions(+) + +commit 0ed69c946247feb5bbb5be06d5314c5e0c0fec67 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 02:49:36 2018 +0100 + + Disable processing of morx table in ot shaper + + So I can merge this to master... + + src/hb-ot-shape.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3f29ea91441b2e8c86cf379b4803f638a2e8dcfc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 02:48:04 2018 +0100 + + [util] Add hb-shape --ned + + For not displaying extra data: no clusters, no advance. Just data + pertaining + to where glyphs end up on the screen. + + test/shaping/data/text-rendering-tests/extract-tests.py | 2 +- + util/options.cc | 13 + +++++++++++++ + 2 files changed, 14 insertions(+), 1 deletion(-) + +commit 7020130665316365c288d0960fc288faa8f5bdf7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 02:37:39 2018 +0100 + + [test] Minor + + test/shaping/run-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5f94b4cc39f2f61b38c954ddac1aae6a052845bd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 02:35:59 2018 +0100 + + [kern] Mark unsafe-to-break + + src/hb-ot-shape-fallback.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 71fd6325b6cba2586709022dd33530c61141bf8f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 02:20:14 2018 +0100 + + Add option to buffer serialization to not output glyph advances + + When advances are not printed, glyph offsets reflect absolute glyph + positions. + + New API: + HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES + hb-shape --no-advances + + src/hb-buffer-serialize.cc | 38 ++++++++++++++++++++++++++++---------- + src/hb-buffer.h | 5 ++++- + util/hb-shape.cc | 2 ++ + util/options.cc | 2 ++ + util/options.hh | 2 ++ + 5 files changed, 38 insertions(+), 11 deletions(-) + +commit 316a28f8f8a9c459936ce9f2786d4d64a8f4e2c0 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 01:54:12 2018 +0100 + + [test] Add script for extracting tests from text-rendering-tests + + Work in progress... + + https://github.com/unicode-org/text-rendering-tests + + .../data/text-rendering-tests/extract-tests.py | 45 + ++++++++++++++++++++++ + 1 file changed, 45 insertions(+) + +commit 6b4d63f295f419f55983a8fc72f582802f55b09f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 10 01:13:36 2018 +0100 + + [test] Minor + + test/shaping/run-tests.py | 9 --------- + 1 file changed, 9 deletions(-) + +commit 504f913654d5904604e6abdbf7d0653f40db51fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 23:15:54 2018 +0100 + + [test] Simplify test runner + + Always pass hb-shape as first argument to run-tests.py. + + Also require automake 1.13. + + configure.ac | 3 +-- + test/shaping/Makefile.am | 18 ++---------------- + test/shaping/run-tests.py | 22 +++++----------------- + 3 files changed, 8 insertions(+), 35 deletions(-) + +commit 141db8b7a3abf2adbf0caa0659d9239396f6a2db +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 23:11:00 2018 +0100 + + [test] Minor + + test/shaping/Makefile.am | 4 ---- + test/shaping/run-tests.py | 4 ++-- + 2 files changed, 2 insertions(+), 6 deletions(-) + +commit 44c65eee28e2de5c54028cb0ef144f56da16ef58 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 21:58:57 2018 +0100 + + [test] Reorganize test suite + + In anticipation of importing more test suites. + + test/fuzzing/run-fuzzer-tests.py | 2 +- + test/shaping/Makefile.am | 86 + +++++++++--------- + test/shaping/{fonts => data/in-house}/COPYING | 7 +- + .../0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf | Bin + .../051d92f8bc6ff724511b296c27623f824de256e9.ttf | Bin + .../074a5ae6b19de8f29772fdd5df2d3d833f81f5e6.ttf | Bin + .../07f054357ff8638bac3711b422a1e31180bba863.ttf | Bin + .../15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf | Bin + .../1735326da89f0818cd8c51a0600e9789812c0f94.ttf | Bin + .../191826b9643e3f124d865d617ae609db6a2ce203.ttf | Bin + .../1a3d8f381387dd29be1e897e4b5100ac8b4829e1.ttf | Bin + .../1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf | Bin + .../1c04a16f32a39c26c851b7fc014d2e8d298ba2b8.ttf | Bin + .../1c2c3fc37b2d4c3cb2ef726c6cdaaabd4b7f3eb9.ttf | Bin + .../1c2fb74c1b2aa173262734c1f616148f1648cfd6.ttf | Bin + .../205edd09bd3d141cc9580f650109556cc28b22cb.ttf | Bin + .../217a934cfe15c548b572c203dceb2befdf026462.ttf | Bin + .../21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf | Bin + .../226bc2deab3846f1a682085f70c67d0421014144.ttf | Bin + .../243798dd281c1c77c065958e1ff467420faa9bde.ttf | Bin + .../24b8d24d00ae86f49791b746da4c9d3f717a51a8.ttf | Bin + .../270b89df543a7e48e206a2d830c0e10e5265c630.ttf | Bin + .../298c9e1d955f10f6f72c6915c3c6ff9bf9695cec.ttf | Bin + .../2de1ab4907ab688c0cfc236b0bf51151db38bf2e.ttf | Bin + .../341421e629668b1a1242245d39238ca48432d35d.ttf | Bin + .../3493e92eaded2661cadde752a39f9d58b11f0326.ttf | Bin + .../3511ff5c1647150595846ac414c595cccac34f18.ttf | Bin + .../37033cc5cf37bb223d7355153016b6ccece93b28.ttf | Bin + .../373e67bf41ca264e260a9716162b71a23549e885.ttf | Bin + .../375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf | Bin + .../3cae6bfe5b57c07ba81ddbd54c02fe4f3a1e3bf6.ttf | Bin + .../3d0b77a2360aa6faa1385aaa510509ab70dfbeff.ttf | Bin + .../43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf | Bin + .../43ef465752be9af900745f72fe29cb853a1401a5.ttf | Bin + .../45855bc8d46332b39c4ab9e2ee1a26b1f896da6b.ttf | Bin + .../49c9f7485c1392fa09a1b801bc2ffea79275f22e.ttf | Bin + .../4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf | Bin + .../4fac3929fc3332834e93673780ec0fe94342d193.ttf | Bin + .../5028afb650b1bb718ed2131e872fbcce57828fff.ttf | Bin + .../53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf | Bin + .../54674a3111d209fb6be0ed31745314b7a8d2c244.ttf | Bin + .../558661aa659912f4d30ecd27bd09835171a8e2b0.ttf | Bin + .../55c88ebbe938680b08f92c3de20713183e0c7481.ttf | Bin + .../56cfd0e18d07f41c38e9598545a6d369127fc6f9.ttf | Bin + .../57a9d9f83020155cbb1d2be1f43d82388cbecc88.ttf | Bin + .../59a585a63b3df608fbeef00956c8c108deec7de6.ttf | Bin + .../5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf | Bin + .../5dfad7735c6a67085f1b90d4d497e32907db4c78.ttf | Bin + .../641bd9db850193064d17575053ae2bf8ec149ddc.ttf | Bin + .../663aef6b019dbf45ffd74089e2b5f2496ceceb18.ttf | Bin + .../6991b13ce889466be6de3f66e891de2bc0f117ee.ttf | Bin + .../6ff0fbead4462d9f229167b4e6839eceb8465058.ttf | Bin + .../706c5d7b625f207bc0d874c67237aad6f1e9cd6f.ttf | Bin + .../757ebd573617a24aa9dfbf0b885c54875c6fe06b.ttf | Bin + .../7a37dc4d5bf018456aea291cee06daf004c0221c.ttf | Bin + .../7e14e7883ed152baa158b80e207b66114c823a8b.ttf | Bin + .../8099955657a54e9ee38a6ba1d6f950ce58e3cc25.ttf | Bin + .../813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf | Bin + .../81c368a33816fb20e9f647e8f24e2180f4720263.ttf | Bin + .../8228d035fcd65d62ec9728fb34f42c63be93a5d3.ttf | Bin + .../8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf | Bin + .../82f4f3b57bb55344e72e70231380202a52af5805.ttf | Bin + .../8454d22037f892e76614e1645d066689a0200e61.ttf | Bin + .../85414f2552b654585b7a8d13dcc3e8fd9f7970a3.ttf | Bin + .../856ff9562451293cbeff6f396d4e3877c4f0a436.ttf | Bin + .../85fe0be440c64ac77699e21c2f1bd933a919167e.ttf | Bin + .../87f85d17d26f1fe9ad28d7365101958edaefb967.ttf | Bin + .../8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf | Bin + .../94a5d6fb15a27521fba9ea4aee9cb39b2d03322a.ttf | Bin + .../96490dd2ff81233b335a650e7eb660e0e7b2eeea.ttf | Bin + .../98b7887cff91f722b92a8ff800120954606354f9.ttf | Bin + .../9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf | Bin + .../a014549f766436cf55b2ceb40e462038938ee899.ttf | Bin + .../a02a7f0ad42c2922cb37ad1358c9df4eb81f1bca.ttf | Bin + .../a34a7b00f22ffb5fd7eef6933b81c7e71bc2cdfb.ttf | Bin + .../a34a9191d9376bda419836effeef7e75c1386016.ttf | Bin + .../a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf | Bin + .../a6c76d1bafde4a0b1026ebcc932d2e5c6fd02442.ttf | Bin + .../a919b33197965846f21074b24e30250d67277bce.ttf | Bin + .../a98e908e2ed21b22228ea59ebcc0f05034c86f2e.ttf | Bin + .../b151cfcdaa77585d77f17a42158e0873fc8e2633.ttf | Bin + .../b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf | Bin + .../b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf | Bin + .../bb0c53752e85c3d28973ebc913287b8987d3dfe8.ttf | Bin + .../bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf | Bin + .../bb9473d2403488714043bcfb946c9f78b86ad627.ttf | Bin + .../bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf | Bin + .../bf39b0e91ef9807f15a9e283a21a14a209fd2cfc.ttf | Bin + .../bf962d3202883a820aed019d9b5c1838c2ff69c6.ttf | Bin + .../c4e48b0886ef460f532fb49f00047ec92c432ec0.ttf | Bin + .../cc5f3d2d717fb6bd4dfae1c16d48a2cb8e12233b.ttf | Bin + .../d23d76ea0909c14972796937ba072b5a40c1e257.ttf | Bin + .../d629e7fedc0b350222d7987345fe61613fa3929a.ttf | Bin + .../d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf | Bin + .../dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf | Bin + .../df768b9c257e0c9c35786c47cae15c46571d56be.ttf | Bin + .../e207635780b42f898d58654b65098763e340f5c7.ttf | Bin + .../e68a88939e0f06e34d2bc911f09b70890289c8fd.ttf | Bin + .../e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf | Bin + .../ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf | Bin + .../ef2511f215aa3ca847cbfffbf861793b42170875.ttf | Bin + .../ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf | Bin + .../f22416c692720a7d46fadf4af99f4c9e094f00b9.ttf | Bin + .../f443753e8ffe8e8aae606cfba158e00334b6efb1.ttf | Bin + .../f499fbc23865022234775c43503bba2e63978fe1.ttf | Bin + .../f518eb6f6b5eec2946c9fbbbde44e45d46f5e2ac.ttf | Bin + .../f9b1dd4dcb515e757789a22cb4241107746fd3d0.ttf | Bin + .../fab39d60d758cb586db5a504f218442cd1395725.ttf | Bin + .../fbb6c84c9e1fe0c39e152fbe845e51fd81f6748e.ttf | Bin + .../fcdcffbdf1c4c97c05308d7600e4c283eb47dbca.ttf | Bin + .../ffa0f5d2d9025486d8469d8b1fdd983e7632499b.ttf | Bin + .../in-house/tests/arabic-fallback-shaping.tests | 1 + + .../data/in-house/tests/arabic-feature-order.tests | 4 + + .../data/in-house/tests/arabic-like-joining.tests | 1 + + .../data/in-house/tests/arabic-mark-order.tests | 6 ++ + test/shaping/data/in-house/tests/arabic-stch.tests | 1 + + .../data/in-house/tests/automatic-fractions.tests | 3 + + test/shaping/data/in-house/tests/cluster.tests | 2 + + test/shaping/data/in-house/tests/color-fonts.tests | 1 + + .../data/in-house/tests/context-matching.tests | 3 + + .../data/in-house/tests/cursive-positioning.tests | 4 + + .../data/in-house/tests/default-ignorables.tests | 2 + + .../data/in-house/tests/emoji-flag-tags.tests | 2 + + .../data/in-house/tests/fallback-positioning.tests | 2 + + test/shaping/data/in-house/tests/fuzzed.tests | 22 +++++ + test/shaping/data/in-house/tests/hangul-jamo.tests | 2 + + test/shaping/data/in-house/tests/hyphens.tests | 2 + + .../tests/indic-consonant-with-stacker.tests | 4 + + test/shaping/data/in-house/tests/indic-init.tests | 1 + + .../in-house/tests/indic-joiner-candrabindu.tests | 2 + + .../data/in-house/tests/indic-joiners.tests | 2 + + .../data/in-house/tests/indic-old-spec.tests | 2 + + .../data/in-house/tests/indic-pref-blocking.tests | 2 + + .../in-house/tests/indic-script-extensions.tests | 2 + + .../data/in-house/tests/indic-special-cases.tests | 3 + + .../data/in-house/tests/indic-syllable.tests | 8 ++ + .../data/in-house/tests/language-tags.tests | 12 +++ + test/shaping/data/in-house/tests/ligature-id.tests | 36 ++++++++ + .../data/in-house/tests/mark-attachment.tests | 1 + + .../data/in-house/tests/mark-filtering-sets.tests | 5 ++ + .../tests/mongolian-variation-selector.tests | 4 + + test/shaping/data/in-house/tests/simple.tests | 2 + + test/shaping/data/in-house/tests/spaces.tests | 17 ++++ + .../in-house/tests/tibetan-contractions-1.tests | 60 +++++++++++++ + .../in-house/tests/tibetan-contractions-2.tests | 53 +++++++++++ + .../data/in-house/tests/tibetan-vowels.tests | 11 +++ + test/shaping/data/in-house/tests/use-marchen.tests | 35 ++++++++ + .../shaping/data/in-house/tests/use-syllable.tests | 7 ++ + test/shaping/data/in-house/tests/use.tests | 4 + + .../data/in-house/tests/variations-rvrn.tests | 100 + +++++++++++++++++++++ + test/shaping/data/in-house/tests/vertical.tests | 3 + + .../data/in-house/tests/zero-width-marks.tests | 11 +++ + test/shaping/run-tests.py | 48 ++++------ + .../tests/misc/arabic-fallback-shaping.tests | 1 - + test/shaping/tests/misc/arabic-feature-order.tests | 4 - + test/shaping/tests/misc/arabic-like-joining.tests | 1 - + test/shaping/tests/misc/arabic-mark-order.tests | 6 -- + test/shaping/tests/misc/arabic-stch.tests | 1 - + test/shaping/tests/misc/automatic-fractions.tests | 3 - + test/shaping/tests/misc/cluster.tests | 2 - + test/shaping/tests/misc/color-fonts.tests | 1 - + test/shaping/tests/misc/context-matching.tests | 3 - + test/shaping/tests/misc/cursive-positioning.tests | 4 - + test/shaping/tests/misc/default-ignorables.tests | 2 - + test/shaping/tests/misc/emoji-flag-tags.tests | 2 - + test/shaping/tests/misc/fallback-positioning.tests | 2 - + test/shaping/tests/misc/fuzzed.tests | 22 ----- + test/shaping/tests/misc/hangul-jamo.tests | 2 - + test/shaping/tests/misc/hyphens.tests | 2 - + .../tests/misc/indic-consonant-with-stacker.tests | 4 - + test/shaping/tests/misc/indic-init.tests | 1 - + .../tests/misc/indic-joiner-candrabindu.tests | 2 - + test/shaping/tests/misc/indic-joiners.tests | 2 - + test/shaping/tests/misc/indic-old-spec.tests | 2 - + test/shaping/tests/misc/indic-pref-blocking.tests | 2 - + .../tests/misc/indic-script-extensions.tests | 2 - + test/shaping/tests/misc/indic-special-cases.tests | 3 - + test/shaping/tests/misc/indic-syllable.tests | 8 -- + test/shaping/tests/misc/language-tags.tests | 12 --- + test/shaping/tests/misc/ligature-id.tests | 36 -------- + test/shaping/tests/misc/mark-attachment.tests | 1 - + test/shaping/tests/misc/mark-filtering-sets.tests | 5 -- + .../tests/misc/mongolian-variation-selector.tests | 4 - + test/shaping/tests/misc/simple.tests | 2 - + test/shaping/tests/misc/spaces.tests | 17 ---- + .../tests/misc/tibetan-contractions-1.tests | 60 ------------- + .../tests/misc/tibetan-contractions-2.tests | 53 ----------- + test/shaping/tests/misc/tibetan-vowels.tests | 11 --- + test/shaping/tests/misc/use-marchen.tests | 35 -------- + test/shaping/tests/misc/use-syllable.tests | 7 -- + test/shaping/tests/misc/use.tests | 4 - + test/shaping/tests/misc/variations-rvrn.tests | 100 + --------------------- + test/shaping/tests/misc/vertical.tests | 3 - + test/shaping/tests/misc/zero-width-marks.tests | 11 --- + .../script-arabic/language-persian/mehran.txt | 14 +-- + .../language-urdu/crulp/ligatures/2grams.txt | 0 + .../language-urdu/crulp/ligatures/3grams.txt | 0 + .../language-urdu/crulp/ligatures/4grams.txt | 0 + .../language-urdu/crulp/ligatures/5grams.txt | 0 + .../language-urdu/crulp/ligatures/6grams.txt | 0 + .../language-urdu/crulp/ligatures/7grams.txt | 0 + .../language-urdu/crulp/ligatures/8grams.txt | 0 + .../language-urdu/crulp/ligatures/LICENSE | 0 + .../language-urdu/crulp/ligatures/README | 0 + .../language-urdu/crulp/ligatures/SOURCES | 0 + .../script-arabic/misc/diacritics/lam-alef.txt | 0 + .../misc/diacritics/language-arabic.txt | 0 + .../misc/diacritics/language-persian.txt | 0 + .../misc/diacritics/language-urdu.txt | 0 + .../misc/diacritics/ligature-components.txt | 0 + .../misc/diacritics/ligature-diacritics.txt | 0 + .../misc/diacritics/mark-skipping.txt | 0 + .../shaper-arabic/script-mongolian/misc/misc.txt | 0 + .../script-mongolian/misc/non-joining.txt | 0 + .../shaper-arabic/script-mongolian/misc/poem.txt | 0 + .../script-mongolian/misc/variation-selectors.txt | 0 + .../shaper-arabic/script-nko/misc/misc.txt | 0 + .../shaper-arabic/script-phags-pa/misc/misc.txt | 0 + .../script-syriac/misc/abbreviation-mark.txt | 11 +++ + .../shaper-arabic/script-syriac/misc/alaph.txt | 0 + .../shaper-default/script-ethiopic/misc/misc.txt | 0 + .../shaper-default/script-han/misc/cjk-compat.txt | 0 + .../script-hiragana/misc/kazuraki-liga-lines.txt | 0 + .../script-hiragana/misc/kazuraki-liga.txt | 0 + .../shaper-default/script-linear-b/misc/misc.txt | 0 + .../shaper-default/script-tifinagh/misc/misc.txt | 1 - + .../shaper-hangul/script-hangul/misc/misc.txt | 0 + .../script-hebrew/misc/diacritics.txt | 0 + .../indic/script-assamese/utrrs/LICENSE | 0 + .../indic/script-assamese/utrrs/README | 0 + .../indic/script-assamese/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../indic/script-bengali/misc/misc.txt | 0 + .../indic/script-bengali/misc/reph.txt | 0 + .../indic/script-bengali/utrrs/LICENSE | 0 + .../shaper-indic/indic/script-bengali/utrrs/README | 0 + .../indic/script-bengali/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../indic/script-devanagari/misc/dottedcircle.txt | 0 + .../indic/script-devanagari/misc/eyelash.txt | 0 + .../indic/script-devanagari/misc/joiners.txt | 0 + .../indic/script-devanagari/misc/misc.txt | 0 + .../script-devanagari/misc/spec-deviations.txt | 0 + .../script-devanagari/misc/tricky-reordering.txt | 0 + .../indic/script-devanagari/utrrs/LICENSE | 0 + .../indic/script-devanagari/utrrs/README | 0 + .../indic/script-devanagari/utrrs/SOURCES | 0 + ...icFontFeatureCodepoint-AdditionalConsonants.txt | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + ...tFeatureCodepoint-DevnagariSpecificAddition.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...ndicFontFeatureCodepoint-GenericPunctuation.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../indic/script-gujarati/utrrs/LICENSE | 0 + .../indic/script-gujarati/utrrs/README | 0 + .../indic/script-gujarati/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../indic/script-gurmukhi/misc/misc.txt | 0 + .../indic/script-gurmukhi/utrrs/LICENSE | 0 + .../indic/script-gurmukhi/utrrs/README | 0 + .../indic/script-gurmukhi/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + .../IndicFontFeatureCodepoint-GurmukhiSpecific.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../indic/script-kannada/misc/misc.txt | 0 + .../indic/script-kannada/misc/right-matras.txt | 0 + .../indic/script-kannada/utrrs/LICENSE | 0 + .../shaper-indic/indic/script-kannada/utrrs/README | 0 + .../indic/script-kannada/utrrs/SOURCES | 0 + ...icFontFeatureCodepoint-AdditionalConsonants.txt | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../indic/script-malayalam/misc/cibu.txt | 0 + .../indic/script-malayalam/misc/dot-reph.txt | 0 + .../indic/script-malayalam/misc/misc.txt | 0 + .../indic/script-malayalam/utrrs/LICENSE | 0 + .../indic/script-malayalam/utrrs/README | 0 + .../indic/script-malayalam/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../shaper-indic/indic/script-oriya/misc/bindu.txt | 0 + .../shaper-indic/indic/script-oriya/misc/misc.txt | 0 + .../shaper-indic/indic/script-oriya/utrrs/LICENSE | 0 + .../shaper-indic/indic/script-oriya/utrrs/README | 0 + .../shaper-indic/indic/script-oriya/utrrs/SOURCES | 0 + ...icFontFeatureCodepoint-AdditionalConsonants.txt | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-OriyaSpecific.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../indic/script-sinhala/misc/extensive.txt | 0 + .../indic/script-sinhala/misc/misc.txt | 0 + .../indic/script-sinhala/misc/reph.txt | 0 + .../indic/script-sinhala/misc/split-matras.txt | 0 + .../indic/script-sinhala/utrrs/LICENSE | 0 + .../shaper-indic/indic/script-sinhala/utrrs/README | 0 + .../indic/script-sinhala/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Punctuation.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt | 0 + .../gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt | 0 + .../gsub/IndicFontFeatureGSUB-Special-Cases.txt | 0 + .../gsub/IndicFontFeatureGSUB-TouchingLetters.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../shaper-indic/indic/script-tamil/misc/misc.txt | 0 + .../shaper-indic/indic/script-tamil/utrrs/LICENSE | 0 + .../shaper-indic/indic/script-tamil/utrrs/README | 0 + .../shaper-indic/indic/script-tamil/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-CurrencySymbols.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Numerics.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-Symbols.txt | 0 + .../IndicFontFeatureCodepoint-TamilSymbol.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../shaper-indic/indic/script-telugu/misc/misc.txt | 0 + .../shaper-indic/indic/script-telugu/utrrs/LICENSE | 0 + .../shaper-indic/indic/script-telugu/utrrs/README | 0 + .../shaper-indic/indic/script-telugu/utrrs/SOURCES | 0 + .../IndicFontFeatureCodepoint-AdditionalVowels.txt | 0 + .../IndicFontFeatureCodepoint-Consonants.txt | 0 + .../IndicFontFeatureCodepoint-DependentVowels.txt | 0 + .../codepoint/IndicFontFeatureCodepoint-Digits.txt | 0 + ...IndicFontFeatureCodepoint-IndependentVowels.txt | 0 + .../IndicFontFeatureCodepoint-Reserved.txt | 0 + .../IndicFontFeatureCodepoint-VariousSigns.txt | 0 + .../utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt | 0 + .../utrrs/gsub/IndicFontFeatureGSUB.txt | 0 + .../south-east-asian/script-javanese/misc.txt | 0 + .../south-east-asian/script-khmer/misc/misc.txt | 0 + .../script-khmer/misc/other-marks-invalid.txt | 0 + .../script-khmer/misc/other-marks.txt | 0 + .../shaper-myanmar/script-myanmar/misc/misc.txt | 0 + .../shaper-myanmar/script-myanmar/misc/otspec.txt | 1 - + .../shaper-myanmar/script-myanmar/misc/utn11.txt | 0 + .../shaper-thai/script-lao/misc/sara-am.txt | 0 + .../shaper-thai/script-thai/misc/misc.txt | 0 + .../shaper-thai/script-thai/misc/phinthu.txt | 0 + .../shaper-thai/script-thai/misc/pua-shaping.txt | 0 + .../shaper-thai/script-thai/misc/sara-am.txt | 0 + .../script-tibetan/misc/contractions.txt | 0 + .../shaper-tibetan/script-tibetan/misc/misc.txt | 0 + .../shaper-use/script-batak/misc.txt | 0 + .../shaper-use/script-buginese/misc.txt | 92 + +++++++++---------- + .../shaper-use/script-cham/misc.txt | 0 + .../shaper-use/script-kaithi/misc.txt | 0 + .../shaper-use/script-kharoshti/misc.txt | 0 + .../shaper-use/script-tai-tham/misc.txt | 0 + .../shaper-use/script-tai-tham/torture.txt | 0 + .../script-syriac/misc/abbreviation-mark.txt | 11 --- + 420 files changed, 573 insertions(+), 590 deletions(-) + +commit 9a3ad307ea91794712531dfc688700c11a1ff263 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 21:35:21 2018 +0100 + + [test] Remove unused hb-diff-ngrams + + test/shaping/Makefile.am | 1 - + test/shaping/hb-diff-ngrams | 5 ----- + test/shaping/hb_test_tools.py | 26 -------------------------- + 3 files changed, 32 deletions(-) + +commit b6b460024d29362914c72cc5f8fbaec215db5b16 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 21:33:38 2018 +0100 + + [test] Remove unused manifest stuff + + test/shaping/Makefile.am | 7 ------- + test/shaping/hb-manifest-read | 5 ----- + test/shaping/hb-manifest-update | 5 ----- + 3 files changed, 17 deletions(-) + +commit ebbee7c2475db789b622250addbf549695da2890 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 18:23:19 2018 +0100 + + [test] Move test files around + + test/fuzzing/run-fuzzer-tests.py | 2 +- + test/shaping/Makefile.am | 82 + +++++++++++----------- + .../tests/{ => misc}/arabic-fallback-shaping.tests | 0 + .../tests/{ => misc}/arabic-feature-order.tests | 0 + .../tests/{ => misc}/arabic-like-joining.tests | 0 + .../tests/{ => misc}/arabic-mark-order.tests | 0 + test/shaping/tests/{ => misc}/arabic-stch.tests | 0 + .../tests/{ => misc}/automatic-fractions.tests | 0 + test/shaping/tests/{ => misc}/cluster.tests | 0 + test/shaping/tests/{ => misc}/color-fonts.tests | 0 + .../tests/{ => misc}/context-matching.tests | 0 + .../tests/{ => misc}/cursive-positioning.tests | 0 + .../tests/{ => misc}/default-ignorables.tests | 0 + .../shaping/tests/{ => misc}/emoji-flag-tags.tests | 0 + .../tests/{ => misc}/fallback-positioning.tests | 0 + test/shaping/tests/{ => misc}/fuzzed.tests | 0 + test/shaping/tests/{ => misc}/hangul-jamo.tests | 0 + test/shaping/tests/{ => misc}/hyphens.tests | 0 + .../{ => misc}/indic-consonant-with-stacker.tests | 0 + test/shaping/tests/{ => misc}/indic-init.tests | 0 + .../{ => misc}/indic-joiner-candrabindu.tests | 0 + test/shaping/tests/{ => misc}/indic-joiners.tests | 0 + test/shaping/tests/{ => misc}/indic-old-spec.tests | 0 + .../tests/{ => misc}/indic-pref-blocking.tests | 0 + .../tests/{ => misc}/indic-script-extensions.tests | 0 + .../tests/{ => misc}/indic-special-cases.tests | 0 + test/shaping/tests/{ => misc}/indic-syllable.tests | 0 + test/shaping/tests/{ => misc}/language-tags.tests | 0 + test/shaping/tests/{ => misc}/ligature-id.tests | 0 + .../shaping/tests/{ => misc}/mark-attachment.tests | 0 + .../tests/{ => misc}/mark-filtering-sets.tests | 0 + .../{ => misc}/mongolian-variation-selector.tests | 0 + test/shaping/tests/{ => misc}/simple.tests | 0 + test/shaping/tests/{ => misc}/spaces.tests | 0 + .../tests/{ => misc}/tibetan-contractions-1.tests | 0 + .../tests/{ => misc}/tibetan-contractions-2.tests | 0 + test/shaping/tests/{ => misc}/tibetan-vowels.tests | 0 + test/shaping/tests/{ => misc}/use-marchen.tests | 0 + test/shaping/tests/{ => misc}/use-syllable.tests | 0 + test/shaping/tests/{ => misc}/use.tests | 0 + .../shaping/tests/{ => misc}/variations-rvrn.tests | 0 + test/shaping/tests/{ => misc}/vertical.tests | 0 + .../tests/{ => misc}/zero-width-marks.tests | 0 + 43 files changed, 42 insertions(+), 42 deletions(-) + +commit 748b989a1fa931b011d6a4e3db39dfdc632946b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 17:55:17 2018 +0100 + + [aat/morx] Implement NoncontextualSubtables + + Also makes hb-ot-shape call morx for now instead of GSUB... Just + for testing. + + src/hb-aat-layout-common-private.hh | 34 +++++++-------- + src/hb-aat-layout-morx-table.hh | 82 + ++++++++++++++++++++++++++++++++++--- + src/hb-aat-layout-private.hh | 3 ++ + src/hb-aat-layout.cc | 13 +++++- + src/hb-ot-shape.cc | 6 +++ + 5 files changed, 111 insertions(+), 27 deletions(-) + +commit 4cf3ab1d8192862f8d3c52fdcaec567735916116 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 16:32:58 2018 +0100 + + Minor + + src/hb-ot-shape.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 470fe5b603b409bef136fdd4e9b33d2704dc77b7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 15:48:51 2018 +0100 + + [aat] Implement Lookup table + + Untested, but compiles. + + src/hb-aat-layout-common-private.hh | 308 + +++++++++++++++++++++++++++++++++++- + src/hb-aat-layout-morx-table.hh | 9 +- + src/hb-aat-layout.cc | 14 ++ + src/hb-face.cc | 6 +- + src/hb-open-type-private.hh | 16 +- + src/hb-ot-cbdt-table.hh | 4 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-glyf-table.hh | 6 +- + src/hb-ot-hmtx-table.hh | 8 +- + src/hb-ot-kern-table.hh | 2 +- + src/hb-ot-layout.cc | 6 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-uniscribe.cc | 2 +- + 13 files changed, 355 insertions(+), 30 deletions(-) + +commit 4646a80a873fa164b9cf09128bc6b6fe2fc5cce2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Tue Jan 9 12:06:38 2018 +0100 + + Minor + + src/hb-ot-layout-common-private.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 7c7cb42d8125d7e598bfa70f93053cafe38b325a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 8 14:32:55 2018 +0000 + + [aat] Update previous commits for rebase on master + + src/hb-aat-layout-common-private.hh | 14 +++++++------- + src/hb-aat-layout-morx-table.hh | 28 ++++++++++++++-------------- + src/hb-open-type-private.hh | 5 ----- + 3 files changed, 21 insertions(+), 26 deletions(-) + +commit a0175e75bc40b5496d7fd37afd434cb2000e5b9b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Aug 17 16:55:54 2017 -0700 + + [aat] Start implementing common table formats + + src/Makefile.sources | 2 + + src/hb-aat-layout-common-private.hh | 134 + ++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout-morx-table.hh | 1 + + src/hb-aat-layout-private.hh | 37 ++++++++++ + src/hb-aat-layout.cc | 1 + + 5 files changed, 175 insertions(+) + +commit c71b55a223d14f8bb7fa355efc586e824b7d4d8f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Aug 14 17:24:36 2017 -0700 + + [aat] Start implementing Apple AAT morx table + + src/Makefile.sources | 2 + + src/hb-aat-layout-morx-table.hh | 275 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout.cc | 42 ++++++ + src/hb-open-type-private.hh | 5 + + src/hb-ot-layout-private.hh | 5 + + src/hb-ot-layout.cc | 2 + + 6 files changed, 331 insertions(+) + +commit 3c7aeb5c6437b26ad638ab993b724e28376d3ff8 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Jan 9 01:39:42 2018 +0330 + + [cmake] Add autotools like feature testing (#683) + + CMakeLists.txt | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +commit 0473d95e276ae5df722bc7d371733d8202bdbc3c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Mon Jan 8 10:07:46 2018 +0000 + + [ft] Use FT_Done_MM_Var() if available + + configure.ac | 1 + + src/hb-ft.cc | 4 ++++ + 2 files changed, 5 insertions(+) + +commit 66d7beff96d622599e1ee8895f2aa84fe2299f1a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 18:09:29 2018 +0000 + + [khmer] Relax! + + Apparently we don't use OT_A either. + + src/hb-ot-shape-complex-khmer-machine.rl | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit db0207baff358b20fbe9c3498275ba33f69caf87 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 18:06:00 2018 +0000 + + [khmer] Drop another joiner + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 90affe831f08fabcb2dd5ac837c7b0cfbd14e554 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 18:04:56 2018 +0000 + + [khmer] Shuffle + + src/hb-ot-shape-complex-khmer-machine.rl | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 65795e3ca246bf65b3cb53e3fe65eca312774e3e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 18:03:00 2018 +0000 + + [khmer] Simplify grammar some more + + Numbers down (from 38): + + KHMER: 299090 out of 299124 tests passed. 34 failed (0.0113665%) + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e13ee937310a7aadd83fd266dae382da40dce4f8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 18:01:01 2018 +0000 + + [khmer] Clean + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a71c7eb2ca9f8ba90117e1a0c4ce890f0a1640f4 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:59:43 2018 +0000 + + [khmer] Limit number of joiners + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 574e42e1cf6679c8df065d6bb3e8d21bc82395c1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:57:39 2018 +0000 + + [khmer] Relax number of consonants / matras allowed + + New numbers (down from 39): + + KHMER: 299086 out of 299124 tests passed. 38 failed (0.0127038%) + + src/hb-ot-shape-complex-khmer-machine.rl | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 80c870bcda2f421e80f5579e71fe17fe8db991b8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:52:24 2018 +0000 + + [khmer] Allow Independent Vowels where stacked consonants are allowed + + New numbers (down from 44): + + KHMER: 299085 out of 299124 tests passed. 39 failed (0.0130381%) + + src/hb-ot-shape-complex-khmer-machine.rl | 4 ++-- + src/hb-ot-shape-complex-khmer.cc | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 9bd486c480b8fd3125ef6b6cc0442a566f669cb8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:47:35 2018 +0000 + + [khmer] Drop some more joiners + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5278265853c36400ffc284fd517cc7b7c42ed0e7 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:46:49 2018 +0000 + + [khmer] Drop some more + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit efefd87f3354d0ae6f599ea30672cb0b74dfcd80 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:45:48 2018 +0000 + + [khmer] Drop some more grammar + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 82e6bf8e0c27d2fd16a908eed0c73e95b1a2c0f5 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:44:18 2018 +0000 + + [khmer] Drop some more from grammar + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 957e8ea8a9f981775ecde7dd1e2bf4023cf79dba +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:43:31 2018 +0000 + + [khmer] Drop final_halant_group + + src/hb-ot-shape-complex-khmer-machine.rl | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit bbfdbbdc5eca96e8c527147e5a78cd185b9f243d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:34:26 2018 +0000 + + Minor + + src/hb-ot-shape-complex-indic-machine.rl | 1 - + src/hb-ot-shape-complex-khmer-machine.rl | 1 - + 2 files changed, 2 deletions(-) + +commit f6df2515210e9d828fc40173696b185efa5083e3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:27:48 2018 +0000 + + [indic] Remove unused OT_VD category + + src/hb-ot-shape-complex-indic-machine.rl | 3 +-- + src/hb-ot-shape-complex-indic-private.hh | 2 +- + src/hb-ot-shape-complex-indic.cc | 2 +- + 3 files changed, 3 insertions(+), 4 deletions(-) + +commit e6618f3bdf79a51f6fb270b468b653dc9cea5b57 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:21:55 2018 +0000 + + [khmer] Shave off some more from the grammar + + src/hb-ot-shape-complex-khmer-machine.rl | 9 ++------- + src/hb-ot-shape-complex-khmer.cc | 34 + ++------------------------------ + 2 files changed, 4 insertions(+), 39 deletions(-) + +commit 014494d5c0469fe6b3112db3fdb3f2f262673ba1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:17:02 2018 +0000 + + [khmer] Remove unused symbol clusters + + src/hb-ot-shape-complex-khmer-machine.rl | 4 ---- + 1 file changed, 4 deletions(-) + +commit bbac984b9390a66c6ae5ee931b278b607f2f2a50 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:15:31 2018 +0000 + + Minor + + src/hb-ot-shape-complex-indic-machine.rl | 1 - + src/hb-ot-shape-complex-khmer-machine.rl | 1 - + 2 files changed, 2 deletions(-) + +commit 185b68946ad67443e8725e77d724128802de5572 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:14:27 2018 +0000 + + [khmer] Remove medials from grammar + + src/hb-ot-shape-complex-khmer-machine.rl | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit c265dffdf6c4930e271292226d38a8e515b6b0f8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:06:29 2018 +0000 + + [khmer] Better fix for dangling final Coeng + + This is how 1471cfee3bb2734dc44c58471362851ad27e8bd8 should have + been done. + + src/hb-ot-shape-complex-khmer-machine.rl | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e3fdf1fc2f399e6b79ea022501526a422d372e64 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:05:53 2018 +0000 + + [khmer] Remove reph/repha support from grammar + + src/hb-ot-shape-complex-khmer-machine.rl | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 0d3a274de1ff8e6a21c7c9857730e2eda402e310 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 17:01:37 2018 +0000 + + [khmer] Remove forced_rakar from grammar + + Used by Sinhala only. + + src/hb-ot-shape-complex-khmer-machine.rl | 3 +-- + src/hb-ot-shape-complex-khmer.cc | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 1471cfee3bb2734dc44c58471362851ad27e8bd8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:34:20 2018 +0000 + + [khmer] Allow a dangling final Coeng after matras + + Uniscribe seems to allow that. New numbers: + + KHMER: 299080 out of 299124 tests passed. 44 failed (0.0147096%) + + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9eaf077ded0306d492de96b223133431f1a6d42b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:28:00 2018 +0000 + + [khmer] Remove some more unused code + + src/hb-ot-shape-complex-khmer.cc | 49 + ++-------------------------------------- + 1 file changed, 2 insertions(+), 47 deletions(-) + +commit bfad6ab897a38aedc82de694ee1a17132f90b25e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:13:09 2018 +0000 + + [khmer] Remove features not used by Khmer + + src/hb-ot-shape-complex-khmer.cc | 60 + ++++------------------------------------ + 1 file changed, 5 insertions(+), 55 deletions(-) + +commit 92a99ce084b19dff32d434de446144f0c4796803 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:08:44 2018 +0000 + + [khmer] Remove rphf feature + + src/hb-ot-shape-complex-khmer.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit 238b90e77c12674edfd2e03160b8ba2a0298b79d +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:06:53 2018 +0000 + + [khmer] Remove non-Khmer matra positioning code + + src/hb-ot-shape-complex-khmer.cc | 76 + +++++++--------------------------------- + 1 file changed, 12 insertions(+), 64 deletions(-) + +commit f8553c898a414298403c335f8d2ed6c588a1189f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:04:02 2018 +0000 + + [khmer] Remove indic_config_t + + src/hb-ot-shape-complex-khmer.cc | 28 ---------------------------- + 1 file changed, 28 deletions(-) + +commit a119a8bce57abc440ae4c8b9a1342d428a7c9b6a +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:02:27 2018 +0000 + + [khmer] Remove indic_config->reph_mode + + src/hb-ot-shape-complex-khmer.cc | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +commit c135324af107d3e33420cd0dca4d5bb12fd3f4a1 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 16:01:17 2018 +0000 + + [khmer] Remove indic_config->reph_pos + + src/hb-ot-shape-complex-khmer.cc | 333 + ++------------------------------------- + 1 file changed, 10 insertions(+), 323 deletions(-) + +commit ffcd6c7efd21bf89b41ddbf148b05672a42ecadd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:50:05 2018 +0000 + + [khmer] Remove indic_config->base_pos + + src/hb-ot-shape-complex-khmer.cc | 229 + ++------------------------------------- + 1 file changed, 7 insertions(+), 222 deletions(-) + +commit 0c91638d48d6fb86d1e30fb94c15785707395b42 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:45:30 2018 +0000 + + [khmer] Remove other scripts + + src/hb-ot-shape-complex-khmer.cc | 131 + ++++++++++----------------------------- + 1 file changed, 34 insertions(+), 97 deletions(-) + +commit 4c0199c573f79be5f40e7d4f8433ef6a1c9c24b2 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:43:48 2018 +0000 + + [khmer] Remove indic_config->script + + src/hb-ot-shape-complex-khmer.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 9b135d9524e51cc1e1f35479e015c746ccd8ca5f +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:43:11 2018 +0000 + + [khmer] Remove indic_config->virama + + src/hb-ot-shape-complex-khmer.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 7eb3ac29d388432c311981b20b1aa75f47249bfc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:41:31 2018 +0000 + + [khmer] Remove indic_config->has_old_spec + + src/hb-ot-shape-complex-khmer.cc | 157 + ++++++--------------------------------- + 1 file changed, 21 insertions(+), 136 deletions(-) + +commit 961ebf85f1e7d417e056c3927ee73857f6f4cde6 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:36:53 2018 +0000 + + [khmer] Remove Halant from Khmer shaper + + src/hb-ot-shape-complex-indic-private.hh | 1 - + src/hb-ot-shape-complex-khmer-machine.rl | 7 +++---- + src/hb-ot-shape-complex-khmer.cc | 32 + ++++++++++++++++---------------- + 3 files changed, 19 insertions(+), 21 deletions(-) + +commit 9761f9d78214323b9ad58dd0b8ba41851c9e2d54 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:33:11 2018 +0000 + + [indic] Remove more Khmer-specific stuff from Indic shaper + + No numbers changed. + + src/hb-ot-shape-complex-indic-machine.rl | 8 ++--- + src/hb-ot-shape-complex-indic.cc | 57 + ++++++++++++-------------------- + 2 files changed, 25 insertions(+), 40 deletions(-) + +commit 075895364435ee88936696bcb5457283c4bb1a29 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 15:08:28 2018 +0000 + + [indic] Remove main Khmer stuff + + src/hb-ot-shape-complex-indic.cc | 73 + ++-------------------------------------- + 1 file changed, 2 insertions(+), 71 deletions(-) + +commit dcf4d95fea45e19fbb3b39f0211b2aa96a907473 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 14:54:31 2018 +0000 + + [khmer] Split off Khmer shaper from Indic + + Towards fixing https://github.com/harfbuzz/harfbuzz/issues/667 + The Khmer spec is different enough from other Indic ones to require + its own grammar. + + No change in functionality. Test numbers are: + + BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%) + DEVANAGARI: 707307 out of 707394 tests passed. 87 failed (0.0122987%) + GUJARATI: 366355 out of 366457 tests passed. 102 failed (0.0278341%) + GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%) + KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%) + KHMER: 299071 out of 299124 tests passed. 53 failed (0.0177184%) + MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed + (0.0188871%) + ORIYA: 42320 out of 42329 tests passed. 9 failed (0.021262%) + SINHALA: 271662 out of 271847 tests passed. 185 failed (0.068053%) + TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%) + TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%) + + src/Makefile.sources | 3 + + src/hb-ot-shape-complex-khmer-machine.rl | 130 +++ + src/hb-ot-shape-complex-khmer.cc | 1867 + ++++++++++++++++++++++++++++++ + src/hb-ot-shape-complex-private.hh | 5 +- + 4 files changed, 2003 insertions(+), 2 deletions(-) + +commit 1e05ea79d057fbae5f680589d4ee7d3c6a971689 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 14:01:37 2018 +0000 + + [ot] Short-circuit base instance advance variation + + src/hb-ot-hmtx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 54b2b93722c9f067199cd7145dfd065d5b6b2f0c +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 13:20:21 2018 +0000 + + [ot] Fix VariationStore evaluation algorithm + + Ouch! Missing coords should still be evaluated as coord=0, which + most of the time results in a factor of 0. We were skipping these, + which was equivalent to a factor of 1. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/652 + + src/hb-ot-layout-common-private.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit a3afdd1e080bb181ddec126b6233d52438882a13 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 13:17:02 2018 +0000 + + Minor + + src/hb-ot-layout-common-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb43bdbc2f3a16061c33596b15b29eb7f9713871 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 13:06:25 2018 +0000 + + [ft] If there's no variations set, don't set them on hb-font + + src/hb-ft.cc | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit ed2f458b143327d07e67fdb976ead9d7ff2863f8 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 12:55:39 2018 +0000 + + Add test font for previous commit + + .../sha1sum/21b7fb9c1eeae260473809fbc1fe330f66a507cd.ttf | Bin 0 -> + 4816 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 127bcc6ece4da64e807f652dd84a17c6a8c5e300 +Merge: 72bec1cd 8c0d1916 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 12:50:22 2018 +0000 + + Merge remote-tracking branch 'fdo/master' + +commit 8c0d1916a41f0fb32340ce5257de780acf598353 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Fri Jan 5 12:46:12 2018 +0000 + + Improve CGJ skipping logic + + Previously we made CGJ unskippable. Now, if CGJ did NOT prevent + any reordering, allow skipping over it. To make this work we + had to make changes to the Arabic mark reordering algorithm + implementation to renumber moved MCM marks. See comments. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/554 + + src/hb-buffer-private.hh | 1 + + src/hb-ot-layout-private.hh | 11 ++++++++- + src/hb-ot-shape-complex-arabic.cc | 37 + ++++++++++++++++++++++-------- + src/hb-ot-shape-normalize.cc | 30 +++++++++++++----------- + test/shaping/tests/arabic-mark-order.tests | 4 ++++ + 5 files changed, 58 insertions(+), 25 deletions(-) + +commit 72bec1cd09f919f3826345db4832752ec96ff5c5 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Jan 5 12:42:20 2018 +0330 + + Improve tests (#679) + + .circleci/config.yml | 2 +- + CMakeLists.txt | 52 + +++++++++++++++++++++++++++++++++++---------- + autogen.sh | 6 ++++-- + src/Makefile.am | 3 +-- + src/check-defs.sh | 2 +- + src/check-header-guards.sh | 2 +- + src/check-libstdc++.sh | 2 +- + src/check-static-inits.sh | 2 +- + src/check-symbols.sh | 2 +- + test/fuzzing/CMakeLists.txt | 11 +++++++++- + 10 files changed, 62 insertions(+), 22 deletions(-) + +commit 293e443529d0621b9f94ea15d1425104394f6b9e +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Thu Jan 4 16:06:25 2018 +0000 + + Minor + + src/check-c-linkage-decls.sh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 8a0952db7e521320cd4d8b67b287f7d33c21b6e0 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Thu Jan 4 18:40:10 2018 +0700 + + atomics: Favor compiler primitives over macOS APIs. (#676) + + In macOS 10.12, the `OSMemoryBarrier` and related APIs were deprecated + in favor of using `std::atomic`. On the way to supporting + `std::atomic`, + we can favor using the "Intel primitives" which are also available on + macOS. + + src/hb-atomic-private.hh | 46 + +++++++++++++++++++++++----------------------- + 1 file changed, 23 insertions(+), 23 deletions(-) + +commit 4f80078eb035054db0f6e33cf4f7345c6c85cb12 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Thu Jan 4 18:37:35 2018 +0700 + + [cmake] Colorize output when using cmake + ninja. (#674) + + Due to how ninja runs clang and gcc, it doesn't colorize the output + like make does. This forces color output in this situation. + + CMakeLists.txt | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 5ed26fc5bdfdab0ff41a8861b54395c0bbbad248 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Jan 4 10:11:34 2018 +0330 + + [cmake] Run src/ tests (#675) + + .circleci/config.yml | 9 ++++----- + CMakeLists.txt | 35 ++++++++++++++++++++++++++++++++--- + src/Makefile.am | 1 + + src/check-defs.sh | 3 ++- + src/check-libstdc++.sh | 3 ++- + src/check-static-inits.sh | 3 ++- + src/check-symbols.sh | 3 ++- + 7 files changed, 45 insertions(+), 12 deletions(-) + +commit f8daeef4c4451084a781db3a8a04807c0f0051ef +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 3 14:27:34 2018 +0000 + + [use] Simplify more + + src/gen-use-table.py | 11 +------ + src/hb-ot-shape-complex-use-table.cc | 62 + +++++++++++++++++++++--------------- + 2 files changed, 38 insertions(+), 35 deletions(-) + +commit 877d15e73c24159b26bb7cc6d2f62045d445d0fc +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 3 14:24:44 2018 +0000 + + [use] Simplify + + Fixes https://github.com/harfbuzz/harfbuzz/pull/661 + + src/gen-use-table.py | 2 +- + src/hb-ot-shape-complex-use-table.cc | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 308f419215716460479fbde482d66d1687176102 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 3 14:22:07 2018 +0000 + + [use] Fix Brahmi Number Joiner 1107F + + Fixes https://github.com/harfbuzz/harfbuzz/pull/660 + + src/gen-indic-table.py | 6 +++--- + src/gen-use-table.py | 6 +++--- + src/hb-ot-shape-complex-indic-table.cc | 4 ++-- + src/hb-ot-shape-complex-use-table.cc | 6 +++--- + 4 files changed, 11 insertions(+), 11 deletions(-) + +commit 7b837e20d2b4b6cd7be0b181ac5cdfeb467bd146 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Jan 3 12:46:29 2018 +0000 + + [util] Add TODO item + + util/options.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 70807ad274be39d58a5b43e12d4585325cb314c4 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Tue Jan 2 23:52:12 2018 +0330 + + Fix make check issue on out-of-tree builds and test it (#672) + + .circleci/config.yml | 8 ++++---- + test/fuzzing/Makefile.am | 18 +----------------- + test/fuzzing/run-fuzzer-tests.py | 8 +++++--- + test/shaping/run-tests.py | 5 +++++ + 4 files changed, 15 insertions(+), 24 deletions(-) + +commit 85ec6d34439194a88c7dfdd8303369311e08e031 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Wed Jan 3 01:23:23 2018 +0700 + + Fix typos. + + docs/usermanual-clusters.xml | 4 ++-- + docs/usermanual-install-harfbuzz.xml | 2 +- + src/hb-font.h | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit 4f6754ac0190f04b5f27306b087827b8f2e13046 +Author: Bruce Mitchener <bruce.mitchener@gmail.com> +Date: Wed Jan 3 00:15:18 2018 +0700 + + Improve Markdown usage in BUILD.md. + + BUILD.md | 36 +++++++++++++++++++++++------------- + 1 file changed, 23 insertions(+), 13 deletions(-) + +commit 3db1d34264d9405c7356668aa3c8ed3ab103da3c +Author: Romain Ouabdelkader <rouabdelkader@gopro.com> +Date: Thu Dec 21 14:39:34 2017 +0100 + + link with CoreFoundation when using CoreText + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4e3cf91af29ff654eca91e43c0af1c1a7171b9fa +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Jan 1 11:17:51 2018 +0330 + + [cmake] Run rest of the tests on Windows (#668) + + appveyor.yml | 6 +++--- + test/CMakeLists.txt | 5 +---- + test/fuzzing/CMakeLists.txt | 12 ++++++------ + test/fuzzing/Makefile.am | 5 +---- + test/fuzzing/run-fuzzer-tests.py | 12 +++++++++--- + test/shaping/CMakeLists.txt | 9 ++++----- + test/shaping/run-tests.py | 10 +++++++++- + 7 files changed, 33 insertions(+), 26 deletions(-) + +commit 2dbdeb14214487acd0ff011386c49263ce800813 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Fri Dec 29 23:13:29 2017 +0330 + + [cmake] Run fuzzing and shaping tests (#666) + + .circleci/config.yml | 2 +- + CMakeLists.txt | 59 + ++++++++++++++++++++++++---------------- + appveyor.yml | 4 +-- + test/CMakeLists.txt | 5 ++++ + test/api/CMakeLists.txt | 48 +++++++++++++------------------- + test/fuzzing/CMakeLists.txt | 9 ++++++ + test/fuzzing/Makefile.am | 18 ++++++++++++ + test/fuzzing/run-fuzzer-tests.py | 28 +++++++++++++++++++ + test/shaping/CMakeLists.txt | 11 ++++++++ + test/shaping/Makefile.am | 3 +- + test/shaping/run-tests.py | 3 +- + 11 files changed, 132 insertions(+), 58 deletions(-) + +commit 24b30faa2a285c6e4e46a18c346def2183fc2793 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Dec 25 22:01:28 2017 +0330 + + [cmake] Use GNUInstallDirs values (#665) + + CMakeLists.txt | 170 + ++++++++++++++++++++++++++++----------------------------- + 1 file changed, 85 insertions(+), 85 deletions(-) + +commit 7d397c5d5ca684fae824a61dabf5bc422d0a516b +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 24 17:53:32 2017 -0500 + + Add Coverity badge + + README | 1 + + 1 file changed, 1 insertion(+) + +commit 50163976d2a5fb34e0b4c011408d581b33aaa255 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Dec 25 01:55:48 2017 +0330 + + [cmake] Enable cmake tests on distribution and test it (#664) + + .circleci/config.yml | 3 ++- + test/Makefile.am | 6 ++++++ + test/api/Makefile.am | 1 + + 3 files changed, 9 insertions(+), 1 deletion(-) + +commit 7bfdf1a94192dd83ab55202d259703f36ed060e5 +Author: David Corbett <corbett.dav@husky.neu.edu> +Date: Wed Nov 22 16:32:52 2017 -0500 + + Forbid Batak killers after vowel signs + + src/gen-use-table.py | 3 +++ + src/hb-ot-shape-complex-use-table.cc | 2 +- + .../sha1sum/59a585a63b3df608fbeef00956c8c108deec7de6.ttf | Bin 0 -> + 1164 bytes + test/shaping/tests/use-syllable.tests | 1 + + 4 files changed, 5 insertions(+), 1 deletion(-) + +commit 9890782736b9ce708c1fedd1cbb3db45cfef4c69 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Mon Dec 25 01:32:46 2017 +0330 + + [ci] Add -Wno-attributes to djgpp, add alpine, format (#663) + + .circleci/config.yml | 40 ++++++++++++++++++++++++++++++---------- + 1 file changed, 30 insertions(+), 10 deletions(-) + +commit 72ecaae0ad4c9f1685f7d524990e92a26fcd5611 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Sun Dec 24 16:05:07 2017 -0500 + + [use] Allow ZWJ before/after Halant + + https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729 + + src/hb-ot-shape-complex-use-machine.rl | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit bc92245b681098f0bfa712217851a5ba3dabeaf3 +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 20 13:19:33 2017 -0500 + + Minor + + src/main.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 81dfc29d2dbc755301e702ea5427829d02abc693 +Author: Ebrahim Byagowi <ebrahim@gnu.org> +Date: Thu Dec 21 20:15:37 2017 +0330 + + [ci] Add a DOS/djgpp compiler (#659) + + .circleci/config.yml | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 007a2a4317227b8fb4c764c590203c85fc3da5fd +Author: Behdad Esfahbod <behdad@behdad.org> +Date: Wed Dec 20 12:09:00 2017 -0500 + + 1.7.4 + + NEWS | 7 +++++++ + configure.ac | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + commit a9432bde7e61894056a42ea24d56fd7fd908a1ce Author: Volker H. Simonis <volker.simonis@gmail.com> Date: Tue Dec 19 11:33:25 2017 +0100 diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS index 7434bcada03..9015c4ad2c5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/NEWS +++ b/Build/source/libs/harfbuzz/harfbuzz-src/NEWS @@ -1,3 +1,12 @@ +Overview of changes leading to 1.7.5 +Tuesday, January 30, 2018 +==================================== + +- Separate Khmer shaper from Indic. +- First stab at AAT morx. Not hooked up. +- Misc bug fixes. + + Overview of changes leading to 1.7.4 Wednesday, December 20, 2017 ==================================== diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/README b/Build/source/libs/harfbuzz/harfbuzz-src/README index aa055169d5a..6e2132237fa 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/README +++ b/Build/source/libs/harfbuzz/harfbuzz-src/README @@ -1,6 +1,7 @@ [![Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg)](https://travis-ci.org/harfbuzz/harfbuzz) [![Build status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true)](https://ci.appveyor.com/project/harfbuzz/harfbuzz) [![CircleCI](https://circleci.com/gh/harfbuzz/harfbuzz.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz) +[![Coverity](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz) [![Coverage Status](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz) [ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh b/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh index ff1b0c0c99b..cbc8627d53e 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh @@ -42,5 +42,7 @@ echo "running autoreconf --force --install --verbose" autoreconf --force --install --verbose || exit $? cd $olddir -echo "running configure $@" -test -n "$NOCONFIGURE" || "$srcdir/configure" "$@" +test -n "$NOCONFIGURE" || { + echo "running configure $@" + "$srcdir/configure" "$@" +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in index 49cca787882..d44d4c9a728 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in +++ b/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in @@ -15,9 +15,6 @@ /* Have Core Text backend */ #undef HAVE_CORETEXT -/* define if the compiler supports basic C++11 syntax */ -#undef HAVE_CXX11 - /* Have DirectWrite library */ #undef HAVE_DIRECTWRITE @@ -36,6 +33,9 @@ /* Have FreeType 2 library */ #undef HAVE_FREETYPE +/* Define to 1 if you have the `FT_Done_MM_Var' function. */ +#undef HAVE_FT_DONE_MM_VAR + /* Define to 1 if you have the `FT_Get_Var_Blend_Coordinates' function. */ #undef HAVE_FT_GET_VAR_BLEND_COORDINATES diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac b/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac index 7f24627ffdb..d799cab0a20 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.4], + [1.7.5], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) @@ -9,8 +9,7 @@ AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src/harfbuzz.pc.in]) AC_CONFIG_HEADERS([config.h]) -AM_INIT_AUTOMAKE([1.11.1 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability]) -AM_CONDITIONAL(AUTOMAKE_OLDER_THAN_1_13, test $am__api_version = 1.11 -o $am__api_version = 1.12) +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]) # Initialize libtool @@ -23,7 +22,7 @@ AC_USE_SYSTEM_EXTENSIONS AC_PROG_CC AM_PROG_CC_C_O AC_PROG_CXX -AX_CXX_COMPILE_STDCXX(11, noext, optional) +dnl AX_CXX_COMPILE_STDCXX(11, noext, optional) AC_SYS_LARGEFILE PKG_PROG_PKG_CONFIG([0.20]) AM_MISSING_PROG([RAGEL], [ragel]) @@ -84,6 +83,9 @@ if test "x$GCC" = "xyes"; then # 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" @@ -355,6 +357,7 @@ if $have_freetype; then 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) LIBS=$save_libs fi AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype) @@ -429,7 +432,7 @@ if test "x$with_coretext" = "xyes" -o "x$with_coretext" = "xauto"; then if $have_coretext; then CORETEXT_CFLAGS= - CORETEXT_LIBS="-framework CoreText -framework CoreGraphics" + CORETEXT_LIBS="-framework CoreText -framework CoreGraphics -framework CoreFoundation" AC_SUBST(CORETEXT_CFLAGS) AC_SUBST(CORETEXT_LIBS) fi @@ -494,6 +497,9 @@ test/Makefile test/api/Makefile test/fuzzing/Makefile test/shaping/Makefile +test/shaping/data/Makefile +test/shaping/data/in-house/Makefile +test/shaping/data/text-rendering-tests/Makefile docs/Makefile docs/version.xml ]) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am index 685718221f8..833d1f9567d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am @@ -1,5 +1,6 @@ # Process this file with automake to produce Makefile.in +NULL = SUBDIRS = DIST_SUBDIRS = BUILT_SOURCES = @@ -134,7 +135,7 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = harfbuzz.pc EXTRA_DIST += harfbuzz.pc.in -FUZZING_CPPFLAGS= \ +FUZZING_CPPFLAGS = \ -DHB_NDEBUG \ -DHB_MAX_NESTING_LEVEL=3 \ -DHB_SANITIZE_MAX_EDITS=3 \ @@ -222,21 +223,14 @@ CLEANFILES += $(pkgconfig_DATA) CLEANFILES += harfbuzz.def harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS) - $(AM_V_GEN) (echo EXPORTS; \ - (cat $^ || echo 'hb_ERROR ()' ) | \ - $(EGREP) '^hb_.* \(' | \ - sed -e 's/ (.*//' | \ - LC_ALL=C sort; \ - echo LIBRARY libharfbuzz-0.dll; \ - ) >"$@" - @ ! grep -q hb_ERROR "$@" \ - || ($(RM) "$@"; false) + $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@ GENERATORS = \ gen-arabic-table.py \ gen-indic-table.py \ gen-use-table.py \ + gen-def.py \ $(NULL) EXTRA_DIST += $(GENERATORS) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources index 5824055b21d..213aa22f684 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources @@ -1,5 +1,3 @@ -NULL = - # Base and default-included sources and headers HB_BASE_sources = \ @@ -82,6 +80,10 @@ HB_FALLBACK_sources = \ $(NULL) HB_OT_sources = \ + hb-aat-layout.cc \ + hb-aat-layout-common-private.hh \ + hb-aat-layout-morx-table.hh \ + hb-aat-layout-private.hh \ hb-ot-font.cc \ hb-ot-layout.cc \ hb-ot-layout-common-private.hh \ @@ -107,6 +109,7 @@ 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.cc \ hb-ot-shape-complex-myanmar.cc \ hb-ot-shape-complex-thai.cc \ hb-ot-shape-complex-tibetan.cc \ @@ -128,11 +131,13 @@ HB_OT_sources = \ HB_OT_RAGEL_GENERATED_sources = \ hb-ot-shape-complex-indic-machine.hh \ + hb-ot-shape-complex-khmer-machine.hh \ hb-ot-shape-complex-myanmar-machine.hh \ hb-ot-shape-complex-use-machine.hh \ $(NULL) HB_OT_RAGEL_sources = \ hb-ot-shape-complex-indic-machine.rl \ + hb-ot-shape-complex-khmer-machine.rl \ hb-ot-shape-complex-myanmar-machine.rl \ hb-ot-shape-complex-use-machine.rl \ $(NULL) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh index cd550867af2..8234abc455a 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-c-linkage-decls.sh @@ -7,8 +7,7 @@ test -z "$srcdir" && srcdir=. stat=0 test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'` -test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'` - +test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.cc'` for x in $HBHEADERS; do test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh index 480d49992ff..c6697831fe1 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh @@ -4,7 +4,7 @@ LC_ALL=C export LC_ALL test -z "$srcdir" && srcdir=. -test -z "$MAKE" && MAKE=make +test -z "$libs" && libs=.libs stat=0 if which nm 2>/dev/null >/dev/null; then @@ -15,26 +15,36 @@ else fi defs="harfbuzz.def" -$MAKE $defs > /dev/null +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@.*/@@'` - so=.libs/lib${lib}.so + 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 ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| _fbss\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>\| __gcov_flush\>\| llvm_' | cut -d' ' -f3`" + 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 + if test -f "$so"; then - echo "Checking that $so has the same symbol list as $def" - { - echo EXPORTS - echo "$EXPORTED_SYMBOLS" - # cheat: copy the last line from the def file! - tail -n1 "$def" - } | diff "$def" - >&2 || stat=1 + 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 + tested=true + fi + done done if ! $tested; then echo "check-defs.sh: libharfbuzz shared library not found; skipping test" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh index 355d81b525d..b67640fc197 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-header-guards.sh @@ -6,7 +6,7 @@ export LC_ALL test -z "$srcdir" && srcdir=. stat=0 -test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'` +test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h' ! -name 'hb-gobject-structs.h'` test "x$HBSOURCES" = x && HBSOURCES=`cd "$srcdir"; find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'` for x in $HBHEADERS $HBSOURCES; do 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 b541828bcd9..e4aaeb2b4a1 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh @@ -4,23 +4,29 @@ LC_ALL=C export LC_ALL test -z "$srcdir" && srcdir=. +test -z "$libs" && libs=.libs stat=0 if which ldd 2>/dev/null >/dev/null; then - : + LDD=ldd else - echo "check-libstdc++.sh: 'ldd' not found; skipping test" - exit 77 + # macOS specific tool + if which otool 2>/dev/null >/dev/null; then + LDD="otool -L" + else + echo "check-libstdc++.sh: 'ldd' not found; skipping test" + exit 77 + fi fi tested=false for suffix in so dylib; do - so=.libs/libharfbuzz.$suffix + so=$libs/libharfbuzz.$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 + if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then echo "Ouch, linked to libstdc++ or libc++" stat=1 fi diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh index 1446fa73405..71551cbd4c8 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-static-inits.sh @@ -4,6 +4,7 @@ LC_ALL=C export LC_ALL test -z "$srcdir" && srcdir=. +test -z "$libs" && libs=.libs stat=0 @@ -14,7 +15,7 @@ else exit 77 fi -OBJS=.libs/*.o +OBJS=$libs/*.o if test "x`echo $OBJS`" = "x$OBJS" 2>/dev/null >/dev/null; then echo "check-static-inits.sh: object files not found; skipping test" exit 77 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 d4d655d266e..3adf65f8744 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh @@ -4,6 +4,7 @@ LC_ALL=C export LC_ALL test -z "$srcdir" && srcdir=. +test -z "$libs" && libs=.libs stat=0 @@ -17,7 +18,7 @@ fi echo "Checking that we are not exposing internal symbols" tested=false for suffix in so dylib; do - so=.libs/libharfbuzz.$suffix + 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`" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py new file mode 100644 index 00000000000..ad1606ec3ff --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +from __future__ import print_function + +import io, os, re, sys + +headers_content = [] +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") + +with open (sys.argv[1], "w") as f: f.write (result) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py index a849db18e26..735b9015ec7 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py @@ -229,13 +229,13 @@ print " {" pages = set([u>>page_bits for u in starts+ends+singles.keys()]) for p in sorted(pages): print " case 0x%0Xu:" % p + for u,d in singles.items (): + if p != u>>page_bits: continue + print " if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]]) for (start,end) in zip (starts, ends): if p not in [start>>page_bits, end>>page_bits]: continue offset = "indic_offset_0x%04xu" % start print " if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return indic_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset) - for u,d in singles.items (): - if p != u>>page_bits: continue - print " if (unlikely (u == 0x%04Xu)) return _(%s,%s);" % (u, short[0][d[0]], short[1][d[1]]) print " break;" print "" print " default:" 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 4ded54230e1..5391f27eb3e 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 @@ -297,6 +297,9 @@ def map_to_use(data): if U == 0x17DD: UISC = Vowel_Dependent if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark + # TODO: https://github.com/harfbuzz/harfbuzz/pull/627 + if 0x1BF2 <= U <= 0x1BF3: UISC = Nukta; UIPC = Bottom + # TODO: U+1CED should only be allowed after some of # the nasalization marks, maybe only for U+1CE9..U+1CF1. if U == 0x1CED: UISC = Tone_Mark @@ -349,12 +352,6 @@ def map_to_use(data): defaults = ('O', 'No_Block') data = map_to_use(data) -# Remove the outliers -singles = {} -for u in [0x034F, 0x25CC, 0x1107F]: - singles[u] = data[u] - del data[u] - print "/* == Start of generated table == */" print "/*" print " * The following table is generated by running:" @@ -456,16 +453,13 @@ print "hb_use_get_categories (hb_codepoint_t u)" print "{" print " switch (u >> %d)" % page_bits print " {" -pages = set([u>>page_bits for u in starts+ends+singles.keys()]) +pages = set([u>>page_bits for u in starts+ends]) for p in sorted(pages): print " case 0x%0Xu:" % p for (start,end) in zip (starts, ends): if p not in [start>>page_bits, end>>page_bits]: continue offset = "use_offset_0x%04xu" % start print " if (hb_in_range<hb_codepoint_t> (u, 0x%04Xu, 0x%04Xu)) return use_table[u - 0x%04Xu + %s];" % (start, end-1, start, offset) - for u,d in singles.items (): - if p != u>>page_bits: continue - print " if (unlikely (u == 0x%04Xu)) return %s;" % (u, d[0]) print " break;" print "" print " default:" 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 new file mode 100644 index 00000000000..b5395bba5bb --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh @@ -0,0 +1,708 @@ +/* + * Copyright © 2017 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_COMMON_PRIVATE_HH +#define HB_AAT_LAYOUT_COMMON_PRIVATE_HH + +#include "hb-aat-layout-private.hh" + + +namespace AAT { + +using namespace OT; + + +/* + * Binary Searching Tables + */ + +struct BinSearchHeader +{ + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + HBUINT16 unitSize; /* Size of a lookup unit for this search in bytes. */ + HBUINT16 nUnits; /* Number of units of the preceding size to be searched. */ + HBUINT16 searchRange; /* The value of unitSize times the largest power of 2 + * that is less than or equal to the value of nUnits. */ + HBUINT16 entrySelector; /* The log base 2 of the largest power of 2 less than + * or equal to the value of nUnits. */ + HBUINT16 rangeShift; /* The value of unitSize times the difference of the + * value of nUnits minus the largest power of 2 less + * than or equal to the value of nUnits. */ + public: + DEFINE_SIZE_STATIC (10); +}; + +template <typename Type> +struct BinSearchArrayOf +{ + inline const Type& operator [] (unsigned int i) const + { + if (unlikely (i >= header.nUnits)) return Null(Type); + return StructAtOffset<Type> (bytes, i * header.unitSize); + } + inline Type& operator [] (unsigned int i) + { + return StructAtOffset<Type> (bytes, i * header.unitSize); + } + inline unsigned int get_size (void) const + { return header.static_size + header.nUnits * header.unitSize; } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + + /* Note: for structs that do not reference other structs, + * we do not need to call their sanitize() as we already did + * a bound check on the aggregate array size. We just include + * a small unreachable expression to make sure the structs + * pointed to do have a simple sanitize(), ie. they do not + * reference other structs via offsets. + */ + (void) (false && StructAtOffset<Type> (bytes, 0).sanitize (c)); + + return_trace (true); + } + inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + unsigned int count = header.nUnits; + for (unsigned int i = 0; i < count; i++) + if (unlikely (!(*this)[i].sanitize (c, base))) + return_trace (false); + return_trace (true); + } + + template <typename T> + inline const Type *bsearch (const T &key) const + { + unsigned int size = header.unitSize; + int min = 0, max = (int) header.nUnits - 1; + while (min <= max) + { + int mid = (min + max) / 2; + const Type *p = (const Type *) (((const char *) bytes) + (mid * size)); + int c = p->cmp (key); + if (c < 0) + max = mid - 1; + else if (c > 0) + min = mid + 1; + else + return p; + } + return NULL; + } + + private: + inline bool sanitize_shallow (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (header.sanitize (c) && + Type::static_size >= header.unitSize && + c->check_array (bytes, header.unitSize, header.nUnits)); + } + + protected: + BinSearchHeader header; + HBUINT8 bytes[VAR]; + public: + DEFINE_SIZE_ARRAY (10, bytes); +}; + + +/* TODO Move this to hb-open-type-private.hh and use it in ArrayOf, HeadlessArrayOf, + * and other places around the code base?? */ +template <typename Type> +struct UnsizedArrayOf +{ + inline const Type& operator [] (unsigned int i) const { return arrayZ[i]; } + inline Type& operator [] (unsigned int i) { return arrayZ[i]; } + + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c, count))) return_trace (false); + + /* Note: for structs that do not reference other structs, + * we do not need to call their sanitize() as we already did + * a bound check on the aggregate array size. We just include + * a small unreachable expression to make sure the structs + * pointed to do have a simple sanitize(), ie. they do not + * reference other structs via offsets. + */ + (void) (false && arrayZ[0].sanitize (c)); + + return_trace (true); + } + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c, count))) return_trace (false); + for (unsigned int i = 0; i < count; i++) + if (unlikely (!arrayZ[i].sanitize (c, base))) + return_trace (false); + return_trace (true); + } + template <typename T> + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, const void *base, T user_data) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c, count))) return_trace (false); + for (unsigned int i = 0; i < count; i++) + if (unlikely (!arrayZ[i].sanitize (c, base, user_data))) + return_trace (false); + return_trace (true); + } + + private: + inline bool sanitize_shallow (hb_sanitize_context_t *c, unsigned int count) const + { + TRACE_SANITIZE (this); + return_trace (c->check_array (arrayZ, arrayZ[0].static_size, count)); + } + + public: + Type arrayZ[VAR]; + public: + DEFINE_SIZE_ARRAY (0, arrayZ); +}; + +/* Unsized array of offset's */ +template <typename Type, typename OffsetType> +struct UnsizedOffsetArrayOf : UnsizedArrayOf<OffsetTo<Type, OffsetType> > {}; + +/* Unsized array of offsets relative to the beginning of the array itself. */ +template <typename Type, typename OffsetType> +struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType> +{ + inline const Type& operator [] (unsigned int i) const + { + return this+this->arrayZ[i]; + } + + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + { + TRACE_SANITIZE (this); + return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this))); + } + template <typename T> + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const + { + TRACE_SANITIZE (this); + return_trace ((UnsizedOffsetArrayOf<Type, OffsetType>::sanitize (c, count, this, user_data))); + } +}; + + +/* + * Lookup Table + */ + +template <typename T> struct Lookup; + +template <typename T> +struct LookupFormat0 +{ + friend struct Lookup<T>; + + private: + inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const + { + if (unlikely (glyph_id >= num_glyphs)) return nullptr; + return &arrayZ[glyph_id]; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (arrayZ.sanitize (c, c->num_glyphs)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 0 */ + UnsizedArrayOf<T> + arrayZ; /* Array of lookup values, indexed by glyph index. */ + public: + DEFINE_SIZE_ARRAY (2, arrayZ); +}; + + +template <typename T> +struct LookupSegmentSingle +{ + inline int cmp (hb_codepoint_t g) const { + return g < first ? -1 : g <= last ? 0 : +1 ; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && value.sanitize (c)); + } + + GlyphID last; /* Last GlyphID in this segment */ + GlyphID first; /* First GlyphID in this segment */ + T value; /* The lookup value (only one) */ + public: + DEFINE_SIZE_STATIC (4 + T::static_size); +}; + +template <typename T> +struct LookupFormat2 +{ + friend struct Lookup<T>; + + private: + inline const T* get_value (hb_codepoint_t glyph_id) const + { + const LookupSegmentSingle<T> *v = segments.bsearch (glyph_id); + return v ? &v->value : nullptr; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (segments.sanitize (c)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 2 */ + BinSearchArrayOf<LookupSegmentSingle<T> > + segments; /* The actual segments. These must already be sorted, + * according to the first word in each one (the last + * glyph in each segment). */ + public: + DEFINE_SIZE_ARRAY (8, segments); +}; + +template <typename T> +struct LookupSegmentArray +{ + inline const T* get_value (hb_codepoint_t glyph_id, const void *base) const + { + return first <= glyph_id && glyph_id <= last ? &(base+valuesZ)[glyph_id - first] : nullptr; + } + + inline int cmp (hb_codepoint_t g) const { + return g < first ? -1 : g <= last ? 0 : +1 ; + } + + inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + first <= last && + valuesZ.sanitize (c, base, last - first + 1)); + } + + GlyphID last; /* Last GlyphID in this segment */ + GlyphID first; /* First GlyphID in this segment */ + OffsetTo<UnsizedArrayOf<T> > + valuesZ; /* A 16-bit offset from the start of + * the table to the data. */ + public: + DEFINE_SIZE_STATIC (6); +}; + +template <typename T> +struct LookupFormat4 +{ + friend struct Lookup<T>; + + private: + inline const T* get_value (hb_codepoint_t glyph_id) const + { + const LookupSegmentArray<T> *v = segments.bsearch (glyph_id); + return v ? v->get_value (glyph_id, this) : nullptr; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (segments.sanitize (c, this)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 2 */ + BinSearchArrayOf<LookupSegmentArray<T> > + segments; /* The actual segments. These must already be sorted, + * according to the first word in each one (the last + * glyph in each segment). */ + public: + DEFINE_SIZE_ARRAY (8, segments); +}; + +template <typename T> +struct LookupSingle +{ + inline int cmp (hb_codepoint_t g) const { return glyph.cmp (g); } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && value.sanitize (c)); + } + + GlyphID glyph; /* Last GlyphID */ + T value; /* The lookup value (only one) */ + public: + DEFINE_SIZE_STATIC (4 + T::static_size); +}; + +template <typename T> +struct LookupFormat6 +{ + friend struct Lookup<T>; + + private: + inline const T* get_value (hb_codepoint_t glyph_id) const + { + const LookupSingle<T> *v = entries.bsearch (glyph_id); + return v ? &v->value : nullptr; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (entries.sanitize (c)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 6 */ + BinSearchArrayOf<LookupSingle<T> > + entries; /* The actual entries, sorted by glyph index. */ + public: + DEFINE_SIZE_ARRAY (8, entries); +}; + +template <typename T> +struct LookupFormat8 +{ + friend struct Lookup<T>; + + private: + inline const T* get_value (hb_codepoint_t glyph_id) const + { + return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ? &valueArrayZ[glyph_id - firstGlyph] : nullptr; + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 6 */ + GlyphID firstGlyph; /* First glyph index included in the trimmed array. */ + HBUINT16 glyphCount; /* Total number of glyphs (equivalent to the last + * glyph minus the value of firstGlyph plus 1). */ + UnsizedArrayOf<T> + valueArrayZ; /* The lookup values (indexed by the glyph index + * minus the value of firstGlyph). */ + public: + DEFINE_SIZE_ARRAY (6, valueArrayZ); +}; + +template <typename T> +struct Lookup +{ + inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const + { + switch (u.format) { + case 0: return u.format0.get_value (glyph_id, num_glyphs); + case 2: return u.format2.get_value (glyph_id); + case 4: return u.format4.get_value (glyph_id); + case 6: return u.format6.get_value (glyph_id); + case 8: return u.format8.get_value (glyph_id); + default:return nullptr; + } + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!u.format.sanitize (c)) return_trace (false); + switch (u.format) { + case 0: return_trace (u.format0.sanitize (c)); + case 2: return_trace (u.format2.sanitize (c)); + case 4: return_trace (u.format4.sanitize (c)); + case 6: return_trace (u.format6.sanitize (c)); + case 8: return_trace (u.format8.sanitize (c)); + default:return_trace (true); + } + } + + protected: + union { + HBUINT16 format; /* Format identifier */ + LookupFormat0<T> format0; + LookupFormat2<T> format2; + LookupFormat4<T> format4; + LookupFormat6<T> format6; + LookupFormat8<T> format8; + } u; + public: + DEFINE_SIZE_UNION (2, format); +}; + + +/* + * Extended State Table + */ + +template <typename T> +struct Entry +{ + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + { + TRACE_SANITIZE (this); + /* Note, we don't recurse-sanitize data because we don't access it. + * That said, in our DEFINE_SIZE_STATIC we access T::static_size, + * which ensures that data has a simple sanitize(). To be determined + * if I need to remove that as well. */ + return_trace (c->check_struct (this)); + } + + public: + HBUINT16 newState; /* Byte offset from beginning of state table + * to the new state. Really?!?! Or just state + * number? The latter in morx for sure. */ + HBUINT16 flags; /* Table specific. */ + T data; /* Optional offsets to per-glyph tables. */ + public: + DEFINE_SIZE_STATIC (4 + T::static_size); +}; + +template <> +struct Entry<void> +{ + inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + public: + HBUINT16 newState; /* Byte offset from beginning of state table to the new state. */ + HBUINT16 flags; /* Table specific. */ + public: + DEFINE_SIZE_STATIC (4); +}; + +template <typename Extra> +struct StateTable +{ + inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const + { + const HBUINT16 *v = (this+classTable).get_value (glyph_id, num_glyphs); + return v ? *v : 1; + } + + inline const Entry<Extra> *get_entries () const + { + return (this+entryTable).arrayZ; + } + + inline const Entry<Extra> *get_entryZ (unsigned int state, unsigned int klass) const + { + if (unlikely (klass >= nClasses)) return nullptr; + + const HBUINT16 *states = (this+stateArrayTable).arrayZ; + const Entry<Extra> *entries = (this+entryTable).arrayZ; + + unsigned int entry = states[state * nClasses + klass]; + + return &entries[entry]; + } + + inline bool sanitize (hb_sanitize_context_t *c, + unsigned int *num_entries_out = nullptr) const + { + TRACE_SANITIZE (this); + if (unlikely (!(c->check_struct (this) && + classTable.sanitize (c, this)))) return_trace (false); + + const HBUINT16 *states = (this+stateArrayTable).arrayZ; + const Entry<Extra> *entries = (this+entryTable).arrayZ; + + unsigned int num_states = 1; + unsigned int num_entries = 0; + + unsigned int state = 0; + unsigned int entry = 0; + while (state < num_states) + { + if (unlikely (!c->check_array (states + state * nClasses, + states[0].static_size, + nClasses * (num_states - state)))) + return_trace (false); + { /* Sweep new states. */ + const HBUINT16 *stop = &states[num_states * nClasses]; + for (const HBUINT16 *p = &states[state * nClasses]; p < stop; p++) + num_entries = MAX<unsigned int> (num_entries, *p + 1); + state = num_states; + } + + if (unlikely (!c->check_array (entries + entry, + entries[0].static_size, + num_entries - entry))) + return_trace (false); + { /* Sweep new entries. */ + const Entry<Extra> *stop = &entries[num_entries]; + for (const Entry<Extra> *p = &entries[entry]; p < stop; p++) + num_states = MAX<unsigned int> (num_states, p->newState + 1); + entry = num_entries; + } + } + + if (num_entries_out) + *num_entries_out = num_entries; + + return_trace (true); + } + + protected: + HBUINT32 nClasses; /* Number of classes, which is the number of indices + * in a single line in the state array. */ + OffsetTo<Lookup<HBUINT16>, HBUINT32> + classTable; /* Offset to the class table. */ + OffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT32> + stateArrayTable;/* Offset to the state array. */ + OffsetTo<UnsizedArrayOf<Entry<Extra> >, HBUINT32> + entryTable; /* Offset to the entry array. */ + + public: + DEFINE_SIZE_STATIC (16); +}; + +template <typename EntryData> +struct StateTableDriver +{ + inline StateTableDriver (const StateTable<EntryData> &machine_, + hb_buffer_t *buffer_, + hb_face_t *face_) : + machine (machine_), + buffer (buffer_), + num_glyphs (face_->get_num_glyphs ()), + last_zero (0) {} + + template <typename context_t> + inline void drive (context_t *c) + { + hb_glyph_info_t *info = buffer->info; + + if (!c->in_place) + buffer->clear_output (); + + unsigned int state = 0; + 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 */; + const Entry<EntryData> *entry = machine.get_entryZ (state, klass); + if (unlikely (!entry)) + break; + + if (unlikely (!c->transition (this, entry))) + break; + + last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops--; + + state = entry->newState; + + if (buffer->idx == buffer->len) + break; + + if (!last_was_dont_advance) + buffer->next_glyph (); + } + + if (!c->in_place) + { + for (; buffer->idx < buffer->len;) + buffer->next_glyph (); + buffer->swap_buffers (); + } + } + + public: + const StateTable<EntryData> &machine; + hb_buffer_t *buffer; + unsigned int num_glyphs; + unsigned int last_zero; +}; + + + +struct hb_aat_apply_context_t : + hb_dispatch_context_t<hb_aat_apply_context_t, bool, HB_DEBUG_APPLY> +{ + inline const char *get_name (void) { return "APPLY"; } + template <typename T> + inline return_t dispatch (const T &obj) { return obj.apply (this); } + static return_t default_return_value (void) { return false; } + bool stop_sublookup_iteration (return_t r) const { return r; } + + hb_font_t *font; + hb_face_t *face; + hb_buffer_t *buffer; + hb_sanitize_context_t sanitizer; + + 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.init (table); + sanitizer.num_glyphs = face->get_num_glyphs (); + sanitizer.start_processing (); + } + + inline ~hb_aat_apply_context_t (void) + { + sanitizer.end_processing (); + } +}; + + +} /* namespace AAT */ + + +#endif /* HB_AAT_LAYOUT_COMMON_PRIVATE_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 new file mode 100644 index 00000000000..c64dca06670 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh @@ -0,0 +1,694 @@ +/* + * Copyright © 2017 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_MORX_TABLE_HH +#define HB_AAT_LAYOUT_MORX_TABLE_HH + +#include "hb-open-type-private.hh" +#include "hb-aat-layout-common-private.hh" + +#define HB_AAT_TAG_MORX HB_TAG('m','o','r','x') + + +namespace AAT { + +using namespace OT; + + +struct RearrangementSubtable +{ + struct driver_context_t + { + static const bool in_place = true; + enum Flags { + MarkFirst = 0x8000, /* If set, make the current glyph the first + * glyph to be rearranged. */ + DontAdvance = 0x4000, /* If set, don't advance to the next glyph + * before going to the new state. This means + * that the glyph index doesn't change, even + * if the glyph at that index has changed. */ + MarkLast = 0x2000, /* If set, make the current glyph the last + * glyph to be rearranged. */ + Reserved = 0x1FF0, /* These bits are reserved and should be set to 0. */ + Verb = 0x000F, /* The type of rearrangement specified. */ + }; + + inline driver_context_t (const RearrangementSubtable *table) : + ret (false), + start (0), end (0), + last_zero_before_start (0) {} + + inline bool transition (StateTableDriver<void> *driver, + const Entry<void> *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); + + if ((flags & Verb) && start < end) + { + /* The following map has two nibbles, for start-side + * and end-side. Values of 0,1,2 mean move that many + * to the other side. Value of 3 means move 2 and + * flip them. */ + const unsigned char map[16] = + { + 0x00, /* 0 no change */ + 0x10, /* 1 Ax => xA */ + 0x01, /* 2 xD => Dx */ + 0x11, /* 3 AxD => DxA */ + 0x20, /* 4 ABx => xAB */ + 0x30, /* 5 ABx => xBA */ + 0x02, /* 6 xCD => CDx */ + 0x03, /* 7 xCD => DCx */ + 0x12, /* 8 AxCD => CDxA */ + 0x13, /* 9 AxCD => DCxA */ + 0x21, /* 10 ABxD => DxAB */ + 0x31, /* 11 ABxD => DxBA */ + 0x22, /* 12 ABxCD => CDxAB */ + 0x32, /* 13 ABxCD => CDxBA */ + 0x23, /* 14 ABxCD => DCxAB */ + 0x33, /* 15 ABxCD => DCxBA */ + }; + + unsigned int m = map[flags & Verb]; + unsigned int l = MIN<unsigned int> (2, m >> 4); + unsigned int r = MIN<unsigned int> (2, m & 0x0F); + bool reverse_l = 3 == (m >> 4); + bool reverse_r = 3 == (m & 0x0F); + + if (end - start >= l + r) + { + buffer->unsafe_to_break (last_zero_before_start, MIN (buffer->idx + 1, buffer->len)); + buffer->merge_clusters (start, end); + + hb_glyph_info_t *info = buffer->info; + hb_glyph_info_t buf[4]; + + memcpy (buf, info + start, l * sizeof (buf[0])); + memcpy (buf + 2, info + end - r, r * sizeof (buf[0])); + + if (l != r) + memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0])); + + memcpy (info + start, buf + 2, r * sizeof (buf[0])); + memcpy (info + end - l, buf, l * sizeof (buf[0])); + if (reverse_l) + { + buf[0] = info[end - 1]; + info[end - 1] = info[end - 2]; + info[end - 2] = buf[0]; + } + if (reverse_r) + { + buf[0] = info[start]; + info[start] = info[start + 1]; + info[start + 1] = buf[0]; + } + } + } + + return true; + } + + public: + bool ret; + private: + unsigned int start; + unsigned int end; + unsigned int last_zero_before_start; + }; + + inline bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + driver_context_t dc (this); + + StateTableDriver<void> driver (machine, c->buffer, c->face); + driver.drive (&dc); + + return_trace (dc.ret); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (machine.sanitize (c)); + } + + protected: + StateTable<void> machine; + public: + DEFINE_SIZE_STATIC (16); +}; + +struct ContextualSubtable +{ + struct EntryData + { + HBUINT16 markIndex; /* Index of the substitution table for the + * marked glyph (use 0xFFFF for none). */ + HBUINT16 currentIndex; /* Index of the substitution table for the + * current glyph (use 0xFFFF for none). */ + public: + DEFINE_SIZE_STATIC (4); + }; + + struct driver_context_t + { + static const bool in_place = true; + enum Flags { + SetMark = 0x8000, /* If set, make the current glyph the marked glyph. */ + DontAdvance = 0x4000, /* If set, don't advance to the next glyph before + * going to the new state. */ + Reserved = 0x3FFF, /* These bits are reserved and should be set to 0. */ + }; + + inline driver_context_t (const ContextualSubtable *table) : + ret (false), + mark (0), + last_zero_before_mark (0), + subs (table+table->substitutionTables) {} + + 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; + } + + if (entry->data.markIndex != 0xFFFF) + { + const Lookup<GlyphID> &lookup = subs[entry->data.markIndex]; + hb_glyph_info_t *info = buffer->info; + 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)); + info[mark].codepoint = *replacement; + ret = true; + } + } + if (entry->data.currentIndex != 0xFFFF) + { + 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); + if (replacement) + { + buffer->unsafe_to_break (driver->last_zero, MIN (buffer->idx + 1, buffer->len)); + info[buffer->idx].codepoint = *replacement; + ret = true; + } + } + + return true; + } + + public: + bool ret; + private: + unsigned int mark; + unsigned int last_zero_before_mark; + const UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32> &subs; + }; + + inline bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + driver_context_t dc (this); + + StateTableDriver<EntryData> driver (machine, c->buffer, c->face); + driver.drive (&dc); + + return_trace (dc.ret); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + + unsigned int num_entries; + if (unlikely (!machine.sanitize (c, &num_entries))) return false; + + unsigned int num_lookups = 0; + + const Entry<EntryData> *entries = machine.get_entries (); + for (unsigned int i = 0; i < num_entries; i++) + { + 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); + } + + return_trace (substitutionTables.sanitize (c, this, num_lookups)); + } + + protected: + StateTable<EntryData> machine; + OffsetTo<UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32>, HBUINT32> + substitutionTables; + public: + DEFINE_SIZE_STATIC (20); +}; + +struct LigatureSubtable +{ + struct EntryData + { + HBUINT16 ligActionIndex; /* Index to the first ligActionTable entry + * for processing this group, if indicated + * by the flags. */ + public: + DEFINE_SIZE_STATIC (2); + }; + + struct driver_context_t + { + static const bool in_place = false; + enum Flags { + SetComponent = 0x8000, /* Push this glyph onto the component stack for + * eventual processing. */ + DontAdvance = 0x4000, /* Leave the glyph pointer at this glyph for the + next iteration. */ + PerformAction = 0x2000, /* Use the ligActionIndex to process a ligature + * group. */ + Reserved = 0x1FFF, /* These bits are reserved and should be set to 0. */ + }; + enum LigActionFlags { + LigActionLast = 0x80000000, /* This is the last action in the list. This also + * implies storage. */ + LigActionStore = 0x40000000, /* Store the ligature at the current cumulated index + * in the ligature table in place of the marked + * (i.e. currently-popped) glyph. */ + LigActionOffset = 0x3FFFFFFF, /* A 30-bit value which is sign-extended to 32-bits + * and added to the glyph ID, resulting in an index + * into the component table. */ + }; + + inline driver_context_t (const LigatureSubtable *table, + hb_aat_apply_context_t *c_) : + ret (false), + c (c_), + ligAction (table+table->ligAction), + component (table+table->component), + ligature (table+table->ligature), + match_length (0) {} + + inline bool transition (StateTableDriver<EntryData> *driver, + const Entry<EntryData> *entry) + { + hb_buffer_t *buffer = driver->buffer; + unsigned int flags = entry->flags; + + if (flags & SetComponent) + { + if (unlikely (match_length >= ARRAY_LENGTH (match_positions))) + return false; + + /* Never mark same index twice, in case DontAdvance was used... */ + if (match_length && match_positions[match_length - 1] == buffer->out_len) + match_length--; + + match_positions[match_length++] = buffer->out_len; + } + + if (flags & PerformAction) + { + unsigned int end = buffer->out_len; + unsigned int action_idx = entry->data.ligActionIndex; + unsigned int action; + unsigned int ligature_idx = 0; + do + { + if (unlikely (!match_length)) + return false; + + buffer->move_to (match_positions[--match_length]); + + const HBUINT32 &actionData = ligAction[action_idx]; + if (unlikely (!actionData.sanitize (&c->sanitizer))) return false; + action = actionData; + + uint32_t uoffset = action & LigActionOffset; + if (uoffset & 0x20000000) + uoffset += 0xC0000000; + int32_t offset = (int32_t) uoffset; + unsigned int component_idx = buffer->cur().codepoint + offset; + + const HBUINT16 &componentData = component[component_idx]; + if (unlikely (!componentData.sanitize (&c->sanitizer))) return false; + ligature_idx += componentData; + + if (action & (LigActionStore | LigActionLast)) + { + const GlyphID &ligatureData = ligature[ligature_idx]; + if (unlikely (!ligatureData.sanitize (&c->sanitizer))) return false; + hb_codepoint_t lig = ligatureData; + + match_positions[match_length++] = buffer->out_len; + buffer->replace_glyph (lig); + + //ligature_idx = 0; // XXX Yes or no? + } + else + { + buffer->skip_glyph (); + end--; + } + /* TODO merge_clusters / unsafe_to_break */ + + action_idx++; + } + while (!(action & LigActionLast)); + buffer->move_to (end); + } + + return true; + } + + public: + bool ret; + private: + hb_aat_apply_context_t *c; + const UnsizedArrayOf<HBUINT32> &ligAction; + const UnsizedArrayOf<HBUINT16> &component; + const UnsizedArrayOf<GlyphID> &ligature; + unsigned int match_length; + unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; + }; + + inline bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + driver_context_t dc (this, c); + + StateTableDriver<EntryData> driver (machine, c->buffer, c->face); + driver.drive (&dc); + + return_trace (dc.ret); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + 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); + } + + protected: + StateTable<EntryData> machine; + OffsetTo<UnsizedArrayOf<HBUINT32>, HBUINT32> + ligAction; /* Offset to the ligature action table. */ + OffsetTo<UnsizedArrayOf<HBUINT16>, HBUINT32> + component; /* Offset to the component table. */ + OffsetTo<UnsizedArrayOf<GlyphID>, HBUINT32> + ligature; /* Offset to the actual ligature lists. */ + public: + DEFINE_SIZE_STATIC (28); +}; + +struct NoncontextualSubtable +{ + inline bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + bool ret = false; + unsigned int num_glyphs = c->face->get_num_glyphs (); + + hb_glyph_info_t *info = c->buffer->info; + unsigned int count = c->buffer->len; + for (unsigned int i = 0; i < count; i++) + { + const GlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs); + if (replacement) + { + info[i].codepoint = *replacement; + ret = true; + } + } + + return_trace (ret); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (substitute.sanitize (c)); + } + + protected: + Lookup<GlyphID> substitute; + public: + DEFINE_SIZE_MIN (2); +}; + +struct InsertionSubtable +{ + inline bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + /* TODO */ + return_trace (false); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + /* TODO */ + return_trace (true); + } +}; + + +struct Feature +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + public: + HBUINT16 featureType; /* The type of feature. */ + HBUINT16 featureSetting; /* The feature's setting (aka selector). */ + HBUINT32 enableFlags; /* Flags for the settings that this feature + * and setting enables. */ + HBUINT32 disableFlags; /* Complement of flags for the settings that this + * feature and setting disable. */ + + public: + DEFINE_SIZE_STATIC (12); +}; + + +struct ChainSubtable +{ + friend struct Chain; + + inline unsigned int get_size (void) const { return length; } + inline unsigned int get_type (void) const { return coverage & 0xFF; } + + enum Type { + Rearrangement = 0, + Contextual = 1, + Ligature = 2, + Noncontextual = 4, + Insertion = 5 + }; + + inline void apply (hb_aat_apply_context_t *c) const + { + dispatch (c); + } + + template <typename context_t> + inline typename context_t::return_t dispatch (context_t *c) const + { + unsigned int subtable_type = get_type (); + TRACE_DISPATCH (this, subtable_type); + switch (subtable_type) { + case Rearrangement: return_trace (c->dispatch (u.rearrangement)); + case Contextual: return_trace (c->dispatch (u.contextual)); + case Ligature: return_trace (c->dispatch (u.ligature)); + case Noncontextual: return_trace (c->dispatch (u.noncontextual)); + case Insertion: return_trace (c->dispatch (u.insertion)); + default: return_trace (c->default_return_value ()); + } + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!length.sanitize (c) || + length < min_size || + !c->check_range (this, length)) + return_trace (false); + + return_trace (dispatch (c)); + } + + protected: + HBUINT32 length; /* Total subtable length, including this header. */ + HBUINT32 coverage; /* Coverage flags and subtable type. */ + HBUINT32 subFeatureFlags;/* The 32-bit mask identifying which subtable this is. */ + union { + RearrangementSubtable rearrangement; + ContextualSubtable contextual; + LigatureSubtable ligature; + NoncontextualSubtable noncontextual; + InsertionSubtable insertion; + } u; + public: + DEFINE_SIZE_MIN (12); +}; + +struct Chain +{ + inline void apply (hb_aat_apply_context_t *c) const + { + const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (featureZ, featureZ[0].static_size * featureCount); + unsigned int count = subtableCount; + for (unsigned int i = 0; i < count; i++) + { + subtable->apply (c); + subtable = &StructAfter<ChainSubtable> (*subtable); + } + } + + inline unsigned int get_size (void) const { return length; } + + inline bool sanitize (hb_sanitize_context_t *c, unsigned int major) const + { + TRACE_SANITIZE (this); + if (!length.sanitize (c) || + length < min_size || + !c->check_range (this, length)) + return_trace (false); + + if (!c->check_array (featureZ, featureZ[0].static_size, featureCount)) + return_trace (false); + + const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (featureZ, featureZ[0].static_size * featureCount); + unsigned int count = subtableCount; + for (unsigned int i = 0; i < count; i++) + { + if (!subtable->sanitize (c)) + return_trace (false); + subtable = &StructAfter<ChainSubtable> (*subtable); + } + + return_trace (true); + } + + protected: + HBUINT32 defaultFlags; /* The default specification for subtables. */ + HBUINT32 length; /* Total byte count, including this header. */ + HBUINT32 featureCount; /* Number of feature subtable entries. */ + HBUINT32 subtableCount; /* The number of subtables in the chain. */ + + Feature featureZ[VAR]; /* Features. */ + ChainSubtable subtableX[VAR]; /* Subtables. */ + // subtableGlyphCoverageArray if major == 3 + + public: + DEFINE_SIZE_MIN (16); +}; + + +/* + * The 'mort'/'morx' Tables + */ + +struct morx +{ + static const hb_tag_t tableTag = HB_AAT_TAG_MORX; + + inline void apply (hb_aat_apply_context_t *c) const + { + const Chain *chain = chains; + unsigned int count = chainCount; + for (unsigned int i = 0; i < count; i++) + { + chain->apply (c); + chain = &StructAfter<Chain> (*chain); + } + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!version.sanitize (c) || + (version.major >> (sizeof (HBUINT32) == 4 ? 1 : 0)) != 1 || + !chainCount.sanitize (c)) + return_trace (false); + + const Chain *chain = chains; + unsigned int count = chainCount; + for (unsigned int i = 0; i < count; i++) + { + if (!chain->sanitize (c, version.major)) + return_trace (false); + chain = &StructAfter<Chain> (*chain); + } + + return_trace (true); + } + + protected: + FixedVersion<>version; /* Version number of the glyph metamorphosis table. + * 1 for mort, 2 or 3 for morx. */ + HBUINT32 chainCount; /* Number of metamorphosis chains contained in this + * table. */ + Chain chains[VAR]; /* Chains. */ + + public: + DEFINE_SIZE_MIN (8); +}; + +} /* namespace AAT */ + + +#endif /* HB_AAT_LAYOUT_MORX_TABLE_HH */ 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 new file mode 100644 index 00000000000..c1c607a2f7a --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh @@ -0,0 +1,40 @@ +/* + * Copyright © 2017 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_PRIVATE_HH +#define HB_AAT_LAYOUT_PRIVATE_HH + +#include "hb-private.hh" + +#include "hb-font-private.hh" +#include "hb-buffer-private.hh" +#include "hb-open-type-private.hh" + + +HB_INTERNAL void +hb_aat_layout_substitute (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.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc new file mode 100644 index 00000000000..d882fa16681 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc @@ -0,0 +1,78 @@ +/* + * Copyright © 2017 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-open-type-private.hh" + +#include "hb-ot-layout-private.hh" +#include "hb-ot-layout-gsubgpos-private.hh" + +#include "hb-aat-layout-private.hh" +#include "hb-aat-layout-morx-table.hh" + +/* + * mort/morx + */ + +static inline const AAT::morx& +_get_morx (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::morx); + } + hb_ot_layout_t * layout = hb_ot_layout_from_face (face); + /* XXX this doesn't call set_num_glyphs on sanitizer. */ + const AAT::morx& morx = *(layout->morx.get ()); + if (blob) + *blob = layout->morx.blob; + return morx; +} + +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) +{ + hb_blob_t *blob; + const AAT::morx& morx = _get_morx (font->face, &blob); + + AAT::hb_aat_apply_context_t c (font, buffer, blob); + morx.apply (&c); +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh index 93438401400..a7e9b11af8b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic-private.hh @@ -70,6 +70,29 @@ typedef LONG hb_atomic_int_impl_t; #define hb_atomic_ptr_impl_cmpexch(P,O,N) (InterlockedCompareExchangePointer ((void **) (P), (void *) (N), (void *) (O)) == (void *) (O)) +#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES) + +typedef int hb_atomic_int_impl_t; +#define HB_ATOMIC_INT_IMPL_INIT(V) (V) +#define hb_atomic_int_impl_add(AI, V) __sync_fetch_and_add (&(AI), (V)) + +#define hb_atomic_ptr_impl_get(P) (void *) (__sync_synchronize (), *(P)) +#define hb_atomic_ptr_impl_cmpexch(P,O,N) __sync_bool_compare_and_swap ((P), (O), (N)) + + +#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS) + +#include <atomic.h> +#include <mbarrier.h> + +typedef unsigned int hb_atomic_int_impl_t; +#define HB_ATOMIC_INT_IMPL_INIT(V) (V) +#define hb_atomic_int_impl_add(AI, V) ( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V)) + +#define hb_atomic_ptr_impl_get(P) ( ({__machine_rw_barrier ();}), (void *) *(P)) +#define hb_atomic_ptr_impl_cmpexch(P,O,N) ( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false) + + #elif !defined(HB_NO_MT) && defined(__APPLE__) #include <libkern/OSAtomic.h> @@ -96,29 +119,6 @@ typedef int32_t hb_atomic_int_impl_t; #endif -#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES) - -typedef int hb_atomic_int_impl_t; -#define HB_ATOMIC_INT_IMPL_INIT(V) (V) -#define hb_atomic_int_impl_add(AI, V) __sync_fetch_and_add (&(AI), (V)) - -#define hb_atomic_ptr_impl_get(P) (void *) (__sync_synchronize (), *(P)) -#define hb_atomic_ptr_impl_cmpexch(P,O,N) __sync_bool_compare_and_swap ((P), (O), (N)) - - -#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS) - -#include <atomic.h> -#include <mbarrier.h> - -typedef unsigned int hb_atomic_int_impl_t; -#define HB_ATOMIC_INT_IMPL_INIT(V) (V) -#define hb_atomic_int_impl_add(AI, V) ( ({__machine_rw_barrier ();}), atomic_add_int_nv (&(AI), (V)) - (V)) - -#define hb_atomic_ptr_impl_get(P) ( ({__machine_rw_barrier ();}), (void *) *(P)) -#define hb_atomic_ptr_impl_cmpexch(P,O,N) ( ({__machine_rw_barrier ();}), atomic_cas_ptr ((void **) (P), (void *) (O), (void *) (N)) == (void *) (O) ? true : false) - - #elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__) #include <builtins.h> 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 59c83336374..4cf6d1e5451 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc @@ -26,7 +26,7 @@ /* http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */ #ifndef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 199309L +#define _POSIX_C_SOURCE 200809L #endif #include "hb-private.hh" 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 ef3fc98c05d..53682d3eb1c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h @@ -44,7 +44,7 @@ HB_BEGIN_DECLS * any such possibility, MODE_DUPLICATE should be used * such that HarfBuzz makes a copy immediately, * - * - Use MODE_READONLY otherse, unless you really really + * - Use MODE_READONLY otherwise, unless you really really * really know what you are doing, * * - MODE_WRITABLE is appropriate if you really made a 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 97bdc1be305..9148ef31b65 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 @@ -69,6 +69,7 @@ enum hb_buffer_scratch_flags_t { HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u, HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u, HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK = 0x00000010u, + HB_BUFFER_SCRATCH_FLAG_HAS_CGJ = 0x00000020u, /* Reserved for complex shapers' internal use. */ HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u, @@ -306,37 +307,37 @@ struct hb_buffer_t { HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); static inline void - set_cluster (hb_glyph_info_t &info, unsigned int cluster, unsigned int mask = 0) + set_cluster (hb_glyph_info_t &inf, unsigned int cluster, unsigned int mask = 0) { - if (info.cluster != cluster) + if (inf.cluster != cluster) { if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK) - info.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + inf.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; else - info.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + inf.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } - info.cluster = cluster; + inf.cluster = cluster; } inline int - _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *info, + _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *infos, unsigned int start, unsigned int end, unsigned int cluster) const { for (unsigned int i = start; i < end; i++) - cluster = MIN<unsigned int> (cluster, info[i].cluster); + cluster = MIN<unsigned int> (cluster, infos[i].cluster); return cluster; } inline void - _unsafe_to_break_set_mask (hb_glyph_info_t *info, + _unsafe_to_break_set_mask (hb_glyph_info_t *infos, unsigned int start, unsigned int end, unsigned int cluster) { for (unsigned int i = start; i < end; i++) - if (cluster != info[i].cluster) + if (cluster != infos[i].cluster) { scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK; - info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; } } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc index ea62e9ffdb2..11471941de8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc @@ -109,6 +109,7 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, nullptr : hb_buffer_get_glyph_positions (buffer, nullptr); *buf_consumed = 0; + hb_position_t x = 0, y = 0; for (unsigned int i = start; i < end; i++) { char b[1024]; @@ -146,9 +147,10 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) { p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", - pos[i].x_offset, pos[i].y_offset)); - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", - pos[i].x_advance, pos[i].y_advance)); + x+pos[i].x_offset, y+pos[i].y_offset)); + if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) + p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", + pos[i].x_advance, pos[i].y_advance)); } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) @@ -179,6 +181,12 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, *buf = '\0'; } else return i - start; + + if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) + { + x += pos[i].x_advance; + y += pos[i].y_advance; + } } return end - start; @@ -199,6 +207,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, nullptr : hb_buffer_get_glyph_positions (buffer, nullptr); *buf_consumed = 0; + hb_position_t x = 0, y = 0; for (unsigned int i = start; i < end; i++) { char b[1024]; @@ -223,13 +232,16 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) { - if (pos[i].x_offset || pos[i].y_offset) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", pos[i].x_offset, pos[i].y_offset)); - - *p++ = '+'; - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); - if (pos[i].y_advance) - p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); + if (x+pos[i].x_offset || y+pos[i].y_offset) + p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset)); + + if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) + { + *p++ = '+'; + p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); + if (pos[i].y_advance) + p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); + } } if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) @@ -255,6 +267,12 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, *buf = '\0'; } else return i - start; + + if (pos && (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)) + { + x += pos[i].x_advance; + y += pos[i].y_advance; + } } return end - start; 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 a8a4b84e97b..b2801ddf546 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h @@ -247,13 +247,21 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer); * of the text without the full context. * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text * paragraph can be applied to this buffer, similar to - * @HB_BUFFER_FLAG_EOT. + * @HB_BUFFER_FLAG_BOT. * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES: * flag indication that character with Default_Ignorable * Unicode property should use the corresponding glyph - * from the font, instead of hiding them (currently done - * by replacing them with the space glyph and zeroing the - * advance width.) + * from the font, instead of hiding them (done by + * replacing them with the space glyph and zeroing the + * advance width.) This flag takes precedence over + * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES. + * @HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES: + * flag indication that character with Default_Ignorable + * Unicode property should be removed from glyph string + * instead of hiding them (done by replacing them with the + * space glyph and zeroing the advance width.) + * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES takes + * precedence over this flag. Since: 1.8.0 * * Since: 0.9.20 */ @@ -261,7 +269,8 @@ typedef enum { /*< flags >*/ HB_BUFFER_FLAG_DEFAULT = 0x00000000u, HB_BUFFER_FLAG_BOT = 0x00000001u, /* Beginning-of-text */ HB_BUFFER_FLAG_EOT = 0x00000002u, /* End-of-text */ - HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u + HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u, + HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES = 0x00000008u } hb_buffer_flags_t; HB_EXTERN void @@ -412,6 +421,9 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer); * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information. * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name. * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents. + * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0 + * @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances, + * glyph offsets will reflect absolute glyph positions. Since: 1.8.0 * * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs(). * @@ -423,7 +435,8 @@ typedef enum { /*< flags >*/ HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS = 0x00000002u, HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES = 0x00000004u, HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u, - HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u + HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u, + HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES = 0x00000020u } hb_buffer_serialize_flags_t; /** 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 cb1fb43ffbb..1d0e7264234 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc @@ -524,6 +524,7 @@ hb_script_get_horizontal_direction (hb_script_t script) case HB_SCRIPT_PSALTER_PAHLAVI: /* Unicode-8.0 additions */ + case HB_SCRIPT_HATRAN: case HB_SCRIPT_OLD_HUNGARIAN: /* Unicode-9.0 additions */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc index 26fddbe5292..d8af8c1f37e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc @@ -164,7 +164,7 @@ hb_face_create (hb_blob_t *blob, if (unlikely (!blob)) blob = hb_blob_get_empty (); - hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (hb_blob_reference (blob)), index); + hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (OT::Sanitizer<OT::OpenTypeFontFile>().sanitize (hb_blob_reference (blob)), index); if (unlikely (!closure)) return hb_face_get_empty (); @@ -424,7 +424,7 @@ hb_face_get_upem (hb_face_t *face) void hb_face_t::load_upem (void) const { - hb_blob_t *head_blob = OT::Sanitizer<OT::head>::sanitize (reference_table (HB_OT_TAG_head)); + hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (reference_table (HB_OT_TAG_head)); const OT::head *head_table = OT::Sanitizer<OT::head>::lock_instance (head_blob); upem = head_table->get_upem (); hb_blob_destroy (head_blob); @@ -468,7 +468,7 @@ hb_face_get_glyph_count (hb_face_t *face) void hb_face_t::load_num_glyphs (void) const { - hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>::sanitize (reference_table (HB_OT_TAG_maxp)); + hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (reference_table (HB_OT_TAG_maxp)); const OT::maxp *maxp_table = OT::Sanitizer<OT::maxp>::lock_instance (maxp_blob); num_glyphs = maxp_table->get_num_glyphs (); hb_blob_destroy (maxp_blob); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh index d2801fb86ec..992152f176c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh @@ -128,6 +128,8 @@ struct hb_font_t { inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); } inline hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); } inline hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); } + inline float em_fscale_x (int16_t v) { return em_fscale (v, x_scale); } + inline float em_fscale_y (int16_t v) { return em_fscale (v, y_scale); } inline hb_position_t em_scale_dir (int16_t v, hb_direction_t direction) { return em_scale (v, dir_scale (direction)); } @@ -541,7 +543,11 @@ struct hb_font_t { } inline hb_position_t em_scalef (float v, int scale) { - return (hb_position_t) (v * scale / face->get_upem ()); + return (hb_position_t) round (v * scale / face->get_upem ()); + } + inline float em_fscale (int16_t v, int scale) + { + return (float) v * scale / face->get_upem (); } }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h index 540cdcab953..c95b61d2da8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h @@ -456,7 +456,7 @@ hb_font_get_glyph_from_name (hb_font_t *font, /* high-level funcs, with fallback */ /* Calls either hb_font_get_nominal_glyph() if variation_selector is 0, - * otherwise callse hb_font_get_variation_glyph(). */ + * otherwise calls hb_font_get_variation_glyph(). */ HB_EXTERN hb_bool_t hb_font_get_glyph (hb_font_t *font, hb_codepoint_t unicode, hb_codepoint_t variation_selector, 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 4f33e114b40..1c526cf37dc 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc @@ -635,15 +635,27 @@ hb_ft_font_changed (hb_font_t *font) { if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, ft_coords)) { + bool nonzero = false; + for (unsigned int i = 0; i < mm_var->num_axis; ++i) + { coords[i] = ft_coords[i] >>= 2; + nonzero = nonzero || coords[i]; + } - hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis); + if (nonzero) + hb_font_set_var_coords_normalized (font, coords, mm_var->num_axis); + else + hb_font_set_var_coords_normalized (font, nullptr, 0); } } free (coords); free (ft_coords); +#ifdef HAVE_FT_DONE_MM_VAR + FT_Done_MM_Var (ft_face->glyph->library, mm_var); +#else free (mm_var); +#endif } #endif } 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 644e0b40f6f..1e5676e8262 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 @@ -64,9 +64,9 @@ typedef struct TableRecord Tag tag; /* 4-byte identifier. */ CheckSum checkSum; /* CheckSum for this table. */ - UINT32 offset; /* Offset from beginning of TrueType font + HBUINT32 offset; /* Offset from beginning of TrueType font * file. */ - UINT32 length; /* Length of this table. */ + HBUINT32 length; /* Length of this table. */ public: DEFINE_SIZE_STATIC (16); } OpenTypeTable; @@ -154,7 +154,7 @@ struct TTCHeaderVersion1 Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ FixedVersion<>version; /* Version of the TTC Header (1.0), * 0x00010000u */ - ArrayOf<LOffsetTo<OffsetTable>, UINT32> + ArrayOf<LOffsetTo<OffsetTable>, HBUINT32> table; /* Array of offsets to the OffsetTable for each font * from the beginning of the file */ public: 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 2f4e1b9e9e9..04e4a4e1ba9 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 @@ -187,7 +187,8 @@ struct hb_sanitize_context_t : debug_depth (0), start (nullptr), end (nullptr), writable (false), edit_count (0), - blob (nullptr) {} + blob (nullptr), + num_glyphs (0) {} inline const char *get_name (void) { return "SANITIZE"; } template <typename T, typename F> @@ -298,6 +299,7 @@ struct hb_sanitize_context_t : bool writable; unsigned int edit_count; hb_blob_t *blob; + unsigned int num_glyphs; }; @@ -306,8 +308,9 @@ struct hb_sanitize_context_t : template <typename Type> struct Sanitizer { - static hb_blob_t *sanitize (hb_blob_t *blob) { - hb_sanitize_context_t c[1]; + inline Sanitizer (void) {} + + inline hb_blob_t *sanitize (hb_blob_t *blob) { bool sane; /* TODO is_sane() stuff */ @@ -370,6 +373,11 @@ struct Sanitizer const char *base = hb_blob_get_data (blob, nullptr); return unlikely (!base) ? &Null(Type) : CastP<Type> (base); } + + inline void set_num_glyphs (unsigned int num_glyphs) { c->num_glyphs = num_glyphs; } + + private: + hb_sanitize_context_t c[1]; }; @@ -519,8 +527,6 @@ struct Supplier }; - - /* * * The OpenType Font File: Data Types @@ -635,22 +641,22 @@ struct IntType DEFINE_SIZE_STATIC (Size); }; -typedef IntType<uint8_t, 1> UINT8; /* 8-bit unsigned integer. */ -typedef IntType<int8_t, 1> INT8; /* 8-bit signed integer. */ -typedef IntType<uint16_t, 2> UINT16; /* 16-bit unsigned integer. */ -typedef IntType<int16_t, 2> INT16; /* 16-bit signed integer. */ -typedef IntType<uint32_t, 4> UINT32; /* 32-bit unsigned integer. */ -typedef IntType<int32_t, 4> INT32; /* 32-bit signed integer. */ +typedef IntType<uint8_t, 1> HBUINT8; /* 8-bit unsigned integer. */ +typedef IntType<int8_t, 1> HBINT8; /* 8-bit signed integer. */ +typedef IntType<uint16_t, 2> HBUINT16; /* 16-bit unsigned integer. */ +typedef IntType<int16_t, 2> HBINT16; /* 16-bit signed integer. */ +typedef IntType<uint32_t, 4> HBUINT32; /* 32-bit unsigned integer. */ +typedef IntType<int32_t, 4> HBINT32; /* 32-bit signed integer. */ typedef IntType<uint32_t, 3> UINT24; /* 24-bit unsigned integer. */ -/* 16-bit signed integer (INT16) that describes a quantity in FUnits. */ -typedef INT16 FWORD; +/* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */ +typedef HBINT16 FWORD; -/* 16-bit unsigned integer (UINT16) that describes a quantity in FUnits. */ -typedef UINT16 UFWORD; +/* 16-bit unsigned integer (HBUINT16) that describes a quantity in FUnits. */ +typedef HBUINT16 UFWORD; /* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */ -struct F2DOT14 : INT16 +struct F2DOT14 : HBINT16 { //inline float to_float (void) const { return ???; } //inline void set_float (float f) { v.set (f * ???); } @@ -659,7 +665,7 @@ struct F2DOT14 : INT16 }; /* 32-bit signed fixed-point number (16.16). */ -struct Fixed: INT32 +struct Fixed: HBINT32 { //inline float to_float (void) const { return ???; } //inline void set_float (float f) { v.set (f * ???); } @@ -677,15 +683,15 @@ struct LONGDATETIME return_trace (likely (c->check_struct (this))); } protected: - INT32 major; - UINT32 minor; + HBINT32 major; + HBUINT32 minor; public: DEFINE_SIZE_STATIC (8); }; /* Array of four uint8s (length = 32 bits) used to identify a script, language * system, feature, or baseline */ -struct Tag : UINT32 +struct Tag : HBUINT32 { /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */ inline operator const char* (void) const { return reinterpret_cast<const char *> (&this->v); } @@ -696,10 +702,10 @@ struct Tag : UINT32 DEFINE_NULL_DATA (Tag, " "); /* Glyph index number, same as uint16 (length = 16 bits) */ -typedef UINT16 GlyphID; +typedef HBUINT16 GlyphID; /* Script/language-system/feature index */ -struct Index : UINT16 { +struct Index : HBUINT16 { static const unsigned int NOT_FOUND_INDEX = 0xFFFFu; }; DEFINE_NULL_DATA (Index, "\xff\xff"); @@ -713,18 +719,18 @@ struct Offset : Type DEFINE_SIZE_STATIC (sizeof(Type)); }; -typedef Offset<UINT16> Offset16; -typedef Offset<UINT32> Offset32; +typedef Offset<HBUINT16> Offset16; +typedef Offset<HBUINT32> Offset32; /* CheckSum */ -struct CheckSum : UINT32 +struct CheckSum : HBUINT32 { /* This is reference implementation from the spec. */ - static inline uint32_t CalcTableChecksum (const UINT32 *Table, uint32_t Length) + static inline uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length) { uint32_t Sum = 0L; - const UINT32 *EndPtr = Table+((Length+3) & ~3) / UINT32::static_size; + const HBUINT32 *EndPtr = Table+((Length+3) & ~3) / HBUINT32::static_size; while (Table < EndPtr) Sum += *Table++; @@ -733,7 +739,7 @@ struct CheckSum : UINT32 /* Note: data should be 4byte aligned and have 4byte padding at the end. */ inline void set_for_data (const void *data, unsigned int length) - { set (CalcTableChecksum ((const UINT32 *) data, length)); } + { set (CalcTableChecksum ((const HBUINT32 *) data, length)); } public: DEFINE_SIZE_STATIC (4); @@ -744,7 +750,7 @@ struct CheckSum : UINT32 * Version Numbers */ -template <typename FixedType=UINT16> +template <typename FixedType=HBUINT16> struct FixedVersion { inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; } @@ -768,7 +774,7 @@ struct FixedVersion * Use: (base+offset) */ -template <typename Type, typename OffsetType=UINT16> +template <typename Type, typename OffsetType=HBUINT16> struct OffsetTo : Offset<OffsetType> { inline const Type& operator () (const void *base) const @@ -813,7 +819,7 @@ struct OffsetTo : Offset<OffsetType> } DEFINE_SIZE_STATIC (sizeof(OffsetType)); }; -template <typename Type> struct LOffsetTo : OffsetTo<Type, UINT32> {}; +template <typename Type> struct LOffsetTo : OffsetTo<Type, HBUINT32> {}; template <typename Base, typename OffsetType, typename Type> static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType> &offset) { return offset (base); } template <typename Base, typename OffsetType, typename Type> @@ -825,7 +831,7 @@ static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType> &offset) */ /* An array with a number of elements. */ -template <typename Type, typename LenType=UINT16> +template <typename Type, typename LenType=HBUINT16> struct ArrayOf { const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const @@ -935,10 +941,10 @@ struct ArrayOf public: DEFINE_SIZE_ARRAY (sizeof (LenType), array); }; -template <typename Type> struct LArrayOf : ArrayOf<Type, UINT32> {}; +template <typename Type> struct LArrayOf : ArrayOf<Type, HBUINT32> {}; /* Array of Offset's */ -template <typename Type, typename OffsetType=UINT16> +template <typename Type, typename OffsetType=HBUINT16> struct OffsetArrayOf : ArrayOf<OffsetTo<Type, OffsetType> > {}; /* Array of offsets relative to the beginning of the array itself. */ @@ -966,7 +972,7 @@ struct OffsetListOf : OffsetArrayOf<Type> /* An array starting at second element. */ -template <typename Type, typename LenType=UINT16> +template <typename Type, typename LenType=HBUINT16> struct HeadlessArrayOf { inline const Type& operator [] (unsigned int i) const @@ -1028,19 +1034,19 @@ struct HeadlessArrayOf /* * An array with sorted elements. Supports binary searching. */ -template <typename Type, typename LenType=UINT16> +template <typename Type, typename LenType=HBUINT16> struct SortedArrayOf : ArrayOf<Type, LenType> { template <typename SearchType> inline int bsearch (const SearchType &x) const { /* Hand-coded bsearch here since this is in the hot inner loop. */ - const Type *array = this->array; + const Type *arr = this->array; int min = 0, max = (int) this->len - 1; while (min <= max) { int mid = (min + max) / 2; - int c = array[mid].cmp (x); + int c = arr[mid].cmp (x); if (c < 0) max = mid - 1; else if (c > 0) @@ -1067,10 +1073,10 @@ struct BinSearchHeader } protected: - UINT16 len; - UINT16 searchRangeZ; - UINT16 entrySelectorZ; - UINT16 rangeShiftZ; + HBUINT16 len; + HBUINT16 searchRangeZ; + HBUINT16 entrySelectorZ; + HBUINT16 rangeShiftZ; public: DEFINE_SIZE_STATIC (8); @@ -1139,8 +1145,8 @@ struct hb_lazy_table_loader_t inline void init (hb_face_t *face_) { face = face_; - instance = nullptr; blob = nullptr; + instance = nullptr; } inline void fini (void) @@ -1154,7 +1160,7 @@ struct hb_lazy_table_loader_t T *p = (T *) hb_atomic_ptr_get (&instance); if (unlikely (!p)) { - hb_blob_t *blob_ = OT::Sanitizer<T>::sanitize (face->reference_table (T::tableTag)); + hb_blob_t *blob_ = OT::Sanitizer<T>().sanitize (face->reference_table (T::tableTag)); p = const_cast<T *>(OT::Sanitizer<T>::lock_instance (blob_)); if (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), nullptr, p)) { @@ -1171,10 +1177,10 @@ struct hb_lazy_table_loader_t return get(); } - private: hb_face_t *face; - T *instance; mutable hb_blob_t *blob; + private: + mutable T *instance; }; 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-cbdt-table.hh index 415625e5f80..6c2b9a88ee1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh @@ -47,20 +47,20 @@ struct SmallGlyphMetrics extents->height = -height; } - UINT8 height; - UINT8 width; - INT8 bearingX; - INT8 bearingY; - UINT8 advance; + HBUINT8 height; + HBUINT8 width; + HBINT8 bearingX; + HBINT8 bearingY; + HBUINT8 advance; DEFINE_SIZE_STATIC(5); }; struct BigGlyphMetrics : SmallGlyphMetrics { - INT8 vertBearingX; - INT8 vertBearingY; - UINT8 vertAdvance; + HBINT8 vertBearingX; + HBINT8 vertBearingY; + HBUINT8 vertAdvance; DEFINE_SIZE_STATIC(8); }; @@ -73,18 +73,18 @@ struct SBitLineMetrics return_trace (c->check_struct (this)); } - INT8 ascender; - INT8 decender; - UINT8 widthMax; - INT8 caretSlopeNumerator; - INT8 caretSlopeDenominator; - INT8 caretOffset; - INT8 minOriginSB; - INT8 minAdvanceSB; - INT8 maxBeforeBL; - INT8 minAfterBL; - INT8 padding1; - INT8 padding2; + HBINT8 ascender; + HBINT8 decender; + HBUINT8 widthMax; + HBINT8 caretSlopeNumerator; + HBINT8 caretSlopeDenominator; + HBINT8 caretOffset; + HBINT8 minOriginSB; + HBINT8 minAdvanceSB; + HBINT8 maxBeforeBL; + HBINT8 minAfterBL; + HBINT8 padding1; + HBINT8 padding2; DEFINE_SIZE_STATIC(12); }; @@ -102,9 +102,9 @@ struct IndexSubtableHeader return_trace (c->check_struct (this)); } - UINT16 indexFormat; - UINT16 imageFormat; - UINT32 imageDataOffset; + HBUINT16 indexFormat; + HBUINT16 imageFormat; + HBUINT32 imageDataOffset; DEFINE_SIZE_STATIC(8); }; @@ -137,8 +137,8 @@ struct IndexSubtableFormat1Or3 DEFINE_SIZE_ARRAY(8, offsetArrayZ); }; -struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<UINT32> {}; -struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<UINT16> {}; +struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {}; +struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<HBUINT16> {}; struct IndexSubtable { @@ -214,8 +214,8 @@ struct IndexSubtableRecord offset, length, format); } - UINT16 firstGlyphIndex; - UINT16 lastGlyphIndex; + HBUINT16 firstGlyphIndex; + HBUINT16 lastGlyphIndex; LOffsetTo<IndexSubtable> offsetToSubtable; DEFINE_SIZE_STATIC(8); @@ -276,17 +276,17 @@ struct BitmapSizeTable protected: LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset; - UINT32 indexTablesSize; - UINT32 numberOfIndexSubtables; - UINT32 colorRef; + HBUINT32 indexTablesSize; + HBUINT32 numberOfIndexSubtables; + HBUINT32 colorRef; SBitLineMetrics horizontal; SBitLineMetrics vertical; - UINT16 startGlyphIndex; - UINT16 endGlyphIndex; - UINT8 ppemX; - UINT8 ppemY; - UINT8 bitDepth; - INT8 flags; + HBUINT16 startGlyphIndex; + HBUINT16 endGlyphIndex; + HBUINT8 ppemX; + HBUINT8 ppemY; + HBUINT8 bitDepth; + HBINT8 flags; public: DEFINE_SIZE_STATIC(48); @@ -300,8 +300,8 @@ struct BitmapSizeTable struct GlyphBitmapDataFormat17 { SmallGlyphMetrics glyphMetrics; - UINT32 dataLen; - UINT8 dataZ[VAR]; + HBUINT32 dataLen; + HBUINT8 dataZ[VAR]; DEFINE_SIZE_ARRAY(9, dataZ); }; @@ -379,8 +379,8 @@ struct CBDT { upem = face->get_upem(); - cblc_blob = Sanitizer<CBLC>::sanitize (face->reference_table (HB_OT_TAG_CBLC)); - cbdt_blob = Sanitizer<CBDT>::sanitize (face->reference_table (HB_OT_TAG_CBDT)); + cblc_blob = Sanitizer<CBLC>().sanitize (face->reference_table (HB_OT_TAG_CBLC)); + cbdt_blob = Sanitizer<CBDT>().sanitize (face->reference_table (HB_OT_TAG_CBDT)); cbdt_len = hb_blob_get_length (cbdt_blob); if (hb_blob_get_length (cblc_blob) == 0) { @@ -460,7 +460,7 @@ struct CBDT protected: FixedVersion<>version; - UINT8 dataZ[VAR]; + HBUINT8 dataZ[VAR]; public: DEFINE_SIZE_ARRAY(4, dataZ); 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 883d7b3f0b2..b9d6e248ae9 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 @@ -58,10 +58,10 @@ struct CmapSubtableFormat0 } protected: - UINT16 format; /* Format number is set to 0. */ - UINT16 lengthZ; /* Byte length of this subtable. */ - UINT16 languageZ; /* Ignore. */ - UINT8 glyphIdArray[256];/* An array that maps character + 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 * code to glyph index values. */ public: DEFINE_SIZE_STATIC (6 + 256); @@ -88,8 +88,8 @@ struct CmapSubtableFormat4 /* Custom two-array bsearch. */ int min = 0, max = (int) thiz->segCount - 1; - const UINT16 *startCount = thiz->startCount; - const UINT16 *endCount = thiz->endCount; + const HBUINT16 *startCount = thiz->startCount; + const HBUINT16 *endCount = thiz->endCount; unsigned int i; while (min <= max) { @@ -127,11 +127,11 @@ struct CmapSubtableFormat4 return true; } - const UINT16 *endCount; - const UINT16 *startCount; - const UINT16 *idDelta; - const UINT16 *idRangeOffset; - const UINT16 *glyphIdArray; + const HBUINT16 *endCount; + const HBUINT16 *startCount; + const HBUINT16 *idDelta; + const HBUINT16 *idRangeOffset; + const HBUINT16 *glyphIdArray; unsigned int segCount; unsigned int glyphIdArrayLength; }; @@ -165,24 +165,24 @@ struct CmapSubtableFormat4 } protected: - UINT16 format; /* Format number is set to 4. */ - UINT16 length; /* This is the length in bytes of the + HBUINT16 format; /* Format number is set to 4. */ + HBUINT16 length; /* This is the length in bytes of the * subtable. */ - UINT16 languageZ; /* Ignore. */ - UINT16 segCountX2; /* 2 x segCount. */ - UINT16 searchRangeZ; /* 2 * (2**floor(log2(segCount))) */ - UINT16 entrySelectorZ; /* log2(searchRange/2) */ - UINT16 rangeShiftZ; /* 2 x segCount - searchRange */ + HBUINT16 languageZ; /* Ignore. */ + HBUINT16 segCountX2; /* 2 x segCount. */ + HBUINT16 searchRangeZ; /* 2 * (2**floor(log2(segCount))) */ + HBUINT16 entrySelectorZ; /* log2(searchRange/2) */ + HBUINT16 rangeShiftZ; /* 2 x segCount - searchRange */ - UINT16 values[VAR]; + HBUINT16 values[VAR]; #if 0 - UINT16 endCount[segCount]; /* End characterCode for each segment, + HBUINT16 endCount[segCount]; /* End characterCode for each segment, * last=0xFFFFu. */ - UINT16 reservedPad; /* Set to 0. */ - UINT16 startCount[segCount]; /* Start character code for each segment. */ - INT16 idDelta[segCount]; /* Delta for all character codes in segment. */ - UINT16 idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */ - UINT16 glyphIdArray[VAR]; /* Glyph index array (arbitrary length) */ + HBUINT16 reservedPad; /* Set to 0. */ + HBUINT16 startCount[segCount]; /* Start character code for each segment. */ + HBINT16 idDelta[segCount]; /* Delta for all character codes in segment. */ + HBUINT16 idRangeOffset[segCount];/* Offsets into glyphIdArray or 0 */ + HBUINT16 glyphIdArray[VAR]; /* Glyph index array (arbitrary length) */ #endif public: @@ -208,9 +208,9 @@ struct CmapSubtableLongGroup } private: - UINT32 startCharCode; /* First character code in this group. */ - UINT32 endCharCode; /* Last character code in this group. */ - UINT32 glyphID; /* Glyph index; interpretation depends on + HBUINT32 startCharCode; /* First character code in this group. */ + HBUINT32 endCharCode; /* Last character code in this group. */ + HBUINT32 glyphID; /* Glyph index; interpretation depends on * subtable format. */ public: DEFINE_SIZE_STATIC (12); @@ -247,8 +247,8 @@ struct CmapSubtableTrimmed DEFINE_SIZE_ARRAY (5 * sizeof (UINT), glyphIdArray); }; -struct CmapSubtableFormat6 : CmapSubtableTrimmed<UINT16> {}; -struct CmapSubtableFormat10 : CmapSubtableTrimmed<UINT32 > {}; +struct CmapSubtableFormat6 : CmapSubtableTrimmed<HBUINT16> {}; +struct CmapSubtableFormat10 : CmapSubtableTrimmed<HBUINT32 > {}; template <typename T> struct CmapSubtableLongSegmented @@ -269,11 +269,11 @@ struct CmapSubtableLongSegmented } protected: - UINT16 format; /* Subtable format; set to 12. */ - UINT16 reservedZ; /* Reserved; set to 0. */ - UINT32 lengthZ; /* Byte length of this subtable. */ - UINT32 languageZ; /* Ignore. */ - SortedArrayOf<CmapSubtableLongGroup, UINT32> + HBUINT16 format; /* Subtable format; set to 12. */ + HBUINT16 reservedZ; /* Reserved; set to 0. */ + HBUINT32 lengthZ; /* Byte length of this subtable. */ + HBUINT32 languageZ; /* Ignore. */ + SortedArrayOf<CmapSubtableLongGroup, HBUINT32> groups; /* Groupings. */ public: DEFINE_SIZE_ARRAY (16, groups); @@ -316,13 +316,13 @@ struct UnicodeValueRange } UINT24 startUnicodeValue; /* First value in this range. */ - UINT8 additionalCount; /* Number of additional values in this + HBUINT8 additionalCount; /* Number of additional values in this * range. */ public: DEFINE_SIZE_STATIC (4); }; -typedef SortedArrayOf<UnicodeValueRange, UINT32> DefaultUVS; +typedef SortedArrayOf<UnicodeValueRange, HBUINT32> DefaultUVS; struct UVSMapping { @@ -343,7 +343,7 @@ struct UVSMapping DEFINE_SIZE_STATIC (5); }; -typedef SortedArrayOf<UVSMapping, UINT32> NonDefaultUVS; +typedef SortedArrayOf<UVSMapping, HBUINT32> NonDefaultUVS; struct VariationSelectorRecord { @@ -405,9 +405,9 @@ struct CmapSubtableFormat14 } protected: - UINT16 format; /* Format number is set to 14. */ - UINT32 lengthZ; /* Byte length of this subtable. */ - SortedArrayOf<VariationSelectorRecord, UINT32> + HBUINT16 format; /* Format number is set to 14. */ + HBUINT32 lengthZ; /* Byte length of this subtable. */ + SortedArrayOf<VariationSelectorRecord, HBUINT32> record; /* Variation selector records; sorted * in increasing order of `varSelector'. */ public: @@ -451,7 +451,7 @@ struct CmapSubtable public: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ CmapSubtableFormat0 format0; CmapSubtableFormat4 format4; CmapSubtableFormat6 format6; @@ -484,8 +484,8 @@ struct EncodingRecord subtable.sanitize (c, base)); } - UINT16 platformID; /* Platform ID. */ - UINT16 encodingID; /* Platform-specific encoding ID. */ + HBUINT16 platformID; /* Platform ID. */ + HBUINT16 encodingID; /* Platform-specific encoding ID. */ LOffsetTo<CmapSubtable> subtable; /* Byte offset from beginning of table to the subtable for this encoding. */ public: @@ -508,7 +508,7 @@ struct cmap { inline void init (hb_face_t *face) { - this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap)); + this->blob = OT::Sanitizer<OT::cmap>().sanitize (face->reference_table (HB_OT_TAG_cmap)); const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob); const OT::CmapSubtable *subtable = nullptr; const OT::CmapSubtableFormat14 *subtable_uvs = nullptr; @@ -654,7 +654,7 @@ struct cmap } protected: - UINT16 version; /* Table version number (0). */ + HBUINT16 version; /* Table version number (0). */ SortedArrayOf<EncodingRecord> encodingRecord; /* Encoding tables. */ public: 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 88d3850b6ef..67143c6393a 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 @@ -54,7 +54,7 @@ struct loca } protected: - UINT8 dataX[VAR]; /* Location data. */ + HBUINT8 dataX[VAR]; /* Location data. */ DEFINE_SIZE_ARRAY (0, dataX); }; @@ -80,7 +80,7 @@ struct glyf struct GlyphHeader { - INT16 numberOfContours; /* If the number of contours is + 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. */ @@ -96,7 +96,7 @@ struct glyf { inline void init (hb_face_t *face) { - hb_blob_t *head_blob = Sanitizer<head>::sanitize (face->reference_table (HB_OT_TAG_head)); + hb_blob_t *head_blob = Sanitizer<head>().sanitize (face->reference_table (HB_OT_TAG_head)); const head *head_table = Sanitizer<head>::lock_instance (head_blob); if ((unsigned int) head_table->indexToLocFormat > 1 || head_table->glyphDataFormat != 0) { @@ -107,9 +107,9 @@ struct glyf short_offset = 0 == head_table->indexToLocFormat; hb_blob_destroy (head_blob); - loca_blob = Sanitizer<loca>::sanitize (face->reference_table (HB_OT_TAG_loca)); + loca_blob = Sanitizer<loca>().sanitize (face->reference_table (HB_OT_TAG_loca)); loca_table = Sanitizer<loca>::lock_instance (loca_blob); - glyf_blob = Sanitizer<glyf>::sanitize (face->reference_table (HB_OT_TAG_glyf)); + glyf_blob = Sanitizer<glyf>().sanitize (face->reference_table (HB_OT_TAG_glyf)); glyf_table = Sanitizer<glyf>::lock_instance (glyf_blob); num_glyphs = MAX (1u, hb_blob_get_length (loca_blob) / (short_offset ? 2 : 4)) - 1; @@ -131,13 +131,13 @@ struct glyf unsigned int start_offset, end_offset; if (short_offset) { - const UINT16 *offsets = (const UINT16 *) loca_table->dataX; + const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataX; start_offset = 2 * offsets[glyph]; end_offset = 2 * offsets[glyph + 1]; } else { - const UINT32 *offsets = (const UINT32 *) loca_table->dataX; + const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataX; start_offset = offsets[glyph]; end_offset = offsets[glyph + 1]; } @@ -169,7 +169,7 @@ struct glyf }; protected: - UINT8 dataX[VAR]; /* Glyphs data. */ + HBUINT8 dataX[VAR]; /* Glyphs data. */ DEFINE_SIZE_ARRAY (0, dataX); }; 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 dd4349ef85a..2024cea7e78 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 @@ -64,11 +64,11 @@ struct head FixedVersion<>version; /* Version of the head table--currently * 0x00010000u for version 1.0. */ FixedVersion<>fontRevision; /* Set by font manufacturer. */ - UINT32 checkSumAdjustment; /* To compute: set it to 0, sum the - * entire font as UINT32, then store + HBUINT32 checkSumAdjustment; /* To compute: set it to 0, sum the + * entire font as HBUINT32, then store * 0xB1B0AFBAu - sum. */ - UINT32 magicNumber; /* Set to 0x5F0F3CF5u. */ - UINT16 flags; /* Bit 0: Baseline for font at y=0; + HBUINT32 magicNumber; /* Set to 0x5F0F3CF5u. */ + HBUINT16 flags; /* Bit 0: Baseline for font at y=0; * Bit 1: Left sidebearing point at x=0; * Bit 2: Instructions may depend on point size; * Bit 3: Force ppem to integer values for all @@ -76,7 +76,6 @@ struct head * ppem sizes if this bit is clear; * Bit 4: Instructions may alter advance width * (the advance widths might not scale linearly); - * Bits 5-10: These should be set according to * Apple's specification. However, they are not * implemented in OpenType. @@ -96,7 +95,6 @@ struct head * contains any strong right-to-left glyphs. * Bit 10: This bit should be set if the font * contains Indic-style rearrangement effects. - * Bit 11: Font data is 'lossless,' as a result * of having been compressed and decompressed * with the Agfa MicroType Express engine. @@ -114,18 +112,18 @@ struct head * encoded in the cmap subtables represent proper * support for those code points. * Bit 15: Reserved, set to 0. */ - UINT16 unitsPerEm; /* Valid range is from 16 to 16384. This value + HBUINT16 unitsPerEm; /* Valid range is from 16 to 16384. This value * should be a power of 2 for fonts that have * TrueType outlines. */ LONGDATETIME created; /* Number of seconds since 12:00 midnight, January 1, 1904. 64-bit integer */ LONGDATETIME modified; /* Number of seconds since 12:00 midnight, January 1, 1904. 64-bit integer */ - INT16 xMin; /* For all glyph bounding boxes. */ - INT16 yMin; /* For all glyph bounding boxes. */ - INT16 xMax; /* For all glyph bounding boxes. */ - INT16 yMax; /* For all glyph bounding boxes. */ - UINT16 macStyle; /* Bit 0: Bold (if set to 1); + HBINT16 xMin; /* For all glyph bounding boxes. */ + HBINT16 yMin; /* For all glyph bounding boxes. */ + HBINT16 xMax; /* For all glyph bounding boxes. */ + HBINT16 yMax; /* For all glyph bounding boxes. */ + HBUINT16 macStyle; /* Bit 0: Bold (if set to 1); * Bit 1: Italic (if set to 1) * Bit 2: Underline (if set to 1) * Bit 3: Outline (if set to 1) @@ -133,16 +131,16 @@ struct head * Bit 5: Condensed (if set to 1) * Bit 6: Extended (if set to 1) * Bits 7-15: Reserved (set to 0). */ - UINT16 lowestRecPPEM; /* Smallest readable size in pixels. */ - INT16 fontDirectionHint; /* Deprecated (Set to 2). + HBUINT16 lowestRecPPEM; /* Smallest readable size in pixels. */ + HBINT16 fontDirectionHint; /* Deprecated (Set to 2). * 0: Fully mixed directional glyphs; * 1: Only strongly left to right; * 2: Like 1 but also contains neutrals; * -1: Only strongly right to left; * -2: Like -1 but also contains neutrals. */ public: - INT16 indexToLocFormat; /* 0 for short offsets, 1 for long. */ - INT16 glyphDataFormat; /* 0 for current format. */ + HBINT16 indexToLocFormat; /* 0 for short offsets, 1 for long. */ + HBINT16 glyphDataFormat; /* 0 for current format. */ DEFINE_SIZE_STATIC (54); }; 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 dca014148ea..54eb5eb7732 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 @@ -64,21 +64,21 @@ struct _hea * (xMax - xMin)) for horizontal. */ FWORD maxExtent; /* horizontal: Max(lsb + (xMax - xMin)), * vertical: minLeadingBearing+(yMax-yMin). */ - INT16 caretSlopeRise; /* Used to calculate the slope of the + HBINT16 caretSlopeRise; /* Used to calculate the slope of the * cursor (rise/run); 1 for vertical caret, * 0 for horizontal.*/ - INT16 caretSlopeRun; /* 0 for vertical caret, 1 for horizontal. */ - INT16 caretOffset; /* The amount by which a slanted + HBINT16 caretSlopeRun; /* 0 for vertical caret, 1 for horizontal. */ + HBINT16 caretOffset; /* The amount by which a slanted * highlight on a glyph needs * to be shifted to produce the * best appearance. Set to 0 for * non-slanted fonts. */ - INT16 reserved1; /* Set to 0. */ - INT16 reserved2; /* Set to 0. */ - INT16 reserved3; /* Set to 0. */ - INT16 reserved4; /* Set to 0. */ - INT16 metricDataFormat; /* 0 for current format. */ - UINT16 numberOfLongMetrics; /* Number of LongMetric entries in metric + HBINT16 reserved1; /* Set to 0. */ + HBINT16 reserved2; /* Set to 0. */ + HBINT16 reserved3; /* Set to 0. */ + HBINT16 reserved4; /* Set to 0. */ + HBINT16 metricDataFormat; /* 0 for current format. */ + HBUINT16 numberOfLongMetrics; /* Number of LongMetric entries in metric * table. */ public: DEFINE_SIZE_STATIC (36); 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 e710aee42ec..934acde7792 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 @@ -74,7 +74,7 @@ struct hmtxvmtx 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,7 +87,7 @@ struct hmtxvmtx hb_blob_destroy (os2_blob); } - hb_blob_t *_hea_blob = Sanitizer<_hea>::sanitize (face->reference_table (T::headerTag)); + hb_blob_t *_hea_blob = Sanitizer<_hea>().sanitize (face->reference_table (T::headerTag)); const _hea *_hea_table = Sanitizer<_hea>::lock_instance (_hea_blob); num_advances = _hea_table->numberOfLongMetrics; if (!got_font_extents) @@ -101,7 +101,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 +119,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); } @@ -144,7 +144,7 @@ struct hmtxvmtx } return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance - + var_table->get_advance_var (glyph, font->coords, font->num_coords); // TODO Optimize?! + + (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?! } public: diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh index e07faca63f3..368f547a693 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh @@ -104,8 +104,8 @@ struct KernClassTable } protected: - UINT16 firstGlyph; /* First glyph in class range. */ - ArrayOf<UINT16> classes; /* Glyph classes. */ + HBUINT16 firstGlyph; /* First glyph in class range. */ + ArrayOf<HBUINT16> classes; /* Glyph classes. */ public: DEFINE_SIZE_ARRAY (4, classes); }; @@ -115,7 +115,7 @@ struct KernSubTableFormat2 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 r = (this+rightClassTable).get_class (right); 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)) @@ -136,7 +136,7 @@ struct KernSubTableFormat2 } protected: - UINT16 rowWidth; /* The width, in bytes, of a row in the table. */ + HBUINT16 rowWidth; /* The width, in bytes, of a row in the table. */ OffsetTo<KernClassTable> leftClassTable; /* Offset from beginning of this subtable to * left-hand class table. */ @@ -275,19 +275,19 @@ struct KernOT : KernTable<KernOT> }; protected: - UINT16 versionZ; /* Unused. */ - UINT16 length; /* Length of the subtable (including this header). */ - UINT8 format; /* Subtable format. */ - UINT8 coverage; /* Coverage bits. */ + HBUINT16 versionZ; /* Unused. */ + HBUINT16 length; /* Length of the subtable (including this header). */ + HBUINT8 format; /* Subtable format. */ + HBUINT8 coverage; /* Coverage bits. */ KernSubTable subtable; /* Subtable data. */ public: DEFINE_SIZE_MIN (6); }; protected: - UINT16 version; /* Version--0x0000u */ - UINT16 nTables; /* Number of subtables in the kerning table. */ - UINT8 data[VAR]; + HBUINT16 version; /* Version--0x0000u */ + HBUINT16 nTables; /* Number of subtables in the kerning table. */ + HBUINT8 data[VAR]; public: DEFINE_SIZE_ARRAY (4, data); }; @@ -314,10 +314,10 @@ struct KernAAT : KernTable<KernAAT> }; protected: - UINT32 length; /* Length of the subtable (including this header). */ - UINT8 coverage; /* Coverage bits. */ - UINT8 format; /* Subtable format. */ - UINT16 tupleIndex; /* The tuple index (used for variations fonts). + HBUINT32 length; /* Length of the subtable (including this header). */ + HBUINT8 coverage; /* Coverage bits. */ + HBUINT8 format; /* Subtable format. */ + HBUINT16 tupleIndex; /* The tuple index (used for variations fonts). * This value specifies which tuple this subtable covers. */ KernSubTable subtable; /* Subtable data. */ public: @@ -325,9 +325,9 @@ struct KernAAT : KernTable<KernAAT> }; protected: - UINT32 version; /* Version--0x00010000u */ - UINT32 nTables; /* Number of subtables in the kerning table. */ - UINT8 data[VAR]; + HBUINT32 version; /* Version--0x00010000u */ + HBUINT32 nTables; /* Number of subtables in the kerning table. */ + HBUINT8 data[VAR]; public: DEFINE_SIZE_ARRAY (8, data); }; @@ -360,7 +360,7 @@ struct kern { inline void init (hb_face_t *face) { - blob = Sanitizer<kern>::sanitize (face->reference_table (HB_OT_TAG_kern)); + blob = Sanitizer<kern>().sanitize (face->reference_table (HB_OT_TAG_kern)); table = Sanitizer<kern>::lock_instance (blob); table_length = hb_blob_get_length (blob); } @@ -380,7 +380,7 @@ struct kern protected: union { - UINT16 major; + HBUINT16 major; KernOT ot; KernAAT aat; } u; 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 5e699e1967f..31c436a09dd 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 @@ -161,7 +161,7 @@ struct RangeRecord GlyphID start; /* First GlyphID in the range */ GlyphID end; /* Last GlyphID in the range */ - UINT16 value; /* Value */ + HBUINT16 value; /* Value */ public: DEFINE_SIZE_STATIC (6); }; @@ -175,7 +175,7 @@ struct IndexArray : ArrayOf<Index> unsigned int *_indexes /* OUT */) const { if (_count) { - const UINT16 *arr = this->sub_array (start_offset, _count); + const HBUINT16 *arr = this->sub_array (start_offset, _count); unsigned int count = *_count; for (unsigned int i = 0; i < count; i++) _indexes[i] = arr[i]; @@ -218,7 +218,7 @@ struct LangSys Offset16 lookupOrderZ; /* = Null (reserved for an offset to a * reordering table) */ - UINT16 reqFeatureIndex;/* Index of a feature required for this + HBUINT16 reqFeatureIndex;/* Index of a feature required for this * language system--if no required features * = 0xFFFFu */ IndexArray featureIndex; /* Array of indices into the FeatureList */ @@ -343,12 +343,12 @@ struct FeatureParamsSize return_trace (true); } - UINT16 designSize; /* Represents the design size in 720/inch + HBUINT16 designSize; /* Represents the design size in 720/inch * units (decipoints). The design size entry * must be non-zero. When there is a design * size but no recommended size range, the * rest of the array will consist of zeros. */ - UINT16 subfamilyID; /* Has no independent meaning, but serves + HBUINT16 subfamilyID; /* Has no independent meaning, but serves * as an identifier that associates fonts * in a subfamily. All fonts which share a * Preferred or Font Family name and which @@ -358,7 +358,7 @@ struct FeatureParamsSize * same subfamily value. If this value is * zero, the remaining fields in the array * will be ignored. */ - UINT16 subfamilyNameID;/* If the preceding value is non-zero, this + HBUINT16 subfamilyNameID;/* If the preceding value is non-zero, this * value must be set in the range 256 - 32767 * (inclusive). It records the value of a * field in the name table, which must @@ -372,10 +372,10 @@ struct FeatureParamsSize * subfamily in a menu. Applications will * choose the appropriate version based on * their selection criteria. */ - UINT16 rangeStart; /* Large end of the recommended usage range + HBUINT16 rangeStart; /* Large end of the recommended usage range * (inclusive), stored in 720/inch units * (decipoints). */ - UINT16 rangeEnd; /* Small end of the recommended usage range + HBUINT16 rangeEnd; /* Small end of the recommended usage range (exclusive), stored in 720/inch units * (decipoints). */ public: @@ -393,12 +393,12 @@ struct FeatureParamsStylisticSet return_trace (c->check_struct (this)); } - UINT16 version; /* (set to 0): This corresponds to a “minor” + HBUINT16 version; /* (set to 0): This corresponds to a “minor” * version number. Additional data may be * added to the end of this Feature Parameters * table in the future. */ - UINT16 uiNameID; /* The 'name' table name ID that specifies a + HBUINT16 uiNameID; /* The 'name' table name ID that specifies a * string (or strings, for multiple languages) * for a user-interface label for this * feature. The values of uiLabelNameId and @@ -426,25 +426,25 @@ struct FeatureParamsCharacterVariants characters.sanitize (c)); } - UINT16 format; /* Format number is set to 0. */ - UINT16 featUILableNameID; /* The ‘name’ table name ID that + HBUINT16 format; /* Format number is set to 0. */ + HBUINT16 featUILableNameID; /* The ‘name’ table name ID that * specifies a string (or strings, * for multiple languages) for a * user-interface label for this * feature. (May be nullptr.) */ - UINT16 featUITooltipTextNameID;/* The ‘name’ table name ID that + HBUINT16 featUITooltipTextNameID;/* The ‘name’ table name ID that * specifies a string (or strings, * for multiple languages) that an * application can use for tooltip * text for this feature. (May be * nullptr.) */ - UINT16 sampleTextNameID; /* The ‘name’ table name ID that + HBUINT16 sampleTextNameID; /* The ‘name’ table name ID that * specifies sample text that * illustrates the effect of this * feature. (May be nullptr.) */ - UINT16 numNamedParameters; /* Number of named parameters. (May + HBUINT16 numNamedParameters; /* Number of named parameters. (May * be zero.) */ - UINT16 firstParamUILabelNameID;/* The first ‘name’ table name ID + HBUINT16 firstParamUILabelNameID;/* The first ‘name’ table name ID * used to specify strings for * user-interface labels for the * feature parameters. (Must be zero @@ -562,7 +562,7 @@ struct Feature typedef RecordListOf<Feature> FeatureList; -struct LookupFlag : UINT16 +struct LookupFlag : HBUINT16 { enum Flags { RightToLeft = 0x0001u, @@ -608,7 +608,7 @@ struct Lookup unsigned int flag = lookupFlag; if (unlikely (flag & LookupFlag::UseMarkFilteringSet)) { - const UINT16 &markFilteringSet = StructAfter<UINT16> (subTable); + const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable); flag += (markFilteringSet << 16); } return flag; @@ -640,7 +640,7 @@ struct Lookup if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false); if (lookupFlag & LookupFlag::UseMarkFilteringSet) { - UINT16 &markFilteringSet = StructAfter<UINT16> (subTable); + HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable); markFilteringSet.set (lookup_props >> 16); } return_trace (true); @@ -653,18 +653,18 @@ struct Lookup if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false); if (lookupFlag & LookupFlag::UseMarkFilteringSet) { - const UINT16 &markFilteringSet = StructAfter<UINT16> (subTable); + const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable); if (!markFilteringSet.sanitize (c)) return_trace (false); } return_trace (true); } private: - UINT16 lookupType; /* Different enumerations for GSUB and GPOS */ - UINT16 lookupFlag; /* Lookup qualifiers */ + HBUINT16 lookupType; /* Different enumerations for GSUB and GPOS */ + HBUINT16 lookupFlag; /* Lookup qualifiers */ ArrayOf<Offset16> subTable; /* Array of SubTables */ - UINT16 markFilteringSetX[VAR]; /* Index (base 0) into GDEF mark glyph sets + HBUINT16 markFilteringSetX[VAR]; /* Index (base 0) into GDEF mark glyph sets * structure. This field is only present if bit * UseMarkFilteringSet of lookup flags is set. */ public: @@ -735,7 +735,7 @@ struct CoverageFormat1 private: protected: - UINT16 coverageFormat; /* Format identifier--format = 1 */ + HBUINT16 coverageFormat; /* Format identifier--format = 1 */ SortedArrayOf<GlyphID> glyphArray; /* Array of GlyphIDs--in numerical order */ public: @@ -860,7 +860,7 @@ struct CoverageFormat2 private: protected: - UINT16 coverageFormat; /* Format identifier--format = 2 */ + HBUINT16 coverageFormat; /* Format identifier--format = 2 */ SortedArrayOf<RangeRecord> rangeRecord; /* Array of glyph ranges--ordered by * Start GlyphID. rangeCount entries @@ -874,8 +874,8 @@ struct Coverage inline unsigned int get_coverage (hb_codepoint_t glyph_id) const { switch (u.format) { - case 1: return u.format1.get_coverage(glyph_id); - case 2: return u.format2.get_coverage(glyph_id); + case 1: return u.format1.get_coverage (glyph_id); + case 2: return u.format2.get_coverage (glyph_id); default:return NOT_COVERED; } } @@ -987,7 +987,7 @@ struct Coverage protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ CoverageFormat1 format1; CoverageFormat2 format2; } u; @@ -1074,9 +1074,9 @@ struct ClassDefFormat1 } protected: - UINT16 classFormat; /* Format identifier--format = 1 */ + HBUINT16 classFormat; /* Format identifier--format = 1 */ GlyphID startGlyph; /* First GlyphID of the classValueArray */ - ArrayOf<UINT16> + ArrayOf<HBUINT16> classValue; /* Array of Class Values--one per GlyphID */ public: DEFINE_SIZE_ARRAY (6, classValue); @@ -1148,7 +1148,7 @@ struct ClassDefFormat2 } protected: - UINT16 classFormat; /* Format identifier--format = 2 */ + HBUINT16 classFormat; /* Format identifier--format = 2 */ SortedArrayOf<RangeRecord> rangeRecord; /* Array of glyph ranges--ordered by * Start GlyphID */ @@ -1161,8 +1161,8 @@ struct ClassDef inline unsigned int get_class (hb_codepoint_t glyph_id) const { switch (u.format) { - case 1: return u.format1.get_class(glyph_id); - case 2: return u.format2.get_class(glyph_id); + case 1: return u.format1.get_class (glyph_id); + case 2: return u.format2.get_class (glyph_id); default:return 0; } } @@ -1210,7 +1210,7 @@ struct ClassDef protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ ClassDefFormat1 format1; ClassDefFormat2 format2; } u; @@ -1275,10 +1275,11 @@ struct VarRegionList const VarRegionAxis *axes = axesZ + (region_index * axisCount); float v = 1.; - unsigned int count = MIN (coord_len, (unsigned int) axisCount); + unsigned int count = axisCount; for (unsigned int i = 0; i < count; i++) { - float factor = axes[i].evaluate (coords[i]); + int coord = i < coord_len ? coords[i] : 0; + float factor = axes[i].evaluate (coord); if (factor == 0.) return 0.; v *= factor; @@ -1295,8 +1296,8 @@ struct VarRegionList } protected: - UINT16 axisCount; - UINT16 regionCount; + HBUINT16 axisCount; + HBUINT16 regionCount; VarRegionAxis axesZ[VAR]; public: DEFINE_SIZE_ARRAY (4, axesZ); @@ -1320,19 +1321,19 @@ struct VarData unsigned int count = regionIndices.len; unsigned int scount = shortCount; - const UINT8 *bytes = &StructAfter<UINT8> (regionIndices); - const UINT8 *row = bytes + inner * (scount + count); + const HBUINT8 *bytes = &StructAfter<HBUINT8> (regionIndices); + const HBUINT8 *row = bytes + inner * (scount + count); float delta = 0.; unsigned int i = 0; - const INT16 *scursor = reinterpret_cast<const INT16 *> (row); + const HBINT16 *scursor = reinterpret_cast<const HBINT16 *> (row); for (; i < scount; i++) { float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count); delta += scalar * *scursor++; } - const INT8 *bcursor = reinterpret_cast<const INT8 *> (scursor); + const HBINT8 *bcursor = reinterpret_cast<const HBINT8 *> (scursor); for (; i < count; i++) { float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count); @@ -1348,15 +1349,15 @@ struct VarData return_trace (c->check_struct (this) && regionIndices.sanitize(c) && shortCount <= regionIndices.len && - c->check_array (&StructAfter<UINT8> (regionIndices), + c->check_array (&StructAfter<HBUINT8> (regionIndices), get_row_size (), itemCount)); } protected: - UINT16 itemCount; - UINT16 shortCount; - ArrayOf<UINT16> regionIndices; - UINT8 bytesX[VAR]; + HBUINT16 itemCount; + HBUINT16 shortCount; + ArrayOf<HBUINT16> regionIndices; + HBUINT8 bytesX[VAR]; public: DEFINE_SIZE_ARRAY2 (6, regionIndices, bytesX); }; @@ -1392,9 +1393,9 @@ struct VariationStore } protected: - UINT16 format; + HBUINT16 format; LOffsetTo<VarRegionList> regions; - OffsetArrayOf<VarData, UINT32> dataSets; + OffsetArrayOf<VarData, HBUINT32> dataSets; public: DEFINE_SIZE_ARRAY (8, dataSets); }; @@ -1421,8 +1422,8 @@ struct ConditionFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ - UINT16 axisIndex; + HBUINT16 format; /* Format identifier--format = 1 */ + HBUINT16 axisIndex; F2DOT14 filterRangeMinValue; F2DOT14 filterRangeMaxValue; public: @@ -1451,7 +1452,7 @@ struct Condition protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ ConditionFormat1 format1; } u; public: @@ -1476,7 +1477,7 @@ struct ConditionSet } protected: - OffsetArrayOf<Condition, UINT32> conditions; + OffsetArrayOf<Condition, HBUINT32> conditions; public: DEFINE_SIZE_ARRAY (2, conditions); }; @@ -1492,7 +1493,7 @@ struct FeatureTableSubstitutionRecord } protected: - UINT16 featureIndex; + HBUINT16 featureIndex; LOffsetTo<Feature> feature; public: DEFINE_SIZE_STATIC (6); @@ -1612,8 +1613,8 @@ struct HintingDevice inline unsigned int get_size (void) const { unsigned int f = deltaFormat; - if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * UINT16::static_size; - return UINT16::static_size * (4 + ((endSize - startSize) >> (4 - f))); + if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size; + return HBUINT16::static_size * (4 + ((endSize - startSize) >> (4 - f))); } inline bool sanitize (hb_sanitize_context_t *c) const @@ -1658,14 +1659,14 @@ struct HintingDevice } protected: - UINT16 startSize; /* Smallest size to correct--in ppem */ - UINT16 endSize; /* Largest size to correct--in ppem */ - UINT16 deltaFormat; /* Format of DeltaValue array data: 1, 2, or 3 + HBUINT16 startSize; /* Smallest size to correct--in ppem */ + HBUINT16 endSize; /* Largest size to correct--in ppem */ + HBUINT16 deltaFormat; /* Format of DeltaValue array data: 1, 2, or 3 * 1 Signed 2-bit value, 8 values per uint16 * 2 Signed 4-bit value, 4 values per uint16 * 3 Signed 8-bit value, 2 values per uint16 */ - UINT16 deltaValue[VAR]; /* Array of compressed data */ + HBUINT16 deltaValue[VAR]; /* Array of compressed data */ public: DEFINE_SIZE_ARRAY (6, deltaValue); }; @@ -1696,9 +1697,9 @@ struct VariationDevice } protected: - UINT16 outerIndex; - UINT16 innerIndex; - UINT16 deltaFormat; /* Format identifier for this table: 0x0x8000 */ + HBUINT16 outerIndex; + HBUINT16 innerIndex; + HBUINT16 deltaFormat; /* Format identifier for this table: 0x0x8000 */ public: DEFINE_SIZE_STATIC (6); }; @@ -1706,10 +1707,10 @@ struct VariationDevice struct DeviceHeader { protected: - UINT16 reserved1; - UINT16 reserved2; + HBUINT16 reserved1; + HBUINT16 reserved2; public: - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ public: DEFINE_SIZE_STATIC (6); }; 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 eed46dd6728..aad7d60290d 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 @@ -41,7 +41,7 @@ namespace OT { * Attachment List Table */ -typedef ArrayOf<UINT16> AttachPoint; /* Array of contour point indices--in +typedef ArrayOf<HBUINT16> AttachPoint; /* Array of contour point indices--in * increasing numerical order */ struct AttachList @@ -62,7 +62,7 @@ struct AttachList const AttachPoint &points = this+attachPoint[index]; if (point_count) { - const UINT16 *array = points.sub_array (start_offset, point_count); + const HBUINT16 *array = points.sub_array (start_offset, point_count); unsigned int count = *point_count; for (unsigned int i = 0; i < count; i++) point_array[i] = array[i]; @@ -109,8 +109,8 @@ struct CaretValueFormat1 } protected: - UINT16 caretValueFormat; /* Format identifier--format = 1 */ - INT16 coordinate; /* X or Y value, in design units */ + HBUINT16 caretValueFormat; /* Format identifier--format = 1 */ + HBINT16 coordinate; /* X or Y value, in design units */ public: DEFINE_SIZE_STATIC (4); }; @@ -136,8 +136,8 @@ struct CaretValueFormat2 } protected: - UINT16 caretValueFormat; /* Format identifier--format = 2 */ - UINT16 caretValuePoint; /* Contour point index on glyph */ + HBUINT16 caretValueFormat; /* Format identifier--format = 2 */ + HBUINT16 caretValuePoint; /* Contour point index on glyph */ public: DEFINE_SIZE_STATIC (4); }; @@ -160,8 +160,8 @@ struct CaretValueFormat3 } protected: - UINT16 caretValueFormat; /* Format identifier--format = 3 */ - INT16 coordinate; /* X or Y value, in design units */ + HBUINT16 caretValueFormat; /* 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 CaretValue @@ -199,7 +199,7 @@ struct CaretValue protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ CaretValueFormat1 format1; CaretValueFormat2 format2; CaretValueFormat3 format3; @@ -294,7 +294,7 @@ struct MarkGlyphSetsFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ ArrayOf<LOffsetTo<Coverage> > coverage; /* Array of long offsets to mark set * coverage tables */ @@ -324,7 +324,7 @@ struct MarkGlyphSets protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ MarkGlyphSetsFormat1 format1; } u; public: 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 b344d793c7c..3ef3d30b084 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 @@ -51,11 +51,11 @@ enum attach_type_t { /* Shared Tables: ValueRecord, Anchor Table, and MarkArray */ -typedef UINT16 Value; +typedef HBUINT16 Value; typedef Value ValueRecord[VAR]; -struct ValueFormat : UINT16 +struct ValueFormat : HBUINT16 { enum Flags { xPlacement = 0x0001u, /* Includes horizontal adjustment for placement */ @@ -74,14 +74,14 @@ struct ValueFormat : UINT16 /* All fields are options. Only those available advance the value pointer. */ #if 0 - INT16 xPlacement; /* Horizontal adjustment for + HBINT16 xPlacement; /* Horizontal adjustment for * placement--in design units */ - INT16 yPlacement; /* Vertical adjustment for + HBINT16 yPlacement; /* Vertical adjustment for * placement--in design units */ - INT16 xAdvance; /* Horizontal adjustment for + HBINT16 xAdvance; /* Horizontal adjustment for * advance--in design units (only used * for horizontal writing) */ - INT16 yAdvance; /* Vertical adjustment for advance--in + HBINT16 yAdvance; /* Vertical adjustment for advance--in * design units (only used for vertical * writing) */ Offset xPlaDevice; /* Offset to Device table for @@ -103,7 +103,7 @@ struct ValueFormat : UINT16 inline unsigned int get_size (void) const { return get_len () * Value::static_size; } - void apply_value (hb_apply_context_t *c, + void apply_value (hb_ot_apply_context_t *c, const void *base, const Value *values, hb_glyph_position_t &glyph_pos) const @@ -178,8 +178,8 @@ struct ValueFormat : UINT16 static inline const OffsetTo<Device>& get_device (const Value* value) { return *CastP<OffsetTo<Device> > (value); } - static inline const INT16& get_short (const Value* value) - { return *CastP<INT16> (value); } + static inline const HBINT16& get_short (const Value* value) + { return *CastP<HBINT16> (value); } public: @@ -232,12 +232,12 @@ struct ValueFormat : UINT16 struct AnchorFormat1 { - inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED, - hb_position_t *x, hb_position_t *y) const + inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED, + float *x, float *y) const { hb_font_t *font = c->font; - *x = font->em_scale_x (xCoordinate); - *y = font->em_scale_y (yCoordinate); + *x = font->em_fscale_x (xCoordinate); + *y = font->em_fscale_y (yCoordinate); } inline bool sanitize (hb_sanitize_context_t *c) const @@ -247,17 +247,17 @@ struct AnchorFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ - INT16 xCoordinate; /* Horizontal value--in design units */ - INT16 yCoordinate; /* Vertical value--in design units */ + HBUINT16 format; /* Format identifier--format = 1 */ + HBINT16 xCoordinate; /* Horizontal value--in design units */ + HBINT16 yCoordinate; /* Vertical value--in design units */ public: DEFINE_SIZE_STATIC (6); }; struct AnchorFormat2 { - inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id, - hb_position_t *x, hb_position_t *y) const + inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id, + float *x, float *y) const { hb_font_t *font = c->font; unsigned int x_ppem = font->x_ppem; @@ -267,8 +267,8 @@ struct AnchorFormat2 ret = (x_ppem || y_ppem) && font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy); - *x = ret && x_ppem ? cx : font->em_scale_x (xCoordinate); - *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate); + *x = ret && x_ppem ? cx : font->em_fscale_x (xCoordinate); + *y = ret && y_ppem ? cy : font->em_fscale_y (yCoordinate); } inline bool sanitize (hb_sanitize_context_t *c) const @@ -278,22 +278,22 @@ struct AnchorFormat2 } protected: - UINT16 format; /* Format identifier--format = 2 */ - INT16 xCoordinate; /* Horizontal value--in design units */ - INT16 yCoordinate; /* Vertical value--in design units */ - UINT16 anchorPoint; /* Index to glyph contour point */ + HBUINT16 format; /* Format identifier--format = 2 */ + HBINT16 xCoordinate; /* Horizontal value--in design units */ + HBINT16 yCoordinate; /* Vertical value--in design units */ + HBUINT16 anchorPoint; /* Index to glyph contour point */ public: DEFINE_SIZE_STATIC (8); }; struct AnchorFormat3 { - inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED, - hb_position_t *x, hb_position_t *y) const + inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED, + float *x, float *y) const { hb_font_t *font = c->font; - *x = font->em_scale_x (xCoordinate); - *y = font->em_scale_y (yCoordinate); + *x = font->em_fscale_x (xCoordinate); + *y = font->em_fscale_y (yCoordinate); if (font->x_ppem || font->num_coords) *x += (this+xDeviceTable).get_x_delta (font, c->var_store); @@ -308,9 +308,9 @@ struct AnchorFormat3 } protected: - UINT16 format; /* Format identifier--format = 3 */ - INT16 xCoordinate; /* Horizontal value--in design units */ - INT16 yCoordinate; /* Vertical value--in design units */ + HBUINT16 format; /* Format identifier--format = 3 */ + HBINT16 xCoordinate; /* Horizontal value--in design units */ + HBINT16 yCoordinate; /* Vertical value--in design units */ OffsetTo<Device> xDeviceTable; /* Offset to Device table for X * coordinate-- from beginning of @@ -325,15 +325,15 @@ struct AnchorFormat3 struct Anchor { - inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id, - hb_position_t *x, hb_position_t *y) const + inline void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id, + float *x, float *y) const { *x = *y = 0; switch (u.format) { case 1: u.format1.get_anchor (c, glyph_id, x, y); return; case 2: u.format2.get_anchor (c, glyph_id, x, y); return; case 3: u.format3.get_anchor (c, glyph_id, x, y); return; - default: return; + default: return; } } @@ -351,7 +351,7 @@ struct Anchor protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ AnchorFormat1 format1; AnchorFormat2 format2; AnchorFormat3 format3; @@ -382,7 +382,7 @@ struct AnchorMatrix return_trace (true); } - UINT16 rows; /* Number of rows */ + HBUINT16 rows; /* Number of rows */ protected: OffsetTo<Anchor> matrixZ[VAR]; /* Matrix of offsets to Anchor tables-- @@ -403,7 +403,7 @@ struct MarkRecord } protected: - UINT16 klass; /* Class defined for this mark */ + HBUINT16 klass; /* Class defined for this mark */ OffsetTo<Anchor> markAnchor; /* Offset to Anchor table--from * beginning of MarkArray table */ @@ -413,7 +413,7 @@ struct MarkRecord struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage order */ { - inline bool apply (hb_apply_context_t *c, + inline bool apply (hb_ot_apply_context_t *c, unsigned int mark_index, unsigned int glyph_index, const AnchorMatrix &anchors, unsigned int class_count, unsigned int glyph_pos) const @@ -430,15 +430,15 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde * return false such that the subsequent subtables have a chance at it. */ if (unlikely (!found)) return_trace (false); - hb_position_t mark_x, mark_y, base_x, base_y; + float mark_x, mark_y, base_x, base_y; buffer->unsafe_to_break (glyph_pos, buffer->idx); mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y); glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y); hb_glyph_position_t &o = buffer->cur_pos(); - o.x_offset = base_x - mark_x; - o.y_offset = base_y - mark_y; + o.x_offset = round (base_x - mark_x); + o.y_offset = round (base_y - mark_y); o.attach_type() = ATTACH_TYPE_MARK; o.attach_chain() = (int) glyph_pos - (int) buffer->idx; buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; @@ -470,7 +470,7 @@ struct SinglePosFormat1 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; @@ -492,7 +492,7 @@ struct SinglePosFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of subtable */ @@ -518,7 +518,7 @@ struct SinglePosFormat2 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; @@ -544,13 +544,13 @@ struct SinglePosFormat2 } protected: - UINT16 format; /* Format identifier--format = 2 */ + HBUINT16 format; /* Format identifier--format = 2 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of subtable */ ValueFormat valueFormat; /* Defines the types of data in the * ValueRecord */ - UINT16 valueCount; /* Number of ValueRecords */ + HBUINT16 valueCount; /* Number of ValueRecords */ ValueRecord values; /* Array of ValueRecords--positioning * values applied to glyphs */ public: @@ -573,7 +573,7 @@ struct SinglePos protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ SinglePosFormat1 format1; SinglePosFormat2 format2; } u; @@ -604,13 +604,13 @@ struct PairSet TRACE_COLLECT_GLYPHS (this); unsigned int len1 = valueFormats[0].get_len (); unsigned int len2 = valueFormats[1].get_len (); - unsigned int record_size = UINT16::static_size * (1 + len1 + len2); + unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); const PairValueRecord *record = CastP<PairValueRecord> (arrayZ); c->input->add_array (&record->secondGlyph, len, record_size); } - inline bool apply (hb_apply_context_t *c, + inline bool apply (hb_ot_apply_context_t *c, const ValueFormat *valueFormats, unsigned int pos) const { @@ -618,7 +618,7 @@ struct PairSet hb_buffer_t *buffer = c->buffer; unsigned int len1 = valueFormats[0].get_len (); unsigned int len2 = valueFormats[1].get_len (); - unsigned int record_size = UINT16::static_size * (1 + len1 + len2); + unsigned int record_size = HBUINT16::static_size * (1 + len1 + len2); const PairValueRecord *record_array = CastP<PairValueRecord> (arrayZ); unsigned int count = len; @@ -663,7 +663,7 @@ struct PairSet { TRACE_SANITIZE (this); if (!(c->check_struct (this) - && c->check_array (arrayZ, UINT16::static_size * closure->stride, len))) return_trace (false); + && c->check_array (arrayZ, HBUINT16::static_size * closure->stride, len))) return_trace (false); unsigned int count = len; const PairValueRecord *record = CastP<PairValueRecord> (arrayZ); @@ -672,8 +672,8 @@ struct PairSet } protected: - UINT16 len; /* Number of PairValueRecords */ - UINT16 arrayZ[VAR]; /* Array of PairValueRecords--ordered + HBUINT16 len; /* Number of PairValueRecords */ + HBUINT16 arrayZ[VAR]; /* Array of PairValueRecords--ordered * by GlyphID of the second glyph */ public: DEFINE_SIZE_ARRAY (2, arrayZ); @@ -695,14 +695,14 @@ struct PairPosFormat1 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); if (!skippy_iter.next ()) return_trace (false); @@ -728,7 +728,7 @@ struct PairPosFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of subtable */ @@ -759,14 +759,14 @@ struct PairPosFormat2 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); if (!skippy_iter.next ()) return_trace (false); @@ -809,7 +809,7 @@ struct PairPosFormat2 } protected: - UINT16 format; /* Format identifier--format = 2 */ + HBUINT16 format; /* Format identifier--format = 2 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of subtable */ @@ -827,9 +827,9 @@ struct PairPosFormat2 classDef2; /* Offset to ClassDef table--from * beginning of PairPos subtable--for * the second glyph of the pair */ - UINT16 class1Count; /* Number of classes in ClassDef1 + HBUINT16 class1Count; /* Number of classes in ClassDef1 * table--includes Class0 */ - UINT16 class2Count; /* Number of classes in ClassDef2 + HBUINT16 class2Count; /* Number of classes in ClassDef2 * table--includes Class0 */ ValueRecord values; /* Matrix of value pairs: * class1-major, class2-minor, @@ -854,7 +854,7 @@ struct PairPos protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ PairPosFormat1 format1; PairPosFormat2 format2; } u; @@ -900,7 +900,7 @@ struct CursivePosFormat1 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; @@ -908,7 +908,7 @@ struct CursivePosFormat1 const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)]; if (!this_record.exitAnchor) return_trace (false); - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); if (!skippy_iter.next ()) return_trace (false); @@ -919,7 +919,7 @@ struct CursivePosFormat1 unsigned int j = skippy_iter.idx; buffer->unsafe_to_break (i, j); - hb_position_t entry_x, entry_y, exit_x, exit_y; + float entry_x, entry_y, exit_x, exit_y; (this+this_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y); (this+next_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y); @@ -929,32 +929,32 @@ struct CursivePosFormat1 /* Main-direction adjustment */ switch (c->direction) { case HB_DIRECTION_LTR: - pos[i].x_advance = exit_x + pos[i].x_offset; + pos[i].x_advance = round (exit_x) + pos[i].x_offset; - d = entry_x + pos[j].x_offset; + d = round (entry_x) + pos[j].x_offset; pos[j].x_advance -= d; pos[j].x_offset -= d; break; case HB_DIRECTION_RTL: - d = exit_x + pos[i].x_offset; + d = round (exit_x) + pos[i].x_offset; pos[i].x_advance -= d; pos[i].x_offset -= d; - pos[j].x_advance = entry_x + pos[j].x_offset; + pos[j].x_advance = round (entry_x) + pos[j].x_offset; break; case HB_DIRECTION_TTB: - pos[i].y_advance = exit_y + pos[i].y_offset; + pos[i].y_advance = round (exit_y) + pos[i].y_offset; - d = entry_y + pos[j].y_offset; + d = round (entry_y) + pos[j].y_offset; pos[j].y_advance -= d; pos[j].y_offset -= d; break; case HB_DIRECTION_BTT: - d = exit_y + pos[i].y_offset; + d = round (exit_y) + pos[i].y_offset; pos[i].y_advance -= d; pos[i].y_offset -= d; - pos[j].y_advance = entry_y; + pos[j].y_advance = round (entry_y); break; case HB_DIRECTION_INVALID: default: @@ -1008,7 +1008,7 @@ struct CursivePosFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of subtable */ @@ -1034,7 +1034,7 @@ struct CursivePos protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ CursivePosFormat1 format1; } u; }; @@ -1059,7 +1059,7 @@ struct MarkBasePosFormat1 return this+markCoverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; @@ -1067,7 +1067,7 @@ struct MarkBasePosFormat1 if (likely (mark_index == NOT_COVERED)) return_trace (false); /* Now we search backwards for a non-mark glyph */ - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); do { @@ -1099,14 +1099,14 @@ struct MarkBasePosFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> markCoverage; /* Offset to MarkCoverage table--from * beginning of MarkBasePos subtable */ OffsetTo<Coverage> baseCoverage; /* Offset to BaseCoverage table--from * beginning of MarkBasePos subtable */ - UINT16 classCount; /* Number of classes defined for marks */ + HBUINT16 classCount; /* Number of classes defined for marks */ OffsetTo<MarkArray> markArray; /* Offset to MarkArray table--from * beginning of MarkBasePos subtable */ @@ -1132,7 +1132,7 @@ struct MarkBasePos protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ MarkBasePosFormat1 format1; } u; }; @@ -1162,7 +1162,7 @@ struct MarkLigPosFormat1 return this+markCoverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; @@ -1170,7 +1170,7 @@ struct MarkLigPosFormat1 if (likely (mark_index == NOT_COVERED)) return_trace (false); /* Now we search backwards for a non-mark glyph */ - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); if (!skippy_iter.prev ()) return_trace (false); @@ -1216,7 +1216,7 @@ struct MarkLigPosFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> markCoverage; /* Offset to Mark Coverage table--from * beginning of MarkLigPos subtable */ @@ -1224,7 +1224,7 @@ struct MarkLigPosFormat1 ligatureCoverage; /* Offset to Ligature Coverage * table--from beginning of MarkLigPos * subtable */ - UINT16 classCount; /* Number of defined mark classes */ + HBUINT16 classCount; /* Number of defined mark classes */ OffsetTo<MarkArray> markArray; /* Offset to MarkArray table--from * beginning of MarkLigPos subtable */ @@ -1250,7 +1250,7 @@ struct MarkLigPos protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ MarkLigPosFormat1 format1; } u; }; @@ -1275,7 +1275,7 @@ struct MarkMarkPosFormat1 return this+mark1Coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; @@ -1283,7 +1283,7 @@ struct MarkMarkPosFormat1 if (likely (mark1_index == NOT_COVERED)) return_trace (false); /* now we search backwards for a suitable mark glyph until a non-mark glyph */ - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags); if (!skippy_iter.prev ()) return_trace (false); @@ -1330,7 +1330,7 @@ struct MarkMarkPosFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> mark1Coverage; /* Offset to Combining Mark1 Coverage * table--from beginning of MarkMarkPos @@ -1339,7 +1339,7 @@ struct MarkMarkPosFormat1 mark2Coverage; /* Offset to Combining Mark2 Coverage * table--from beginning of MarkMarkPos * subtable */ - UINT16 classCount; /* Number of defined mark classes */ + HBUINT16 classCount; /* Number of defined mark classes */ OffsetTo<MarkArray> mark1Array; /* Offset to Mark1Array table--from * beginning of MarkMarkPos subtable */ @@ -1365,7 +1365,7 @@ struct MarkMarkPos protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ MarkMarkPosFormat1 format1; } u; }; @@ -1424,7 +1424,7 @@ struct PosLookupSubTable protected: union { - UINT16 sub_format; + HBUINT16 sub_format; SinglePos single; PairPos pair; CursivePos cursive; @@ -1450,7 +1450,7 @@ struct PosLookup : Lookup return false; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); return_trace (dispatch (c)); @@ -1469,7 +1469,7 @@ struct PosLookup : Lookup dispatch (&c); } - static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index); + static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); template <typename context_t> static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); @@ -1621,7 +1621,7 @@ template <typename context_t> return l.dispatch (c); } -/*static*/ inline bool PosLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index) +/*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) { const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos); const PosLookup &l = gpos.get_lookup (lookup_index); 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 0b09c4e4a1a..263e0a6e102 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 @@ -76,7 +76,7 @@ struct SingleSubstFormat1 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_codepoint_t glyph_id = c->buffer->cur().codepoint; @@ -110,11 +110,11 @@ struct SingleSubstFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of Substitution table */ - INT16 deltaGlyphID; /* Add to original GlyphID to get + HBINT16 deltaGlyphID; /* Add to original GlyphID to get * substitute GlyphID */ public: DEFINE_SIZE_STATIC (6); @@ -161,7 +161,7 @@ struct SingleSubstFormat2 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_codepoint_t glyph_id = c->buffer->cur().codepoint; @@ -195,7 +195,7 @@ struct SingleSubstFormat2 } protected: - UINT16 format; /* Format identifier--format = 2 */ + HBUINT16 format; /* Format identifier--format = 2 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of Substitution table */ @@ -249,7 +249,7 @@ struct SingleSubst protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ SingleSubstFormat1 format1; SingleSubstFormat2 format2; } u; @@ -272,7 +272,7 @@ struct Sequence c->output->add_array (substitute.array, substitute.len); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int count = substitute.len; @@ -363,7 +363,7 @@ struct MultipleSubstFormat1 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); @@ -398,7 +398,7 @@ struct MultipleSubstFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of Substitution table */ @@ -440,7 +440,7 @@ struct MultipleSubst protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ MultipleSubstFormat1 format1; } u; }; @@ -495,7 +495,7 @@ struct AlternateSubstFormat1 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_codepoint_t glyph_id = c->buffer->cur().codepoint; @@ -548,7 +548,7 @@ struct AlternateSubstFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of Substitution table */ @@ -590,7 +590,7 @@ struct AlternateSubst protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ AlternateSubstFormat1 format1; } u; }; @@ -628,7 +628,7 @@ struct Ligature return_trace (true); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int count = component.len; @@ -730,7 +730,7 @@ struct LigatureSet return_trace (false); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int num_ligs = ligature.len; @@ -821,7 +821,7 @@ struct LigatureSubstFormat1 return_trace (lig_set.would_apply (c)); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); hb_codepoint_t glyph_id = c->buffer->cur().codepoint; @@ -862,7 +862,7 @@ struct LigatureSubstFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of Substitution table */ @@ -912,7 +912,7 @@ struct LigatureSubst protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ LigatureSubstFormat1 format1; } u; }; @@ -993,7 +993,7 @@ struct ReverseChainSingleSubstFormat1 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL)) @@ -1007,11 +1007,11 @@ struct ReverseChainSingleSubstFormat1 unsigned int start_index = 0, end_index = 0; if (match_backtrack (c, - backtrack.len, (UINT16 *) backtrack.array, + backtrack.len, (HBUINT16 *) backtrack.array, match_coverage, this, &start_index) && match_lookahead (c, - lookahead.len, (UINT16 *) lookahead.array, + lookahead.len, (HBUINT16 *) lookahead.array, match_coverage, this, 1, &end_index)) { @@ -1039,7 +1039,7 @@ struct ReverseChainSingleSubstFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of table */ @@ -1073,7 +1073,7 @@ struct ReverseChainSingleSubst protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ ReverseChainSingleSubstFormat1 format1; } u; }; @@ -1119,7 +1119,7 @@ struct SubstLookupSubTable protected: union { - UINT16 sub_format; + HBUINT16 sub_format; SingleSubst single; MultipleSubst multiple; AlternateSubst alternate; @@ -1150,7 +1150,7 @@ struct SubstLookup : Lookup return lookup_type_is_reverse (type); } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); return_trace (dispatch (c)); @@ -1186,7 +1186,7 @@ struct SubstLookup : Lookup return_trace (dispatch (c)); } - static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index); + static bool apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index); inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c, unsigned int i) @@ -1272,10 +1272,9 @@ struct SubstLookup : Lookup { /* The spec says all subtables of an Extension lookup should * have the same type, which shall not be the Extension type - * itself. This is specially important if one has a reverse type! */ + * itself (but we already checked for that). + * This is specially important if one has a reverse type! */ unsigned int type = get_subtable (0).u.extension.get_type (); - if (unlikely (type == SubstLookupSubTable::Extension)) - return_trace (false); unsigned int count = get_subtable_count (); for (unsigned int i = 1; i < count; i++) if (get_subtable (i).u.extension.get_type () != type) @@ -1344,7 +1343,7 @@ template <typename context_t> return l.dispatch (c); } -/*static*/ inline bool SubstLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index) +/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) { const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub); const SubstLookup &l = gsub.get_lookup (lookup_index); 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 b08a59138e3..8a005f5a27a 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 @@ -218,8 +218,8 @@ struct hb_add_coverage_context_t : }; -struct hb_apply_context_t : - hb_dispatch_context_t<hb_apply_context_t, bool, HB_DEBUG_APPLY> +struct hb_ot_apply_context_t : + hb_dispatch_context_t<hb_ot_apply_context_t, bool, HB_DEBUG_APPLY> { struct matcher_t { @@ -234,7 +234,7 @@ struct hb_apply_context_t : match_func (nullptr), match_data (nullptr) {}; - typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const UINT16 &value, const void *data); + typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data); inline void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; } inline void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; } @@ -252,7 +252,7 @@ struct hb_apply_context_t : }; inline may_match_t may_match (const hb_glyph_info_t &info, - const UINT16 *glyph_data) const + const HBUINT16 *glyph_data) const { if (!(info.mask & mask) || (syllable && syllable != info.syllable ())) @@ -271,7 +271,7 @@ struct hb_apply_context_t : }; inline may_skip_t - may_skip (const hb_apply_context_t *c, + may_skip (const hb_ot_apply_context_t *c, const hb_glyph_info_t &info) const { if (!c->check_glyph_property (&info, lookup_props)) @@ -297,7 +297,7 @@ struct hb_apply_context_t : struct skipping_iterator_t { - inline void init (hb_apply_context_t *c_, bool context_match = false) + inline void init (hb_ot_apply_context_t *c_, bool context_match = false) { c = c_; match_glyph_data = nullptr; @@ -315,7 +315,7 @@ struct hb_apply_context_t : } inline void set_match_func (matcher_t::match_func_t match_func_, const void *match_data_, - const UINT16 glyph_data[]) + const HBUINT16 glyph_data[]) { matcher.set_match_func (match_func_, match_data_); match_glyph_data = glyph_data; @@ -333,8 +333,7 @@ struct hb_apply_context_t : inline void reject (void) { num_items++; match_glyph_data--; } inline matcher_t::may_skip_t - may_skip (const hb_apply_context_t *c, - const hb_glyph_info_t &info) const + may_skip (const hb_glyph_info_t &info) const { return matcher.may_skip (c, info); } @@ -396,9 +395,9 @@ struct hb_apply_context_t : unsigned int idx; protected: - hb_apply_context_t *c; + hb_ot_apply_context_t *c; matcher_t matcher; - const UINT16 *match_glyph_data; + const HBUINT16 *match_glyph_data; unsigned int num_items; unsigned int end; @@ -406,18 +405,18 @@ struct hb_apply_context_t : inline const char *get_name (void) { return "APPLY"; } - typedef return_t (*recurse_func_t) (hb_apply_context_t *c, unsigned int lookup_index); + typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index); template <typename T> inline return_t dispatch (const T &obj) { return obj.apply (this); } static return_t default_return_value (void) { return false; } bool stop_sublookup_iteration (return_t r) const { return r; } - return_t recurse (unsigned int lookup_index) + return_t recurse (unsigned int sub_lookup_index) { if (unlikely (nesting_level_left == 0 || !recurse_func || buffer->max_ops-- <= 0)) return default_return_value (); nesting_level_left--; - bool ret = recurse_func (this, lookup_index); + bool ret = recurse_func (this, sub_lookup_index); nesting_level_left++; return ret; } @@ -444,7 +443,7 @@ struct hb_apply_context_t : bool has_glyph_classes; - hb_apply_context_t (unsigned int table_index_, + hb_ot_apply_context_t (unsigned int table_index_, hb_font_t *font_, hb_buffer_t *buffer_) : iter_input (), iter_context (), @@ -568,9 +567,9 @@ struct hb_apply_context_t : -typedef bool (*intersects_func_t) (hb_set_t *glyphs, const UINT16 &value, const void *data); -typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const UINT16 &value, const void *data); -typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const UINT16 &value, const void *data); +typedef bool (*intersects_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data); +typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, const HBUINT16 &value, const void *data); +typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data); struct ContextClosureFuncs { @@ -586,16 +585,16 @@ struct ContextApplyFuncs }; -static inline bool intersects_glyph (hb_set_t *glyphs, const UINT16 &value, const void *data HB_UNUSED) +static inline bool intersects_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED) { return glyphs->has (value); } -static inline bool intersects_class (hb_set_t *glyphs, const UINT16 &value, const void *data) +static inline bool intersects_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data) { const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data); return class_def.intersects_class (glyphs, value); } -static inline bool intersects_coverage (hb_set_t *glyphs, const UINT16 &value, const void *data) +static inline bool intersects_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data) { const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value; return (data+coverage).intersects (glyphs); @@ -603,7 +602,7 @@ static inline bool intersects_coverage (hb_set_t *glyphs, const UINT16 &value, c static inline bool intersects_array (hb_closure_context_t *c, unsigned int count, - const UINT16 values[], + const HBUINT16 values[], intersects_func_t intersects_func, const void *intersects_data) { @@ -614,16 +613,16 @@ static inline bool intersects_array (hb_closure_context_t *c, } -static inline void collect_glyph (hb_set_t *glyphs, const UINT16 &value, const void *data HB_UNUSED) +static inline void collect_glyph (hb_set_t *glyphs, const HBUINT16 &value, const void *data HB_UNUSED) { glyphs->add (value); } -static inline void collect_class (hb_set_t *glyphs, const UINT16 &value, const void *data) +static inline void collect_class (hb_set_t *glyphs, const HBUINT16 &value, const void *data) { const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data); class_def.add_class (glyphs, value); } -static inline void collect_coverage (hb_set_t *glyphs, const UINT16 &value, const void *data) +static inline void collect_coverage (hb_set_t *glyphs, const HBUINT16 &value, const void *data) { const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value; (data+coverage).add_coverage (glyphs); @@ -631,7 +630,7 @@ static inline void collect_coverage (hb_set_t *glyphs, const UINT16 &value, cons static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED, hb_set_t *glyphs, unsigned int count, - const UINT16 values[], + const HBUINT16 values[], collect_glyphs_func_t collect_func, const void *collect_data) { @@ -640,16 +639,16 @@ static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED, } -static inline bool match_glyph (hb_codepoint_t glyph_id, const UINT16 &value, const void *data HB_UNUSED) +static inline bool match_glyph (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data HB_UNUSED) { return glyph_id == value; } -static inline bool match_class (hb_codepoint_t glyph_id, const UINT16 &value, const void *data) +static inline bool match_class (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data) { const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data); return class_def.get_class (glyph_id) == value; } -static inline bool match_coverage (hb_codepoint_t glyph_id, const UINT16 &value, const void *data) +static inline bool match_coverage (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data) { const OffsetTo<Coverage> &coverage = (const OffsetTo<Coverage>&)value; return (data+coverage).get_coverage (glyph_id) != NOT_COVERED; @@ -657,7 +656,7 @@ static inline bool match_coverage (hb_codepoint_t glyph_id, const UINT16 &value, static inline bool would_match_input (hb_would_apply_context_t *c, unsigned int count, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ match_func_t match_func, const void *match_data) { @@ -670,9 +669,9 @@ static inline bool would_match_input (hb_would_apply_context_t *c, return true; } -static inline bool match_input (hb_apply_context_t *c, +static inline bool match_input (hb_ot_apply_context_t *c, unsigned int count, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ match_func_t match_func, const void *match_data, unsigned int *end_offset, @@ -686,7 +685,7 @@ static inline bool match_input (hb_apply_context_t *c, hb_buffer_t *buffer = c->buffer; - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, count - 1); skippy_iter.set_match_func (match_func, match_data, input); @@ -763,7 +762,7 @@ static inline bool match_input (hb_apply_context_t *c, j--; } - if (found && skippy_iter.may_skip (c, out[j]) == hb_apply_context_t::matcher_t::SKIP_YES) + if (found && skippy_iter.may_skip (out[j]) == hb_ot_apply_context_t::matcher_t::SKIP_YES) ligbase = LIGBASE_MAY_SKIP; else ligbase = LIGBASE_MAY_NOT_SKIP; @@ -796,7 +795,7 @@ static inline bool match_input (hb_apply_context_t *c, return_trace (true); } -static inline bool ligate_input (hb_apply_context_t *c, +static inline bool ligate_input (hb_ot_apply_context_t *c, unsigned int count, /* Including the first glyph */ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */ unsigned int match_length, @@ -894,16 +893,16 @@ static inline bool ligate_input (hb_apply_context_t *c, return_trace (true); } -static inline bool match_backtrack (hb_apply_context_t *c, +static inline bool match_backtrack (hb_ot_apply_context_t *c, unsigned int count, - const UINT16 backtrack[], + const HBUINT16 backtrack[], match_func_t match_func, const void *match_data, unsigned int *match_start) { TRACE_APPLY (nullptr); - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; skippy_iter.reset (c->buffer->backtrack_len (), count); skippy_iter.set_match_func (match_func, match_data, backtrack); @@ -916,9 +915,9 @@ static inline bool match_backtrack (hb_apply_context_t *c, return_trace (true); } -static inline bool match_lookahead (hb_apply_context_t *c, +static inline bool match_lookahead (hb_ot_apply_context_t *c, unsigned int count, - const UINT16 lookahead[], + const HBUINT16 lookahead[], match_func_t match_func, const void *match_data, unsigned int offset, @@ -926,7 +925,7 @@ static inline bool match_lookahead (hb_apply_context_t *c, { TRACE_APPLY (nullptr); - hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; skippy_iter.reset (c->buffer->idx + offset - 1, count); skippy_iter.set_match_func (match_func, match_data, lookahead); @@ -949,9 +948,9 @@ struct LookupRecord return_trace (c->check_struct (this)); } - UINT16 sequenceIndex; /* Index into current glyph + HBUINT16 sequenceIndex; /* Index into current glyph * sequence--first glyph = 0 */ - UINT16 lookupListIndex; /* Lookup to apply to that + HBUINT16 lookupListIndex; /* Lookup to apply to that * position--zero--based */ public: DEFINE_SIZE_STATIC (4); @@ -967,7 +966,7 @@ static inline void recurse_lookups (context_t *c, c->recurse (lookupRecord[i].lookupListIndex); } -static inline bool apply_lookup (hb_apply_context_t *c, +static inline bool apply_lookup (hb_ot_apply_context_t *c, unsigned int count, /* Including the first glyph */ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */ unsigned int lookupCount, @@ -1112,7 +1111,7 @@ struct ContextApplyLookupContext static inline void context_closure_lookup (hb_closure_context_t *c, unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookupCount, const LookupRecord lookupRecord[], ContextClosureLookupContext &lookup_context) @@ -1126,7 +1125,7 @@ static inline void context_closure_lookup (hb_closure_context_t *c, static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookupCount, const LookupRecord lookupRecord[], ContextCollectGlyphsLookupContext &lookup_context) @@ -1140,7 +1139,7 @@ static inline void context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c static inline bool context_would_apply_lookup (hb_would_apply_context_t *c, unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, ContextApplyLookupContext &lookup_context) @@ -1149,9 +1148,9 @@ static inline bool context_would_apply_lookup (hb_would_apply_context_t *c, inputCount, input, lookup_context.funcs.match, lookup_context.match_data); } -static inline bool context_apply_lookup (hb_apply_context_t *c, +static inline bool context_apply_lookup (hb_ot_apply_context_t *c, unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookupCount, const LookupRecord lookupRecord[], ContextApplyLookupContext &lookup_context) @@ -1198,7 +1197,7 @@ struct Rule return_trace (context_would_apply_lookup (c, inputCount, inputZ, lookupCount, lookupRecord, lookup_context)); } - inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const + inline bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (inputZ, inputZ[0].static_size * (inputCount ? inputCount - 1 : 0)); @@ -1217,11 +1216,11 @@ struct Rule } protected: - UINT16 inputCount; /* Total number of glyphs in input + HBUINT16 inputCount; /* Total number of glyphs in input * glyph sequence--includes the first * glyph */ - UINT16 lookupCount; /* Number of LookupRecords */ - UINT16 inputZ[VAR]; /* Array of match inputs--start with + HBUINT16 lookupCount; /* Number of LookupRecords */ + HBUINT16 inputZ[VAR]; /* Array of match inputs--start with * second glyph */ LookupRecord lookupRecordX[VAR]; /* Array of LookupRecords--in * design order */ @@ -1259,7 +1258,7 @@ struct RuleSet return_trace (false); } - inline bool apply (hb_apply_context_t *c, ContextApplyLookupContext &lookup_context) const + inline bool apply (hb_ot_apply_context_t *c, ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); unsigned int num_rules = rule.len; @@ -1339,7 +1338,7 @@ struct ContextFormat1 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); @@ -1361,7 +1360,7 @@ struct ContextFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of table */ @@ -1431,7 +1430,7 @@ struct ContextFormat2 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); @@ -1454,7 +1453,7 @@ struct ContextFormat2 } protected: - UINT16 format; /* Format identifier--format = 2 */ + HBUINT16 format; /* Format identifier--format = 2 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of table */ @@ -1483,7 +1482,7 @@ struct ContextFormat3 this }; context_closure_lookup (c, - glyphCount, (const UINT16 *) (coverageZ + 1), + glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context); } @@ -1500,7 +1499,7 @@ struct ContextFormat3 }; context_collect_glyphs_lookup (c, - glyphCount, (const UINT16 *) (coverageZ + 1), + glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context); } @@ -1514,7 +1513,7 @@ struct ContextFormat3 {match_coverage}, this }; - return_trace (context_would_apply_lookup (c, glyphCount, (const UINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context)); + return_trace (context_would_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context)); } inline const Coverage &get_coverage (void) const @@ -1522,7 +1521,7 @@ struct ContextFormat3 return this+coverageZ[0]; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int index = (this+coverageZ[0]).get_coverage (c->buffer->cur().codepoint); @@ -1533,7 +1532,7 @@ struct ContextFormat3 {match_coverage}, this }; - return_trace (context_apply_lookup (c, glyphCount, (const UINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context)); + return_trace (context_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ + 1), lookupCount, lookupRecord, lookup_context)); } inline bool sanitize (hb_sanitize_context_t *c) const @@ -1550,10 +1549,10 @@ struct ContextFormat3 } protected: - UINT16 format; /* Format identifier--format = 3 */ - UINT16 glyphCount; /* Number of glyphs in the input glyph + HBUINT16 format; /* Format identifier--format = 3 */ + HBUINT16 glyphCount; /* Number of glyphs in the input glyph * sequence */ - UINT16 lookupCount; /* Number of LookupRecords */ + HBUINT16 lookupCount; /* Number of LookupRecords */ OffsetTo<Coverage> coverageZ[VAR]; /* Array of offsets to Coverage * table in glyph sequence order */ @@ -1580,7 +1579,7 @@ struct Context protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ ContextFormat1 format1; ContextFormat2 format2; ContextFormat3 format3; @@ -1610,11 +1609,11 @@ struct ChainContextApplyLookupContext static inline void chain_context_closure_lookup (hb_closure_context_t *c, unsigned int backtrackCount, - const UINT16 backtrack[], + const HBUINT16 backtrack[], unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookaheadCount, - const UINT16 lookahead[], + const HBUINT16 lookahead[], unsigned int lookupCount, const LookupRecord lookupRecord[], ChainContextClosureLookupContext &lookup_context) @@ -1634,11 +1633,11 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c, static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int backtrackCount, - const UINT16 backtrack[], + const HBUINT16 backtrack[], unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookaheadCount, - const UINT16 lookahead[], + const HBUINT16 lookahead[], unsigned int lookupCount, const LookupRecord lookupRecord[], ChainContextCollectGlyphsLookupContext &lookup_context) @@ -1658,11 +1657,11 @@ static inline void chain_context_collect_glyphs_lookup (hb_collect_glyphs_contex static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c, unsigned int backtrackCount, - const UINT16 backtrack[] HB_UNUSED, + const HBUINT16 backtrack[] HB_UNUSED, unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookaheadCount, - const UINT16 lookahead[] HB_UNUSED, + const HBUINT16 lookahead[] HB_UNUSED, unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, ChainContextApplyLookupContext &lookup_context) @@ -1673,13 +1672,13 @@ static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c lookup_context.funcs.match, lookup_context.match_data[1]); } -static inline bool chain_context_apply_lookup (hb_apply_context_t *c, +static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, unsigned int backtrackCount, - const UINT16 backtrack[], + const HBUINT16 backtrack[], unsigned int inputCount, /* Including the first glyph (not matched) */ - const UINT16 input[], /* Array of input values--start with second glyph */ + const HBUINT16 input[], /* Array of input values--start with second glyph */ unsigned int lookaheadCount, - const UINT16 lookahead[], + const HBUINT16 lookahead[], unsigned int lookupCount, const LookupRecord lookupRecord[], ChainContextApplyLookupContext &lookup_context) @@ -1710,8 +1709,8 @@ struct ChainRule inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const { TRACE_CLOSURE (this); - const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack); - const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); chain_context_closure_lookup (c, backtrack.len, backtrack.array, @@ -1724,8 +1723,8 @@ struct ChainRule inline void collect_glyphs (hb_collect_glyphs_context_t *c, ChainContextCollectGlyphsLookupContext &lookup_context) const { TRACE_COLLECT_GLYPHS (this); - const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack); - const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); chain_context_collect_glyphs_lookup (c, backtrack.len, backtrack.array, @@ -1738,8 +1737,8 @@ struct ChainRule inline bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { TRACE_WOULD_APPLY (this); - const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack); - const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); return_trace (chain_context_would_apply_lookup (c, backtrack.len, backtrack.array, @@ -1748,11 +1747,11 @@ struct ChainRule lookup.array, lookup_context)); } - inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const + inline bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack); - const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); return_trace (chain_context_apply_lookup (c, backtrack.len, backtrack.array, @@ -1765,23 +1764,23 @@ struct ChainRule { TRACE_SANITIZE (this); if (!backtrack.sanitize (c)) return_trace (false); - const HeadlessArrayOf<UINT16> &input = StructAfter<HeadlessArrayOf<UINT16> > (backtrack); + const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16> > (backtrack); if (!input.sanitize (c)) return_trace (false); - const ArrayOf<UINT16> &lookahead = StructAfter<ArrayOf<UINT16> > (input); + const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16> > (input); if (!lookahead.sanitize (c)) return_trace (false); const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead); return_trace (lookup.sanitize (c)); } protected: - ArrayOf<UINT16> + ArrayOf<HBUINT16> backtrack; /* Array of backtracking values * (to be matched before the input * sequence) */ - HeadlessArrayOf<UINT16> + HeadlessArrayOf<HBUINT16> inputX; /* Array of input values (start with * second glyph) */ - ArrayOf<UINT16> + ArrayOf<HBUINT16> lookaheadX; /* Array of lookahead values's (to be * matched after the input sequence) */ ArrayOf<LookupRecord> @@ -1820,7 +1819,7 @@ struct ChainRuleSet return_trace (false); } - inline bool apply (hb_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const + inline bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); unsigned int num_rules = rule.len; @@ -1897,7 +1896,7 @@ struct ChainContextFormat1 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); @@ -1918,7 +1917,7 @@ struct ChainContextFormat1 } protected: - UINT16 format; /* Format identifier--format = 1 */ + HBUINT16 format; /* Format identifier--format = 1 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of table */ @@ -2001,7 +2000,7 @@ struct ChainContextFormat2 return this+coverage; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); @@ -2033,7 +2032,7 @@ struct ChainContextFormat2 } protected: - UINT16 format; /* Format identifier--format = 2 */ + HBUINT16 format; /* Format identifier--format = 2 */ OffsetTo<Coverage> coverage; /* Offset to Coverage table--from * beginning of table */ @@ -2073,9 +2072,9 @@ struct ChainContextFormat3 {this, this, this} }; chain_context_closure_lookup (c, - backtrack.len, (const UINT16 *) backtrack.array, - input.len, (const UINT16 *) input.array + 1, - lookahead.len, (const UINT16 *) lookahead.array, + backtrack.len, (const HBUINT16 *) backtrack.array, + input.len, (const HBUINT16 *) input.array + 1, + lookahead.len, (const HBUINT16 *) lookahead.array, lookup.len, lookup.array, lookup_context); } @@ -2094,9 +2093,9 @@ struct ChainContextFormat3 {this, this, this} }; chain_context_collect_glyphs_lookup (c, - backtrack.len, (const UINT16 *) backtrack.array, - input.len, (const UINT16 *) input.array + 1, - lookahead.len, (const UINT16 *) lookahead.array, + backtrack.len, (const HBUINT16 *) backtrack.array, + input.len, (const HBUINT16 *) input.array + 1, + lookahead.len, (const HBUINT16 *) lookahead.array, lookup.len, lookup.array, lookup_context); } @@ -2113,9 +2112,9 @@ struct ChainContextFormat3 {this, this, this} }; return_trace (chain_context_would_apply_lookup (c, - backtrack.len, (const UINT16 *) backtrack.array, - input.len, (const UINT16 *) input.array + 1, - lookahead.len, (const UINT16 *) lookahead.array, + backtrack.len, (const HBUINT16 *) backtrack.array, + input.len, (const HBUINT16 *) input.array + 1, + lookahead.len, (const HBUINT16 *) lookahead.array, lookup.len, lookup.array, lookup_context)); } @@ -2125,7 +2124,7 @@ struct ChainContextFormat3 return this+input[0]; } - inline bool apply (hb_apply_context_t *c) const + inline bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack); @@ -2140,9 +2139,9 @@ struct ChainContextFormat3 {this, this, this} }; return_trace (chain_context_apply_lookup (c, - backtrack.len, (const UINT16 *) backtrack.array, - input.len, (const UINT16 *) input.array + 1, - lookahead.len, (const UINT16 *) lookahead.array, + backtrack.len, (const HBUINT16 *) backtrack.array, + input.len, (const HBUINT16 *) input.array + 1, + lookahead.len, (const HBUINT16 *) lookahead.array, lookup.len, lookup.array, lookup_context)); } @@ -2160,7 +2159,7 @@ struct ChainContextFormat3 } protected: - UINT16 format; /* Format identifier--format = 3 */ + HBUINT16 format; /* Format identifier--format = 3 */ OffsetArrayOf<Coverage> backtrack; /* Array of coverage tables * in backtracking sequence, in glyph @@ -2197,7 +2196,7 @@ struct ChainContext protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ ChainContextFormat1 format1; ChainContextFormat2 format2; ChainContextFormat3 format3; @@ -2230,15 +2229,17 @@ struct ExtensionFormat1 inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && extensionOffset != 0); + return_trace (c->check_struct (this) && + extensionOffset != 0 && + extensionLookupType != T::LookupSubTable::Extension); } protected: - UINT16 format; /* Format identifier. Set to 1. */ - UINT16 extensionLookupType; /* Lookup type of subtable referenced + HBUINT16 format; /* Format identifier. Set to 1. */ + HBUINT16 extensionLookupType; /* Lookup type of subtable referenced * by ExtensionOffset (i.e. the * extension subtable). */ - UINT32 extensionOffset; /* Offset to the extension subtable, + HBUINT32 extensionOffset; /* Offset to the extension subtable, * of lookup type subtable. */ public: DEFINE_SIZE_STATIC (8); @@ -2276,7 +2277,7 @@ struct Extension protected: union { - UINT16 format; /* Format identifier */ + HBUINT16 format; /* Format identifier */ ExtensionFormat1<T> format1; } u; }; 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 0f0926f8906..60119629cf5 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 @@ -90,12 +90,12 @@ hb_ot_layout_substitute_start (hb_font_t *font, struct hb_ot_layout_lookup_accelerator_t; namespace OT { - struct hb_apply_context_t; + struct hb_ot_apply_context_t; struct SubstLookup; } HB_INTERNAL void -hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c, +hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c, const OT::SubstLookup &lookup, const hb_ot_layout_lookup_accelerator_t &accel); @@ -130,6 +130,10 @@ namespace OT { struct avar; } +namespace AAT { + struct morx; +} + struct hb_ot_layout_lookup_accelerator_t { template <typename TLookup> @@ -165,6 +169,7 @@ struct hb_ot_layout_t 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::morx> morx; unsigned int gsub_lookup_count; unsigned int gpos_lookup_count; @@ -280,7 +285,11 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer) else if (unlikely (hb_in_range (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN; /* COMBINING GRAPHEME JOINER should not be skipped; at least some times. * https://github.com/harfbuzz/harfbuzz/issues/554 */ - else if (unlikely (u == 0x034Fu)) props |= UPROPS_MASK_HIDDEN; + else if (unlikely (u == 0x034Fu)) + { + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ; + props |= UPROPS_MASK_HIDDEN; + } } else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat))) { @@ -388,6 +397,11 @@ _hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info) == UPROPS_MASK_IGNORABLE) && !_hb_glyph_info_ligated (info); } +static inline void +_hb_glyph_info_unhide (hb_glyph_info_t *info) +{ + info->unicode_props() &= ~ UPROPS_MASK_HIDDEN; +} static inline bool _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info) 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 88458898272..919ecbb4b57 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 @@ -50,18 +50,19 @@ _hb_ot_layout_create (hb_face_t *face) if (unlikely (!layout)) return nullptr; - layout->gdef_blob = OT::Sanitizer<OT::GDEF>::sanitize (face->reference_table (HB_OT_TAG_GDEF)); + layout->gdef_blob = OT::Sanitizer<OT::GDEF>().sanitize (face->reference_table (HB_OT_TAG_GDEF)); layout->gdef = OT::Sanitizer<OT::GDEF>::lock_instance (layout->gdef_blob); - layout->gsub_blob = OT::Sanitizer<OT::GSUB>::sanitize (face->reference_table (HB_OT_TAG_GSUB)); + layout->gsub_blob = OT::Sanitizer<OT::GSUB>().sanitize (face->reference_table (HB_OT_TAG_GSUB)); layout->gsub = OT::Sanitizer<OT::GSUB>::lock_instance (layout->gsub_blob); - layout->gpos_blob = OT::Sanitizer<OT::GPOS>::sanitize (face->reference_table (HB_OT_TAG_GPOS)); + 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->math.init (face); layout->fvar.init (face); layout->avar.init (face); + layout->morx.init (face); { /* @@ -209,6 +210,7 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout) layout->math.fini (); layout->fvar.fini (); layout->avar.fini (); + layout->morx.fini (); free (layout); } @@ -1055,13 +1057,13 @@ struct hb_get_subtables_context_t : OT::hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY> { template <typename Type> - static inline bool apply_to (const void *obj, OT::hb_apply_context_t *c) + static inline bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c) { const Type *typed_obj = (const Type *) obj; return typed_obj->apply (c); } - typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c); + typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_ot_apply_context_t *c); struct hb_applicable_t { @@ -1071,7 +1073,7 @@ struct hb_get_subtables_context_t : apply_func = apply_func_; } - inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); } + inline bool apply (OT::hb_ot_apply_context_t *c) const { return apply_func (obj, c); } private: const void *obj; @@ -1102,7 +1104,7 @@ struct hb_get_subtables_context_t : }; static inline bool -apply_forward (OT::hb_apply_context_t *c, +apply_forward (OT::hb_ot_apply_context_t *c, const hb_ot_layout_lookup_accelerator_t &accel, const hb_get_subtables_context_t::array_t &subtables) { @@ -1132,7 +1134,7 @@ apply_forward (OT::hb_apply_context_t *c, } static inline bool -apply_backward (OT::hb_apply_context_t *c, +apply_backward (OT::hb_ot_apply_context_t *c, const hb_ot_layout_lookup_accelerator_t &accel, const hb_get_subtables_context_t::array_t &subtables) { @@ -1161,7 +1163,7 @@ apply_backward (OT::hb_apply_context_t *c, template <typename Proxy> static inline void -apply_string (OT::hb_apply_context_t *c, +apply_string (OT::hb_ot_apply_context_t *c, const typename Proxy::Lookup &lookup, const hb_ot_layout_lookup_accelerator_t &accel) { @@ -1212,7 +1214,7 @@ inline void hb_ot_map_t::apply (const Proxy &proxy, { const unsigned int table_index = proxy.table_index; unsigned int i = 0; - OT::hb_apply_context_t c (table_index, font, buffer); + OT::hb_ot_apply_context_t c (table_index, font, buffer); c.set_recurse_func (Proxy::Lookup::apply_recurse_func); for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) { @@ -1252,7 +1254,7 @@ void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_ } HB_INTERNAL void -hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c, +hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c, const OT::SubstLookup &lookup, const hb_ot_layout_lookup_accelerator_t &accel) { 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 97b92cc9a8c..a80ac720fe1 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 @@ -198,7 +198,6 @@ struct hb_ot_map_builder_t private: HB_INTERNAL void add_lookups (hb_ot_map_t &m, - hb_face_t *face, unsigned int table_index, unsigned int feature_index, unsigned int variations_index, 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 ea9bde9a662..6f07a7e2281 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 @@ -80,7 +80,6 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, void hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m, - hb_face_t *face, unsigned int table_index, unsigned int feature_index, unsigned int variations_index, @@ -289,14 +288,14 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, { if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX && required_feature_stage[table_index] == stage) - add_lookups (m, face, table_index, + add_lookups (m, table_index, required_feature_index[table_index], variations_index, global_bit_mask); for (unsigned i = 0; i < m.features.len; i++) if (m.features[i].stage[table_index] == stage) - add_lookups (m, face, table_index, + add_lookups (m, table_index, m.features[i].index[table_index], variations_index, m.features[i].mask, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh index 7dc3283a289..571ce01b71e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh @@ -48,7 +48,7 @@ struct MathValueRecord } protected: - INT16 value; /* The X or Y value in design units */ + HBINT16 value; /* The X or Y value in design units */ OffsetTo<Device> deviceTable; /* Offset to the device table - from the * beginning of parent table. May be nullptr. * Suggested format for device table is 1. */ @@ -154,10 +154,10 @@ struct MathConstants } protected: - INT16 percentScaleDown[2]; - UINT16 minHeight[2]; + HBINT16 percentScaleDown[2]; + HBUINT16 minHeight[2]; MathValueRecord mathValueRecords[51]; - INT16 radicalDegreeBottomRaisePercent; + HBINT16 radicalDegreeBottomRaisePercent; public: DEFINE_SIZE_STATIC (214); @@ -279,7 +279,7 @@ struct MathKern } protected: - UINT16 heightCount; + HBUINT16 heightCount; MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at * which the kern value changes. * Sorted by the height value in @@ -425,7 +425,7 @@ struct MathGlyphVariantRecord protected: GlyphID variantGlyph; /* Glyph ID for the variant. */ - UINT16 advanceMeasurement; /* Advance width/height, in design units, of the + HBUINT16 advanceMeasurement; /* Advance width/height, in design units, of the * variant, in the direction of requested * glyph extension. */ @@ -433,7 +433,7 @@ struct MathGlyphVariantRecord DEFINE_SIZE_STATIC (4); }; -struct PartFlags : UINT16 +struct PartFlags : HBUINT16 { enum Flags { Extender = 0x0001u, /* If set, the part can be skipped or repeated. */ @@ -473,15 +473,15 @@ struct MathGlyphPartRecord protected: GlyphID glyph; /* Glyph ID for the part. */ - UINT16 startConnectorLength; /* Advance width/ height of the straight bar + HBUINT16 startConnectorLength; /* Advance width/ height of the straight bar * connector material, in design units, is at * the beginning of the glyph, in the * direction of the extension. */ - UINT16 endConnectorLength; /* Advance width/ height of the straight bar + HBUINT16 endConnectorLength; /* Advance width/ height of the straight bar * connector material, in design units, is at * the end of the glyph, in the direction of * the extension. */ - UINT16 fullAdvance; /* Full advance width/height for this part, + HBUINT16 fullAdvance; /* Full advance width/height for this part, * in the direction of the extension. * In design units. */ PartFlags partFlags; /* Part qualifiers. */ @@ -651,7 +651,7 @@ struct MathVariants } protected: - UINT16 minConnectorOverlap; /* Minimum overlap of connecting + HBUINT16 minConnectorOverlap; /* Minimum overlap of connecting * glyphs during glyph construction, * in design units. */ OffsetTo<Coverage> vertGlyphCoverage; /* Offset to Coverage table - @@ -660,10 +660,10 @@ struct MathVariants OffsetTo<Coverage> horizGlyphCoverage; /* Offset to Coverage table - * from the beginning of MathVariants * table. */ - UINT16 vertGlyphCount; /* Number of glyphs for which + HBUINT16 vertGlyphCount; /* Number of glyphs for which * information is provided for * vertically growing variants. */ - UINT16 horizGlyphCount; /* Number of glyphs for which + HBUINT16 horizGlyphCount; /* Number of glyphs for which * information is provided for * horizontally growing variants. */ 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 f6d283eb14a..54b4f11ce65 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 @@ -60,7 +60,7 @@ struct maxp protected: FixedVersion<>version; /* Version of the maxp table (0.5 or 1.0), * 0x00005000u or 0x00010000u. */ - UINT16 numGlyphs; /* The number of glyphs in the font. */ + HBUINT16 numGlyphs; /* The number of glyphs in the font. */ public: DEFINE_SIZE_STATIC (6); }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh index 4c5b3c0f986..eb013337981 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh @@ -65,12 +65,12 @@ struct NameRecord return_trace (c->check_struct (this) && c->check_range ((char *) base, (unsigned int) length + offset)); } - UINT16 platformID; /* Platform ID. */ - UINT16 encodingID; /* Platform-specific encoding ID. */ - UINT16 languageID; /* Language ID. */ - UINT16 nameID; /* Name ID. */ - UINT16 length; /* String length (in bytes). */ - UINT16 offset; /* String offset from start of storage area (in bytes). */ + HBUINT16 platformID; /* Platform ID. */ + HBUINT16 encodingID; /* Platform-specific encoding ID. */ + HBUINT16 languageID; /* Language ID. */ + HBUINT16 nameID; /* Name ID. */ + HBUINT16 length; /* String length (in bytes). */ + HBUINT16 offset; /* String offset from start of storage area (in bytes). */ public: DEFINE_SIZE_STATIC (12); }; @@ -123,8 +123,8 @@ struct name } /* We only implement format 0 for now. */ - UINT16 format; /* Format selector (=0/1). */ - UINT16 count; /* Number of name records. */ + HBUINT16 format; /* Format selector (=0/1). */ + HBUINT16 count; /* Number of name records. */ Offset16 stringOffset; /* Offset to start of string storage (from start of table). */ NameRecord nameRecord[VAR]; /* The name records where count is the number of records. */ public: 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 aa78f1e0a6b..5bed47013ea 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 @@ -50,50 +50,50 @@ struct os2 } public: - UINT16 version; + HBUINT16 version; /* Version 0 */ - INT16 xAvgCharWidth; - UINT16 usWeightClass; - UINT16 usWidthClass; - UINT16 fsType; - INT16 ySubscriptXSize; - INT16 ySubscriptYSize; - INT16 ySubscriptXOffset; - INT16 ySubscriptYOffset; - INT16 ySuperscriptXSize; - INT16 ySuperscriptYSize; - INT16 ySuperscriptXOffset; - INT16 ySuperscriptYOffset; - INT16 yStrikeoutSize; - INT16 yStrikeoutPosition; - INT16 sFamilyClass; - UINT8 panose[10]; - UINT32 ulUnicodeRange[4]; + 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]; Tag achVendID; - UINT16 fsSelection; - UINT16 usFirstCharIndex; - UINT16 usLastCharIndex; - INT16 sTypoAscender; - INT16 sTypoDescender; - INT16 sTypoLineGap; - UINT16 usWinAscent; - UINT16 usWinDescent; + HBUINT16 fsSelection; + HBUINT16 usFirstCharIndex; + HBUINT16 usLastCharIndex; + HBINT16 sTypoAscender; + HBINT16 sTypoDescender; + HBINT16 sTypoLineGap; + HBUINT16 usWinAscent; + HBUINT16 usWinDescent; /* Version 1 */ - //UINT32 ulCodePageRange1; - //UINT32 ulCodePageRange2; + //HBUINT32 ulCodePageRange1; + //HBUINT32 ulCodePageRange2; /* Version 2 */ - //INT16 sxHeight; - //INT16 sCapHeight; - //UINT16 usDefaultChar; - //UINT16 usBreakChar; - //UINT16 usMaxContext; + //HBINT16 sxHeight; + //HBINT16 sCapHeight; + //HBUINT16 usDefaultChar; + //HBUINT16 usBreakChar; + //HBUINT16 usMaxContext; /* Version 5 */ - //UINT16 usLowerOpticalPointSize; - //UINT16 usUpperOpticalPointSize; + //HBUINT16 usLowerOpticalPointSize; + //HBUINT16 usUpperOpticalPointSize; public: DEFINE_SIZE_STATIC (78); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh index 7f1c2c420f1..9e4792115ea 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh @@ -56,10 +56,10 @@ struct postV2Tail return_trace (glyphNameIndex.sanitize (c)); } - ArrayOf<UINT16>glyphNameIndex; /* This is not an offset, but is the + ArrayOf<HBUINT16>glyphNameIndex; /* This is not an offset, but is the * ordinal number of the glyph in 'post' * string tables. */ - UINT8 namesX[VAR]; /* Glyph names with length bytes [variable] + HBUINT8 namesX[VAR]; /* Glyph names with length bytes [variable] * (a Pascal string). */ DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX); @@ -86,7 +86,7 @@ struct post { inline void init (hb_face_t *face) { - blob = Sanitizer<post>::sanitize (face->reference_table (HB_OT_TAG_post)); + blob = Sanitizer<post>().sanitize (face->reference_table (HB_OT_TAG_post)); const post *table = Sanitizer<post>::lock_instance (blob); unsigned int table_length = hb_blob_get_length (blob); @@ -234,7 +234,7 @@ struct post private: hb_blob_t *blob; uint32_t version; - const ArrayOf<UINT16> *glyphNameIndex; + const ArrayOf<HBUINT16> *glyphNameIndex; hb_prealloced_array_t<uint32_t, 1> index_to_offset; const uint8_t *pool; mutable uint16_t *gids_sorted_by_name; @@ -261,16 +261,16 @@ struct post * from the value of this field. */ FWORD underlineThickness; /* Suggested values for the underline thickness. */ - UINT32 isFixedPitch; /* Set to 0 if the font is proportionally + HBUINT32 isFixedPitch; /* Set to 0 if the font is proportionally * spaced, non-zero if the font is not * proportionally spaced (i.e. monospaced). */ - UINT32 minMemType42; /* Minimum memory usage when an OpenType font + HBUINT32 minMemType42; /* Minimum memory usage when an OpenType font * is downloaded. */ - UINT32 maxMemType42; /* Maximum memory usage when an OpenType font + HBUINT32 maxMemType42; /* Maximum memory usage when an OpenType font * is downloaded. */ - UINT32 minMemType1; /* Minimum memory usage when an OpenType font + HBUINT32 minMemType1; /* Minimum memory usage when an OpenType font * is downloaded as a Type 1 font. */ - UINT32 maxMemType1; /* Maximum memory usage when an OpenType font + HBUINT32 maxMemType1; /* Maximum memory usage when an OpenType font * is downloaded as a Type 1 font. */ /*postV2Tail v2[VAR];*/ DEFINE_SIZE_STATIC (32); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh index d98cde121c4..5a257f042d0 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh @@ -340,7 +340,7 @@ arabic_fallback_plan_shape (arabic_fallback_plan_t *fallback_plan, hb_font_t *font, hb_buffer_t *buffer) { - OT::hb_apply_context_t c (0, font, buffer); + OT::hb_ot_apply_context_t c (0, font, buffer); for (unsigned int i = 0; i < fallback_plan->num_lookups; i++) if (fallback_plan->lookup_array[i]) { c.set_lookup_mask (fallback_plan->mask_array[i]); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc index eb9d36ff1d5..47961bfd55f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc @@ -644,13 +644,15 @@ reorder_marks_arabic (const hb_ot_shape_plan_t *plan, { hb_glyph_info_t *info = buffer->info; + DEBUG_MSG (ARABIC, buffer, "Reordering marks from %d to %d", start, end); + unsigned int i = start; for (unsigned int cc = 220; cc <= 230; cc += 10) { - DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d\n", cc, i); + DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d", cc, i); while (i < end && info_cc(info[i]) < cc) i++; - DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d\n", cc, i); + DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d", cc, i); if (i == end) break; @@ -658,20 +660,17 @@ reorder_marks_arabic (const hb_ot_shape_plan_t *plan, if (info_cc(info[i]) > cc) continue; - /* Technically we should also check "info_cc(info[j]) == cc" - * in the following loop. But not doing it is safe; we might - * end up moving all the 220 MCMs and 230 MCMs together in one - * move and be done. */ unsigned int j = i; - while (j < end && info_is_mcm (info[j])) + while (j < end && info_cc(info[j]) == cc && info_is_mcm (info[j])) j++; - DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d\n", cc, i, j); if (i == j) continue; + DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d", cc, i, j); + /* Shift it! */ - DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d\n", cc, i, j); + DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d", cc, i, j); hb_glyph_info_t temp[HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS]; assert (j - i <= ARRAY_LENGTH (temp)); buffer->merge_clusters (start, j); @@ -679,7 +678,25 @@ reorder_marks_arabic (const hb_ot_shape_plan_t *plan, memmove (&info[start + j - i], &info[start], (i - start) * sizeof (hb_glyph_info_t)); memmove (&info[start], temp, (j - i) * sizeof (hb_glyph_info_t)); - start += j - i; + /* Renumber CC such that the reordered sequence is still sorted. + * 22 and 26 are chosen because they are smaller than all Arabic categories, + * and are folded back to 220/230 respectively during fallback mark positioning. + * + * We do this because the CGJ-handling logic in the normalizer relies on + * mark sequences having an increasing order even after this reordering. + * https://github.com/harfbuzz/harfbuzz/issues/554 + * This, however, does break some obscure sequences, where the normalizer + * might compose a sequence that it should not. For example, in the seequence + * ALEF, HAMZAH, MADDAH, we should NOT try to compose ALEF+MADDAH, but with this + * renumbering, we will. + */ + unsigned int new_start = start + j - i; + unsigned int new_cc = cc == 220 ? HB_MODIFIED_COMBINING_CLASS_CCC22 : HB_MODIFIED_COMBINING_CLASS_CCC26; + while (start < new_start) + { + _hb_glyph_info_set_modified_combining_class (&info[start], new_cc); + start++; + } i = j; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh index 7eaba4e4e7b..f3cea227123 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh @@ -34,1106 +34,889 @@ #line 36 "hb-ot-shape-complex-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { - 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, - 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, - 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, - 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, - 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, - 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, - 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, - 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, - 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, - 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, - 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 8u, 8u, 1u, 16u, - 8u, 13u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, + 8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, - 16u, 16u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, - 4u, 14u, 4u, 14u, 4u, 14u, 4u, 14u, 5u, 8u, 4u, 14u, 4u, 14u, 5u, 8u, - 5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, - 5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u, + 16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, + 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, + 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, - 16u, 16u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, + 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 8u, 8u, 5u, 8u, + 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, + 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, + 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, + 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, + 8u, 8u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, + 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 4u, 8u, 6u, 6u, 16u, 16u, + 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, + 16u, 16u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, 4u, 13u, 4u, 8u, + 4u, 13u, 4u, 8u, 4u, 13u, 4u, 13u, 5u, 8u, 5u, 8u, 5u, 7u, 5u, 8u, + 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, + 8u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, + 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, - 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, - 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, - 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, + 5u, 10u, 3u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, + 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, + 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, - 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, - 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, - 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, - 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, - 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, + 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, + 5u, 10u, 3u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, + 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, + 1u, 16u, 1u, 16u, 1u, 16u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, - 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, - 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, - 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, - 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, + 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 3u, 10u, 3u, 10u, + 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, + 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, + 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 13u, 3u, 17u, 4u, 8u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, - 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, - 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, - 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, - 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, - 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, - 1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, - 5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u, - 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, - 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, - 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 0 + 3u, 17u, 3u, 17u, 4u, 17u, 5u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, + 10u, 10u, 5u, 10u, 3u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, + 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, + 4u, 10u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, + 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, + 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, 1u, 17u, 4u, 13u, 5u, 10u, 10u, 10u, + 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, + 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, 3u, 10u, 4u, 10u, 5u, 10u, + 3u, 10u, 5u, 10u, 5u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 5u, 10u, 1u, 16u, + 0 }; static const char _indic_syllable_machine_key_spans[] = { - 1, 16, 6, 4, 3, 1, 4, 3, - 1, 4, 3, 1, 4, 3, 1, 5, - 1, 1, 5, 1, 1, 5, 1, 1, - 5, 1, 1, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 1, 16, 6, - 4, 3, 1, 4, 3, 1, 4, 3, - 1, 4, 3, 1, 5, 1, 1, 5, - 1, 1, 5, 1, 1, 5, 1, 1, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 1, 16, 6, 4, 3, 1, - 4, 3, 1, 4, 3, 1, 4, 3, - 1, 5, 1, 1, 5, 1, 1, 5, - 1, 1, 5, 1, 1, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 1, 16, - 6, 4, 3, 1, 4, 3, 1, 4, + 1, 4, 3, 1, 4, 3, 1, 4, 3, 1, 4, 3, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, - 1, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 4, 11, 11, 4, - 3, 4, 3, 1, 4, 3, 1, 4, - 3, 1, 1, 16, 6, 5, 1, 1, + 1, 5, 10, 5, 10, 5, 10, 5, + 10, 5, 10, 1, 4, 3, 1, 4, + 3, 1, 4, 3, 1, 4, 3, 1, + 5, 1, 1, 5, 1, 1, 5, 1, + 1, 5, 1, 1, 5, 10, 5, 10, + 5, 10, 5, 10, 5, 10, 1, 4, + 3, 1, 4, 3, 1, 4, 3, 1, + 4, 3, 1, 5, 1, 1, 5, 1, + 1, 5, 1, 1, 5, 1, 1, 5, + 10, 5, 10, 5, 10, 5, 10, 5, + 1, 4, 3, 1, 4, 3, 1, 4, + 3, 1, 4, 3, 1, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, - 1, 1, 19, 15, 15, 14, 16, 15, + 1, 5, 10, 5, 10, 5, 10, 5, + 10, 5, 10, 10, 4, 4, 3, 4, + 3, 1, 4, 3, 1, 4, 3, 1, + 1, 5, 1, 1, 5, 1, 1, 5, + 1, 1, 5, 1, 1, 1, 19, 15, 15, 14, 16, 15, 15, 14, 16, 15, - 15, 14, 16, 15, 15, 14, 10, 10, - 6, 2, 1, 2, 2, 1, 6, 11, - 8, 6, 8, 11, 12, 12, 11, 10, - 12, 11, 10, 12, 11, 10, 12, 11, - 10, 12, 16, 11, 15, 15, 16, 16, - 16, 16, 16, 15, 15, 16, 16, 16, + 15, 14, 16, 15, 15, 14, 16, 15, + 15, 14, 6, 6, 6, 1, 1, 1, + 6, 8, 8, 7, 6, 8, 7, 6, + 8, 7, 6, 8, 7, 6, 8, 7, + 15, 15, 16, 16, 16, 16, 15, 15, + 16, 16, 16, 16, 15, 15, 16, 16, 16, 16, 15, 15, 16, 16, 16, 16, - 16, 15, 15, 16, 16, 16, 16, 16, 15, 15, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, - 14, 16, 15, 15, 14, 10, 10, 6, - 2, 1, 2, 2, 1, 6, 11, 8, - 6, 8, 11, 12, 12, 11, 10, 12, - 11, 10, 12, 11, 10, 12, 11, 10, - 12, 16, 11, 15, 15, 16, 16, 16, - 16, 16, 15, 15, 16, 16, 16, 16, - 16, 15, 15, 16, 16, 16, 16, 16, - 15, 15, 16, 16, 16, 16, 11, 16, - 15, 15, 14, 16, 15, 15, 14, 16, + 14, 16, 15, 15, 14, 6, 6, 6, + 1, 1, 1, 6, 8, 8, 7, 6, + 8, 7, 6, 8, 7, 6, 8, 7, + 6, 8, 7, 15, 15, 16, 16, 16, + 16, 15, 15, 16, 16, 16, 16, 15, + 15, 16, 16, 16, 16, 15, 15, 16, + 16, 16, 16, 5, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, 14, 16, - 15, 15, 14, 10, 10, 6, 2, 1, - 2, 2, 1, 6, 11, 8, 6, 8, - 11, 12, 12, 11, 10, 12, 11, 10, - 12, 11, 10, 12, 11, 10, 12, 16, - 11, 15, 15, 16, 16, 16, 16, 16, - 15, 15, 16, 16, 16, 16, 16, 15, - 15, 16, 16, 16, 16, 16, 15, 15, - 16, 16, 16, 16, 16, 11, 15, 11, + 15, 15, 14, 16, 15, 15, 14, 6, + 6, 6, 1, 1, 1, 6, 8, 8, + 7, 6, 8, 7, 6, 8, 7, 6, + 8, 7, 6, 8, 7, 15, 15, 16, + 16, 16, 16, 15, 15, 16, 16, 16, + 16, 15, 15, 16, 16, 16, 16, 15, + 15, 16, 16, 16, 16, 10, 15, 5, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, 14, 16, - 15, 15, 14, 10, 10, 6, 2, 1, - 2, 2, 1, 6, 11, 8, 6, 8, - 11, 12, 12, 11, 10, 12, 11, 10, - 12, 11, 10, 12, 11, 10, 12, 16, - 11, 15, 15, 16, 16, 16, 16, 16, - 15, 15, 16, 16, 16, 16, 16, 15, - 15, 16, 16, 16, 16, 16, 15, 15, - 16, 16, 16, 16, 16, 15, 17, 15, - 17, 11, 6, 2, 1, 2, 2, 1, - 6, 16, 15, 15, 14, 15, 15, 16, - 12, 11, 10, 12, 11, 10, 12, 11, - 10, 12, 11, 10, 11, 8, 6, 8, - 11, 16, 8, 6, 6, 2, 1, 2, - 2, 1, 6, 16 + 15, 15, 14, 6, 6, 6, 1, 1, + 1, 6, 8, 8, 7, 6, 8, 7, + 6, 8, 7, 6, 8, 7, 6, 8, + 7, 15, 15, 16, 16, 16, 16, 15, + 15, 16, 16, 16, 16, 15, 15, 16, + 16, 16, 16, 15, 15, 16, 16, 16, + 16, 15, 17, 15, 17, 10, 6, 1, + 1, 1, 6, 16, 8, 7, 6, 8, + 7, 6, 8, 7, 6, 8, 7, 6, + 8, 6, 6, 1, 1, 1, 6, 16 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 2, 19, 26, 31, 35, 37, 42, - 46, 48, 53, 57, 59, 64, 68, 70, - 76, 78, 80, 86, 88, 90, 96, 98, - 100, 106, 108, 110, 122, 134, 146, 158, - 170, 182, 194, 206, 218, 230, 232, 249, - 256, 261, 265, 267, 272, 276, 278, 283, - 287, 289, 294, 298, 300, 306, 308, 310, - 316, 318, 320, 326, 328, 330, 336, 338, - 340, 352, 364, 376, 388, 400, 412, 424, - 436, 448, 460, 462, 479, 486, 491, 495, - 497, 502, 506, 508, 513, 517, 519, 524, - 528, 530, 536, 538, 540, 546, 548, 550, - 556, 558, 560, 566, 568, 570, 582, 594, - 606, 618, 630, 642, 654, 666, 678, 680, - 697, 704, 709, 713, 715, 720, 724, 726, - 731, 735, 737, 742, 746, 748, 754, 756, - 758, 764, 766, 768, 774, 776, 778, 784, - 786, 788, 800, 812, 824, 836, 848, 860, - 872, 884, 896, 908, 920, 925, 937, 949, - 954, 958, 963, 967, 969, 974, 978, 980, - 985, 989, 991, 993, 1010, 1017, 1023, 1025, - 1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053, - 1055, 1057, 1059, 1079, 1095, 1111, 1126, 1143, - 1159, 1175, 1190, 1207, 1223, 1239, 1254, 1271, - 1287, 1303, 1318, 1335, 1351, 1367, 1382, 1393, - 1404, 1411, 1414, 1416, 1419, 1422, 1424, 1431, - 1443, 1452, 1459, 1468, 1480, 1493, 1506, 1518, - 1529, 1542, 1554, 1565, 1578, 1590, 1601, 1614, - 1626, 1637, 1650, 1667, 1679, 1695, 1711, 1728, - 1745, 1762, 1779, 1796, 1812, 1828, 1845, 1862, - 1879, 1896, 1913, 1929, 1945, 1962, 1979, 1996, - 2013, 2030, 2046, 2062, 2079, 2096, 2113, 2130, - 2147, 2163, 2179, 2195, 2211, 2226, 2243, 2259, - 2275, 2290, 2307, 2323, 2339, 2354, 2371, 2387, - 2403, 2418, 2435, 2451, 2467, 2482, 2493, 2504, - 2511, 2514, 2516, 2519, 2522, 2524, 2531, 2543, - 2552, 2559, 2568, 2580, 2593, 2606, 2618, 2629, - 2642, 2654, 2665, 2678, 2690, 2701, 2714, 2726, - 2737, 2750, 2767, 2779, 2795, 2811, 2828, 2845, - 2862, 2879, 2896, 2912, 2928, 2945, 2962, 2979, - 2996, 3013, 3029, 3045, 3062, 3079, 3096, 3113, - 3130, 3146, 3162, 3179, 3196, 3213, 3230, 3242, - 3259, 3275, 3291, 3306, 3323, 3339, 3355, 3370, - 3387, 3403, 3419, 3434, 3451, 3467, 3483, 3498, - 3515, 3531, 3547, 3562, 3573, 3584, 3591, 3594, - 3596, 3599, 3602, 3604, 3611, 3623, 3632, 3639, - 3648, 3660, 3673, 3686, 3698, 3709, 3722, 3734, - 3745, 3758, 3770, 3781, 3794, 3806, 3817, 3830, - 3847, 3859, 3875, 3891, 3908, 3925, 3942, 3959, - 3976, 3992, 4008, 4025, 4042, 4059, 4076, 4093, - 4109, 4125, 4142, 4159, 4176, 4193, 4210, 4226, - 4242, 4259, 4276, 4293, 4310, 4327, 4339, 4355, - 4367, 4383, 4399, 4414, 4431, 4447, 4463, 4478, - 4495, 4511, 4527, 4542, 4559, 4575, 4591, 4606, - 4623, 4639, 4655, 4670, 4681, 4692, 4699, 4702, - 4704, 4707, 4710, 4712, 4719, 4731, 4740, 4747, - 4756, 4768, 4781, 4794, 4806, 4817, 4830, 4842, - 4853, 4866, 4878, 4889, 4902, 4914, 4925, 4938, - 4955, 4967, 4983, 4999, 5016, 5033, 5050, 5067, - 5084, 5100, 5116, 5133, 5150, 5167, 5184, 5201, - 5217, 5233, 5250, 5267, 5284, 5301, 5318, 5334, - 5350, 5367, 5384, 5401, 5418, 5435, 5451, 5469, - 5485, 5503, 5515, 5522, 5525, 5527, 5530, 5533, - 5535, 5542, 5559, 5575, 5591, 5606, 5622, 5638, - 5655, 5668, 5680, 5691, 5704, 5716, 5727, 5740, - 5752, 5763, 5776, 5788, 5799, 5811, 5820, 5827, - 5836, 5848, 5865, 5874, 5881, 5888, 5891, 5893, - 5896, 5899, 5901, 5908 + 0, 2, 7, 11, 13, 18, 22, 24, + 29, 33, 35, 40, 44, 46, 52, 54, + 56, 62, 64, 66, 72, 74, 76, 82, + 84, 86, 92, 103, 109, 120, 126, 137, + 143, 154, 160, 171, 173, 178, 182, 184, + 189, 193, 195, 200, 204, 206, 211, 215, + 217, 223, 225, 227, 233, 235, 237, 243, + 245, 247, 253, 255, 257, 263, 274, 280, + 291, 297, 308, 314, 325, 331, 342, 344, + 349, 353, 355, 360, 364, 366, 371, 375, + 377, 382, 386, 388, 394, 396, 398, 404, + 406, 408, 414, 416, 418, 424, 426, 428, + 434, 445, 451, 462, 468, 479, 485, 496, + 502, 504, 509, 513, 515, 520, 524, 526, + 531, 535, 537, 542, 546, 548, 554, 556, + 558, 564, 566, 568, 574, 576, 578, 584, + 586, 588, 594, 605, 611, 622, 628, 639, + 645, 656, 662, 673, 684, 689, 694, 698, + 703, 707, 709, 714, 718, 720, 725, 729, + 731, 733, 739, 741, 743, 749, 751, 753, + 759, 761, 763, 769, 771, 773, 775, 795, + 811, 827, 842, 859, 875, 891, 906, 923, + 939, 955, 970, 987, 1003, 1019, 1034, 1051, + 1067, 1083, 1098, 1105, 1112, 1119, 1121, 1123, + 1125, 1132, 1141, 1150, 1158, 1165, 1174, 1182, + 1189, 1198, 1206, 1213, 1222, 1230, 1237, 1246, + 1254, 1270, 1286, 1303, 1320, 1337, 1354, 1370, + 1386, 1403, 1420, 1437, 1454, 1470, 1486, 1503, + 1520, 1537, 1554, 1570, 1586, 1603, 1620, 1637, + 1654, 1670, 1686, 1702, 1718, 1733, 1750, 1766, + 1782, 1797, 1814, 1830, 1846, 1861, 1878, 1894, + 1910, 1925, 1942, 1958, 1974, 1989, 1996, 2003, + 2010, 2012, 2014, 2016, 2023, 2032, 2041, 2049, + 2056, 2065, 2073, 2080, 2089, 2097, 2104, 2113, + 2121, 2128, 2137, 2145, 2161, 2177, 2194, 2211, + 2228, 2245, 2261, 2277, 2294, 2311, 2328, 2345, + 2361, 2377, 2394, 2411, 2428, 2445, 2461, 2477, + 2494, 2511, 2528, 2545, 2551, 2567, 2583, 2598, + 2615, 2631, 2647, 2662, 2679, 2695, 2711, 2726, + 2743, 2759, 2775, 2790, 2807, 2823, 2839, 2854, + 2861, 2868, 2875, 2877, 2879, 2881, 2888, 2897, + 2906, 2914, 2921, 2930, 2938, 2945, 2954, 2962, + 2969, 2978, 2986, 2993, 3002, 3010, 3026, 3042, + 3059, 3076, 3093, 3110, 3126, 3142, 3159, 3176, + 3193, 3210, 3226, 3242, 3259, 3276, 3293, 3310, + 3326, 3342, 3359, 3376, 3393, 3410, 3421, 3437, + 3443, 3459, 3475, 3490, 3507, 3523, 3539, 3554, + 3571, 3587, 3603, 3618, 3635, 3651, 3667, 3682, + 3699, 3715, 3731, 3746, 3753, 3760, 3767, 3769, + 3771, 3773, 3780, 3789, 3798, 3806, 3813, 3822, + 3830, 3837, 3846, 3854, 3861, 3870, 3878, 3885, + 3894, 3902, 3918, 3934, 3951, 3968, 3985, 4002, + 4018, 4034, 4051, 4068, 4085, 4102, 4118, 4134, + 4151, 4168, 4185, 4202, 4218, 4234, 4251, 4268, + 4285, 4302, 4318, 4336, 4352, 4370, 4381, 4388, + 4390, 4392, 4394, 4401, 4418, 4427, 4435, 4442, + 4451, 4459, 4466, 4475, 4483, 4490, 4499, 4507, + 4514, 4523, 4530, 4537, 4539, 4541, 4543, 4550 }; static const short _indic_syllable_machine_indicies[] = { - 1, 0, 2, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 1, 0, 0, 0, 0, - 4, 0, 5, 5, 6, 1, 0, 7, - 7, 6, 0, 6, 0, 8, 8, 9, - 1, 0, 10, 10, 9, 0, 9, 0, - 11, 11, 12, 1, 0, 13, 13, 12, - 0, 12, 0, 14, 14, 15, 1, 0, - 16, 16, 15, 0, 15, 0, 17, 0, - 0, 0, 1, 0, 18, 0, 19, 0, - 20, 14, 14, 15, 1, 0, 21, 0, - 22, 0, 23, 11, 11, 12, 1, 0, - 24, 0, 25, 0, 26, 8, 8, 9, - 1, 0, 27, 0, 28, 0, 29, 5, - 5, 6, 1, 0, 0, 0, 0, 0, - 29, 0, 29, 5, 5, 6, 1, 0, - 0, 0, 0, 30, 29, 0, 31, 5, - 5, 6, 1, 0, 0, 0, 0, 0, - 31, 0, 31, 5, 5, 6, 1, 0, - 0, 0, 0, 32, 31, 0, 33, 5, - 5, 6, 1, 0, 0, 0, 0, 0, - 33, 0, 33, 5, 5, 6, 1, 0, - 0, 0, 0, 34, 33, 0, 35, 5, - 5, 6, 1, 0, 0, 0, 0, 0, - 35, 0, 35, 5, 5, 6, 1, 0, - 0, 0, 0, 36, 35, 0, 37, 5, - 5, 6, 1, 0, 0, 0, 0, 0, - 37, 0, 37, 5, 5, 6, 1, 0, - 0, 0, 0, 38, 37, 0, 40, 39, - 41, 42, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 41, - 39, 40, 39, 39, 39, 39, 43, 39, - 44, 44, 45, 40, 39, 46, 46, 45, - 39, 45, 39, 47, 47, 48, 40, 39, - 49, 49, 48, 39, 48, 39, 50, 50, - 51, 40, 39, 52, 52, 51, 39, 51, - 39, 53, 53, 54, 40, 39, 55, 55, - 54, 39, 54, 39, 56, 39, 39, 39, - 40, 39, 57, 39, 58, 39, 59, 53, - 53, 54, 40, 39, 60, 39, 61, 39, - 62, 50, 50, 51, 40, 39, 63, 39, - 64, 39, 65, 47, 47, 48, 40, 39, - 66, 39, 67, 39, 68, 44, 44, 45, - 40, 39, 39, 39, 39, 39, 68, 39, - 68, 44, 44, 45, 40, 39, 39, 39, - 39, 69, 68, 39, 70, 44, 44, 45, - 40, 39, 39, 39, 39, 39, 70, 39, - 70, 44, 44, 45, 40, 39, 39, 39, - 39, 71, 70, 39, 72, 44, 44, 45, - 40, 39, 39, 39, 39, 39, 72, 39, - 72, 44, 44, 45, 40, 39, 39, 39, - 39, 73, 72, 39, 74, 44, 44, 45, - 40, 39, 39, 39, 39, 39, 74, 39, - 74, 44, 44, 45, 40, 39, 39, 39, - 39, 75, 74, 39, 76, 44, 44, 45, - 40, 39, 39, 39, 39, 39, 76, 39, - 76, 44, 44, 45, 40, 39, 39, 39, - 39, 77, 76, 39, 79, 78, 80, 81, - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 80, 78, 79, - 78, 78, 78, 78, 82, 78, 83, 83, - 84, 79, 78, 86, 86, 84, 85, 84, - 85, 87, 87, 88, 79, 78, 89, 89, - 88, 78, 88, 78, 90, 90, 91, 79, - 78, 92, 92, 91, 78, 91, 78, 93, - 93, 94, 79, 78, 95, 95, 94, 78, - 94, 78, 96, 78, 78, 78, 79, 78, - 97, 78, 98, 78, 99, 93, 93, 94, - 79, 78, 100, 78, 101, 78, 102, 90, - 90, 91, 79, 78, 103, 78, 104, 78, - 105, 87, 87, 88, 79, 78, 106, 78, - 107, 78, 108, 83, 83, 84, 79, 78, - 78, 78, 78, 78, 108, 78, 108, 83, - 83, 84, 79, 78, 78, 78, 78, 109, - 108, 78, 110, 83, 83, 84, 79, 78, - 78, 78, 78, 78, 110, 78, 110, 83, - 83, 84, 79, 78, 78, 78, 78, 111, - 110, 78, 112, 83, 83, 84, 79, 78, - 78, 78, 78, 78, 112, 78, 112, 83, - 83, 84, 79, 78, 78, 78, 78, 113, - 112, 78, 114, 83, 83, 84, 79, 78, - 78, 78, 78, 78, 114, 78, 114, 83, - 83, 84, 79, 78, 78, 78, 78, 115, - 114, 78, 116, 83, 83, 84, 79, 78, - 78, 78, 78, 78, 116, 78, 118, 117, - 119, 120, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 119, - 117, 118, 117, 117, 117, 117, 121, 117, - 122, 122, 123, 118, 117, 124, 124, 123, - 117, 123, 117, 125, 125, 126, 118, 117, - 127, 127, 126, 117, 126, 117, 128, 128, - 129, 118, 117, 130, 130, 129, 117, 129, - 117, 131, 131, 132, 118, 117, 133, 133, - 132, 117, 132, 117, 134, 117, 117, 117, - 118, 117, 135, 117, 136, 117, 137, 131, - 131, 132, 118, 117, 138, 117, 139, 117, - 140, 128, 128, 129, 118, 117, 141, 117, - 142, 117, 143, 125, 125, 126, 118, 117, - 144, 117, 145, 117, 146, 122, 122, 123, - 118, 117, 117, 117, 117, 117, 146, 117, - 146, 122, 122, 123, 118, 117, 117, 117, - 117, 147, 146, 117, 148, 122, 122, 123, - 118, 117, 117, 117, 117, 117, 148, 117, - 148, 122, 122, 123, 118, 117, 117, 117, - 117, 149, 148, 117, 150, 122, 122, 123, - 118, 117, 117, 117, 117, 117, 150, 117, - 150, 122, 122, 123, 118, 117, 117, 117, - 117, 151, 150, 117, 152, 122, 122, 123, - 118, 117, 117, 117, 117, 117, 152, 117, - 152, 122, 122, 123, 118, 117, 117, 117, - 117, 153, 152, 117, 154, 122, 122, 123, - 118, 117, 117, 117, 117, 117, 154, 117, - 154, 122, 122, 123, 118, 117, 117, 117, - 117, 155, 154, 117, 116, 83, 83, 84, - 79, 78, 78, 78, 78, 156, 116, 78, - 86, 86, 84, 1, 0, 114, 83, 83, - 84, 157, 0, 0, 0, 0, 0, 114, - 0, 114, 83, 83, 84, 157, 0, 0, - 0, 0, 158, 114, 0, 159, 159, 160, - 1, 0, 7, 7, 160, 0, 161, 161, - 162, 157, 0, 163, 163, 162, 0, 162, - 0, 164, 164, 165, 157, 0, 166, 166, - 165, 0, 165, 0, 167, 167, 168, 157, - 0, 169, 169, 168, 0, 168, 0, 157, - 0, 170, 171, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 170, 0, 157, 0, 0, 0, 0, 172, - 0, 173, 0, 0, 0, 157, 0, 174, - 0, 175, 0, 176, 167, 167, 168, 157, - 0, 177, 0, 178, 0, 179, 164, 164, - 165, 157, 0, 180, 0, 181, 0, 182, - 161, 161, 162, 157, 0, 183, 0, 184, - 0, 186, 185, 188, 189, 190, 191, 192, - 193, 84, 79, 194, 195, 196, 196, 156, - 197, 198, 199, 200, 201, 202, 187, 204, - 205, 206, 207, 6, 1, 208, 209, 203, - 203, 38, 210, 203, 203, 211, 203, 212, - 205, 213, 213, 6, 1, 208, 209, 203, - 203, 203, 210, 203, 203, 211, 203, 205, - 213, 213, 6, 1, 208, 209, 203, 203, - 203, 210, 203, 203, 211, 203, 214, 203, - 203, 203, 19, 215, 203, 1, 208, 209, - 203, 203, 203, 216, 203, 214, 203, 217, - 218, 219, 220, 6, 1, 208, 209, 203, - 203, 36, 221, 203, 203, 211, 203, 222, - 218, 223, 223, 6, 1, 208, 209, 203, - 203, 203, 221, 203, 203, 211, 203, 218, - 223, 223, 6, 1, 208, 209, 203, 203, - 203, 221, 203, 203, 211, 203, 224, 203, - 203, 203, 19, 225, 203, 1, 208, 209, - 203, 203, 203, 216, 203, 224, 203, 226, - 227, 228, 229, 6, 1, 208, 209, 203, - 203, 34, 230, 203, 203, 211, 203, 231, - 227, 232, 232, 6, 1, 208, 209, 203, - 203, 203, 230, 203, 203, 211, 203, 227, - 232, 232, 6, 1, 208, 209, 203, 203, - 203, 230, 203, 203, 211, 203, 233, 203, - 203, 203, 19, 234, 203, 1, 208, 209, - 203, 203, 203, 216, 203, 233, 203, 235, - 236, 237, 238, 6, 1, 208, 209, 203, - 203, 32, 239, 203, 203, 211, 203, 240, - 236, 241, 241, 6, 1, 208, 209, 203, - 203, 203, 239, 203, 203, 211, 203, 236, - 241, 241, 6, 1, 208, 209, 203, 203, - 203, 239, 203, 203, 211, 203, 242, 203, - 203, 203, 19, 243, 203, 1, 208, 209, - 203, 203, 203, 216, 203, 242, 203, 244, - 245, 246, 247, 6, 1, 208, 209, 203, - 203, 30, 248, 203, 203, 211, 203, 249, - 245, 250, 250, 6, 1, 208, 209, 203, - 203, 203, 248, 203, 203, 211, 203, 245, - 250, 250, 6, 1, 208, 209, 203, 203, - 203, 248, 203, 203, 211, 203, 19, 251, - 203, 1, 208, 209, 203, 203, 203, 216, - 203, 252, 252, 203, 1, 208, 209, 203, - 203, 203, 216, 203, 253, 203, 203, 254, - 208, 209, 203, 208, 209, 203, 255, 203, - 208, 256, 203, 208, 257, 203, 208, 203, - 253, 203, 203, 203, 208, 209, 203, 258, - 203, 259, 260, 203, 1, 208, 209, 203, - 203, 4, 203, 3, 203, 252, 252, 203, - 1, 208, 209, 203, 252, 252, 203, 1, - 208, 209, 203, 258, 203, 252, 252, 203, - 1, 208, 209, 203, 258, 203, 259, 252, - 203, 1, 208, 209, 203, 203, 4, 203, - 19, 203, 261, 261, 6, 1, 208, 209, - 203, 203, 203, 216, 203, 262, 28, 263, - 264, 9, 1, 208, 209, 203, 203, 203, - 216, 203, 28, 263, 264, 9, 1, 208, - 209, 203, 203, 203, 216, 203, 263, 263, - 9, 1, 208, 209, 203, 203, 203, 216, - 203, 265, 25, 266, 267, 12, 1, 208, - 209, 203, 203, 203, 216, 203, 25, 266, - 267, 12, 1, 208, 209, 203, 203, 203, - 216, 203, 266, 266, 12, 1, 208, 209, - 203, 203, 203, 216, 203, 268, 22, 269, - 270, 15, 1, 208, 209, 203, 203, 203, - 216, 203, 22, 269, 270, 15, 1, 208, - 209, 203, 203, 203, 216, 203, 269, 269, - 15, 1, 208, 209, 203, 203, 203, 216, - 203, 271, 19, 252, 272, 203, 1, 208, - 209, 203, 203, 203, 216, 203, 19, 252, - 272, 203, 1, 208, 209, 203, 203, 203, - 216, 203, 252, 273, 203, 1, 208, 209, - 203, 203, 203, 216, 203, 19, 203, 252, - 252, 203, 1, 208, 209, 203, 203, 203, - 216, 203, 2, 3, 203, 203, 19, 251, - 203, 1, 208, 209, 203, 203, 203, 216, - 203, 2, 203, 245, 250, 250, 6, 1, - 208, 209, 203, 203, 203, 248, 203, 244, - 245, 250, 250, 6, 1, 208, 209, 203, - 203, 203, 248, 203, 203, 211, 203, 244, - 245, 246, 250, 6, 1, 208, 209, 203, - 203, 30, 248, 203, 203, 211, 203, 242, - 203, 274, 203, 261, 261, 6, 1, 208, - 209, 203, 203, 203, 216, 203, 242, 203, - 242, 203, 203, 203, 252, 252, 203, 1, - 208, 209, 203, 203, 203, 216, 203, 242, - 203, 242, 203, 203, 203, 252, 275, 203, - 1, 208, 209, 203, 203, 203, 216, 203, - 242, 203, 242, 203, 274, 203, 252, 252, - 203, 1, 208, 209, 203, 203, 203, 216, - 203, 242, 203, 242, 3, 203, 203, 19, - 243, 203, 1, 208, 209, 203, 203, 203, - 216, 203, 242, 203, 235, 236, 241, 241, - 6, 1, 208, 209, 203, 203, 203, 239, - 203, 203, 211, 203, 235, 236, 237, 241, - 6, 1, 208, 209, 203, 203, 32, 239, - 203, 203, 211, 203, 233, 203, 276, 203, - 261, 261, 6, 1, 208, 209, 203, 203, - 203, 216, 203, 233, 203, 233, 203, 203, - 203, 252, 252, 203, 1, 208, 209, 203, - 203, 203, 216, 203, 233, 203, 233, 203, - 203, 203, 252, 277, 203, 1, 208, 209, - 203, 203, 203, 216, 203, 233, 203, 233, - 203, 276, 203, 252, 252, 203, 1, 208, - 209, 203, 203, 203, 216, 203, 233, 203, - 233, 3, 203, 203, 19, 234, 203, 1, - 208, 209, 203, 203, 203, 216, 203, 233, - 203, 226, 227, 232, 232, 6, 1, 208, - 209, 203, 203, 203, 230, 203, 203, 211, - 203, 226, 227, 228, 232, 6, 1, 208, - 209, 203, 203, 34, 230, 203, 203, 211, - 203, 224, 203, 278, 203, 261, 261, 6, - 1, 208, 209, 203, 203, 203, 216, 203, - 224, 203, 224, 203, 203, 203, 252, 252, - 203, 1, 208, 209, 203, 203, 203, 216, - 203, 224, 203, 224, 203, 203, 203, 252, - 279, 203, 1, 208, 209, 203, 203, 203, - 216, 203, 224, 203, 224, 203, 278, 203, - 252, 252, 203, 1, 208, 209, 203, 203, - 203, 216, 203, 224, 203, 224, 3, 203, - 203, 19, 225, 203, 1, 208, 209, 203, - 203, 203, 216, 203, 224, 203, 217, 218, - 223, 223, 6, 1, 208, 209, 203, 203, - 203, 221, 203, 203, 211, 203, 217, 218, - 219, 223, 6, 1, 208, 209, 203, 203, - 36, 221, 203, 203, 211, 203, 214, 203, - 280, 203, 261, 261, 6, 1, 208, 209, - 203, 203, 203, 216, 203, 214, 203, 214, - 203, 203, 203, 252, 252, 203, 1, 208, - 209, 203, 203, 203, 216, 203, 214, 203, - 214, 203, 203, 203, 252, 281, 203, 1, - 208, 209, 203, 203, 203, 216, 203, 214, - 203, 214, 203, 280, 203, 252, 252, 203, - 1, 208, 209, 203, 203, 203, 216, 203, - 214, 203, 214, 3, 203, 203, 19, 215, - 203, 1, 208, 209, 203, 203, 203, 216, - 203, 214, 203, 204, 205, 213, 213, 6, - 1, 208, 209, 203, 203, 203, 210, 203, - 203, 211, 203, 204, 205, 206, 213, 6, - 1, 208, 209, 203, 203, 38, 210, 203, - 203, 211, 203, 283, 284, 285, 286, 45, - 40, 287, 288, 282, 282, 77, 289, 282, - 282, 290, 282, 291, 284, 292, 286, 45, - 40, 287, 288, 282, 282, 282, 289, 282, - 282, 290, 282, 284, 292, 286, 45, 40, - 287, 288, 282, 282, 282, 289, 282, 282, - 290, 282, 293, 282, 282, 282, 58, 294, - 282, 40, 287, 288, 282, 282, 282, 295, - 282, 293, 282, 296, 297, 298, 299, 45, - 40, 287, 288, 282, 282, 75, 300, 282, - 282, 290, 282, 301, 297, 302, 302, 45, - 40, 287, 288, 282, 282, 282, 300, 282, - 282, 290, 282, 297, 302, 302, 45, 40, - 287, 288, 282, 282, 282, 300, 282, 282, - 290, 282, 303, 282, 282, 282, 58, 304, - 282, 40, 287, 288, 282, 282, 282, 295, - 282, 303, 282, 305, 306, 307, 308, 45, - 40, 287, 288, 282, 282, 73, 309, 282, - 282, 290, 282, 310, 306, 311, 311, 45, - 40, 287, 288, 282, 282, 282, 309, 282, - 282, 290, 282, 306, 311, 311, 45, 40, - 287, 288, 282, 282, 282, 309, 282, 282, - 290, 282, 312, 282, 282, 282, 58, 313, - 282, 40, 287, 288, 282, 282, 282, 295, - 282, 312, 282, 314, 315, 316, 317, 45, - 40, 287, 288, 282, 282, 71, 318, 282, - 282, 290, 282, 319, 315, 320, 320, 45, - 40, 287, 288, 282, 282, 282, 318, 282, - 282, 290, 282, 315, 320, 320, 45, 40, - 287, 288, 282, 282, 282, 318, 282, 282, - 290, 282, 321, 282, 282, 282, 58, 322, - 282, 40, 287, 288, 282, 282, 282, 295, - 282, 321, 282, 323, 324, 325, 326, 45, - 40, 287, 288, 282, 282, 69, 327, 282, - 282, 290, 282, 328, 324, 329, 329, 45, - 40, 287, 288, 282, 282, 282, 327, 282, - 282, 290, 282, 324, 329, 329, 45, 40, - 287, 288, 282, 282, 282, 327, 282, 282, - 290, 282, 58, 330, 282, 40, 287, 288, - 282, 282, 282, 295, 282, 331, 331, 282, - 40, 287, 288, 282, 282, 282, 295, 282, - 332, 282, 282, 333, 287, 288, 282, 287, - 288, 282, 334, 282, 287, 335, 282, 287, - 336, 282, 287, 282, 332, 282, 282, 282, - 287, 288, 282, 337, 282, 338, 339, 282, - 40, 287, 288, 282, 282, 43, 282, 42, - 282, 331, 331, 282, 40, 287, 288, 282, - 331, 331, 282, 40, 287, 288, 282, 337, - 282, 331, 331, 282, 40, 287, 288, 282, - 337, 282, 338, 331, 282, 40, 287, 288, - 282, 282, 43, 282, 58, 282, 340, 340, - 45, 40, 287, 288, 282, 282, 282, 295, - 282, 341, 67, 342, 343, 48, 40, 287, - 288, 282, 282, 282, 295, 282, 67, 342, - 343, 48, 40, 287, 288, 282, 282, 282, - 295, 282, 342, 342, 48, 40, 287, 288, - 282, 282, 282, 295, 282, 344, 64, 345, - 346, 51, 40, 287, 288, 282, 282, 282, - 295, 282, 64, 345, 346, 51, 40, 287, - 288, 282, 282, 282, 295, 282, 345, 345, - 51, 40, 287, 288, 282, 282, 282, 295, - 282, 347, 61, 348, 349, 54, 40, 287, - 288, 282, 282, 282, 295, 282, 61, 348, - 349, 54, 40, 287, 288, 282, 282, 282, - 295, 282, 348, 348, 54, 40, 287, 288, - 282, 282, 282, 295, 282, 350, 58, 331, - 351, 282, 40, 287, 288, 282, 282, 282, - 295, 282, 58, 331, 351, 282, 40, 287, - 288, 282, 282, 282, 295, 282, 331, 352, - 282, 40, 287, 288, 282, 282, 282, 295, - 282, 58, 282, 331, 331, 282, 40, 287, - 288, 282, 282, 282, 295, 282, 41, 42, - 282, 282, 58, 330, 282, 40, 287, 288, - 282, 282, 282, 295, 282, 41, 282, 324, - 329, 329, 45, 40, 287, 288, 282, 282, - 282, 327, 282, 323, 324, 329, 329, 45, - 40, 287, 288, 282, 282, 282, 327, 282, - 282, 290, 282, 323, 324, 325, 329, 45, - 40, 287, 288, 282, 282, 69, 327, 282, - 282, 290, 282, 321, 282, 353, 282, 340, - 340, 45, 40, 287, 288, 282, 282, 282, - 295, 282, 321, 282, 321, 282, 282, 282, - 331, 331, 282, 40, 287, 288, 282, 282, - 282, 295, 282, 321, 282, 321, 282, 282, - 282, 331, 354, 282, 40, 287, 288, 282, - 282, 282, 295, 282, 321, 282, 321, 282, - 353, 282, 331, 331, 282, 40, 287, 288, - 282, 282, 282, 295, 282, 321, 282, 321, - 42, 282, 282, 58, 322, 282, 40, 287, - 288, 282, 282, 282, 295, 282, 321, 282, - 314, 315, 320, 320, 45, 40, 287, 288, - 282, 282, 282, 318, 282, 282, 290, 282, - 314, 315, 316, 320, 45, 40, 287, 288, - 282, 282, 71, 318, 282, 282, 290, 282, - 312, 282, 355, 282, 340, 340, 45, 40, - 287, 288, 282, 282, 282, 295, 282, 312, - 282, 312, 282, 282, 282, 331, 331, 282, - 40, 287, 288, 282, 282, 282, 295, 282, - 312, 282, 312, 282, 282, 282, 331, 356, - 282, 40, 287, 288, 282, 282, 282, 295, - 282, 312, 282, 312, 282, 355, 282, 331, - 331, 282, 40, 287, 288, 282, 282, 282, - 295, 282, 312, 282, 312, 42, 282, 282, - 58, 313, 282, 40, 287, 288, 282, 282, - 282, 295, 282, 312, 282, 305, 306, 311, - 311, 45, 40, 287, 288, 282, 282, 282, - 309, 282, 282, 290, 282, 305, 306, 307, - 311, 45, 40, 287, 288, 282, 282, 73, - 309, 282, 282, 290, 282, 303, 282, 357, - 282, 340, 340, 45, 40, 287, 288, 282, - 282, 282, 295, 282, 303, 282, 303, 282, - 282, 282, 331, 331, 282, 40, 287, 288, - 282, 282, 282, 295, 282, 303, 282, 303, - 282, 282, 282, 331, 358, 282, 40, 287, - 288, 282, 282, 282, 295, 282, 303, 282, - 303, 282, 357, 282, 331, 331, 282, 40, - 287, 288, 282, 282, 282, 295, 282, 303, - 282, 303, 42, 282, 282, 58, 304, 282, - 40, 287, 288, 282, 282, 282, 295, 282, - 303, 282, 296, 297, 302, 302, 45, 40, - 287, 288, 282, 282, 282, 300, 282, 282, - 290, 282, 296, 297, 298, 302, 45, 40, - 287, 288, 282, 282, 75, 300, 282, 282, - 290, 282, 293, 282, 359, 282, 340, 340, - 45, 40, 287, 288, 282, 282, 282, 295, - 282, 293, 282, 293, 282, 282, 282, 331, - 331, 282, 40, 287, 288, 282, 282, 282, - 295, 282, 293, 282, 293, 282, 282, 282, - 331, 360, 282, 40, 287, 288, 282, 282, - 282, 295, 282, 293, 282, 293, 282, 359, - 282, 331, 331, 282, 40, 287, 288, 282, - 282, 282, 295, 282, 293, 282, 76, 44, - 44, 45, 40, 282, 282, 282, 282, 282, - 76, 282, 293, 42, 282, 282, 58, 294, - 282, 40, 287, 288, 282, 282, 282, 295, - 282, 293, 282, 283, 284, 292, 286, 45, - 40, 287, 288, 282, 282, 282, 289, 282, - 282, 290, 282, 362, 191, 363, 363, 84, - 79, 194, 195, 361, 361, 361, 197, 361, - 361, 200, 361, 191, 363, 363, 84, 79, - 194, 195, 361, 361, 361, 197, 361, 361, - 200, 361, 364, 361, 361, 361, 98, 365, - 361, 79, 194, 195, 361, 361, 361, 366, - 361, 364, 361, 367, 368, 369, 370, 84, - 79, 194, 195, 361, 361, 115, 371, 361, - 361, 200, 361, 372, 368, 373, 373, 84, - 79, 194, 195, 361, 361, 361, 371, 361, - 361, 200, 361, 368, 373, 373, 84, 79, - 194, 195, 361, 361, 361, 371, 361, 361, - 200, 361, 374, 361, 361, 361, 98, 375, - 361, 79, 194, 195, 361, 361, 361, 366, - 361, 374, 361, 376, 377, 378, 379, 84, - 79, 194, 195, 361, 361, 113, 380, 361, - 361, 200, 361, 381, 377, 382, 382, 84, - 79, 194, 195, 361, 361, 361, 380, 361, - 361, 200, 361, 377, 382, 382, 84, 79, - 194, 195, 361, 361, 361, 380, 361, 361, - 200, 361, 383, 361, 361, 361, 98, 384, - 361, 79, 194, 195, 361, 361, 361, 366, - 361, 383, 361, 385, 386, 387, 388, 84, - 79, 194, 195, 361, 361, 111, 389, 361, - 361, 200, 361, 390, 386, 391, 391, 84, - 79, 194, 195, 361, 361, 361, 389, 361, - 361, 200, 361, 386, 391, 391, 84, 79, - 194, 195, 361, 361, 361, 389, 361, 361, - 200, 361, 392, 361, 361, 361, 98, 393, - 361, 79, 194, 195, 361, 361, 361, 366, - 361, 392, 361, 394, 395, 396, 397, 84, - 79, 194, 195, 361, 361, 109, 398, 361, - 361, 200, 361, 399, 395, 400, 400, 84, - 79, 194, 195, 361, 361, 361, 398, 361, - 361, 200, 361, 395, 400, 400, 84, 79, - 194, 195, 361, 361, 361, 398, 361, 361, - 200, 361, 98, 401, 361, 79, 194, 195, - 361, 361, 361, 366, 361, 402, 402, 361, - 79, 194, 195, 361, 361, 361, 366, 361, - 403, 361, 361, 404, 194, 195, 361, 194, - 195, 361, 405, 361, 194, 406, 361, 194, - 407, 361, 194, 361, 403, 361, 361, 361, - 194, 195, 361, 408, 361, 409, 410, 361, - 79, 194, 195, 361, 361, 82, 361, 81, - 361, 402, 402, 361, 79, 194, 195, 361, - 402, 402, 361, 79, 194, 195, 361, 408, - 361, 402, 402, 361, 79, 194, 195, 361, - 408, 361, 409, 402, 361, 79, 194, 195, - 361, 361, 82, 361, 98, 361, 411, 411, - 84, 79, 194, 195, 361, 361, 361, 366, - 361, 412, 107, 413, 414, 88, 79, 194, - 195, 361, 361, 361, 366, 361, 107, 413, - 414, 88, 79, 194, 195, 361, 361, 361, - 366, 361, 413, 413, 88, 79, 194, 195, - 361, 361, 361, 366, 361, 415, 104, 416, - 417, 91, 79, 194, 195, 361, 361, 361, - 366, 361, 104, 416, 417, 91, 79, 194, - 195, 361, 361, 361, 366, 361, 416, 416, - 91, 79, 194, 195, 361, 361, 361, 366, - 361, 418, 101, 419, 420, 94, 79, 194, - 195, 361, 361, 361, 366, 361, 101, 419, - 420, 94, 79, 194, 195, 361, 361, 361, - 366, 361, 419, 419, 94, 79, 194, 195, - 361, 361, 361, 366, 361, 421, 98, 402, - 422, 361, 79, 194, 195, 361, 361, 361, - 366, 361, 98, 402, 422, 361, 79, 194, - 195, 361, 361, 361, 366, 361, 402, 423, - 361, 79, 194, 195, 361, 361, 361, 366, - 361, 98, 361, 402, 402, 361, 79, 194, - 195, 361, 361, 361, 366, 361, 80, 81, - 361, 361, 98, 401, 361, 79, 194, 195, - 361, 361, 361, 366, 361, 80, 361, 395, - 400, 400, 84, 79, 194, 195, 361, 361, - 361, 398, 361, 394, 395, 400, 400, 84, - 79, 194, 195, 361, 361, 361, 398, 361, - 361, 200, 361, 394, 395, 396, 400, 84, - 79, 194, 195, 361, 361, 109, 398, 361, - 361, 200, 361, 392, 361, 424, 361, 411, - 411, 84, 79, 194, 195, 361, 361, 361, - 366, 361, 392, 361, 392, 361, 361, 361, - 402, 402, 361, 79, 194, 195, 361, 361, - 361, 366, 361, 392, 361, 392, 361, 361, - 361, 402, 425, 361, 79, 194, 195, 361, - 361, 361, 366, 361, 392, 361, 392, 361, - 424, 361, 402, 402, 361, 79, 194, 195, - 361, 361, 361, 366, 361, 392, 361, 392, - 81, 361, 361, 98, 393, 361, 79, 194, - 195, 361, 361, 361, 366, 361, 392, 361, - 385, 386, 391, 391, 84, 79, 194, 195, - 361, 361, 361, 389, 361, 361, 200, 361, - 385, 386, 387, 391, 84, 79, 194, 195, - 361, 361, 111, 389, 361, 361, 200, 361, - 383, 361, 426, 361, 411, 411, 84, 79, - 194, 195, 361, 361, 361, 366, 361, 383, - 361, 383, 361, 361, 361, 402, 402, 361, - 79, 194, 195, 361, 361, 361, 366, 361, - 383, 361, 383, 361, 361, 361, 402, 427, - 361, 79, 194, 195, 361, 361, 361, 366, - 361, 383, 361, 383, 361, 426, 361, 402, - 402, 361, 79, 194, 195, 361, 361, 361, - 366, 361, 383, 361, 383, 81, 361, 361, - 98, 384, 361, 79, 194, 195, 361, 361, - 361, 366, 361, 383, 361, 376, 377, 382, - 382, 84, 79, 194, 195, 361, 361, 361, - 380, 361, 361, 200, 361, 376, 377, 378, - 382, 84, 79, 194, 195, 361, 361, 113, - 380, 361, 361, 200, 361, 374, 361, 428, - 361, 411, 411, 84, 79, 194, 195, 361, - 361, 361, 366, 361, 374, 361, 374, 361, - 361, 361, 402, 402, 361, 79, 194, 195, - 361, 361, 361, 366, 361, 374, 361, 374, - 361, 361, 361, 402, 429, 361, 79, 194, - 195, 361, 361, 361, 366, 361, 374, 361, - 374, 361, 428, 361, 402, 402, 361, 79, - 194, 195, 361, 361, 361, 366, 361, 374, - 361, 374, 81, 361, 361, 98, 375, 361, - 79, 194, 195, 361, 361, 361, 366, 361, - 374, 361, 367, 368, 373, 373, 84, 79, - 194, 195, 361, 361, 361, 371, 361, 361, - 200, 361, 367, 368, 369, 373, 84, 79, - 194, 195, 361, 361, 115, 371, 361, 361, - 200, 361, 364, 361, 430, 361, 411, 411, - 84, 79, 194, 195, 361, 361, 361, 366, - 361, 364, 361, 364, 361, 361, 361, 402, - 402, 361, 79, 194, 195, 361, 361, 361, - 366, 361, 364, 361, 364, 361, 361, 361, - 402, 431, 361, 79, 194, 195, 361, 361, - 361, 366, 361, 364, 361, 364, 361, 430, - 361, 402, 402, 361, 79, 194, 195, 361, - 361, 361, 366, 361, 364, 361, 364, 81, - 361, 361, 98, 365, 361, 79, 194, 195, - 361, 361, 361, 366, 361, 364, 361, 116, - 83, 83, 84, 79, 432, 432, 432, 432, - 156, 116, 432, 190, 191, 363, 363, 84, - 79, 194, 195, 361, 361, 361, 197, 361, - 361, 200, 361, 116, 83, 83, 84, 79, - 432, 432, 432, 432, 432, 116, 432, 434, - 435, 436, 437, 123, 118, 438, 439, 433, - 433, 155, 440, 433, 433, 441, 433, 442, - 435, 437, 437, 123, 118, 438, 439, 433, - 433, 433, 440, 433, 433, 441, 433, 435, - 437, 437, 123, 118, 438, 439, 433, 433, - 433, 440, 433, 433, 441, 433, 443, 433, - 433, 433, 136, 444, 433, 118, 438, 439, - 433, 433, 433, 445, 433, 443, 433, 446, - 447, 448, 449, 123, 118, 438, 439, 433, - 433, 153, 450, 433, 433, 441, 433, 451, - 447, 452, 452, 123, 118, 438, 439, 433, - 433, 433, 450, 433, 433, 441, 433, 447, - 452, 452, 123, 118, 438, 439, 433, 433, - 433, 450, 433, 433, 441, 433, 453, 433, - 433, 433, 136, 454, 433, 118, 438, 439, - 433, 433, 433, 445, 433, 453, 433, 455, - 456, 457, 458, 123, 118, 438, 439, 433, - 433, 151, 459, 433, 433, 441, 433, 460, - 456, 461, 461, 123, 118, 438, 439, 433, - 433, 433, 459, 433, 433, 441, 433, 456, - 461, 461, 123, 118, 438, 439, 433, 433, - 433, 459, 433, 433, 441, 433, 462, 433, - 433, 433, 136, 463, 433, 118, 438, 439, - 433, 433, 433, 445, 433, 462, 433, 464, - 465, 466, 467, 123, 118, 438, 439, 433, - 433, 149, 468, 433, 433, 441, 433, 469, - 465, 470, 470, 123, 118, 438, 439, 433, - 433, 433, 468, 433, 433, 441, 433, 465, - 470, 470, 123, 118, 438, 439, 433, 433, - 433, 468, 433, 433, 441, 433, 471, 433, - 433, 433, 136, 472, 433, 118, 438, 439, - 433, 433, 433, 445, 433, 471, 433, 473, - 474, 475, 476, 123, 118, 438, 439, 433, - 433, 147, 477, 433, 433, 441, 433, 478, - 474, 479, 479, 123, 118, 438, 439, 433, - 433, 433, 477, 433, 433, 441, 433, 474, - 479, 479, 123, 118, 438, 439, 433, 433, - 433, 477, 433, 433, 441, 433, 136, 480, - 433, 118, 438, 439, 433, 433, 433, 445, - 433, 481, 481, 433, 118, 438, 439, 433, - 433, 433, 445, 433, 482, 433, 433, 483, - 438, 439, 433, 438, 439, 433, 484, 433, - 438, 485, 433, 438, 486, 433, 438, 433, - 482, 433, 433, 433, 438, 439, 433, 487, - 433, 488, 489, 433, 118, 438, 439, 433, - 433, 121, 433, 120, 433, 481, 481, 433, - 118, 438, 439, 433, 481, 481, 433, 118, - 438, 439, 433, 487, 433, 481, 481, 433, - 118, 438, 439, 433, 487, 433, 488, 481, - 433, 118, 438, 439, 433, 433, 121, 433, - 136, 433, 490, 490, 123, 118, 438, 439, - 433, 433, 433, 445, 433, 491, 145, 492, - 493, 126, 118, 438, 439, 433, 433, 433, - 445, 433, 145, 492, 493, 126, 118, 438, - 439, 433, 433, 433, 445, 433, 492, 492, - 126, 118, 438, 439, 433, 433, 433, 445, - 433, 494, 142, 495, 496, 129, 118, 438, - 439, 433, 433, 433, 445, 433, 142, 495, - 496, 129, 118, 438, 439, 433, 433, 433, - 445, 433, 495, 495, 129, 118, 438, 439, - 433, 433, 433, 445, 433, 497, 139, 498, - 499, 132, 118, 438, 439, 433, 433, 433, - 445, 433, 139, 498, 499, 132, 118, 438, - 439, 433, 433, 433, 445, 433, 498, 498, - 132, 118, 438, 439, 433, 433, 433, 445, - 433, 500, 136, 481, 501, 433, 118, 438, - 439, 433, 433, 433, 445, 433, 136, 481, - 501, 433, 118, 438, 439, 433, 433, 433, - 445, 433, 481, 502, 433, 118, 438, 439, - 433, 433, 433, 445, 433, 136, 433, 481, - 481, 433, 118, 438, 439, 433, 433, 433, - 445, 433, 119, 120, 433, 433, 136, 480, - 433, 118, 438, 439, 433, 433, 433, 445, - 433, 119, 433, 474, 479, 479, 123, 118, - 438, 439, 433, 433, 433, 477, 433, 473, - 474, 479, 479, 123, 118, 438, 439, 433, - 433, 433, 477, 433, 433, 441, 433, 473, - 474, 475, 479, 123, 118, 438, 439, 433, - 433, 147, 477, 433, 433, 441, 433, 471, - 433, 503, 433, 490, 490, 123, 118, 438, - 439, 433, 433, 433, 445, 433, 471, 433, - 471, 433, 433, 433, 481, 481, 433, 118, - 438, 439, 433, 433, 433, 445, 433, 471, - 433, 471, 433, 433, 433, 481, 504, 433, - 118, 438, 439, 433, 433, 433, 445, 433, - 471, 433, 471, 433, 503, 433, 481, 481, - 433, 118, 438, 439, 433, 433, 433, 445, - 433, 471, 433, 471, 120, 433, 433, 136, - 472, 433, 118, 438, 439, 433, 433, 433, - 445, 433, 471, 433, 464, 465, 470, 470, - 123, 118, 438, 439, 433, 433, 433, 468, - 433, 433, 441, 433, 464, 465, 466, 470, - 123, 118, 438, 439, 433, 433, 149, 468, - 433, 433, 441, 433, 462, 433, 505, 433, - 490, 490, 123, 118, 438, 439, 433, 433, - 433, 445, 433, 462, 433, 462, 433, 433, - 433, 481, 481, 433, 118, 438, 439, 433, - 433, 433, 445, 433, 462, 433, 462, 433, - 433, 433, 481, 506, 433, 118, 438, 439, - 433, 433, 433, 445, 433, 462, 433, 462, - 433, 505, 433, 481, 481, 433, 118, 438, - 439, 433, 433, 433, 445, 433, 462, 433, - 462, 120, 433, 433, 136, 463, 433, 118, - 438, 439, 433, 433, 433, 445, 433, 462, - 433, 455, 456, 461, 461, 123, 118, 438, - 439, 433, 433, 433, 459, 433, 433, 441, - 433, 455, 456, 457, 461, 123, 118, 438, - 439, 433, 433, 151, 459, 433, 433, 441, - 433, 453, 433, 507, 433, 490, 490, 123, - 118, 438, 439, 433, 433, 433, 445, 433, - 453, 433, 453, 433, 433, 433, 481, 481, - 433, 118, 438, 439, 433, 433, 433, 445, - 433, 453, 433, 453, 433, 433, 433, 481, - 508, 433, 118, 438, 439, 433, 433, 433, - 445, 433, 453, 433, 453, 433, 507, 433, - 481, 481, 433, 118, 438, 439, 433, 433, - 433, 445, 433, 453, 433, 453, 120, 433, - 433, 136, 454, 433, 118, 438, 439, 433, - 433, 433, 445, 433, 453, 433, 446, 447, - 452, 452, 123, 118, 438, 439, 433, 433, - 433, 450, 433, 433, 441, 433, 446, 447, - 448, 452, 123, 118, 438, 439, 433, 433, - 153, 450, 433, 433, 441, 433, 443, 433, - 509, 433, 490, 490, 123, 118, 438, 439, - 433, 433, 433, 445, 433, 443, 433, 443, - 433, 433, 433, 481, 481, 433, 118, 438, - 439, 433, 433, 433, 445, 433, 443, 433, - 443, 433, 433, 433, 481, 510, 433, 118, - 438, 439, 433, 433, 433, 445, 433, 443, - 433, 443, 433, 509, 433, 481, 481, 433, - 118, 438, 439, 433, 433, 433, 445, 433, - 443, 433, 443, 120, 433, 433, 136, 444, - 433, 118, 438, 439, 433, 433, 433, 445, - 433, 443, 433, 434, 435, 437, 437, 123, - 118, 438, 439, 433, 433, 433, 440, 433, - 433, 441, 433, 188, 189, 190, 191, 511, - 363, 84, 79, 194, 195, 196, 196, 156, - 197, 361, 188, 200, 361, 204, 512, 206, - 207, 6, 1, 208, 209, 203, 203, 38, - 210, 203, 203, 211, 203, 214, 189, 190, - 191, 513, 514, 84, 157, 515, 516, 203, - 196, 156, 517, 203, 214, 200, 203, 116, - 518, 518, 84, 157, 208, 209, 203, 203, - 156, 519, 203, 520, 203, 203, 521, 515, - 516, 203, 515, 516, 203, 255, 203, 515, - 522, 203, 515, 523, 203, 515, 203, 520, - 203, 203, 203, 515, 516, 203, 524, 3, - 361, 361, 402, 431, 361, 79, 194, 195, - 361, 361, 361, 366, 361, 524, 361, 525, - 368, 526, 527, 84, 157, 515, 516, 203, - 203, 158, 371, 203, 203, 200, 203, 528, - 368, 529, 529, 84, 157, 515, 516, 203, - 203, 203, 371, 203, 203, 200, 203, 368, - 529, 529, 84, 157, 515, 516, 203, 203, - 203, 371, 203, 203, 200, 203, 525, 368, - 529, 529, 84, 157, 515, 516, 203, 203, - 203, 371, 203, 203, 200, 203, 525, 368, - 526, 529, 84, 157, 515, 516, 203, 203, - 158, 371, 203, 203, 200, 203, 214, 203, - 280, 116, 530, 530, 160, 157, 208, 209, - 203, 203, 203, 519, 203, 214, 203, 531, - 184, 532, 533, 162, 157, 515, 516, 203, - 203, 203, 534, 203, 184, 532, 533, 162, - 157, 515, 516, 203, 203, 203, 534, 203, - 532, 532, 162, 157, 515, 516, 203, 203, - 203, 534, 203, 535, 181, 536, 537, 165, - 157, 515, 516, 203, 203, 203, 534, 203, - 181, 536, 537, 165, 157, 515, 516, 203, - 203, 203, 534, 203, 536, 536, 165, 157, - 515, 516, 203, 203, 203, 534, 203, 538, - 178, 539, 540, 168, 157, 515, 516, 203, - 203, 203, 534, 203, 178, 539, 540, 168, - 157, 515, 516, 203, 203, 203, 534, 203, - 539, 539, 168, 157, 515, 516, 203, 203, - 203, 534, 203, 541, 175, 542, 543, 203, - 157, 515, 516, 203, 203, 203, 534, 203, - 175, 542, 543, 203, 157, 515, 516, 203, - 203, 203, 534, 203, 542, 542, 203, 157, - 515, 516, 203, 203, 203, 534, 203, 544, - 203, 545, 546, 203, 157, 515, 516, 203, - 203, 172, 203, 171, 203, 542, 542, 203, - 157, 515, 516, 203, 542, 542, 203, 157, - 515, 516, 203, 544, 203, 542, 542, 203, - 157, 515, 516, 203, 544, 203, 545, 542, - 203, 157, 515, 516, 203, 203, 172, 203, - 524, 171, 361, 361, 98, 365, 361, 79, - 194, 195, 361, 361, 361, 366, 361, 524, - 361, 548, 547, 549, 549, 547, 186, 550, - 551, 547, 549, 549, 547, 186, 550, 551, - 547, 552, 547, 547, 553, 550, 551, 547, - 550, 551, 547, 554, 547, 550, 555, 547, - 550, 556, 547, 550, 547, 552, 547, 547, - 547, 550, 551, 547, 188, 432, 432, 432, - 432, 432, 432, 432, 432, 432, 196, 432, - 432, 432, 432, 188, 432, 0 + 1, 0, 2, 2, 3, 1, 0, 4, + 4, 3, 0, 3, 0, 5, 5, 6, + 1, 0, 7, 7, 6, 0, 6, 0, + 8, 8, 9, 1, 0, 10, 10, 9, + 0, 9, 0, 11, 11, 12, 1, 0, + 13, 13, 12, 0, 12, 0, 14, 0, + 0, 0, 1, 0, 15, 0, 16, 0, + 17, 11, 11, 12, 1, 0, 18, 0, + 19, 0, 20, 8, 8, 9, 1, 0, + 21, 0, 22, 0, 23, 5, 5, 6, + 1, 0, 24, 0, 25, 0, 26, 2, + 2, 3, 1, 0, 26, 2, 2, 3, + 1, 0, 0, 0, 0, 27, 0, 28, + 2, 2, 3, 1, 0, 28, 2, 2, + 3, 1, 0, 0, 0, 0, 29, 0, + 30, 2, 2, 3, 1, 0, 30, 2, + 2, 3, 1, 0, 0, 0, 0, 31, + 0, 32, 2, 2, 3, 1, 0, 32, + 2, 2, 3, 1, 0, 0, 0, 0, + 33, 0, 34, 2, 2, 3, 1, 0, + 34, 2, 2, 3, 1, 0, 0, 0, + 0, 35, 0, 37, 36, 38, 38, 39, + 37, 36, 40, 40, 39, 36, 39, 36, + 41, 41, 42, 37, 36, 43, 43, 42, + 36, 42, 36, 44, 44, 45, 37, 36, + 46, 46, 45, 36, 45, 36, 47, 47, + 48, 37, 36, 49, 49, 48, 36, 48, + 36, 50, 36, 36, 36, 37, 36, 51, + 36, 52, 36, 53, 47, 47, 48, 37, + 36, 54, 36, 55, 36, 56, 44, 44, + 45, 37, 36, 57, 36, 58, 36, 59, + 41, 41, 42, 37, 36, 60, 36, 61, + 36, 62, 38, 38, 39, 37, 36, 62, + 38, 38, 39, 37, 36, 36, 36, 36, + 63, 36, 64, 38, 38, 39, 37, 36, + 64, 38, 38, 39, 37, 36, 36, 36, + 36, 65, 36, 66, 38, 38, 39, 37, + 36, 66, 38, 38, 39, 37, 36, 36, + 36, 36, 67, 36, 68, 38, 38, 39, + 37, 36, 68, 38, 38, 39, 37, 36, + 36, 36, 36, 69, 36, 70, 38, 38, + 39, 37, 36, 70, 38, 38, 39, 37, + 36, 36, 36, 36, 71, 36, 73, 72, + 74, 74, 75, 73, 72, 77, 77, 75, + 76, 75, 76, 78, 78, 79, 73, 72, + 80, 80, 79, 72, 79, 72, 81, 81, + 82, 73, 72, 83, 83, 82, 72, 82, + 72, 84, 84, 85, 73, 72, 86, 86, + 85, 72, 85, 72, 87, 72, 72, 72, + 73, 72, 88, 72, 89, 72, 90, 84, + 84, 85, 73, 72, 91, 72, 92, 72, + 93, 81, 81, 82, 73, 72, 94, 72, + 95, 72, 96, 78, 78, 79, 73, 72, + 97, 72, 98, 72, 99, 74, 74, 75, + 73, 72, 99, 74, 74, 75, 73, 72, + 72, 72, 72, 100, 72, 101, 74, 74, + 75, 73, 72, 101, 74, 74, 75, 73, + 72, 72, 72, 72, 102, 72, 103, 74, + 74, 75, 73, 72, 103, 74, 74, 75, + 73, 72, 72, 72, 72, 104, 72, 105, + 74, 74, 75, 73, 72, 105, 74, 74, + 75, 73, 72, 72, 72, 72, 106, 72, + 107, 74, 74, 75, 73, 72, 109, 108, + 110, 110, 111, 109, 108, 112, 112, 111, + 108, 111, 108, 113, 113, 114, 109, 108, + 115, 115, 114, 108, 114, 108, 116, 116, + 117, 109, 108, 118, 118, 117, 108, 117, + 108, 119, 119, 120, 109, 108, 121, 121, + 120, 108, 120, 108, 122, 108, 108, 108, + 109, 108, 123, 108, 124, 108, 125, 119, + 119, 120, 109, 108, 126, 108, 127, 108, + 128, 116, 116, 117, 109, 108, 129, 108, + 130, 108, 131, 113, 113, 114, 109, 108, + 132, 108, 133, 108, 134, 110, 110, 111, + 109, 108, 134, 110, 110, 111, 109, 108, + 108, 108, 108, 135, 108, 136, 110, 110, + 111, 109, 108, 136, 110, 110, 111, 109, + 108, 108, 108, 108, 137, 108, 138, 110, + 110, 111, 109, 108, 138, 110, 110, 111, + 109, 108, 108, 108, 108, 139, 108, 140, + 110, 110, 111, 109, 108, 140, 110, 110, + 111, 109, 108, 108, 108, 108, 141, 108, + 142, 110, 110, 111, 109, 108, 142, 110, + 110, 111, 109, 108, 108, 108, 108, 143, + 108, 107, 74, 74, 75, 73, 72, 72, + 72, 72, 144, 72, 77, 77, 75, 1, + 0, 145, 145, 146, 1, 0, 4, 4, + 146, 0, 147, 147, 148, 149, 0, 150, + 150, 148, 0, 148, 0, 151, 151, 152, + 149, 0, 153, 153, 152, 0, 152, 0, + 154, 154, 155, 149, 0, 156, 156, 155, + 0, 155, 0, 149, 0, 157, 0, 0, + 0, 149, 0, 158, 0, 159, 0, 160, + 154, 154, 155, 149, 0, 161, 0, 162, + 0, 163, 151, 151, 152, 149, 0, 164, + 0, 165, 0, 166, 147, 147, 148, 149, + 0, 167, 0, 168, 0, 170, 169, 172, + 173, 174, 175, 176, 177, 75, 73, 171, + 178, 179, 179, 144, 171, 180, 181, 182, + 183, 184, 171, 186, 187, 188, 189, 3, + 1, 185, 190, 185, 185, 35, 185, 185, + 185, 191, 185, 192, 187, 193, 193, 3, + 1, 185, 190, 185, 185, 185, 185, 185, + 185, 191, 185, 187, 193, 193, 3, 1, + 185, 190, 185, 185, 185, 185, 185, 185, + 191, 185, 194, 185, 185, 185, 16, 195, + 185, 1, 185, 190, 185, 185, 185, 185, + 185, 194, 185, 196, 197, 198, 199, 3, + 1, 185, 190, 185, 185, 33, 185, 185, + 185, 191, 185, 200, 197, 201, 201, 3, + 1, 185, 190, 185, 185, 185, 185, 185, + 185, 191, 185, 197, 201, 201, 3, 1, + 185, 190, 185, 185, 185, 185, 185, 185, + 191, 185, 202, 185, 185, 185, 16, 203, + 185, 1, 185, 190, 185, 185, 185, 185, + 185, 202, 185, 204, 205, 206, 207, 3, + 1, 185, 190, 185, 185, 31, 185, 185, + 185, 191, 185, 208, 205, 209, 209, 3, + 1, 185, 190, 185, 185, 185, 185, 185, + 185, 191, 185, 205, 209, 209, 3, 1, + 185, 190, 185, 185, 185, 185, 185, 185, + 191, 185, 210, 185, 185, 185, 16, 211, + 185, 1, 185, 190, 185, 185, 185, 185, + 185, 210, 185, 212, 213, 214, 215, 3, + 1, 185, 190, 185, 185, 29, 185, 185, + 185, 191, 185, 216, 213, 217, 217, 3, + 1, 185, 190, 185, 185, 185, 185, 185, + 185, 191, 185, 213, 217, 217, 3, 1, + 185, 190, 185, 185, 185, 185, 185, 185, + 191, 185, 218, 185, 185, 185, 16, 219, + 185, 1, 185, 190, 185, 185, 185, 185, + 185, 218, 185, 220, 221, 222, 223, 3, + 1, 185, 190, 185, 185, 27, 185, 185, + 185, 191, 185, 224, 221, 225, 225, 3, + 1, 185, 190, 185, 185, 185, 185, 185, + 185, 191, 185, 221, 225, 225, 3, 1, + 185, 190, 185, 185, 185, 185, 185, 185, + 191, 185, 16, 226, 185, 1, 185, 190, + 185, 227, 227, 185, 1, 185, 190, 185, + 228, 185, 185, 229, 185, 190, 185, 190, + 185, 230, 185, 231, 185, 228, 185, 185, + 185, 185, 190, 185, 16, 185, 232, 232, + 3, 1, 185, 190, 185, 233, 25, 234, + 235, 6, 1, 185, 190, 185, 25, 234, + 235, 6, 1, 185, 190, 185, 234, 234, + 6, 1, 185, 190, 185, 236, 22, 237, + 238, 9, 1, 185, 190, 185, 22, 237, + 238, 9, 1, 185, 190, 185, 237, 237, + 9, 1, 185, 190, 185, 239, 19, 240, + 241, 12, 1, 185, 190, 185, 19, 240, + 241, 12, 1, 185, 190, 185, 240, 240, + 12, 1, 185, 190, 185, 242, 16, 227, + 243, 185, 1, 185, 190, 185, 16, 227, + 243, 185, 1, 185, 190, 185, 227, 244, + 185, 1, 185, 190, 185, 16, 185, 227, + 227, 185, 1, 185, 190, 185, 221, 225, + 225, 3, 1, 185, 190, 185, 220, 221, + 225, 225, 3, 1, 185, 190, 185, 185, + 185, 185, 185, 185, 191, 185, 220, 221, + 222, 225, 3, 1, 185, 190, 185, 185, + 27, 185, 185, 185, 191, 185, 218, 185, + 245, 185, 232, 232, 3, 1, 185, 190, + 185, 185, 185, 185, 185, 218, 185, 218, + 185, 185, 185, 227, 227, 185, 1, 185, + 190, 185, 185, 185, 185, 185, 218, 185, + 218, 185, 185, 185, 227, 246, 185, 1, + 185, 190, 185, 185, 185, 185, 185, 218, + 185, 218, 185, 245, 185, 227, 227, 185, + 1, 185, 190, 185, 185, 185, 185, 185, + 218, 185, 212, 213, 217, 217, 3, 1, + 185, 190, 185, 185, 185, 185, 185, 185, + 191, 185, 212, 213, 214, 217, 3, 1, + 185, 190, 185, 185, 29, 185, 185, 185, + 191, 185, 210, 185, 247, 185, 232, 232, + 3, 1, 185, 190, 185, 185, 185, 185, + 185, 210, 185, 210, 185, 185, 185, 227, + 227, 185, 1, 185, 190, 185, 185, 185, + 185, 185, 210, 185, 210, 185, 185, 185, + 227, 248, 185, 1, 185, 190, 185, 185, + 185, 185, 185, 210, 185, 210, 185, 247, + 185, 227, 227, 185, 1, 185, 190, 185, + 185, 185, 185, 185, 210, 185, 204, 205, + 209, 209, 3, 1, 185, 190, 185, 185, + 185, 185, 185, 185, 191, 185, 204, 205, + 206, 209, 3, 1, 185, 190, 185, 185, + 31, 185, 185, 185, 191, 185, 202, 185, + 249, 185, 232, 232, 3, 1, 185, 190, + 185, 185, 185, 185, 185, 202, 185, 202, + 185, 185, 185, 227, 227, 185, 1, 185, + 190, 185, 185, 185, 185, 185, 202, 185, + 202, 185, 185, 185, 227, 250, 185, 1, + 185, 190, 185, 185, 185, 185, 185, 202, + 185, 202, 185, 249, 185, 227, 227, 185, + 1, 185, 190, 185, 185, 185, 185, 185, + 202, 185, 196, 197, 201, 201, 3, 1, + 185, 190, 185, 185, 185, 185, 185, 185, + 191, 185, 196, 197, 198, 201, 3, 1, + 185, 190, 185, 185, 33, 185, 185, 185, + 191, 185, 194, 185, 251, 185, 232, 232, + 3, 1, 185, 190, 185, 185, 185, 185, + 185, 194, 185, 194, 185, 185, 185, 227, + 227, 185, 1, 185, 190, 185, 185, 185, + 185, 185, 194, 185, 194, 185, 185, 185, + 227, 252, 185, 1, 185, 190, 185, 185, + 185, 185, 185, 194, 185, 194, 185, 251, + 185, 227, 227, 185, 1, 185, 190, 185, + 185, 185, 185, 185, 194, 185, 186, 187, + 193, 193, 3, 1, 185, 190, 185, 185, + 185, 185, 185, 185, 191, 185, 186, 187, + 188, 193, 3, 1, 185, 190, 185, 185, + 35, 185, 185, 185, 191, 185, 254, 255, + 256, 257, 39, 37, 253, 258, 253, 253, + 71, 253, 253, 253, 259, 253, 260, 255, + 261, 257, 39, 37, 253, 258, 253, 253, + 253, 253, 253, 253, 259, 253, 255, 261, + 257, 39, 37, 253, 258, 253, 253, 253, + 253, 253, 253, 259, 253, 262, 253, 253, + 253, 52, 263, 253, 37, 253, 258, 253, + 253, 253, 253, 253, 262, 253, 264, 265, + 266, 267, 39, 37, 253, 258, 253, 253, + 69, 253, 253, 253, 259, 253, 268, 265, + 269, 269, 39, 37, 253, 258, 253, 253, + 253, 253, 253, 253, 259, 253, 265, 269, + 269, 39, 37, 253, 258, 253, 253, 253, + 253, 253, 253, 259, 253, 270, 253, 253, + 253, 52, 271, 253, 37, 253, 258, 253, + 253, 253, 253, 253, 270, 253, 272, 273, + 274, 275, 39, 37, 253, 258, 253, 253, + 67, 253, 253, 253, 259, 253, 276, 273, + 277, 277, 39, 37, 253, 258, 253, 253, + 253, 253, 253, 253, 259, 253, 273, 277, + 277, 39, 37, 253, 258, 253, 253, 253, + 253, 253, 253, 259, 253, 278, 253, 253, + 253, 52, 279, 253, 37, 253, 258, 253, + 253, 253, 253, 253, 278, 253, 280, 281, + 282, 283, 39, 37, 253, 258, 253, 253, + 65, 253, 253, 253, 259, 253, 284, 281, + 285, 285, 39, 37, 253, 258, 253, 253, + 253, 253, 253, 253, 259, 253, 281, 285, + 285, 39, 37, 253, 258, 253, 253, 253, + 253, 253, 253, 259, 253, 286, 253, 253, + 253, 52, 287, 253, 37, 253, 258, 253, + 253, 253, 253, 253, 286, 253, 288, 289, + 290, 291, 39, 37, 253, 258, 253, 253, + 63, 253, 253, 253, 259, 253, 292, 289, + 293, 293, 39, 37, 253, 258, 253, 253, + 253, 253, 253, 253, 259, 253, 289, 293, + 293, 39, 37, 253, 258, 253, 253, 253, + 253, 253, 253, 259, 253, 52, 294, 253, + 37, 253, 258, 253, 295, 295, 253, 37, + 253, 258, 253, 296, 253, 253, 297, 253, + 258, 253, 258, 253, 298, 253, 299, 253, + 296, 253, 253, 253, 253, 258, 253, 52, + 253, 300, 300, 39, 37, 253, 258, 253, + 301, 61, 302, 303, 42, 37, 253, 258, + 253, 61, 302, 303, 42, 37, 253, 258, + 253, 302, 302, 42, 37, 253, 258, 253, + 304, 58, 305, 306, 45, 37, 253, 258, + 253, 58, 305, 306, 45, 37, 253, 258, + 253, 305, 305, 45, 37, 253, 258, 253, + 307, 55, 308, 309, 48, 37, 253, 258, + 253, 55, 308, 309, 48, 37, 253, 258, + 253, 308, 308, 48, 37, 253, 258, 253, + 310, 52, 295, 311, 253, 37, 253, 258, + 253, 52, 295, 311, 253, 37, 253, 258, + 253, 295, 312, 253, 37, 253, 258, 253, + 52, 253, 295, 295, 253, 37, 253, 258, + 253, 289, 293, 293, 39, 37, 253, 258, + 253, 288, 289, 293, 293, 39, 37, 253, + 258, 253, 253, 253, 253, 253, 253, 259, + 253, 288, 289, 290, 293, 39, 37, 253, + 258, 253, 253, 63, 253, 253, 253, 259, + 253, 286, 253, 313, 253, 300, 300, 39, + 37, 253, 258, 253, 253, 253, 253, 253, + 286, 253, 286, 253, 253, 253, 295, 295, + 253, 37, 253, 258, 253, 253, 253, 253, + 253, 286, 253, 286, 253, 253, 253, 295, + 314, 253, 37, 253, 258, 253, 253, 253, + 253, 253, 286, 253, 286, 253, 313, 253, + 295, 295, 253, 37, 253, 258, 253, 253, + 253, 253, 253, 286, 253, 280, 281, 285, + 285, 39, 37, 253, 258, 253, 253, 253, + 253, 253, 253, 259, 253, 280, 281, 282, + 285, 39, 37, 253, 258, 253, 253, 65, + 253, 253, 253, 259, 253, 278, 253, 315, + 253, 300, 300, 39, 37, 253, 258, 253, + 253, 253, 253, 253, 278, 253, 278, 253, + 253, 253, 295, 295, 253, 37, 253, 258, + 253, 253, 253, 253, 253, 278, 253, 278, + 253, 253, 253, 295, 316, 253, 37, 253, + 258, 253, 253, 253, 253, 253, 278, 253, + 278, 253, 315, 253, 295, 295, 253, 37, + 253, 258, 253, 253, 253, 253, 253, 278, + 253, 272, 273, 277, 277, 39, 37, 253, + 258, 253, 253, 253, 253, 253, 253, 259, + 253, 272, 273, 274, 277, 39, 37, 253, + 258, 253, 253, 67, 253, 253, 253, 259, + 253, 270, 253, 317, 253, 300, 300, 39, + 37, 253, 258, 253, 253, 253, 253, 253, + 270, 253, 270, 253, 253, 253, 295, 295, + 253, 37, 253, 258, 253, 253, 253, 253, + 253, 270, 253, 270, 253, 253, 253, 295, + 318, 253, 37, 253, 258, 253, 253, 253, + 253, 253, 270, 253, 270, 253, 317, 253, + 295, 295, 253, 37, 253, 258, 253, 253, + 253, 253, 253, 270, 253, 264, 265, 269, + 269, 39, 37, 253, 258, 253, 253, 253, + 253, 253, 253, 259, 253, 264, 265, 266, + 269, 39, 37, 253, 258, 253, 253, 69, + 253, 253, 253, 259, 253, 262, 253, 319, + 253, 300, 300, 39, 37, 253, 258, 253, + 253, 253, 253, 253, 262, 253, 262, 253, + 253, 253, 295, 295, 253, 37, 253, 258, + 253, 253, 253, 253, 253, 262, 253, 262, + 253, 253, 253, 295, 320, 253, 37, 253, + 258, 253, 253, 253, 253, 253, 262, 253, + 262, 253, 319, 253, 295, 295, 253, 37, + 253, 258, 253, 253, 253, 253, 253, 262, + 253, 70, 38, 38, 39, 37, 253, 254, + 255, 261, 257, 39, 37, 253, 258, 253, + 253, 253, 253, 253, 253, 259, 253, 322, + 175, 323, 323, 75, 73, 321, 178, 321, + 321, 321, 321, 321, 321, 182, 321, 175, + 323, 323, 75, 73, 321, 178, 321, 321, + 321, 321, 321, 321, 182, 321, 324, 321, + 321, 321, 89, 325, 321, 73, 321, 178, + 321, 321, 321, 321, 321, 324, 321, 326, + 327, 328, 329, 75, 73, 321, 178, 321, + 321, 106, 321, 321, 321, 182, 321, 330, + 327, 331, 331, 75, 73, 321, 178, 321, + 321, 321, 321, 321, 321, 182, 321, 327, + 331, 331, 75, 73, 321, 178, 321, 321, + 321, 321, 321, 321, 182, 321, 332, 321, + 321, 321, 89, 333, 321, 73, 321, 178, + 321, 321, 321, 321, 321, 332, 321, 334, + 335, 336, 337, 75, 73, 321, 178, 321, + 321, 104, 321, 321, 321, 182, 321, 338, + 335, 339, 339, 75, 73, 321, 178, 321, + 321, 321, 321, 321, 321, 182, 321, 335, + 339, 339, 75, 73, 321, 178, 321, 321, + 321, 321, 321, 321, 182, 321, 340, 321, + 321, 321, 89, 341, 321, 73, 321, 178, + 321, 321, 321, 321, 321, 340, 321, 342, + 343, 344, 345, 75, 73, 321, 178, 321, + 321, 102, 321, 321, 321, 182, 321, 346, + 343, 347, 347, 75, 73, 321, 178, 321, + 321, 321, 321, 321, 321, 182, 321, 343, + 347, 347, 75, 73, 321, 178, 321, 321, + 321, 321, 321, 321, 182, 321, 348, 321, + 321, 321, 89, 349, 321, 73, 321, 178, + 321, 321, 321, 321, 321, 348, 321, 350, + 351, 352, 353, 75, 73, 321, 178, 321, + 321, 100, 321, 321, 321, 182, 321, 354, + 351, 355, 355, 75, 73, 321, 178, 321, + 321, 321, 321, 321, 321, 182, 321, 351, + 355, 355, 75, 73, 321, 178, 321, 321, + 321, 321, 321, 321, 182, 321, 89, 356, + 321, 73, 321, 178, 321, 357, 357, 321, + 73, 321, 178, 321, 358, 321, 321, 359, + 321, 178, 321, 178, 321, 360, 321, 361, + 321, 358, 321, 321, 321, 321, 178, 321, + 89, 321, 362, 362, 75, 73, 321, 178, + 321, 363, 98, 364, 365, 79, 73, 321, + 178, 321, 98, 364, 365, 79, 73, 321, + 178, 321, 364, 364, 79, 73, 321, 178, + 321, 366, 95, 367, 368, 82, 73, 321, + 178, 321, 95, 367, 368, 82, 73, 321, + 178, 321, 367, 367, 82, 73, 321, 178, + 321, 369, 92, 370, 371, 85, 73, 321, + 178, 321, 92, 370, 371, 85, 73, 321, + 178, 321, 370, 370, 85, 73, 321, 178, + 321, 372, 89, 357, 373, 321, 73, 321, + 178, 321, 89, 357, 373, 321, 73, 321, + 178, 321, 357, 374, 321, 73, 321, 178, + 321, 89, 321, 357, 357, 321, 73, 321, + 178, 321, 351, 355, 355, 75, 73, 321, + 178, 321, 350, 351, 355, 355, 75, 73, + 321, 178, 321, 321, 321, 321, 321, 321, + 182, 321, 350, 351, 352, 355, 75, 73, + 321, 178, 321, 321, 100, 321, 321, 321, + 182, 321, 348, 321, 375, 321, 362, 362, + 75, 73, 321, 178, 321, 321, 321, 321, + 321, 348, 321, 348, 321, 321, 321, 357, + 357, 321, 73, 321, 178, 321, 321, 321, + 321, 321, 348, 321, 348, 321, 321, 321, + 357, 376, 321, 73, 321, 178, 321, 321, + 321, 321, 321, 348, 321, 348, 321, 375, + 321, 357, 357, 321, 73, 321, 178, 321, + 321, 321, 321, 321, 348, 321, 342, 343, + 347, 347, 75, 73, 321, 178, 321, 321, + 321, 321, 321, 321, 182, 321, 342, 343, + 344, 347, 75, 73, 321, 178, 321, 321, + 102, 321, 321, 321, 182, 321, 340, 321, + 377, 321, 362, 362, 75, 73, 321, 178, + 321, 321, 321, 321, 321, 340, 321, 340, + 321, 321, 321, 357, 357, 321, 73, 321, + 178, 321, 321, 321, 321, 321, 340, 321, + 340, 321, 321, 321, 357, 378, 321, 73, + 321, 178, 321, 321, 321, 321, 321, 340, + 321, 340, 321, 377, 321, 357, 357, 321, + 73, 321, 178, 321, 321, 321, 321, 321, + 340, 321, 334, 335, 339, 339, 75, 73, + 321, 178, 321, 321, 321, 321, 321, 321, + 182, 321, 334, 335, 336, 339, 75, 73, + 321, 178, 321, 321, 104, 321, 321, 321, + 182, 321, 332, 321, 379, 321, 362, 362, + 75, 73, 321, 178, 321, 321, 321, 321, + 321, 332, 321, 332, 321, 321, 321, 357, + 357, 321, 73, 321, 178, 321, 321, 321, + 321, 321, 332, 321, 332, 321, 321, 321, + 357, 380, 321, 73, 321, 178, 321, 321, + 321, 321, 321, 332, 321, 332, 321, 379, + 321, 357, 357, 321, 73, 321, 178, 321, + 321, 321, 321, 321, 332, 321, 326, 327, + 331, 331, 75, 73, 321, 178, 321, 321, + 321, 321, 321, 321, 182, 321, 326, 327, + 328, 331, 75, 73, 321, 178, 321, 321, + 106, 321, 321, 321, 182, 321, 324, 321, + 381, 321, 362, 362, 75, 73, 321, 178, + 321, 321, 321, 321, 321, 324, 321, 324, + 321, 321, 321, 357, 357, 321, 73, 321, + 178, 321, 321, 321, 321, 321, 324, 321, + 324, 321, 321, 321, 357, 382, 321, 73, + 321, 178, 321, 321, 321, 321, 321, 324, + 321, 324, 321, 381, 321, 357, 357, 321, + 73, 321, 178, 321, 321, 321, 321, 321, + 324, 321, 107, 74, 74, 75, 73, 383, + 383, 383, 383, 144, 383, 174, 175, 323, + 323, 75, 73, 321, 178, 321, 321, 321, + 321, 321, 321, 182, 321, 107, 74, 74, + 75, 73, 383, 385, 386, 387, 388, 111, + 109, 384, 389, 384, 384, 143, 384, 384, + 384, 390, 384, 391, 386, 388, 388, 111, + 109, 384, 389, 384, 384, 384, 384, 384, + 384, 390, 384, 386, 388, 388, 111, 109, + 384, 389, 384, 384, 384, 384, 384, 384, + 390, 384, 392, 384, 384, 384, 124, 393, + 384, 109, 384, 389, 384, 384, 384, 384, + 384, 392, 384, 394, 395, 396, 397, 111, + 109, 384, 389, 384, 384, 141, 384, 384, + 384, 390, 384, 398, 395, 399, 399, 111, + 109, 384, 389, 384, 384, 384, 384, 384, + 384, 390, 384, 395, 399, 399, 111, 109, + 384, 389, 384, 384, 384, 384, 384, 384, + 390, 384, 400, 384, 384, 384, 124, 401, + 384, 109, 384, 389, 384, 384, 384, 384, + 384, 400, 384, 402, 403, 404, 405, 111, + 109, 384, 389, 384, 384, 139, 384, 384, + 384, 390, 384, 406, 403, 407, 407, 111, + 109, 384, 389, 384, 384, 384, 384, 384, + 384, 390, 384, 403, 407, 407, 111, 109, + 384, 389, 384, 384, 384, 384, 384, 384, + 390, 384, 408, 384, 384, 384, 124, 409, + 384, 109, 384, 389, 384, 384, 384, 384, + 384, 408, 384, 410, 411, 412, 413, 111, + 109, 384, 389, 384, 384, 137, 384, 384, + 384, 390, 384, 414, 411, 415, 415, 111, + 109, 384, 389, 384, 384, 384, 384, 384, + 384, 390, 384, 411, 415, 415, 111, 109, + 384, 389, 384, 384, 384, 384, 384, 384, + 390, 384, 416, 384, 384, 384, 124, 417, + 384, 109, 384, 389, 384, 384, 384, 384, + 384, 416, 384, 418, 419, 420, 421, 111, + 109, 384, 389, 384, 384, 135, 384, 384, + 384, 390, 384, 422, 419, 423, 423, 111, + 109, 384, 389, 384, 384, 384, 384, 384, + 384, 390, 384, 419, 423, 423, 111, 109, + 384, 389, 384, 384, 384, 384, 384, 384, + 390, 384, 124, 424, 384, 109, 384, 389, + 384, 425, 425, 384, 109, 384, 389, 384, + 426, 384, 384, 427, 384, 389, 384, 389, + 384, 428, 384, 429, 384, 426, 384, 384, + 384, 384, 389, 384, 124, 384, 430, 430, + 111, 109, 384, 389, 384, 431, 133, 432, + 433, 114, 109, 384, 389, 384, 133, 432, + 433, 114, 109, 384, 389, 384, 432, 432, + 114, 109, 384, 389, 384, 434, 130, 435, + 436, 117, 109, 384, 389, 384, 130, 435, + 436, 117, 109, 384, 389, 384, 435, 435, + 117, 109, 384, 389, 384, 437, 127, 438, + 439, 120, 109, 384, 389, 384, 127, 438, + 439, 120, 109, 384, 389, 384, 438, 438, + 120, 109, 384, 389, 384, 440, 124, 425, + 441, 384, 109, 384, 389, 384, 124, 425, + 441, 384, 109, 384, 389, 384, 425, 442, + 384, 109, 384, 389, 384, 124, 384, 425, + 425, 384, 109, 384, 389, 384, 419, 423, + 423, 111, 109, 384, 389, 384, 418, 419, + 423, 423, 111, 109, 384, 389, 384, 384, + 384, 384, 384, 384, 390, 384, 418, 419, + 420, 423, 111, 109, 384, 389, 384, 384, + 135, 384, 384, 384, 390, 384, 416, 384, + 443, 384, 430, 430, 111, 109, 384, 389, + 384, 384, 384, 384, 384, 416, 384, 416, + 384, 384, 384, 425, 425, 384, 109, 384, + 389, 384, 384, 384, 384, 384, 416, 384, + 416, 384, 384, 384, 425, 444, 384, 109, + 384, 389, 384, 384, 384, 384, 384, 416, + 384, 416, 384, 443, 384, 425, 425, 384, + 109, 384, 389, 384, 384, 384, 384, 384, + 416, 384, 410, 411, 415, 415, 111, 109, + 384, 389, 384, 384, 384, 384, 384, 384, + 390, 384, 410, 411, 412, 415, 111, 109, + 384, 389, 384, 384, 137, 384, 384, 384, + 390, 384, 408, 384, 445, 384, 430, 430, + 111, 109, 384, 389, 384, 384, 384, 384, + 384, 408, 384, 408, 384, 384, 384, 425, + 425, 384, 109, 384, 389, 384, 384, 384, + 384, 384, 408, 384, 408, 384, 384, 384, + 425, 446, 384, 109, 384, 389, 384, 384, + 384, 384, 384, 408, 384, 408, 384, 445, + 384, 425, 425, 384, 109, 384, 389, 384, + 384, 384, 384, 384, 408, 384, 402, 403, + 407, 407, 111, 109, 384, 389, 384, 384, + 384, 384, 384, 384, 390, 384, 402, 403, + 404, 407, 111, 109, 384, 389, 384, 384, + 139, 384, 384, 384, 390, 384, 400, 384, + 447, 384, 430, 430, 111, 109, 384, 389, + 384, 384, 384, 384, 384, 400, 384, 400, + 384, 384, 384, 425, 425, 384, 109, 384, + 389, 384, 384, 384, 384, 384, 400, 384, + 400, 384, 384, 384, 425, 448, 384, 109, + 384, 389, 384, 384, 384, 384, 384, 400, + 384, 400, 384, 447, 384, 425, 425, 384, + 109, 384, 389, 384, 384, 384, 384, 384, + 400, 384, 394, 395, 399, 399, 111, 109, + 384, 389, 384, 384, 384, 384, 384, 384, + 390, 384, 394, 395, 396, 399, 111, 109, + 384, 389, 384, 384, 141, 384, 384, 384, + 390, 384, 392, 384, 449, 384, 430, 430, + 111, 109, 384, 389, 384, 384, 384, 384, + 384, 392, 384, 392, 384, 384, 384, 425, + 425, 384, 109, 384, 389, 384, 384, 384, + 384, 384, 392, 384, 392, 384, 384, 384, + 425, 450, 384, 109, 384, 389, 384, 384, + 384, 384, 384, 392, 384, 392, 384, 449, + 384, 425, 425, 384, 109, 384, 389, 384, + 384, 384, 384, 384, 392, 384, 385, 386, + 388, 388, 111, 109, 384, 389, 384, 384, + 384, 384, 384, 384, 390, 384, 172, 173, + 174, 175, 451, 323, 75, 73, 321, 178, + 179, 179, 144, 321, 321, 172, 182, 321, + 186, 452, 188, 189, 3, 1, 185, 190, + 185, 185, 35, 185, 185, 185, 191, 185, + 194, 173, 174, 175, 453, 454, 75, 149, + 185, 455, 185, 179, 144, 185, 185, 194, + 182, 185, 107, 456, 456, 75, 149, 185, + 190, 185, 185, 144, 185, 457, 185, 185, + 458, 185, 455, 185, 455, 185, 459, 185, + 231, 185, 457, 185, 185, 185, 185, 455, + 185, 194, 185, 251, 107, 460, 460, 146, + 149, 185, 190, 185, 185, 185, 185, 185, + 194, 185, 461, 168, 462, 463, 148, 149, + 185, 455, 185, 168, 462, 463, 148, 149, + 185, 455, 185, 462, 462, 148, 149, 185, + 455, 185, 464, 165, 465, 466, 152, 149, + 185, 455, 185, 165, 465, 466, 152, 149, + 185, 455, 185, 465, 465, 152, 149, 185, + 455, 185, 467, 162, 468, 469, 155, 149, + 185, 455, 185, 162, 468, 469, 155, 149, + 185, 455, 185, 468, 468, 155, 149, 185, + 455, 185, 470, 159, 471, 472, 185, 149, + 185, 455, 185, 159, 471, 472, 185, 149, + 185, 455, 185, 471, 471, 185, 149, 185, + 455, 185, 474, 473, 475, 475, 473, 170, + 473, 476, 473, 475, 475, 473, 170, 473, + 476, 473, 477, 473, 473, 478, 473, 476, + 473, 476, 473, 479, 473, 480, 473, 477, + 473, 473, 473, 473, 476, 473, 172, 383, + 383, 383, 383, 383, 383, 383, 383, 383, + 179, 383, 383, 383, 383, 172, 383, 0 }; static const short _indic_syllable_machine_trans_targs[] = { - 178, 200, 207, 209, 210, 4, 213, 5, - 7, 216, 8, 10, 219, 11, 13, 222, - 14, 16, 17, 199, 19, 20, 221, 22, - 23, 218, 25, 26, 215, 224, 228, 232, - 235, 239, 242, 246, 249, 253, 256, 178, - 279, 286, 288, 289, 41, 292, 42, 44, - 295, 45, 47, 298, 48, 50, 301, 51, - 53, 54, 278, 56, 57, 300, 59, 60, - 297, 62, 63, 294, 303, 307, 311, 314, - 318, 321, 325, 328, 332, 336, 178, 357, - 364, 366, 367, 78, 370, 178, 79, 81, - 373, 82, 84, 376, 85, 87, 379, 88, - 90, 91, 356, 93, 94, 378, 96, 97, - 375, 99, 100, 372, 381, 385, 389, 392, - 396, 399, 403, 406, 410, 178, 437, 444, - 446, 447, 114, 450, 115, 117, 453, 118, - 120, 456, 121, 123, 459, 124, 126, 127, - 436, 129, 130, 458, 132, 133, 455, 135, - 136, 452, 461, 465, 469, 472, 476, 479, - 483, 486, 490, 493, 414, 498, 509, 152, - 512, 154, 515, 155, 157, 518, 158, 160, - 521, 161, 524, 526, 527, 166, 167, 523, - 169, 170, 520, 172, 173, 517, 175, 176, - 514, 178, 532, 178, 179, 258, 337, 339, - 413, 415, 359, 360, 416, 412, 494, 495, - 384, 530, 539, 178, 180, 182, 36, 257, - 202, 203, 255, 227, 181, 35, 183, 251, - 1, 184, 186, 34, 250, 248, 185, 33, - 187, 244, 188, 190, 32, 243, 241, 189, - 31, 191, 237, 192, 194, 30, 236, 234, - 193, 29, 195, 230, 196, 198, 28, 229, - 226, 197, 27, 212, 0, 201, 206, 178, - 204, 205, 208, 2, 211, 3, 214, 6, - 24, 217, 9, 21, 220, 12, 18, 223, - 15, 225, 231, 233, 238, 240, 245, 247, - 252, 254, 178, 259, 261, 73, 334, 281, - 282, 335, 306, 260, 72, 262, 330, 38, - 263, 265, 71, 329, 327, 264, 70, 266, - 323, 267, 269, 69, 322, 320, 268, 68, - 270, 316, 271, 273, 67, 315, 313, 272, - 66, 274, 309, 275, 277, 65, 308, 305, - 276, 64, 291, 37, 280, 285, 178, 283, - 284, 287, 39, 290, 40, 293, 43, 61, - 296, 46, 58, 299, 49, 55, 302, 52, - 304, 310, 312, 317, 319, 324, 326, 331, - 333, 178, 338, 109, 340, 408, 75, 341, - 343, 108, 407, 405, 342, 107, 344, 401, - 345, 347, 106, 400, 398, 346, 105, 348, - 394, 349, 351, 104, 393, 391, 350, 103, - 352, 387, 353, 355, 102, 386, 383, 354, - 101, 369, 74, 358, 363, 178, 361, 362, - 365, 76, 368, 77, 371, 80, 98, 374, - 83, 95, 377, 86, 92, 380, 89, 382, - 388, 390, 395, 397, 402, 404, 409, 411, - 178, 178, 417, 419, 146, 145, 439, 440, - 492, 464, 418, 420, 488, 111, 421, 423, - 144, 487, 485, 422, 143, 424, 481, 425, - 427, 142, 480, 478, 426, 141, 428, 474, - 429, 431, 140, 473, 471, 430, 139, 432, - 467, 433, 435, 138, 466, 463, 434, 137, - 449, 110, 438, 443, 178, 441, 442, 445, - 112, 448, 113, 451, 116, 134, 454, 119, - 131, 457, 122, 128, 460, 125, 462, 468, - 470, 475, 477, 482, 484, 489, 491, 147, - 496, 497, 511, 500, 501, 529, 148, 505, - 499, 504, 502, 503, 506, 507, 150, 510, - 508, 149, 151, 513, 153, 174, 163, 516, - 156, 171, 519, 159, 168, 522, 162, 165, - 525, 164, 528, 178, 531, 177, 534, 535, - 533, 538, 178, 536, 537 + 166, 188, 2, 194, 3, 5, 197, 6, + 8, 200, 9, 11, 203, 12, 14, 15, + 187, 17, 18, 202, 20, 21, 199, 23, + 24, 196, 205, 208, 212, 214, 218, 220, + 224, 226, 230, 232, 166, 255, 37, 261, + 38, 40, 264, 41, 43, 267, 44, 46, + 270, 47, 49, 50, 254, 52, 53, 269, + 55, 56, 266, 58, 59, 263, 272, 275, + 279, 281, 285, 287, 291, 293, 297, 300, + 166, 321, 72, 327, 166, 73, 75, 330, + 76, 78, 333, 79, 81, 336, 82, 84, + 85, 320, 87, 88, 335, 90, 91, 332, + 93, 94, 329, 338, 341, 345, 347, 351, + 353, 357, 359, 363, 166, 389, 106, 395, + 107, 109, 398, 110, 112, 401, 113, 115, + 404, 116, 118, 119, 388, 121, 122, 403, + 124, 125, 400, 127, 128, 397, 406, 409, + 413, 415, 419, 421, 425, 427, 431, 433, + 366, 142, 444, 144, 447, 438, 145, 147, + 450, 148, 150, 453, 151, 154, 155, 455, + 157, 158, 452, 160, 161, 449, 163, 164, + 446, 166, 458, 166, 167, 234, 301, 303, + 365, 367, 323, 368, 434, 435, 340, 456, + 463, 166, 168, 170, 34, 233, 190, 207, + 169, 33, 171, 228, 172, 174, 32, 227, + 173, 31, 175, 222, 176, 178, 30, 221, + 177, 29, 179, 216, 180, 182, 28, 215, + 181, 27, 183, 210, 184, 186, 26, 209, + 185, 25, 193, 0, 189, 192, 191, 166, + 1, 195, 4, 22, 198, 7, 19, 201, + 10, 16, 204, 13, 206, 211, 213, 217, + 219, 223, 225, 229, 231, 166, 235, 237, + 69, 299, 257, 274, 236, 68, 238, 295, + 239, 241, 67, 294, 240, 66, 242, 289, + 243, 245, 65, 288, 244, 64, 246, 283, + 247, 249, 63, 282, 248, 62, 250, 277, + 251, 253, 61, 276, 252, 60, 260, 35, + 256, 259, 258, 166, 36, 262, 39, 57, + 265, 42, 54, 268, 45, 51, 271, 48, + 273, 278, 280, 284, 286, 290, 292, 296, + 298, 166, 302, 103, 304, 361, 305, 307, + 102, 360, 306, 101, 308, 355, 309, 311, + 100, 354, 310, 99, 312, 349, 313, 315, + 98, 348, 314, 97, 316, 343, 317, 319, + 96, 342, 318, 95, 326, 70, 322, 325, + 324, 166, 71, 328, 74, 92, 331, 77, + 89, 334, 80, 86, 337, 83, 339, 344, + 346, 350, 352, 356, 358, 362, 364, 166, + 166, 369, 371, 138, 137, 391, 408, 370, + 372, 429, 373, 375, 136, 428, 374, 135, + 376, 423, 377, 379, 134, 422, 378, 133, + 380, 417, 381, 383, 132, 416, 382, 131, + 384, 411, 385, 387, 130, 410, 386, 129, + 394, 104, 390, 393, 392, 166, 105, 396, + 108, 126, 399, 111, 123, 402, 114, 120, + 405, 117, 407, 412, 414, 418, 420, 424, + 426, 430, 432, 139, 436, 437, 443, 440, + 140, 439, 442, 441, 141, 445, 143, 162, + 448, 146, 159, 451, 149, 156, 454, 152, + 153, 166, 457, 165, 460, 459, 462, 461, + 166 }; static const char _indic_syllable_machine_trans_actions[] = { - 1, 0, 2, 2, 2, 0, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 0, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, - 0, 2, 2, 2, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 4, 0, - 2, 2, 2, 0, 2, 5, 0, 0, - 2, 0, 0, 2, 0, 0, 2, 0, - 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 2, 2, 6, 2, 6, - 2, 6, 2, 6, 2, 7, 0, 2, - 2, 2, 0, 2, 0, 0, 2, 0, + 1, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 6, 0, 8, 0, - 2, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 2, 2, 2, 0, 0, 2, + 2, 2, 2, 2, 3, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 0, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 4, 0, 0, 2, 5, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, - 2, 9, 0, 12, 2, 2, 6, 2, - 13, 13, 0, 0, 2, 2, 6, 2, - 6, 2, 0, 14, 2, 2, 0, 2, - 0, 0, 2, 2, 2, 0, 2, 2, - 0, 2, 2, 0, 2, 2, 2, 0, - 2, 2, 2, 2, 0, 2, 2, 2, - 0, 2, 2, 2, 2, 0, 2, 2, - 2, 0, 2, 2, 2, 2, 0, 2, - 2, 2, 0, 2, 0, 0, 0, 15, - 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 16, 2, 2, 0, 2, 0, - 0, 2, 2, 2, 0, 2, 2, 0, - 2, 2, 0, 2, 2, 2, 0, 2, - 2, 2, 2, 0, 2, 2, 2, 0, - 2, 2, 2, 2, 0, 2, 2, 2, - 0, 2, 2, 2, 2, 0, 2, 2, - 2, 0, 2, 0, 0, 0, 17, 0, - 0, 2, 0, 2, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 0, 2, 0, + 0, 0, 2, 2, 6, 2, 6, 2, + 6, 2, 6, 2, 7, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 0, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 18, 6, 0, 6, 6, 0, 6, - 2, 0, 6, 2, 6, 0, 6, 6, - 6, 2, 0, 6, 2, 6, 0, 6, - 6, 6, 2, 0, 6, 2, 6, 0, - 6, 6, 6, 2, 0, 6, 2, 6, - 0, 6, 0, 0, 0, 19, 0, 0, - 2, 0, 2, 0, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 2, + 6, 0, 2, 0, 2, 0, 0, 0, + 2, 0, 0, 2, 0, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 0, + 2, 8, 0, 11, 2, 2, 6, 0, + 12, 12, 0, 2, 6, 2, 6, 2, + 0, 13, 2, 0, 0, 2, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 2, 2, 0, 0, 2, + 2, 0, 2, 0, 0, 0, 0, 14, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 15, 2, 0, + 0, 2, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 2, + 2, 0, 0, 2, 2, 0, 2, 0, + 0, 0, 0, 16, 0, 2, 0, 0, + 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 20, 21, 2, 2, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 0, 2, 2, - 0, 2, 2, 2, 0, 2, 2, 2, - 2, 0, 2, 2, 2, 0, 2, 2, - 2, 2, 0, 2, 2, 2, 0, 2, - 2, 2, 2, 0, 2, 2, 2, 0, - 2, 0, 0, 0, 22, 0, 0, 2, - 0, 2, 0, 2, 0, 0, 2, 0, + 2, 17, 6, 0, 6, 6, 6, 0, + 0, 6, 6, 0, 6, 6, 6, 0, + 0, 6, 6, 0, 6, 6, 6, 0, + 0, 6, 6, 0, 6, 6, 6, 0, + 0, 6, 6, 0, 6, 0, 0, 0, + 0, 18, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 0, - 0, 8, 2, 0, 0, 2, 0, 2, - 0, 0, 0, 0, 8, 8, 0, 8, - 8, 0, 0, 2, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 19, + 20, 2, 0, 0, 0, 0, 2, 2, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 2, 2, 0, 0, 2, 2, 0, + 2, 0, 0, 0, 0, 21, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 2, 23, 2, 0, 0, 0, - 0, 0, 24, 0, 0 + 2, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 22, 2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 2, 0, 0, 2, 0, 0, 2, 0, + 0, 23, 2, 0, 0, 0, 0, 0, + 24 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -1157,10 +940,9 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1195,16 +977,7 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0 }; static const char _indic_syllable_machine_from_state_actions[] = { @@ -1228,10 +1001,7 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1268,14 +1038,7 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0 }; static const short _indic_syllable_machine_eof_trans[] = { @@ -1283,84 +1046,74 @@ static const short _indic_syllable_machine_eof_trans[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 79, 79, 79, 79, 86, 86, - 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 79, 1, 1, 1, 1, + 1, 1, 1, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 73, 73, + 77, 77, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 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, 186, 0, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 433, 362, 433, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 434, 434, - 434, 434, 434, 434, 434, 434, 362, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 362, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 362, 548, 548, 548, 548, 548, 548, - 548, 548, 548, 433 + 1, 1, 1, 1, 1, 170, 0, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 322, 322, 322, + 322, 322, 322, 322, 322, 384, 322, 384, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 322, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, + 474, 474, 474, 474, 474, 474, 474, 384 }; -static const int indic_syllable_machine_start = 178; -static const int indic_syllable_machine_first_final = 178; +static const int indic_syllable_machine_start = 166; +static const int indic_syllable_machine_first_final = 166; static const int indic_syllable_machine_error = -1; -static const int indic_syllable_machine_en_main = 178; +static const int indic_syllable_machine_en_main = 166; #line 36 "hb-ot-shape-complex-indic-machine.rl" -#line 97 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" #define found_syllable(syllable_type) \ @@ -1380,7 +1133,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 1384 "hb-ot-shape-complex-indic-machine.hh" +#line 1137 "hb-ot-shape-complex-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -1388,7 +1141,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 118 "hb-ot-shape-complex-indic-machine.rl" +#line 113 "hb-ot-shape-complex-indic-machine.rl" p = 0; @@ -1397,7 +1150,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 1401 "hb-ot-shape-complex-indic-machine.hh" +#line 1154 "hb-ot-shape-complex-indic-machine.hh" { int _slen; int _trans; @@ -1407,11 +1160,11 @@ find_syllables (hb_buffer_t *buffer) goto _test_eof; _resume: switch ( _indic_syllable_machine_from_state_actions[cs] ) { - case 11: + case 10: #line 1 "NONE" {ts = p;} break; -#line 1415 "hb-ot-shape-complex-indic-machine.hh" +#line 1168 "hb-ot-shape-complex-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -1433,72 +1186,72 @@ _eof_trans: #line 1 "NONE" {te = p+1;} break; - case 15: -#line 88 "hb-ot-shape-complex-indic-machine.rl" + case 14: +#line 83 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; - case 17: -#line 89 "hb-ot-shape-complex-indic-machine.rl" + case 16: +#line 84 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (vowel_syllable); }} break; - case 22: -#line 90 "hb-ot-shape-complex-indic-machine.rl" + case 21: +#line 85 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (standalone_cluster); }} break; case 24: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 86 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (symbol_cluster); }} break; - case 19: -#line 92 "hb-ot-shape-complex-indic-machine.rl" + case 18: +#line 87 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; - case 12: -#line 93 "hb-ot-shape-complex-indic-machine.rl" + case 11: +#line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (non_indic_cluster); }} break; - case 14: -#line 88 "hb-ot-shape-complex-indic-machine.rl" + case 13: +#line 83 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; - case 16: -#line 89 "hb-ot-shape-complex-indic-machine.rl" + case 15: +#line 84 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (vowel_syllable); }} break; - case 21: -#line 90 "hb-ot-shape-complex-indic-machine.rl" + case 20: +#line 85 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (standalone_cluster); }} break; case 23: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 86 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 18: -#line 92 "hb-ot-shape-complex-indic-machine.rl" + case 17: +#line 87 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; - case 20: -#line 93 "hb-ot-shape-complex-indic-machine.rl" + case 19: +#line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (non_indic_cluster); }} break; case 1: -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 83 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} break; case 3: -#line 89 "hb-ot-shape-complex-indic-machine.rl" +#line 84 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (vowel_syllable); }} break; case 7: -#line 90 "hb-ot-shape-complex-indic-machine.rl" +#line 85 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (standalone_cluster); }} break; - case 9: -#line 91 "hb-ot-shape-complex-indic-machine.rl" + case 8: +#line 86 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (symbol_cluster); }} break; case 4: -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 87 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 5: @@ -1516,34 +1269,34 @@ _eof_trans: } } break; - case 8: + case 22: #line 1 "NONE" {te = p+1;} -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 83 "hb-ot-shape-complex-indic-machine.rl" {act = 1;} break; case 6: #line 1 "NONE" {te = p+1;} -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 87 "hb-ot-shape-complex-indic-machine.rl" {act = 5;} break; - case 13: + case 12: #line 1 "NONE" {te = p+1;} -#line 93 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {act = 6;} break; -#line 1538 "hb-ot-shape-complex-indic-machine.hh" +#line 1291 "hb-ot-shape-complex-indic-machine.hh" } _again: switch ( _indic_syllable_machine_to_state_actions[cs] ) { - case 10: + case 9: #line 1 "NONE" {ts = 0;} break; -#line 1547 "hb-ot-shape-complex-indic-machine.hh" +#line 1300 "hb-ot-shape-complex-indic-machine.hh" } if ( ++p != pe ) @@ -1559,7 +1312,7 @@ _again: } -#line 127 "hb-ot-shape-complex-indic-machine.rl" +#line 122 "hb-ot-shape-complex-indic-machine.rl" } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl index 58d35c0016c..0ea91c0cfe7 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl @@ -38,7 +38,6 @@ %%{ # Same order as enum indic_category_t. Not sure how to avoid duplication. -X = 0; C = 1; V = 2; N = 3; @@ -47,12 +46,10 @@ ZWNJ = 5; ZWJ = 6; M = 7; SM = 8; -VD = 9; A = 10; PLACEHOLDER = 11; DOTTEDCIRCLE = 12; RS = 13; -Coeng = 14; Repha = 15; Ra = 16; CM = 17; @@ -62,19 +59,17 @@ CS = 19; c = (C | Ra); # is_consonant n = ((ZWNJ?.RS)? (N.N?)?); # is_consonant_modifier z = ZWJ|ZWNJ; # is_joiner -h = H | Coeng; # is_halant_or_coeng reph = (Ra H | Repha); # possible reph cn = c.ZWJ?.n?; forced_rakar = ZWJ H ZWJ Ra; symbol = Symbol.N?; matra_group = z{0,3}.M.N?.(H | forced_rakar)?; -syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}? VD{0,2}; -place_holder = PLACEHOLDER | DOTTEDCIRCLE; -halant_group = (z?.h.(ZWJ.N?)?); -final_halant_group = halant_group | h.ZWNJ; +syllable_tail = (z?.SM.SM?.ZWNJ?)? A{0,3}?; +halant_group = (z?.H.(ZWJ.N?)?); +final_halant_group = halant_group | H.ZWNJ; medial_group = CM?; -halant_or_matra_group = (final_halant_group | (h.ZWJ)? matra_group{0,4}) (Coeng (cn|V))?; +halant_or_matra_group = (final_halant_group | (H.ZWJ)? matra_group{0,4}); consonant_syllable = (Repha|CS)? (cn.halant_group){0,4} cn medial_group halant_or_matra_group syllable_tail; 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 a1e0d5266b4..a64e9d03919 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 @@ -51,7 +51,7 @@ enum indic_category_t { OT_ZWJ = 6, OT_M = 7, OT_SM = 8, - OT_VD = 9, + /* OT_VD = 9, UNUSED; we use OT_A instead. */ OT_A = 10, OT_PLACEHOLDER = 11, OT_DOTTEDCIRCLE = 12, @@ -73,7 +73,6 @@ enum indic_category_t { * consonant syllable logic from the vowel syllable function and get it all right! */ #define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE)) #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ)) -#define HALANT_OR_COENG_FLAGS (FLAG (OT_H) | FLAG (OT_Coeng)) /* Visual positions in a syllable from left to right. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc index bfd1c6d3429..867cfb33bf1 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc @@ -399,10 +399,10 @@ hb_indic_get_categories (hb_codepoint_t u) switch (u >> 12) { case 0x0u: + if (unlikely (u == 0x00A0u)) return _(CP,x); if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u]; if (hb_in_range<hb_codepoint_t> (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u]; if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u]; - if (unlikely (u == 0x00A0u)) return _(CP,x); break; case 0x1u: @@ -412,9 +412,9 @@ hb_indic_get_categories (hb_codepoint_t u) break; case 0x2u: + if (unlikely (u == 0x25CCu)) return _(CP,x); if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u]; if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u]; - if (unlikely (u == 0x25CCu)) return _(CP,x); break; case 0xAu: 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 97d6d38287a..9d150e0d3c1 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 @@ -49,7 +49,6 @@ #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 IS_KHMR(u) (IN_HALF_BLOCK (u, 0x1780u)) #define MATRA_POS_LEFT(u) POS_PRE_M @@ -64,7 +63,6 @@ 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 : \ - IS_KHMR(u) ? POS_AFTER_POST : \ /*default*/ POS_AFTER_SUB \ ) #define MATRA_POS_TOP(u) ( /* BENG and MLYM don't have top matras. */ \ @@ -76,7 +74,6 @@ IS_TELU(u) ? POS_BEFORE_SUB : \ IS_KNDA(u) ? POS_BEFORE_SUB : \ IS_SINH(u) ? POS_AFTER_SUB : \ - IS_KHMR(u) ? POS_AFTER_POST : \ /*default*/ POS_AFTER_SUB \ ) #define MATRA_POS_BOTTOM(u) ( \ @@ -90,7 +87,6 @@ IS_KNDA(u) ? POS_BEFORE_SUB : \ IS_MLYM(u) ? POS_AFTER_POST : \ IS_SINH(u) ? POS_AFTER_SUB : \ - IS_KHMR(u) ? POS_AFTER_POST : \ /*default*/ POS_AFTER_SUB \ ) @@ -124,8 +120,6 @@ static const hb_codepoint_t ra_chars[] = { 0x0D30u, /* Malayalam */ /* No Reph, Logical Repha */ 0x0DBBu, /* Sinhala */ /* Reph formed only with ZWJ */ - - 0x179Au, /* Khmer */ /* No Reph, Visual Repha */ }; static inline bool @@ -158,9 +152,9 @@ is_consonant (const hb_glyph_info_t &info) } static inline bool -is_halant_or_coeng (const hb_glyph_info_t &info) +is_halant (const hb_glyph_info_t &info) { - return is_one_of (info, HALANT_OR_COENG_FLAGS); + return is_one_of (info, FLAG (OT_H)); } static inline void @@ -200,14 +194,6 @@ set_indic_properties (hb_glyph_info_t &info) cat = OT_Symbol; static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), ""); } - 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 (u == 0x0A51u)) { /* https://github.com/harfbuzz/harfbuzz/issues/524 */ @@ -224,7 +210,6 @@ set_indic_properties (hb_glyph_info_t &info) 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 (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */ else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER; else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE; @@ -244,7 +229,7 @@ set_indic_properties (hb_glyph_info_t &info) { pos = matra_position (u, pos); } - else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_VD) | FLAG (OT_A) | FLAG (OT_Symbol)))) + else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol)))) { pos = POS_SMVD; } @@ -271,7 +256,6 @@ set_indic_properties (hb_glyph_info_t &info) */ enum base_position_t { - BASE_POS_FIRST, BASE_POS_LAST_SINHALA, BASE_POS_LAST }; @@ -280,13 +264,11 @@ enum reph_position_t { REPH_POS_BEFORE_SUB = POS_BEFORE_SUB, REPH_POS_AFTER_SUB = POS_AFTER_SUB, REPH_POS_BEFORE_POST = POS_BEFORE_POST, - REPH_POS_AFTER_POST = POS_AFTER_POST, - REPH_POS_DONT_CARE = POS_RA_TO_BECOME_REPH + REPH_POS_AFTER_POST = POS_AFTER_POST }; enum reph_mode_t { REPH_MODE_IMPLICIT, /* Reph formed out of initial Ra,H sequence. */ REPH_MODE_EXPLICIT, /* Reph formed out of initial Ra,H,ZWJ sequence. */ - REPH_MODE_VIS_REPHA, /* Encoded Repha character, no reordering needed. */ REPH_MODE_LOG_REPHA /* Encoded Repha character, needs reordering. */ }; enum blwf_mode_t { @@ -319,7 +301,6 @@ static const indic_config_t indic_configs[] = {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST}, {HB_SCRIPT_SINHALA, false,0x0DCAu,BASE_POS_LAST_SINHALA, REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST}, - {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST}, }; @@ -351,7 +332,6 @@ indic_features[] = {HB_TAG('p','s','t','f'), F_NONE}, {HB_TAG('v','a','t','u'), F_GLOBAL}, {HB_TAG('c','j','c','t'), F_GLOBAL}, - {HB_TAG('c','f','a','r'), F_NONE}, /* * Other features. * These features are applied all at once, after final_reordering. @@ -385,7 +365,6 @@ enum { PSTF, _VATU, _CJCT, - CFAR, INIT, _PRES, @@ -452,17 +431,6 @@ collect_features_indic (hb_ot_shape_planner_t *plan) static void override_features_indic (hb_ot_shape_planner_t *plan) { - /* Uniscribe does not apply 'kern' in Khmer. */ - if (hb_options ().uniscribe_bug_compatible) - { - switch ((hb_tag_t) plan->props.script) - { - case HB_SCRIPT_KHMER: - plan->map.add_feature (HB_TAG('k','e','r','n'), 0, F_GLOBAL); - break; - } - } - plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL); } @@ -730,8 +698,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, * and has more than one consonant, Ra is excluded from candidates for * base consonants. */ unsigned int limit = start; - if (indic_plan->config->reph_pos != REPH_POS_DONT_CARE && - indic_plan->mask_array[RPHF] && + if (indic_plan->mask_array[RPHF] && start + 3 <= end && ( (indic_plan->config->reph_mode == REPH_MODE_IMPLICIT && !is_joiner (info[start + 2])) || @@ -840,22 +807,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, info[i].indic_position() = POS_BELOW_C; } break; - - case BASE_POS_FIRST: - { - /* The first consonant is always the base. */ - - assert (indic_plan->config->reph_mode == REPH_MODE_VIS_REPHA); - assert (!has_reph); - - base = start; - - /* Mark all subsequent consonants as below. */ - for (unsigned int i = base + 1; i < end; i++) - if (is_consonant (info[i])) - info[i].indic_position() = POS_BELOW_C; - } - break; } /* -> If the syllable starts with Ra + Halant (in a script that has Reph) @@ -910,15 +861,15 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, if (base < end) info[base].indic_position() = POS_BASE_C; - /* Mark final consonants. A final consonant is one appearing after a matra, - * like in Khmer. */ + /* Mark final consonants. A final consonant is one appearing after a matra. + * Happens in Sinhala. */ for (unsigned int i = base + 1; i < end; i++) if (info[i].indic_category() == OT_M) { for (unsigned int j = i + 1; j < end; j++) - if (is_consonant (info[j])) { - info[j].indic_position() = POS_FINAL_C; - break; - } + if (is_consonant (info[j])) { + info[j].indic_position() = POS_FINAL_C; + break; + } break; } @@ -969,7 +920,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, indic_position_t last_pos = POS_START; for (unsigned int i = start; i < end; i++) { - if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | HALANT_OR_COENG_FLAGS))) + if ((FLAG_UNSAFE (info[i].indic_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_H)))) { info[i].indic_position() = last_pos; if (unlikely (info[i].indic_category() == OT_H && @@ -1133,17 +1084,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, { for (unsigned int j = 0; j < pref_len; j++) info[i++].mask |= indic_plan->mask_array[PREF]; - - /* Mark the subsequent stuff with 'cfar'. Used in Khmer. - * Read the feature spec. - * This allows distinguishing the following cases with MS Khmer fonts: - * U+1784,U+17D2,U+179A,U+17D2,U+1782 - * U+1784,U+17D2,U+1782,U+17D2,U+179A - */ - if (indic_plan->mask_array[CFAR]) - for (; i < end; i++) - info[i].mask |= indic_plan->mask_array[CFAR]; - break; } } @@ -1311,7 +1251,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, _hb_glyph_info_ligated (&info[i]) && _hb_glyph_info_multiplied (&info[i])) { - /* This will make sure that this glyph passes is_halant_or_coeng() test. */ + /* This will make sure that this glyph passes is_halant() test. */ info[i].indic_category() = OT_H; _hb_glyph_info_clear_ligated_and_multiplied (&info[i]); } @@ -1344,7 +1284,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, /* Ok, this was a 'pref' candidate but didn't form any. * Base is around here... */ base = i; - while (base < end && is_halant_or_coeng (info[base])) + while (base < end && is_halant (info[base])) base++; info[base].indic_position() = POS_BASE_C; @@ -1360,7 +1300,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, { while (i < end && is_joiner (info[i])) i++; - if (i == end || !is_halant_or_coeng (info[i])) + if (i == end || !is_halant (info[i])) break; i++; /* Skip halant. */ while (i < end && is_joiner (info[i])) @@ -1382,7 +1322,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, base--; if (base < end) while (start < base && - is_one_of (info[base], (FLAG (OT_N) | HALANT_OR_COENG_FLAGS))) + is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_H)))) base--; @@ -1408,13 +1348,13 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL) { while (new_pos > start && - !(is_one_of (info[new_pos], (FLAG (OT_M) | HALANT_OR_COENG_FLAGS)))) + !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_H))))) new_pos--; /* If we found no Halant we are done. * Otherwise only proceed if the Halant does * not belong to the Matra itself! */ - if (is_halant_or_coeng (info[new_pos]) && + if (is_halant (info[new_pos]) && info[new_pos].indic_position() != POS_PRE_M) { /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ @@ -1481,8 +1421,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, unsigned int new_reph_pos; reph_position_t reph_pos = indic_plan->config->reph_pos; - assert (reph_pos != REPH_POS_DONT_CARE); - /* 1. If reph should be positioned after post-base consonant forms, * proceed to step 5. */ @@ -1504,10 +1442,10 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, */ { new_reph_pos = start + 1; - while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos])) + while (new_reph_pos < base && !is_halant (info[new_reph_pos])) new_reph_pos++; - if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos])) + if (new_reph_pos < base && is_halant (info[new_reph_pos])) { /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */ if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1])) @@ -1556,10 +1494,10 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, { /* Copied from step 2. */ new_reph_pos = start + 1; - while (new_reph_pos < base && !is_halant_or_coeng (info[new_reph_pos])) + while (new_reph_pos < base && !is_halant (info[new_reph_pos])) new_reph_pos++; - if (new_reph_pos < base && is_halant_or_coeng (info[new_reph_pos])) + if (new_reph_pos < base && is_halant (info[new_reph_pos])) { /* ->If ZWJ or ZWNJ are following this halant, position is moved after it. */ if (new_reph_pos + 1 < base && is_joiner (info[new_reph_pos + 1])) @@ -1583,7 +1521,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * TEST: U+0930,U+094D,U+0915,U+094B,U+094D */ if (!hb_options ().uniscribe_bug_compatible && - unlikely (is_halant_or_coeng (info[new_reph_pos]))) { + unlikely (is_halant (info[new_reph_pos]))) { for (unsigned int i = base + 1; i < new_reph_pos; i++) if (info[i].indic_category() == OT_M) { /* Ok, got it. */ @@ -1644,24 +1582,11 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL) { while (new_pos > start && - !(is_one_of (info[new_pos - 1], FLAG(OT_M) | HALANT_OR_COENG_FLAGS))) + !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_H)))) new_pos--; - - /* In Khmer coeng model, a H,Ra can go *after* matras. If it goes after a - * split matra, it should be reordered to *before* the left part of such matra. */ - if (new_pos > start && info[new_pos - 1].indic_category() == OT_M) - { - unsigned int old_pos = i; - for (unsigned int j = base + 1; j < old_pos; j++) - if (info[j].indic_category() == OT_M) - { - new_pos--; - break; - } - } } - if (new_pos > start && is_halant_or_coeng (info[new_pos - 1])) + if (new_pos > start && is_halant (info[new_pos - 1])) { /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ if (new_pos < end && is_joiner (info[new_pos])) @@ -1766,13 +1691,6 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c, * Decompose split matras that don't have Unicode decompositions. */ - /* Khmer */ - case 0x17BEu : *a = 0x17C1u; *b= 0x17BEu; return true; - case 0x17BFu : *a = 0x17C1u; *b= 0x17BFu; return true; - case 0x17C0u : *a = 0x17C1u; *b= 0x17C0u; return true; - case 0x17C4u : *a = 0x17C1u; *b= 0x17C4u; return true; - case 0x17C5u : *a = 0x17C1u; *b= 0x17C5u; return true; - #if 0 /* Gujarati */ /* This one has no decomposition in Unicode, but needs no decomposition either. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh new file mode 100644 index 00000000000..380705a5051 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh @@ -0,0 +1,294 @@ + +#line 1 "hb-ot-shape-complex-khmer-machine.rl" +/* + * Copyright © 2011,2012 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_MACHINE_HH +#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH + +#include "hb-private.hh" + + +#line 36 "hb-ot-shape-complex-khmer-machine.hh" +static const unsigned char _khmer_syllable_machine_trans_keys[] = { + 7u, 7u, 1u, 16u, 13u, 13u, 1u, 16u, 7u, 13u, 7u, 7u, 1u, 16u, 13u, 13u, + 1u, 16u, 7u, 13u, 1u, 16u, 3u, 14u, 3u, 14u, 5u, 14u, 3u, 14u, 5u, 14u, + 8u, 8u, 3u, 13u, 3u, 8u, 8u, 8u, 3u, 8u, 3u, 14u, 3u, 14u, 5u, 14u, + 3u, 14u, 5u, 14u, 8u, 8u, 3u, 13u, 3u, 8u, 8u, 8u, 3u, 8u, 3u, 14u, + 3u, 14u, 7u, 13u, 7u, 7u, 1u, 16u, 0 +}; + +static const char _khmer_syllable_machine_key_spans[] = { + 1, 16, 1, 16, 7, 1, 16, 1, + 16, 7, 16, 12, 12, 10, 12, 10, + 1, 11, 6, 1, 6, 12, 12, 10, + 12, 10, 1, 11, 6, 1, 6, 12, + 12, 7, 1, 16 +}; + +static const short _khmer_syllable_machine_index_offsets[] = { + 0, 2, 19, 21, 38, 46, 48, 65, + 67, 84, 92, 109, 122, 135, 146, 159, + 170, 172, 184, 191, 193, 200, 213, 226, + 237, 250, 261, 263, 275, 282, 284, 291, + 304, 317, 325, 327 +}; + +static const char _khmer_syllable_machine_indicies[] = { + 1, 0, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 3, 0, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 1, 0, + 0, 0, 0, 0, 5, 0, 7, 6, + 8, 8, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 8, + 6, 9, 6, 10, 10, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 10, 6, 7, 6, 6, 6, + 6, 6, 11, 6, 4, 4, 13, 12, + 14, 15, 7, 16, 12, 12, 4, 4, + 11, 17, 12, 4, 12, 19, 18, 20, + 21, 1, 22, 18, 18, 18, 18, 5, + 23, 18, 24, 18, 21, 21, 1, 22, + 18, 18, 18, 18, 18, 23, 18, 21, + 21, 1, 22, 18, 18, 18, 18, 18, + 23, 18, 25, 18, 21, 21, 1, 22, + 18, 18, 18, 18, 18, 26, 18, 21, + 21, 1, 22, 18, 18, 18, 18, 18, + 26, 18, 27, 18, 28, 18, 29, 18, + 18, 22, 18, 18, 18, 18, 3, 18, + 30, 18, 18, 18, 18, 22, 18, 22, + 18, 28, 18, 18, 18, 18, 22, 18, + 19, 18, 21, 21, 1, 22, 18, 18, + 18, 18, 18, 23, 18, 32, 31, 33, + 33, 7, 16, 31, 31, 31, 31, 31, + 34, 31, 33, 33, 7, 16, 31, 31, + 31, 31, 31, 34, 31, 35, 31, 33, + 33, 7, 16, 31, 31, 31, 31, 31, + 36, 31, 33, 33, 7, 16, 31, 31, + 31, 31, 31, 36, 31, 37, 31, 38, + 31, 39, 31, 31, 16, 31, 31, 31, + 31, 9, 31, 40, 31, 31, 31, 31, + 16, 31, 16, 31, 38, 31, 31, 31, + 31, 16, 31, 13, 31, 41, 33, 7, + 16, 31, 31, 31, 31, 11, 34, 31, + 13, 31, 33, 33, 7, 16, 31, 31, + 31, 31, 31, 34, 31, 7, 42, 42, + 42, 42, 42, 11, 42, 7, 42, 10, + 10, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 10, 42, + 0 +}; + +static const char _khmer_syllable_machine_trans_targs[] = { + 10, 14, 17, 20, 11, 21, 10, 24, + 27, 30, 31, 32, 10, 22, 33, 34, + 26, 35, 10, 12, 4, 0, 16, 3, + 13, 15, 1, 10, 18, 2, 19, 10, + 23, 5, 8, 25, 6, 10, 28, 7, + 29, 9, 10 +}; + +static const char _khmer_syllable_machine_trans_actions[] = { + 1, 2, 2, 0, 2, 2, 3, 2, + 2, 0, 2, 2, 6, 2, 0, 0, + 0, 0, 7, 2, 0, 0, 0, 0, + 2, 2, 0, 8, 0, 0, 0, 9, + 2, 0, 0, 2, 0, 10, 0, 0, + 0, 0, 11 +}; + +static const char _khmer_syllable_machine_to_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 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 _khmer_syllable_machine_from_state_actions[] = { + 0, 0, 0, 0, 0, 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 +}; + +static const unsigned char _khmer_syllable_machine_eof_trans[] = { + 1, 1, 1, 1, 1, 7, 7, 7, + 7, 7, 0, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 43, 43, 43 +}; + +static const int khmer_syllable_machine_start = 10; +static const int khmer_syllable_machine_first_final = 10; +static const int khmer_syllable_machine_error = -1; + +static const int khmer_syllable_machine_en_main = 10; + + +#line 36 "hb-ot-shape-complex-khmer-machine.rl" + + + +#line 74 "hb-ot-shape-complex-khmer-machine.rl" + + +#define found_syllable(syllable_type) \ + HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \ + for (unsigned int i = last; i < p+1; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + last = p+1; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + } HB_STMT_END + +static void +find_syllables (hb_buffer_t *buffer) +{ + unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + int cs; + hb_glyph_info_t *info = buffer->info; + +#line 181 "hb-ot-shape-complex-khmer-machine.hh" + { + cs = khmer_syllable_machine_start; + ts = 0; + te = 0; + act = 0; + } + +#line 95 "hb-ot-shape-complex-khmer-machine.rl" + + + p = 0; + pe = eof = buffer->len; + + unsigned int last = 0; + unsigned int syllable_serial = 1; + +#line 198 "hb-ot-shape-complex-khmer-machine.hh" + { + int _slen; + int _trans; + const unsigned char *_keys; + const char *_inds; + if ( p == pe ) + goto _test_eof; +_resume: + switch ( _khmer_syllable_machine_from_state_actions[cs] ) { + case 5: +#line 1 "NONE" + {ts = p;} + break; +#line 212 "hb-ot-shape-complex-khmer-machine.hh" + } + + _keys = _khmer_syllable_machine_trans_keys + (cs<<1); + _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs]; + + _slen = _khmer_syllable_machine_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) && + ( info[p].khmer_category()) <= _keys[1] ? + ( info[p].khmer_category()) - _keys[0] : _slen ]; + +_eof_trans: + cs = _khmer_syllable_machine_trans_targs[_trans]; + + if ( _khmer_syllable_machine_trans_actions[_trans] == 0 ) + goto _again; + + switch ( _khmer_syllable_machine_trans_actions[_trans] ) { + case 2: +#line 1 "NONE" + {te = p+1;} + break; + case 8: +#line 68 "hb-ot-shape-complex-khmer-machine.rl" + {te = p+1;{ found_syllable (consonant_syllable); }} + break; + case 10: +#line 69 "hb-ot-shape-complex-khmer-machine.rl" + {te = p+1;{ found_syllable (broken_cluster); }} + break; + case 6: +#line 70 "hb-ot-shape-complex-khmer-machine.rl" + {te = p+1;{ found_syllable (non_khmer_cluster); }} + break; + case 7: +#line 68 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p--;{ found_syllable (consonant_syllable); }} + break; + case 9: +#line 69 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p--;{ found_syllable (broken_cluster); }} + break; + case 11: +#line 70 "hb-ot-shape-complex-khmer-machine.rl" + {te = p;p--;{ found_syllable (non_khmer_cluster); }} + break; + case 1: +#line 68 "hb-ot-shape-complex-khmer-machine.rl" + {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} + break; + case 3: +#line 69 "hb-ot-shape-complex-khmer-machine.rl" + {{p = ((te))-1;}{ found_syllable (broken_cluster); }} + break; +#line 266 "hb-ot-shape-complex-khmer-machine.hh" + } + +_again: + switch ( _khmer_syllable_machine_to_state_actions[cs] ) { + case 4: +#line 1 "NONE" + {ts = 0;} + break; +#line 275 "hb-ot-shape-complex-khmer-machine.hh" + } + + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) { + _trans = _khmer_syllable_machine_eof_trans[cs] - 1; + goto _eof_trans; + } + } + + } + +#line 104 "hb-ot-shape-complex-khmer-machine.rl" + +} + +#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl new file mode 100644 index 00000000000..8b00c37f093 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl @@ -0,0 +1,107 @@ +/* + * Copyright © 2011,2012 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_MACHINE_HH +#define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH + +#include "hb-private.hh" + +%%{ + machine khmer_syllable_machine; + alphtype unsigned char; + write data; +}%% + +%%{ + +# Same order as enum khmer_category_t. Not sure how to avoid duplication. +C = 1; +V = 2; +N = 3; +ZWNJ = 5; +ZWJ = 6; +M = 7; +SM = 8; +PLACEHOLDER = 11; +DOTTEDCIRCLE = 12; +RS = 13; +Coeng = 14; +Ra = 16; + +c = (C | Ra | V); # is_consonant +n = ((ZWNJ?.RS)? (N.N?)?); # is_consonant_modifier +z = ZWJ|ZWNJ; # is_joiner + +cn = c.n?; +matra_group = z?.M.N?; +syllable_tail = (SM.SM?)?; + + +broken_cluster = n? (Coeng.cn)* matra_group* (Coeng.cn)? syllable_tail; +consonant_syllable = (c|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster; +other = any; + +main := |* + consonant_syllable => { found_syllable (consonant_syllable); }; + broken_cluster => { found_syllable (broken_cluster); }; + other => { found_syllable (non_khmer_cluster); }; +*|; + + +}%% + +#define found_syllable(syllable_type) \ + HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \ + for (unsigned int i = last; i < p+1; i++) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + last = p+1; \ + syllable_serial++; \ + if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + } HB_STMT_END + +static void +find_syllables (hb_buffer_t *buffer) +{ + unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED; + int cs; + hb_glyph_info_t *info = buffer->info; + %%{ + write init; + getkey info[p].khmer_category(); + }%% + + p = 0; + pe = eof = buffer->len; + + unsigned int last = 0; + unsigned int syllable_serial = 1; + %%{ + write exec; + }%% +} + +#endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_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 new file mode 100644 index 00000000000..2db4f6097d8 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc @@ -0,0 +1,945 @@ +/* + * Copyright © 2011,2012 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" +#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. + */ + +struct feature_list_t { + hb_tag_t tag; + hb_ot_map_feature_flags_t flags; +}; + +static const feature_list_t +khmer_features[] = +{ + /* + * Basic features. + * These features are applied in order, one at a time, after initial_reordering. + */ + {HB_TAG('p','r','e','f'), F_NONE}, + {HB_TAG('b','l','w','f'), F_NONE}, + {HB_TAG('a','b','v','f'), F_NONE}, + {HB_TAG('p','s','t','f'), F_NONE}, + {HB_TAG('c','f','a','r'), F_NONE}, + /* + * Other features. + * These features are applied all at once, after final_reordering. + * Default Bengali font in Windows for example has intermixed + * lookups for init,pres,abvs,blws features. + */ + {HB_TAG('p','r','e','s'), F_GLOBAL}, + {HB_TAG('a','b','v','s'), F_GLOBAL}, + {HB_TAG('b','l','w','s'), F_GLOBAL}, + {HB_TAG('p','s','t','s'), F_GLOBAL}, + /* Positioning features, though we don't care about the types. */ + {HB_TAG('d','i','s','t'), F_GLOBAL}, + {HB_TAG('a','b','v','m'), F_GLOBAL}, + {HB_TAG('b','l','w','m'), F_GLOBAL}, +}; + +/* + * Must be in the same order as the khmer_features array. + */ +enum { + PREF, + BLWF, + ABVF, + PSTF, + CFAR, + + _PRES, + _ABVS, + _BLWS, + _PSTS, + _DIST, + _ABVM, + _BLWM, + + KHMER_NUM_FEATURES, + KHMER_BASIC_FEATURES = _PRES /* Don't forget to update this! */ +}; + +static void +setup_syllables (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); +static void +initial_reordering (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); +static void +final_reordering (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); +static void +clear_syllables (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); + +static void +collect_features_khmer (hb_ot_shape_planner_t *plan) +{ + hb_ot_map_builder_t *map = &plan->map; + + /* Do this before any lookups have been applied. */ + map->add_gsub_pause (setup_syllables); + + map->add_global_bool_feature (HB_TAG('l','o','c','l')); + /* The Indic specs do not require ccmp, but we apply it here since if + * there is a use of it, it's typically at the beginning. */ + map->add_global_bool_feature (HB_TAG('c','c','m','p')); + + + unsigned int i = 0; + map->add_gsub_pause (initial_reordering); + for (; i < KHMER_BASIC_FEATURES; i++) { + map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ); + map->add_gsub_pause (nullptr); + } + map->add_gsub_pause (final_reordering); + for (; i < KHMER_NUM_FEATURES; i++) { + map->add_feature (khmer_features[i].tag, 1, khmer_features[i].flags | F_MANUAL_ZWJ | F_MANUAL_ZWNJ); + } + + map->add_global_bool_feature (HB_TAG('c','a','l','t')); + map->add_global_bool_feature (HB_TAG('c','l','i','g')); + + map->add_gsub_pause (clear_syllables); +} + +static void +override_features_khmer (hb_ot_shape_planner_t *plan) +{ + /* Uniscribe does not apply 'kern' in Khmer. */ + if (hb_options ().uniscribe_bug_compatible) + { + plan->map.add_feature (HB_TAG('k','e','r','n'), 0, F_GLOBAL); + } + + plan->map.add_feature (HB_TAG('l','i','g','a'), 0, F_GLOBAL); +} + + +struct would_substitute_feature_t +{ + inline void init (const hb_ot_map_t *map, hb_tag_t feature_tag, bool zero_context_) + { + zero_context = zero_context_; + map->get_stage_lookups (0/*GSUB*/, + map->get_feature_stage (0/*GSUB*/, feature_tag), + &lookups, &count); + } + + inline bool would_substitute (const hb_codepoint_t *glyphs, + unsigned int glyphs_count, + hb_face_t *face) const + { + for (unsigned int i = 0; i < count; i++) + if (hb_ot_layout_lookup_would_substitute_fast (face, lookups[i].index, glyphs, glyphs_count, zero_context)) + return true; + return false; + } + + private: + const hb_ot_map_t::lookup_map_t *lookups; + unsigned int count; + bool zero_context; +}; + +struct khmer_shape_plan_t +{ + ASSERT_POD (); + + inline bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const + { + hb_codepoint_t glyph = virama_glyph; + if (unlikely (virama_glyph == (hb_codepoint_t) -1)) + { + if (!font->get_nominal_glyph (0x17D2u, &glyph)) + glyph = 0; + /* Technically speaking, the spec says we should apply 'locl' to virama too. + * Maybe one day... */ + + /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph + * during shape planning... Instead, overwrite it here. It's safe. Don't worry! */ + virama_glyph = glyph; + } + + *pglyph = glyph; + return glyph != 0; + } + + mutable hb_codepoint_t virama_glyph; + + would_substitute_feature_t pref; + + hb_mask_t mask_array[KHMER_NUM_FEATURES]; +}; + +static void * +data_create_khmer (const hb_ot_shape_plan_t *plan) +{ + khmer_shape_plan_t *khmer_plan = (khmer_shape_plan_t *) calloc (1, sizeof (khmer_shape_plan_t)); + if (unlikely (!khmer_plan)) + return nullptr; + + khmer_plan->virama_glyph = (hb_codepoint_t) -1; + + khmer_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), true); + + for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++) + khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ? + 0 : plan->map.get_1_mask (khmer_features[i].tag); + + return khmer_plan; +} + +static void +data_destroy_khmer (void *data) +{ + free (data); +} + + +enum syllable_type_t { + consonant_syllable, + broken_cluster, + non_khmer_cluster, +}; + +#include "hb-ot-shape-complex-khmer-machine.hh" + +static void +setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_buffer_t *buffer, + hb_font_t *font HB_UNUSED) +{ + HB_BUFFER_ALLOCATE_VAR (buffer, khmer_category); + HB_BUFFER_ALLOCATE_VAR (buffer, khmer_position); + + /* We cannot setup masks here. We save information about characters + * and setup masks later on in a pause-callback. */ + + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + for (unsigned int i = 0; i < count; i++) + set_khmer_properties (info[i]); +} + +static void +setup_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) +{ + find_syllables (buffer); + foreach_syllable (buffer, start, end) + buffer->unsafe_to_break (start, end); +} + +static int +compare_khmer_order (const hb_glyph_info_t *pa, const hb_glyph_info_t *pb) +{ + int a = pa->khmer_position(); + int b = pb->khmer_position(); + + return a < b ? -1 : a == b ? 0 : +1; +} + + +/* Rules from: + * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx */ + +static void +initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, + hb_face_t *face, + hb_buffer_t *buffer, + unsigned int start, unsigned int end) +{ + const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data; + hb_glyph_info_t *info = buffer->info; + + /* 1. Khmer shaping assumes that a syllable will begin with a Cons, IndV, or Number. */ + + /* The first consonant is always the base. */ + unsigned int base = start; + info[base].khmer_position() = POS_BASE_C; + + /* Mark all subsequent consonants as below. */ + for (unsigned int i = base + 1; i < end; i++) + if (is_consonant (info[i])) + info[i].khmer_position() = POS_BELOW_C; + + /* Mark final consonants. A final consonant is one appearing after a matra, + * like in Khmer. */ + 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])) { + info[j].khmer_position() = POS_FINAL_C; + break; + } + break; + } + + /* Attach misc marks to previous char to move with them. */ + { + khmer_position_t last_pos = POS_START; + for (unsigned int i = start; i < end; i++) + { + if ((FLAG_UNSAFE (info[i].khmer_category()) & (JOINER_FLAGS | FLAG (OT_N) | FLAG (OT_RS) | MEDIAL_FLAGS | FLAG (OT_Coeng)))) + { + info[i].khmer_position() = last_pos; + if (unlikely (info[i].khmer_category() == OT_H && + info[i].khmer_position() == POS_PRE_M)) + { + /* + * Uniscribe doesn't move the Halant with Left Matra. + * TEST: U+092B,U+093F,U+094DE + * We follow. This is important for the Sinhala + * U+0DDA split matra since it decomposes to U+0DD9,U+0DCA + * where U+0DD9 is a left matra and U+0DCA is the virama. + * We don't want to move the virama with the left matra. + * TEST: U+0D9A,U+0DDA + */ + for (unsigned int j = i; j > start; j--) + if (info[j - 1].khmer_position() != POS_PRE_M) { + info[i].khmer_position() = info[j - 1].khmer_position(); + break; + } + } + } else if (info[i].khmer_position() != POS_SMVD) { + last_pos = (khmer_position_t) info[i].khmer_position(); + } + } + } + /* For post-base consonants let them own anything before them + * since the last consonant or matra. */ + { + unsigned int last = base; + for (unsigned int i = base + 1; i < end; i++) + if (is_consonant (info[i])) + { + for (unsigned int j = last + 1; j < i; j++) + if (info[j].khmer_position() < POS_SMVD) + info[j].khmer_position() = info[i].khmer_position(); + last = i; + } else if (info[i].khmer_category() == OT_M) + last = i; + } + + { + /* Use syllable() for sort accounting temporarily. */ + unsigned int syllable = info[start].syllable(); + for (unsigned int i = start; i < end; i++) + info[i].syllable() = i - start; + + /* Sit tight, rock 'n roll! */ + hb_stable_sort (info + start, end - start, compare_khmer_order); + /* Find base again */ + base = end; + for (unsigned int i = start; i < end; i++) + if (info[i].khmer_position() == POS_BASE_C) + { + base = i; + break; + } + + /* Note! syllable() is a one-byte field. */ + for (unsigned int i = base; i < end; i++) + if (info[i].syllable() != 255) + { + unsigned int max = i; + unsigned int j = start + info[i].syllable(); + while (j != i) + { + max = MAX (max, j); + unsigned int next = start + info[j].syllable(); + info[j].syllable() = 255; /* So we don't process j later again. */ + j = next; + } + if (i != max) + buffer->merge_clusters (i, max + 1); + } + + /* Put syllable back in. */ + for (unsigned int i = start; i < end; i++) + info[i].syllable() = syllable; + } + + /* Setup masks now */ + + { + hb_mask_t mask; + + /* Post-base */ + mask = khmer_plan->mask_array[BLWF] | khmer_plan->mask_array[ABVF] | khmer_plan->mask_array[PSTF]; + for (unsigned int i = base + 1; i < end; i++) + info[i].mask |= mask; + } + + unsigned int pref_len = 2; + if (khmer_plan->mask_array[PREF] && base + pref_len < end) + { + /* Find a Halant,Ra sequence and mark it for pre-base-reordering processing. */ + for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) { + hb_codepoint_t glyphs[2]; + for (unsigned int j = 0; j < pref_len; j++) + glyphs[j] = info[i + j].codepoint; + if (khmer_plan->pref.would_substitute (glyphs, pref_len, face)) + { + for (unsigned int j = 0; j < pref_len; j++) + info[i++].mask |= khmer_plan->mask_array[PREF]; + + /* Mark the subsequent stuff with 'cfar'. Used in Khmer. + * Read the feature spec. + * This allows distinguishing the following cases with MS Khmer fonts: + * U+1784,U+17D2,U+179A,U+17D2,U+1782 + * U+1784,U+17D2,U+1782,U+17D2,U+179A + */ + if (khmer_plan->mask_array[CFAR]) + for (; i < end; i++) + info[i].mask |= khmer_plan->mask_array[CFAR]; + + break; + } + } + } +} + +static void +initial_reordering_syllable (const hb_ot_shape_plan_t *plan, + hb_face_t *face, + hb_buffer_t *buffer, + unsigned int start, unsigned int end) +{ + syllable_type_t syllable_type = (syllable_type_t) (buffer->info[start].syllable() & 0x0F); + switch (syllable_type) + { + case broken_cluster: /* We already inserted dotted-circles, so just call the consonant_syllable. */ + case consonant_syllable: + initial_reordering_consonant_syllable (plan, face, buffer, start, end); + break; + + case non_khmer_cluster: + break; + } +} + +static inline void +insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font, + hb_buffer_t *buffer) +{ + /* Note: This loop is extra overhead, but should not be measurable. */ + bool has_broken_syllables = false; + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + for (unsigned int i = 0; i < count; i++) + if ((info[i].syllable() & 0x0F) == broken_cluster) + { + has_broken_syllables = true; + break; + } + if (likely (!has_broken_syllables)) + return; + + + hb_codepoint_t dottedcircle_glyph; + if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph)) + return; + + hb_glyph_info_t dottedcircle = {0}; + dottedcircle.codepoint = 0x25CCu; + set_khmer_properties (dottedcircle); + dottedcircle.codepoint = dottedcircle_glyph; + + buffer->clear_output (); + + buffer->idx = 0; + unsigned int last_syllable = 0; + while (buffer->idx < buffer->len && !buffer->in_error) + { + unsigned int syllable = buffer->cur().syllable(); + syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); + if (unlikely (last_syllable != syllable && syllable_type == broken_cluster)) + { + last_syllable = syllable; + + hb_glyph_info_t ginfo = dottedcircle; + ginfo.cluster = buffer->cur().cluster; + ginfo.mask = buffer->cur().mask; + ginfo.syllable() = buffer->cur().syllable(); + /* TODO Set glyph_props? */ + + /* Insert dottedcircle after possible Repha. */ + while (buffer->idx < buffer->len && !buffer->in_error && + last_syllable == buffer->cur().syllable() && + buffer->cur().khmer_category() == OT_Repha) + buffer->next_glyph (); + + buffer->output_info (ginfo); + } + else + buffer->next_glyph (); + } + + buffer->swap_buffers (); +} + +static void +initial_reordering (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) +{ + insert_dotted_circles (plan, font, buffer); + + foreach_syllable (buffer, start, end) + initial_reordering_syllable (plan, font->face, buffer, start, end); +} + +static void +final_reordering_syllable (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + unsigned int start, unsigned int end) +{ + const khmer_shape_plan_t *khmer_plan = (const khmer_shape_plan_t *) plan->data; + hb_glyph_info_t *info = buffer->info; + + + /* This function relies heavily on halant glyphs. Lots of ligation + * and possibly multiple substitutions happened prior to this + * phase, and that might have messed up our properties. Recover + * from a particular case of that where we're fairly sure that a + * class of OT_H is desired but has been lost. */ + if (khmer_plan->virama_glyph) + { + unsigned int virama_glyph = khmer_plan->virama_glyph; + for (unsigned int i = start; i < end; i++) + if (info[i].codepoint == virama_glyph && + _hb_glyph_info_ligated (&info[i]) && + _hb_glyph_info_multiplied (&info[i])) + { + /* This will make sure that this glyph passes is_coeng() test. */ + info[i].khmer_category() = OT_H; + _hb_glyph_info_clear_ligated_and_multiplied (&info[i]); + } + } + + + /* 4. Final reordering: + * + * After the localized forms and basic shaping forms GSUB features have been + * applied (see below), the shaping engine performs some final glyph + * reordering before applying all the remaining font features to the entire + * syllable. + */ + + bool try_pref = !!khmer_plan->mask_array[PREF]; + + /* Find base again */ + unsigned int base; + for (base = start; base < end; base++) + if (info[base].khmer_position() >= POS_BASE_C) + { + if (try_pref && base + 1 < end) + { + for (unsigned int i = base + 1; i < end; i++) + if ((info[i].mask & khmer_plan->mask_array[PREF]) != 0) + { + if (!(_hb_glyph_info_substituted (&info[i]) && + _hb_glyph_info_ligated_and_didnt_multiply (&info[i]))) + { + /* Ok, this was a 'pref' candidate but didn't form any. + * Base is around here... */ + base = i; + while (base < end && is_coeng (info[base])) + base++; + info[base].khmer_position() = POS_BASE_C; + + try_pref = false; + } + break; + } + } + + if (start < base && info[base].khmer_position() > POS_BASE_C) + base--; + break; + } + if (base == end && start < base && + is_one_of (info[base - 1], FLAG (OT_ZWJ))) + base--; + if (base < end) + while (start < base && + is_one_of (info[base], (FLAG (OT_N) | FLAG (OT_Coeng)))) + base--; + + + /* o Reorder matras: + * + * If a pre-base matra character had been reordered before applying basic + * features, the glyph can be moved closer to the main consonant based on + * whether half-forms had been formed. Actual position for the matra is + * defined as “after last standalone halant glyph, after initial matra + * position and before the main consonant”. If ZWJ or ZWNJ follow this + * halant, position is moved after it. + */ + + if (start + 1 < end && start < base) /* Otherwise there can't be any pre-base matra characters. */ + { + /* If we lost track of base, alas, position before last thingy. */ + unsigned int new_pos = base == end ? base - 2 : base - 1; + + while (new_pos > start && + !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_Coeng))))) + new_pos--; + + /* If we found no Halant we are done. + * Otherwise only proceed if the Halant does + * not belong to the Matra itself! */ + if (is_coeng (info[new_pos]) && + info[new_pos].khmer_position() != POS_PRE_M) + { + /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ + if (new_pos + 1 < end && is_joiner (info[new_pos + 1])) + new_pos++; + } + else + new_pos = start; /* No move. */ + + if (start < new_pos && info[new_pos].khmer_position () != POS_PRE_M) + { + /* Now go see if there's actually any matras... */ + for (unsigned int i = new_pos; i > start; i--) + if (info[i - 1].khmer_position () == POS_PRE_M) + { + unsigned int old_pos = i - 1; + if (old_pos < base && base <= new_pos) /* Shouldn't actually happen. */ + base--; + + hb_glyph_info_t tmp = info[old_pos]; + memmove (&info[old_pos], &info[old_pos + 1], (new_pos - old_pos) * sizeof (info[0])); + info[new_pos] = tmp; + + /* Note: this merge_clusters() is intentionally *after* the reordering. + * Indic matra reordering is special and tricky... */ + buffer->merge_clusters (new_pos, MIN (end, base + 1)); + + new_pos--; + } + } else { + for (unsigned int i = start; i < base; i++) + if (info[i].khmer_position () == POS_PRE_M) { + buffer->merge_clusters (i, MIN (end, base + 1)); + break; + } + } + } + + + /* o Reorder pre-base-reordering consonants: + * + * If a pre-base-reordering consonant is found, reorder it according to + * the following rules: + */ + + if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base-reordering Ra. */ + { + for (unsigned int i = base + 1; i < end; i++) + if ((info[i].mask & khmer_plan->mask_array[PREF]) != 0) + { + /* 1. Only reorder a glyph produced by substitution during application + * of the <pref> feature. (Note that a font may shape a Ra consonant with + * the feature generally but block it in certain contexts.) + */ + /* Note: We just check that something got substituted. We don't check that + * the <pref> feature actually did it... + * + * Reorder pref only if it ligated. */ + if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i])) + { + /* + * 2. Try to find a target position the same way as for pre-base matra. + * If it is found, reorder pre-base consonant glyph. + * + * 3. If position is not found, reorder immediately before main + * consonant. + */ + + unsigned int new_pos = base; + while (new_pos > start && + !(is_one_of (info[new_pos - 1], FLAG(OT_M) | FLAG (OT_Coeng)))) + new_pos--; + + /* In Khmer coeng model, a H,Ra can go *after* matras. If it goes after a + * split matra, it should be reordered to *before* the left part of such matra. */ + if (new_pos > start && info[new_pos - 1].khmer_category() == OT_M) + { + unsigned int old_pos = i; + for (unsigned int j = base + 1; j < old_pos; j++) + if (info[j].khmer_category() == OT_M) + { + new_pos--; + break; + } + } + + if (new_pos > start && is_coeng (info[new_pos - 1])) + { + /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */ + if (new_pos < end && is_joiner (info[new_pos])) + new_pos++; + } + + { + unsigned int old_pos = i; + + buffer->merge_clusters (new_pos, old_pos + 1); + hb_glyph_info_t tmp = info[old_pos]; + memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0])); + info[new_pos] = tmp; + + if (new_pos <= base && base < old_pos) + base++; + } + } + + break; + } + } + + + /* + * Finish off the clusters and go home! + */ + if (hb_options ().uniscribe_bug_compatible) + { + /* Uniscribe merges the entire syllable into a single cluster... Except for Tamil & Sinhala. + * This means, half forms are submerged into the main consonant's cluster. + * This is unnecessary, and makes cursor positioning harder, but that's what + * Uniscribe does. */ + buffer->merge_clusters (start, end); + } +} + + +static void +final_reordering (const hb_ot_shape_plan_t *plan, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) +{ + unsigned int count = buffer->len; + if (unlikely (!count)) return; + + foreach_syllable (buffer, start, end) + final_reordering_syllable (plan, buffer, start, end); + + HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category); + HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_position); +} + + +static void +clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED, + hb_font_t *font HB_UNUSED, + hb_buffer_t *buffer) +{ + hb_glyph_info_t *info = buffer->info; + unsigned int count = buffer->len; + for (unsigned int i = 0; i < count; i++) + info[i].syllable() = 0; +} + + +static bool +decompose_khmer (const hb_ot_shape_normalize_context_t *c, + hb_codepoint_t ab, + hb_codepoint_t *a, + hb_codepoint_t *b) +{ + switch (ab) + { + /* + * Decompose split matras that don't have Unicode decompositions. + */ + + /* Khmer */ + case 0x17BEu : *a = 0x17C1u; *b= 0x17BEu; return true; + case 0x17BFu : *a = 0x17C1u; *b= 0x17BFu; return true; + case 0x17C0u : *a = 0x17C1u; *b= 0x17C0u; return true; + case 0x17C4u : *a = 0x17C1u; *b= 0x17C4u; return true; + case 0x17C5u : *a = 0x17C1u; *b= 0x17C5u; return true; + } + + return (bool) c->unicode->decompose (ab, a, b); +} + +static bool +compose_khmer (const hb_ot_shape_normalize_context_t *c, + hb_codepoint_t a, + hb_codepoint_t b, + hb_codepoint_t *ab) +{ + /* Avoid recomposing split matras. */ + if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a))) + return false; + + return (bool) c->unicode->compose (a, b, ab); +} + + +const hb_ot_complex_shaper_t _hb_ot_complex_shaper_khmer = +{ + collect_features_khmer, + override_features_khmer, + data_create_khmer, + data_destroy_khmer, + nullptr, /* preprocess_text */ + nullptr, /* postprocess_glyphs */ + HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, + decompose_khmer, + compose_khmer, + setup_masks_khmer, + nullptr, /* disable_otl */ + nullptr, /* reorder_marks */ + HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, + false, /* fallback_position */ +}; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh index fb2f61157a2..08b6fe9697d 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh @@ -54,9 +54,10 @@ enum hb_ot_shape_zero_width_marks_type_t { HB_COMPLEX_SHAPER_IMPLEMENT (arabic) \ HB_COMPLEX_SHAPER_IMPLEMENT (hangul) \ HB_COMPLEX_SHAPER_IMPLEMENT (hebrew) \ - HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \ HB_COMPLEX_SHAPER_IMPLEMENT (indic) \ + HB_COMPLEX_SHAPER_IMPLEMENT (khmer) \ HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \ + HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \ HB_COMPLEX_SHAPER_IMPLEMENT (thai) \ HB_COMPLEX_SHAPER_IMPLEMENT (tibetan) \ HB_COMPLEX_SHAPER_IMPLEMENT (use) \ @@ -285,7 +286,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) planner->map.language_index[0], HB_TAG ('p','r','e','f'), nullptr)) - return &_hb_ot_complex_shaper_indic; + return &_hb_ot_complex_shaper_khmer; else return &_hb_ot_complex_shaper_default; 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 4f6727186de..e767865bc4b 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,271 +36,288 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 1u, 1u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, + 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, 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, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, - 21u, 42u, 41u, 42u, 42u, 42u, 1u, 5u, 0 + 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, 44, 1, 32, 32, 1, 32, 32, - 32, 19, 19, 19, 32, 32, 32, 32, + 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, 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, 1, 39, 32, - 22, 2, 1, 5 + 32, 32, 15, 1, 39, 32, 22, 2, + 1, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 2, 47, 49, 82, 115, 117, 150, - 183, 216, 236, 256, 276, 309, 342, 375, - 408, 441, 474, 507, 540, 573, 606, 639, - 672, 682, 684, 686, 719, 752, 785, 818, - 838, 858, 878, 911, 944, 977, 1010, 1043, - 1076, 1109, 1142, 1175, 1208, 1241, 1243, 1283, - 1316, 1339, 1342, 1344 + 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 }; static const char _use_syllable_machine_indicies[] = { - 1, 0, 2, 3, 4, 2, 5, 3, - 4, 4, 6, 4, 4, 1, 7, 4, - 4, 4, 2, 2, 8, 9, 4, 4, - 10, 11, 12, 13, 14, 15, 16, 10, - 17, 18, 19, 20, 21, 22, 4, 23, - 24, 25, 4, 4, 4, 26, 4, 28, - 27, 30, 29, 29, 31, 32, 29, 29, - 29, 29, 29, 29, 29, 29, 33, 34, - 35, 36, 37, 38, 39, 40, 34, 41, - 33, 42, 43, 44, 45, 29, 46, 47, - 48, 29, 30, 29, 29, 31, 32, 29, - 29, 29, 29, 29, 29, 29, 29, 49, - 34, 35, 36, 37, 38, 39, 40, 34, - 41, 42, 42, 43, 44, 45, 29, 46, - 47, 48, 29, 31, 50, 30, 29, 29, - 31, 32, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 34, 35, 36, 37, 38, - 39, 40, 34, 41, 42, 42, 43, 44, - 45, 29, 46, 47, 48, 29, 30, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 34, 35, 36, 37, - 38, 29, 29, 29, 29, 29, 29, 43, - 44, 45, 29, 46, 47, 48, 29, 30, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 35, 36, - 37, 38, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 46, 47, 48, 29, - 30, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 36, 37, 38, 29, 30, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 37, 38, 29, - 30, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 38, 29, 30, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 36, 37, 38, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 46, 47, 48, 29, 30, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 36, 37, 38, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 47, 48, 29, 30, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 36, 37, - 38, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 48, 29, 30, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 35, 36, - 37, 38, 29, 29, 29, 29, 29, 29, - 43, 44, 45, 29, 46, 47, 48, 29, - 30, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 35, - 36, 37, 38, 29, 29, 29, 29, 29, - 29, 29, 44, 45, 29, 46, 47, 48, - 29, 30, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 35, 36, 37, 38, 29, 29, 29, 29, - 29, 29, 29, 29, 45, 29, 46, 47, - 48, 29, 30, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 34, 35, 36, 37, 38, 29, 40, 34, - 29, 29, 29, 43, 44, 45, 29, 46, - 47, 48, 29, 30, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 34, 35, 36, 37, 38, 29, 51, - 34, 29, 29, 29, 43, 44, 45, 29, - 46, 47, 48, 29, 30, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 34, 35, 36, 37, 38, 29, - 29, 34, 29, 29, 29, 43, 44, 45, - 29, 46, 47, 48, 29, 30, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 34, 35, 36, 37, 38, - 39, 40, 34, 29, 29, 29, 43, 44, - 45, 29, 46, 47, 48, 29, 30, 29, - 29, 31, 32, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 34, 35, 36, 37, - 38, 39, 40, 34, 41, 29, 42, 43, - 44, 45, 29, 46, 47, 48, 29, 30, - 29, 29, 31, 32, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 34, 35, 36, - 37, 38, 39, 40, 34, 41, 33, 42, - 43, 44, 45, 29, 46, 47, 48, 29, - 53, 52, 52, 52, 52, 52, 52, 52, - 54, 52, 5, 55, 53, 52, 6, 56, - 56, 1, 57, 56, 56, 56, 56, 56, - 56, 56, 56, 58, 10, 11, 12, 13, - 14, 15, 16, 10, 17, 19, 19, 20, - 21, 22, 56, 23, 24, 25, 56, 6, - 56, 56, 1, 57, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 10, 11, 12, - 13, 14, 15, 16, 10, 17, 19, 19, - 20, 21, 22, 56, 23, 24, 25, 56, - 6, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 10, 11, - 12, 13, 14, 56, 56, 56, 56, 56, - 56, 20, 21, 22, 56, 23, 24, 25, - 56, 6, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 11, 12, 13, 14, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 23, 24, - 25, 56, 6, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 12, 13, 14, 56, 6, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 13, - 14, 56, 6, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 14, 56, 6, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 12, 13, - 14, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 23, 24, 25, 56, 6, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 12, - 13, 14, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 24, 25, 56, - 6, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 12, 13, 14, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 25, - 56, 6, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 11, 12, 13, 14, 56, 56, 56, 56, - 56, 56, 20, 21, 22, 56, 23, 24, - 25, 56, 6, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 11, 12, 13, 14, 56, 56, 56, - 56, 56, 56, 56, 21, 22, 56, 23, - 24, 25, 56, 6, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 11, 12, 13, 14, 56, 56, - 56, 56, 56, 56, 56, 56, 22, 56, - 23, 24, 25, 56, 6, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 10, 11, 12, 13, 14, 56, - 16, 10, 56, 56, 56, 20, 21, 22, - 56, 23, 24, 25, 56, 6, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 10, 11, 12, 13, 14, - 56, 59, 10, 56, 56, 56, 20, 21, - 22, 56, 23, 24, 25, 56, 6, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 10, 11, 12, 13, - 14, 56, 56, 10, 56, 56, 56, 20, - 21, 22, 56, 23, 24, 25, 56, 6, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 10, 11, 12, - 13, 14, 15, 16, 10, 56, 56, 56, - 20, 21, 22, 56, 23, 24, 25, 56, - 6, 56, 56, 1, 57, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 10, 11, - 12, 13, 14, 15, 16, 10, 17, 56, - 19, 20, 21, 22, 56, 23, 24, 25, - 56, 1, 60, 3, 56, 56, 56, 3, - 56, 56, 6, 56, 56, 1, 57, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 10, 11, 12, 13, 14, 15, 16, 10, - 17, 18, 19, 20, 21, 22, 56, 23, - 24, 25, 56, 6, 56, 56, 1, 57, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 10, 11, 12, 13, 14, 15, 16, - 10, 17, 18, 19, 20, 21, 22, 56, - 23, 24, 25, 56, 62, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, - 62, 63, 61, 62, 63, 61, 63, 61, - 3, 60, 60, 60, 3, 60, 0 + 1, 0, 3, 2, 1, 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, + 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 }; static const char _use_syllable_machine_trans_targs[] = { - 1, 27, 2, 3, 1, 24, 1, 45, - 46, 48, 29, 30, 31, 32, 33, 40, - 41, 43, 47, 44, 37, 38, 39, 34, - 35, 36, 51, 1, 1, 1, 1, 4, - 5, 23, 7, 8, 9, 10, 11, 18, - 19, 21, 22, 15, 16, 17, 12, 13, - 14, 6, 1, 20, 1, 25, 26, 1, - 1, 0, 28, 42, 1, 1, 49, 50 + 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 }; static const char _use_syllable_machine_trans_actions[] = { - 1, 2, 0, 0, 5, 0, 6, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 12, 0, 0, 13, - 14, 0, 2, 0, 15, 16, 0, 0 + 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 }; static const char _use_syllable_machine_to_state_actions[] = { - 0, 3, 0, 0, 0, 0, 0, 0, + 0, 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, 0 }; static const char _use_syllable_machine_from_state_actions[] = { - 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 28, 30, 30, 51, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 53, 56, 53, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 61, 57, 57, - 62, 62, 62, 61 + 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 }; -static const int use_syllable_machine_start = 1; -static const int use_syllable_machine_first_final = 1; +static const int use_syllable_machine_start = 6; +static const int use_syllable_machine_first_final = 6; static const int use_syllable_machine_error = -1; -static const int use_syllable_machine_en_main = 1; +static const int use_syllable_machine_en_main = 6; #line 38 "hb-ot-shape-complex-use-machine.rl" -#line 140 "hb-ot-shape-complex-use-machine.rl" +#line 141 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -320,7 +337,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 324 "hb-ot-shape-complex-use-machine.hh" +#line 341 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -328,7 +345,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 161 "hb-ot-shape-complex-use-machine.rl" +#line 162 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -337,7 +354,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 341 "hb-ot-shape-complex-use-machine.hh" +#line 358 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -347,11 +364,11 @@ find_syllables (hb_buffer_t *buffer) goto _test_eof; _resume: switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 4: + case 7: #line 1 "NONE" {ts = p;} break; -#line 355 "hb-ot-shape-complex-use-machine.hh" +#line 372 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -369,72 +386,114 @@ _eof_trans: goto _again; switch ( _use_syllable_machine_trans_actions[_trans] ) { - case 2: -#line 1 "NONE" - {te = p+1;} - break; - case 8: -#line 129 "hb-ot-shape-complex-use-machine.rl" + case 12: +#line 130 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} break; - case 10: -#line 131 "hb-ot-shape-complex-use-machine.rl" + case 14: +#line 132 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (standard_cluster); }} break; - case 6: -#line 135 "hb-ot-shape-complex-use-machine.rl" + case 9: +#line 136 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; - case 5: -#line 136 "hb-ot-shape-complex-use-machine.rl" + case 8: +#line 137 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (non_cluster); }} break; - case 7: -#line 129 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (independent_cluster); }} - break; case 11: #line 130 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (virama_terminated_cluster); }} + {te = p;p--;{ found_syllable (independent_cluster); }} break; - case 9: + case 16: #line 131 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (standard_cluster); }} + {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; case 13: #line 132 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} + {te = p;p--;{ found_syllable (standard_cluster); }} break; - case 12: + case 18: #line 133 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (numeral_cluster); }} + {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; - case 16: + case 17: #line 134 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (symbol_cluster); }} + {te = p;p--;{ found_syllable (numeral_cluster); }} break; - case 14: + case 21: #line 135 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (broken_cluster); }} + {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 15: + case 19: #line 136 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (broken_cluster); }} + break; + case 20: +#line 137 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; - case 1: -#line 135 "hb-ot-shape-complex-use-machine.rl" + case 3: +#line 132 "hb-ot-shape-complex-use-machine.rl" + {{p = ((te))-1;}{ found_syllable (standard_cluster); }} + break; + case 5: +#line 136 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; -#line 429 "hb-ot-shape-complex-use-machine.hh" + case 1: +#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; + case 8: + {{p = ((te))-1;} found_syllable (non_cluster); } + break; + } + } + 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: +#line 1 "NONE" + {te = p+1;} +#line 136 "hb-ot-shape-complex-use-machine.rl" + {act = 7;} + break; + case 10: +#line 1 "NONE" + {te = p+1;} +#line 137 "hb-ot-shape-complex-use-machine.rl" + {act = 8;} + break; +#line 488 "hb-ot-shape-complex-use-machine.hh" } _again: switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 3: + case 6: #line 1 "NONE" {ts = 0;} break; -#line 438 "hb-ot-shape-complex-use-machine.hh" +#line 497 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) @@ -450,7 +509,7 @@ _again: } -#line 170 "hb-ot-shape-complex-use-machine.rl" +#line 171 "hb-ot-shape-complex-use-machine.rl" } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl index 86cd8b25fb6..89b776390b7 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 @@ -89,7 +89,8 @@ SMBlw = 42; # SYM_MOD_BELOW CS = 43; # CONS_WITH_STACKER -consonant_modifiers = CMAbv* CMBlw* ((H B | SUB) VS? CMAbv? CMBlw*)*; +# Override: Adjoc ZWJ placement. https://github.com/harfbuzz/harfbuzz/issues/542#issuecomment-353169729 +consonant_modifiers = CMAbv* CMBlw* ((ZWJ?.H.ZWJ? B | SUB) VS? CMAbv? CMBlw*)*; # Override: Allow two MBlw. https://github.com/harfbuzz/harfbuzz/issues/376 medial_consonants = MPre? MAbv? MBlw?.MBlw? MPst?; dependent_vowels = VPre* VAbv* VBlw* VPst*; 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 fd6978f281e..a67ef061122 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 @@ -75,7 +75,13 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 00C0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 00D0 */ O, O, O, O, O, O, O, GB, -#define use_offset_0x0900u 80 +#define use_offset_0x0348u 80 + + + /* Combining Diacritical Marks */ + O, O, O, O, O, O, O, CGJ, + +#define use_offset_0x0900u 88 /* Devanagari */ @@ -188,7 +194,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 0DE0 */ O, O, O, O, O, O, B, B, B, B, B, B, B, B, B, B, /* 0DF0 */ O, O, VPst, VPst, O, O, O, O, -#define use_offset_0x1000u 1352 +#define use_offset_0x1000u 1360 /* Myanmar */ @@ -204,7 +210,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1080 */ B, B, MBlw, VPst, VPre, VAbv, VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw, B, VMPst, /* 1090 */ B, B, B, B, B, B, B, B, B, B, VMPst, VMPst, VPst, VAbv, O, O, -#define use_offset_0x1700u 1512 +#define use_offset_0x1700u 1520 /* Tagalog */ @@ -237,7 +243,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, VAbv, O, O, /* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, -#define use_offset_0x1900u 1752 +#define use_offset_0x1900u 1760 /* Limbu */ @@ -281,7 +287,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 1A90 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, -#define use_offset_0x1b00u 2168 +#define use_offset_0x1b00u 2176 /* Balinese */ @@ -307,7 +313,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1BC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1BD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1BE0 */ B, B, B, B, B, B, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv, - /* 1BF0 */ FAbv, FAbv, VPst, VPst, O, O, O, O, O, O, O, O, O, O, O, O, + /* 1BF0 */ FAbv, FAbv, CMBlw, CMBlw, O, O, O, O, O, O, O, O, O, O, O, O, /* Lepcha */ @@ -317,7 +323,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1C30 */ FAbv, FAbv, FAbv, FAbv, VMPre, VMPre, FM, CMBlw, O, O, O, O, O, O, O, O, /* 1C40 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, B, B, -#define use_offset_0x1cd0u 2504 +#define use_offset_0x1cd0u 2512 /* Vedic Extensions */ @@ -326,20 +332,20 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O, /* 1CF0 */ O, O, VMPst, VMPst, VMAbv, O, O, VMPst, VMAbv, VMAbv, O, O, O, O, O, O, -#define use_offset_0x1df8u 2552 +#define use_offset_0x1df8u 2560 /* Combining Diacritical Marks Supplement */ O, O, O, FM, O, O, O, O, -#define use_offset_0x2008u 2560 +#define use_offset_0x2008u 2568 /* General Punctuation */ O, O, O, O, ZWNJ, ZWJ, O, O, /* 2010 */ GB, GB, GB, GB, GB, O, O, O, -#define use_offset_0x2060u 2576 +#define use_offset_0x2060u 2584 /* 2060 */ WJ, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, @@ -348,14 +354,20 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 2070 */ O, O, O, O, FM, O, O, O, O, O, O, O, O, O, O, O, /* 2080 */ O, O, FM, FM, FM, O, O, O, -#define use_offset_0x20f0u 2616 +#define use_offset_0x20f0u 2624 /* Combining Diacritical Marks for Symbols */ /* 20F0 */ VMAbv, O, O, O, O, O, O, O, -#define use_offset_0xa800u 2624 +#define use_offset_0x25c8u 2632 + + + /* Geometric Shapes */ + O, O, O, O, GB, O, O, O, + +#define use_offset_0xa800u 2640 /* Syloti Nagri */ @@ -442,7 +454,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* AAE0 */ B, B, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst, /* AAF0 */ O, O, O, O, O, VMPst, H, O, -#define use_offset_0xabc0u 3384 +#define use_offset_0xabc0u 3400 /* Meetei Mayek */ @@ -452,14 +464,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* ABE0 */ B, B, B, VPst, VPst, VAbv, VPst, VPst, VBlw, VPst, VPst, O, VMPst, VBlw, O, O, /* ABF0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, -#define use_offset_0xfe00u 3448 +#define use_offset_0xfe00u 3464 /* Variation Selectors */ /* FE00 */ VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, -#define use_offset_0x10a00u 3464 +#define use_offset_0x10a00u 3480 /* Kharoshthi */ @@ -470,7 +482,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 10A30 */ B, B, B, B, O, O, O, O, CMAbv, CMBlw, CMBlw, O, O, O, O, H, /* 10A40 */ B, B, B, B, B, B, B, B, -#define use_offset_0x11000u 3536 +#define use_offset_0x11000u 3552 /* Brahmi */ @@ -482,7 +494,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, O, O, O, O, O, O, /* 11050 */ O, O, N, N, N, N, N, N, N, N, N, N, N, N, N, N, /* 11060 */ N, N, N, N, N, N, B, B, B, B, B, B, B, B, B, B, - /* 11070 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, + /* 11070 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, HN, /* Kaithi */ @@ -491,7 +503,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 110A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 110B0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VPst, VPst, H, CMBlw, O, O, O, O, O, -#define use_offset_0x11100u 3728 +#define use_offset_0x11100u 3744 /* Chakma */ @@ -529,7 +541,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11220 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VPst, VBlw, /* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv, O, O, O, O, O, O, VMAbv, O, -#define use_offset_0x11280u 4048 +#define use_offset_0x11280u 4064 /* Multani */ @@ -557,7 +569,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11360 */ B, B, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O, /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O, -#define use_offset_0x11400u 4296 +#define use_offset_0x11400u 4312 /* Newa */ @@ -580,7 +592,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 114C0 */ VMAbv, VMPst, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O, /* 114D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, -#define use_offset_0x11580u 4520 +#define use_offset_0x11580u 4536 /* Siddham */ @@ -623,7 +635,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11720 */ VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VBlw, VAbv, VAbv, VAbv, O, O, O, O, /* 11730 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O, -#define use_offset_0x11a00u 4968 +#define use_offset_0x11a00u 4984 /* Zanabazar Square */ @@ -642,7 +654,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11A80 */ B, B, B, B, O, O, R, R, R, R, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, /* 11A90 */ FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, VMAbv, VMPst, CMAbv, H, O, O, O, O, O, O, -#define use_offset_0x11c00u 5128 +#define use_offset_0x11c00u 5144 /* Bhaiksuki */ @@ -663,7 +675,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, /* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O, -#define use_offset_0x11d00u 5312 +#define use_offset_0x11d00u 5328 /* Masaram Gondi */ @@ -675,7 +687,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11D40 */ VMAbv, VMAbv, CMBlw, VAbv, VBlw, H, R, MBlw, O, O, O, O, O, O, O, O, /* 11D50 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, -}; /* Table items: 5408; occupancy: 73% */ +}; /* Table items: 5424; occupancy: 73% */ USE_TABLE_ELEMENT_TYPE hb_use_get_categories (hb_codepoint_t u) @@ -685,8 +697,8 @@ hb_use_get_categories (hb_codepoint_t u) case 0x0u: if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u]; if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u]; + if (hb_in_range<hb_codepoint_t> (u, 0x0348u, 0x034Fu)) return use_table[u - 0x0348u + use_offset_0x0348u]; if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u]; - if (unlikely (u == 0x034Fu)) return CGJ; break; case 0x1u: @@ -702,7 +714,7 @@ hb_use_get_categories (hb_codepoint_t u) if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u]; if (hb_in_range<hb_codepoint_t> (u, 0x2060u, 0x2087u)) return use_table[u - 0x2060u + use_offset_0x2060u]; if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u]; - if (unlikely (u == 0x25CCu)) return GB; + if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u]; break; case 0xAu: @@ -727,7 +739,6 @@ hb_use_get_categories (hb_codepoint_t u) if (hb_in_range<hb_codepoint_t> (u, 0x11A00u, 0x11A9Fu)) return use_table[u - 0x11A00u + use_offset_0x11a00u]; if (hb_in_range<hb_codepoint_t> (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u]; if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11D5Fu)) return use_table[u - 0x11D00u + use_offset_0x11d00u]; - if (unlikely (u == 0x1107Fu)) return HN; break; default: 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 458c8eaa048..6b228790af8 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 @@ -442,10 +442,10 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, { if (!plan->has_kern) return; - OT::hb_apply_context_t c (1, font, buffer); + OT::hb_ot_apply_context_t c (1, font, buffer); c.set_lookup_mask (plan->kern_mask); c.set_lookup_props (OT::LookupFlag::IgnoreMarks); - OT::hb_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input; + OT::hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input; skippy_iter.init (&c); unsigned int count = buffer->len; @@ -473,6 +473,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, pos[idx].x_advance += kern1; pos[skippy_iter.idx].x_advance += kern2; pos[skippy_iter.idx].x_offset += kern2; + buffer->unsafe_to_break (idx, skippy_iter.idx + 1); } if (y_kern) @@ -482,6 +483,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, pos[idx].y_advance += kern1; pos[skippy_iter.idx].y_advance += kern2; pos[skippy_iter.idx].y_offset += kern2; + buffer->unsafe_to_break (idx, skippy_iter.idx + 1); } idx = skippy_iter.idx; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc index fd9e7c2a8df..62cbb9de998 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc @@ -345,9 +345,8 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, if (_hb_glyph_info_get_modified_combining_class (&buffer->info[end]) == 0) break; - /* We are going to do a O(n^2). Only do this if the sequence is short, - * but not too short ;). */ - if (end - i < 2 || end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) { + /* We are going to do a O(n^2). Only do this if the sequence is short. */ + if (end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) { i = end; continue; } @@ -373,13 +372,11 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, buffer->clear_output (); count = buffer->len; unsigned int starter = 0; - bool combine = true; buffer->next_glyph (); while (buffer->idx < count && !buffer->in_error) { hb_codepoint_t composed, glyph; - if (combine && - /* We don't try to compose a non-mark character with it's preceding starter. + if (/* We don't try to compose a non-mark character with it's preceding starter. * This is both an optimization to avoid trying to compose every two neighboring * glyphs in most scripts AND a desired feature for Hangul. Apparently Hangul * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */ @@ -410,22 +407,27 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, continue; } - else if (/* We sometimes custom-tailor the sorted order of marks. In that case, stop - * trying to combine as soon as combining-class drops. */ - starter < buffer->out_len - 1 && - info_cc (buffer->prev()) > info_cc (buffer->cur())) - combine = false; } /* Blocked, or doesn't compose. */ buffer->next_glyph (); if (info_cc (buffer->prev()) == 0) - { starter = buffer->out_len - 1; - combine = true; - } } buffer->swap_buffers (); + if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ) + { + /* For all CGJ, check if it prevented any reordering at all. + * If it did NOT, then make it skippable. + * https://github.com/harfbuzz/harfbuzz/issues/554 + */ + for (unsigned int i = 1; i + 1 < buffer->len; i++) + if (buffer->info[i].codepoint == 0x034Fu/*CGJ*/ && + info_cc(buffer->info[i-1]) <= info_cc(buffer->info[i+1])) + { + _hb_glyph_info_unhide (&buffer->info[i]); + } + } } 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 2f28b5620da..fc5dd1084d2 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 @@ -40,6 +40,8 @@ #include "hb-unicode-private.hh" #include "hb-set-private.hh" +#include "hb-ot-layout-gsubgpos-private.hh" +#include "hb-aat-layout-private.hh" static hb_tag_t common_features[] = { HB_TAG('c','c','m','p'), @@ -450,7 +452,8 @@ hb_ot_zero_width_default_ignorables (hb_ot_shape_context_t *c) hb_buffer_t *buffer = c->buffer; if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) || - (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)) + (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) || + (buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES)) return; unsigned int count = buffer->len; @@ -486,7 +489,8 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c) return; hb_codepoint_t space; - if (c->font->get_nominal_glyph (' ', &space)) + if (!(buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) && + c->font->get_nominal_glyph (' ', &space)) { /* Replace default-ignorables with a zero-advance space glyph. */ for (/*continue*/; i < count; i++) @@ -614,7 +618,8 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c) c->plan->substitute (c->font, buffer); - return; + /* XXX Call morx instead. */ + //hb_aat_layout_substitute (c->font, c->buffer); } static inline void diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh index 4b88a403041..e305a67c261 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-avar-table.hh @@ -133,8 +133,8 @@ struct avar protected: FixedVersion<>version; /* Version of the avar table * initially set to 0x00010000u */ - UINT16 reserved; /* This field is permanently reserved. Set to 0. */ - UINT16 axisCount; /* The number of variation axes in the font. This + HBUINT16 reserved; /* This field is permanently reserved. Set to 0. */ + HBUINT16 axisCount; /* The number of variation axes in the font. This * must be the same number as axisCount in the * 'fvar' table. */ SegmentMaps axisSegmentMapsZ; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh index 2a9357a5e2d..999b7236f3b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh @@ -42,11 +42,11 @@ struct InstanceRecord } protected: - UINT16 subfamilyNameID;/* The name ID for entries in the 'name' table + HBUINT16 subfamilyNameID;/* The name ID for entries in the 'name' table * that provide subfamily names for this instance. */ - UINT16 reserved; /* Reserved for future use — set to 0. */ + HBUINT16 reserved; /* Reserved for future use — set to 0. */ Fixed coordinates[VAR];/* The coordinates array for this instance. */ - //UINT16 postScriptNameIDX;/*Optional. The name ID for entries in the 'name' + //HBUINT16 postScriptNameIDX;/*Optional. The name ID for entries in the 'name' // * table that provide PostScript names for this // * instance. */ @@ -67,8 +67,8 @@ struct AxisRecord Fixed minValue; /* The minimum coordinate value for the axis. */ Fixed defaultValue; /* The default coordinate value for the axis. */ Fixed maxValue; /* The maximum coordinate value for the axis. */ - UINT16 reserved; /* Reserved for future use — set to 0. */ - UINT16 axisNameID; /* The name ID for entries in the 'name' table that + HBUINT16 reserved; /* Reserved for future use — set to 0. */ + HBUINT16 axisNameID; /* The name ID for entries in the 'name' table that * provide a display name for this axis. */ public: @@ -188,14 +188,14 @@ struct fvar * initially set to 0x00010000u */ Offset16 things; /* Offset in bytes from the beginning of the table * to the start of the AxisRecord array. */ - UINT16 reserved; /* This field is permanently reserved. Set to 2. */ - UINT16 axisCount; /* The number of variation axes in the font (the + HBUINT16 reserved; /* This field is permanently reserved. Set to 2. */ + HBUINT16 axisCount; /* The number of variation axes in the font (the * number of records in the axes array). */ - UINT16 axisSize; /* The size in bytes of each VariationAxisRecord — + HBUINT16 axisSize; /* The size in bytes of each VariationAxisRecord — * set to 20 (0x0014) for this version. */ - UINT16 instanceCount; /* The number of named instances defined in the font + HBUINT16 instanceCount; /* The number of named instances defined in the font * (the number of records in the instances array). */ - UINT16 instanceSize; /* The size in bytes of each InstanceRecord — set + HBUINT16 instanceSize; /* The size in bytes of each InstanceRecord — set * to either axisCount * sizeof(Fixed) + 4, or to * axisCount * sizeof(Fixed) + 6. */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh index fac843a7199..e20131b161a 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-hvar-table.hh @@ -55,7 +55,7 @@ struct DeltaSetIndexMap unsigned int u = 0; { /* Fetch it. */ unsigned int w = get_width (); - const UINT8 *p = mapData + w * v; + const HBUINT8 *p = mapData + w * v; for (; w; w--) u = (u << 8) + *p++; } @@ -78,10 +78,10 @@ struct DeltaSetIndexMap { return (format & 0xF) + 1; } protected: - UINT16 format; /* A packed field that describes the compressed + HBUINT16 format; /* A packed field that describes the compressed * representation of delta-set indices. */ - UINT16 mapCount; /* The number of mapping entries. */ - UINT8 mapData[VAR]; /* The delta-set index mapping data. */ + HBUINT16 mapCount; /* The number of mapping entries. */ + HBUINT8 mapData[VAR]; /* The delta-set index mapping data. */ public: DEFINE_SIZE_ARRAY (4, mapData); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh index e17ff5160a6..e835768521e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-mvar-table.hh @@ -43,7 +43,7 @@ struct VariationValueRecord public: Tag valueTag; /* Four-byte tag identifying a font-wide measure. */ - UINT32 varIdx; /* Outer/inner index into VariationStore item. */ + HBUINT32 varIdx; /* Outer/inner index into VariationStore item. */ public: DEFINE_SIZE_STATIC (8); @@ -95,13 +95,13 @@ protected: protected: FixedVersion<>version; /* Version of the metrics variation table * initially set to 0x00010000u */ - UINT16 reserved; /* Not used; set to 0. */ - UINT16 valueRecordSize;/* The size in bytes of each value record — + HBUINT16 reserved; /* Not used; set to 0. */ + HBUINT16 valueRecordSize;/* The size in bytes of each value record — * must be greater than zero. */ - UINT16 valueRecordCount;/* The number of value records — may be zero. */ + HBUINT16 valueRecordCount;/* The number of value records — may be zero. */ OffsetTo<VariationStore> varStore; /* Offset to item variation store table. */ - UINT8 values[VAR]; /* Array of value records. The records must be + HBUINT8 values[VAR]; /* Array of value records. The records must be * in binary order of their valueTag field. */ public: 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 acddd893810..62c9fb278fc 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh @@ -29,6 +29,8 @@ #ifndef HB_PRIVATE_HH #define HB_PRIVATE_HH +#define _GNU_SOURCE 1 + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -40,6 +42,7 @@ #define HB_OT_H_IN #endif +#include <math.h> #include <stdlib.h> #include <stddef.h> #include <string.h> @@ -86,8 +89,6 @@ extern "C" void hb_free_impl(void *ptr); #endif // __cplusplus < 201103L -#define _GNU_SOURCE 1 - #if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__) #define likely(expr) (__builtin_expect (!!(expr), 1)) #define unlikely(expr) (__builtin_expect (!!(expr), 0)) @@ -297,9 +298,10 @@ static_assert ((sizeof (hb_var_int_t) == 4), ""); /* Misc */ -/* Void! */ -struct _hb_void_t {}; -typedef const _hb_void_t *hb_void_t; +/* + * Void! + */ +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. */ 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 9c6f3ee37aa..576c169e678 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 @@ -185,6 +185,7 @@ struct hb_set_t inline void init (void) { + in_error = false; page_map.init (); pages.init (); } 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 0b0bad58dbd..5e05baa869b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc @@ -351,7 +351,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name) * full, PS. All of them point to the same name data with our unique name. */ - blob = OT::Sanitizer<OT::OpenTypeFontFile>::sanitize (blob); + blob = OT::Sanitizer<OT::OpenTypeFontFile>().sanitize (blob); unsigned int length, new_length, name_str_len; const char *orig_sfnt_data = hb_blob_get_data (blob, &length); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc index 819100e47e5..72de189d825 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc @@ -24,7 +24,6 @@ * Red Hat Author(s): Behdad Esfahbod */ -#include "hb-mutex-private.hh" #include "hb-open-file-private.hh" #include "hb-ot-layout-gdef-table.hh" #include "hb-ot-layout-gsubgpos-private.hh" diff --git a/Build/source/libs/harfbuzz/version.ac b/Build/source/libs/harfbuzz/version.ac index 8d414234430..bbcfb6b50c5 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.4]) +m4_define([harfbuzz_version], [1.7.5]) |