From: Bowon Ryu Date: Thu, 14 Feb 2019 08:33:09 +0000 (+0900) Subject: Imported Upstream version 2.3.1 X-Git-Tag: upstream/2.3.1 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fharfbuzz.git;a=commitdiff_plain;h=1baac414088e430483b85f702898c8448083bfc2 Imported Upstream version 2.3.1 --- diff --git a/AUTHORS b/AUTHORS index 81cdc4c..0763761 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,9 +1,11 @@ Behdad Esfahbod -Simon Hausmann -Martin Hosken +David Turner +Ebrahim Byagowi Jonathan Kew +Khaled Hosny Lars Knoll -Werner Lemberg -Roozbeh Pournader +Martin Hosken Owen Taylor -David Turner +Roozbeh Pournader +Simon Hausmann +Werner Lemberg diff --git a/BUILD.md b/BUILD.md index 8a6b569..4c1c306 100644 --- a/BUILD.md +++ b/BUILD.md @@ -26,7 +26,7 @@ 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/`. -If you are bootstraping from git, you need a few more tools before you can +If you are bootstrapping 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: diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ed7e56..6a1a36d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,9 @@ if (HB_BUILD_UTILS) set (HB_HAVE_FREETYPE ON) endif () +option(HB_BUILD_SUBSET "Build harfbuzz-subset" ON) +option(HB_BUILD_TESTS "Build harfbuzz tests" ON) + option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF) if (HB_HAVE_GOBJECT) set (HB_HAVE_GLIB ON) @@ -87,7 +90,6 @@ include_directories(AFTER ${PROJECT_BINARY_DIR}/src ) -add_definitions(-DHAVE_OT) add_definitions(-DHAVE_FALLBACK) # We need PYTHON_EXECUTABLE to be set for running the tests... @@ -98,10 +100,10 @@ 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}) + string(TOUPPER ${func_name} definition_to_add) + check_function_exists(${func_name} HAVE_${definition_to_add}) + if (${HAVE_${definition_to_add}}) + add_definitions(-DHAVE_${definition_to_add}) endif () endforeach () endmacro () @@ -166,10 +168,6 @@ 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_SUBSET_sources ${SRCSOURCES}) add_prefix_to_list(HB_SUBSET_sources "${PROJECT_SOURCE_DIR}/src/") @@ -178,13 +176,10 @@ extract_make_variable(HB_SUBSET_headers ${SRCSOURCES}) add_prefix_to_list(HB_SUBSET_headers "${PROJECT_SOURCE_DIR}/src/") extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES}) -extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES}) #if (IN_HB_DIST) add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/") - add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/") #else () # add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/") -# add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/") #endif () extract_make_variable(HB_VIEW_sources ${UTILSOURCES}) @@ -210,7 +205,7 @@ set (HB_VERSION_MICRO ${CMAKE_MATCH_4}) ## Define ragel tasks # if (NOT IN_HB_DIST) -# foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources}) +# foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources}) # string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output}) # set (target_name ${CMAKE_MATCH_1}) # add_custom_command(OUTPUT ${ragel_output} @@ -244,8 +239,6 @@ set (project_sources ${HB_BASE_RAGEL_GENERATED_sources} ${HB_FALLBACK_sources} - ${HB_OT_sources} - ${HB_OT_RAGEL_GENERATED_sources} ) set (subset_project_sources @@ -258,7 +251,6 @@ set (project_headers #${HB_VERSION_H} ${HB_BASE_headers} - ${HB_OT_headers} ) set (subset_project_headers @@ -359,12 +351,32 @@ if (APPLE AND HB_HAVE_CORETEXT) list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/hb-coretext.cc) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-coretext.h) - find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices) - if (APPLICATION_SERVICES_FRAMEWORK) - list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK}) - endif (APPLICATION_SERVICES_FRAMEWORK) + if (HB_IOS) + find_library(COREFOUNDATION CoreFoundation) + if (COREFOUNDATION) + list(APPEND THIRD_PARTY_LIBS ${COREFOUNDATION}) + endif () + mark_as_advanced(COREFOUNDATION) + + find_library(CORETEXT CoreText) + if (CORETEXT) + list(APPEND THIRD_PARTY_LIBS ${CORETEXT}) + endif () + mark_as_advanced(CORETEXT) + + find_library(COREGRAPHICS CoreGraphics) + if (COREGRAPHICS) + list(APPEND THIRD_PARTY_LIBS ${COREGRAPHICS}) + endif () + mark_as_advanced(COREGRAPHICS) + else () + find_library(APPLICATION_SERVICES_FRAMEWORK ApplicationServices) + if (APPLICATION_SERVICES_FRAMEWORK) + list(APPEND THIRD_PARTY_LIBS ${APPLICATION_SERVICES_FRAMEWORK}) + endif () - mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK) + mark_as_advanced(APPLICATION_SERVICES_FRAMEWORK) + endif () endif () if (WIN32 AND HB_HAVE_UNISCRIBE) @@ -527,18 +539,20 @@ add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_heade target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS}) ## Define harfbuzz-subset library -add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers}) -add_dependencies(harfbuzz-subset harfbuzz) -target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS}) +if (HB_BUILD_SUBSET) + add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers}) + add_dependencies(harfbuzz-subset harfbuzz) + target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS}) -if (BUILD_SHARED_LIBS) - set_target_properties(harfbuzz harfbuzz-subset PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE) + if (BUILD_SHARED_LIBS) + set_target_properties(harfbuzz harfbuzz-subset PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE) + endif () endif () if (UNIX OR MINGW) # Make symbols link locally include (CheckCXXCompilerFlag) - check_cxx_compiler_flag(-Bsymbolic-functions CXX_SUPPORTS_FLAG_BSYMB_FUNCS) + CHECK_CXX_COMPILER_FLAG(-Bsymbolic-functions CXX_SUPPORTS_FLAG_BSYMB_FUNCS) if (CXX_SUPPORTS_FLAG_BSYMB_FUNCS) link_libraries(-Bsymbolic-functions) endif () @@ -549,13 +563,23 @@ if (UNIX OR MINGW) set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "") set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C) - set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C) + if (HB_BUILD_SUBSET) + set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C) + endif () # No threadsafe statics as we do it ourselves set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics") endif () + + CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) + if (COMPILER_SUPPORTS_CXX11) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + else() + message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") + endif() endif () + ## Define harfbuzz-gobject library if (HB_HAVE_GOBJECT) add_library(harfbuzz-gobject @@ -574,7 +598,7 @@ if (HB_HAVE_GOBJECT) endif () if (BUILD_SHARED_LIBS AND WIN32 AND NOT MINGW) - add_definitions("-DHB_EXTERN=__declspec(dllexport) extern") + add_definitions("-DHB_DLL_EXPORT") endif () # On Windows, g-ir-scanner requires a DLL build in order for it to work @@ -680,6 +704,8 @@ if (HB_HAVE_INTROSPECTION) -DHB_H_IN -DHB_OT_H -DHB_OT_H_IN + -DHB_AAT_H + -DHB_AAT_H_IN -DHB_GOBJECT_H -DHB_GOBJECT_H_IN -DHB_EXTERN= @@ -761,12 +787,22 @@ endif () if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL) install(TARGETS harfbuzz + EXPORT harfbuzzConfig ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} FRAMEWORK DESTINATION Library/Frameworks ) + install(EXPORT harfbuzzConfig + NAMESPACE harfbuzz:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/harfbuzz + ) if (HB_BUILD_UTILS) + if (WIN32 AND BUILD_SHARED_LIBS) + install(TARGETS harfbuzz-subset + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) + endif () install(TARGETS hb-view RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) @@ -818,52 +854,53 @@ if (UNIX AND CMAKE_GENERATOR STREQUAL "Ninja") endif () -## src/ executables -foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges) - set (prog_name ${prog}) - if (${prog_name} STREQUAL "test") - # test can not be used as a valid executable name on cmake, lets special case it - 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) +if (HB_BUILD_TESTS) + ## src/ executables + foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges) + 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 + add_custom_command(TARGET harfbuzz POST_BUILD + COMMAND "${PYTHON_EXECUTABLE}" ${PROJECT_SOURCE_DIR}/src/gen-def.py ${PROJECT_BINARY_DIR}/harfbuzz.def ${project_headers} + 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) + + set_tests_properties( + check-static-inits.sh check-libstdc++.sh check-symbols.sh + PROPERTIES + ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src" + SKIP_RETURN_CODE 77) + endif () + add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh) + 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-static-inits.sh check-libstdc++.sh check-symbols.sh + check-c-linkage-decls.sh check-header-guards.sh check-externs.sh check-includes.sh PROPERTIES - ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src SKIP_RETURN_CODE 77) 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 - SKIP_RETURN_CODE 77) + # Needs to come last so that variables defined above are passed to + # subdirectories. + add_subdirectory(test) endif () - -# Needs to come last so that variables defined above are passed to -# subdirectories. -add_subdirectory(test) diff --git a/ChangeLog b/ChangeLog index 7331471..135b034 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28113 @@ +commit fe532923101586e316b300d419a337d357cd93da +Author: Behdad Esfahbod +Date: Mon Jan 28 20:47:58 2019 -0500 + + [CI] Peg CircleCI badge link to master branch + + [skip ci] + + README.md | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9569819e24f72926a5b26e4c8a86d815c0132745 +Author: Behdad Esfahbod +Date: Mon Jan 28 20:43:43 2019 -0500 + + [ci] Peg build status badges to master branch + + [skip ci] + + README.md | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1e29906a77c275c34a440a416654a514810485e1 +Author: Behdad Esfahbod +Date: Mon Jan 28 20:38:15 2019 -0500 + + Switch README / README.md + + [skip ci] + + README | 19 +------------------ + README.md | 19 ++++++++++++++++++- + 2 files changed, 19 insertions(+), 19 deletions(-) + +commit 9a1df82e3f13fbd4488ee9955814bbb5d0957074 +Author: Behdad Esfahbod +Date: Mon Jan 28 14:15:18 2019 -0500 + + [uniscribe] Whitelist function type cast + + src/hb-uniscribe.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6e1c3eaf7005d06c89f0807f693aadd835aa0468 +Author: Behdad Esfahbod +Date: Mon Jan 28 14:12:41 2019 -0500 + + Fix sign comparison error + + src/hb-open-file.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 9db7a7da6339eacbb6c699fa1939bbd7e9e148f5 +Author: Behdad Esfahbod +Date: Mon Jan 28 14:09:59 2019 -0500 + + Fix warning + + c:\projects\harfbuzz\src\hb-ot-color-cbdt-table.hh(59): warning C4146: + unary minus operator applied to unsigned type, result still unsigned + [C:\projects\harfbuzz\build\harfbuzz.vcxproj] + + src/hb-ot-color-cbdt-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 51b584880e550545ced3aa8ba4ccad3cf79bb53e +Author: Behdad Esfahbod +Date: Mon Jan 28 14:09:45 2019 -0500 + + [pragma] Silence MSVC unknown-pragma warning + + src/hb.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 60022ecced202760daa7f75516bba6a4689a49de +Author: Behdad Esfahbod +Date: Sat Jan 26 14:04:51 2019 +0100 + + Fix -Wcast-function-type warnings in util/ with gcc 4.8 + + src/hb.hh | 1 + + util/options.hh | 5 ++++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit a9321cb5f88cae1dafbd623b8bf7c68a82a3c211 +Author: Behdad Esfahbod +Date: Fri Jan 25 16:11:45 2019 +0100 + + Fix mac test + + test/shaping/data/in-house/tests/macos.tests | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f39809752909f193a9c60f4357a88ea1c3ce1162 +Author: Behdad Esfahbod +Date: Fri Jan 25 16:08:25 2019 +0100 + + More static constexpr + + src/hb-machinery.hh | 10 +++++----- + src/hb-set-digest.hh | 14 +++++++------- + 2 files changed, 12 insertions(+), 12 deletions(-) + +commit 06358ae9746ae72c0917e8a5f294d14fd695f380 +Author: Behdad Esfahbod +Date: Fri Jan 25 15:11:47 2019 +0100 + + [AAT] Add test for recent Ligature stack fix, using Zapfino on Mac + + test/shaping/data/in-house/tests/macos.tests | 2 ++ + 1 file changed, 2 insertions(+) + +commit e970de48bcbdccd29350f331288c0a98f7846c16 +Author: Behdad Esfahbod +Date: Thu Jan 24 18:16:17 2019 +0100 + + [AAT] Minor sign + + src/hb-aat-layout-morx-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a371a28cda23805cbea22867e0a3ed53ecb811ed +Author: Behdad Esfahbod +Date: Thu Jan 24 18:12:25 2019 +0100 + + [AAT] Use a ring buffer for ligature stack + + I think Apple does very similarly, but probably with a stack size + of 16. + We do it with a stack size that is currently set to 64. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1531 + + src/hb-aat-layout-morx-table.hh | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit 7886b1578fceee368ae5afe206ff98f50e1c42e3 +Author: Behdad Esfahbod +Date: Thu Jan 24 18:06:17 2019 +0100 + + Whitespace + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b976940243bf1f174bd6abb85955789ef2631d24 +Author: Behdad Esfahbod +Date: Thu Jan 24 18:01:07 2019 +0100 + + [AAT] Handle transition errors during machine operation + + Before we used to give up. Now, just ignore error and continue + processing. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1531 + + src/hb-aat-layout-common.hh | 3 +-- + src/hb-aat-layout-kerx-table.hh | 21 +++++++-------------- + src/hb-aat-layout-morx-table.hh | 34 +++++++++++++--------------------- + 3 files changed, 21 insertions(+), 37 deletions(-) + +commit e234bb6a428cd6c8ddf57eb078cd51b9d1f25ba8 +Author: Behdad Esfahbod +Date: Thu Jan 24 17:23:11 2019 +0100 + + [AAT] Ignore machine errors and continue + + src/hb-aat-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1ec90514f69efc329691186466f62373efa863b1 +Author: Behdad Esfahbod +Date: Thu Jan 24 17:21:41 2019 +0100 + + [AAT] Minor + + src/hb-aat-layout-common.hh | 12 ++++---- + src/hb-aat-layout-kerx-table.hh | 38 +++++++++++------------ + src/hb-aat-layout-morx-table.hh | 68 + ++++++++++++++++++++--------------------- + 3 files changed, 59 insertions(+), 59 deletions(-) + +commit 299eca0c3b28c99add006420bc667431d874fb2e +Author: Behdad Esfahbod +Date: Thu Jan 24 17:17:00 2019 +0100 + + [AAT] Handle out-of-bounds classes + + src/hb-aat-layout-common.hh | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit c4623db4a3f963394db940449007fa3312460993 +Author: Behdad Esfahbod +Date: Thu Jan 24 17:10:12 2019 +0100 + + [AAT] Minor + + src/hb-aat-layout-common.hh | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit c4e36f97b6df1eb5fba588b09ae1630bb5c49589 +Author: Behdad Esfahbod +Date: Thu Jan 24 17:06:16 2019 +0100 + + [AAT] Minor + + src/hb-aat-layout-common.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit f60282c5bff4a317ba3180e3519274963c6e8849 +Author: Behdad Esfahbod +Date: Thu Jan 24 16:29:09 2019 +0100 + + More pragma control + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=924848 + + src/hb.hh | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit fd0889f903ac1ba2da06e77eed8424395ea85a90 +Author: Behdad Esfahbod +Date: Thu Jan 24 16:12:52 2019 +0100 + + Comment + + src/hb-ot-shape.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 00f06d1aa61e9a6d01b5943ce55ba2b0c40237ee +Author: Behdad Esfahbod +Date: Thu Jan 24 16:11:05 2019 +0100 + + Fix test + + test/shaping/data/in-house/tests/cluster.tests | 1 - + test/shaping/data/in-house/tests/emoji.tests | 3 ++- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 9f314177336f9551756944e0e555614c9189c7a5 +Author: Behdad Esfahbod +Date: Thu Jan 24 16:08:33 2019 +0100 + + Form cluster for Emoji sub-region tag sequences + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1556 + + src/hb-ot-shape.cc | 13 + +++++++++++++ + .../fonts/8d9c4b193808b8bde94389ba7831c1fc6f9e794e.ttf | Bin 0 -> + 1548 bytes + test/shaping/data/in-house/tests/cluster.tests | 1 + + 3 files changed, 14 insertions(+) + +commit 5034f8f2ab8f53eb0395e6f6ce2f8da69a08460d +Author: Behdad Esfahbod +Date: Thu Jan 24 12:50:38 2019 +0100 + + Fix macos tests with previous commit + + test/shaping/data/in-house/tests/macos.tests | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 3ecda71041a7239ca37ec7b888809efe8f595a19 +Author: Behdad Esfahbod +Date: Thu Jan 24 12:08:23 2019 +0100 + + Adjust mark offsets when zeroing from fallback mark positioning code + + Adjust tests. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1532 + + src/hb-ot-shape-fallback.cc | 31 + +++++++++++++++------- + src/hb-ot-shape-fallback.hh | 3 ++- + src/hb-ot-shape.cc | 3 ++- + .../in-house/tests/arabic-fallback-shaping.tests | 2 +- + test/shaping/data/in-house/tests/cluster.tests | 2 +- + .../data/in-house/tests/fallback-positioning.tests | 4 +-- + 6 files changed, 30 insertions(+), 15 deletions(-) + +commit 36fb2b4da9718a86978fa07c99ba4345f7ca9b4b +Author: Behdad Esfahbod +Date: Wed Jan 23 20:53:57 2019 +0100 + + [AAT] In InsertionChain, set mark to previous-position if inserting + + Fixes MORX-31 + + src/hb-aat-layout-morx-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit cbe0ed117ac86179183c389977d15981d26524f7 +Author: Behdad Esfahbod +Date: Wed Jan 23 20:45:18 2019 +0100 + + [AAT] Re-enable tests MORX-31 and MORX-41 + + test/shaping/data/text-rendering-tests/DISABLED | 3 --- + test/shaping/data/text-rendering-tests/Makefile.sources | 2 ++ + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit baf4d6a68a031bf65e17ccd5dac15fe7d0df33b6 +Author: Behdad Esfahbod +Date: Wed Jan 23 20:36:07 2019 +0100 + + [AAT] Remove mark_set from InsertionChain + + src/hb-aat-layout-morx-table.hh | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 410731d3fb678365c07a4d1745b72b6bb3142b70 +Author: Behdad Esfahbod +Date: Wed Jan 23 20:30:48 2019 +0100 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/extract-tests.py | 2 +- + test/shaping/data/text-rendering-tests/tests/MORX-14.tests | 2 +- + test/shaping/data/text-rendering-tests/tests/MORX-32.tests | 8 ++++---- + test/shaping/data/text-rendering-tests/tests/MORX-41.tests | 4 ++-- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit 0b2fa342de88bbe609b2147444e56c94680cbd38 +Author: Behdad Esfahbod +Date: Tue Jan 22 16:36:00 2019 +0100 + + More of previous + + src/hb-subset-cff1.cc | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +commit a5e5dd8b42b40c3647e06e6bb62580af77bed42b +Author: Behdad Esfahbod +Date: Tue Jan 22 16:30:07 2019 +0100 + + Fix sign-compare error resulted from promoting unsigned integers to + signed larger ints + + Clang and gcc know not to warn in these cases, but not nonmainstream + compilers + + src/hb-subset-cff2.cc | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 32379bbf10726bb7ed2e507d0a6b5917c350e056 +Author: Behdad Esfahbod +Date: Tue Jan 22 12:55:29 2019 +0100 + + Cast HB_UNTAG results to uint8_t + + src/hb-common.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 83d4aa5ca9a39dbe66db9b81b34f5b568503bd7e +Author: Behdad Esfahbod +Date: Tue Jan 22 12:52:23 2019 +0100 + + More -Wcast-error fix + + src/hb-dsalgs.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 447323b85a7b68bd41561a87c91431cd05227b97 +Author: Behdad Esfahbod +Date: Tue Jan 22 12:45:40 2019 +0100 + + Better fix for -Wcast-align errors + + src/hb-font.cc | 33 +++++++++------------------------ + src/hb-ft.cc | 14 ++++---------- + src/hb-machinery.hh | 16 ++++++++++++++++ + src/hb-ot-cmap-table.hh | 7 ++----- + src/hb-ot-font.cc | 14 ++++---------- + 5 files changed, 35 insertions(+), 49 deletions(-) + +commit 81ec543d800c4a94b5e608fd87e84d33d7dae8ac +Author: Behdad Esfahbod +Date: Tue Jan 22 12:43:12 2019 +0100 + + More -Wcast-error fixes + + src/hb-font.cc | 8 ++++---- + src/hb-ft.cc | 2 +- + src/hb-ot-font.cc | 4 ++-- + 3 files changed, 7 insertions(+), 7 deletions(-) + +commit 90772725493108c79487a67620f0240e5d68f4ee +Author: Behdad Esfahbod +Date: Tue Jan 22 12:40:18 2019 +0100 + + pragma GCC diagnostic error "-Wsign-compare" + + src/hb.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8d05bf7dc0094e75be07ca1f7ef852a1e45d0687 +Author: Behdad Esfahbod +Date: Tue Jan 22 12:34:05 2019 +0100 + + Fix cast-align error + + If compiler doesn't inline StructAtOffset, this was an error since we + only disable cast-align at call-site. So, move the cast out. + + ../src/hb-machinery.hh: In instantiation of 'const Type& + StructAtOffset(const void*, unsigned int) [with Type = unsigned int]': + ../src/hb-font.cc:146:85: required from here + ../src/hb-machinery.hh:63:12: error: cast from 'const char*' to + 'const unsigned int*' increases required alignment of target type + [-Werror=cast-align] + { return * reinterpret_cast ((const char *) P + + offset); } + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ../src/hb-machinery.hh: In instantiation of 'Type& + StructAtOffset(void*, unsigned int) [with Type = unsigned int]': + ../src/hb-font.cc:147:79: required from here + ../src/hb-machinery.hh:66:12: error: cast from 'char*' to 'unsigned + int*' increases required alignment of target type [-Werror=cast-align] + { return * reinterpret_cast ((char *) P + offset); } + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + src/hb-font.cc | 8 ++++---- + src/hb-ft.cc | 6 +++--- + src/hb-ot-cmap-table.hh | 4 ++-- + src/hb-ot-font.cc | 4 ++-- + 4 files changed, 11 insertions(+), 11 deletions(-) + +commit b270cee6c5800c019aafb55e9ca9d7e92a92d3ec +Author: Behdad Esfahbod +Date: Tue Jan 22 12:29:05 2019 +0100 + + [CI] Remove gcc 4.2 bots + + We don't support that version anymore. + + .circleci/config.yml | 25 ------------------------- + 1 file changed, 25 deletions(-) + +commit 70a52d6bd8c45630ca90e945fc4d716fe9114010 +Author: Behdad Esfahbod +Date: Tue Jan 22 12:15:23 2019 +0100 + + Convert all other enum class consts to static constexpr + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1553 + + src/hb-cff-interp-common.hh | 2 +- + src/hb-iter.hh | 2 +- + src/hb-machinery.hh | 12 ++++++------ + src/hb-open-type.hh | 8 ++++---- + src/hb-set-digest.hh | 4 ++-- + src/hb-set.hh | 10 +++++----- + src/hb-vector.hh | 2 +- + 7 files changed, 20 insertions(+), 20 deletions(-) + +commit 5d4b0377b99ddc4112b8ffb2b787eac0b383081c +Author: Behdad Esfahbod +Date: Tue Jan 22 12:11:24 2019 +0100 + + Convert unsigned enum class consts to static constexpr + + Part of https://github.com/harfbuzz/harfbuzz/issues/1553 + + src/hb-aat-layout-common.hh | 6 +++--- + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-buffer.hh | 2 +- + src/hb-open-type.hh | 2 +- + src/hb-ot-kern-table.hh | 4 ++-- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout.cc | 4 ++-- + 7 files changed, 11 insertions(+), 11 deletions(-) + +commit ef00654962204ae706b276871e2b6758fbbf69e0 +Author: Behdad Esfahbod +Date: Tue Jan 22 12:08:57 2019 +0100 + + Convert tag enum class consts to static constexpr + + Part of https://github.com/harfbuzz/harfbuzz/issues/1553 + + src/hb-aat-fdsc-table.hh | 2 +- + src/hb-aat-layout-ankr-table.hh | 2 +- + src/hb-aat-layout-bsln-table.hh | 2 +- + src/hb-aat-layout-feat-table.hh | 2 +- + src/hb-aat-layout-just-table.hh | 2 +- + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-aat-layout-lcar-table.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 6 +++--- + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-aat-ltag-table.hh | 2 +- + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 2 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-color-cbdt-table.hh | 4 ++-- + src/hb-ot-color-colr-table.hh | 2 +- + src/hb-ot-color-cpal-table.hh | 2 +- + src/hb-ot-color-sbix-table.hh | 2 +- + src/hb-ot-color-svg-table.hh | 2 +- + src/hb-ot-gasp-table.hh | 2 +- + src/hb-ot-glyf-table.hh | 4 ++-- + src/hb-ot-hdmx-table.hh | 2 +- + src/hb-ot-head-table.hh | 2 +- + src/hb-ot-hhea-table.hh | 4 ++-- + src/hb-ot-hmtx-table.hh | 12 ++++++------ + src/hb-ot-kern-table.hh | 6 +++--- + src/hb-ot-layout-base-table.hh | 2 +- + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-ot-layout-jstf-table.hh | 2 +- + src/hb-ot-math-table.hh | 2 +- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-os2-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-ot-stat-table.hh | 2 +- + src/hb-ot-var-avar-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 2 +- + src/hb-ot-var-hvar-table.hh | 8 ++++---- + src/hb-ot-var-mvar-table.hh | 2 +- + src/hb-ot-vorg-table.hh | 2 +- + 41 files changed, 56 insertions(+), 56 deletions(-) + +commit 39e1b6d03f71ccb8f18d64dfbff64acfaf02970b +Author: Behdad Esfahbod +Date: Tue Jan 22 12:07:43 2019 +0100 + + Convert boolean enum class consts to static constexpr + + Part of https://github.com/harfbuzz/harfbuzz/issues/1553 + + src/hb-aat-layout-common.hh | 4 ++-- + src/hb-aat-layout-kerx-table.hh | 4 ++-- + src/hb-aat-layout-morx-table.hh | 8 ++++---- + src/hb-dsalgs.hh | 16 ++++++++-------- + src/hb-ot-kern-table.hh | 4 ++-- + src/hb-ot-layout.cc | 4 ++-- + 6 files changed, 20 insertions(+), 20 deletions(-) + +commit 271cb7c1c0f49c7af786daa5d5310b9f08142148 +Author: Behdad Esfahbod +Date: Tue Jan 22 12:05:35 2019 +0100 + + Make some enum constants unsigned + + src/hb-aat-layout-common.hh | 6 +++--- + src/hb-buffer.hh | 2 +- + src/hb-ot-layout.cc | 8 ++++---- + 3 files changed, 8 insertions(+), 8 deletions(-) + +commit 3d9a6e62662fb769e0f785fa7a43df806988d2a2 +Author: Behdad Esfahbod +Date: Tue Jan 22 12:02:06 2019 +0100 + + Whitespace + + src/hb-ot-layout-gsubgpos.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c81f02fd06fcbc4426c9e3255833f8d7057cc97a +Author: Behdad Esfahbod +Date: Tue Jan 22 12:00:44 2019 +0100 + + pragma GCC diagnostic error "-Wvla" + + src/hb.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ff98109455bfbf92f7633262bc570b05d15d5d01 +Author: Alfie John +Date: Tue Jan 22 19:58:36 2019 +1100 + + Fix grammar + + docs/usermanual-clusters.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9c0f5e714cc62bcf6349b86b13e1c031f9bb764 +Author: Alfie John +Date: Tue Jan 22 00:03:02 2019 +0000 + + Grammar fix + + docs/usermanual-clusters.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 789396ed6bf2c76c1bb955e80efb43f75e3c61d2 +Author: Behdad Esfahbod +Date: Sun Jan 20 20:09:10 2019 -0500 + + Remove wrongly added files + + test/api/test-ot-extents-cff | Bin 8574336 -> + 0 bytes + .../test-ot-extents-cff.dSYM/Contents/Info.plist | 20 + -------------------- + .../Contents/Resources/DWARF/test-ot-extents-cff | Bin 7650053 -> + 0 bytes + 3 files changed, 20 deletions(-) + +commit 380c3cffb9353083913a3bb505c2c62367613096 +Author: Behdad Esfahbod +Date: Sun Jan 20 19:51:08 2019 -0500 + + Use enum for class constant + + src/hb-cff-interp-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6d042a18e7079e07a2b2f465a6a56483a42ef189 +Author: Behdad Esfahbod +Date: Sun Jan 20 19:49:59 2019 -0500 + + [CFF] Use enum for tableTag + + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit c1cbbb94595641f0609cc8d2dbe8415540c10f77 +Author: Behdad Esfahbod +Date: Sun Jan 20 19:47:52 2019 -0500 + + Use static constexpr for large class constants + + src/hb-map.hh | 2 +- + src/hb-set.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 30ae62779f1a68c5657ab27bc7e77496ba8a906c +Author: Khaled Hosny +Date: Mon Jan 21 16:44:48 2019 +0200 + + Regular spaces will do + + docs/usermanual-getting-started.xml | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit ed62551d67ac5bb8dbfaf3fa5eb51013157b214a +Author: Alfie John +Date: Mon Jan 21 05:00:01 2019 +0000 + + Adding leading space for code example + + docs/usermanual-getting-started.xml | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 3e332544db35ca08de767ecab01b489a9905c559 +Author: Alfie John +Date: Mon Jan 21 04:54:27 2019 +0000 + + Fix description of example + + docs/usermanual-getting-started.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2144ca9f01d01b6de386d17ada73a288372ee553 +Author: Alfie John +Date: Mon Jan 21 04:47:05 2019 +0000 + + Added option to build docs to docs + + docs/usermanual-install-harfbuzz.xml | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 043b610fa698ed247347dfaa042f032f3fd3f572 +Author: Behdad Esfahbod +Date: Sat Jan 19 09:20:46 2019 -0500 + + Fix sign compare warnings + + ../../third_party/harfbuzz-ng/src/src/hb-map.hh(56,45): warning: + comparison of integers of different signs: 'const hb_codepoint_t' + (aka 'const unsigned int') and 'hb_map_t::(anonymous enum + at ../../third_party/harfbuzz-ng/src/src/hb-map.hh:169:3)' + [-Wsign-compare] + bool is_unused () const { return key == INVALID; } + + src/hb-map.hh | 2 +- + src/hb-set.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit ce317d032061d81c520180a338172ce38b427135 +Author: Behdad Esfahbod +Date: Sat Jan 19 09:18:03 2019 -0500 + + Fix warning + + warning: '_WIN64' is not defined, evaluates to 0 [-Wundef] + + src/hb-dsalgs.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0c2bd1b160fda4e77919889ac80f9460967fa251 +Author: Ebrahim Byagowi +Date: Sat Jan 19 16:30:07 2019 +0330 + + [dwrite] Fix delete-non-virtual-dtor warning (#1550) + + src/hb-directwrite.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 89bcfb204c736f5962d377896af2c1350f179882 +Author: Behdad Esfahbod +Date: Fri Jan 18 14:59:18 2019 -0500 + + Remove TRACE_COLLECT_GLYPHS + + src/hb-debug.hh | 13 ------------- + src/hb-ot-layout-gpos-table.hh | 26 ++++---------------------- + src/hb-ot-layout-gsub-table.hh | 21 +++------------------ + src/hb-ot-layout-gsubgpos.hh | 12 +----------- + 4 files changed, 8 insertions(+), 64 deletions(-) + +commit f13b6786f0aefd2060ca976f7e42db7387b49450 +Author: Behdad Esfahbod +Date: Fri Jan 18 14:53:54 2019 -0500 + + [pragma] Only add if GCC or clang + + src/hb.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit c2ea7a9da463c567d321233b23813c59762841bb +Author: Behdad Esfahbod +Date: Fri Jan 18 13:45:33 2019 -0500 + + [directwrite] More fix + + src/hb-directwrite.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9714d3ec5c45b2fe460fa6b21bdb3487c62029d3 +Author: Ebrahim Byagowi +Date: Fri Jan 18 21:55:21 2019 +0330 + + [dwrite] Try to fix delete-non-virtual-dtor warnings + + Fixes #1548 hopefully + + src/hb-directwrite.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0772c06f96c3f5a319485c390416531b8125251b +Author: Behdad Esfahbod +Date: Fri Jan 18 12:53:06 2019 -0500 + + Remove tracing from closure + + src/hb-debug.hh | 13 ------------- + src/hb-ot-layout-gsub-table.hh | 15 ++------------- + src/hb-ot-layout-gsubgpos.hh | 14 +------------- + 3 files changed, 3 insertions(+), 39 deletions(-) + +commit d9f6be3a61edfe9e1bce01ea9b11e2bcb16f9618 +Author: Behdad Esfahbod +Date: Fri Jan 18 12:48:01 2019 -0500 + + Fix -Wundef errors with __GNUC__ + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1549 + + src/hb-common.h | 4 ++-- + src/hb.hh | 10 +++++----- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 28917e58f973e5875d3ef3004c16e1ee1a5a973c +Author: Michiharu Ariza +Date: Fri Jan 18 09:43:51 2019 -0800 + + init interp_env_t::hintmask_size + + fixes issue #1547 + + src/hb-cff-interp-cs-common.hh | 1 + + test/api/test-ot-extents-cff | Bin 0 -> + 8574336 bytes + .../test-ot-extents-cff.dSYM/Contents/Info.plist | 20 + ++++++++++++++++++++ + .../Contents/Resources/DWARF/test-ot-extents-cff | Bin 0 -> + 7650053 bytes + 4 files changed, 21 insertions(+) + +commit 9b4e51b2e44d7dea026b1f9201d2f83277bab1cf +Author: Behdad Esfahbod +Date: Fri Jan 18 12:23:02 2019 -0500 + + [pragma] Enable error -Wdelete-non-virtual-dtor + + Currently fails directwrite backend. + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit e65272281c71d416f0ff886a55536597665b9dc3 +Author: Behdad Esfahbod +Date: Fri Jan 18 12:22:07 2019 -0500 + + [directwrite] Fix error + + hb-directwrite.cc: In constructor 'TextAnalysis::TextAnalysis(const + wchar_t*, uint32_t, const wchar_t*, DWRITE_READING_DIRECTION)': + hb-directwrite.cc:489:18: error: 'TextAnalysis::mText' will be + initialized after [-Werror=reorder] + const wchar_t* mText; + ^~~~~ + hb-directwrite.cc:488:12: error: 'uint32_t + TextAnalysis::mTextLength' [-Werror=reorder] + uint32_t mTextLength; + ^~~~~~~~~~~ + hb-directwrite.cc:282:3: error: when initialized here + [-Werror=reorder] + TextAnalysis (const wchar_t* text, uint32_t textLength, + ^~~~~~~~~~~~ + hb-directwrite.cc: In function 'hb_bool_t + _hb_directwrite_shape_full(hb_shape_plan_t*, hb_font_t*, hb_buffer_t*, + const hb_feature_t*, unsigned int, float)': + + src/hb-directwrite.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b900f78088abb87ebec263474b2802593afa0264 +Author: Behdad Esfahbod +Date: Fri Jan 18 10:08:23 2019 -0500 + + [pragma] More cast-align whitelist + + src/hb-font.cc | 20 +++++++++++++++----- + src/hb-ft.cc | 6 ++++++ + src/hb-ot-cmap-table.hh | 3 +++ + src/hb-ot-font.cc | 6 ++++++ + 4 files changed, 30 insertions(+), 5 deletions(-) + +commit 0d8b931bbeee9743d2e3bd37dd2fa9dffb807eaa +Author: Behdad Esfahbod +Date: Fri Jan 18 10:03:43 2019 -0500 + + [pragma] Allow cast-align in hb-font.cc + + ../src/hb-machinery.hh: In instantiation of 'const Type& + StructAtOffset(const void*, unsigned int) [with Type = unsigned int]': + ../src/hb-font.cc:144:85: required from here + ../src/hb-machinery.hh:63:12: error: cast from 'const char*' to + 'const unsigned int*' increases required alignment of target type + [-Werror=cast-align] + { return * reinterpret_cast ((const char *) P + + offset); } + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ../src/hb-machinery.hh: In instantiation of 'Type& + StructAtOffset(void*, unsigned int) [with Type = unsigned int]': + ../src/hb-font.cc:145:79: required from here + ../src/hb-machinery.hh:66:12: error: cast from 'char*' to 'unsigned + int*' increases required alignment of target type [-Werror=cast-align] + { return * reinterpret_cast ((char *) P + offset); } + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ../src/hb-machinery.hh: In instantiation of 'Type& + StructAtOffset(void*, unsigned int) [with Type = int]': + + src/hb-font.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit a25174a56b8fc334a050aa63be3654f53a7d8893 +Author: Behdad Esfahbod +Date: Fri Jan 18 09:59:36 2019 -0500 + + [pragma] GCC diagnostic error "-Wreorder" + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 4660090569efbf64d3acc99ef6fa33e01abc9701 +Author: Behdad Esfahbod +Date: Fri Jan 18 09:53:16 2019 -0500 + + [pragma] GCC diagnostic warning "-Wmaybe-uninitialized" + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 7a634d7d5b859eb1121acd0b17c727c541a7f540 +Author: Behdad Esfahbod +Date: Fri Jan 18 09:49:14 2019 -0500 + + [pragma] Massage more + + src/hb.hh | 106 + ++++++++++++++++++++++++++++++++------------------------------ + 1 file changed, 55 insertions(+), 51 deletions(-) + +commit 16e5ba85b1822ff9d2b2f85f45ddd44f1a05f4b1 +Author: Behdad Esfahbod +Date: Fri Jan 18 09:46:17 2019 -0500 + + [pragma] More + + src/hb.hh | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit 2bd530d59883cce437a5093323625f94b9618d89 +Author: Behdad Esfahbod +Date: Fri Jan 18 09:28:22 2019 -0500 + + [pragma] Reorg again + + https://github.com/harfbuzz/harfbuzz/issues/1546 + + src/hb.hh | 91 + ++++++++++++++++++++++++++++++++------------------------------- + 1 file changed, 46 insertions(+), 45 deletions(-) + +commit c04272fac81cac48b6310182d58d54569117f298 +Author: Behdad Esfahbod +Date: Fri Jan 18 08:49:45 2019 -0500 + + [pragma] GCC diagnostic ignored "-Wunknown-warning-option" + + Try at fixing https://github.com/harfbuzz/harfbuzz/issues/1546 + + src/hb.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4d3c8f9685b1744077ab264ffc0e0457d63c4b9a +Author: Behdad Esfahbod +Date: Thu Jan 17 19:58:54 2019 -0500 + + [uniscribe] More warnings + + src/hb-uniscribe.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6a5d2b21d8457001a59537e85596461feba3dbd5 +Author: Behdad Esfahbod +Date: Thu Jan 17 19:57:17 2019 -0500 + + [uniscribe] Fix warnings + + src/hb-uniscribe.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5b13e458c34d16fef6540a9389225e0597a99df5 +Author: Behdad Esfahbod +Date: Thu Jan 17 19:52:32 2019 -0500 + + Fix build + + src/hb-directwrite.cc | 1 - + 1 file changed, 1 deletion(-) + +commit a77bd6bb8960ecff35aac07f221653c65d08e58e +Author: Behdad Esfahbod +Date: Thu Jan 17 19:33:41 2019 -0500 + + [pragma] GCC diagnostic ignored "-Wclass-memaccess" + + src/hb.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e1302842d9c589ccbed90d29c953fea503d3901f +Author: Behdad Esfahbod +Date: Thu Jan 17 19:12:07 2019 -0500 + + [ci] Remove unnecessary warning declarations + + clang -Weverything still left to be ported to pragmas + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 436c7b294ab12ae338aaa879fe4280caae6c6155 +Author: Behdad Esfahbod +Date: Thu Jan 17 19:03:33 2019 -0500 + + [pragma] ignored -Wunsafe-loop-optimizations // TODO fix + + src/hb.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e3b3181e9ddd8b76428d7eaca64a3e03a99fcdd5 +Author: Behdad Esfahbod +Date: Thu Jan 17 19:02:06 2019 -0500 + + [pragma] error -Wclass-memaccess + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 1a6b97a491f2ba4f84e52c89517b7a02faa70cc3 +Author: Behdad Esfahbod +Date: Thu Jan 17 18:55:03 2019 -0500 + + [pragma] More + + src/hb.hh | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 06e8091661352873c4d6040fd06a940136497e6f +Author: Behdad Esfahbod +Date: Thu Jan 17 18:47:32 2019 -0500 + + [pragma] More + + src/hb.hh | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +commit 1077e40bf12f998976df4bf509c69df9f9e2a590 +Author: Behdad Esfahbod +Date: Thu Jan 17 18:36:10 2019 -0500 + + [pragma] Flesh out more + + src/hb.hh | 22 +++++++++++++++++----- + 1 file changed, 17 insertions(+), 5 deletions(-) + +commit 7e6bd510fc695c423a7fa6b25c15805482f7d185 +Author: Behdad Esfahbod +Date: Thu Jan 17 18:24:18 2019 -0500 + + Use NNOffsetTo<> in rest of places + + src/hb-aat-layout-common.hh | 8 ++++---- + src/hb-aat-layout-kerx-table.hh | 22 +++++++++++----------- + src/hb-aat-layout-morx-table.hh | 10 +++++----- + 3 files changed, 20 insertions(+), 20 deletions(-) + +commit b1152d5e66d7463a30af8ca2a485f75e0c8e6ffd +Author: Behdad Esfahbod +Date: Thu Jan 17 18:17:04 2019 -0500 + + Use NNOffsetTo<> + + src/hb-aat-layout-ankr-table.hh | 6 +++--- + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-aat-ltag-table.hh | 2 +- + src/hb-open-file.hh | 10 +++++----- + src/hb-ot-cff2-table.hh | 6 +++--- + src/hb-ot-color-cbdt-table.hh | 2 +- + src/hb-ot-color-colr-table.hh | 4 ++-- + src/hb-ot-color-cpal-table.hh | 8 ++++---- + src/hb-ot-color-svg-table.hh | 2 +- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-stat-table.hh | 4 ++-- + 11 files changed, 24 insertions(+), 24 deletions(-) + +commit 205d72a198805ba276c1d0e63b1ca313c7bd517f +Author: Behdad Esfahbod +Date: Thu Jan 17 18:10:38 2019 -0500 + + Add NNOffsetTo<> + + src/hb-open-type.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit c99d13d860e3d34e16cd2c070070d4f5d7d58cf4 +Author: Behdad Esfahbod +Date: Thu Jan 17 17:56:27 2019 -0500 + + [AAT] Comment + + src/hb-aat-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f39b5603ffa0452528b2366f8641e7e770960847 +Author: Behdad Esfahbod +Date: Thu Jan 17 17:49:55 2019 -0500 + + Comment + + src/hb-ot-layout-gpos-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 347ad454b88b89fc4bc30fca86c9ca37bea0be5b +Author: Behdad Esfahbod +Date: Thu Jan 17 17:47:29 2019 -0500 + + [AAT] Remove unused code + + src/hb-aat-layout-ankr-table.hh | 3 +-- + src/hb-aat-layout-common.hh | 3 +-- + src/hb-aat-layout-kerx-table.hh | 6 ++---- + src/hb-aat-layout.cc | 14 +++----------- + 4 files changed, 7 insertions(+), 19 deletions(-) + +commit b344d4385af5bc9adac2a24850cb963929d4ae9e +Author: Behdad Esfahbod +Date: Thu Jan 17 17:44:39 2019 -0500 + + [AAT] Allow null in ankr lookupTable offset + + src/hb-aat-layout-ankr-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14a560a245109376b7314c949895968d0a54452c +Author: Behdad Esfahbod +Date: Thu Jan 17 17:42:44 2019 -0500 + + [pragma GCC] Ignore -Wtype-limits + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 41b4312e936a0dfc396e6f0ef13c2c691dac6e40 +Author: Behdad Esfahbod +Date: Thu Jan 17 16:07:27 2019 -0500 + + [ci] Remove -Werror from Travis + + hb-machinery.hh:111:37: warning: comparison of unsigned expression >= + 0 is always true [-Wtype-limits] + + Also ignore -Wtype-limits. + + .travis.yml | 2 -- + 1 file changed, 2 deletions(-) + +commit 3f2daae63073bd536bceb1ae71dffd3187afce11 +Author: Behdad Esfahbod +Date: Thu Jan 17 15:27:31 2019 -0500 + + More GCC pragmas + + src/hb.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit d6c5473e1f86cae7f1060abe18f73ccb8e536d6c +Author: Behdad Esfahbod +Date: Thu Jan 17 15:22:46 2019 -0500 + + Rename macro + + src/hb.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a9946b7cfef185d53304e804169d6e53e9d522a0 +Author: Behdad Esfahbod +Date: Thu Jan 17 15:22:28 2019 -0500 + + Add more GCC warning pragmas + + src/hb.hh | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit 868b0c0c2e2f1a2dea9b0d3c8eb6e56ded8b1a14 +Author: Behdad Esfahbod +Date: Thu Jan 17 15:08:36 2019 -0500 + + Move -Wcast-align to hb.hh + + configure.ac | 3 --- + src/hb.hh | 4 ++++ + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 8874eef8ff70de6416266d719fa74eec39e5d8f9 +Author: Behdad Esfahbod +Date: Thu Jan 17 15:04:44 2019 -0500 + + Add pragram GCC diagnostic ignored "-Wunused-macros" + + src/gen-indic-table.py | 3 +++ + src/gen-use-table.py | 3 +++ + src/hb-blob.cc | 3 +++ + src/hb-ot-shape-complex-indic-table.cc | 3 +++ + src/hb-ot-shape-complex-use-table.cc | 3 +++ + 5 files changed, 15 insertions(+) + +commit cc8e9a436fa408a1c63f4b9afb7643cea76a079c +Author: Behdad Esfahbod +Date: Thu Jan 17 14:54:32 2019 -0500 + + [AAT] Fully sanitize ankr table at sanitize time + + Third try to fix access. Followup + 6879efc2c1596d11a6a6ad296f80063b558d5e0f + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12532 + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=922303 + + src/hb-aat-layout-ankr-table.hh | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +commit 6879efc2c1596d11a6a6ad296f80063b558d5e0f +Author: Behdad Esfahbod +Date: Thu Jan 17 14:06:37 2019 -0500 + + [AAT] Fix anchor bound checking, again + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12532 + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=922303 + + src/hb-aat-layout-ankr-table.hh | 3 ++- + ...zz-testcase-minimized-harfbuzz_fuzzer-5166320261529600 | Bin 0 -> + 393 bytes + ...zz-testcase-minimized-hb-shape-fuzzer-5667182741028864 | Bin 0 -> + 407 bytes + 3 files changed, 2 insertions(+), 1 deletion(-) + +commit a262eb3d0b7009aabd9e0beebc77e5c0a2a65548 +Author: Behdad Esfahbod +Date: Thu Jan 17 14:06:32 2019 -0500 + + [aat] Minor + + src/hb-aat-layout-kerx-table.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit c986ca15a6320d78471adf950394f391e8729b15 +Author: Behdad Esfahbod +Date: Tue Jan 15 13:58:19 2019 -0500 + + Improve overflow avoidance + + Better fix for 480406cd3ef9e5ab8476ddfa04498bf23906c508 + This way we behave the same on 32bit and 64bit archs. + + src/hb-machinery.hh | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 0d2727f4fe734af146785df10a44e3505e410ba1 +Author: Behdad Esfahbod +Date: Mon Jan 14 18:23:17 2019 -0800 + + fix FDSelect fuzzing bug (#1539) + + Rewrote struct FDSelect3_4.ranges as ArrayOf + Updated FDSelect3_4::sanitize () to call ranges.sanitize () + nRanges now a function to return a reference to ranges.len + + src/hb-ot-cff-common.hh | 29 +++++++++++++++-------------- + src/hb-subset-cff-common.cc | 2 +- + 2 files changed, 16 insertions(+), 15 deletions(-) + +commit 9f6172d669d53abbf3bf2a3546429cb5036e3d5f +Author: Behdad Esfahbod +Date: Mon Jan 14 20:45:31 2019 -0500 + + Move _POSIX_SOURCE definition + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1308 + + src/hb-blob.cc | 9 +++++++++ + src/hb.hh | 4 ---- + 2 files changed, 9 insertions(+), 4 deletions(-) + +commit 91d774712fa76dd26c441526712bddddca5b4bdd +Author: Behdad Esfahbod +Date: Mon Jan 14 15:31:31 2019 -0500 + + [test] Add test for previous commit + + ...uzz-testcase-minimized-harfbuzz_fuzzer-5662548265009152 | Bin 0 -> + 28 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 480406cd3ef9e5ab8476ddfa04498bf23906c508 +Author: Behdad Esfahbod +Date: Mon Jan 14 15:27:34 2019 -0500 + + Fix assertion on address overflow + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=917031 + + src/hb-machinery.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 7a6686a589ed6bf17a5af0b8012501e4d4ee2ded +Author: Behdad Esfahbod +Date: Mon Jan 14 15:09:14 2019 -0500 + + [AAT] Fix mort ContextualSubtable offset access + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=12312 + + src/hb-aat-layout-morx-table.hh | 3 ++- + ...zz-testcase-minimized-hb-shape-fuzzer-5631444412530688 | Bin 0 -> + 336 bytes + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit a3fa7d33360a58df5333dbbd121328e580f08849 +Author: Behdad Esfahbod +Date: Mon Jan 14 14:37:36 2019 -0500 + + [AAT] Fix ankr table access + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=918340 + + src/hb-aat-layout-ankr-table.hh | 7 ++++--- + ...z-testcase-minimized-harfbuzz_fuzzer-5126525414014976 | Bin 0 -> + 1141 bytes + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 760303d411b1561533f8f08c7c15db331c71ece8 +Author: Michiharu Ariza +Date: Fri Jan 11 15:27:35 2019 -0800 + + deleted a duplicate fontdicts_mod.fini() call (#1538) + + src/hb-subset-cff1.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 5110f3da9a4711a35bfb780ea06cda677cc00209 +Author: Ebrahim Byagowi +Date: Wed Jan 9 16:01:11 2019 +0330 + + Add an initial .clang-format config + + There are things can be improved on clang-format side I guess before + the full assertion, but is the best we can get for now I guess. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1536 + + .clang-format | 38 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +commit 099bca6d406af9c8e12a66b93fcc9a38ff7914f9 +Author: Ebrahim Byagowi +Date: Wed Jan 9 15:56:32 2019 +0330 + + Minor, hack .editorconfig for vscode use + + As VSCode and Atom https://github.com/Microsoft/vscode/issues/44438 + don't support it + + .editorconfig | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 7b48641aa8551115d21c534940ac4fb364e5ab92 +Author: Michiharu Ariza +Date: Tue Jan 8 12:37:48 2019 -0800 + + fix leak in subset_enc_supp_codes (#1537) + + oss-fuzz issue 12310 + + src/hb-subset-cff1.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 97f67a3c3d499959d33e66aeed449e2957a14bc6 +Author: Ebrahim Byagowi +Date: Fri Jan 4 23:10:39 2019 +0330 + + [ci] Enable more of GCC compile warnings (#1533) + + .circleci/config.yml | 16 ++++++++-------- + src/hb-gobject-structs.cc | 4 ++-- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit ad954870383a880262edcd01acd8e171c4614a68 +Author: Nathan Willis +Date: Mon Dec 3 12:49:44 2018 -0600 + + Usermanual: small formatting and wording fixes. + + docs/usermanual-getting-started.xml | 3 +++ + docs/usermanual-install-harfbuzz.xml | 30 ++++++++++++++---------------- + docs/usermanual-what-is-harfbuzz.xml | 11 ++++++----- + 3 files changed, 23 insertions(+), 21 deletions(-) + +commit ed13caddf2de68312608e12c37d0e6287c1ac0a0 +Author: Nathan Willis +Date: Wed Nov 28 13:48:38 2018 -0600 + + Usermanual: small updates. + + ...anual-buffers-language-script-and-direction.xml | 7 +- + docs/usermanual-clusters.xml | 279 + ++++++++++++++++----- + docs/usermanual-getting-started.xml | 91 ++++++- + docs/usermanual-install-harfbuzz.xml | 3 +- + docs/usermanual-shaping-concepts.xml | 11 +- + 5 files changed, 314 insertions(+), 77 deletions(-) + +commit 26c5b54fb09fb45e02c9c4618bcea4958c698953 +Author: cclauss +Date: Mon Dec 31 04:30:43 2018 +0100 + + CircleCI: Test for Python 3 syntax errors and undefined names (#1522) + + Catch missing imports and errors like #1520 and #1521 + + __E901,E999,F821,F822,F823__ are the "_showstopper_" + [flake8](http://flake8.pycqa.org) issues that can halt the runtime + with a SyntaxError, NameError, etc. Most other flake8 issues are + merely "style violations" -- useful for readability but they do not + effect runtime safety. + * F821: undefined name `name` + * F822: undefined name `name` in `__all__` + * F823: local variable name referenced before assignment + * E901: SyntaxError or IndentationError + * E999: SyntaxError -- failed to compile a file into an Abstract + Syntax Tree + + .circleci/config.yml | 3 ++- + src/gen-use-table.py | 4 +++- + test/subset/subset_test_suite.py | 2 +- + 3 files changed, 6 insertions(+), 3 deletions(-) + +commit 686e6f2e40da378e031b4c9871a471599c6d61cf +Author: Behdad Esfahbod +Date: Sun Dec 30 11:27:42 2018 -0500 + + Fix automake warnings + + [skip ci] + + test/api/Makefile.am | 1 - + test/subset/data/Makefile.am | 2 +- + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit b5c12b9f4d2c32a5013c340f7e40649cb5f2b41a +Author: cclauss +Date: Sun Dec 30 13:07:28 2018 +0100 + + print() is a function in Python 3 (#1520) + + test/subset/generate-expected-outputs.py | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit f4da28b1f153ccf293b367363a1a4d83c056e4e1 +Author: cclauss +Date: Sun Dec 30 12:58:34 2018 +0100 + + Python 3 fixes to gen-os2-unicode-ranges.py (#1521) + + In Python 3, __reload()__ was moved and __sys.setdefaultencoding()__ + because the default is already utf-8. Also __Error()__ is an + _undefined name_ and __Exception()__ creates a generic exception. + + src/gen-os2-unicode-ranges.py | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit e5989e0962309b27b2486d8fd20f3cbc05c3d79a +Author: Ebrahim Byagowi +Date: Sun Dec 30 10:23:47 2018 +0330 + + [cmake] Enable C++11 on CMake (#1519) + + CMakeLists.txt | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit d092fb27198f24423e51ce07375ebd6d486f64d3 +Author: Behdad Esfahbod +Date: Sun Dec 30 01:53:03 2018 -0500 + + Ouch! Fix build on C++<11 + + src/hb.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 89949ed28db96edabeb09433fcc09f28168163d2 +Author: Behdad Esfahbod +Date: Sun Dec 30 01:52:19 2018 -0500 + + Fix ubsan with passing nullptr to qsort() + + src/hb-array.hh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 357a0a7ad344caf898eb1697fcdb859d118b7a13 +Author: Behdad Esfahbod +Date: Thu Dec 27 18:29:23 2018 -0500 + + Fix build on C++ < 11 + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 54c0a1731069a17ae4f3b79b419af75709f03f5b +Author: Behdad Esfahbod +Date: Thu Dec 27 18:27:36 2018 -0500 + + [vector] Fix warning + + src/hb-vector.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1043ddbee878a14df0ad8d83fbaa893370ef5a75 +Author: Behdad Esfahbod +Date: Thu Dec 27 18:27:11 2018 -0500 + + [aat] Minor + + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-aat-map.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 71da9ca62fa87bd3e0fa9d40924bb4c220313a03 +Author: Behdad Esfahbod +Date: Thu Dec 27 18:01:06 2018 -0500 + + [vector] Remove use of arrayZ() by using casts + + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-name.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit fa333e34d6230210bc73a88b0ba6df2102dcda51 +Author: Behdad Esfahbod +Date: Thu Dec 27 17:56:22 2018 -0500 + + [vector] Remove static_array + + Was good idea, but with C++ types with constructor/destructor, + was getting in + the way as compiler was destructing those items where it was not + desired. + Since C++ does not allow zero-sized arrays, just remove it... + + src/hb-aat-map.hh | 4 ++-- + src/hb-cff-interp-common.hh | 2 +- + src/hb-face.cc | 2 +- + src/hb-object.hh | 2 +- + src/hb-ot-cff-common.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-map.hh | 10 +++++----- + src/hb-ot-post-table.hh | 2 +- + src/hb-set.hh | 4 ++-- + src/hb-vector.hh | 34 +++++++++++----------------------- + src/hb.hh | 3 +++ + 11 files changed, 29 insertions(+), 38 deletions(-) + +commit ab2258a419abbace9ff27916143b46f88e8ccef3 +Author: Behdad Esfahbod +Date: Thu Dec 27 17:45:05 2018 -0500 + + [vector] Use allocated = -1 to signify failure + + src/hb-vector.hh | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 09fa536d89d969998fe6bbe274a9964c73d1d982 +Author: Michiharu Ariza +Date: Thu Dec 27 08:33:09 2018 -0800 + + fix lealk with cff2::accelerator_templ_t::topDict (#1517) + + src/hb-ot-cff2-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 3b81442cd5c11099ae9245074d24ef679b4473fa +Author: Behdad Esfahbod +Date: Mon Dec 24 11:31:04 2018 -0500 + + [vector] Change pre-alloced count from 8 to 2 + + I'm thinking about dropping it to zero, but that needs slight code + changes. + + src/hb-vector.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d25a2f1496d13846ddaea123ac6fb9807dc5669a +Author: Behdad Esfahbod +Date: Sun Dec 23 20:19:52 2018 -0500 + + Fix a few warnings + + src/hb-aat-layout-common.hh | 12 ++++++------ + src/hb-iter.hh | 8 ++++---- + src/hb-null.hh | 2 +- + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 2 +- + src/hb-subset-cff-common.hh | 3 ++- + src/hb.hh | 3 ++- + 7 files changed, 17 insertions(+), 15 deletions(-) + +commit 85003b594b3aa1f6638e274bc89f18999a5de9f5 +Author: Behdad Esfahbod +Date: Sat Dec 22 16:19:10 2018 -0500 + + [iter] Fix warning + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4355b1ca177200db6769136ead1ee25da86ec85 +Author: Behdad Esfahbod +Date: Sat Dec 22 16:11:22 2018 -0500 + + [set] Add iter_t as alias to const_iter_t + + src/hb-set.hh | 6 ++++-- + src/test-iter.cc | 2 ++ + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 33f8de61863efa538c488121c476fd0e907020d0 +Author: Behdad Esfahbod +Date: Sat Dec 22 15:10:18 2018 -0500 + + [set] Change to const_iter + + src/hb-set.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f88fed5cd8787e3deeec05dac4353337dc02abdd +Author: Behdad Esfahbod +Date: Sat Dec 22 11:11:10 2018 -0500 + + [set] Cache length in iterator + + src/hb-set.hh | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit d0a706c7fdb72a1d224b4a5bdbad0fb8c90e3186 +Author: Ebrahim Byagowi +Date: Sat Dec 22 19:47:48 2018 +0330 + + Minor, remove redundant inline + + src/hb-ot-layout.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ae6e348d642194585543f0d548fb94d210575fe4 +Author: Ebrahim Byagowi +Date: Sat Dec 22 19:47:29 2018 +0330 + + Minor, tweak spaces + + src/hb-ot-glyf-table.hh | 8 ++++---- + src/hb-subset-cff-common.hh | 15 ++++++--------- + 2 files changed, 10 insertions(+), 13 deletions(-) + +commit 29f0b6bce7da4c599f54066f7e7f6000f10d2f29 +Author: Michiharu Ariza +Date: Sat Dec 22 07:47:04 2018 -0800 + + CFF renaming (#1507) + + * reimplement ByteStr as byte_str_t based on hb_ubytes_t + + Unuse start_embed + Also renamed SubByteStr to byte_str_ref_t + More renaming to come + + * substr renamed to str_ref in line with its type byte_str_ref_t + + * uncamelize non-table struct names + + * uncamelized non-struct types OpCode etc + + * add byte_str_t copy ctor + + * test + + * test2 + + * undo tests + + * fix bot failure + + * undo the previous change + + * fixed tabs, added inline + + * Revert "fixed tabs, added inline" + + This reverts commit 21163c30e9d18759414f7fe2518628241599f039. + + * fix tabs + + src/hb-cff-interp-common.hh | 215 +++++++++++++++------------------ + src/hb-cff-interp-cs-common.hh | 250 + +++++++++++++++++++-------------------- + src/hb-cff-interp-dict-common.hh | 64 +++++----- + src/hb-cff1-interp-cs.hh | 26 ++-- + src/hb-cff2-interp-cs.hh | 56 ++++----- + src/hb-ot-cff-common.hh | 59 ++++----- + src/hb-ot-cff1-table.cc | 56 ++++----- + src/hb-ot-cff1-table.hh | 147 ++++++++++++----------- + src/hb-ot-cff2-table.cc | 28 ++--- + src/hb-ot-cff2-table.hh | 128 ++++++++++---------- + src/hb-subset-cff-common.cc | 10 +- + src/hb-subset-cff-common.hh | 232 + ++++++++++++++++++------------------ + src/hb-subset-cff1.cc | 244 + +++++++++++++++++++------------------- + src/hb-subset-cff2.cc | 100 ++++++++-------- + 14 files changed, 796 insertions(+), 819 deletions(-) + +commit 89d04129e2f4dedb865635dcb8f0fd020e4218c2 +Author: Behdad Esfahbod +Date: Fri Dec 21 20:07:52 2018 -0500 + + [set] Actually derive iterator from hb_sorted_iter_t<> + + src/hb-set.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fc35919d015c5b8d231933d6bc6ea640c83af6b2 +Author: Behdad Esfahbod +Date: Fri Dec 21 20:06:17 2018 -0500 + + [set] Implement unified iterator + + src/hb-set.hh | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 4911e67d2d2188ee9bdc0315e121e51d9967b567 +Author: Behdad Esfahbod +Date: Fri Dec 21 20:00:52 2018 -0500 + + [set] Mark some internals protected + + src/hb-set.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 954b985422a8964f6e7da9f71ab7a68074017111 +Author: Behdad Esfahbod +Date: Fri Dec 21 19:55:02 2018 -0500 + + [iter] Add hb_sorted_iter_t<> + + src/hb-array.hh | 2 +- + src/hb-iter.hh | 11 +++++++++++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +commit b205105c9e1c6295b17cfd88ffb8ca7d963ef173 +Author: Behdad Esfahbod +Date: Fri Dec 21 19:48:21 2018 -0500 + + [iter] Change operator[] operand to be signed + + To fix older compilers again (this was the case in hb_array_t). + + hb-ot-layout-common.hh:1353: note: candidate 2: operator[](T*, + int) + hb-ot-layout-common.hh:1354: error: ISO C++ says that these are + ambiguous, even though the worst conversion for the first is better + than the worst conversion for the second: + hb-iter.hh:63: note: candidate 1: Item& hb_iter_t::operator[](unsigned int) const [with Iter = hb_array_t >, Item = const OT::IntType] + hb-ot-layout-common.hh:1354: note: candidate 2: operator[](T*, + int) + hb-ot-layout-common.hh: In member function 'bool + OT::ClassDef::serialize(hb_serialize_context_t*, hb_array_t >, hb_array_t >)': + hb-ot-layout-common.hh:1490: error: ISO C++ says that these are + ambiguous, even though the worst conversion for the first is better + than the worst conversion for the second: + hb-iter.hh:63: note: candidate 1: Item& hb_iter_t::operator[](unsigned int) const [with Iter = hb_array_t >, Item = const OT::IntType] + hb-ot-layout-common.hh:1490: note: candidate 2: operator[](T*, + int) + + src/hb-iter.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 25786f49c1df36fdb5f78681055a1f4aa4b17f86 +Author: Behdad Esfahbod +Date: Fri Dec 21 19:29:00 2018 -0500 + + [array] Port to hb_iter_t<> + + hb_array_t is its own iterator... + + src/hb-array.hh | 75 + +++++++++++++++++++++++++-------------------------------- + src/hb-iter.hh | 5 ++-- + 2 files changed, 36 insertions(+), 44 deletions(-) + +commit 2a33ab0560a13cb8fef5983bfe0f6d68dfd47b14 +Author: Behdad Esfahbod +Date: Fri Dec 21 18:49:27 2018 -0500 + + [iter] Change __more__ to fallback to __len__ + + src/hb-iter.hh | 15 ++++++--------- + src/test-iter.cc | 1 - + 2 files changed, 6 insertions(+), 10 deletions(-) + +commit 474a12058d681f2d7cef84db0cf20f9f784fa400 +Author: Behdad Esfahbod +Date: Fri Dec 21 18:46:51 2018 -0500 + + [array/vector] Rename len to length + + src/hb-aat-layout-feat-table.hh | 5 ++- + src/hb-aat-layout-lcar-table.hh | 2 +- + src/hb-aat-map.cc | 4 +-- + src/hb-array.hh | 72 + ++++++++++++++++++++--------------------- + src/hb-cff-interp-common.hh | 10 +++--- + src/hb-cff2-interp-cs.hh | 6 ++-- + src/hb-coretext.cc | 12 +++---- + src/hb-face.cc | 4 +-- + src/hb-object.hh | 23 +++++++------ + src/hb-open-file.hh | 4 +-- + src/hb-open-type.hh | 8 ++--- + src/hb-ot-cff-common.hh | 38 +++++++++++----------- + src/hb-ot-cff1-table.hh | 28 ++++++++-------- + src/hb-ot-cmap-table.hh | 24 +++++++------- + src/hb-ot-color-colr-table.hh | 6 ++-- + src/hb-ot-hdmx-table.hh | 6 ++-- + src/hb-ot-hmtx-table.hh | 8 ++--- + src/hb-ot-layout-common.hh | 32 +++++++++--------- + src/hb-ot-layout-gdef-table.hh | 4 +-- + src/hb-ot-layout-gsub-table.hh | 24 +++++++------- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-layout.cc | 2 +- + src/hb-ot-map.cc | 22 ++++++------- + src/hb-ot-map.hh | 4 +-- + src/hb-ot-math-table.hh | 4 +-- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-name-table.hh | 8 ++--- + src/hb-ot-name.cc | 4 +-- + src/hb-ot-post-table.hh | 8 ++--- + src/hb-ot-var-fvar-table.hh | 2 +- + src/hb-ot-vorg-table.hh | 10 +++--- + src/hb-set.hh | 36 ++++++++++----------- + src/hb-subset-cff-common.cc | 8 ++--- + src/hb-subset-cff-common.hh | 50 ++++++++++++++-------------- + src/hb-subset-cff1.cc | 48 +++++++++++++-------------- + src/hb-subset-cff2.cc | 16 ++++----- + src/hb-subset-glyf.cc | 14 ++++---- + src/hb-subset-plan.cc | 2 +- + src/hb-uniscribe.cc | 26 +++++++-------- + src/hb-vector.hh | 56 ++++++++++++++++---------------- + src/test-iter.cc | 4 +-- + 41 files changed, 325 insertions(+), 323 deletions(-) + +commit 2fc1860a5b40f5deba720c0c1099fdd0450b77c0 +Author: Behdad Esfahbod +Date: Fri Dec 21 18:09:45 2018 -0500 + + [iter] Split hb_iter_t<> into hb_iter_t<> and hb_iter_mixin_t<> + + src/hb-iter.hh | 31 ++++++++++++++++++++----------- + src/test-iter.cc | 2 +- + 2 files changed, 21 insertions(+), 12 deletions(-) + +commit 865deeb3be1cb40efe3d7c42db48b0cdf977de47 +Author: Behdad Esfahbod +Date: Fri Dec 21 17:35:58 2018 -0500 + + Adjust internal header dependencies + + src/hb-array.hh | 5 ++++- + src/hb-dsalgs.hh | 1 - + src/hb-iter.hh | 1 + + src/hb-vector.hh | 1 + + src/hb.hh | 15 +++++++++------ + src/test-iter.cc | 1 + + src/test-unicode-ranges.cc | 1 + + 7 files changed, 17 insertions(+), 8 deletions(-) + +commit 8e5c2bc60bd9a800dacc96cc29c6ff831a852ae3 +Author: Behdad Esfahbod +Date: Fri Dec 21 17:29:11 2018 -0500 + + [Makefile.am] Minor + + src/Makefile.am | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +commit f419cef4174c5447bf5031e771483f3274ae4dce +Author: Behdad Esfahbod +Date: Fri Dec 21 17:22:09 2018 -0500 + + [iter] Include from hb.hh + + src/hb.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 7557e34872c846433c2465b21b99bf7c5f961673 +Author: Behdad Esfahbod +Date: Fri Dec 21 17:21:19 2018 -0500 + + [iter] Move hb_fill() and hb_copy() to hb-iter.hh + + src/hb-iter.hh | 18 ++++++++++++++++++ + src/test-iter.cc | 16 ---------------- + 2 files changed, 18 insertions(+), 16 deletions(-) + +commit 5e1840e031cff1127842fc5cc8ee93e5959f02d5 +Author: Behdad Esfahbod +Date: Fri Dec 21 16:39:57 2018 -0500 + + [iter] Disallow copy-construction or assignment of hb_iter_t<> + + Should only be done by subclass. + + src/hb-iter.hh | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 65e8bd56ad26912636fbdc400a83cc48db2a13ce +Author: Behdad Esfahbod +Date: Fri Dec 21 16:20:30 2018 -0500 + + [iter] Fix hb_copy() return value + + src/test-iter.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 40d71211a8969ec4414d2476a209e60d0a3525d3 +Author: Behdad Esfahbod +Date: Fri Dec 21 16:19:44 2018 -0500 + + [iter] Add const_iter_t / const_iter() + + src/hb-iter.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit aaddfaa57a841726a8b49653af3f8b702831da1b +Author: Behdad Esfahbod +Date: Fri Dec 21 16:04:38 2018 -0500 + + [iter] Make hb_fill() take collection type, not iter + + Starting to get the hang of when take which. + + src/test-iter.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 7b4eea853c36fd59db6e5d68bbef9b8cebad760e +Author: Behdad Esfahbod +Date: Fri Dec 21 16:02:16 2018 -0500 + + [array] Add more hb_array() / hb_sorted_array() variants + + src/hb-array.hh | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +commit 09740148e310021a4a690666c2e2836c2005353d +Author: Behdad Esfahbod +Date: Fri Dec 21 15:56:01 2018 -0500 + + [serialize] Use component_list by reference, as a supplier + + src/hb-ot-layout-gsub-table.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 3dbe1e364c19d82ab436b9ea7b41c9754d43e923 +Author: Behdad Esfahbod +Date: Fri Dec 21 15:53:09 2018 -0500 + + [iter] Add .random_access() + + src/hb-iter.hh | 4 ++++ + src/test-iter.cc | 1 + + 2 files changed, 5 insertions(+) + +commit 20f14b4aa6311d8fb2ed80c47bb15e8d87d2f6b3 +Author: Behdad Esfahbod +Date: Fri Dec 21 15:19:22 2018 -0500 + + [iter] Fix __end__() + + src/hb-iter.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 95265aeab7da54f31d4f68590af7730054b6be16 +Author: Behdad Esfahbod +Date: Fri Dec 21 15:12:55 2018 -0500 + + [array] Remove copy constructor + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1502 + + src/hb-array.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 69d232eaea323b8c42e5fa1788553ac4e8bf3a50 +Author: Behdad Esfahbod +Date: Fri Dec 21 15:08:06 2018 -0500 + + Fix bot + + C:\projects\harfbuzz\src\hb-uniscribe.cc(709): error C2666: + 'hb_vector_t::operator + +': 3 overloads have similar conversions + [C:\projects\harfbuzz\build\harfbuzz.vcxproj] + + src/hb-uniscribe.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b9a51f531009ce201b86a0326aff662fd19a68a1 +Author: Behdad Esfahbod +Date: Fri Dec 21 15:05:00 2018 -0500 + + Minor + + src/hb-ot-layout-gpos-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bdb6da72267c8fa4802a2183ba69a1535653378b +Author: Behdad Esfahbod +Date: Fri Dec 21 11:20:27 2018 -0500 + + [iter] Fix test again + + src/test-iter.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e9520752489298e0ce1a08da10ec3d439f9356d9 +Author: Behdad Esfahbod +Date: Fri Dec 21 11:15:16 2018 -0500 + + Minor + + src/Makefile.am | 6 +++--- + src/test-iter.cc | 1 - + 2 files changed, 3 insertions(+), 4 deletions(-) + +commit 35503d7d7324293162b605ffe0bd712656dd52b8 +Author: Behdad Esfahbod +Date: Fri Dec 21 03:03:46 2018 -0500 + + [iter] More prototyping + + src/test-iter.cc | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 73c7a896d1395539e3c9e71b073ce5094c835aa0 +Author: Behdad Esfahbod +Date: Fri Dec 21 02:48:28 2018 -0500 + + [iter] Make hb_fill() and hb_copy() take iterators + + I'm still going back and force... + + src/test-iter.cc | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit 12e506fda4bfd82d67e4beede29ae7dbc02ad8f4 +Author: Behdad Esfahbod +Date: Fri Dec 21 02:47:04 2018 -0500 + + [iter] Add hb_fill() + + src/test-iter.cc | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +commit ad3ed58de5297930826c67d18b99991b93d29654 +Author: Behdad Esfahbod +Date: Fri Dec 21 02:12:55 2018 -0500 + + [iter] Start prototyping hb_copy() + + src/test-iter.cc | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 44af738d19486095c0fbc2ef2b359a298126ac2b +Author: Behdad Esfahbod +Date: Fri Dec 21 01:59:37 2018 -0500 + + [iter] Showcase implicit casts + + src/test-iter.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 879faa2aee74e237594901426096ceeb78a716a4 +Author: Behdad Esfahbod +Date: Fri Dec 21 01:57:40 2018 -0500 + + Rename + + src/hb-array.hh | 2 +- + src/hb-open-type.hh | 4 ++-- + src/hb-vector.hh | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit aeb696a91cd1cdc73bf5b87e56163c7f64778616 +Author: Behdad Esfahbod +Date: Fri Dec 21 01:57:02 2018 -0500 + + [iter] Rename + + src/hb-iter.hh | 44 ++++++++++++++++++++++---------------------- + 1 file changed, 22 insertions(+), 22 deletions(-) + +commit 8001e00a470ad06f0307002b4cade5612ee7b521 +Author: Behdad Esfahbod +Date: Fri Dec 21 01:53:27 2018 -0500 + + [iter] First sample use + + src/Makefile.am | 5 ++++- + src/hb-iter.hh | 25 +++++++++++-------------- + src/test-iter.cc | 25 ++++++++++++++++++++----- + 3 files changed, 35 insertions(+), 20 deletions(-) + +commit 19d2b5013d8ac7aa45b3b8e8c61ad90773c86925 +Author: Behdad Esfahbod +Date: Fri Dec 21 01:17:35 2018 -0500 + + [iter] Add bidirectionality + + src/hb-iter.hh | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit 314d8698d0746416efd332f5fae45aecb26df7ee +Author: Behdad Esfahbod +Date: Fri Dec 21 00:54:55 2018 -0500 + + [iter] Sketch new iterator design + + src/hb-iter.hh | 154 + +++++++++++++++++++------------------------------------ + src/test-iter.cc | 16 ++++++ + 2 files changed, 69 insertions(+), 101 deletions(-) + +commit f6d5f1e91ced2b6b1114ad765f568f799dd3612f +Author: Behdad Esfahbod +Date: Fri Dec 21 00:23:34 2018 -0500 + + [iter] Add empty test + + src/Makefile.am | 7 +++++-- + src/hb-machinery.hh | 1 - + src/test-iter.cc | 33 +++++++++++++++++++++++++++++++++ + src/test-unicode-ranges.cc | 2 -- + 4 files changed, 38 insertions(+), 5 deletions(-) + +commit b80b97b549dacc10d314bf8b5fd4ace596ccdfe1 +Author: Behdad Esfahbod +Date: Fri Dec 21 00:08:05 2018 -0500 + + Revert "Remove unused hb-iter.hh" + + This reverts commit 969ff3c7aadbe721cdd414488eb170433f10d00c. + + src/Makefile.sources | 1 + + src/hb-iter.hh | 146 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-machinery.hh | 1 + + 3 files changed, 148 insertions(+) + +commit a728c63a98281fd4a0661e17fc01171bc3205b27 +Author: Behdad Esfahbod +Date: Thu Dec 20 23:15:49 2018 -0500 + + [vector] Add operator bool + + src/hb-vector.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit bd369773921b4891996bd21f325702e490f47ca4 +Author: Behdad Esfahbod +Date: Thu Dec 20 23:14:24 2018 -0500 + + Rename + + src/hb-array.hh | 2 +- + src/hb-open-type.hh | 4 ++-- + src/hb-vector.hh | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit e6ebc9b6f89e62d888b3bcf926afd624f16f3e95 +Author: Behdad Esfahbod +Date: Thu Dec 20 23:13:36 2018 -0500 + + Remove unused typedef + + src/hb-machinery.hh | 3 --- + 1 file changed, 3 deletions(-) + +commit 4941e95f10fe0fe658752134a42b58896fb19c42 +Author: Behdad Esfahbod +Date: Thu Dec 20 21:48:57 2018 -0500 + + 2.3.0 + + NEWS | 15 +++++++++++++++ + configure.ac | 2 +- + src/hb-aat-layout.cc | 6 +++--- + src/hb-version.h | 4 ++-- + 4 files changed, 21 insertions(+), 6 deletions(-) + +commit 87f7c83fffb7e64970be23c8e3c620d32a3b8f5b +Author: Behdad Esfahbod +Date: Thu Dec 20 15:54:17 2018 -0500 + + [serializer] Add operator << + + Not sure if we are going to use it. But might incentivize us to. + + src/hb-machinery.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5b70074edf1c12a9442037d54c03d3025bd93995 +Author: Behdad Esfahbod +Date: Thu Dec 20 15:38:59 2018 -0500 + + Add hb_assign(obj, value) + + src/hb-machinery.hh | 2 +- + src/hb-null.hh | 24 +++++++++++++++++++++++- + src/hb-open-type.hh | 5 +++-- + 3 files changed, 27 insertions(+), 4 deletions(-) + +commit 6124123393eabb77d34830c971ec463998d50aba +Author: Behdad Esfahbod +Date: Thu Dec 20 12:26:30 2018 -0500 + + [serialize] Adjust ClassDef + + [skip ci] + + src/hb-ot-layout-common.hh | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit 4220b7bdd7706622563401bf8f055c4b1482b4e5 +Author: Behdad Esfahbod +Date: Thu Dec 20 11:48:45 2018 -0500 + + Fix code on big-endian gcc / clang + + Ouch! We need a bigendian bot... + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1498 + + src/hb-machinery.hh | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit c87ee72232416099a73b563ca7aaf293b1c87b2a +Author: Behdad Esfahbod +Date: Wed Dec 19 22:28:16 2018 -0500 + + Minor [skip ci] + + src/hb-dsalgs.hh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 5000a59a6391d588c2cbdda132839b1fb1f75bf2 +Author: Behdad Esfahbod +Date: Wed Dec 19 21:07:53 2018 -0500 + + [saitnize] Minor + + src/hb-machinery.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 3ee4ea945674c4b96c9aa6b0367bbf22dc8745d1 +Author: fanc999 +Date: Thu Dec 20 11:26:54 2018 +0800 + + Fix build on older Visual Studio versions (#1499) + + * src/hb-cff-interp-dict-common.hh: Use ull for unsigned int64_t + + The llu suffix does not work for older Visual Studio versions + (pre-2013), but ull works for all the compilers that we attempt to + support. + + * test/api: Fix build on pre-C99 compilers + + Ensure variables are declared at the top of the block. + + * src/hb-dsalgs.hh: Add specialization for hb_is_signed<> for __int8 + + Pre-Visual Studio 2010 does not consider __int8 (which is typedef'ed + to + int8_t) to be equivilant to signed char, so the compiler cannot + find the + corresponding hb_is_signed<> specialization that is needed. + + The interesting thing is unsigned __int8 is considered to be + equivilant + to unsigned char, so as the other types (short, int, long) that + we look + for here, so only the specialization for __int8 is added here. + + This will fix builds on Visual Studio 2008 at least. + + src/hb-cff-interp-dict-common.hh | 2 +- + src/hb-dsalgs.hh | 9 +++++++++ + test/api/test-aat-layout.c | 3 ++- + test/api/test-subset-cff1.c | 12 ++++++++---- + 4 files changed, 20 insertions(+), 6 deletions(-) + +commit a62870506d16949582bf0b54e3dc8846b9747a4a +Author: Behdad Esfahbod +Date: Wed Dec 19 21:05:00 2018 -0500 + + [sanitize] Use hb_static_size instead of ::static_size + + https://github.com/harfbuzz/harfbuzz/issues/1496#issuecomment-448818112 + + src/hb-machinery.hh | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit 0c9cd5d5f4d96df77e4298e16c786e67b83f9bc4 +Author: Ebrahim Byagowi +Date: Wed Dec 19 21:18:30 2018 +0330 + + [test] Fix test-name-table.cc leak issue + + Spotted it accidentally but wanted to see if is anything serious so + went for fixing it + + src/test-name-table.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3d9d7dc4dd4be8e746507282569504b511afa709 +Author: Behdad Esfahbod +Date: Tue Dec 18 22:11:23 2018 -0500 + + [arrays] Add hb_ubytes_t for unsigned char + + src/hb-array.hh | 1 + + 1 file changed, 1 insertion(+) + +commit f1e95e40edc871c840abe8a8a695efc252af40f5 +Author: Behdad Esfahbod +Date: Tue Dec 18 16:49:08 2018 -0500 + + [arrays] Remove hb_supplier_t<> + + src/hb-array.hh | 11 -- + src/hb-cff2-interp-cs.hh | 2 +- + src/hb-face.cc | 6 +- + src/hb-open-file.hh | 15 +- + src/hb-open-type.hh | 18 +- + src/hb-ot-cmap-table.hh | 3 +- + src/hb-ot-layout-common.hh | 104 ++++-------- + src/hb-ot-layout-gsub-table.hh | 257 + +++++++++++++---------------- + src/hb-ot-shape-complex-arabic-fallback.hh | 23 +-- + 9 files changed, 170 insertions(+), 269 deletions(-) + +commit f9417af29bd5a1d2f5b55389a1cc6f4280b347d8 +Author: Behdad Esfahbod +Date: Tue Dec 18 13:23:32 2018 -0500 + + [serialize] Propagate error from hb-face + + src/hb-face.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 9aebfb418222427a324d911b32abfc11256ca9e3 +Author: Behdad Esfahbod +Date: Tue Dec 18 13:22:17 2018 -0500 + + [serialize] Streamline error propagation + + src/hb-buffer.hh | 2 ++ + src/hb-machinery.hh | 35 ++++++++++++++++++++++++++--------- + src/hb-map.hh | 2 ++ + src/hb-ot-layout-common.hh | 4 ++-- + src/hb-ot-layout-gsub-table.hh | 4 ++-- + src/hb-set.hh | 2 ++ + src/hb-subset.cc | 2 +- + 7 files changed, 37 insertions(+), 14 deletions(-) + +commit 969ff3c7aadbe721cdd414488eb170433f10d00c +Author: Behdad Esfahbod +Date: Mon Dec 17 22:43:00 2018 -0500 + + Remove unused hb-iter.hh + + The ideas there are all part of hb-array.hh now. To be determined + how we + want to use generic iterator patterns. + + src/Makefile.sources | 1 - + src/hb-iter.hh | 146 + --------------------------------------------------- + src/hb-machinery.hh | 1 - + 3 files changed, 148 deletions(-) + +commit b1094fc2d2b614c1407b502d15bd98407a5ffb56 +Author: Behdad Esfahbod +Date: Mon Dec 17 22:41:04 2018 -0500 + + [arrays] Minor tweaks to hb_supplier_t + + I think I like to keep this hb_supplier_t thing separately from + hb_array_t. + + src/hb-array.hh | 5 +++++ + 1 file changed, 5 insertions(+) + +commit cf39c242057636feebafce347f8e7ac2b305112a +Author: Behdad Esfahbod +Date: Mon Dec 17 22:36:23 2018 -0500 + + [arrays] Rename Supplier to hb_supplier_t + + src/hb-array.hh | 6 +- + src/hb-face.cc | 2 +- + src/hb-open-file.hh | 4 +- + src/hb-open-type.hh | 4 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-layout-common.hh | 34 ++++----- + src/hb-ot-layout-gsub-table.hh | 108 + ++++++++++++++--------------- + src/hb-ot-shape-complex-arabic-fallback.hh | 14 ++-- + 8 files changed, 87 insertions(+), 87 deletions(-) + +commit 6b5eaa753047b6b0389cb7521c52efbaccf72daf +Author: Behdad Esfahbod +Date: Mon Dec 17 21:55:33 2018 -0500 + + Hide hb_addressof() + + src/hb-dsalgs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6befa75cdf83d561de69fb342f68694cd7b46f5e +Author: Behdad Esfahbod +Date: Mon Dec 17 20:34:51 2018 -0500 + + Enable __builtin_* on clang + + We'll see which old clang versions this breaks... + + src/hb-dsalgs.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8d2d41025619e24160ed80edd1c413168a2dda36 +Author: Behdad Esfahbod +Date: Mon Dec 17 20:23:26 2018 -0500 + + Add hb_addressof() and use it to fix bug after hb_bytes_t merge + + We cannot take address hb_bytes_t direction. We need to use the + newly added hb_addressof(), ala std::addressof(). + + src/hb-dsalgs.hh | 9 +++++++++ + src/hb-ot-post-table.hh | 3 ++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 49334f9b509fc15e8baa93d49b86886ca933de04 +Author: Behdad Esfahbod +Date: Mon Dec 17 18:27:36 2018 -0500 + + Enable system extensions in hb.hh + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1491 + + configure.ac | 1 - + src/hb.hh | 26 ++++++++++++++++++++++++++ + 2 files changed, 26 insertions(+), 1 deletion(-) + +commit 37c14bc7459e8b9cc0840b68223123ffb950b4cc +Author: prrace +Date: Mon Dec 17 14:59:37 2018 -0800 + + Fix Solaris use after free (#1495) + + src/hb-atomic.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 483f2491e40ccf660836ed2797738297e40bd100 +Author: Behdad Esfahbod +Date: Mon Dec 17 17:56:10 2018 -0500 + + Remove define GNU_SOURCE + + Not needed. We get it in our config.h automatically thanks to + AC_USE_SYSTEM_EXTENSIONS. Let's see whose build it breaks... + If we end up putting it back, we should add other things from + that macro and remove the macro. + + src/hb.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 87ff65aea117391c732d51d874964b3e32d6fa94 +Author: Behdad Esfahbod +Date: Mon Dec 17 17:19:42 2018 -0500 + + Fix more warnings + + src/hb.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f9d219a17417f61fa2c6152d2181504866583a72 +Author: prrace +Date: Mon Dec 17 14:18:47 2018 -0800 + + Fix Solaris Trailing comma in enum warnings (#1490) + + src/hb-ot-color.h | 2 +- + src/hb-ot-name.h | 2 +- + src/hb-ot-var.h | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 244a8627f7b0ed651d6010c7ee7e54fa8fcca400 +Author: Ebrahim Byagowi +Date: Mon Dec 17 21:31:43 2018 +0330 + + Lower coretext_aat shaper priority (#1488) + + Related to https://github.com/harfbuzz/harfbuzz/issues/1478 + + src/hb-shaper-list.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit e41200859997ccf8fd7d36fff654f3ceea3a4160 +Author: Ebrahim Byagowi +Date: Mon Dec 17 21:31:01 2018 +0330 + + Remove redundant void from C++ sources (#1486) + + src/dump-indic-data.cc | 2 +- + src/dump-khmer-data.cc | 2 +- + src/dump-myanmar-data.cc | 2 +- + src/dump-use-data.cc | 2 +- + src/hb-aat-fdsc-table.hh | 4 +- + src/hb-aat-layout-common.hh | 23 +++--- + src/hb-aat-layout-feat-table.hh | 8 +-- + src/hb-aat-layout-just-table.hh | 2 +- + src/hb-aat-layout-kerx-table.hh | 21 +++--- + src/hb-aat-layout-morx-table.hh | 10 +-- + src/hb-aat-layout-trak-table.hh | 4 +- + src/hb-aat-layout.cc | 6 +- + src/hb-aat-map.hh | 4 +- + src/hb-array.hh | 24 +++---- + src/hb-atomic.hh | 18 ++--- + src/hb-blob.cc | 8 +-- + src/hb-blob.hh | 33 ++++----- + src/hb-buffer-serialize.cc | 2 +- + src/hb-buffer.cc | 24 +++---- + src/hb-buffer.hh | 51 ++++++------- + src/hb-cache.hh | 6 +- + src/hb-cff-interp-common.hh | 113 +++++++++++++---------------- + src/hb-cff-interp-cs-common.hh | 26 +++---- + src/hb-cff-interp-dict-common.hh | 12 ++-- + src/hb-cff1-interp-cs.hh | 4 +- + src/hb-cff2-interp-cs.hh | 24 +++---- + src/hb-common.cc | 20 +++--- + src/hb-coretext.cc | 2 +- + src/hb-debug.hh | 6 +- + src/hb-directwrite.cc | 16 ++--- + src/hb-dsalgs.hh | 2 +- + src/hb-face.cc | 6 +- + src/hb-face.hh | 8 +-- + src/hb-font.cc | 6 +- + src/hb-font.hh | 6 +- + src/hb-ft.cc | 18 ++--- + src/hb-glib.cc | 8 +-- + src/hb-gobject-enums.cc.tmpl | 2 +- + src/hb-gobject-enums.h.tmpl | 2 +- + src/hb-gobject-structs.cc | 2 +- + src/hb-icu.cc | 8 +-- + src/hb-iter.hh | 15 ++-- + src/hb-machinery.hh | 150 + ++++++++++++++++----------------------- + src/hb-map.cc | 4 +- + src/hb-map.hh | 24 +++---- + src/hb-mutex.hh | 10 +-- + src/hb-null.hh | 32 ++++----- + src/hb-object.hh | 22 +++--- + src/hb-open-file.hh | 32 ++++----- + src/hb-open-type.hh | 66 +++++++++-------- + src/hb-ot-cff-common.hh | 30 ++++---- + src/hb-ot-cff1-table.cc | 17 ++--- + src/hb-ot-cff1-table.hh | 52 ++++++-------- + src/hb-ot-cff2-table.cc | 8 +-- + src/hb-ot-cff2-table.hh | 34 ++++----- + src/hb-ot-cmap-table.hh | 10 +-- + src/hb-ot-color-cbdt-table.hh | 4 +- + src/hb-ot-color-colr-table.hh | 2 +- + src/hb-ot-color-cpal-table.hh | 10 +-- + src/hb-ot-color-sbix-table.hh | 11 ++- + src/hb-ot-color-svg-table.hh | 7 +- + src/hb-ot-face.cc | 2 +- + src/hb-ot-face.hh | 2 +- + src/hb-ot-font.cc | 8 +-- + src/hb-ot-glyf-table.hh | 6 +- + src/hb-ot-hdmx-table.hh | 4 +- + src/hb-ot-head-table.hh | 8 +-- + src/hb-ot-hmtx-table.hh | 2 +- + src/hb-ot-kern-table.hh | 20 +++--- + src/hb-ot-layout-base-table.hh | 10 +-- + src/hb-ot-layout-common.hh | 67 +++++++++-------- + src/hb-ot-layout-gdef-table.hh | 20 +++--- + src/hb-ot-layout-gpos-table.hh | 34 ++++----- + src/hb-ot-layout-gsub-table.hh | 24 +++---- + src/hb-ot-layout-gsubgpos.hh | 92 +++++++++++------------- + src/hb-ot-layout-jstf-table.hh | 8 +-- + src/hb-ot-map.cc | 2 +- + src/hb-ot-map.hh | 8 +-- + src/hb-ot-math-table.hh | 11 ++- + src/hb-ot-maxp-table.hh | 5 +- + src/hb-ot-name-table.hh | 6 +- + src/hb-ot-os2-table.hh | 18 ++--- + src/hb-ot-post-table.hh | 4 +- + src/hb-ot-shape.cc | 2 +- + src/hb-ot-shape.hh | 2 +- + src/hb-ot-tag.cc | 4 +- + src/hb-ot-var-fvar-table.hh | 9 ++- + src/hb-ot-var-hvar-table.hh | 9 +-- + src/hb-ot-vorg-table.hh | 2 +- + src/hb-set-digest.hh | 4 +- + src/hb-set.cc | 4 +- + src/hb-set.hh | 38 +++++----- + src/hb-shape-plan.cc | 2 +- + src/hb-shape-plan.hh | 5 +- + src/hb-shape.cc | 10 +-- + src/hb-shaper.cc | 14 ++-- + src/hb-shaper.hh | 6 +- + src/hb-static.cc | 4 +- + src/hb-subset-cff-common.hh | 91 +++++++++++------------- + src/hb-subset-cff1.cc | 20 ++---- + src/hb-subset-cff2.cc | 8 +-- + src/hb-subset-input.cc | 2 +- + src/hb-subset.hh | 4 +- + src/hb-ucdn.cc | 10 +-- + src/hb-unicode.cc | 64 ++++++++--------- + src/hb-uniscribe.cc | 12 ++-- + src/hb-vector.hh | 38 +++++----- + src/hb.hh | 6 +- + src/test-unicode-ranges.cc | 4 +- + util/ansi-print.cc | 6 +- + util/hb-fc.cc | 2 +- + util/hb-shape.cc | 5 +- + util/helper-cairo.cc | 2 +- + util/helper-cairo.hh | 2 +- + util/main-font-text.hh | 2 +- + util/options.cc | 8 +-- + util/options.hh | 22 +++--- + util/view-cairo.hh | 14 ++-- + 118 files changed, 861 insertions(+), 1024 deletions(-) + +commit 7ace10078c23d00da4af0480f91b877faeed3d38 +Author: Ebrahim Byagowi +Date: Mon Dec 17 20:07:04 2018 +0330 + + Minor, fix two more ArrayOf incorrect operator logic + + src/hb-open-type.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a1240383aa82fd88e922a1e751444d14033ae882 +Author: Behdad Esfahbod +Date: Mon Dec 17 10:44:14 2018 -0500 + + [arrays] Minor fix + + src/hb-open-type.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 381c3548e9022a421bcf88db148cc11f337f3b79 +Author: Behdad Esfahbod +Date: Mon Dec 17 00:39:30 2018 -0500 + + [array] Add cast operator to add const to Type + + In lieu of constructor removed in previous commit. + + src/hb-array.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 15acf33c228e0c8e0f8cc6a04e566970164dd5f1 +Author: Behdad Esfahbod +Date: Mon Dec 17 00:38:13 2018 -0500 + + [array] Remove problematic constructor + + src/hb-array.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 470369a871791b610e0c42212558e83baeb83409 +Author: Behdad Esfahbod +Date: Mon Dec 17 00:20:19 2018 -0500 + + [array] Add arithmetic operators + + src/hb-array.hh | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +commit 6cd60c2f2aa17e3f02b50c19cf640b3f183f3354 +Author: Behdad Esfahbod +Date: Mon Dec 17 00:09:06 2018 -0500 + + [array] Return Crap instead of Null if Type is not const + + Ouch! + + src/hb-array.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94e72cf1c9af563fbf522efb7f2e0b1fcd616418 +Author: Behdad Esfahbod +Date: Mon Dec 17 00:06:40 2018 -0500 + + [array] Add operator * + + src/hb-array.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 68d4a5eee0f248891d20d69b897201d105951aef +Author: Behdad Esfahbod +Date: Mon Dec 17 00:02:42 2018 -0500 + + [array] Add constructor from fixed-size array + + src/hb-array.hh | 1 + + src/hb-iter.hh | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit a4354d2fd36377ec8b544c7b88a231cb1273dccd +Author: Behdad Esfahbod +Date: Sun Dec 16 23:57:27 2018 -0500 + + [array] Organize + + src/hb-array.hh | 75 + ++++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 48 insertions(+), 27 deletions(-) + +commit 84c1865821151d83a8798ae11ebba3329a12c560 +Author: Behdad Esfahbod +Date: Sun Dec 16 23:52:17 2018 -0500 + + [arrays] Reduce Supplier<> even further + + src/hb-array.hh | 24 +++--------------------- + 1 file changed, 3 insertions(+), 21 deletions(-) + +commit 1bcc4fc9f34ab518fc822c9464a73ba3e90f5f1c +Author: Behdad Esfahbod +Date: Sun Dec 16 23:47:56 2018 -0500 + + Whitespace + + src/hb-ot-shape-complex-arabic-fallback.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit f85f6e815f439075f8c6f5391e5c8dfe77e0f00d +Author: Behdad Esfahbod +Date: Sun Dec 16 23:45:07 2018 -0500 + + [array] Add operator += + + src/hb-array.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 7c0e3e9b2b077fced829a10f616ed3d6b51c15c4 +Author: Behdad Esfahbod +Date: Sun Dec 16 23:43:17 2018 -0500 + + [array] Add constructor from hb_array_t + + src/hb-array.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 92680361ec68734ad38e2158626feebaf18eec88 +Author: Behdad Esfahbod +Date: Sun Dec 16 23:38:51 2018 -0500 + + [arrays] Move Supplier<> to hb-array.hh + + src/hb-array.hh | 33 +++++++++++++++++++++++++++++++++ + src/hb-machinery.hh | 32 -------------------------------- + 2 files changed, 33 insertions(+), 32 deletions(-) + +commit 2a3fa3f82ffdb778a2d21fc01e859579161237c9 +Author: Behdad Esfahbod +Date: Sun Dec 16 23:33:03 2018 -0500 + + [arrays] Remove unnecessary constructor from Supplier<> + + Looks like operator hb_array_t<> from vector works here. :) + + src/hb-machinery.hh | 5 ----- + 1 file changed, 5 deletions(-) + +commit 507cac4943e987879b95d842fe60643abbf22efa +Author: Behdad Esfahbod +Date: Sun Dec 16 23:31:19 2018 -0500 + + [arrays] Start moving Supplier<> to hb_array_t<> + + src/hb-machinery.hh | 31 +++++++++++-------------------- + 1 file changed, 11 insertions(+), 20 deletions(-) + +commit 1e2c98126e8500ace31483b05d77478afd59bab8 +Author: Behdad Esfahbod +Date: Sun Dec 16 22:30:44 2018 -0500 + + [arrays] Remove unused stride from Supplier + + src/hb-machinery.hh | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 0d0fe9df46c645538feaee1ec99a0108383a3669 +Author: Behdad Esfahbod +Date: Sun Dec 16 22:29:40 2018 -0500 + + [arrays] Remove need of stride in Supplier<> + + src/hb-face.cc | 6 ++---- + src/hb-open-file.hh | 19 +++++++++---------- + src/hb-vector.hh | 2 +- + 3 files changed, 12 insertions(+), 15 deletions(-) + +commit dcfa4a8d711716de88b94a370663e9564e3e7ccc +Author: Behdad Esfahbod +Date: Sun Dec 16 20:40:07 2018 -0500 + + [array] Remove custom hb_bytes_t implementation + + src/hb-array.hh | 67 + +++++++++++++++++-------------------------------- + src/hb-machinery.hh | 2 +- + src/hb-ot-name-table.hh | 8 +++--- + src/hb-ot-name.cc | 10 ++++---- + 4 files changed, 33 insertions(+), 54 deletions(-) + +commit 3656f56d47cf6b89a25990d7836704fef79fa5b4 +Author: Behdad Esfahbod +Date: Sun Dec 16 20:35:11 2018 -0500 + + [arrays] Minor + + src/hb-array.hh | 3 ++- + src/hb-open-type.hh | 10 ++++------ + src/hb-vector.hh | 4 +--- + 3 files changed, 7 insertions(+), 10 deletions(-) + +commit aa8f94714ee720c56be1a3406df7bacb0550158c +Author: Behdad Esfahbod +Date: Sun Dec 16 20:20:35 2018 -0500 + + [array] Minor + + src/hb-array.hh | 4 ++++ + src/hb-iter.hh | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 5a552f75468d777d8d4bd3168e28f56a3369eafd +Author: Behdad Esfahbod +Date: Sun Dec 16 20:07:44 2018 -0500 + + [array] Move hb_array_t and related types to hb-array.hh + + src/Makefile.sources | 1 + + src/hb-array.hh | 241 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-dsalgs.hh | 206 ------------------------------------------- + src/hb-machinery.hh | 1 + + src/hb-vector.hh | 2 +- + 5 files changed, 244 insertions(+), 207 deletions(-) + +commit 01d06e34ffa746d3737df00bb692cdb1e859c1c6 +Author: Behdad Esfahbod +Date: Sun Dec 16 14:27:43 2018 -0500 + + Minor change to explicit_operator aesthetics + + src/hb-iter.hh | 2 +- + src/hb-machinery.hh | 2 +- + src/hb-vector.hh | 4 ++-- + src/hb.hh | 4 ++-- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit b2ebaa9afac0f57006283db92d1f3b4df3d6bd7e +Author: Ebrahim Byagowi +Date: Sun Dec 16 22:38:10 2018 +0330 + + Remove redundant 'inline' from methods (#1483) + + src/hb-aat-fdsc-table.hh | 12 +- + src/hb-aat-layout-ankr-table.hh | 12 +- + src/hb-aat-layout-bsln-table.hh | 13 +- + src/hb-aat-layout-common.hh | 150 +++++++------- + src/hb-aat-layout-feat-table.hh | 46 ++--- + src/hb-aat-layout-just-table.hh | 26 +-- + src/hb-aat-layout-kerx-table.hh | 120 +++++------ + src/hb-aat-layout-lcar-table.hh | 14 +- + src/hb-aat-layout-morx-table.hh | 104 +++++----- + src/hb-aat-layout-trak-table.hh | 28 +-- + src/hb-aat-layout.hh | 2 +- + src/hb-aat-ltag-table.hh | 6 +- + src/hb-aat-map.hh | 7 +- + src/hb-atomic.hh | 26 +-- + src/hb-blob.hh | 32 ++- + src/hb-buffer.hh | 76 ++++--- + src/hb-cache.hh | 10 +- + src/hb-cff-interp-common.hh | 197 +++++++++--------- + src/hb-cff-interp-cs-common.hh | 166 +++++++-------- + src/hb-cff-interp-dict-common.hh | 26 +-- + src/hb-cff1-interp-cs.hh | 21 +- + src/hb-cff2-interp-cs.hh | 48 ++--- + src/hb-common.cc | 13 +- + src/hb-debug.hh | 20 +- + src/hb-directwrite.cc | 2 +- + src/hb-dsalgs.hh | 84 ++++---- + src/hb-face.cc | 2 +- + src/hb-face.hh | 6 +- + src/hb-font.hh | 216 ++++++++++---------- + src/hb-ft.cc | 8 +- + src/hb-glib.cc | 2 +- + src/hb-icu.cc | 2 +- + src/hb-iter.hh | 18 +- + src/hb-kern.hh | 8 +- + src/hb-machinery.hh | 210 +++++++++---------- + src/hb-map.hh | 38 ++-- + src/hb-mutex.hh | 12 +- + src/hb-null.hh | 26 +-- + src/hb-object.hh | 34 ++-- + src/hb-open-file.hh | 92 ++++----- + src/hb-open-type.hh | 253 ++++++++++++----------- + src/hb-ot-cff-common.hh | 177 ++++++++-------- + src/hb-ot-cff1-table.cc | 32 +-- + src/hb-ot-cff1-table.hh | 160 +++++++-------- + src/hb-ot-cff2-table.cc | 16 +- + src/hb-ot-cff2-table.hh | 62 +++--- + src/hb-ot-cmap-table.hh | 185 +++++++++-------- + src/hb-ot-color-cbdt-table.hh | 40 ++-- + src/hb-ot-color-colr-table.hh | 18 +- + src/hb-ot-color-cpal-table.hh | 55 +++-- + src/hb-ot-color-sbix-table.hh | 48 ++--- + src/hb-ot-color-svg-table.hh | 20 +- + src/hb-ot-font.cc | 2 +- + src/hb-ot-gasp-table.hh | 6 +- + src/hb-ot-glyf-table.hh | 37 ++-- + src/hb-ot-hdmx-table.hh | 36 ++-- + src/hb-ot-head-table.hh | 10 +- + src/hb-ot-hhea-table.hh | 2 +- + src/hb-ot-hmtx-table.hh | 18 +- + src/hb-ot-kern-table.hh | 44 ++-- + src/hb-ot-layout-base-table.hh | 104 +++++----- + src/hb-ot-layout-common.hh | 425 + ++++++++++++++++++++------------------- + src/hb-ot-layout-gdef-table.hh | 126 ++++++------ + src/hb-ot-layout-gpos-table.hh | 209 +++++++++---------- + src/hb-ot-layout-gsub-table.hh | 360 ++++++++++++++++----------------- + src/hb-ot-layout-gsubgpos.hh | 353 ++++++++++++++++---------------- + src/hb-ot-layout-jstf-table.hh | 44 ++-- + src/hb-ot-map.hh | 38 ++-- + src/hb-ot-math-table.hh | 142 ++++++------- + src/hb-ot-maxp-table.hh | 12 +- + src/hb-ot-name-table.hh | 21 +- + src/hb-ot-os2-table.hh | 34 ++-- + src/hb-ot-post-table.hh | 26 +-- + src/hb-ot-shape-complex-indic.cc | 10 +- + src/hb-ot-shape-complex-khmer.cc | 10 +- + src/hb-ot-shape.hh | 6 +- + src/hb-ot-stat-table.hh | 16 +- + src/hb-ot-var-avar-table.hh | 8 +- + src/hb-ot-var-fvar-table.hh | 55 +++-- + src/hb-ot-var-hvar-table.hh | 16 +- + src/hb-ot-var-mvar-table.hh | 10 +- + src/hb-ot-vorg-table.hh | 22 +- + src/hb-set-digest.hh | 41 ++-- + src/hb-set.hh | 114 +++++------ + src/hb-shape.cc | 14 +- + src/hb-shaper.cc | 14 +- + src/hb-shaper.hh | 10 +- + src/hb-subset-cff-common.hh | 175 ++++++++-------- + src/hb-subset-cff1.cc | 91 ++++----- + src/hb-subset-cff2.cc | 36 ++-- + src/hb-subset-plan.hh | 12 +- + src/hb-subset.hh | 4 +- + src/hb-ucdn.cc | 2 +- + src/hb-unicode.hh | 26 +-- + src/hb-uniscribe.cc | 16 +- + src/hb-utf.hh | 54 +++-- + src/hb-vector.hh | 86 ++++---- + 97 files changed, 2911 insertions(+), 2987 deletions(-) + +commit 7251c7729061b7df29efe2b466315e96c81ad03f +Author: Behdad Esfahbod +Date: Sat Dec 15 21:00:55 2018 -0500 + + Whitespace + + src/hb-buffer-serialize.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 829b56b1a22736eac49132b2e56dc480157afca2 +Author: Behdad Esfahbod +Date: Sat Dec 15 13:02:13 2018 -0500 + + Whitespace + + src/hb-ot-cff-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 42a1012562c1f020f470526a34b68ed21ad138cc +Author: Behdad Esfahbod +Date: Thu Dec 13 19:39:59 2018 -0500 + + [subset] Actually subset GDEF + + src/hb-subset.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit c9c746c7f6091e575fd74ba8f8cae2c4fd44a1ad +Author: Behdad Esfahbod +Date: Thu Dec 13 18:37:37 2018 -0500 + + [subset] Fix up ClassDef some more + + src/hb-ot-layout-common.hh | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 7ee6128902333716dd8d8df6e38a8d1ebacb0a46 +Author: Behdad Esfahbod +Date: Thu Dec 13 18:32:04 2018 -0500 + + [subset] Fix ClassDefFormat1 subsetting + + src/hb-ot-layout-common.hh | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +commit 1b6d0c44b3067f5840d3fdac99fbc7448d0f37bf +Author: Behdad Esfahbod +Date: Thu Dec 13 18:10:48 2018 -0500 + + [subset] Sketch GDEF subsetting + + src/hb-ot-layout-gdef-table.hh | 20 ++++++++++++++++++++ + src/hb-ot-layout-gsubgpos.hh | 2 ++ + 2 files changed, 22 insertions(+) + +commit 705e2f5056d60c28154004e0c5d3b0ec67fe93c8 +Author: Behdad Esfahbod +Date: Thu Dec 13 17:48:42 2018 -0500 + + [subset] Implement for ClassDef + + src/hb-ot-layout-common.hh | 80 + ++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-layout-gsub-table.hh | 8 ++--- + 2 files changed, 84 insertions(+), 4 deletions(-) + +commit 6e33a3955df77b9d1fda5ea44302d97b21e7871c +Author: Behdad Esfahbod +Date: Thu Dec 13 16:40:01 2018 -0500 + + Minor + + src/hb-machinery.hh | 12 +++++++++--- + src/hb-ot-cmap-table.hh | 3 +-- + src/hb-ot-layout-gsub-table.hh | 8 ++++---- + 3 files changed, 14 insertions(+), 9 deletions(-) + +commit cc65901ca7185df926570d5067ace763a2cc759e +Author: Behdad Esfahbod +Date: Thu Dec 13 16:01:45 2018 -0500 + + [serialize] Implement for ClassDef + + src/hb-ot-layout-common.hh | 33 +++++++++++++++++++++++++++++++-- + 1 file changed, 31 insertions(+), 2 deletions(-) + +commit e5309e4fd8583aa5c5ad9f3934d8aa593c850468 +Author: Behdad Esfahbod +Date: Thu Dec 13 15:57:12 2018 -0500 + + [serialize] Implement for ClassDefFormat2 + + src/hb-ot-layout-common.hh | 50 + ++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 46 insertions(+), 4 deletions(-) + +commit c8b43cbe316b07507aece4dc769f38226cd706da +Author: Behdad Esfahbod +Date: Thu Dec 13 15:50:13 2018 -0500 + + [serialize] Implement for ClassDefFormat1 + + src/hb-ot-layout-common.hh | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit 576103132945c9d916514720d4034b398e099cfa +Author: Behdad Esfahbod +Date: Wed Dec 12 21:21:26 2018 -0500 + + [subset] Minor + + src/hb-subset.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 798e98c47bd9fa4d434487ae92e2c88ebb8a19a5 +Author: Michiharu Ariza +Date: Wed Dec 12 18:08:15 2018 -0800 + + [CFF] bad offset in Index (#1476) + + * Update hb-ot-cff-common.hh + + * fix bug + + * bummer fix wasn't hit. refix + + * additional sanity check + + * Added test cases for oss-fuzz issues 11805, 11806 + + src/hb-ot-cff-common.hh | 10 + ++++++++-- + ...clusterfuzz-testcase-hb-subset-fuzzer-5643036478930944 | Bin 0 -> + 369 bytes + ...clusterfuzz-testcase-hb-subset-fuzzer-5686186874503168 | Bin 0 -> + 962 bytes + 3 files changed, 8 insertions(+), 2 deletions(-) + +commit bcb4ecaf68c7219e89a801352bfc6a682b1581ef +Author: Michiharu Ariza +Date: Wed Dec 12 17:36:01 2018 -0800 + + [CFF] check out of range FD index (#1477) + + * add fd index checks to subr subsetter + + also added oss-fuzz test case + + * undid SubrSubsetParam::is_valid + + because already validated by SubrClosures.valid + + src/hb-subset-cff-common.hh | 10 ++++++++++ + ...lusterfuzz-testcase-hb-subset-fuzzer-5762137968869376 | Bin 0 -> + 2037 bytes + 2 files changed, 10 insertions(+) + +commit 3f8e7a98d3cc10fefe65b9638c8abdf3ebe152cb +Author: Behdad Esfahbod +Date: Wed Dec 12 11:32:57 2018 -0500 + + [util/hb-subset] Add --layout to keep GDEF/GSUB/GPOS + + Will become default and option removed in the future. + + util/hb-subset.cc | 1 + + util/options.cc | 1 + + util/options.hh | 2 ++ + 3 files changed, 4 insertions(+) + +commit 2cc993e035cb37711f894968246817e53a9e823d +Author: Behdad Esfahbod +Date: Wed Dec 12 10:07:38 2018 -0500 + + [dispatch] Minor + + src/hb-ot-layout-gpos-table.hh | 4 +--- + src/hb-ot-layout-gsub-table.hh | 4 +--- + 2 files changed, 2 insertions(+), 6 deletions(-) + +commit 602fbfe3c96b3f18b0109239528ba18a19be4948 +Author: Behdad Esfahbod +Date: Wed Dec 12 09:56:47 2018 -0500 + + [sanitize] Fix sanitizing sublookup array + + src/hb-ot-layout-common.hh | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit c78e4784fbe06ceb27b54a1d8908016ade071cb4 +Author: Behdad Esfahbod +Date: Wed Dec 12 09:50:18 2018 -0500 + + [dispatch] Minor + + src/hb-machinery.hh | 1 + + src/hb-ot-layout-gsubgpos.hh | 3 --- + src/hb-subset.hh | 1 - + 3 files changed, 1 insertion(+), 4 deletions(-) + +commit f9d211af1d6d78d092038d263b222ec8a65cf09d +Author: Behdad Esfahbod +Date: Wed Dec 12 09:44:30 2018 -0500 + + Revert "Minor fix re sanitize of Lookup subtables" + + This reverts commit 7146718bef81492e13aede0a2801cda1da41ce35. + + Fixing differently. + + src/hb-ot-layout-common.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 7ee5c52345c122436e054062084cd51292b90ad1 +Author: Ebrahim Byagowi +Date: Wed Dec 12 15:14:37 2018 +0330 + + minor style fix, use void in methods on no argument + + src/hb-aat-fdsc-table.hh | 4 +- + src/hb-aat-layout-common.hh | 6 +- + src/hb-aat-layout-feat-table.hh | 4 +- + src/hb-aat-layout-trak-table.hh | 18 +-- + src/hb-aat-layout.cc | 4 +- + src/hb-buffer.cc | 48 +++---- + src/hb-directwrite.cc | 297 + +++++++++++++++++++--------------------- + src/hb-dsalgs.hh | 5 +- + src/hb-map.hh | 20 +-- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-color-cbdt-table.hh | 2 +- + src/hb-ot-color-cpal-table.hh | 4 +- + src/hb-ot-color-sbix-table.hh | 10 +- + src/hb-ot-color-svg-table.hh | 15 +- + src/hb-ot-glyf-table.hh | 2 +- + src/hb-ot-hdmx-table.hh | 6 +- + src/hb-ot-layout-base-table.hh | 11 +- + src/hb-ot-os2-table.hh | 15 +- + 18 files changed, 211 insertions(+), 262 deletions(-) + +commit a33f238f8888cc969e1e393deda0518fb8dd6b13 +Merge: 7146718b 1e09add2 +Author: Ebrahim Byagowi +Date: Wed Dec 12 12:44:06 2018 +0330 + + Merge pull request #1474 from fanc999/master.msvc + + Few fixes for Visual Studio builds + +commit 7146718bef81492e13aede0a2801cda1da41ce35 +Author: Behdad Esfahbod +Date: Tue Dec 11 23:44:29 2018 -0500 + + Minor fix re sanitize of Lookup subtables + + We were dereferencing Null pointers and trying to sanitize them, + which is not necessary... + + src/hb-ot-layout-common.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ce069d193229cde12c77a3f464fc10286bedf5f3 +Author: Behdad Esfahbod +Date: Tue Dec 11 23:07:48 2018 -0500 + + Minor + + src/hb-open-type.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 1aea86944605e7e18acfd2c0a77ba60e62239274 +Author: Behdad Esfahbod +Date: Tue Dec 11 22:53:58 2018 -0500 + + [subset] Map glyphs during SingleSubst subsetting + + Ha! + + src/hb-ot-layout-gsub-table.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 41d1a1c10f7e5ca69a337ae164d270e09b5f93ac +Author: Behdad Esfahbod +Date: Tue Dec 11 22:48:27 2018 -0500 + + [subset] Minor + + src/hb-machinery.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2aba2c6c73301396f7e0e5dee819ab6863e74900 +Author: Behdad Esfahbod +Date: Tue Dec 11 21:18:47 2018 -0500 + + [serialize] Break down assert + + src/hb-machinery.hh | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit 9844c880e280e9cd28dcbeac2e581ac923c5ddf3 +Author: Behdad Esfahbod +Date: Tue Dec 11 17:28:04 2018 -0500 + + Minor + + test/shaping/Makefile.am | 2 ++ + util/Makefile.am | 2 ++ + 2 files changed, 4 insertions(+) + +commit 2941208f1eedabec2715b2a67d40f058df7eb5e6 +Author: Michiharu Ariza +Date: Tue Dec 11 12:21:24 2018 -0800 + + [CFF] oss-fuzz issue 11690 ASSERT: substr.offset >= opStart (#1461) + + * fix oss-fuzz 11690: substr.offset >= opStart + + detect recursive subroutine call & handle as error + + * fix build failure + + * add minimized test case for oss-fuzz 11690 + + * removed asserts + + src/hb-cff-interp-common.hh | 9 ++++----- + src/hb-subset-cff-common.hh | 12 + ++++++++++-- + src/hb-subset-cff1.cc | 4 ++-- + src/hb-subset-cff2.cc | 4 ++-- + ...testcase-minimized-hb-subset-fuzzer-5750420593442816 | Bin 0 -> + 96091 bytes + 5 files changed, 18 insertions(+), 11 deletions(-) + +commit 333586245cb37668c8a29af17920474c09667f4b +Author: Michiharu Ariza +Date: Tue Dec 11 12:20:20 2018 -0800 + + minimize use of assert: removed or changed to error handling (#1467) + + src/hb-ot-cff-common.hh | 2 +- + src/hb-ot-cff1-table.hh | 12 ++++++++---- + src/hb-subset-cff-common.cc | 6 ++++-- + src/hb-subset-cff-common.hh | 1 - + src/hb-subset-cff1.cc | 22 +++++++++++++++++----- + src/hb-subset-cff2.cc | 14 +++++++++++--- + 6 files changed, 41 insertions(+), 16 deletions(-) + +commit f24498c1e95e816889eb7a2f8b1062bbf15bed1b +Author: Ebrahim Byagowi +Date: Tue Dec 11 23:02:52 2018 +0330 + + [ci] Fix Travis macOS bot ICU issue (#1472) + + .travis.yml | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 9f3a51ddb952e1281f9a656fde7193c3e3b8dad2 +Author: 👻 +Date: Tue Dec 11 13:38:05 2018 -0500 + + [ucdn] Fix header + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1470 + + src/hb-ucdn/ucdn.h | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit b225593d6baf3455e1ac951efc0df5015fdf7c69 +Author: David Corbett +Date: Tue Dec 11 13:19:17 2018 -0500 + + Correct REPLACEMENT CHARACTER's code point to FFFD (#1471) + + test/shaping/hb_test_tools.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1e09add232e14ef61d2f222a5ee05a2105af64f0 +Author: Chun-wei Fan +Date: Wed Dec 12 01:32:01 2018 +0800 + + test/api: Fix building on pre-C99 compilers + + Ensure variables are declared at the top of the block. + + test/api/hb-test.h | 3 ++- + test/api/test-aat-layout.c | 3 ++- + test/api/test-font.c | 2 +- + test/api/test-map.c | 9 ++++++--- + test/api/test-ot-color.c | 9 +++++---- + test/api/test-ot-face.c | 14 ++++++++------ + test/api/test-ot-name.c | 30 ++++++++++++++++-------------- + test/api/test-ot-tag.c | 11 ++++++----- + 8 files changed, 46 insertions(+), 35 deletions(-) + +commit 09b16c536d31376de771eedde54620dd6c8f39d7 +Author: Chun-wei Fan +Date: Wed Dec 12 01:23:53 2018 +0800 + + CMake: Fix Introspection builds + + We need to add -DHB_AAT_H and -DHB_AAT_H_IN to the flags that + are passed + to g-ir-scanner, so that introspection builds can proceed normally. + + CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1683bb2c9337fa34e5e80d459ab5eab99d7a9804 +Author: Ebrahim Byagowi +Date: Sat Dec 8 13:57:39 2018 +0330 + + [glyf] minor + + src/hb-ot-glyf-table.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit f7cfe99815c07f82d5ad253af1e811db734bf92b +Author: Ebrahim Byagowi +Date: Sat Dec 8 13:40:44 2018 +0330 + + [os2] Move typometrics detection logic to the table (#1465) + + src/hb-ot-hmtx-table.hh | 14 +++++--------- + src/hb-ot-os2-table.hh | 7 ++++--- + 2 files changed, 9 insertions(+), 12 deletions(-) + +commit 47cf9a9633bbff12fef1131e7179dfc351f7e5f3 +Author: Ebrahim Byagowi +Date: Sat Dec 8 10:20:25 2018 +0330 + + Apply non-controversial parts of ot-style (#1464) + + Things to be used in https://github.com/harfbuzz/harfbuzz/pull/1459 + + src/hb-aat-fdsc-table.hh | 29 +++++++++++++++++++++++++--- + src/hb-aat-layout-common.hh | 1 + + src/hb-ot-head-table.hh | 13 +++++++++++++ + src/hb-ot-os2-table.hh | 46 + +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-stat-table.hh | 38 ++++++++++++++++++------------------- + 5 files changed, 105 insertions(+), 22 deletions(-) + +commit 4d809696ef4db046d11072e5433ea5ff36bd7b26 +Author: Michiharu Ariza +Date: Fri Dec 7 20:49:39 2018 -0800 + + fix for issue #1447 (#1462) + + Added case for OpCode_BaseFontName. This opcode in spec but + practically unused. + Added a comment for default case which can't be hit + + src/hb-ot-cff1-table.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 1abd4fcaec31053b442525d7f240af489c5974b1 +Author: Ebrahim Byagowi +Date: Fri Dec 7 22:34:12 2018 +0330 + + [fdsc] minor + + src/hb-aat-fdsc-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 59345cdef38cf1f514a6a0eb6e8852350acb6166 +Author: Michiharu Ariza +Date: Thu Dec 6 13:36:26 2018 -0800 + + [CFF] Refix oss-fuzz 11714: set_blends (PR #1458) (#1460) + + * pass subarray of stack to set_blends + + * get_subarray to return a value, not ref + + * restored error check (with tweak) + + src/hb-cff-interp-common.hh | 5 +++++ + src/hb-cff2-interp-cs.hh | 14 +++++++++----- + 2 files changed, 14 insertions(+), 5 deletions(-) + +commit 20245f0000a0f04f2ba172b51ce69ee7ebb256aa +Author: Behdad Esfahbod +Date: Thu Dec 6 10:27:37 2018 -0800 + + Fix likely check + + Ouch! + + src/hb-cff-interp-dict-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d866e905fd555d393464ed58d5fc11ee453c7ea4 +Author: Behdad Esfahbod +Date: Thu Dec 6 10:26:32 2018 -0800 + + Add default value to first argument of sub_array() + + src/hb-dsalgs.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit f1352f7486caaf6d3480ef2ac6b4719acf73e6a2 +Author: Behdad Esfahbod +Date: Thu Dec 6 10:21:06 2018 -0800 + + Add sub_array to hb_vector_t + + src/hb-vector.hh | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit ca23b719357b01e98a5cf533bbf637d6706a4ec2 +Author: Behdad Esfahbod +Date: Thu Dec 6 10:19:03 2018 -0800 + + Add default-value for second arg of sub_array() + + src/hb-dsalgs.hh | 7 +++---- + src/hb-open-type.hh | 8 ++++---- + 2 files changed, 7 insertions(+), 8 deletions(-) + +commit 6ad3fcddaf2ba8ebc9ad49ff9e7b33b60fcad16a +Merge: f95324a3 ae087d10 +Author: Ebrahim Byagowi +Date: Thu Dec 6 10:21:00 2018 +0330 + + Merge pull request #1458 from harfbuzz/cff-check-blends + + [CFF] oss-fuzz issue 11714: set_blends + +commit ae087d10c22249f3aec3239e4eac98a728f71f75 +Author: Michiharu Ariza +Date: Wed Dec 5 21:47:34 2018 -0800 + + add minimized test case for oss-fuzz issue 11714 + + ...-testcase-minimized-hb-subset-fuzzer-5710107829075968 | Bin 0 -> + 3660 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 1ccbdcf73bbc967f5f94c0bc7f7e869bd87d9fa0 +Merge: 14d29a10 f95324a3 +Author: Michiharu Ariza +Date: Wed Dec 5 21:37:38 2018 -0800 + + Merge branch 'master' into cff-check-blends + +commit 14d29a10437205566c4bd7bcfa2282d34d9f4f2f +Author: Michiharu Ariza +Date: Wed Dec 5 21:33:29 2018 -0800 + + check number of blends against args on stack + + src/hb-cff2-interp-cs.hh | 5 +++++ + 1 file changed, 5 insertions(+) + +commit f95324a3351c1f699214ad84d073268218ea83a3 +Merge: 6727c4b6 9d8f3b0d +Author: Ebrahim Byagowi +Date: Thu Dec 6 08:33:44 2018 +0330 + + Merge pull request #1457 from harfbuzz/cff-varstore-sanitize + + [CFF] oss-fuzz issue 11713 (CFF2VariationStore::serialize) + +commit 6727c4b6f0356b08803b4d5cde608ec004e3533f +Merge: d9dabc00 34e3ef8f +Author: Behdad Esfahbod +Date: Wed Dec 5 17:37:21 2018 -0800 + + Merge pull request #1456 from harfbuzz/cff-subr-sanitize + + [CFF] fix oss-fuzz issue 11691 (BlendArg::set_blends) + +commit 9d8f3b0dfbf39f5dfa25d52f47e8af6ad318eb17 +Author: Michiharu Ariza +Date: Wed Dec 5 17:14:51 2018 -0800 + + add minimized test case for oss-fuzz issue 11713 + + ...z-testcase-minimized-hb-subset-fuzzer-5660711141769216 | Bin 0 -> + 383 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit c31092ab34641072606f854408eb1bea18ed2507 +Author: Michiharu Ariza +Date: Wed Dec 5 17:04:55 2018 -0800 + + sanitize variationStore in CFF2 against its size + + src/hb-ot-cff2-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 34e3ef8ff394f281b8d7e2c08f346a9495692edc +Merge: 72d8f763 d9dabc00 +Author: Michiharu Ariza +Date: Wed Dec 5 15:50:05 2018 -0800 + + Merge branch 'master' into cff-subr-sanitize + +commit 72d8f76368b264a42fe58438fe15811d458a7935 +Author: Michiharu Ariza +Date: Wed Dec 5 15:49:11 2018 -0800 + + add minimized test case for oss-fuzz issue 11691 + + ...z-testcase-minimized-hb-shape-fuzzer-5686369209286656 | Bin 0 -> + 2880 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit d9dabc00e9278a346e85538212c126da7e610d55 +Merge: 81cfd3c7 010e2ddb +Author: Behdad Esfahbod +Date: Wed Dec 5 15:39:34 2018 -0800 + + Merge pull request #1454 from harfbuzz/cff-fixbcd + + [CFF] fix oss-fuzz issue 11674: parse_bcd + +commit 81cfd3c775dbc470f57d7fe2775cc068ffa367b6 +Merge: 8394a6cb 6708c559 +Author: Behdad Esfahbod +Date: Wed Dec 5 15:37:15 2018 -0800 + + Merge pull request #1455 from harfbuzz/cff-strinc_assert + + [CFF] fix oss-fuzz issue 11675 (ASSERT: count <= str.len) + +commit 6dcfda92c17a7701479118751a8290246e9a3c05 +Author: Michiharu Ariza +Date: Wed Dec 5 15:07:46 2018 -0800 + + sanitize CFF1 & CFF2 global subrs + + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 6708c5595fc6babdae0132f8a23cbe3558a58703 +Author: Michiharu Ariza +Date: Wed Dec 5 12:51:18 2018 -0800 + + fix oss-fuzz issue 11675 (ASSERT: count <= str.len) + + Also added an additional error check to avail () + + src/hb-cff-interp-common.hh | 18 + ++++++++++++++++-- + ...stcase-minimized-hb-subset-fuzzer-5768186323009536 | Bin 0 -> + 337 bytes + 2 files changed, 16 insertions(+), 2 deletions(-) + +commit 010e2ddb384b5a721172fd7466aafec58dbf8063 +Author: Michiharu Ariza +Date: Wed Dec 5 12:23:58 2018 -0800 + + minimized test case for oss-fuzz issue 11674 + + ...zz-testcase-minimized-hb-subset-fuzzer-5672006905757696 | Bin 0 -> + 73 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 2cb9d4c183afc838ecf2ba0d47814e9eaa6f09c6 +Merge: a5fa843c 8394a6cb +Author: Michiharu Ariza +Date: Wed Dec 5 11:25:29 2018 -0800 + + Merge branch 'master' into cff-fixbcd + +commit a5fa843c746e20aaca48ece6cff057deb8d916ca +Author: Michiharu Ariza +Date: Wed Dec 5 11:18:16 2018 -0800 + + fixed a bug with fractional part in a negative value + + src/hb-cff-interp-dict-common.hh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 8394a6cb252dd8b4230c2b59e8c346ec5403bf88 +Author: Ebrahim Byagowi +Date: Wed Dec 5 15:23:41 2018 +0330 + + [os2] Make newer table fields accessible (#1452) + + src/hb-ot-os2-table.hh | 88 + +++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 66 insertions(+), 22 deletions(-) + +commit 5ab086ebb18112ef48bf6c913acc91b2009a9bed +Author: Ebrahim Byagowi +Date: Wed Dec 5 14:17:37 2018 +0330 + + [fdsc] Implement the table parsing + + Related to https://github.com/harfbuzz/harfbuzz/issues/1337 + + May used in addition to an API related to STAT. + + Lots of Apple fonts have it. + + src/Makefile.sources | 1 + + src/hb-aat-fdsc-table.hh | 103 + +++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout.cc | 1 + + 3 files changed, 105 insertions(+) + +commit 8f80e53341a3d5bac6c2c39ab6d6973eedb0b074 +Author: Ebrahim Byagowi +Date: Wed Dec 5 13:51:14 2018 +0330 + + [gasp] Implement the table parsing + + May or may not be used in + https://github.com/harfbuzz/harfbuzz/pull/1432 + + src/Makefile.sources | 1 + + src/hb-ot-gasp-table.hh | 84 + +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-layout.cc | 5 +-- + 3 files changed, 88 insertions(+), 2 deletions(-) + +commit 79e7e3445efef2dc57f8a10c7e355e802af08868 +Merge: cf4b7db6 78f639b8 +Author: Ebrahim Byagowi +Date: Wed Dec 5 13:25:18 2018 +0330 + + Merge pull request #1449 from harfbuzz/cff-fixcharset + + [CFF] fix for oss-fuzz 11657: Charset overrun + +commit cf4b7db6b1e01c11d7a8a26d95cf947935a234a7 +Merge: 32cc46c7 803d2f92 +Author: Ebrahim Byagowi +Date: Wed Dec 5 13:23:23 2018 +0330 + + Merge pull request #1448 from harfbuzz/cff-leak + + [CFF] fix leak: oss-fuzz 11662 + +commit 620d1ef588c6ce25644891cfe4b9c20fd8a9d1db +Author: Michiharu Ariza +Date: Wed Dec 5 00:36:11 2018 -0800 + + fix unsigned long const + + src/hb-cff-interp-dict-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 28dfb4c14280b05ad0a519f9df2b0eda41a62540 +Author: Michiharu Ariza +Date: Wed Dec 5 00:26:03 2018 -0800 + + fix signed/unsigned comparison + + src/hb-cff-interp-dict-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f9cee08edd32182044407bf6ffde00df0feb09b7 +Author: Michiharu Ariza +Date: Tue Dec 4 23:58:26 2018 -0800 + + use sized int types in parse_bcd + + src/hb-cff-interp-dict-common.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit c01a5f32a33fa875de68ca29a4672fd36a05245b +Author: Michiharu Ariza +Date: Tue Dec 4 23:23:23 2018 -0800 + + refix + + src/hb-cff-interp-dict-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 755fefc92113e469a1aadee2546958fede156c01 +Author: Michiharu Ariza +Date: Tue Dec 4 23:18:28 2018 -0800 + + fix bug + + src/hb-cff-interp-dict-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0e81b153aff1f2e301e73ca1a15a9bc5b2e7bb82 +Author: Michiharu Ariza +Date: Tue Dec 4 22:40:07 2018 -0800 + + fix typo + + src/hb-cff-interp-dict-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 85d4b15cd88ce9a6ffccccf90300f9c184166058 +Author: Michiharu Ariza +Date: Tue Dec 4 22:30:33 2018 -0800 + + include float.h + + src/hb-cff-interp-dict-common.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 5a7c371e4c6f1775ebbfe120fafe92afe402a954 +Author: Michiharu Ariza +Date: Tue Dec 4 22:24:38 2018 -0800 + + check overflow & clamp + + src/hb-cff-interp-dict-common.hh | 36 + +++++++++++++++++++++++++++--------- + 1 file changed, 27 insertions(+), 9 deletions(-) + +commit 32cc46c75a5f163f254b7998ed9193d5bbc85e4b +Author: Michiharu Ariza +Date: Tue Dec 4 21:32:34 2018 -0800 + + [CFF] fix oss-fuzz issue 11670: NULL dereference (#1450) + + * guard against no subr access + + * code tweak + + * add minimized testcase for oss-fuzz 11670 (Null deference) + + src/hb-cff-interp-cs-common.hh | 22 + ++++++++++++++++----- + src/hb-ot-cff-common.hh | 2 +- + ...ase-minimized-hb-subset-fuzzer-5672913680728064 | Bin 0 -> 861 bytes + 3 files changed, 18 insertions(+), 6 deletions(-) + +commit 78f639b8bf508ccfb27224f12442f8e8a1460e08 +Author: Michiharu Ariza +Date: Tue Dec 4 14:17:03 2018 -0800 + + added minimized testcase for oss-fuzz issue 11657 + + ...zz-testcase-minimized-hb-shape-fuzzer-5700264032468992 | Bin 0 -> + 648 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit d3d2f32c6e85de1d7fbbb18afef356e09110e61c +Author: Michiharu Ariza +Date: Tue Dec 4 13:51:26 2018 -0800 + + fix oss-fuzz 11657: buffer overrun + + Check overrun in Charset1_2::get_glyph + + src/hb-ot-cff1-table.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit d0a250a7b15f1099c2005bc2427d62e7370dcc33 +Author: Ebrahim Byagowi +Date: Tue Dec 4 23:42:13 2018 +0330 + + Reuse hb_aat_layout_has_* logic in coretext-aat detection logic + (#1442) + + src/hb-coretext.cc | 16 ++-------------- + 1 file changed, 2 insertions(+), 14 deletions(-) + +commit 803d2f92dca329a84d92c224a73e13906e8b8d56 +Merge: 6ce8d10b c775adc1 +Author: Michiharu Ariza +Date: Tue Dec 4 11:01:26 2018 -0800 + + Merge branch 'master' into cff-leak + +commit 6ce8d10b45598f5f6dade38e65486f793f33d0b6 +Author: Michiharu Ariza +Date: Tue Dec 4 10:39:17 2018 -0800 + + add unlikely to error handling + + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit b61f74f69a84f427b40deefefed429fbc915981c +Author: Michiharu Ariza +Date: Tue Dec 4 10:30:35 2018 -0800 + + added minimized test case for oss-fuzz issue 11662 + + ...testcase-minimized-hb-shape-fuzzer-5175735354916864 | Bin 0 -> + 354461 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 0b952e6026c8be13d16d97f464034ee477e6282f +Author: Michiharu Ariza +Date: Tue Dec 4 10:22:35 2018 -0800 + + more leak fixes + + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit c775adc1383f72f02b1329628b3eba1dc377a0f7 +Merge: c968869f 04f2ca94 +Author: Ebrahim Byagowi +Date: Tue Dec 4 21:30:07 2018 +0330 + + Merge pull request #1444 from harfbuzz/cff-assert + + removed assert, fixes https://github.com/harfbuzz/harfbuzz/issues/1443 + +commit 9473463f5c884fcb1de8a7ba7410da2601e6ffa8 +Author: Michiharu Ariza +Date: Tue Dec 4 09:58:48 2018 -0800 + + fix attempt for oss-fuzz 11662 leak + + src/hb-ot-cff1-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 04f2ca94212983d675ed2cd36350be23ff2a6e19 +Author: Michiharu Ariza +Date: Tue Dec 4 09:24:07 2018 -0800 + + removed assert + + src/hb-ot-cff1-table.hh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit c968869f212dbfcb86d42fb36049328521cbf00c +Merge: 8c05b955 c48f53d3 +Author: Behdad Esfahbod +Date: Tue Dec 4 04:14:13 2018 -0500 + + Merge pull request #1441 from harfbuzz/cff-doublenum + + use double as CFF Number implementation + +commit c48f53d30901dfc20b7432c2947e66642010dc4e +Author: Michiharu Ariza +Date: Mon Dec 3 16:59:41 2018 -0800 + + more double changes + + src/hb-cff2-interp-cs.hh | 4 ++-- + test/api/test-ot-extents-cff.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 9424e8052686a6a93e0d30e38aecbe927db9d787 +Author: Michiharu Ariza +Date: Mon Dec 3 16:18:10 2018 -0800 + + added minimized test cases + + ...zz-testcase-minimized-hb-shape-fuzzer-5647267827023872 | Bin 0 -> + 655 bytes + ...zz-testcase-minimized-hb-shape-fuzzer-5725855502827520 | Bin 0 -> + 655 bytes + ...zz-testcase-minimized-hb-shape-fuzzer-5736657639178240 | Bin 0 -> + 459 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 5fff6ab0024547a8ac47723a0047f4b17416d6ce +Author: Michiharu Ariza +Date: Mon Dec 3 16:06:58 2018 -0800 + + additional precision made a difference in extents test + + src/hb-cff-interp-common.hh | 2 +- + src/hb-cff2-interp-cs.hh | 2 +- + test/api/test-ot-extents-cff.c | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 9e5180cd444b6900a0fa0c3df4c8138f9a663383 +Author: Michiharu Ariza +Date: Mon Dec 3 15:32:42 2018 -0800 + + more double changes + + src/hb-cff-interp-common.hh | 8 ++++---- + src/hb-cff-interp-dict-common.hh | 10 +++++----- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit 9af33d7a2ad5ce88fc508bc5c6a56be4650d2621 +Author: Michiharu Ariza +Date: Mon Dec 3 14:48:46 2018 -0800 + + Number to use double for all types + + src/hb-cff-interp-common.hh | 84 + +++++++-------------------------------------- + 1 file changed, 13 insertions(+), 71 deletions(-) + +commit 8c05b955eb4aa088b2b5df9b6415863486eaf59c +Merge: d19b1680 01f628cf +Author: Behdad Esfahbod +Date: Mon Dec 3 14:30:51 2018 -0500 + + Merge pull request #1439 from ebraminio/tracking + + [aat] Expose hb_aat_layout_has_tracking API + +commit 01f628cf5571b8b58108ab66cfc3e929c9840e31 +Author: Ebrahim Byagowi +Date: Mon Dec 3 22:04:48 2018 +0330 + + [aat] Expose hb_aat_layout_has_tracking API + + docs/harfbuzz-sections.txt | 7 ++++--- + src/hb-aat-layout.cc | 9 ++++++++- + src/hb-aat-layout.h | 8 ++++++++ + src/hb-aat-layout.hh | 3 --- + test/api/fonts/aat-morx.ttf | Bin 0 -> 1620 bytes + test/api/fonts/aat-trak.ttf | Bin 0 -> 2456 bytes + test/api/test-aat-layout.c | 13 +++++++++++++ + 7 files changed, 33 insertions(+), 7 deletions(-) + +commit d19b1680b53e54f449736432f369a676c394ebf8 +Author: Behdad Esfahbod +Date: Mon Dec 3 10:41:37 2018 -0500 + + [aat] Expose a couple APIs + + New API: + +hb_aat_layout_has_substitution() + +hb_aat_layout_has_positioning() + + docs/harfbuzz-sections.txt | 2 ++ + src/hb-aat-layout.cc | 20 ++++++++++++++++---- + src/hb-aat-layout.h | 16 ++++++++++++++++ + src/hb-aat-layout.hh | 6 ------ + 4 files changed, 34 insertions(+), 10 deletions(-) + +commit 84efe0438e1cfc5b070e114b70e8c070be6119ca +Author: Behdad Esfahbod +Date: Sun Dec 2 12:38:53 2018 -0500 + + [aat] Fix division sign fallout + + Happened after 11d2f49af8f53340134c844173f4d8655b00dea3 + since now nClasses is unsigned int... + + src/hb-aat-layout-common.hh | 2 +- + ...zz-testcase-minimized-hb-shape-fuzzer-5768046065483776 | Bin 0 -> + 342 bytes + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 2087f5a2a743380b36399ba8a2b4ff9e93890fcf +Author: Behdad Esfahbod +Date: Sat Dec 1 20:04:45 2018 -0500 + + Add casts to hb_array_t<> + + src/hb-open-type.hh | 13 ++++++++++--- + src/hb-vector.hh | 2 ++ + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 58d4d19947794aded4e966290b01e1034f216a7d +Author: Behdad Esfahbod +Date: Sat Dec 1 19:34:18 2018 -0500 + + Simplify build source list + + CMakeLists.txt | 12 +-- + src/Makefile.am | 6 -- + src/Makefile.sources | 231 + ++++++++++++++++++++++++--------------------------- + 3 files changed, 111 insertions(+), 138 deletions(-) + +commit 967a204ee92548163a0d19678a237dcaf3720c20 +Author: Behdad Esfahbod +Date: Sat Dec 1 19:28:17 2018 -0500 + + Minor + + test/api/hb-subset-test.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 11d2f49af8f53340134c844173f4d8655b00dea3 +Author: Behdad Esfahbod +Date: Sat Dec 1 13:12:21 2018 -0500 + + New approach to change BigEndian casts to be int-sized + + Fixes spurious warnings like: + Fixes https://github.com/harfbuzz/harfbuzz/issues/1436 + + src/hb-open-type.hh | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 50e0273ab18acd2fbb21bcf18ad487092e890b4e +Author: Behdad Esfahbod +Date: Sat Dec 1 13:03:52 2018 -0500 + + Change hb_assert_unsigned_t<> to hb_is_signed<> + + src/hb-dsalgs.hh | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit c3a8b047aab47e40dc107a952b3a1472068ec932 +Author: Behdad Esfahbod +Date: Sat Dec 1 00:14:48 2018 -0500 + + Revert "Change BigEndian casts to be int-sized" + + This reverts commit eb5ddd32bf4e458ca0af8d5784f8fd46485ad225. + + Broke tests, badly. To be investigated and reenabled. + + src/hb-open-type.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit be45677ab605efc711a433323d66e4051c289252 +Author: Behdad Esfahbod +Date: Sat Dec 1 00:04:29 2018 -0500 + + Minor + + src/hb-ot-layout-gsub-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eb5ddd32bf4e458ca0af8d5784f8fd46485ad225 +Author: Behdad Esfahbod +Date: Sat Dec 1 00:03:01 2018 -0500 + + Change BigEndian casts to be int-sized + + Fixes spurious warnings like: + Fixes https://github.com/harfbuzz/harfbuzz/issues/1436 + + src/hb-open-type.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit e8860fdcaa69e3452edd903f78599bc8fa9d109c +Author: Behdad Esfahbod +Date: Fri Nov 30 23:38:24 2018 -0500 + + Fix more warning + + src/hb-ot-cff-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit af349ee3487b31c2328f0a37a43d31b248ed14e5 +Author: Behdad Esfahbod +Date: Fri Nov 30 23:20:50 2018 -0500 + + Fix warning + + src/hb-ot-cff-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 825df6dbc7fd013c68d7b5672f81e69b69bc14e7 +Author: Behdad Esfahbod +Date: Fri Nov 30 23:04:59 2018 -0500 + + [CFF] Change spaces to tabs + + src/hb-cff-interp-common.hh | 389 ++++++++++++++++----------------- + src/hb-cff-interp-cs-common.hh | 324 ++++++++++++++-------------- + src/hb-cff-interp-dict-common.hh | 190 ++++++++-------- + src/hb-cff1-interp-cs.hh | 72 +++---- + src/hb-cff2-interp-cs.hh | 76 +++---- + src/hb-ot-cff-common.hh | 128 +++++------ + src/hb-ot-cff1-table.cc | 4 +- + src/hb-ot-cff1-table.hh | 456 + +++++++++++++++++++-------------------- + src/hb-ot-cff2-table.cc | 4 +- + src/hb-ot-cff2-table.hh | 216 +++++++++---------- + src/hb-subset-cff-common.cc | 76 +++---- + src/hb-subset-cff-common.hh | 384 ++++++++++++++++----------------- + src/hb-subset-cff1.cc | 416 + +++++++++++++++++------------------ + src/hb-subset-cff1.hh | 2 +- + src/hb-subset-cff2.cc | 240 ++++++++++----------- + src/hb-subset-cff2.hh | 2 +- + 16 files changed, 1492 insertions(+), 1487 deletions(-) + +commit 592f39b3c4ed04a6f6cf129020358e64782c7108 +Author: Behdad Esfahbod +Date: Fri Nov 30 22:54:57 2018 -0500 + + [CFF] Whitespace + + src/hb-cff-interp-common.hh | 7 +++---- + src/hb-cff-interp-cs-common.hh | 6 +++--- + src/hb-cff-interp-dict-common.hh | 6 +++--- + src/hb-cff2-interp-cs.hh | 2 +- + src/hb-ot-cff-common.hh | 12 ++++++------ + src/hb-ot-cff1-table.hh | 30 +++++++++++++++--------------- + src/hb-ot-cff2-table.hh | 12 ++++++------ + src/hb-subset-cff-common.cc | 8 ++++---- + src/hb-subset-cff-common.hh | 34 +++++++++++++++++----------------- + src/hb-subset-cff1.cc | 20 ++++++++++---------- + src/hb-subset-cff2.cc | 18 +++++++++--------- + 11 files changed, 77 insertions(+), 78 deletions(-) + +commit a2e8d1d455c5d0ae22927567cf8a9a2539cd3470 +Author: Behdad Esfahbod +Date: Fri Nov 30 22:54:20 2018 -0500 + + Minor + + src/Makefile.sources | 27 +++++++++++++-------------- + 1 file changed, 13 insertions(+), 14 deletions(-) + +commit e3dc47c6357813d2dd098aad312d79e9d7c2aa18 +Author: Behdad Esfahbod +Date: Fri Nov 30 22:43:22 2018 -0500 + + Remove generated files that were accidentally added by CFF2 branch + + gtk-doc.make | 320 -- + m4/libtool.m4 | 8369 + ----------------------------------------------------- + m4/ltoptions.m4 | 437 --- + m4/ltsugar.m4 | 124 - + m4/ltversion.m4 | 23 - + m4/lt~obsolete.m4 | 99 - + 6 files changed, 9372 deletions(-) + +commit 5e64e0f53259dbc0a3ea8e220ded15e85bbc1782 +Merge: 09096aa8 d8c69137 +Author: Behdad Esfahbod +Date: Fri Nov 30 22:40:54 2018 -0500 + + Merge pull request #1113 from harfbuzz/cff-subset + + CFF/CFF2 subsetter + +commit 09096aa89f1944dff94a5518bce578eba8989e74 +Author: Bruce Mitchener +Date: Sat Dec 1 10:22:49 2018 +0700 + + Use nullptr instead of 0/NULL. (#1435) + + * Use nullptr instead of 0/NULL. + + * Update test-name-table.cc + + src/hb-debug.hh | 2 +- + src/test-name-table.cc | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit d8c69137655fbe9678d1dfef0eb3c4172f8bbfc0 +Author: Michiharu Ariza +Date: Fri Nov 30 18:58:14 2018 -0800 + + undo 0u + + src/hb-cff2-interp-cs.hh | 2 +- + src/hb-ot-cff1-table.hh | 4 ++-- + src/hb-ot-vorg-table.hh | 2 +- + src/hb-subset-cff-common.hh | 4 ++-- + src/hb-subset-cff1.cc | 4 ++-- + 5 files changed, 8 insertions(+), 8 deletions(-) + +commit 2c859b3880868b30823eb00bed90dc0de873628b +Merge: 9483da14 bb72de66 +Author: Michiharu Ariza +Date: Fri Nov 30 18:47:34 2018 -0800 + + Merge branch 'master' into cff-subset + +commit bb72de66ddf3ae9ae53cf68642cb228e88aa64f5 +Merge: fedd8e6c fb059082 +Author: Behdad Esfahbod +Date: Fri Nov 30 21:36:35 2018 -0500 + + Merge pull request #1433 from harfbuzz/overload-overload + + Fix ambiguous overload errors with old compilers + +commit fb059082138bf17a5a8616410d9a35f927f9fd85 +Author: Behdad Esfahbod +Date: Fri Nov 30 20:45:40 2018 -0500 + + Revert ugly fixes + + Now that we have 6daf45e0, revert cryptic hacks... + + This reverts commit abd81ed4f5cbc5a94171747909bc6b77551cb929. + This reverts commit 9c6921c08c905a0cf45ba0182134e6ff910fac51. + This reverts commit d39760cabfe4007cefdfc45231e85e93fababac2. + This reverts commit fedd8e6c176dea85194693399e50243eb1c117c4. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1374 + + src/hb-aat-layout-morx-table.hh | 4 ++-- + src/hb-face.cc | 4 ++-- + src/hb-machinery.hh | 4 ++-- + src/hb-ot-color-cpal-table.hh | 2 +- + src/hb-ot-kern-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 32 ++++++++++++++++---------------- + src/hb-ot-layout-gsubgpos.hh | 14 +++++++------- + 7 files changed, 31 insertions(+), 31 deletions(-) + +commit dfad19ad5aefdacecca6af81917abc2670d4416f +Author: Behdad Esfahbod +Date: Fri Nov 30 19:57:12 2018 -0500 + + Make operator [] take signed int + + The built-in operator takes signed int. So, match it, such that + the built-in is never a better or equally-good match to our operator. + Fixes "ambiguous overload" errors from gcc 4.2 and VS 2008. + + See https://github.com/harfbuzz/harfbuzz/issues/1374 + + src/hb-dsalgs.hh | 3 ++- + src/hb-open-type.hh | 42 ++++++++++++++++++++++++++++-------------- + src/hb-vector.hh | 6 ++++-- + 3 files changed, 34 insertions(+), 17 deletions(-) + +commit 9483da145d6da1bdfa3224fe13a5b4e9b449d19f +Author: Michiharu Ariza +Date: Fri Nov 30 16:59:41 2018 -0800 + + redo fixes + + src/hb-cff2-interp-cs.hh | 2 +- + src/hb-ot-cff1-table.hh | 4 ++-- + src/hb-subset-cff-common.hh | 6 +++--- + src/hb-subset-cff1.cc | 4 ++-- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit 291da448237cdc0b5534fbc1ce2288e1aa8e7b8a +Author: Michiharu Ariza +Date: Fri Nov 30 16:50:46 2018 -0800 + + yet another + + src/hb-subset-cff-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b1821b9d092e4fd7fd888f4bffc341283bace461 +Author: Michiharu Ariza +Date: Fri Nov 30 16:31:01 2018 -0800 + + some more + + src/hb-subset-cff-common.hh | 4 ++-- + src/hb-subset-cff1.cc | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 9784cff55688d1ee93275e39c2339d5a486ed78b +Author: Michiharu Ariza +Date: Fri Nov 30 16:07:08 2018 -0800 + + fix another pesky gcc error + + src/hb-cff2-interp-cs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 23a797b44365ed76fc7db25be13bd9c3580a8695 +Author: Michiharu Ariza +Date: Fri Nov 30 15:15:31 2018 -0800 + + silence picky gcc errors + + src/hb-ot-cff1-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9ae954f43ad1eb703d54db98ce46157370b71a9c +Merge: 471db3aa fedd8e6c +Author: Michiharu Ariza +Date: Fri Nov 30 15:00:52 2018 -0800 + + Merge branch 'master' into cff-subset + +commit fedd8e6c176dea85194693399e50243eb1c117c4 +Author: Behdad Esfahbod +Date: Fri Nov 30 16:50:30 2018 -0500 + + One more......... + + I wonder if there's something better to do about these :(. + + In file included from hb-ot-color.cc:31: + hb-ot-color-cpal-table.hh: In member function 'unsigned int + OT::CPAL::get_size() const': + hb-ot-color-cpal-table.hh:118: error: ISO C++ says that these are + ambiguous, even though the worst conversion for the first is better + than the worst conversion for the second: + + src/hb-ot-color-cpal-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bc5db9b0807767ac04d6e50070d69cb9c520f06e +Author: Behdad Esfahbod +Date: Fri Nov 30 16:04:52 2018 -0500 + + One more.... + + hb-ot-vorg-table.hh:96: error: ISO C++ says that these are ambiguous, + even though the worst conversion for the first is better than the + worst conversion for the second: + hb-vector.hh:87: note: candidate 1: const Type& hb_vector_t::operator[](unsigned int) const [with Type = + OT::VertOriginMetric, unsigned int PreallocedCount = 8u] + hb-ot-vorg-table.hh:96: note: candidate 2: operator[](const T*, + int) + + src/hb-ot-vorg-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d39760cabfe4007cefdfc45231e85e93fababac2 +Author: Behdad Esfahbod +Date: Fri Nov 30 15:55:30 2018 -0500 + + One more... + + Sigh. + + hb-ot-kern-table.hh: In member function 'int + OT::KernSubTableFormat3::get_kerning(hb_codepoint_t, + hb_codepoint_t) const': + hb-ot-kern-table.hh:59: error: ambiguous overload for 'operator[]' + in 'kernValue[kernIndex[i]]' + hb-ot-kern-table.hh:59: note: candidates are: operator[](T*, int) + + hb-dsalgs.hh:574: note: Type& + hb_array_t::operator[](unsigned int) const [with Type = const + OT::IntType] + + src/hb-ot-kern-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9c6921c08c905a0cf45ba0182134e6ff910fac51 +Author: Behdad Esfahbod +Date: Fri Nov 30 15:16:57 2018 -0500 + + More... + + hb-ot-layout-gsubgpos.hh:1707: error: ISO C++ says that these are + ambiguous, even though the worst conversion for the first is better + than the worst conversion for the second: + ... + + src/hb-aat-layout-morx-table.hh | 4 ++-- + src/hb-ot-layout-gpos-table.hh | 32 ++++++++++++++++---------------- + src/hb-ot-layout-gsubgpos.hh | 16 ++++++++-------- + 3 files changed, 26 insertions(+), 26 deletions(-) + +commit f998bb2086342d6fdcd4295593eddea91396e0b6 +Author: Behdad Esfahbod +Date: Fri Nov 30 12:52:21 2018 -0500 + + More weird fixes + + In file included from hb-ot-name.cc:29: + hb-ot-name-table.hh: In member function 'unsigned int + OT::name::get_size() const': + hb-ot-name-table.hh:157: error: ISO C++ says that these are ambiguous, + even though the worst conversion for the first is better than the + worst conversion for the second: + hb-open-type.hh:354: note: candidate 1: const Type& + OT::UnsizedArrayOf::operator[](unsigned int) const [with Type + = OT::NameRecord] + hb-ot-name-table.hh:157: note: candidate 2: operator[](const T*, + int) + hb-ot-name-table.hh: In member function 'void + OT::name::accelerator_t::init(hb_face_t*)': + hb-ot-name-table.hh:196: error: ISO C++ says that these are ambiguous, + even though the worst conversion for the first is better than the + worst conversion for the second: + hb-dsalgs.hh:574: note: candidate 1: Type& + hb_array_t::operator[](unsigned int) const [with Type = + const OT::NameRecord] + hb-ot-name-table.hh:196: note: candidate 2: operator[](T*, int) + + hb-ot-name-table.hh:197: error: ISO C++ says that these are ambiguous, + even though the worst conversion for the first is better than the + worst conversion for the second: + hb-dsalgs.hh:574: note: candidate 1: Type& + hb_array_t::operator[](unsigned int) const [with Type = + const OT::NameRecord] + hb-ot-name-table.hh:197: note: candidate 2: operator[](T*, int) + + hb-ot-name-table.hh:198: error: ISO C++ says that these are ambiguous, + even though the worst conversion for the first is better than the + worst conversion for the second: + hb-dsalgs.hh:574: note: candidate 1: Type& + hb_array_t::operator[](unsigned int) const [with Type = + const OT::NameRecord] + hb-ot-name-table.hh:198: note: candidate 2: operator[](T*, int) + + make[4]: *** [libharfbuzz_la-hb-ot-name.lo] Error 1 + make[3]: *** [all-recursive] Error 1 + + src/hb-ot-name-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 67fd94da98f950b5feb719ac805f2a45379fc935 +Merge: abd81ed4 ae79fdaa +Author: Behdad Esfahbod +Date: Fri Nov 30 11:53:30 2018 -0500 + + Merge commit 'ae79fdaa7774d3f886a8f03926577c3bd2010b03' + +commit abd81ed4f5cbc5a94171747909bc6b77551cb929 +Author: Behdad Esfahbod +Date: Fri Nov 30 11:51:26 2018 -0500 + + Umm. Cryptic, yes + + In file included from hb-face.cc:35: + hb-ot-cmap-table.hh: In member function 'void + OT::CmapSubtableFormat4::_compiles_assertion_on_line_388() const': + hb-ot-cmap-table.hh:388: error: ISO C++ says that these are ambiguous, + even though the worst conversion for the first is better than the + worst conversion for the second: + hb-open-type.hh:354: note: candidate 1: const Type& + OT::UnsizedArrayOf::operator[](unsigned int) const [with Type = + OT::IntType] + hb-ot-cmap-table.hh:388: note: candidate 2: operator[](const T*, + int) + hb-ot-cmap-table.hh: In member function 'void + OT::CmapSubtableFormat4::_instance_assertion_on_line_388() const': + hb-ot-cmap-table.hh:388: error: ISO C++ says that these are ambiguous, + even though the worst conversion for the first is better than the + worst conversion for the second: + hb-open-type.hh:354: note: candidate 1: const Type& + OT::UnsizedArrayOf::operator[](unsigned int) const [with Type = + OT::IntType] + hb-ot-cmap-table.hh:388: note: candidate 2: operator[](const T*, + int) + hb-face.cc: In function 'hb_blob_t* + _hb_face_builder_data_reference_blob(hb_face_builder_data_t*)': + hb-face.cc:650: error: ISO C++ says that these are ambiguous, even + though the worst conversion for the first is better than the worst + conversion for the second: + hb-vector.hh:81: note: candidate 1: Type& hb_vector_t::operator[](unsigned int) [with Type = + hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount + = 32u] + hb-face.cc:650: note: candidate 2: operator[](T*, int) + hb-face.cc:650: error: ISO C++ says that these are ambiguous, even + though the worst conversion for the first is better than the worst + conversion for the second: + hb-vector.hh:81: note: candidate 1: Type& hb_vector_t::operator[](unsigned int) [with Type = + hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount + = 32u] + hb-face.cc:650: note: candidate 2: operator[](const T*, int) + + hb-face.cc:651: error: ISO C++ says that these are ambiguous, even + though the worst conversion for the first is better than the worst + conversion for the second: + hb-vector.hh:81: note: candidate 1: Type& hb_vector_t::operator[](unsigned int) [with Type = + hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount + = 32u] + hb-face.cc:651: note: candidate 2: operator[](T*, int) + hb-face.cc:651: error: ISO C++ says that these are ambiguous, even + though the worst conversion for the first is better than the worst + conversion for the second: + hb-vector.hh:81: note: candidate 1: Type& hb_vector_t::operator[](unsigned int) [with Type = + hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount + = 32u] + hb-face.cc:651: note: candidate 2: operator[](const T*, int) + + + src/hb-face.cc | 4 ++-- + src/hb-machinery.hh | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit ae79fdaa7774d3f886a8f03926577c3bd2010b03 +Author: Behdad Esfahbod +Date: Fri Nov 30 11:51:26 2018 -0500 + + Umm. Cryptic, yes + + hb-face.cc:650: error: ISO C++ says that these are ambiguous, even + though the worst conversion for the first is better than the worst + conversion for the second: + hb-vector.hh:81: note: candidate 1: Type& hb_vector_t::operator[](unsigned int) [with Type = + hb_face_builder_data_t::table_entry_t, unsigned int PreallocedCount + = 32u] + hb-face.cc:650: note: candidate 2: operator[](T*, int) + + src/hb-face.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0f32c95e1487ffcc37439635c3294f941eae857a +Author: Behdad Esfahbod +Date: Fri Nov 30 11:31:39 2018 -0500 + + Fix a few more sizeof(vector[0]) errors with weird compilers + + src/hb-face.cc | 4 ++-- + src/hb-set.hh | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 88630a458b21b811075bed9e761a94c50736dc11 +Author: Behdad Esfahbod +Date: Fri Nov 30 01:11:04 2018 -0500 + + Fix build for realz + + src/hb-ot-deprecated.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 346286d04eb616c43ba8c796211fa2e5e7bf1983 +Author: Behdad Esfahbod +Date: Fri Nov 30 00:44:40 2018 -0500 + + Fix build + + src/hb-ot-deprecated.h | 1 + + 1 file changed, 1 insertion(+) + +commit 31f39cb41e1497a76c5838c93f9b4034089049f2 +Author: Behdad Esfahbod +Date: Fri Nov 30 00:38:08 2018 -0500 + + [post] Rename v2 to v2X + + src/hb-ot-post-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit e3dd47e6025a7f082af4830ba483d90d9b44381f +Author: Behdad Esfahbod +Date: Fri Nov 30 00:32:12 2018 -0500 + + Move things + + src/Makefile.sources | 1 + + src/hb-deprecated.h | 61 +--------------------------- + src/hb-ot-deprecated.h | 106 + +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot.h | 1 + + 4 files changed, 109 insertions(+), 60 deletions(-) + +commit 27a6b0a2f7255ed6fc7bfe1f10052c2e344e319b +Author: Behdad Esfahbod +Date: Thu Nov 29 16:29:30 2018 -0500 + + Fix build for realz + + src/hb-coretext.cc | 2 +- + src/hb-uniscribe.cc | 10 +++++----- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit e2af4dd1ecbe398c60fe5f3f370dd35400d7e1eb +Author: Behdad Esfahbod +Date: Thu Nov 29 16:03:15 2018 -0500 + + [uniscribe] Fix build + + src/hb-uniscribe.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bf738ba3ba80778c7feb95ece446607a250d9382 +Author: Ebrahim Byagowi +Date: Fri Nov 30 00:06:40 2018 +0330 + + [test][aat] Remove extra --shaper ot + + As run-tests.py already adds it + + test/shaping/data/in-house/tests/macos.tests | 64 + ++++++++++++++-------------- + 1 file changed, 32 insertions(+), 32 deletions(-) + +commit b65645bbafb3f1f9f956df3028cf4479a4bdc265 +Author: Ebrahim Byagowi +Date: Thu Nov 29 23:57:50 2018 +0330 + + [ci] Re-enable llvm-gcc-4.2 bots (#1429) + + .circleci/config.yml | 48 + ++++++++++++++++++++++++------------------------ + 1 file changed, 24 insertions(+), 24 deletions(-) + +commit e7bd29ea11bd6301a332b471120a4a2cd8575d09 +Author: Ebrahim Byagowi +Date: Thu Nov 29 23:47:20 2018 +0330 + + Limit __builtin_bswap16 to GCC >= 5 as it was implemented on 4.8 + + src/hb-machinery.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ac0264717b949df8840b179d882a9bed2993fb74 +Author: Behdad Esfahbod +Date: Thu Nov 29 15:07:44 2018 -0500 + + [coretext] Fix compile + + Fingers crossed. + + src/hb-coretext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5c4fead734b082e0168e6811bec4bcaa19acc36a +Author: Behdad Esfahbod +Date: Thu Nov 29 15:04:34 2018 -0500 + + Convert "static const hb_tag_t" constants to enum + + src/hb-aat-layout-ankr-table.hh | 2 +- + src/hb-aat-layout-bsln-table.hh | 2 +- + src/hb-aat-layout-feat-table.hh | 2 +- + src/hb-aat-layout-just-table.hh | 2 +- + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-aat-layout-lcar-table.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 6 +++--- + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-aat-ltag-table.hh | 2 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-color-cbdt-table.hh | 4 ++-- + src/hb-ot-color-colr-table.hh | 2 +- + src/hb-ot-color-cpal-table.hh | 2 +- + src/hb-ot-color-sbix-table.hh | 2 +- + src/hb-ot-color-svg-table.hh | 2 +- + src/hb-ot-glyf-table.hh | 4 ++-- + src/hb-ot-hdmx-table.hh | 2 +- + src/hb-ot-head-table.hh | 2 +- + src/hb-ot-hhea-table.hh | 4 ++-- + src/hb-ot-hmtx-table.hh | 14 +++++++------- + src/hb-ot-kern-table.hh | 6 +++--- + src/hb-ot-layout-base-table.hh | 2 +- + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-ot-layout-jstf-table.hh | 2 +- + src/hb-ot-math-table.hh | 2 +- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-os2-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-ot-stat-table.hh | 2 +- + src/hb-ot-var-avar-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 2 +- + src/hb-ot-var-hvar-table.hh | 8 ++++---- + src/hb-ot-var-mvar-table.hh | 2 +- + src/hb-ot-vorg-table.hh | 2 +- + 37 files changed, 53 insertions(+), 53 deletions(-) + +commit 9e4138c82548c2b29a1ae8801d2c6c7c1f1a9c7a +Author: Behdad Esfahbod +Date: Thu Nov 29 15:01:10 2018 -0500 + + Convert misc "static const" constants to enum + + src/hb-aat-layout-kerx-table.hh | 4 ++-- + src/hb-map.hh | 2 +- + src/hb-ot-kern-table.hh | 4 ++-- + src/hb-set-digest.hh | 14 +++++++------- + 4 files changed, 12 insertions(+), 12 deletions(-) + +commit 44cbd2ea3dc36312bd80860983b6616586e78c6c +Author: Behdad Esfahbod +Date: Thu Nov 29 14:53:43 2018 -0500 + + Convert "static const bool" constants to anonymous enum + + src/hb-aat-layout-common.hh | 4 ++-- + src/hb-aat-layout-kerx-table.hh | 4 ++-- + src/hb-aat-layout-morx-table.hh | 8 ++++---- + src/hb-dsalgs.hh | 16 ++++++++-------- + src/hb-ot-kern-table.hh | 4 ++-- + src/hb-ot-layout.cc | 4 ++-- + 6 files changed, 20 insertions(+), 20 deletions(-) + +commit 861bc75349257f74c12b261abfcd5ab9e2f04863 +Author: Behdad Esfahbod +Date: Thu Nov 29 14:34:44 2018 -0500 + + [vector] Make pointer cast explicit + + Too bad this doesn't help MSVC 2008 build, as explicit operators are + C++11. + + src/hb-machinery.hh | 2 +- + src/hb-ot-cmap-table.hh | 3 ++- + src/hb-set.hh | 4 ++-- + src/hb-subset.cc | 2 +- + src/hb-vector.hh | 4 ++-- + 5 files changed, 8 insertions(+), 7 deletions(-) + +commit 72955e68256806f082439d65e6f9b5cf2e35fa8a +Author: Behdad Esfahbod +Date: Thu Nov 29 14:28:44 2018 -0500 + + Hand-hold older compilers + + src/hb-set.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1a182e97ee71de0e78a70ff823ae17fa93a31830 +Author: Behdad Esfahbod +Date: Thu Nov 29 12:39:52 2018 -0500 + + [test/text-rendering-tests] Update from upstream + + .../text-rendering-tests/fonts/TestGVAR-Composite-0.ttf | Bin 0 -> + 3136 bytes + .../fonts/TestGVAR-Composite-Missing.ttf | Bin 0 -> + 2984 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 000d4b128eba58677acdc3b361829ff2f9a257b1 +Author: Behdad Esfahbod +Date: Thu Nov 29 12:32:47 2018 -0500 + + Make shaper's override_features() override user features as well + + The override_features is used to override features that are normally + discretionary features, but in a specific shaper are for various + reasons desired to be bolted on or off, because they've been used + for inherent shaping. As such, it makes sense that they also + override user features. Ie. if user turned 'liga' on, we don't + want Khmer shaping to become broken... Or turn 'clig' off... + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1310 + + src/hb-ot-shape.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a95d9d8c8465ebc927bc2194dffe4ea95542e54c +Author: Behdad Esfahbod +Date: Thu Nov 29 12:30:14 2018 -0500 + + [khmer] Move 'clig' to overrides + + Prerequisite for https://github.com/harfbuzz/harfbuzz/issues/1310 + + src/hb-ot-shape-complex-khmer.cc | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 282ce7230b8bd8ad65c408cdaf1499504038247d +Author: Behdad Esfahbod +Date: Thu Nov 29 12:18:14 2018 -0500 + + Fix "typename outside template" issues + + Nothing an extra template class wouldn't fix... + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1419 + + src/hb-null.hh | 25 +++++++++++++++++++------ + 1 file changed, 19 insertions(+), 6 deletions(-) + +commit dc41ecef85b094b30c612113606597b91c55351c +Author: Behdad Esfahbod +Date: Thu Nov 29 11:53:53 2018 -0500 + + 2.2.0 + + NEWS | 35 +++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + src/hb-aat-layout.cc | 6 +++--- + src/hb-aat-layout.h | 4 ++-- + src/hb-deprecated.h | 4 ++-- + src/hb-ot-var.cc | 8 ++++---- + src/hb-ot-var.h | 4 ++-- + src/hb-version.h | 6 +++--- + 8 files changed, 52 insertions(+), 17 deletions(-) + +commit 7b85081be4fbd6cad75dc28ae933ce920f71b22d +Author: Behdad Esfahbod +Date: Thu Nov 29 11:34:22 2018 -0500 + + [icu] Minor + + src/hb-icu.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0bcb1de1265368a27e53c6d935c965cbcb4130a0 +Merge: e0307de8 a85886fc +Author: Behdad Esfahbod +Date: Thu Nov 29 10:39:18 2018 -0500 + + Merge pull request #1418 from gvictor/replace_icu_deprecated + + Replace @Deprecated ICU API - USCRIPT_CODE_LIMIT + +commit e0307de818ad1f70ef96938642bda61d7a62532a +Author: Ebrahim Byagowi +Date: Thu Nov 29 11:36:05 2018 +0330 + + [test][aat.kern] More (#1427) + + test/shaping/data/in-house/tests/macos.tests | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 471db3aa6f963ecd4ebaf66daa81ef245d30d3b8 +Author: Michiharu Ariza +Date: Wed Nov 28 17:06:11 2018 -0800 + + workaround for issue #1417 + + src/hb-cff-interp-common.hh | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 32d291ae899eb095500052bed2a22e5255a34838 +Merge: 1ecbf4d3 949655aa +Author: Michiharu Ariza +Date: Wed Nov 28 16:27:45 2018 -0800 + + Merge branch 'master' into cff-subset + +commit 949655aa7853a4513af6b5247b9822be38f5d322 +Merge: 7b78d223 d3d0f15f +Author: Behdad Esfahbod +Date: Wed Nov 28 17:21:57 2018 -0500 + + Merge pull request #1425 from mbutterick/patch-1 + + update simple shaping example (closes #298) + +commit d3d0f15f7d20bedf7018fb2fb652f92ff4159bd7 +Author: Matthew Butterick +Date: Wed Nov 28 13:46:12 2018 -0800 + + update simple shaping example (closes #298) + + add call to `FT_Set_Char_Size`, otherwise default size remains at + `0`, and glyph positions come back as `0` too + + docs/usermanual-getting-started.xml | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7b78d2233df0e51e2967bc54a9202b3f9e05059a +Author: Ebrahim Byagowi +Date: Thu Nov 29 00:55:05 2018 +0330 + + [test][aat] Update expectency + + It is not visually noticeable but apparently affected by kern format2 + correct implementation. + I should've checked CoreText result which can't as CircleCI outage. + + test/shaping/data/in-house/tests/macos.tests | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5155067e10011f78f1ce35b3dadb062bccd3a706 +Author: Ebrahim Byagowi +Date: Thu Nov 29 00:07:00 2018 +0330 + + [test] Add test for format2 kern (#1423) + + test/shaping/data/in-house/Makefile.sources | 1 + + .../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf | Bin 0 -> + 34116 bytes + test/shaping/data/in-house/tests/kern-format2.tests | 3 +++ + 3 files changed, 4 insertions(+) + +commit 42a2b496e428521151ff5cb07454d2e993f892cc +Author: Behdad Esfahbod +Date: Wed Nov 28 15:24:30 2018 -0500 + + [kerx] Fix Format2 index calc again + + src/hb-aat-layout-common.hh | 14 ++++++++++++++ + src/hb-aat-layout-kerx-table.hh | 2 +- + 2 files changed, 15 insertions(+), 1 deletion(-) + +commit 9e4f03b6ed80a81f8aee5ba93564f5eabab4299c +Merge: 19863c80 a3267cf8 +Author: Behdad Esfahbod +Date: Wed Nov 28 15:08:01 2018 -0500 + + Merge remote-tracking branch 'fdo/master' + +commit a3267cf803082af157a7f2b0026af2633b14f8e3 +Author: Behdad Esfahbod +Date: Wed Nov 28 15:06:01 2018 -0500 + + [kern] Fix kern table Format2 offsetToIndex + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1421 + + src/hb-aat-layout-kerx-table.hh | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit f9a9c0fd1e561715d696c7bd840bab552d0718ee +Author: Behdad Esfahbod +Date: Wed Nov 28 14:51:56 2018 -0500 + + [kerx] Fix ClassTable implementation for 'kern' table Format 2 + + src/hb-aat-layout-common.hh | 8 +++++--- + src/hb-aat-layout-kerx-table.hh | 10 ++-------- + 2 files changed, 7 insertions(+), 11 deletions(-) + +commit 5b4a789ca857664668ff69936574dcd09bee6065 +Author: Behdad Esfahbod +Date: Wed Nov 28 14:46:26 2018 -0500 + + [aat] Towards adding two ClassTable's + + src/hb-aat-layout-common.hh | 40 ++++++++++++++++++++-------------------- + 1 file changed, 20 insertions(+), 20 deletions(-) + +commit 19863c805982d5d1d059d4dd9376039d3fdaabcd +Author: Ebrahim Byagowi +Date: Wed Nov 28 20:28:42 2018 +0330 + + [test][aat] Add a test and make macOS runners faster (#1422) + + .circleci/config.yml | 15 +++----- + test/shaping/data/in-house/tests/macos.tests | 54 + ++++++++++++++-------------- + 2 files changed, 33 insertions(+), 36 deletions(-) + +commit 987f4187722a05e3f360b85c66309a351fc5d6ad +Merge: 1042d9fb 4e2a03b6 +Author: Behdad Esfahbod +Date: Tue Nov 27 17:40:32 2018 -0500 + + Merge pull request #1398 from Adenilson/bigInt01 + + Optimize harfbuzz big integer conversions + +commit 4e2a03b6b6e0c0d1c4edea10dc1aae63eeb6c581 +Author: Behdad Esfahbod +Date: Tue Nov 27 17:40:09 2018 -0500 + + Comment + + src/hb-machinery.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4a719a7f4c997ea7e47588bc0288c97706dae015 +Author: Adenilson Cavalcanti +Date: Tue Nov 20 14:41:19 2018 -0800 + + Optimize harfbuzz big integer conversions + + Profiling showed that type conversions were adding considerable + cycles in time + spent doing text shaping. + + The idea is to optimize it using native processor instructions to + help Blink + layout performance. + + Doing further investigation revelead that compilers may not use the + proper instruction on ARM 32bits builds (i.e. REV16). + + One way to insure that the generated ASM was ideal for both gcc/clang + was using __builtin_bswap16. + + Added bonus is that we no longer need to test for CPU architecture. + + src/hb-machinery.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit a85886fc77083084e9a12ee15b47eab7876f9f53 +Author: Victor Chang +Date: Tue Nov 27 11:34:56 2018 +0000 + + Replace @Deprecated ICU API - USCRIPT_CODE_LIMIT + + Use of the deprecated API USCRIPT_CODE_LIMIT prevents harfbuzz + using the ICU4C as a shared library. + + The API has been replaced by u_getIntPropertyMaxValue(UCHAR_SCRIPT) + + src/hb-icu.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1042d9fbc05aff9d51f15c2824a8521e963d0acd +Author: Ebrahim Byagowi +Date: Mon Nov 26 18:58:39 2018 +0330 + + [ci] Add .codecov.yml + + Similar to + https://github.com/GoogleChrome/lighthouse/blob/master/.codecov.yml + + No strong preference on commenting, feel free to enable it again + + .codecov.yml | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 97eaedca5de76c74534bab41562aee130098558a +Author: Ebrahim Byagowi +Date: Mon Nov 26 16:58:58 2018 +0330 + + [test][aat] Enable Tamil MN test (#1414) + + test/shaping/data/in-house/tests/macos.tests | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 574d888c8a409295a952361a39c8e83a52a0fc3d +Author: Behdad Esfahbod +Date: Sun Nov 25 16:51:22 2018 -0500 + + [aat] Ignore GSUB table of Muthu Foundry if they have morx table + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1410 + + src/hb-ot-layout-gpos-table.hh | 3 +++ + src/hb-ot-layout-gsub-table.hh | 3 +++ + src/hb-ot-layout-gsubgpos.hh | 5 +++++ + src/hb-ot-layout.cc | 36 +++++++++++++++++++++++++++++++++++- + 4 files changed, 46 insertions(+), 1 deletion(-) + +commit 4151c2848d8df75b6d0a4f5d79bee843158aa4a4 +Author: Behdad Esfahbod +Date: Sun Nov 25 16:38:36 2018 -0500 + + [GDEF] Move more code + + src/hb-ot-layout-gdef-table.hh | 10 +++++++++- + src/hb-ot-layout.cc | 11 ----------- + 2 files changed, 9 insertions(+), 12 deletions(-) + +commit 4f21703f225b6977196ef180e8d7300ea86d2cc3 +Author: Behdad Esfahbod +Date: Sun Nov 25 15:59:18 2018 -0500 + + [GDEF] Move code around + + src/hb-ot-layout-gdef-table.hh | 3 +++ + src/hb-ot-layout.cc | 16 +++++++--------- + 2 files changed, 10 insertions(+), 9 deletions(-) + +commit 4ed9fb1a0050f3151f9332f08c8bb2c13652c607 +Author: Behdad Esfahbod +Date: Sun Nov 25 15:51:01 2018 -0500 + + [GDEF] Minor + + src/hb-ot-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0e3a48e54248d69197e8fb23c824d987f91b3bf7 +Author: Ebrahim Byagowi +Date: Sun Nov 25 13:37:23 2018 +0330 + + [test][aat] fix 10.13.6 Helvetica expectation + + test/shaping/data/in-house/tests/macos.tests | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cbc541b426f01717641f1f3529a7c9703aec7a28 +Author: Ebrahim Byagowi +Date: Sun Nov 25 12:50:30 2018 +0330 + + [aat] Add m grave test (#1412) + + test/shaping/data/in-house/tests/macos.tests | 4 ++++ + 1 file changed, 4 insertions(+) + +commit fa26ad0f48462063f2160a43cb62b018bb21e251 +Author: Ebrahim Byagowi +Date: Sun Nov 25 11:25:17 2018 +0330 + + [aat] Fix macos expectation + + test/shaping/data/in-house/tests/macos.tests | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 926f512f354835f8323bb2c2e58789dd918a9b65 +Author: Behdad Esfahbod +Date: Sun Nov 25 01:14:40 2018 -0500 + + [aat.feat] Rework API and implementation + + Fixes https://github.com/harfbuzz/harfbuzz/pull/1346 + + docs/harfbuzz-docs.xml | 5 +++ + docs/harfbuzz-sections.txt | 7 ++-- + src/hb-aat-layout-feat-table.hh | 89 + +++++++++++++++++++++++------------------ + src/hb-aat-layout.cc | 80 ++++++++++++++++-------------------- + src/hb-aat-layout.h | 32 +++++++++------ + test/api/test-aat-layout.c | 58 ++++++++++++++------------- + 6 files changed, 141 insertions(+), 130 deletions(-) + +commit 84dacbca7ea54a3ca2d5d711d50272a7f3baf456 +Author: Behdad Esfahbod +Date: Sat Nov 24 12:08:36 2018 -0500 + + [aat.feat] Add _MAX_VALUE to enums + + src/hb-aat-layout.h | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 3922aae1620958768d3257c0988432d5609dca1b +Author: Behdad Esfahbod +Date: Sat Nov 24 11:02:04 2018 -0500 + + [aat.feat] Minor + + src/hb-aat-layout-feat-table.hh | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +commit 0f8e98eca2463da3b83d1b66a19259a584df1682 +Author: Behdad Esfahbod +Date: Sat Nov 24 11:00:42 2018 -0500 + + [aat.feat] Whitespace + + src/hb-aat-layout-feat-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit c2256068339c9e10c8e6df5d1749be4b4eb04ad4 +Author: Behdad Esfahbod +Date: Sat Nov 24 10:54:40 2018 -0500 + + [aat.feat] Port to SortedUnsizedArrayOf.bsearch() + + src/hb-aat-layout-feat-table.hh | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +commit 52ae9867efd6520d17306b9f3ad612fe5463e93d +Author: Behdad Esfahbod +Date: Sat Nov 24 10:46:56 2018 -0500 + + [AAT.feat] Use lsearch for looking up SettingName's + + They are not sorted. + + src/hb-aat-layout-feat-table.hh | 18 ++++++------------ + src/hb-open-type.hh | 16 ++++++++-------- + src/hb-static.cc | 6 ++++-- + 3 files changed, 18 insertions(+), 22 deletions(-) + +commit 44b9331f663c09174d94e06baf36d48a50599c42 +Author: Behdad Esfahbod +Date: Sat Nov 24 10:30:35 2018 -0500 + + [aat] Fix include issues + + src/Makefile.am | 2 ++ + src/hb-aat.h | 2 ++ + 2 files changed, 4 insertions(+) + +commit b206133d1f616339a57996b634dadc7f0a2c4cfb +Author: Behdad Esfahbod +Date: Fri Nov 23 14:05:11 2018 -0500 + + [aat] Move contents of hb-aat.h to hb-aat-layout.h + + Since it was pages and pages... + + src/Makefile.sources | 1 + + src/hb-aat-layout.cc | 1 - + src/hb-aat-layout.h | 452 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout.hh | 1 - + src/hb-aat-map.hh | 1 - + src/hb-aat.h | 417 + +---------------------------------------------- + src/hb.hh | 2 + + 7 files changed, 458 insertions(+), 417 deletions(-) + +commit 2cb235d0210e74ea4ee123767b489301a9c340ab +Author: Behdad Esfahbod +Date: Fri Nov 23 12:23:35 2018 -0500 + + [aat.feat] Fix enum namespace + + src/hb-aat-layout-feat-table.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 4 +- + src/hb-aat-layout.cc | 150 ++++++------ + src/hb-aat.h | 502 + ++++++++++++++++++++-------------------- + test/api/test-aat-layout.c | 2 +- + 5 files changed, 330 insertions(+), 330 deletions(-) + +commit 712762cabbbe85e6ab8361cd115c22a176827734 +Author: Behdad Esfahbod +Date: Fri Nov 23 12:21:02 2018 -0500 + + Minor + + src/hb-aat.h | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit e20f81f4fa977a8d22c6afee1e46fbf46bc182d9 +Author: Behdad Esfahbod +Date: Fri Nov 23 11:57:42 2018 -0500 + + [aat] Rename feat API a bit more + + docs/harfbuzz-sections.txt | 10 +++++----- + src/hb-aat-layout-feat-table.hh | 8 ++++---- + src/hb-aat-layout.cc | 32 ++++++++++++++++---------------- + src/hb-aat.h | 26 +++++++++++++------------- + test/api/test-aat-layout.c | 28 ++++++++++++++-------------- + 5 files changed, 52 insertions(+), 52 deletions(-) + +commit 54f4c17f0a932b0ca0317e1ad5e5e43a11a83fd1 +Author: Ebrahim Byagowi +Date: Fri Nov 23 12:05:06 2018 +0330 + + [feat] Rename API uses of setting to selector + + docs/harfbuzz-sections.txt | 6 +-- + src/hb-aat-layout-feat-table.hh | 52 ++++++++++++------------ + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-aat-layout.cc | 88 + ++++++++++++++++++++--------------------- + src/hb-aat-layout.hh | 4 +- + src/hb-aat-map.cc | 2 +- + src/hb-aat-map.hh | 2 +- + src/hb-aat.h | 20 +++++----- + test/api/test-aat-layout.c | 46 ++++++++++----------- + 9 files changed, 111 insertions(+), 111 deletions(-) + +commit 9c64b216ec7ae2c2c124ebd00dc6fa568752be78 +Author: Ebrahim Byagowi +Date: Fri Nov 23 11:44:53 2018 +0330 + + [feat] Apply renamings and add documentation + + docs/harfbuzz-sections.txt | 10 ++++++++++ + src/hb-aat-layout.cc | 44 + ++++++++++++++++++++++++++++++++++++++------ + src/hb-aat.h | 6 +++--- + test/api/test-aat-layout.c | 28 ++++++++++++++-------------- + 4 files changed, 65 insertions(+), 23 deletions(-) + +commit a8726cb4830f51a820db4bc6346ed09c91493817 +Author: Ebrahim Byagowi +Date: Sat Nov 17 14:23:11 2018 +0330 + + [feat] Use bsearch + + src/hb-aat-layout-feat-table.hh | 36 ++++++++++++++++++++++-------------- + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb.hh | 2 ++ + 3 files changed, 25 insertions(+), 15 deletions(-) + +commit 4009a05ca7de21fff2176621597cd0cd01e9d80e +Author: Ebrahim Byagowi +Date: Sat Nov 17 11:30:50 2018 +0330 + + [feat] Address Behdad comments + + src/hb-aat-layout-feat-table.hh | 114 ++++--- + src/hb-aat-layout.cc | 14 +- + src/hb-aat.h | 673 + +++++++++++++++++----------------------- + test/api/test-aat-layout.c | 88 +++--- + 4 files changed, 423 insertions(+), 466 deletions(-) + +commit 19b6025534a98df96d67eee45c5c1ea6fbc1cc43 +Author: Ebrahim Byagowi +Date: Sat Nov 17 01:07:09 2018 +0330 + + [feat] Address @behdad comments + + src/Makefile.sources | 2 +- + src/hb-aat-layout-feat-table.hh | 82 +++---- + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-aat-layout.cc | 104 ++++---- + src/hb-aat-map.cc | 2 +- + src/hb-aat.h | 533 + ++++++++++++---------------------------- + src/hb-ot.h | 1 - + test/api/test-aat-layout.c | 84 +++---- + 8 files changed, 282 insertions(+), 528 deletions(-) + +commit 9212ec203c948e290a1d92b701619ccdbc89377c +Author: Ebrahim Byagowi +Date: Fri Nov 9 00:50:10 2018 +0330 + + [feat] Complete feature types list + + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-aat-layout.cc | 154 ++++----- + src/hb-aat.h | 697 + ++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 752 insertions(+), 101 deletions(-) + +commit fbad794bd2c574363a0c5c5fefabce764496f93c +Author: Ebrahim Byagowi +Date: Thu Nov 1 22:24:42 2018 +0330 + + [feat] Add feature iteration API + + src/hb-aat-layout-feat-table.hh | 36 +++++++++++++++++++++-------- + src/hb-aat-layout.cc | 26 +++++++++++---------- + src/hb-aat.h | 23 +++++++++++++++++-- + test/api/test-aat-layout.c | 51 + +++++++++++++++++++++++++++-------------- + 4 files changed, 96 insertions(+), 40 deletions(-) + +commit 7a0471aa356bcd062d31a59bdb19c335249116c7 +Author: Ebrahim Byagowi +Date: Thu Nov 1 21:38:54 2018 +0330 + + [feat] Turn AAT feature id into enum + + src/hb-aat-layout-feat-table.hh | 20 ++--- + src/hb-aat-layout-morx-table.hh | 10 +-- + src/hb-aat-layout.cc | 170 + ++++++++++++++++++++-------------------- + src/hb-aat-layout.hh | 6 +- + src/hb-aat-map.cc | 2 +- + src/hb-aat-map.hh | 4 +- + src/hb-aat.h | 64 +++++++++------ + test/api/test-aat-layout.c | 8 +- + test/api/test-c.c | 1 + + 9 files changed, 150 insertions(+), 135 deletions(-) + +commit b233fa4bc9cdb1c6677b37106d96d878d6e03bfd +Author: Ebrahim Byagowi +Date: Thu Nov 1 20:02:57 2018 +0330 + + [feat] Rename records to selectors as @drott + + src/hb-aat-layout-feat-table.hh | 20 ++++++++++---------- + src/hb-aat-layout.cc | 10 +++++----- + src/hb-aat.h | 4 ++-- + 3 files changed, 17 insertions(+), 17 deletions(-) + +commit a157b3e4ebd57ad29f217c4cef6519e7398cfa5c +Author: Ebrahim Byagowi +Date: Thu Nov 1 19:56:16 2018 +0330 + + [feat] Apply @behdad comments + + src/Makefile.sources | 2 +- + src/hb-aat-layout-feat-table.hh | 1 + + src/hb-aat-layout.cc | 16 ++++++++-------- + src/hb-aat-layout.hh | 2 +- + src/hb-aat-map.hh | 2 +- + src/{hb-aat-layout.h => hb-aat.h} | 22 +++++++++++++--------- + src/hb-ot.h | 1 + + test/api/test-aat-layout.c | 14 +++++++------- + test/api/test-c.c | 1 - + 9 files changed, 33 insertions(+), 28 deletions(-) + +commit 3aff3f822f0d7bf7a2b5160ad93df3fe413c7c47 +Author: Ebrahim Byagowi +Date: Thu Nov 1 19:20:20 2018 +0330 + + [feat] Apply @drott and @jfkthame comments + + src/hb-aat-layout-feat-table.hh | 14 ++++++-------- + src/hb-aat-layout.cc | 12 +++++++----- + src/hb-aat-layout.h | 10 +++++----- + test/api/test-aat-layout.c | 4 ++-- + 4 files changed, 20 insertions(+), 20 deletions(-) + +commit b791bbbae47aa19709da640a1dc5e84590c5c2c2 +Author: Ebrahim Byagowi +Date: Thu Nov 1 15:15:56 2018 +0330 + + [feat] Apply @jfkthame reviews + + src/hb-aat-layout-feat-table.hh | 27 +++++++++++++++------------ + src/hb-aat-layout.cc | 23 ++++++++++++----------- + src/hb-aat-layout.h | 14 +++++++++----- + test/api/fonts/aat-feat.ttf | Bin 0 -> 1132 bytes + test/api/test-aat-layout.c | 30 ++++++++++++++++++------------ + 5 files changed, 54 insertions(+), 40 deletions(-) + +commit 95abd53758e281325b9124f0942aafb382a89090 +Author: Ebrahim Byagowi +Date: Thu Nov 1 13:14:29 2018 +0330 + + [feat] Expose public API + + * hb_aat_get_feature_settings + + src/Makefile.sources | 1 + + src/hb-aat-layout-feat-table.hh | 68 ++++++++++++++++++++++++++++++- + src/hb-aat-layout-morx-table.hh | 6 +-- + src/hb-aat-layout.cc | 33 +++++++++++++++ + src/hb-aat-layout.h | 75 ++++++++++++++++++++++++++++++++++ + src/hb-aat-layout.hh | 7 ++-- + src/hb-aat-map.hh | 5 ++- + src/hb-ot-face.hh | 1 + + test/api/Makefile.am | 1 + + test/api/test-aat-layout.c | 89 + +++++++++++++++++++++++++++++++++++++++++ + test/api/test-c.c | 1 + + 11 files changed, 278 insertions(+), 9 deletions(-) + +commit 264c4a539cbfd8d5e5f143206d9d27230a186897 +Author: Behdad Esfahbod +Date: Sun Nov 25 00:30:08 2018 -0500 + + [test] Reorder test suites + + aots is less interesting. Run text-rendering-tests before aots. + + test/shaping/data/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9326912941e5927bcfb4689689c954b9a3995baa +Author: Behdad Esfahbod +Date: Sun Nov 25 00:27:23 2018 -0500 + + [kerx] Fix crash + + src/hb-machinery.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 6ee401049d475b2a2d9c859e6dbf8ff2750a1609 +Author: Behdad Esfahbod +Date: Sun Nov 25 00:21:13 2018 -0500 + + Simplify sanitize set_object() / fix bots + + src/hb-machinery.hh | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit c5a6b355e165e90d8d90454ceeca7b100282945f +Author: Behdad Esfahbod +Date: Sat Nov 24 23:49:23 2018 -0500 + + [kerx] Port to hb_sanitize_with_object_t + + src/hb-aat-layout-kerx-table.hh | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +commit c405ed0509afaa7c3846e8e461bedfbceb0cd937 +Author: Behdad Esfahbod +Date: Sat Nov 24 23:46:15 2018 -0500 + + [morx] Port to hb_sanitize_with_object_t + + src/hb-aat-layout-morx-table.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 1e8994221fb5cfdb1902d5249c7a75cde6d6e3c8 +Author: Behdad Esfahbod +Date: Sat Nov 24 23:38:06 2018 -0500 + + Add hb_sanitize_with_object_t + + Context manager. + + src/hb-machinery.hh | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit b3c5affc05a3c7bbcfbd98521703d3d3447fcd7d +Author: Behdad Esfahbod +Date: Sat Nov 24 23:34:34 2018 -0500 + + Simplify sanitize set_object() + + src/hb-aat-layout-kerx-table.hh | 12 ++++++------ + src/hb-aat-layout-morx-table.hh | 10 +++++----- + src/hb-machinery.hh | 26 +++++++++++++------------- + 3 files changed, 24 insertions(+), 24 deletions(-) + +commit 3d3097269995aa227b4b198d4da2baf942b65c66 +Author: Behdad Esfahbod +Date: Sat Nov 24 23:12:28 2018 -0500 + + [aat] Skip terminator in VarSizedBinSearchArray<> + + Fixes shaping with Apple Chancery on 10.13 again. In that font, + there was a terminator segment, that was tripping off sanitize(). + + src/hb-aat-layout-common.hh | 6 ++++++ + src/hb-open-type.hh | 21 ++++++++++++++++++++- + 2 files changed, 26 insertions(+), 1 deletion(-) + +commit 4202a3cde3b6065124feb7f4c662563de1e08126 +Author: Behdad Esfahbod +Date: Sat Nov 24 22:48:34 2018 -0500 + + Minor + + src/hb-open-type.hh | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +commit 1c2302bbf1d2d0e66f49ab54ad98d1b61bc5603d +Author: Behdad Esfahbod +Date: Sat Nov 24 22:32:17 2018 -0500 + + [debug] Print function in return_trace() + + src/hb-debug.hh | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit 748198a6718adbb200ee24ac013c617f62c946a4 +Author: Behdad Esfahbod +Date: Sat Nov 24 22:16:59 2018 -0500 + + Revert "[aat.morx] Remove set_object() business" + + This reverts commit ae8ed58a6e53441d9ccbf67afd8a00b815cde99e. + + Apparently this broke Apple Chancery from OS X 10.12 :(. + Investigating... + + src/hb-aat-layout-morx-table.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit c8a2dc820eb0ee3124e3762cb1167ac9e528ad28 +Author: Behdad Esfahbod +Date: Sat Nov 24 22:16:53 2018 -0500 + + Revert "[aat.kerx] Remove kerx subtable boundary enforcement" + + This reverts commit 15905a2a2998f7ddd964f920a4828602235d6b00. + + src/hb-aat-layout-kerx-table.hh | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit 9eeebd8ddedb96c03860ce7eb5500aafa3969d6b +Author: Behdad Esfahbod +Date: Sat Nov 24 22:16:47 2018 -0500 + + Revert "[sanitize] Remove now-unused set_object() machinery" + + This reverts commit bbdb6edb3e1cea4c5b7076c4f6b3e6998ae36dae. + + src/hb-machinery.hh | 25 ++++++++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +commit 248ce22857c8918bf3468ef48d906de4c19c3d4d +Author: Behdad Esfahbod +Date: Sat Nov 24 22:01:06 2018 -0500 + + [tests] Minor + + test/shaping/run-tests.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f47c5da0aa04a88b37d9c3af4730204319a9a36b +Author: Behdad Esfahbod +Date: Sat Nov 24 21:36:57 2018 -0500 + + [arrays] Use hb_array_t<> in all places with sub_array() + + src/hb-aat-layout-lcar-table.hh | 6 +++--- + src/hb-ot-layout-gdef-table.hh | 14 ++++++++------ + src/hb-ot-math-table.hh | 10 ++++------ + 3 files changed, 15 insertions(+), 15 deletions(-) + +commit 3246a8ebbd900bcc3e3c70532eab0f406b8f5c4a +Author: Behdad Esfahbod +Date: Sat Nov 24 21:32:00 2018 -0500 + + [arrays] Merge ArrayOf's sub_array into hb_array_t's + + src/hb-dsalgs.hh | 44 +++++++++++++++++++++++++++----------------- + src/hb-open-type.hh | 30 ++++++++++++++++++------------ + 2 files changed, 45 insertions(+), 29 deletions(-) + +commit e6877e28cd30e89af7cce59d903184a5a01ec970 +Author: Ebrahim Byagowi +Date: Sun Nov 25 02:12:40 2018 +0330 + + [test] Add the missed aots fonts + + test/shaping/data/aots/fonts/classdef1_font1.otf | Bin 0 -> 6004 bytes + test/shaping/data/aots/fonts/classdef1_font2.otf | Bin 0 -> 6020 bytes + test/shaping/data/aots/tests/classdef1_empty.tests | 2 +- + 3 files changed, 1 insertion(+), 1 deletion(-) + +commit 825ea5a4607fafa11c56a72a82bda773f6b44e79 +Author: Ebrahim Byagowi +Date: Sun Nov 25 01:59:54 2018 +0330 + + [test] Merge 10.12.6 and 10.13.6 tests, update to Apple Chancery fix + + test/shaping/data/in-house/Makefile.sources | 3 +-- + .../data/in-house/tests/macos-10.12.6.tests | 11 --------- + .../data/in-house/tests/macos-10.13.6.tests | 13 ----------- + test/shaping/data/in-house/tests/macos.tests | 26 + ++++++++++++++++++++++ + 4 files changed, 27 insertions(+), 26 deletions(-) + +commit bbdb6edb3e1cea4c5b7076c4f6b3e6998ae36dae +Author: Behdad Esfahbod +Date: Sat Nov 24 17:15:38 2018 -0500 + + [sanitize] Remove now-unused set_object() machinery + + src/hb-machinery.hh | 25 +------------------------ + 1 file changed, 1 insertion(+), 24 deletions(-) + +commit 15905a2a2998f7ddd964f920a4828602235d6b00 +Author: Behdad Esfahbod +Date: Sat Nov 24 17:14:39 2018 -0500 + + [aat.kerx] Remove kerx subtable boundary enforcement + + Have not encountered fonts needing this, but same reasoning as + for morx (see previos commit.) + + src/hb-aat-layout-kerx-table.hh | 21 --------------------- + 1 file changed, 21 deletions(-) + +commit ae8ed58a6e53441d9ccbf67afd8a00b815cde99e +Author: Behdad Esfahbod +Date: Sat Nov 24 17:11:09 2018 -0500 + + [aat.morx] Remove set_object() business + + With OS X 10.13 Apple Chancery fails to ligate if we limit each morx + sub-chain to its declared length. Perhaps their newer compiler does + object-sharing across sub-chains. Anyway, since that's a valid, if + unspecified, way to compile tables, remove enforcement. + + Probably do the same with kern/kerx. + + src/hb-aat-layout-morx-table.hh | 8 -------- + 1 file changed, 8 deletions(-) + +commit b518e5af9f66414396752069bb8f43466a9236fa +Author: Ebrahim Byagowi +Date: Sun Nov 25 01:39:00 2018 +0330 + + Add 10.13.6 aat fonts tests and bot (#1409) + + .circleci/config.yml | 16 + ++++++++++++++-- + test/shaping/data/in-house/Makefile.sources | 3 ++- + .../in-house/tests/{macos.tests => macos-10.12.6.tests} | 2 -- + test/shaping/data/in-house/tests/macos-10.13.6.tests | 13 + +++++++++++++ + 4 files changed, 29 insertions(+), 5 deletions(-) + +commit b7f7950e8fc4b9e229b466ac2453d57b8da9a5a6 +Author: Behdad Esfahbod +Date: Sat Nov 24 15:56:17 2018 -0500 + + [aat] Add test for recent regression + + test/shaping/data/in-house/tests/macos.tests | 1 + + 1 file changed, 1 insertion(+) + +commit ea9512e61a7ed333b810918e74cce4c8bd2291b9 +Author: Behdad Esfahbod +Date: Sat Nov 24 15:49:33 2018 -0500 + + [tests] Redo test runner logging a bit + + test/shaping/run-tests.py | 44 + +++++++++++++++++++++++--------------------- + 1 file changed, 23 insertions(+), 21 deletions(-) + +commit 5020affc3877d39377506245ecaf01a659eef82a +Author: Behdad Esfahbod +Date: Sat Nov 24 15:42:11 2018 -0500 + + [tests] Minor + + test/shaping/data/in-house/tests/macos.tests | 2 ++ + 1 file changed, 2 insertions(+) + +commit ee3a3e10d45f5df1a74b65fbe3df77f8dd8f902e +Author: Behdad Esfahbod +Date: Sat Nov 24 15:37:01 2018 -0500 + + [tests/shaping] Allow comments in test files + + Line should start with "# ". + + test/shaping/run-tests.py | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +commit ed900ee9afa0dabdbf6bf9d2af46c2343a16773f +Author: Behdad Esfahbod +Date: Sat Nov 24 15:22:09 2018 -0500 + + [tests] Rename + + test/shaping/data/in-house/Makefile.sources | + 2 +- + test/shaping/data/in-house/tests/{macos-10.12.tests => macos.tests} | 0 + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 20edc70d537b01e8a384ee05673335f2f8a18238 +Author: Behdad Esfahbod +Date: Sat Nov 24 14:52:34 2018 -0500 + + [morx/kerx] Fix sanitize regression + + Broke in 8dcc1913a1670ede7b124f7b5b775d7ab8791386 + + If sanitizer is left with another object, it wouldn't work. + + Better fix coming soon. + + src/hb-aat-layout-kerx-table.hh | 6 +----- + src/hb-aat-layout-morx-table.hh | 4 +--- + 2 files changed, 2 insertions(+), 8 deletions(-) + +commit 3cc14e78aeb1c70eb82891ab4513c0e7d0f59928 +Author: Ebrahim Byagowi +Date: Sat Nov 24 20:49:21 2018 +0330 + + [test] Enable more of aots tests (#1408) + + The ones commented out in this change should've be passed :/ + a closer look is needed. + + test/shaping/data/aots/Makefile.sources | 76 + +++++++++++----------- + test/shaping/data/aots/hb-aots-tester.cpp | 1 + + test/shaping/data/aots/tests/classdef1_empty.tests | 2 +- + test/shaping/data/aots/tests/gsub3_1_simple.tests | 2 +- + .../data/aots/tests/lookupflag_ignore_attach.tests | 10 +-- + 5 files changed, 46 insertions(+), 45 deletions(-) + +commit 24887d1115ee41cfad70577eb243382f6c23ab6e +Author: Ebrahim Byagowi +Date: Sat Nov 24 20:07:24 2018 +0330 + + Add Adobe AOTS tests (#1395) + + Annotated OpenType Specification or aots, + https://github.com/adobe-type-tools/aots + provides a set of tests for OpenType specification, this change add + those tests in addition + to modified version of their HarfBuzz test runner for generating + harfbuzz project specific tests. + + configure.ac | 1 + + test/shaping/CMakeLists.txt | 13 +- + test/shaping/data/Makefile.am | 1 + + test/shaping/data/aots/COPYING | 13 + + test/shaping/data/aots/Makefile.am | 37 +++ + test/shaping/data/aots/Makefile.sources | 126 ++++++++ + test/shaping/data/aots/fonts/classdef1_font3.otf | Bin 0 -> 6060 bytes + test/shaping/data/aots/fonts/classdef1_font4.otf | Bin 0 -> 5984 bytes + test/shaping/data/aots/fonts/classdef2_font1.otf | Bin 0 -> 6004 bytes + test/shaping/data/aots/fonts/classdef2_font2.otf | Bin 0 -> 6016 bytes + test/shaping/data/aots/fonts/classdef2_font3.otf | Bin 0 -> 6052 bytes + test/shaping/data/aots/fonts/classdef2_font4.otf | Bin 0 -> 5984 bytes + test/shaping/data/aots/fonts/cmap0_font1.otf | Bin 0 -> 5196 bytes + test/shaping/data/aots/fonts/cmap10_font1.otf | Bin 0 -> 4968 bytes + test/shaping/data/aots/fonts/cmap10_font2.otf | Bin 0 -> 4960 bytes + test/shaping/data/aots/fonts/cmap12_font1.otf | Bin 0 -> 4980 bytes + test/shaping/data/aots/fonts/cmap14_font1.otf | Bin 0 -> 5028 bytes + test/shaping/data/aots/fonts/cmap2_font1.otf | Bin 0 -> 6000 bytes + test/shaping/data/aots/fonts/cmap4_font1.otf | Bin 0 -> 4964 bytes + test/shaping/data/aots/fonts/cmap4_font2.otf | Bin 0 -> 4956 bytes + test/shaping/data/aots/fonts/cmap4_font3.otf | Bin 0 -> 4956 bytes + test/shaping/data/aots/fonts/cmap4_font4.otf | Bin 0 -> 4972 bytes + test/shaping/data/aots/fonts/cmap6_font1.otf | Bin 0 -> 4948 bytes + test/shaping/data/aots/fonts/cmap6_font2.otf | Bin 0 -> 4944 bytes + test/shaping/data/aots/fonts/cmap8_font1.otf | Bin 0 -> 13224 bytes + .../data/aots/fonts/cmap_composition_font1.otf | Bin 0 -> 5096 bytes + .../aots/fonts/cmap_subtableselection_font1.otf | Bin 0 -> 6412 bytes + .../aots/fonts/cmap_subtableselection_font2.otf | Bin 0 -> 6140 bytes + .../aots/fonts/cmap_subtableselection_font3.otf | Bin 0 -> 5872 bytes + .../aots/fonts/cmap_subtableselection_font4.otf | Bin 0 -> 5600 bytes + .../aots/fonts/cmap_subtableselection_font5.otf | Bin 0 -> 5332 bytes + .../data/aots/fonts/gpos1_1_lookupflag_f1.otf | Bin 0 -> 5208 bytes + test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf | Bin 0 -> 5136 bytes + test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf | Bin 0 -> 5136 bytes + test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf | Bin 0 -> 5136 bytes + test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf | Bin 0 -> 5136 bytes + test/shaping/data/aots/fonts/gpos1_2_font1.otf | Bin 0 -> 5108 bytes + test/shaping/data/aots/fonts/gpos1_2_font2.otf | Bin 0 -> 5148 bytes + test/shaping/data/aots/fonts/gpos2_1_font6.otf | Bin 0 -> 5120 bytes + test/shaping/data/aots/fonts/gpos2_1_font7.otf | Bin 0 -> 5132 bytes + .../data/aots/fonts/gpos2_1_lookupflag_f1.otf | Bin 0 -> 5220 bytes + .../data/aots/fonts/gpos2_1_lookupflag_f2.otf | Bin 0 -> 5220 bytes + .../data/aots/fonts/gpos2_1_next_glyph_f1.otf | Bin 0 -> 5180 bytes + .../data/aots/fonts/gpos2_1_next_glyph_f2.otf | Bin 0 -> 5176 bytes + test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf | Bin 0 -> 5148 bytes + test/shaping/data/aots/fonts/gpos2_2_font1.otf | Bin 0 -> 5148 bytes + test/shaping/data/aots/fonts/gpos2_2_font2.otf | Bin 0 -> 5188 bytes + test/shaping/data/aots/fonts/gpos2_2_font3.otf | Bin 0 -> 5188 bytes + test/shaping/data/aots/fonts/gpos2_2_font4.otf | Bin 0 -> 5148 bytes + test/shaping/data/aots/fonts/gpos2_2_font5.otf | Bin 0 -> 5140 bytes + test/shaping/data/aots/fonts/gpos3_font1.otf | Bin 0 -> 5120 bytes + test/shaping/data/aots/fonts/gpos3_font2.otf | Bin 0 -> 5160 bytes + test/shaping/data/aots/fonts/gpos3_font3.otf | Bin 0 -> 5164 bytes + .../data/aots/fonts/gpos4_lookupflag_f1.otf | Bin 0 -> 5256 bytes + .../data/aots/fonts/gpos4_lookupflag_f2.otf | Bin 0 -> 5240 bytes + .../data/aots/fonts/gpos4_multiple_anchors_1.otf | Bin 0 -> 5352 bytes + test/shaping/data/aots/fonts/gpos4_simple_1.otf | Bin 0 -> 5200 bytes + test/shaping/data/aots/fonts/gpos5_font1.otf | Bin 0 -> 5284 bytes + test/shaping/data/aots/fonts/gpos6_font1.otf | Bin 0 -> 5176 bytes + test/shaping/data/aots/fonts/gpos7_1_font1.otf | Bin 0 -> 5160 bytes + test/shaping/data/aots/fonts/gpos9_font1.otf | Bin 0 -> 5096 bytes + test/shaping/data/aots/fonts/gpos9_font2.otf | Bin 0 -> 5124 bytes + .../data/aots/fonts/gpos_chaining1_boundary_f1.otf | Bin 0 -> 5496 bytes + .../data/aots/fonts/gpos_chaining1_boundary_f2.otf | Bin 0 -> 5500 bytes + .../data/aots/fonts/gpos_chaining1_boundary_f3.otf | Bin 0 -> 5496 bytes + .../data/aots/fonts/gpos_chaining1_boundary_f4.otf | Bin 0 -> 5496 bytes + .../aots/fonts/gpos_chaining1_lookupflag_f1.otf | Bin 0 -> 5520 bytes + .../fonts/gpos_chaining1_multiple_subrules_f1.otf | Bin 0 -> 5592 bytes + .../fonts/gpos_chaining1_multiple_subrules_f2.otf | Bin 0 -> 5592 bytes + .../aots/fonts/gpos_chaining1_next_glyph_f1.otf | Bin 0 -> 5540 bytes + .../data/aots/fonts/gpos_chaining1_simple_f1.otf | Bin 0 -> 5488 bytes + .../data/aots/fonts/gpos_chaining1_simple_f2.otf | Bin 0 -> 5488 bytes + .../aots/fonts/gpos_chaining1_successive_f1.otf | Bin 0 -> 5524 bytes + .../data/aots/fonts/gpos_chaining2_boundary_f1.otf | Bin 0 -> 5704 bytes + .../data/aots/fonts/gpos_chaining2_boundary_f2.otf | Bin 0 -> 5708 bytes + .../data/aots/fonts/gpos_chaining2_boundary_f3.otf | Bin 0 -> 5704 bytes + .../data/aots/fonts/gpos_chaining2_boundary_f4.otf | Bin 0 -> 5704 bytes + .../aots/fonts/gpos_chaining2_lookupflag_f1.otf | Bin 0 -> 5728 bytes + .../fonts/gpos_chaining2_multiple_subrules_f1.otf | Bin 0 -> 5800 bytes + .../fonts/gpos_chaining2_multiple_subrules_f2.otf | Bin 0 -> 5800 bytes + .../aots/fonts/gpos_chaining2_next_glyph_f1.otf | Bin 0 -> 5744 bytes + .../data/aots/fonts/gpos_chaining2_simple_f1.otf | Bin 0 -> 5696 bytes + .../data/aots/fonts/gpos_chaining2_simple_f2.otf | Bin 0 -> 5696 bytes + .../aots/fonts/gpos_chaining2_successive_f1.otf | Bin 0 -> 5732 bytes + .../data/aots/fonts/gpos_chaining3_boundary_f1.otf | Bin 0 -> 5504 bytes + .../data/aots/fonts/gpos_chaining3_boundary_f2.otf | Bin 0 -> 5508 bytes + .../data/aots/fonts/gpos_chaining3_boundary_f3.otf | Bin 0 -> 5500 bytes + .../data/aots/fonts/gpos_chaining3_boundary_f4.otf | Bin 0 -> 5500 bytes + .../aots/fonts/gpos_chaining3_lookupflag_f1.otf | Bin 0 -> 5548 bytes + .../aots/fonts/gpos_chaining3_next_glyph_f1.otf | Bin 0 -> 5524 bytes + .../data/aots/fonts/gpos_chaining3_simple_f1.otf | Bin 0 -> 5496 bytes + .../data/aots/fonts/gpos_chaining3_simple_f2.otf | Bin 0 -> 5516 bytes + .../aots/fonts/gpos_chaining3_successive_f1.otf | Bin 0 -> 5544 bytes + .../data/aots/fonts/gpos_context1_boundary_f1.otf | Bin 0 -> 5480 bytes + .../data/aots/fonts/gpos_context1_boundary_f2.otf | Bin 0 -> 5480 bytes + .../data/aots/fonts/gpos_context1_expansion_f1.otf | Bin 0 -> 5492 bytes + .../aots/fonts/gpos_context1_lookupflag_f1.otf | Bin 0 -> 5508 bytes + .../aots/fonts/gpos_context1_lookupflag_f2.otf | Bin 0 -> 5500 bytes + .../fonts/gpos_context1_multiple_subrules_f1.otf | Bin 0 -> 5568 bytes + .../fonts/gpos_context1_multiple_subrules_f2.otf | Bin 0 -> 5568 bytes + .../aots/fonts/gpos_context1_next_glyph_f1.otf | Bin 0 -> 5500 bytes + .../data/aots/fonts/gpos_context1_simple_f1.otf | Bin 0 -> 5476 bytes + .../data/aots/fonts/gpos_context1_simple_f2.otf | Bin 0 -> 5468 bytes + .../aots/fonts/gpos_context1_successive_f1.otf | Bin 0 -> 5508 bytes + .../data/aots/fonts/gpos_context2_boundary_f1.otf | Bin 0 -> 5492 bytes + .../data/aots/fonts/gpos_context2_boundary_f2.otf | Bin 0 -> 5496 bytes + .../data/aots/fonts/gpos_context2_classes_f1.otf | Bin 0 -> 5540 bytes + .../data/aots/fonts/gpos_context2_classes_f2.otf | Bin 0 -> 5564 bytes + .../data/aots/fonts/gpos_context2_expansion_f1.otf | Bin 0 -> 5524 bytes + .../aots/fonts/gpos_context2_lookupflag_f1.otf | Bin 0 -> 5540 bytes + .../aots/fonts/gpos_context2_lookupflag_f2.otf | Bin 0 -> 5532 bytes + .../fonts/gpos_context2_multiple_subrules_f1.otf | Bin 0 -> 5600 bytes + .../fonts/gpos_context2_multiple_subrules_f2.otf | Bin 0 -> 5600 bytes + .../aots/fonts/gpos_context2_next_glyph_f1.otf | Bin 0 -> 5512 bytes + .../data/aots/fonts/gpos_context2_simple_f1.otf | Bin 0 -> 5508 bytes + .../data/aots/fonts/gpos_context2_simple_f2.otf | Bin 0 -> 5484 bytes + .../aots/fonts/gpos_context2_successive_f1.otf | Bin 0 -> 5544 bytes + .../data/aots/fonts/gpos_context3_boundary_f1.otf | Bin 0 -> 5476 bytes + .../data/aots/fonts/gpos_context3_boundary_f2.otf | Bin 0 -> 5472 bytes + .../aots/fonts/gpos_context3_lookupflag_f1.otf | Bin 0 -> 5512 bytes + .../aots/fonts/gpos_context3_lookupflag_f2.otf | Bin 0 -> 5504 bytes + .../aots/fonts/gpos_context3_next_glyph_f1.otf | Bin 0 -> 5496 bytes + .../data/aots/fonts/gpos_context3_simple_f1.otf | Bin 0 -> 5480 bytes + .../aots/fonts/gpos_context3_successive_f1.otf | Bin 0 -> 5516 bytes + .../data/aots/fonts/gsub1_1_lookupflag_f1.otf | Bin 0 -> 5208 bytes + test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf | Bin 0 -> 5216 bytes + test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf | Bin 0 -> 5136 bytes + .../data/aots/fonts/gsub1_2_lookupflag_f1.otf | Bin 0 -> 5212 bytes + test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf | Bin 0 -> 5140 bytes + .../data/aots/fonts/gsub2_1_lookupflag_f1.otf | Bin 0 -> 5224 bytes + .../aots/fonts/gsub2_1_multiple_sequences_f1.otf | Bin 0 -> 5248 bytes + test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf | Bin 0 -> 5144 bytes + .../data/aots/fonts/gsub3_1_lookupflag_f1.otf | Bin 0 -> 5224 bytes + .../data/aots/fonts/gsub3_1_multiple_f1.otf | Bin 0 -> 5168 bytes + test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf | Bin 0 -> 5144 bytes + .../data/aots/fonts/gsub4_1_lookupflag_f1.otf | Bin 0 -> 5220 bytes + .../aots/fonts/gsub4_1_multiple_ligatures_f1.otf | Bin 0 -> 5252 bytes + .../aots/fonts/gsub4_1_multiple_ligatures_f2.otf | Bin 0 -> 5252 bytes + .../aots/fonts/gsub4_1_multiple_ligsets_f1.otf | Bin 0 -> 5240 bytes + test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf | Bin 0 -> 5148 bytes + test/shaping/data/aots/fonts/gsub7_font1.otf | Bin 0 -> 5096 bytes + test/shaping/data/aots/fonts/gsub7_font2.otf | Bin 0 -> 5116 bytes + .../data/aots/fonts/gsub_chaining1_boundary_f1.otf | Bin 0 -> 5516 bytes + .../data/aots/fonts/gsub_chaining1_boundary_f2.otf | Bin 0 -> 5520 bytes + .../data/aots/fonts/gsub_chaining1_boundary_f3.otf | Bin 0 -> 5520 bytes + .../data/aots/fonts/gsub_chaining1_boundary_f4.otf | Bin 0 -> 5520 bytes + .../aots/fonts/gsub_chaining1_lookupflag_f1.otf | Bin 0 -> 5544 bytes + .../fonts/gsub_chaining1_multiple_subrules_f1.otf | Bin 0 -> 5616 bytes + .../fonts/gsub_chaining1_multiple_subrules_f2.otf | Bin 0 -> 5616 bytes + .../aots/fonts/gsub_chaining1_next_glyph_f1.otf | Bin 0 -> 5560 bytes + .../data/aots/fonts/gsub_chaining1_simple_f1.otf | Bin 0 -> 5508 bytes + .../data/aots/fonts/gsub_chaining1_simple_f2.otf | Bin 0 -> 5512 bytes + .../aots/fonts/gsub_chaining1_successive_f1.otf | Bin 0 -> 5544 bytes + .../data/aots/fonts/gsub_chaining2_boundary_f1.otf | Bin 0 -> 5724 bytes + .../data/aots/fonts/gsub_chaining2_boundary_f2.otf | Bin 0 -> 5728 bytes + .../data/aots/fonts/gsub_chaining2_boundary_f3.otf | Bin 0 -> 5728 bytes + .../data/aots/fonts/gsub_chaining2_boundary_f4.otf | Bin 0 -> 5728 bytes + .../aots/fonts/gsub_chaining2_lookupflag_f1.otf | Bin 0 -> 5752 bytes + .../fonts/gsub_chaining2_multiple_subrules_f1.otf | Bin 0 -> 5824 bytes + .../fonts/gsub_chaining2_multiple_subrules_f2.otf | Bin 0 -> 5824 bytes + .../aots/fonts/gsub_chaining2_next_glyph_f1.otf | Bin 0 -> 5764 bytes + .../data/aots/fonts/gsub_chaining2_simple_f1.otf | Bin 0 -> 5716 bytes + .../data/aots/fonts/gsub_chaining2_simple_f2.otf | Bin 0 -> 5720 bytes + .../aots/fonts/gsub_chaining2_successive_f1.otf | Bin 0 -> 5752 bytes + .../data/aots/fonts/gsub_chaining3_boundary_f1.otf | Bin 0 -> 5528 bytes + .../data/aots/fonts/gsub_chaining3_boundary_f2.otf | Bin 0 -> 5532 bytes + .../data/aots/fonts/gsub_chaining3_boundary_f3.otf | Bin 0 -> 5524 bytes + .../data/aots/fonts/gsub_chaining3_boundary_f4.otf | Bin 0 -> 5524 bytes + .../aots/fonts/gsub_chaining3_lookupflag_f1.otf | Bin 0 -> 5572 bytes + .../aots/fonts/gsub_chaining3_next_glyph_f1.otf | Bin 0 -> 5548 bytes + .../data/aots/fonts/gsub_chaining3_simple_f1.otf | Bin 0 -> 5520 bytes + .../data/aots/fonts/gsub_chaining3_simple_f2.otf | Bin 0 -> 5540 bytes + .../aots/fonts/gsub_chaining3_successive_f1.otf | Bin 0 -> 5568 bytes + .../data/aots/fonts/gsub_context1_boundary_f1.otf | Bin 0 -> 5500 bytes + .../data/aots/fonts/gsub_context1_boundary_f2.otf | Bin 0 -> 5504 bytes + .../data/aots/fonts/gsub_context1_expansion_f1.otf | Bin 0 -> 5516 bytes + .../aots/fonts/gsub_context1_lookupflag_f1.otf | Bin 0 -> 5532 bytes + .../aots/fonts/gsub_context1_lookupflag_f2.otf | Bin 0 -> 5524 bytes + .../fonts/gsub_context1_multiple_subrules_f1.otf | Bin 0 -> 5592 bytes + .../fonts/gsub_context1_multiple_subrules_f2.otf | Bin 0 -> 5592 bytes + .../aots/fonts/gsub_context1_next_glyph_f1.otf | Bin 0 -> 5520 bytes + .../data/aots/fonts/gsub_context1_simple_f1.otf | Bin 0 -> 5500 bytes + .../data/aots/fonts/gsub_context1_simple_f2.otf | Bin 0 -> 5492 bytes + .../aots/fonts/gsub_context1_successive_f1.otf | Bin 0 -> 5528 bytes + .../data/aots/fonts/gsub_context2_boundary_f1.otf | Bin 0 -> 5516 bytes + .../data/aots/fonts/gsub_context2_boundary_f2.otf | Bin 0 -> 5516 bytes + .../data/aots/fonts/gsub_context2_classes_f1.otf | Bin 0 -> 5564 bytes + .../data/aots/fonts/gsub_context2_classes_f2.otf | Bin 0 -> 5584 bytes + .../data/aots/fonts/gsub_context2_expansion_f1.otf | Bin 0 -> 5544 bytes + .../aots/fonts/gsub_context2_lookupflag_f1.otf | Bin 0 -> 5560 bytes + .../aots/fonts/gsub_context2_lookupflag_f2.otf | Bin 0 -> 5552 bytes + .../fonts/gsub_context2_multiple_subrules_f1.otf | Bin 0 -> 5620 bytes + .../fonts/gsub_context2_multiple_subrules_f2.otf | Bin 0 -> 5620 bytes + .../aots/fonts/gsub_context2_next_glyph_f1.otf | Bin 0 -> 5536 bytes + .../data/aots/fonts/gsub_context2_simple_f1.otf | Bin 0 -> 5528 bytes + .../data/aots/fonts/gsub_context2_simple_f2.otf | Bin 0 -> 5504 bytes + .../aots/fonts/gsub_context2_successive_f1.otf | Bin 0 -> 5568 bytes + .../data/aots/fonts/gsub_context3_boundary_f1.otf | Bin 0 -> 5500 bytes + .../data/aots/fonts/gsub_context3_boundary_f2.otf | Bin 0 -> 5496 bytes + .../aots/fonts/gsub_context3_lookupflag_f1.otf | Bin 0 -> 5536 bytes + .../aots/fonts/gsub_context3_lookupflag_f2.otf | Bin 0 -> 5528 bytes + .../aots/fonts/gsub_context3_next_glyph_f1.otf | Bin 0 -> 5520 bytes + .../data/aots/fonts/gsub_context3_simple_f1.otf | Bin 0 -> 5504 bytes + .../aots/fonts/gsub_context3_successive_f1.otf | Bin 0 -> 5540 bytes + .../aots/fonts/lookupflag_ignore_attach_f1.otf | Bin 0 -> 5416 bytes + .../data/aots/fonts/lookupflag_ignore_base_f1.otf | Bin 0 -> 5256 bytes + .../fonts/lookupflag_ignore_combination_f1.otf | Bin 0 -> 5408 bytes + .../aots/fonts/lookupflag_ignore_ligatures_f1.otf | Bin 0 -> 5320 bytes + .../data/aots/fonts/lookupflag_ignore_marks_f1.otf | Bin 0 -> 5288 bytes + test/shaping/data/aots/hb-aots-tester.cpp | 343 + +++++++++++++++++++++ + test/shaping/data/aots/tests/classdef1.tests | 1 + + test/shaping/data/aots/tests/classdef1_empty.tests | 1 + + .../data/aots/tests/classdef1_multiple.tests | 1 + + .../shaping/data/aots/tests/classdef1_single.tests | 1 + + test/shaping/data/aots/tests/classdef2.tests | 1 + + test/shaping/data/aots/tests/classdef2_empty.tests | 1 + + .../data/aots/tests/classdef2_multiple.tests | 1 + + .../shaping/data/aots/tests/classdef2_single.tests | 1 + + .../data/aots/tests/gpos1_1_lookupflag.tests | 1 + + test/shaping/data/aots/tests/gpos1_1_simple.tests | 4 + + test/shaping/data/aots/tests/gpos1_2.tests | 1 + + .../data/aots/tests/gpos1_2_lookupflag.tests | 1 + + test/shaping/data/aots/tests/gpos2_1.tests | 2 + + .../data/aots/tests/gpos2_1_lookupflag.tests | 2 + + .../data/aots/tests/gpos2_1_next_glyph.tests | 2 + + test/shaping/data/aots/tests/gpos2_1_simple.tests | 2 + + test/shaping/data/aots/tests/gpos2_2.tests | 5 + + test/shaping/data/aots/tests/gpos3.tests | 11 + + .../shaping/data/aots/tests/gpos3_lookupflag.tests | 2 + + .../shaping/data/aots/tests/gpos4_lookupflag.tests | 2 + + .../data/aots/tests/gpos4_multiple_anchors.tests | 1 + + test/shaping/data/aots/tests/gpos4_simple.tests | 5 + + test/shaping/data/aots/tests/gpos5.tests | 2 + + test/shaping/data/aots/tests/gpos6.tests | 3 + + test/shaping/data/aots/tests/gpos7_1.tests | 2 + + test/shaping/data/aots/tests/gpos9.tests | 2 + + .../data/aots/tests/gpos_chaining1_boundary.tests | 4 + + .../aots/tests/gpos_chaining1_lookupflag.tests | 1 + + .../tests/gpos_chaining1_multiple_subrules.tests | 2 + + .../aots/tests/gpos_chaining1_next_glyph.tests | 1 + + .../data/aots/tests/gpos_chaining1_simple.tests | 11 + + .../aots/tests/gpos_chaining1_successive.tests | 1 + + .../data/aots/tests/gpos_chaining2_boundary.tests | 4 + + .../aots/tests/gpos_chaining2_lookupflag.tests | 1 + + .../tests/gpos_chaining2_multiple_subrules.tests | 2 + + .../aots/tests/gpos_chaining2_next_glyph.tests | 1 + + .../data/aots/tests/gpos_chaining2_simple.tests | 11 + + .../aots/tests/gpos_chaining2_successive.tests | 1 + + .../data/aots/tests/gpos_chaining3_boundary.tests | 4 + + .../aots/tests/gpos_chaining3_lookupflag.tests | 1 + + .../aots/tests/gpos_chaining3_next_glyph.tests | 1 + + .../data/aots/tests/gpos_chaining3_simple.tests | 11 + + .../aots/tests/gpos_chaining3_successive.tests | 1 + + .../data/aots/tests/gpos_context1_boundary.tests | 2 + + .../data/aots/tests/gpos_context1_expansion.tests | 1 + + .../data/aots/tests/gpos_context1_lookupflag.tests | 2 + + .../tests/gpos_context1_multiple_subrules.tests | 2 + + .../data/aots/tests/gpos_context1_next_glyph.tests | 1 + + .../data/aots/tests/gpos_context1_simple.tests | 3 + + .../data/aots/tests/gpos_context1_successive.tests | 1 + + .../data/aots/tests/gpos_context2_boundary.tests | 2 + + .../data/aots/tests/gpos_context2_classes.tests | 2 + + .../data/aots/tests/gpos_context2_expansion.tests | 1 + + .../data/aots/tests/gpos_context2_lookupflag.tests | 2 + + .../tests/gpos_context2_multiple_subrules.tests | 2 + + .../data/aots/tests/gpos_context2_next_glyph.tests | 1 + + .../data/aots/tests/gpos_context2_simple.tests | 3 + + .../data/aots/tests/gpos_context2_successive.tests | 1 + + .../data/aots/tests/gpos_context3_boundary.tests | 2 + + .../data/aots/tests/gpos_context3_lookupflag.tests | 2 + + .../data/aots/tests/gpos_context3_next_glyph.tests | 1 + + .../data/aots/tests/gpos_context3_simple.tests | 2 + + .../data/aots/tests/gpos_context3_successive.tests | 1 + + .../data/aots/tests/gsub1_1_lookupflag.tests | 1 + + test/shaping/data/aots/tests/gsub1_1_modulo.tests | 1 + + test/shaping/data/aots/tests/gsub1_1_simple.tests | 1 + + .../data/aots/tests/gsub1_2_lookupflag.tests | 1 + + test/shaping/data/aots/tests/gsub1_2_simple.tests | 1 + + .../data/aots/tests/gsub2_1_lookupflag.tests | 1 + + .../aots/tests/gsub2_1_multiple_sequences.tests | 1 + + test/shaping/data/aots/tests/gsub2_1_simple.tests | 2 + + .../data/aots/tests/gsub3_1_lookupflag.tests | 1 + + .../shaping/data/aots/tests/gsub3_1_multiple.tests | 1 + + test/shaping/data/aots/tests/gsub3_1_simple.tests | 1 + + .../data/aots/tests/gsub4_1_lookupflag.tests | 1 + + .../aots/tests/gsub4_1_multiple_ligatures.tests | 2 + + .../data/aots/tests/gsub4_1_multiple_ligsets.tests | 1 + + test/shaping/data/aots/tests/gsub4_1_simple.tests | 1 + + test/shaping/data/aots/tests/gsub7.tests | 2 + + .../data/aots/tests/gsub_chaining1_boundary.tests | 4 + + .../aots/tests/gsub_chaining1_lookupflag.tests | 1 + + .../tests/gsub_chaining1_multiple_subrules.tests | 2 + + .../aots/tests/gsub_chaining1_next_glyph.tests | 1 + + .../data/aots/tests/gsub_chaining1_simple.tests | 11 + + .../aots/tests/gsub_chaining1_successive.tests | 1 + + .../data/aots/tests/gsub_chaining2_boundary.tests | 4 + + .../aots/tests/gsub_chaining2_lookupflag.tests | 1 + + .../tests/gsub_chaining2_multiple_subrules.tests | 2 + + .../aots/tests/gsub_chaining2_next_glyph.tests | 1 + + .../data/aots/tests/gsub_chaining2_simple.tests | 11 + + .../aots/tests/gsub_chaining2_successive.tests | 1 + + .../data/aots/tests/gsub_chaining3_boundary.tests | 4 + + .../aots/tests/gsub_chaining3_lookupflag.tests | 1 + + .../aots/tests/gsub_chaining3_next_glyph.tests | 1 + + .../data/aots/tests/gsub_chaining3_simple.tests | 11 + + .../aots/tests/gsub_chaining3_successive.tests | 1 + + .../data/aots/tests/gsub_context1_boundary.tests | 2 + + .../data/aots/tests/gsub_context1_expansion.tests | 1 + + .../data/aots/tests/gsub_context1_lookupflag.tests | 2 + + .../tests/gsub_context1_multiple_subrules.tests | 2 + + .../data/aots/tests/gsub_context1_next_glyph.tests | 1 + + .../data/aots/tests/gsub_context1_simple.tests | 3 + + .../data/aots/tests/gsub_context1_successive.tests | 1 + + .../data/aots/tests/gsub_context2_boundary.tests | 2 + + .../data/aots/tests/gsub_context2_classes.tests | 2 + + .../data/aots/tests/gsub_context2_expansion.tests | 1 + + .../data/aots/tests/gsub_context2_lookupflag.tests | 2 + + .../tests/gsub_context2_multiple_subrules.tests | 2 + + .../data/aots/tests/gsub_context2_next_glyph.tests | 1 + + .../data/aots/tests/gsub_context2_simple.tests | 3 + + .../data/aots/tests/gsub_context2_successive.tests | 1 + + .../data/aots/tests/gsub_context3_boundary.tests | 2 + + .../data/aots/tests/gsub_context3_lookupflag.tests | 2 + + .../data/aots/tests/gsub_context3_next_glyph.tests | 1 + + .../data/aots/tests/gsub_context3_simple.tests | 2 + + .../data/aots/tests/gsub_context3_successive.tests | 1 + + .../data/aots/tests/lookupflag_ignore_attach.tests | 5 + + .../data/aots/tests/lookupflag_ignore_base.tests | 2 + + .../aots/tests/lookupflag_ignore_combination.tests | 3 + + .../aots/tests/lookupflag_ignore_ligatures.tests | 3 + + .../data/aots/tests/lookupflag_ignore_marks.tests | 1 + + test/shaping/run-tests.py | 9 +- + 332 files changed, 815 insertions(+), 3 deletions(-) + +commit ae96c98dfaef3a789227ffecd40b92518dface8a +Author: Behdad Esfahbod +Date: Sat Nov 24 10:25:10 2018 -0500 + + [color] Use SortedUnsizedArrayOf<> + + src/hb-ot-color-colr-table.hh | 16 ++-------------- + 1 file changed, 2 insertions(+), 14 deletions(-) + +commit 4a3b20738fca3231e5d9a36adba333b5bce05f4a +Author: Behdad Esfahbod +Date: Sat Nov 24 10:17:59 2018 -0500 + + [trak] Coment + + src/hb-aat-layout-trak-table.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 918b1ee54d43eb493c9226bff7677ed8ec07934b +Author: Behdad Esfahbod +Date: Sat Nov 24 10:09:17 2018 -0500 + + [arrays] Add not_found to reference bsearch as well + + src/hb-open-type.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit d77a098b735cf14aa601feab5bdb9f4e474c794f +Author: Behdad Esfahbod +Date: Sat Nov 24 10:06:13 2018 -0500 + + [arrays] Improve bfind() interface + + Much more useful now. :) + + src/hb-dsalgs.hh | 29 +++++++++++++++++++++++++---- + src/hb-open-file.hh | 9 +-------- + src/hb-open-type.hh | 12 ++++++++---- + src/hb-ot-layout-common.hh | 10 ++-------- + src/hb-set.hh | 6 +++--- + src/hb-vector.hh | 6 ++++-- + 6 files changed, 43 insertions(+), 29 deletions(-) + +commit 1204a247a5d9a4da39675d3da85d4fd3268a5b66 +Author: Behdad Esfahbod +Date: Sat Nov 24 09:49:21 2018 -0500 + + [fuzzing] Add tests for previous commit + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11526 + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11522 + + ...zz-testcase-minimized-hb-shape-fuzzer-5634620935110656 | Bin 0 -> + 41 bytes + ...zz-testcase-minimized-hb-shape-fuzzer-5716208469409792 | Bin 0 -> + 243 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 8dcc1913a1670ede7b124f7b5b775d7ab8791386 +Author: Behdad Esfahbod +Date: Sat Nov 24 09:47:45 2018 -0500 + + [kerx/morx] Make sure object length is sanitized before accessing it + + src/hb-aat-layout-kerx-table.hh | 5 +++++ + src/hb-aat-layout-morx-table.hh | 5 +++++ + 2 files changed, 10 insertions(+) + +commit 70d80c90fe2f4eca66bec3e1d313bbf7e4d0ab65 +Author: Behdad Esfahbod +Date: Sat Nov 24 01:59:50 2018 -0500 + + [arrays] Port ArrayOf.qsort() and hb_vector_t.qsort() to hb_array_t + + src/hb-dsalgs.hh | 14 ++++++++++++-- + src/hb-open-type.hh | 14 ++++++++++++-- + 2 files changed, 24 insertions(+), 4 deletions(-) + +commit 073d837aa2394d29dda72679802d583c559c3c5b +Author: Behdad Esfahbod +Date: Sat Nov 24 01:48:48 2018 -0500 + + [arrays] Port ArrayOf.qsort() to hb_array_t's + + src/hb-open-type.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit ad5c871d801b481f95dd32c8b65ecc70def597be +Author: Behdad Esfahbod +Date: Sat Nov 24 01:47:49 2018 -0500 + + [arrays] Add copy-constructor to hb_array_t and hb_sorted_array_t + + src/hb-dsalgs.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 61de55bf496c1edb120e4d096140eb1125552bbe +Author: Behdad Esfahbod +Date: Sat Nov 24 01:45:58 2018 -0500 + + [arrays] Port hb_vector_t.qsort() to hb_array_t's + + src/hb-dsalgs.hh | 16 +++++++++++++--- + src/hb-vector.hh | 10 ++-------- + 2 files changed, 15 insertions(+), 11 deletions(-) + +commit e3face8e791d677f94154e8a7f3d787d0d69a02f +Author: Behdad Esfahbod +Date: Sat Nov 24 01:42:17 2018 -0500 + + [arrays] Remove one flavor of hb_vector_t.qsort() + + src/hb-vector.hh | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 7c1600dcd9813ca560ecccc5c54877a5750caf4e +Author: Behdad Esfahbod +Date: Sat Nov 24 01:37:11 2018 -0500 + + [arrays] Add (unused) SortedUnsizedArrayOf<> + + src/hb-open-type.hh | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit e700392f5cbf366f1e03dc7e7b1a2eb6c3027b92 +Author: Behdad Esfahbod +Date: Sat Nov 24 01:31:00 2018 -0500 + + [arrays] Port SortedArrayOf.bsearch/bfind to hb_sorted_array_t's + + src/hb-dsalgs.hh | 9 +++------ + src/hb-open-type.hh | 50 + ++++++++++---------------------------------------- + src/hb-vector.hh | 35 ++++++++++------------------------- + 3 files changed, 23 insertions(+), 71 deletions(-) + +commit e604306f2829804e9016966c1378166253b19d29 +Author: Behdad Esfahbod +Date: Sat Nov 24 01:24:48 2018 -0500 + + [arrays] Port hb_vector_t.bsearch/bfind to (new) hb_sorted_array_t's + + src/hb-dsalgs.hh | 63 + +++++++++++++++++++++++++++++++++++++++++++++++++---- + src/hb-open-type.hh | 12 ++++++---- + src/hb-vector.hh | 57 +++++++++++++++++++----------------------------- + 3 files changed, 89 insertions(+), 43 deletions(-) + +commit 268eca24921e85eda98f4f0cce05d40c7235ba62 +Author: Behdad Esfahbod +Date: Sat Nov 24 01:11:12 2018 -0500 + + [arrays] Port (unused) ArrayOf.lsearch() to hb_array_t's + + src/hb-open-type.hh | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +commit 830856ba6b9454bf507e00416f9d45e9975fb7dc +Author: Behdad Esfahbod +Date: Sat Nov 24 01:09:28 2018 -0500 + + [arrays] Port hb_vector_t.lsearch() to hb_array_t's + + src/hb-dsalgs.hh | 26 +++++++++++++++++++++++--- + src/hb-vector.hh | 16 ++++------------ + 2 files changed, 27 insertions(+), 15 deletions(-) + +commit 96cf0889804b7d72a96274b25641bb18f7dd2e1e +Author: Behdad Esfahbod +Date: Sat Nov 24 01:07:15 2018 -0500 + + [arrays] More + + src/hb-face.cc | 6 +++--- + src/hb-vector.hh | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 3e26c8d2b10fc08642c25c7f13aef68b0b1008f6 +Author: Behdad Esfahbod +Date: Sat Nov 24 00:58:44 2018 -0500 + + [arrays] Update ArrayOf.lsearch() + + Currently unused apparently + + src/hb-open-type.hh | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +commit 22e1857b01c71714245ddca05cb3fa0127bf7da2 +Author: Behdad Esfahbod +Date: Sat Nov 24 00:53:19 2018 -0500 + + [arrays] Change argument type of cmp called by hb_vector_t.bsearch() + + Towards consolidating all array bsearch/... + + src/hb-aat-map.hh | 4 ++-- + src/hb-ot-map.hh | 4 ++-- + src/hb-set.hh | 2 +- + src/hb-vector.hh | 4 ++-- + 4 files changed, 7 insertions(+), 7 deletions(-) + +commit 5fdf7b724eb3cb5ac60cd7f90d3250877ad7ca06 +Author: Nathan Willis +Date: Thu Nov 15 17:40:21 2018 -0600 + + Usermanual: clusters chapter; add brief grapheme definition and + clarify monotonous cluster handling. + + docs/usermanual-clusters.xml | 56 + ++++++++++++++++++++++++++++++-------------- + 1 file changed, 39 insertions(+), 17 deletions(-) + +commit 939220e57da613e090d247aa1af2396c28370af4 +Author: Nathan Willis +Date: Thu Nov 15 15:47:03 2018 -0600 + + Usermanual: clusters chapter, minor updates. + + docs/usermanual-clusters.xml | 25 ++++++++++++++++--------- + 1 file changed, 16 insertions(+), 9 deletions(-) + +commit 53ac46e974cf0ee8720b40ef394714eb97ff53b9 +Author: Nathan Willis +Date: Mon Nov 12 12:17:06 2018 -0600 + + Usermanual: expand clusters chapter. + + docs/usermanual-clusters.xml | 743 + +++++++++++++++++++++++++++---------------- + 1 file changed, 473 insertions(+), 270 deletions(-) + +commit 30cb45b3eaacda15cc45435815cae3fd50e87557 +Author: Behdad Esfahbod +Date: Sat Nov 24 00:35:31 2018 -0500 + + Change ArrayOf.bsearch() return semantics + + Towards consolidating all array bsearch/... + + src/hb-aat-layout-kerx-table.hh | 16 +++------------- + src/hb-open-file.hh | 12 ++++++++---- + src/hb-open-type.hh | 42 + ++++++++++++++++++++++++++++++++--------- + src/hb-ot-cmap-table.hh | 30 ++++++++++++----------------- + src/hb-ot-color-svg-table.hh | 3 +-- + src/hb-ot-layout-common.hh | 29 +++++++++++----------------- + src/hb-ot-vorg-table.hh | 9 ++++----- + src/hb-vector.hh | 14 +++++++++----- + 8 files changed, 81 insertions(+), 74 deletions(-) + +commit 5cd9546ba73d9f8c8b7b8db0960d657c50b70f64 +Author: Behdad Esfahbod +Date: Sat Nov 24 00:38:36 2018 -0500 + + Minor + + src/hb-ot-layout-common.hh | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit fd94e729cb50f2b6bd83b80cbf400e10ac633a1c +Author: Behdad Esfahbod +Date: Sat Nov 24 00:45:55 2018 -0500 + + Whitespace + + src/hb-ot-layout-common.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit bb2a2065080a3099eb0dc82d1df0891ad2601316 +Author: Behdad Esfahbod +Date: Sat Nov 24 00:31:40 2018 -0500 + + Assert that item-type of arrays have static size + + src/hb-dsalgs.hh | 2 ++ + src/hb-open-type.hh | 4 ++++ + src/hb-vector.hh | 2 ++ + 3 files changed, 8 insertions(+) + +commit 690d9eb83d3421b397b0cb824cd768d6d73cbf12 +Author: Behdad Esfahbod +Date: Sat Nov 24 00:29:22 2018 -0500 + + [vector] Rename + + src/hb-vector.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ba38378fd4374f3d44bdc9aa0de902401b60b13d +Author: Behdad Esfahbod +Date: Sat Nov 24 00:27:57 2018 -0500 + + [aat] Minor + + src/hb-aat-layout-common.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 39b9d63b014380d421cc9b94a49dd411c7a5aabf +Author: Behdad Esfahbod +Date: Sat Nov 24 00:25:40 2018 -0500 + + Add hb_static_size(T) + + src/hb-null.hh | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit f99abcc37990a478189dda691d1fdac7b9d51386 +Author: Behdad Esfahbod +Date: Sat Nov 24 00:22:21 2018 -0500 + + Add template-function convenience macros + + src/hb-atomic.hh | 2 +- + src/hb-blob.hh | 4 ++-- + src/hb-common.cc | 2 +- + src/hb-ft.cc | 2 +- + src/hb-null.hh | 11 ++++++----- + src/hb.hh | 3 +++ + 6 files changed, 14 insertions(+), 10 deletions(-) + +commit ec83b2228e0bbb6df7e7b94dad49db32b041af4a +Author: Behdad Esfahbod +Date: Fri Nov 23 19:58:49 2018 -0500 + + Add null bytes for CmapSubtableLongGroup + + src/hb-ot-cmap-table.hh | 1 + + src/hb-static.cc | 4 +++- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit e2ffb33a534a427c760dae53d0469eeced4343ba +Author: Behdad Esfahbod +Date: Fri Nov 23 16:24:28 2018 -0500 + + Remove lsearch for small TableDirectorys + + src/hb-open-file.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 04f7e5536924e7f277d72b8cb9d878239877c331 +Author: Behdad Esfahbod +Date: Fri Nov 23 16:07:43 2018 -0500 + + [arrays] Add as_array() to hb_vector_t<> + + src/hb-vector.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit c514f65181390ab98b0f738632f71cda31e46b68 +Author: Behdad Esfahbod +Date: Fri Nov 23 16:04:56 2018 -0500 + + [arrays] Add as_array() to ArrayOf<> + + src/hb-open-type.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9552f4ef0da0b7e1fb28cb2738b865888e7941d9 +Author: Behdad Esfahbod +Date: Fri Nov 23 15:24:17 2018 -0500 + + [kern] Don't enforce length of last subtable + + src/hb-aat-layout-kerx-table.hh | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +commit 992b7128656e72f935089dc2e12c2d2a25511886 +Merge: c9cc96c0 018ba46e +Author: Behdad Esfahbod +Date: Fri Nov 23 13:49:34 2018 -0500 + + Merge pull request #1407 from harfbuzz/at-sign + + Don't canonicalize '@' to '-' in language tags + +commit 018ba46e4d003a5dd0f6d2d899226129c4ef0c60 +Author: David Corbett +Date: Fri Nov 23 13:21:22 2018 -0500 + + Don't canonicalize '@' to '-' in language tags + + Fixes #1406. + + src/hb-common.cc | 2 +- + test/api/test-ot-tag.c | 3 +++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit c9cc96c0cfbbb87b9292e413d500a454182be9f4 +Author: Ebrahim Byagowi +Date: Fri Nov 23 19:58:56 2018 +0330 + + [aat] Update expectation + + test/shaping/data/in-house/tests/macos-10.12.tests | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 748962264a9f098b32b9cb3fe4d18c786907a184 +Author: Behdad Esfahbod +Date: Fri Nov 23 11:10:17 2018 -0500 + + [aat] Disable mark advance zeroing if kern table has state-machines + + Geeza Pro for example, relies on that for fancy mark positioning. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1405 + + src/hb-aat-layout-kerx-table.hh | 15 +++++++++++++++ + src/hb-ot-kern-table.hh | 9 +++++++++ + src/hb-ot-layout.cc | 6 ++++++ + src/hb-ot-layout.hh | 3 +++ + src/hb-ot-shape.cc | 4 +++- + 5 files changed, 36 insertions(+), 1 deletion(-) + +commit 3d2b98ef14af29acd74f01647bef60cd410825fb +Author: Behdad Esfahbod +Date: Fri Nov 23 10:45:44 2018 -0500 + + Minor + + src/hb.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 341851efe158599a34d241a97593058a4333852e +Author: Ebrahim Byagowi +Date: Fri Nov 23 15:40:05 2018 +0330 + + [aat] Add macOS specific tests (#1404) + + .circleci/config.yml | 46 + ++++++++++++++-------- + test/shaping/CMakeLists.txt | 2 + + test/shaping/data/in-house/Makefile.sources | 1 + + test/shaping/data/in-house/tests/macos-10.12.tests | 10 +++++ + test/shaping/run-tests.py | 38 + ++++++++++++++---- + 5 files changed, 73 insertions(+), 24 deletions(-) + +commit 22798e93c414a2655c757a6e41b300f67e04a9a3 +Author: Behdad Esfahbod +Date: Thu Nov 22 22:47:51 2018 -0500 + + [use] Minor clarification + + src/hb-ot-shape-complex-use.cc | 34 +++++++++++++++++----------------- + 1 file changed, 17 insertions(+), 17 deletions(-) + +commit a2d6c1075a5595a08ef09357293919d9df8eb64a +Author: Behdad Esfahbod +Date: Thu Nov 22 22:40:57 2018 -0500 + + Minor tweak to FLAG64 + + src/hb.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 8280459e74cff2dec3de012abd309cda9578b759 +Merge: e4a4555d 3c7792ca +Author: Behdad Esfahbod +Date: Thu Nov 22 22:39:12 2018 -0500 + + Merge pull request #1291 from harfbuzz/use-reordering + + [use] Fix reordering + +commit e4a4555d1e40dacdf72452805e9e6b6109627d63 +Author: Behdad Esfahbod +Date: Thu Nov 22 22:17:49 2018 -0500 + + [cmap] Move code around + + src/hb-ot-cmap-table.hh | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +commit 758c9d68e2143493978d8ac8391f4af2a2abc26a +Author: Behdad Esfahbod +Date: Thu Nov 22 22:16:12 2018 -0500 + + [morx/kerx] Limit range to subtable when sanitizing + + src/hb-aat-layout-kerx-table.hh | 2 ++ + src/hb-aat-layout-morx-table.hh | 2 ++ + 2 files changed, 4 insertions(+) + +commit a9fe787a11fc391d9a43a4ea19e6eb1c474199bd +Author: Behdad Esfahbod +Date: Thu Nov 22 22:12:36 2018 -0500 + + [sanitizer] Add reset_object(), make set_object() do bounds-check + + Affects morx/kerx run-time only currently. Will adjust their + sanitize next. + + src/hb-aat-layout-kerx-table.hh | 1 + + src/hb-aat-layout-morx-table.hh | 1 + + src/hb-machinery.hh | 30 +++++++++++++++++++----------- + 3 files changed, 21 insertions(+), 11 deletions(-) + +commit 2c8188bf599e351a4e0804d74612f9643b3d2443 +Author: Behdad Esfahbod +Date: Thu Nov 22 22:02:19 2018 -0500 + + [kerx] Make sure subtables are non-zero-length + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11400 + + src/hb-aat-layout-kerx-table.hh | 1 + + src/hb-aat-layout-morx-table.hh | 2 +- + ...z-testcase-minimized-hb-shape-fuzzer-5722888989048832 | Bin 0 -> + 3608 bytes + 3 files changed, 2 insertions(+), 1 deletion(-) + +commit a9e0bdc35dfcbead7d4b6fa249d60ebedd7d43ca +Author: Behdad Esfahbod +Date: Thu Nov 22 21:30:04 2018 -0500 + + [GSUB] Don't flush glyphset during recursion in closure() + + See comment. + + Supercedes https://github.com/harfbuzz/harfbuzz/pull/1401 + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11366 + + src/hb-ot-layout-gsub-table.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 8982830d3ec54f50cc951de9569520fafc735e75 +Author: Garret Rieger +Date: Mon Nov 19 13:00:24 2018 -0800 + + [subset] add fuzzer testcase. + + ...z-testcase-minimized-hb-subset-fuzzer-5067936541179904 | Bin 0 -> + 172 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit d0e81b2cc85d09d01905c5fc5b3382c25eaa3bb3 +Author: Behdad Esfahbod +Date: Thu Nov 22 21:20:39 2018 -0500 + + [set] Rename + + src/hb-set.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit e866910579e9cdc5b1ffa2e401fd0c056d44ca6a +Author: Behdad Esfahbod +Date: Thu Nov 22 18:07:59 2018 -0500 + + Enforce requiring null_size even if min_size is 0 + + This concludes null-size enforcement changes + + src/hb-null.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4d4fd64ff47da04a7008d410c92e8fb4ad970781 +Author: Behdad Esfahbod +Date: Thu Nov 22 18:07:36 2018 -0500 + + Allow non-nullable OffsetTo<> to non-Null'able objects + + src/hb-open-type.hh | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +commit fa9f585ec53bc7145d3bed1a4bd756d64dae1e55 +Author: Behdad Esfahbod +Date: Thu Nov 22 17:56:51 2018 -0500 + + [glyf] Don't mark structs UNBOUNDED + + See comments. + + src/hb-ot-glyf-table.hh | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit f47a60a7543dbaf41086c25a1a22ae518d8b92a9 +Author: Behdad Esfahbod +Date: Thu Nov 22 17:53:29 2018 -0500 + + Mark UnsizedArrayOf<> as UNBOUNDED + + Since min_size is 0, Null() still accepts this type. + + src/hb-open-type.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 199a0f7b41b691e371487fd569c0d0146da3c3f3 +Author: Behdad Esfahbod +Date: Thu Nov 22 17:31:07 2018 -0500 + + [ot-shape] Simplify logic + + src/hb-ot-shape.cc | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 014e4980ed9c8c473001abdb3a44121eb73fd50d +Author: Behdad Esfahbod +Date: Thu Nov 22 16:21:49 2018 -0500 + + Move + + src/hb-ot-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 62890dee18b88865a2014fb6a1322c1c9218bd49 +Author: Behdad Esfahbod +Date: Thu Nov 22 16:20:29 2018 -0500 + + [aat] Zero mark advances if decided so even if there's cross-kerning + + Cross-kerning can only take care of positioning vertically. + It doesn't + adjust mark advance... + + src/hb-ot-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a201fa74cd67f36a402a5c8093889c9d793e9fd5 +Author: Behdad Esfahbod +Date: Thu Nov 22 15:52:29 2018 -0500 + + [aat] Tweak fallback positioning logic when applying morx + + Such that for Indic-like scripts (eg. Khmer), we don't do any + fallback mark + advance-zeroing / positioning, but we do for Latin, etc. Reuses + preferences + of our script-specific OpenType shapers for those. + + Fixes regression: https://github.com/harfbuzz/harfbuzz/issues/1393 + Which means, fixes again: + https://github.com/harfbuzz/harfbuzz/issues/1264 + While not regressing: https://github.com/harfbuzz/harfbuzz/issues/1357 + + src/hb-ot-shape.cc | 38 +++++++++++++++++++++++--------------- + src/hb-ot-shape.hh | 3 +++ + 2 files changed, 26 insertions(+), 15 deletions(-) + +commit fa0bd8964d110c168a918bc331dcd350c3fed8c1 +Author: Behdad Esfahbod +Date: Thu Nov 22 14:46:39 2018 -0500 + + [myanmar] Minor move + + src/hb-ot-shape-complex.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 7dc561984bdb1f29f09ae0793195b5fbf772522b +Author: Behdad Esfahbod +Date: Thu Nov 22 14:45:46 2018 -0500 + + [myanmar] If there's no GSUB table, pick myanmar shaper + + Needed for morx+kern mark-zeroing interaction. All other scripts + work this way. + + src/hb-ot-shape-complex.hh | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit 25f52f58c20715cc0dee2dd2885669078a128b08 +Author: Behdad Esfahbod +Date: Thu Nov 22 14:41:01 2018 -0500 + + [myanmar] Remove myanmar_old shaper + + Over time it has become the same as default shaper. So, remove. + + src/hb-ot-shape-complex-myanmar.cc | 21 --------------------- + src/hb-ot-shape-complex.hh | 4 +--- + 2 files changed, 1 insertion(+), 24 deletions(-) + +commit eeed802b1d0f932c61a088d3e0156ae70645b9e2 +Author: Behdad Esfahbod +Date: Thu Nov 22 01:53:36 2018 -0500 + + Fix spurious gcc warnings + + ../../src/hb-null.hh:53:39: warning: enum constant in boolean context + [-Wint-in-bool-context] + + src/hb-null.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b96ecb9971a9ad089a631d0139f05ae9d880fc55 +Author: Behdad Esfahbod +Date: Thu Nov 22 01:49:12 2018 -0500 + + More + + This makes more of the gcc spurious warning: + + ../../src/hb-null.hh:53:39: warning: enum constant in boolean context + [-Wint-in-bool-context] + + But not going to let that defeat correct code. Type to switch + to clang + as my main compiler... + + src/hb-blob.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2737aa81e5aee721e868bf0c72f19c0245c721fe +Author: Behdad Esfahbod +Date: Thu Nov 22 01:44:27 2018 -0500 + + Fix up recent change + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1300 + + src/hb-null.hh | 12 +++++++++--- + src/hb-open-type.hh | 5 ----- + src/hb-ot-glyf-table.hh | 4 ++-- + 3 files changed, 11 insertions(+), 10 deletions(-) + +commit fffea5aff7a631eedd13c38c1fb7ea4f5f950930 +Author: Behdad Esfahbod +Date: Thu Nov 22 01:25:34 2018 -0500 + + Minor + + src/hb-open-type.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 209b58ef731f102b92179ed76551e2fd6b5ed075 +Author: Behdad Esfahbod +Date: Thu Nov 22 01:22:33 2018 -0500 + + Minor + + src/hb-ot-kern-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3b9fd176e83bbebc4d0b5fc967c15b08fdef7015 +Author: Behdad Esfahbod +Date: Thu Nov 22 01:18:55 2018 -0500 + + Disallow taking Null() of unbounded structs + + Not sure I've marked all such structs. To be done as we discover. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1300 + + src/hb-aat-layout-common.hh | 2 +- + src/hb-machinery.hh | 4 ++++ + src/hb-ot-kern-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 31 ++++++++++++++++--------------- + 4 files changed, 22 insertions(+), 17 deletions(-) + +commit f2b91d6510face95008151bb0d25837723536f9f +Author: Behdad Esfahbod +Date: Thu Nov 22 01:10:22 2018 -0500 + + Use Type::null_size for our structs in Null(), sizeof() for other + types + + src/hb-null.hh | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +commit 7dd945a8764cbbf76f686fd9387918b63f7d2fb4 +Author: Behdad Esfahbod +Date: Thu Nov 22 01:05:02 2018 -0500 + + One more time.. + + src/hb-machinery.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d062ad10de6c63d94676660b76526a160cf4299e +Author: Behdad Esfahbod +Date: Thu Nov 22 00:39:14 2018 -0500 + + Fix bots happy again, hopefully + + So, our fallback static_assert cannot be had more than once per line + of source. + + src/hb-machinery.hh | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +commit fb10c021c8a32f8dc054f008caf86af82667e109 +Author: Behdad Esfahbod +Date: Thu Nov 22 00:21:49 2018 -0500 + + Revert alignof() == 1 check + + Bots not happy with using "this" inside assertion... + + This reverts 2656644887e77a9d814bb12374af3c26b42fd935 + + src/hb-machinery.hh | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +commit 8d778877b88155dec1808a994416ead0b3d98ae7 +Author: Behdad Esfahbod +Date: Wed Nov 21 23:46:09 2018 -0500 + + .. + + src/hb-machinery.hh | 8 ++++++-- + src/hb-null.hh | 4 ++-- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit 8cfeed99486e87c3217dc141bc24b7768a460f32 +Author: Behdad Esfahbod +Date: Wed Nov 21 23:42:31 2018 -0500 + + Minor + + src/hb-machinery.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e5d954a2fb0c390ea67e83763e3c3a47caa2eb50 +Author: Behdad Esfahbod +Date: Wed Nov 21 23:30:50 2018 -0500 + + Minor + + src/hb-machinery.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e987059c618e03d2346c31ed64429d67ce0e367a +Author: Behdad Esfahbod +Date: Wed Nov 21 23:25:06 2018 -0500 + + Minor + + src/hb-machinery.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit a2b6d308a40d737f54a79f00bc7ace226bad5aaf +Author: Behdad Esfahbod +Date: Wed Nov 21 23:23:49 2018 -0500 + + Remove DEFINE_SIZE_ARRAY2 + + src/hb-machinery.hh | 6 ------ + src/hb-ot-layout-common.hh | 8 ++++---- + src/hb-ot-post-table.hh | 6 +++--- + 3 files changed, 7 insertions(+), 13 deletions(-) + +commit 2656644887e77a9d814bb12374af3c26b42fd935 +Author: Behdad Esfahbod +Date: Wed Nov 21 23:23:21 2018 -0500 + + Check alignof() structs are 1 + + src/hb-machinery.hh | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit 6321fdf7040ce48e3de8d34fdcc57caa6433cb66 +Author: Behdad Esfahbod +Date: Wed Nov 21 23:19:00 2018 -0500 + + Whitespace + + src/hb-machinery.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f961c1eb88af0d178e5d3431b9d57bdf79669488 +Merge: ecdceea8 264439c6 +Author: Behdad Esfahbod +Date: Wed Nov 21 17:27:27 2018 -0500 + + Merge pull request #1400 from harfbuzz/sharada-sandhi-mark + + Test U+111C9 SHARADA SANDHI MARK + +commit 264439c6c308ac5f01c4ba4faf64daa2d642236a +Author: David Corbett +Date: Wed Nov 21 16:33:45 2018 -0500 + + Test U+111C9 SHARADA SANDHI MARK + + .../fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf | Bin 0 -> + 968 bytes + test/shaping/data/in-house/tests/use-syllable.tests | 1 + + 2 files changed, 1 insertion(+) + +commit ecdceea861952be003e1d435aa3282a4e3e200a9 +Merge: b89c7fd3 b3d5b0a5 +Author: Behdad Esfahbod +Date: Wed Nov 21 16:12:32 2018 -0500 + + Merge pull request #1399 from harfbuzz/sharada-sandhi-mark + + Fix USE categories for U+111C9 SHARADA SANDHI MARK + +commit b89c7fd3dc505a958dd4b6acec0e0f8e57224fd8 +Author: Behdad Esfahbod +Date: Wed Nov 21 12:32:48 2018 -0500 + + Allow defining HB_USE_ATEXIT to 0 + + That's better use of that value than requiring extra macro + HB_NO_ATEXIT + + src/hb-common.cc | 10 +++++----- + src/hb-ft.cc | 12 ++++++------ + src/hb-glib.cc | 6 +++--- + src/hb-icu.cc | 6 +++--- + src/hb-ot-font.cc | 6 +++--- + src/hb-shape.cc | 6 +++--- + src/hb-shaper.cc | 6 +++--- + src/hb-ucdn.cc | 6 +++--- + src/hb-uniscribe.cc | 4 ++-- + src/hb.hh | 5 ++++- + 10 files changed, 35 insertions(+), 32 deletions(-) + +commit b3d5b0a5d92115ca672b8103999ab7ac88e39a4a +Author: David Corbett +Date: Wed Nov 21 11:35:44 2018 -0500 + + Fix USE categories for U+111C9 SHARADA SANDHI MARK + + src/gen-use-table.py | 7 ++++++- + src/hb-ot-shape-complex-use-table.cc | 2 +- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit f48bb9a3939067f24a81007e642caaac77cc7167 +Author: Behdad Esfahbod +Date: Tue Nov 20 20:40:55 2018 -0500 + + [var] Deprecated axis enumeration API and add new version + + New version has axis flags. + + New API: + +hb_ot_var_axis_info_t + +hb_ot_var_find_axis_info() + +hb_ot_var_get_axis_infos() + + Deprecated API: + -HB_OT_VAR_NO_AXIS_INDEX + -hb_ot_var_axis_t + -hb_ot_var_find_axis() + -hb_ot_var_get_axes() + + docs/harfbuzz-sections.txt | 14 +++--- + src/hb-deprecated.h | 37 +++++++++++++++ + src/hb-ot-var-fvar-table.hh | 112 + ++++++++++++++++++++++++++++++++------------ + src/hb-ot-var.cc | 43 ++++++++++++++--- + src/hb-ot-var.h | 61 ++++++++++++------------ + test/api/test-ot-face.c | 2 +- + 6 files changed, 192 insertions(+), 77 deletions(-) + +commit b2d803cef6974519d5892af2c9efeb8dfba87618 +Author: Behdad Esfahbod +Date: Tue Nov 20 11:42:25 2018 -0500 + + Remove newly-added -hb_ot_var_axis_get_flags() + + src/hb-ot-var-fvar-table.hh | 6 ------ + src/hb-ot-var.cc | 12 ------------ + src/hb-ot-var.h | 4 ---- + 3 files changed, 22 deletions(-) + +commit 736897d7a1410fd281fbcedc084b85bf4ba1410c +Author: Behdad Esfahbod +Date: Tue Nov 20 11:40:43 2018 -0500 + + [var] Make sure hb_ot_var_axis_flags_t is int-sized + + src/hb-ot-var.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit eab5d15f6156e771cb606b760dd170b96c5cd398 +Author: Behdad Esfahbod +Date: Tue Nov 20 11:33:33 2018 -0500 + + [var] Move code + + src/hb-ot-var.h | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +commit 1ecbf4d3e3de7edc86651c6f805788747d6d89af +Merge: 515f1a16 064f703c +Author: Michiharu Ariza +Date: Tue Nov 20 17:19:05 2018 -0800 + + Merge branch 'master' into cff-subset + +commit 064f703c7ac5a28803a8221720e922ea6dbd2505 +Merge: be1828da 82951182 +Author: Behdad Esfahbod +Date: Tue Nov 20 16:29:30 2018 -0500 + + Merge pull request #1397 from harfbuzz/small-emoji-table + + Shrink the emoji table by merging adjacent ranges + +commit 82951182799772a642d32195dd87e6f0c116f545 +Author: David Corbett +Date: Tue Nov 20 15:41:45 2018 -0500 + + Shrink the emoji table by merging adjacent ranges + + src/gen-emoji-table.py | 13 +-- + src/hb-unicode-emoji-table.hh | 189 + ++++-------------------------------------- + 2 files changed, 23 insertions(+), 179 deletions(-) + +commit be1828daaa1e1a72d971aed8d34fff54688d0f41 +Author: Behdad Esfahbod +Date: Tue Nov 20 11:16:23 2018 -0500 + + [var] Fix type of coords returned + + Ouch. Wonder how none of the bots caught the float->int truncation. + + src/hb-ot-var-fvar-table.hh | 2 +- + src/hb-ot-var.cc | 2 +- + src/hb-ot-var.h | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 8f3ee17ae468950a34439785d2e6ac4182efb65c +Author: Behdad Esfahbod +Date: Tue Nov 20 01:38:23 2018 -0500 + + [travis] Update Coverity token + + .travis.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f9552362986efd0973b2637d21b787edbc8479f2 +Author: Behdad Esfahbod +Date: Tue Nov 20 01:21:36 2018 -0500 + + Add codecov.io badge + + README | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 831ba74382e35f110006539f22bebce4d57c8502 +Author: Behdad Esfahbod +Date: Tue Nov 20 01:16:08 2018 -0500 + + Fix Codacy "issues" + + src/test-name-table.cc | 2 +- + src/test-ot-color.cc | 14 +++++++------- + test/api/test-buffer.c | 5 +++-- + test/api/test-object.c | 2 +- + test/api/test-ot-name.c | 2 +- + 5 files changed, 13 insertions(+), 12 deletions(-) + +commit c49e43c1ffee0e9664da6202ace493d932b725a1 +Author: Behdad Esfahbod +Date: Tue Nov 20 01:06:50 2018 -0500 + + [travis] Another push for codecov.io after setting token + + .travis.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 96b24c5124a085b7601215360eed847ce5302699 +Author: Behdad Esfahbod +Date: Tue Nov 20 01:03:42 2018 -0500 + + [travis] Add codecov.io + + .travis.yml | 1 + + 1 file changed, 1 insertion(+) + +commit 3c7792ca326abfb989285f794d6ee71ad9f6bf89 +Author: David Corbett +Date: Sat Oct 20 15:02:26 2018 -0400 + + [use] Fix reordering + + Fixes #1235. + + src/hb-ot-shape-complex-use.cc | 48 + ++++++++++++++------- + src/hb.hh | 2 + + .../4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf | Bin 0 -> 1824 bytes + test/shaping/data/in-house/tests/use.tests | 3 ++ + 4 files changed, 38 insertions(+), 15 deletions(-) + +commit 587d49fc657c10c8a20f2409a04d72bf80bb361e +Author: Behdad Esfahbod +Date: Mon Nov 19 14:27:19 2018 -0500 + + [fvar] Add named-instance API + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1241 + + docs/harfbuzz-sections.txt | 4 ++++ + src/hb-ot-var-fvar-table.hh | 55 + ++++++++++++++++++++++++++++++++++++++++++--- + src/hb-ot-var.cc | 33 +++++++++++++++++++++++++++ + src/hb-ot-var.h | 32 ++++++++++++++++++++++++++ + 4 files changed, 121 insertions(+), 3 deletions(-) + +commit 46c0da820fc313bad8afaf019d2cd9065fa5f514 +Author: Behdad Esfahbod +Date: Mon Nov 19 13:32:48 2018 -0500 + + Fix build + + src/hb-dsalgs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 56c9238d3da8c034336cf80ba37e03e33c493718 +Author: Behdad Esfahbod +Date: Mon Nov 19 13:09:53 2018 -0500 + + [fvar] Rewrite sanitize + + src/hb-ot-var-fvar-table.hh | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 4a6a692e3ea4fab632a0162c6d513dc151054d8f +Author: Behdad Esfahbod +Date: Mon Nov 19 13:04:43 2018 -0500 + + [fvar] Use hb_array_t for axes + + src/hb-dsalgs.hh | 6 ++++++ + src/hb-ot-var-fvar-table.hh | 14 ++++---------- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit e0097396010c40cf62641cd12ceb12dd5d79c9c7 +Author: Behdad Esfahbod +Date: Mon Nov 19 12:53:53 2018 -0500 + + [fvar] Minor + + src/hb-ot-var-fvar-table.hh | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 1a2eb108b857de9c5e84cc5de0c12c7657e04498 +Author: Behdad Esfahbod +Date: Mon Nov 19 12:36:56 2018 -0500 + + [ot-var] Add hb_ot_var_axis_get_flags() + + Part of https://github.com/harfbuzz/harfbuzz/issues/1241 + + New API: + +hb_ot_var_axis_flags_t + +hb_ot_var_axis_get_flags + + docs/harfbuzz-sections.txt | 2 ++ + src/hb-buffer.h | 2 ++ + src/hb-ot-var-fvar-table.hh | 9 +++++++++ + src/hb-ot-var.cc | 12 ++++++++++++ + src/hb-ot-var.h | 13 +++++++++++++ + 5 files changed, 38 insertions(+) + +commit bd6b2ba1d3910cc259db7abeb6c9bd7ed9494857 +Author: Behdad Esfahbod +Date: Mon Nov 19 11:34:56 2018 -0500 + + [ot-var] Add flags + + Unfortunate that we don't have room in hb_ot_var_axis_t to expose + flags :(. + + src/hb-ot-var-fvar-table.hh | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit c076c7b85ce4d069ae8b2b04143aca4c4f052ae9 +Author: Behdad Esfahbod +Date: Mon Nov 19 11:30:40 2018 -0500 + + [ot-var] Use hb_ot_name_id_t + + src/hb-ot-var.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 515f1a16140f78c9ec379854851f77a1b44af145 +Merge: a6da9b94 e3a1a835 +Author: Michiharu Ariza +Date: Fri Nov 16 17:38:47 2018 -0800 + + Merge branch 'master' into cff-subset + +commit a6da9b9415bae43c58f12a8e43b77ba31dd432a6 +Author: Michiharu Ariza +Date: Fri Nov 16 17:29:03 2018 -0800 + + fixed Charset format selection + + src/hb-subset-cff1.cc | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit e3a1a8350a6a7933b0a100194985f4425ab9de19 +Author: Behdad Esfahbod +Date: Fri Nov 16 16:53:25 2018 -0800 + + 2.1.3 + + NEWS | 6 ++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 9714e114b88893bd962b1bcf36382bdacbc4866c +Author: Behdad Esfahbod +Date: Fri Nov 16 16:52:42 2018 -0800 + + Fix recent commits + + src/hb-open-type.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0328a1ce41611ed981d41384ae5727479699f3a0 +Author: Behdad Esfahbod +Date: Fri Nov 16 16:48:28 2018 -0800 + + Revert b4c61130324455bfd42095b01fa14ac901e441f1 + + Was causing more trouble than it solved. We use unsigned for + indexing, + and it's not helpful to allow that wrapping to negative integers on + 32bit machines. The only way we could work around it would have been + by accepting int64_t arg, but that's overkill. + + Ignore the MSVC 2008 build issue. We don't support that compiler. + + src/hb-open-type.hh | 17 ++++------------- + 1 file changed, 4 insertions(+), 13 deletions(-) + +commit 52f61cdb87b67ef42a25288d8624170d0b6d3a25 +Author: Behdad Esfahbod +Date: Fri Nov 16 16:41:59 2018 -0800 + + Detect over/under-flow in UnsizedArray::operator[] + + Was causing bad substitutions in mort table because of + WordOffsetToIndex() + producing negative numbers that were cast to unsigned int and + returned as + large numbers (which was desirable, so they would be rejected), + but then + they were cast to int when passed to this operator and acting as small + negative integers, which was bad... + + Detect overflow. Ouch, however, now I see this still fails on 32-bit. + Guess I'm going to revert an earlier change. + + src/hb-open-type.hh | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +commit 6910ff03e66f5f4c9eb5592262d414ef7d91df04 +Author: Behdad Esfahbod +Date: Fri Nov 16 16:11:02 2018 -0800 + + [aat] Fix mort shaping + + Ouch! + + src/hb-aat-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fdb29ab2b0058c9813f9fc44c83dd9048db92d16 +Author: Behdad Esfahbod +Date: Fri Nov 16 15:38:11 2018 -0800 + + 2.1.2 + + NEWS | 13 ++++++++++++- + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 15 insertions(+), 4 deletions(-) + +commit cff4c6087fdb667a40f54f20ca3c49251bf076de +Author: Behdad Esfahbod +Date: Fri Nov 16 15:04:41 2018 -0800 + + Fix vertical fallback space sign + + Ouch! + + Follow-up to cf203af8a33591c163b63dbdf0fd341bc4606190 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1343 + + src/hb-ot-shape-fallback.cc | 8 ++++---- + test/shaping/data/in-house/tests/spaces.tests | 22 +++++++++++----------- + 2 files changed, 15 insertions(+), 15 deletions(-) + +commit 7a97f7074052a5d746af29f0743abd20682b09a2 +Author: Behdad Esfahbod +Date: Fri Nov 16 14:46:40 2018 -0800 + + Don't apply GPOS if applying morx + + That's what Apple does, and it wouldn't degrade our OpenType + performance. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1348 + + src/hb-ot-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eafd515639497098436ecf4c7b836e231bced323 +Author: Behdad Esfahbod +Date: Fri Nov 16 14:45:56 2018 -0800 + + Prefer morx table if GSUB is empty (no scripts) + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1348 + + src/hb-ot-shape.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit aa06574823e27c4dbb378d2467a3e6f6f36af9fe +Author: Behdad Esfahbod +Date: Fri Nov 16 14:31:05 2018 -0800 + + Minor + + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-math-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit b6903bd6c4b0c792c821e37a8e223088ae40e5fa +Author: Michiharu Ariza +Date: Fri Nov 16 13:46:58 2018 -0800 + + ensure fdmap initialized as identity for single-FD (non-CID) fonts + + src/hb-subset-cff1.cc | 13 ++++++++++--- + src/hb-subset-cff2.cc | 2 ++ + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit b403be8ad98ffd2dbe95dad73e96c7ed1295d9fc +Merge: b67a7c73 50d1a41c +Author: Michiharu Ariza +Date: Fri Nov 16 12:29:18 2018 -0800 + + Merge branch 'master' into cff-subset + +commit b67a7c731f041323c19ab245f0285c304d9ae3d2 +Author: Michiharu Ariza +Date: Fri Nov 16 12:28:24 2018 -0800 + + drop dotsection as hint along with test case + + src/hb-subset-cff-common.hh | 4 ++++ + src/hb-subset-cff1.cc | 1 + + test/api/fonts/cff1_dotsect.nohints.otf | Bin 0 -> 3132 bytes + test/api/fonts/cff1_dotsect.otf | Bin 0 -> 3220 bytes + test/api/test-subset-cff1.c | 21 +++++++++++++++++++++ + 5 files changed, 26 insertions(+) + +commit 50d1a41c08ad3508a94240b52df03c383ae8f1f8 +Author: Behdad Esfahbod +Date: Fri Nov 16 08:52:57 2018 -0500 + + [coretext] Hopefully the last one + + src/hb-coretext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0aab861f9cda6fba5ce71562d9f087d924e8a161 +Author: Behdad Esfahbod +Date: Fri Nov 16 08:43:25 2018 -0500 + + [coretext] Another round + + src/hb-coretext.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 0809b76a9a1d7bd53818df7e83a9c81e664dfe0e +Author: Behdad Esfahbod +Date: Fri Nov 16 08:29:47 2018 -0500 + + [coretext] One more try.. + + src/hb-coretext.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 78bd4475946f2d255539306e4b1115f408c54b54 +Author: Behdad Esfahbod +Date: Fri Nov 16 04:10:53 2018 -0500 + + [coretext] One more try + + src/hb-coretext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fd27a23c824bbbd4f4c7e75701cc5d287289704b +Author: Behdad Esfahbod +Date: Fri Nov 16 03:57:12 2018 -0500 + + [coretext] Another build fix attemt + + src/hb-coretext.cc | 3 --- + 1 file changed, 3 deletions(-) + +commit 729aedf0da90cbf11235a35588cfdc06ba87a784 +Author: Behdad Esfahbod +Date: Fri Nov 16 03:26:46 2018 -0500 + + [directwrite] Fix build + + src/hb-directwrite.cc | 2 -- + 1 file changed, 2 deletions(-) + +commit cfb9771a3b096006cbae98438f1ba101d222e0e4 +Author: Behdad Esfahbod +Date: Fri Nov 16 03:24:22 2018 -0500 + + [coretext] Try to fix + + src/hb-coretext.cc | 48 ++++++++++++++++++++++++++++++++++++++---------- + src/hb-machinery.hh | 15 +++++---------- + src/hb-shaper.hh | 44 -------------------------------------------- + 3 files changed, 43 insertions(+), 64 deletions(-) + +commit e3e9547365417e547beec84494c8bf6e4e2947fb +Author: Behdad Esfahbod +Date: Fri Nov 16 02:55:29 2018 -0500 + + [coretext] Unbreak build + + src/hb-coretext.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ce5da0f36a2ece29c387810a060531df15ad6c7b +Author: Behdad Esfahbod +Date: Fri Nov 16 02:29:13 2018 -0500 + + [shaper] Rewrite shaper data code to be more template-driven than + macro-driven + + src/hb-coretext.cc | 17 +++---- + src/hb-directwrite.cc | 9 +--- + src/hb-face.cc | 12 +---- + src/hb-face.hh | 13 ++---- + src/hb-fallback-shape.cc | 5 -- + src/hb-font.cc | 14 ++---- + src/hb-font.hh | 12 ++--- + src/hb-graphite2.cc | 11 ++--- + src/hb-machinery.hh | 14 ++---- + src/hb-ot-shape.cc | 5 -- + src/hb-shape-plan.cc | 4 +- + src/hb-shaper-impl.hh | 9 +--- + src/hb-shaper.hh | 117 + ++++++++++++++++++++++++++++++++--------------- + src/hb-uniscribe.cc | 32 +++++-------- + 14 files changed, 127 insertions(+), 147 deletions(-) + +commit cb4bf85b14afb3761a85e3da130f2844ac94a49d +Author: Behdad Esfahbod +Date: Fri Nov 16 02:02:24 2018 -0500 + + [hdmx] Fix bounds checking + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11351 + + src/hb-ot-hdmx-table.hh | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +commit af727b4e629f8b07d7afb809be69d053827f6a51 +Author: Behdad Esfahbod +Date: Fri Nov 16 01:55:39 2018 -0500 + + [hdmx] Minor + + src/hb-ot-hdmx-table.hh | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 9e9f16c92debecb4caf533fa112898dfec116d98 +Author: Behdad Esfahbod +Date: Fri Nov 16 01:48:26 2018 -0500 + + [subset] Remove invalid glyphs from glypset to retain + + Fixes https://github.com/harfbuzz/harfbuzz/pull/1388 + + src/hb-subset-plan.cc | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 072c7aba92d3c92c84454a12578264f12439bb0d +Author: Michiharu Ariza +Date: Thu Nov 15 15:41:46 2018 -0800 + + use 2-byte offset instead of 4-byte for local subrs + + more than enough since local subrs immediately follow its + corresponding private dict, as the result 2-byte redunction for each + font dict with local subrs + updated api test expected subset fonts accordingly + + src/hb-subset-cff-common.hh | 4 ++-- + test/api/fonts/AdobeVFPrototype.abc.otf | Bin 7460 -> + 7456 bytes + test/api/fonts/AdobeVFPrototype.ac.nohints.otf | Bin 6780 -> + 6780 bytes + test/api/fonts/AdobeVFPrototype.ac.otf | Bin 6996 -> + 6996 bytes + .../fonts/SourceHanSans-Regular.41,4C2E.nohints.otf | Bin 2380 -> + 2376 bytes + test/api/fonts/SourceHanSans-Regular.41,4C2E.otf | Bin 2576 -> + 2572 bytes + test/api/fonts/SourceSansPro-Regular.abc.otf | Bin 1812 -> + 1808 bytes + test/api/fonts/SourceSansPro-Regular.ac.nohints.otf | Bin 1592 -> + 1592 bytes + test/api/fonts/SourceSansPro-Regular.ac.otf | Bin 1708 -> + 1704 bytes + test/api/fonts/cff1_seac.C0.otf | Bin 1604 -> + 1600 bytes + 10 files changed, 2 insertions(+), 2 deletions(-) + +commit 9d0231cfe7c404da3b5bc360ad76180a7aded62c +Author: Michiharu Ariza +Date: Thu Nov 15 15:39:43 2018 -0800 + + fixed a subset bug when no font dicts reduce + + src/hb-ot-cff-common.hh | 11 +++++++++++ + src/hb-subset-cff-common.cc | 24 +++++++++++++----------- + src/hb-subset-cff1.cc | 27 ++++++--------------------- + src/hb-subset-cff2.cc | 25 +++++-------------------- + 4 files changed, 35 insertions(+), 52 deletions(-) + +commit 11aa0468ac2c62ff734ba6b0f6eb43d1bd6f602b +Author: Ebrahim Byagowi +Date: Thu Nov 15 23:10:56 2018 +0330 + + [subset] minor, adjust spaces + + src/hb-open-type.hh | 70 ++++++------ + src/hb-ot-cmap-table.hh | 182 +++++++++++++++---------------- + src/hb-ot-glyf-table.hh | 242 + ++++++++++++++++++++--------------------- + src/hb-ot-hdmx-table.hh | 20 ++-- + src/hb-ot-hmtx-table.hh | 14 +-- + src/hb-ot-layout-common.hh | 77 ++++++------- + src/hb-ot-layout-gpos-table.hh | 16 +-- + src/hb-ot-layout-gsub-table.hh | 4 +- + src/hb-ot-layout-gsubgpos.hh | 88 +++++++-------- + src/hb-ot-os2-table.hh | 24 ++-- + src/hb-ot-post-table.hh | 26 ++--- + src/hb-subset-glyf.cc | 182 +++++++++++++++---------------- + src/hb-subset-glyf.hh | 6 +- + src/hb-subset-input.cc | 4 +- + src/hb-subset-plan.cc | 32 +++--- + src/hb-subset-plan.hh | 12 +- + src/hb-subset.cc | 46 ++++---- + src/hb-subset.h | 7 +- + util/hb-subset.cc | 2 +- + 19 files changed, 510 insertions(+), 544 deletions(-) + +commit d7c50ff0d65192fd2b7b80704e227fa108c06de3 +Author: Ebrahim Byagowi +Date: Thu Nov 15 23:10:49 2018 +0330 + + [math] minor, adjust spaces + + src/hb-ot-math-table.hh | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit 13735570f051c4131cdc481939799d76c38c758b +Author: Michiharu Ariza +Date: Thu Nov 15 12:10:23 2018 -0800 + + reject nested seac + + src/hb-cff1-interp-cs.hh | 4 ++++ + src/hb-ot-cff1-table.cc | 11 ++++++----- + 2 files changed, 10 insertions(+), 5 deletions(-) + +commit c37aecd41c5b55e5ef496f3c4cc255a1e2ce7f9f +Merge: ecdb77f0 cabe433f +Author: Michiharu Ariza +Date: Thu Nov 15 11:03:46 2018 -0800 + + Merge branch 'master' into cff-subset + +commit ecdb77f0ae1ef9b129cf9195dbdaa9f6c4425ed5 +Author: Michiharu Ariza +Date: Thu Nov 15 10:54:15 2018 -0800 + + fixed CFF1 subset of std encoding & non-std charset combo + + src/hb-ot-cff-common.hh | 2 -- + src/hb-ot-cff1-table.hh | 2 ++ + src/hb-subset-cff1.cc | 5 +++-- + 3 files changed, 5 insertions(+), 4 deletions(-) + +commit cabe433fbb81d314ad9e3cbed768dd13983a4477 +Author: Behdad Esfahbod +Date: Thu Nov 15 02:48:50 2018 -0500 + + [base] Add TODO items + + src/hb-ot-layout-base-table.hh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 3bf1ce748fa89316dd32de28bfdc636495e657fb +Author: Behdad Esfahbod +Date: Wed Nov 14 21:08:54 2018 -0500 + + [shaper] Rename + + src/hb-shape-plan.cc | 2 +- + src/hb-shape.cc | 2 +- + src/hb-shaper.cc | 16 ++++++++-------- + src/hb-shaper.hh | 4 ++-- + 4 files changed, 12 insertions(+), 12 deletions(-) + +commit c221dc0ba70fd4af94d8f735a9cef1ab92cc6ede +Author: Behdad Esfahbod +Date: Wed Nov 14 14:49:34 2018 -0500 + + [ot-shape] Move code around + + src/hb-aat-layout-common.hh | 4 ++-- + src/hb-aat-layout.cc | 8 ++++---- + src/hb-aat-layout.hh | 6 +++--- + src/hb-ot-layout.cc | 2 +- + src/hb-ot-layout.hh | 2 +- + src/hb-ot-shape.cc | 44 + +++++++++++++++++++++++++++++--------------- + src/hb-ot-shape.hh | 6 +++--- + 7 files changed, 43 insertions(+), 29 deletions(-) + +commit 892ab37e7c9580e35b35a4d82a99e2ea73ac7b0b +Merge: 3787c078 7867c2ba +Author: Michiharu Ariza +Date: Wed Nov 14 13:54:07 2018 -0800 + + Merge branch 'master' into cff-subset + +commit 3787c078561f1157bd04644f092c4467f63c717c +Author: Michiharu Ariza +Date: Wed Nov 14 13:38:03 2018 -0800 + + Implemented seac for extents & subset along with API tests + + gtk-doc.make | 321 + +++++++++++++++++++++++++++++++++++++++- + src/hb-cff-interp-common.hh | 2 +- + src/hb-cff-interp-cs-common.hh | 7 + + src/hb-cff1-interp-cs.hh | 29 +++- + src/hb-ot-cff1-table.cc | 256 +++++++++++++++++++++++++------- + src/hb-ot-cff1-table.hh | 88 ++++++++--- + src/hb-subset-plan.cc | 19 +++ + test/api/fonts/cff1_seac.C0.otf | Bin 0 -> 1604 bytes + test/api/fonts/cff1_seac.otf | Bin 0 -> 2260 bytes + test/api/test-ot-extents-cff.c | 31 ++++ + test/api/test-subset-cff1.c | 19 +++ + 11 files changed, 699 insertions(+), 73 deletions(-) + +commit 7867c2bad05fe48f9e4a1b776fb7da67b747fb4e +Author: Ebrahim Byagowi +Date: Wed Nov 14 22:13:50 2018 +0330 + + [STAT] Add table parsing (#1384) + + src/Makefile.sources | 1 + + src/hb-ot-face.hh | 2 + + src/hb-ot-font.cc | 4 +- + src/hb-ot-hmtx-table.hh | 11 +- + src/hb-ot-stat-table.hh | 280 + ++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 290 insertions(+), 8 deletions(-) + +commit 48d16c2ab2b181c733accd4fd9730963e59b6323 +Author: Behdad Esfahbod +Date: Wed Nov 14 09:56:30 2018 -0500 + + [hmtx] Fix signedness issue + + Fixes + https://github.com/harfbuzz/harfbuzz/issues/1248#issuecomment-438689499 + + src/hb-ot-hmtx-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 29db2a44a6b7a28ade5e288779dbf5a200b43acd +Author: Ebrahim Byagowi +Date: Wed Nov 14 12:13:16 2018 +0330 + + [ot-color/svg] Note that it can be gzipped + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a9c27d576ffe4452d1a3dae73964a8f4d6dcc088 +Merge: 3c3eb5ea e543e1a0 +Author: Ebrahim Byagowi +Date: Wed Nov 14 08:29:17 2018 +0330 + + Merge pull request #1383 from punchcutter/master + + Add test for https://github.com/harfbuzz/harfbuzz/issues/1379 + +commit e543e1a0858bb5d7384d82600a789d40b62d9821 +Author: punchcutter +Date: Tue Nov 13 20:44:27 2018 -0800 + + Add Grantha test + + .../fonts/dcf774ca21062e7439f98658b18974ea8b956d0c.ttf | Bin 0 -> + 2568 bytes + test/shaping/data/in-house/tests/use.tests | 1 + + 2 files changed, 1 insertion(+) + +commit 3c3eb5ea9ccf34d33e94f83b9961b3a5e903d196 +Author: Behdad Esfahbod +Date: Tue Nov 13 21:10:10 2018 -0500 + + [aat] Disable fallback mark advance zeroing and positioning if + morx applied + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1357 + + src/hb-ot-shape.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit dc4225ccd1d16a1139cbc6092353db9ed03e8980 +Author: Behdad Esfahbod +Date: Tue Nov 13 20:48:46 2018 -0500 + + Don't retry creating again and again in lazy_loader if create failed + + Still does that if get_null() returns nullptr. Our shaper data + objects + are like that. Shrug. + + src/hb-machinery.hh | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 086235f59310ed77542d4916d31a4285c68630ff +Merge: 2092f595 c565fc3f +Author: Behdad Esfahbod +Date: Tue Nov 13 19:50:25 2018 -0500 + + Merge pull request #1382 from punchcutter/master + + Change USE Category for Grantha Virama + +commit 2092f595c7a4c591cace41cb99d31620fa6d5fa4 +Merge: 475be9d5 eee5b5ed +Author: Behdad Esfahbod +Date: Tue Nov 13 19:49:06 2018 -0500 + + Merge pull request #1380 from kbrow1i/cygwin + + Don't use Win32 API on Cygwin + +commit c565fc3fb3b14c02e30af28b9d4d4289b0d2e162 +Author: punchcutter +Date: Tue Nov 13 12:51:10 2018 -0800 + + Change USE Category for Grantha Virama + https://github.com/harfbuzz/harfbuzz/issues/1379 + + src/gen-use-table.py | 3 ++- + src/hb-ot-shape-complex-use-table.cc | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 475be9d5c672db6e1764d9425ed7fdaa0dff35c9 +Author: Behdad Esfahbod +Date: Tue Nov 13 13:01:13 2018 -0500 + + Fix Windows build + + src/hb-atomic.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit fc44dea341f1750fec801faed66656b8a58dcded +Author: Behdad Esfahbod +Date: Tue Nov 13 11:54:33 2018 -0500 + + Use atomic ints for upem and num_glyphs on face + + src/hb-aat-layout-lcar-table.hh | 3 ++- + src/hb-face.cc | 10 +++++----- + src/hb-face.hh | 24 ++++++++++++++---------- + src/hb-ot-color-sbix-table.hh | 2 +- + src/hb-static.cc | 13 +++++++++---- + 5 files changed, 31 insertions(+), 21 deletions(-) + +commit 9579ed9755d7c3e47435c55881c9841a5f60ad7e +Author: Behdad Esfahbod +Date: Tue Nov 13 11:45:12 2018 -0500 + + Make atomic types' internal values non-mutable + + This resulted from confusion previously... + + src/hb-atomic.hh | 10 +++++----- + src/hb-object.hh | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit c52d5bcd9405dbaa9289d720d9f0853aeac6b244 +Author: Behdad Esfahbod +Date: Tue Nov 13 11:41:29 2018 -0500 + + [ot-face] Add 'head' table + + src/hb-ot-face.hh | 1 + + src/hb-ot-glyf-table.hh | 11 +++-------- + src/hb-static.cc | 5 +---- + 3 files changed, 5 insertions(+), 12 deletions(-) + +commit eee5b5ed04f588f618a2251397dd5b850c378627 +Author: Ken Brown +Date: Mon Nov 12 21:05:39 2018 -0500 + + Don't use Win32 API on Cygwin + + Cygwin is a Posix platform to the extent possible. It should use the + Posix API except in special circumstances. + + src/hb-atomic.hh | 2 +- + src/hb-blob.cc | 10 +++++----- + src/hb-mutex.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 2 +- + src/hb.hh | 2 +- + 5 files changed, 9 insertions(+), 9 deletions(-) + +commit 56f541d0001f6d7e2e35cdd15217bdf52ebf8391 +Author: Behdad Esfahbod +Date: Mon Nov 12 19:46:37 2018 -0500 + + [shape-plan] Remove unused code + + src/hb-shape-plan.hh | 12 +----------- + 1 file changed, 1 insertion(+), 11 deletions(-) + +commit 6c22f3fd95617a8c3cd558858c6758a0d548d370 +Author: Behdad Esfahbod +Date: Mon Nov 12 19:26:01 2018 -0500 + + [shape-plan] Implement fine-grained caching plans with user-features + + Only tag, value, and global-ness of features are considered, not their + start/end offsets. + + src/hb-shape-plan.cc | 69 + ++++++++++++++++++++++++++++++---------------------- + src/hb-shape-plan.hh | 17 ++----------- + 2 files changed, 42 insertions(+), 44 deletions(-) + +commit cc8428756a1b18b0445c2c5fbb38e05453693dad +Author: Behdad Esfahbod +Date: Mon Nov 12 18:48:10 2018 -0500 + + [shape-plan] Cache shape plans with variations based on variation + indices + + src/hb-aat-map.cc | 4 +--- + src/hb-aat-map.hh | 4 +--- + src/hb-ot-map.cc | 18 +++++------------ + src/hb-ot-map.hh | 6 +++--- + src/hb-ot-shape.cc | 13 +++++-------- + src/hb-ot-shape.hh | 28 +++++++++++++++++++++++--- + src/hb-shape-plan.cc | 55 + ++++------------------------------------------------ + src/hb-shape-plan.hh | 23 ++++++++++++++++++---- + 8 files changed, 63 insertions(+), 88 deletions(-) + +commit 8284cb9fb3600268e06d8a2ba8400700510de7a5 +Author: Behdad Esfahbod +Date: Mon Nov 12 18:18:20 2018 -0500 + + [shape-plan] Refactor more + + src/hb-shape-plan.cc | 46 ++++++++++++++++++++++++++-------------------- + 1 file changed, 26 insertions(+), 20 deletions(-) + +commit 1082338525c96206f43785e283e41b3e959871fd +Author: Behdad Esfahbod +Date: Mon Nov 12 18:05:02 2018 -0500 + + [shape-plan] Only use shape-plan key to initialize hb_ot_shape_plan_t + + Such that we don't accidentally use info not in the cache key. + + src/hb-ot-shape.cc | 25 +++++++++++-------------- + src/hb-ot-shape.hh | 8 +++----- + src/hb-shape-plan.cc | 7 +------ + 3 files changed, 15 insertions(+), 25 deletions(-) + +commit 7ac03f88a22325fb4d6b77ee7694ad11f6a99bcb +Author: Behdad Esfahbod +Date: Mon Nov 12 17:50:30 2018 -0500 + + [shape-plan] Minor + + src/hb-shape-plan.cc | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit c7be933439af1bc8251b2b19df75b42bd0f3bdb5 +Author: Behdad Esfahbod +Date: Mon Nov 12 17:49:15 2018 -0500 + + [shape-plan] Refactor some more + + src/hb-shape-plan.cc | 147 + ++++++++++++++++++++++++++++----------------------- + src/hb-shape-plan.hh | 15 ++++++ + 2 files changed, 95 insertions(+), 67 deletions(-) + +commit fc27777833e052dab91ca5777802e6c4e956deb4 +Author: Behdad Esfahbod +Date: Mon Nov 12 17:27:34 2018 -0500 + + [shape-plan] Refactor more + + src/hb-shape-plan.cc | 44 +++++++++++++++++++++++--------------------- + 1 file changed, 23 insertions(+), 21 deletions(-) + +commit 566612295b7c9bc003e9f1723f2491113724b788 +Author: Behdad Esfahbod +Date: Mon Nov 12 17:19:45 2018 -0500 + + [shape-plan] Turn hb_shape_plan_proposal_t into hb_shape_plan_key_t + + And include it in hb_shape_plan_t itself. + + src/hb-shape-plan.cc | 206 + +++++++++++++++++++-------------------------------- + src/hb-shape-plan.hh | 27 +++---- + 2 files changed, 92 insertions(+), 141 deletions(-) + +commit af123bd1b814b4fb881ea3d11f1ef0bcced75942 +Author: Behdad Esfahbod +Date: Mon Nov 12 16:27:08 2018 -0500 + + Add hb_memcmp() + + src/hb-dsalgs.hh | 17 ++++++++++++----- + src/hb-set.hh | 2 +- + 2 files changed, 13 insertions(+), 6 deletions(-) + +commit 65456bff37ef61094c35574a35c96f6437fd6015 +Author: Behdad Esfahbod +Date: Mon Nov 12 16:15:26 2018 -0500 + + [shape-plan] Minor + + src/hb-shape-plan.cc | 15 ++++++++------- + src/hb-shape-plan.hh | 9 +++++---- + 2 files changed, 13 insertions(+), 11 deletions(-) + +commit 1db672a5e903de39f955e70b8814c275ccbe1b5c +Author: Behdad Esfahbod +Date: Mon Nov 12 16:05:09 2018 -0500 + + [shaper] Rename + + src/hb-shape-plan.cc | 2 +- + src/hb-shape.cc | 2 +- + src/hb-shaper.cc | 16 ++++++++-------- + src/hb-shaper.hh | 4 ++-- + 4 files changed, 12 insertions(+), 12 deletions(-) + +commit 5212cd8af2171b9d0e9b78196e7758c37f148b80 +Author: Behdad Esfahbod +Date: Mon Nov 12 14:25:18 2018 -0500 + + [fuzzing] Add new test + + ...zz-testcase-minimized-hb-shape-fuzzer-5754863779053568 | Bin 0 -> + 100 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 274f4c726f461f49f54a79557d63bf95d22903cf +Author: Behdad Esfahbod +Date: Mon Nov 12 14:24:36 2018 -0500 + + Rename check_array2() to check_array() + + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-machinery.hh | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit e014405a214bceff3a1ce80f0b98273c44078e82 +Author: Behdad Esfahbod +Date: Mon Nov 12 14:23:31 2018 -0500 + + Rename check_array(array, a, b) to check_range() + + src/hb-aat-layout-common.hh | 8 ++++++-- + src/hb-machinery.hh | 31 +++++++++++++++++++++++-------- + src/hb-open-type.hh | 4 +++- + src/hb-ot-layout-common.hh | 5 +++-- + src/hb-ot-layout-gpos-table.hh | 11 ++++++++--- + src/hb-ot-var-hvar-table.hh | 4 +++- + src/hb-ot-var-mvar-table.hh | 4 +++- + 7 files changed, 49 insertions(+), 18 deletions(-) + +commit c8f4cc49272d8bcd47706a6306a625d724349f5a +Author: Behdad Esfahbod +Date: Mon Nov 12 14:11:29 2018 -0500 + + [kerx] Fix integer overflow in multiply + + Fixes https://oss-fuzz.com/v2/testcase-detail/5754863779053568 + + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-machinery.hh | 29 ++++++++++++++++------------- + 2 files changed, 17 insertions(+), 14 deletions(-) + +commit 1300f027a938d8898cdc9abbcad71afadf70e6e6 +Author: Behdad Esfahbod +Date: Mon Nov 12 13:56:48 2018 -0500 + + [kerx] Minor tweak on previous commit + + src/hb-aat-layout-kerx-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit d6666b3866037c9d3e8a497958af9ba8d2f47a73 +Author: Behdad Esfahbod +Date: Mon Nov 12 13:21:14 2018 -0500 + + [fuzzing] Remove limited-edition build of libraries + + Use normal, production, shared libraries. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1237 + + src/Makefile.am | 31 ------------------------------- + test/fuzzing/Makefile.am | 39 +++++++++++++-------------------------- + 2 files changed, 13 insertions(+), 57 deletions(-) + +commit a549aa14a0b60436a16f7f8924a5b5f82b4d5b7e +Author: Behdad Esfahbod +Date: Mon Nov 12 13:01:22 2018 -0500 + + [kerx] Protect against stack underflow + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11367 + + src/hb-aat-layout-kerx-table.hh | 2 +- + ...uzz-testcase-minimized-hb-shape-fuzzer-5691469793329152 | Bin 0 -> + 69 bytes + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 41a8bc7fd9399def8f580b02627a77f3972cc0e9 +Merge: 0dfa584c 77bd0a64 +Author: Michiharu Ariza +Date: Mon Nov 12 08:49:00 2018 -0800 + + Merge branch 'master' into cff-subset + +commit 0dfa584cb4af6be2852d038e9bd591f67ea9fc6e +Author: Michiharu Ariza +Date: Mon Nov 12 08:47:07 2018 -0800 + + changed Adobe company name + + src/hb-cff-interp-common.hh | 2 +- + src/hb-cff-interp-cs-common.hh | 2 +- + src/hb-cff-interp-dict-common.hh | 2 +- + src/hb-cff1-interp-cs.hh | 2 +- + src/hb-cff2-interp-cs.hh | 2 +- + src/hb-ot-cff-common.hh | 2 +- + src/hb-ot-cff1-table.cc | 2 +- + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.cc | 2 +- + src/hb-ot-cff2-table.hh | 2 +- + src/hb-ot-vorg-table.hh | 2 +- + src/hb-subset-cff-common.cc | 2 +- + src/hb-subset-cff-common.hh | 2 +- + src/hb-subset-cff1.cc | 2 +- + src/hb-subset-cff1.hh | 2 +- + src/hb-subset-cff2.cc | 2 +- + src/hb-subset-cff2.hh | 2 +- + test/api/test-ot-extents-cff.c | 2 +- + test/api/test-subset-cff1.c | 2 +- + test/api/test-subset-cff2.c | 2 +- + 20 files changed, 20 insertions(+), 20 deletions(-) + +commit 3e284e02c2a5da758526360a45364a330b8ab8e9 +Author: Behdad Esfahbod +Date: Sun Nov 11 22:51:34 2018 -0500 + + [shape-plan] Minor + + src/hb-ot-shape.cc | 26 ++++++++++++++------------ + src/hb-ot-shape.hh | 15 ++++++++------- + src/hb-shape-plan.cc | 3 ++- + 3 files changed, 24 insertions(+), 20 deletions(-) + +commit 420c9de6447cdb491184e7f8caf0811b0c962c05 +Author: Behdad Esfahbod +Date: Sun Nov 11 22:38:05 2018 -0500 + + [shape-plan] Minor rename + + src/hb-shape-plan.cc | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 77bd0a6458a9169df59f6be667a8eb79bd353dc9 +Author: Behdad Esfahbod +Date: Sun Nov 11 22:08:48 2018 -0500 + + Add variation coords to shape_plan proposal + + This is the root cause of bug worked around in + 19e77e01bc13f44138e1d50533327d314dd0a018. + + Still no shape plan caching for variations though. + + src/hb-shape-plan.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 9c767d075d0be85227b8dc146061de9bd24f3fec +Author: Behdad Esfahbod +Date: Sun Nov 11 22:03:15 2018 -0500 + + Minor + + src/hb-shape-plan.cc | 31 +++++++++++++------------------ + 1 file changed, 13 insertions(+), 18 deletions(-) + +commit f521a28b4aad1566664cf14d70a911728ee0b962 +Author: Behdad Esfahbod +Date: Sun Nov 11 21:32:01 2018 -0500 + + Embed hb_ot_shape_plan_t into hb_shape_plan_t + + No other shaper will need shape_plan_data, by definition. So, remove + abstraction layer and always create hb_ot_shape_plan_t as part of + hb_shape_plan_t. + + src/hb-coretext.cc | 45 ---------------------- + src/hb-directwrite.cc | 21 ---------- + src/hb-fallback-shape.cc | 22 ----------- + src/hb-graphite2.cc | 22 ----------- + src/hb-ot-shape.cc | 99 + ++++++++++++++++++++++-------------------------- + src/hb-ot-shape.hh | 21 +++++----- + src/hb-shape-plan.cc | 22 ++++++----- + src/hb-shape-plan.hh | 3 +- + src/hb-uniscribe.cc | 22 ----------- + 9 files changed, 70 insertions(+), 207 deletions(-) + +commit fabb01210433ce1c6d5f630bc270f82a8a4a4014 +Author: Behdad Esfahbod +Date: Sun Nov 11 17:10:23 2018 -0500 + + Remove wrong comment + + src/hb-shape-plan.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 1fd183ee1c40e2eedf86b5e82d1b547c5650ebf5 +Author: Behdad Esfahbod +Date: Sun Nov 11 16:47:52 2018 -0500 + + Finish off eecccc919ce15f60ae7ef9da5cfb311b4aa05c63 + + src/hb-machinery.hh | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 1beacdded9cd1e4467b52244cdfd8497516eb107 +Author: Behdad Esfahbod +Date: Sun Nov 11 16:35:28 2018 -0500 + + Minor + + src/hb-coretext.cc | 8 ++++---- + src/hb-directwrite.cc | 4 ++-- + src/hb-fallback-shape.cc | 4 ++-- + src/hb-graphite2.cc | 4 ++-- + src/hb-ot-shape.cc | 4 ++-- + src/hb-shaper.hh | 3 ++- + src/hb-uniscribe.cc | 4 ++-- + 7 files changed, 16 insertions(+), 15 deletions(-) + +commit e88d47b7f2f9aee5b0b3cdc0b8f708884175a71f +Author: Behdad Esfahbod +Date: Sun Nov 11 16:25:43 2018 -0500 + + Minor + + src/hb-face.cc | 2 +- + src/hb-face.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 55c66c7c56c1ecd493f51fe66fd434b28addfb41 +Author: Behdad Esfahbod +Date: Sun Nov 11 16:09:38 2018 -0500 + + Revert "Declare Null() constexpr" + + This reverts commit 442a72d95ab1fb3a47b486d8d1eb68e909d0ffb8. + + Doesn't make sense. No idea how my local compilers where happy + with it! + + src/hb-null.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 98c6f03ccdd0630282ea0b166f66dcfb2a9c1f51 +Author: Behdad Esfahbod +Date: Sun Nov 11 15:54:20 2018 -0500 + + Minor + + src/hb-face.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 442a72d95ab1fb3a47b486d8d1eb68e909d0ffb8 +Author: Behdad Esfahbod +Date: Sun Nov 11 15:51:23 2018 -0500 + + Declare Null() constexpr + + src/hb-null.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit eecccc919ce15f60ae7ef9da5cfb311b4aa05c63 +Author: Behdad Esfahbod +Date: Sun Nov 11 15:48:47 2018 -0500 + + Don't store to null object + + Ouch :). + + src/hb-machinery.hh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 903856ab505cbc6b756d7b904650df72e90f67a7 +Author: Behdad Esfahbod +Date: Sun Nov 11 15:45:58 2018 -0500 + + Remove unused function + + src/hb-machinery.hh | 5 ----- + 1 file changed, 5 deletions(-) + +commit 0e0af11c62c6a55248a5d3c8868da91ef36384c5 +Author: Behdad Esfahbod +Date: Sun Nov 11 12:54:16 2018 -0500 + + [hdmx] Renames + + src/hb-ot-hdmx-table.hh | 46 + +++++++++++++++++++++++----------------------- + 1 file changed, 23 insertions(+), 23 deletions(-) + +commit da6aa3b0333de3f2169a5cfcb33374e1b2fe346e +Author: Behdad Esfahbod +Date: Sun Nov 11 11:40:57 2018 -0500 + + Add hb_blob_ptr_t.destroy() + + src/hb-blob.hh | 1 + + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-color-cbdt-table.hh | 4 ++-- + src/hb-ot-color-sbix-table.hh | 2 +- + src/hb-ot-color-svg-table.hh | 2 +- + src/hb-ot-glyf-table.hh | 4 ++-- + src/hb-ot-hmtx-table.hh | 6 +++--- + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + 11 files changed, 15 insertions(+), 14 deletions(-) + +commit bb9abb4efd7d72198ffe8abb137ccf07ae17743e +Author: Behdad Esfahbod +Date: Sun Nov 11 00:39:52 2018 -0500 + + [hmtx/port] Use hb_blob_ptr_t + + src/hb-ot-hmtx-table.hh | 24 ++++++++++-------------- + src/hb-ot-post-table.hh | 11 +++++------ + 2 files changed, 15 insertions(+), 20 deletions(-) + +commit 0e2680a6e8d16afd38ffdb6e8cf244150a5e3837 +Author: Behdad Esfahbod +Date: Sun Nov 11 00:28:47 2018 -0500 + + [cmap] Port to hb_blob_ptr_t + + Although didn't need it... + + src/hb-ot-cmap-table.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 0b0fad3ea8888d57d1e077077f5897d1901c5371 +Author: Behdad Esfahbod +Date: Sun Nov 11 00:26:55 2018 -0500 + + [color] Port to hb_blob_ptr_t + + Fix hb_blob_ptr_t::get_length () as well. + + src/hb-blob.hh | 2 +- + src/hb-ot-color-cbdt-table.hh | 38 +++++++++++++------------------------- + src/hb-ot-color-sbix-table.hh | 10 ++++------ + src/hb-ot-color-svg-table.hh | 11 +++++------ + src/hb-ot-glyf-table.hh | 22 ++++++++-------------- + 5 files changed, 31 insertions(+), 52 deletions(-) + +commit 925b7a214f06b83b6f2278052656dabc4ebdd6b7 +Author: Behdad Esfahbod +Date: Sun Nov 11 00:17:30 2018 -0500 + + Comment + + src/hb-font.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dcb63868333ba8e229fd8756377151440dd9fd23 +Author: Behdad Esfahbod +Date: Sun Nov 11 00:16:17 2018 -0500 + + [shape-plan] Remove use of custom null object + + src/hb-shape-plan.cc | 24 ------------------------ + src/hb-shape-plan.hh | 1 - + 2 files changed, 25 deletions(-) + +commit 109891d49876de4de14a91adefbdf681c2b9acc2 +Author: Behdad Esfahbod +Date: Sun Nov 11 00:15:08 2018 -0500 + + [shape-plan] Make null object all zeros + + To remove custom null object next.. + + src/hb-shape-plan.cc | 8 ++++---- + src/hb-shape-plan.hh | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 34185ff3bc7ece5620145fc05da07c79da950f34 +Author: Behdad Esfahbod +Date: Sun Nov 11 00:12:30 2018 -0500 + + [blob] Use default null object + + src/hb-blob.cc | 12 ------------ + src/hb-blob.hh | 1 - + 2 files changed, 13 deletions(-) + +commit 2ee1d9f555fba60342bab63294a6dacca10466de +Author: Behdad Esfahbod +Date: Sun Nov 11 00:11:28 2018 -0500 + + [blob] Change null object memory mode to DUPLICATE + + We never rely on that being equal to readonly. Just not being + writable. Maybe not even that given that the object is inert. + + In prep for next commit, using default null pool. + + src/hb-blob.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5d0078a48b246e713817e5bb6b4efada9618bea3 +Author: Behdad Esfahbod +Date: Sat Nov 10 23:52:15 2018 -0500 + + Add hb_blob_ptr_t + + Use in a couple of places. Push to bots to see how many unhappy + before + I convert the rest. + + src/hb-blob.hh | 23 +++++++++++++++++++++++ + src/hb-ot-layout-gdef-table.hh | 5 ++--- + src/hb-ot-layout-gsubgpos.hh | 8 +++----- + src/hb-ot-layout.cc | 14 ++++++-------- + src/hb-ot-name-table.hh | 12 +++++------- + 5 files changed, 39 insertions(+), 23 deletions(-) + +commit e44046ec499949884b9b77c4c9937ad381386850 +Author: Behdad Esfahbod +Date: Sat Nov 10 22:41:35 2018 -0500 + + Minor + + src/hb-ot-layout.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 752bd8a192af209f44dacaf1d3510d0bfc6354b8 +Author: Behdad Esfahbod +Date: Sat Nov 10 21:13:13 2018 -0500 + + [kerx] Fix Format1 tupleKern sanitization + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11312 + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11305 + + src/hb-aat-layout-kerx-table.hh | 6 +++--- + ...uzz-testcase-minimized-hb-shape-fuzzer-5629524117553152 | Bin 0 -> + 93 bytes + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit f9e0552debc45afedd86c848484bcd169af62dc2 +Author: Behdad Esfahbod +Date: Sat Nov 10 21:01:49 2018 -0500 + + [fuzzing] Make "make lib" faster and more usable + + src/Makefile.am | 2 +- + test/fuzzing/Makefile.am | 12 +++++++----- + 2 files changed, 8 insertions(+), 6 deletions(-) + +commit 4674655841bb810e7b68f03431d7b5a7c34c6f20 +Author: Behdad Esfahbod +Date: Sat Nov 10 20:11:10 2018 -0500 + + Minor + + src/hb-ot-shape-complex-arabic-fallback.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit a953b647507fe2ae8f5187fbfb04e69d2a2952e4 +Author: Behdad Esfahbod +Date: Sat Nov 10 20:10:03 2018 -0500 + + Revert parts of previous commit that made clang unhappy + + src/hb-machinery.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1d66cdcf770e45d995a318592352e4349faecb71 +Author: Behdad Esfahbod +Date: Sat Nov 10 19:54:08 2018 -0500 + + Better fix for MSVC 2008 + + Follow up on b4c61130324455bfd42095b01fa14ac901e441f1 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1374 + + src/hb-machinery.hh | 8 ++++---- + src/hb-open-type.hh | 8 ++++++++ + src/hb-ot-cmap-table.hh | 4 ++-- + src/hb-ot-layout-gpos-table.hh | 4 ++-- + src/hb-ot-var-avar-table.hh | 9 ++++----- + 5 files changed, 20 insertions(+), 13 deletions(-) + +commit fb2a037f54f3cd323a447925f6534eccd1c709c1 +Merge: 87984165 b4c61130 +Author: Michiharu Ariza +Date: Sat Nov 10 16:23:11 2018 -0800 + + Merge branch 'master' into cff-subset + +commit b4c61130324455bfd42095b01fa14ac901e441f1 +Author: Behdad Esfahbod +Date: Sat Nov 10 16:35:39 2018 -0500 + + Try fixing MSVC 2008 build + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1374 + + src/hb-open-type.hh | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit f2e942f3023e3c5cb3e732ee7b4782b3df170a85 +Author: Behdad Esfahbod +Date: Sat Nov 10 16:11:14 2018 -0500 + + Fix hb_bytes_t's unused template array constructor + + src/hb-dsalgs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6213a75b68825037fbaf6f5ad4eef66e8bad4b3c +Author: Behdad Esfahbod +Date: Sat Nov 10 16:09:21 2018 -0500 + + Add trivial casts to hb_bytes_t + + src/hb-dsalgs.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 8bb97d2ce140b7fe81d0726c32e024d887e0be1c +Author: Behdad Esfahbod +Date: Sat Nov 10 15:54:33 2018 -0500 + + Revert back hb_bytes_t.cmp() to the scheme it was + + But fix UBSan complaint. + + There's nothing in hb_bytes_t that guarantees lexical ordering, and + ordering by length first is much faster. + + src/hb-dsalgs.hh | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +commit 534e1d7694c96f61e853daef481b41274d5d16d8 +Author: Behdad Esfahbod +Date: Sat Nov 10 15:43:16 2018 -0500 + + Fix hb_bytes_t.cmp() for realz this time + + src/hb-dsalgs.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 929f07dbfc8b8c40771d27a502f6e5842c1c1e90 +Author: Behdad Esfahbod +Date: Sat Nov 10 15:38:48 2018 -0500 + + Fix hb_bytes_t.cmp() + + Ouch! + + src/hb-dsalgs.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 5547bfa9f2815df727fa524b0ea0f136a6f955b7 +Merge: 3a9fa8c0 1d82b476 +Author: Behdad Esfahbod +Date: Sat Nov 10 15:35:12 2018 -0500 + + Merge pull request #1376 from ebraminio/minor + + [colr/feat/trak] minor + +commit 1d82b4761d0a2e2e0be002e8a6bfe060f7b6dec3 +Author: Ebrahim Byagowi +Date: Sat Nov 10 18:08:11 2018 +0330 + + [colr/feat/trak] minor + + src/hb-aat-layout-feat-table.hh | 14 +++++++------- + src/hb-aat-layout-trak-table.hh | 35 +++++++++++++++++++---------------- + src/hb-ot-color-colr-table.hh | 18 ++++++------------ + 3 files changed, 32 insertions(+), 35 deletions(-) + +commit 3a9fa8c026bf28bf87e20ec95327f74fd7070b74 +Author: Behdad Esfahbod +Date: Sat Nov 10 01:56:37 2018 -0500 + + [qsort] Fix O(N^2) behavior if all array elements are the same + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11327 + + Reported as https://github.com/noporpoise/sort_r/issues/7 + + src/hb-dsalgs.hh | 15 + +++++++++++---- + ...-testcase-minimized-hb-shape-fuzzer-5634443633491968 | Bin 0 -> + 41814 bytes + 2 files changed, 11 insertions(+), 4 deletions(-) + +commit b308aaccf0773e252880b9b887f3d3d1dec00168 +Author: Behdad Esfahbod +Date: Sat Nov 10 00:37:17 2018 -0500 + + [post] Minor + + src/hb-ot-post-table.hh | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +commit 4111c3b8cd1b1c44f722877614ec1ee25111e78c +Author: Behdad Esfahbod +Date: Sat Nov 10 00:26:36 2018 -0500 + + [post] Move sanitize close to data fields + + src/hb-ot-post-table.hh | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit e26e6dbb336e48a5898738dbbd9e56e3a00b7bed +Author: Behdad Esfahbod +Date: Sat Nov 10 00:19:50 2018 -0500 + + [post] Remove unnecessary hb_nonnull_ptr_t<> + + src/hb-ot-post-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6b8178c6499f8d0ee45a57332af778af0e48d1b5 +Author: Ebrahim Byagowi +Date: Sat Nov 10 02:42:08 2018 +0330 + + [glyf] minor + + src/hb-ot-glyf-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 87984165877c90bf4e0a0418a6407e44c048335d +Author: Michiharu Ariza +Date: Fri Nov 9 08:59:18 2018 -0800 + + fixed vstem handling (lack thereof) in check_width + + bug exposed by U+2261 equivalence in SourceCodePro-Regular.otf + + src/hb-cff1-interp-cs.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 5f97fe9956274d9de4e7813d7f2e850d9ffd8224 +Author: Behdad Esfahbod +Date: Fri Nov 9 10:01:50 2018 -0500 + + Fix a few MSVC 2008 warnings + + https://github.com/harfbuzz/harfbuzz/issues/1374 + + src/hb-set.hh | 4 ++-- + src/hb-vector.hh | 3 +++ + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit f51bb6ee7bd4ebca9b432851adc527ec086360fe +Merge: 2d987110 b986fead +Author: Behdad Esfahbod +Date: Thu Nov 8 14:42:40 2018 -0500 + + Merge pull request #1358 from ebraminio/lcar + + Hook AAT's lcar to _get_ligature_carets + +commit b986fead0aee52d219ce85dd49c9109bfaf31801 +Author: Ebrahim Byagowi +Date: Mon Nov 5 12:31:58 2018 +0330 + + Hook AAT's lcar to _get_ligature_carets + + src/Makefile.sources | 1 + + src/hb-aat-layout-lcar-table.hh | 92 + +++++++++++++++++++++++++++++++++++++ + src/hb-ot-face.hh | 1 + + src/hb-ot-layout-gdef-table.hh | 6 +-- + src/hb-ot-layout.cc | 17 ++++--- + test/api/Makefile.am | 1 + + test/api/fonts/lcar.ttf | Bin 0 -> 808 bytes + test/api/test-ot-ligature-carets.c | 67 +++++++++++++++++++++++++++ + 8 files changed, 175 insertions(+), 10 deletions(-) + +commit 2d987110c067ccbf63b1399d2a87820121925e39 +Author: Ebrahim Byagowi +Date: Thu Nov 8 21:46:26 2018 +0330 + + [aat] Minor + + src/hb-aat-layout-just-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9fae611740f514e5fc101a18c4551a20b4a47b59 +Author: Behdad Esfahbod +Date: Thu Nov 8 12:17:09 2018 -0500 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 1 + + test/shaping/data/text-rendering-tests/Makefile.sources | 2 +- + .../data/text-rendering-tests/tests/MORX-31.tests | 16 + ++++++++-------- + 3 files changed, 10 insertions(+), 9 deletions(-) + +commit b989507fa6b36eb9950001d4e28f3946ffbe75f9 +Author: Ebrahim Byagowi +Date: Thu Nov 8 20:48:54 2018 +0330 + + [aat] Minor (#1369) + + src/hb-aat-layout-just-table.hh | 11 ++++++----- + src/hb-aat-layout-trak-table.hh | 12 ++++++------ + 2 files changed, 12 insertions(+), 11 deletions(-) + +commit 26c291aaa023d31c793b6f505c76e0dd7acbff9b +Merge: 417963dd f9042384 +Author: Michiharu Ariza +Date: Thu Nov 8 09:06:49 2018 -0800 + + Merge branch 'master' into cff-subset + +commit 417963dd9f93a316e672c77493e763978bfdbc28 +Author: Michiharu Ariza +Date: Thu Nov 8 09:01:20 2018 -0800 + + got rid of Remap::fullset() as incorrect, redundant, inefficient + + src/hb-ot-cff-common.hh | 22 ---------------------- + 1 file changed, 22 deletions(-) + +commit f90423847b07ff9c9f66be6dfa3b6071f9c7d9d3 +Author: Ebrahim Byagowi +Date: Thu Nov 8 19:17:02 2018 +0330 + + [just] Initial table implementation (#1364) + + A starting point, its sanitization is not tested however + + src/Makefile.sources | 1 + + src/hb-aat-layout-just-table.hh | 416 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-aat-layout.cc | 1 + + 3 files changed, 418 insertions(+) + +commit b8b00fb3c60d23efca5720db15555c4a01c56a45 +Author: Ebrahim Byagowi +Date: Thu Nov 8 18:53:14 2018 +0330 + + [aat] Support Lookup>, needed by just and lcar (#1368) + + src/hb-aat-layout-common.hh | 57 + +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-open-type.hh | 11 +++++++++ + 2 files changed, 68 insertions(+) + +commit 073d0a9fbcf4f9cf44878f3f91afa27615b14e5c +Author: Ebrahim Byagowi +Date: Thu Nov 8 10:59:50 2018 +0330 + + [ci] minor + + .circleci/config.yml | 1 + + 1 file changed, 1 insertion(+) + +commit 15326826bf20f1f3d5ef3ddde2ad17b0ccbfa605 +Author: Behdad Esfahbod +Date: Wed Nov 7 21:58:04 2018 -0500 + + [aat] Ignore cross-stream offset of deleted-glyphs + + I think it makes sense to accumulate it, but Ned tells me that's + what CoreText does. + + src/hb-aat-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 636a6833c57eb88ebaa92034c1f4722471f70781 +Author: Michiharu Ariza +Date: Wed Nov 7 17:58:45 2018 -0800 + + fixed ends_in_hint bug + + subr ends in hint itself should be regarded as hint + this flag should propagate to its caller if the call itself is at + the end of the caller + + src/hb-subset-cff-common.hh | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit 0bf76154f1bb15aa2fc361eb725977313f103a58 +Author: Behdad Esfahbod +Date: Wed Nov 7 19:11:43 2018 -0500 + + [fuzzing] Take whatever text we can + + test/fuzzing/hb-shape-fuzzer.cc | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +commit 517a1bac97b6273e03562deefcca129648698c31 +Merge: 9d502769 b18a56a2 +Author: Behdad Esfahbod +Date: Wed Nov 7 18:40:48 2018 -0500 + + Merge pull request #1362 from harfbuzz/cross-kern + + Vastly improve kern/kerx tables, including cross-stream "kerning" + +commit b18a56a290bf5330e81019b33f15e6951dd86a8b +Author: Behdad Esfahbod +Date: Wed Nov 7 18:13:22 2018 -0500 + + [kerx] Comment + + src/hb-aat-layout-kerx-table.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 4d740206943ecb72e4be7cc4815e0a3aa3edaa9d +Merge: e0c30b96 9d502769 +Author: Michiharu Ariza +Date: Wed Nov 7 15:09:30 2018 -0800 + + Merge branch 'master' into cff-subset + +commit e0c30b961de87d38bff8dd49e86785a5b74fcad3 +Merge: 0996c0ff ae8fd0db +Author: Michiharu Ariza +Date: Wed Nov 7 15:08:55 2018 -0800 + + merge with cff-subset branch + +commit 006386be3a069199ebaf22bcc55fa7233c62e0d5 +Author: Behdad Esfahbod +Date: Wed Nov 7 18:04:53 2018 -0500 + + [kern] Implement negative state numbers + + Let the fuzzing bots rip this code apart... + + src/hb-aat-layout-common.hh | 90 + ++++++++++++++++++++++++++++++----------- + src/hb-aat-layout-kerx-table.hh | 10 ----- + 2 files changed, 66 insertions(+), 34 deletions(-) + +commit 0996c0ff6279f377e2b14f08663df2ce82de2b14 +Author: Michiharu Ariza +Date: Wed Nov 7 14:48:37 2018 -0800 + + implented no-desubroutinize with CFF2 along with API test + + replaced AdobeVFPrototype.abc.otf with a hinted (maually) & + subroutinized copy + replaced expected results as well + + src/hb-cff-interp-dict-common.hh | 4 +- + src/hb-cff2-interp-cs.hh | 16 +- + src/hb-ot-cff-common.hh | 22 +-- + src/hb-subset-cff-common.hh | 64 +++++--- + src/hb-subset-cff2.cc | 180 + ++++++++++++++++++--- + test/api/fonts/AdobeVFPrototype.abc.nohints.otf | Bin 7800 -> 0 bytes + test/api/fonts/AdobeVFPrototype.abc.otf | Bin 7800 -> + 7460 bytes + test/api/fonts/AdobeVFPrototype.ac.nohints.otf | Bin 7152 -> + 6780 bytes + .../fonts/AdobeVFPrototype.ac.nosubrs.nohints.otf | Bin 0 -> 6844 bytes + test/api/fonts/AdobeVFPrototype.ac.nosubrs.otf | Bin 0 -> 7060 bytes + test/api/fonts/AdobeVFPrototype.ac.otf | Bin 7336 -> + 6996 bytes + test/api/test-subset-cff2.c | 51 +++++- + 12 files changed, 271 insertions(+), 66 deletions(-) + +commit 29c5302376ff2bc8f04b0fc0efba3ce40ef564a7 +Author: Behdad Esfahbod +Date: Wed Nov 7 17:29:37 2018 -0500 + + [morx] Minor + + src/hb-aat-layout-morx-table.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 385f78b3123f268e4c7ff423621e5ce9e8a5c54b +Author: Behdad Esfahbod +Date: Wed Nov 7 17:19:21 2018 -0500 + + [aat] Remove deleted-glyhs after applying kerx/kern + + Finally: Fixes https://github.com/harfbuzz/harfbuzz/issues/1356 + + Test case: + $ ./hb-shape GeezaPro.ttc -u U+0628,U+064A,U+064E,U+0651,U+0629 + [u0629.final.tehMarbuta=4+713|u064e_u0651.shaddaFatha=1@0,-200+0|u064a.medial.yeh=1+656|u0628.initial.beh=0+656] + + The mark positioning (kern table CrossStream kerning) only works + if deleted + glyph (as result of ligation) is still in stream and pushed through + the + state machine. + + src/hb-aat-layout-morx-table.hh | 16 ------- + src/hb-aat-layout.cc | 30 ++++++++++-- + src/hb-aat-layout.hh | 12 +++-- + src/hb-ot-layout-gpos-table.hh | 6 +-- + src/hb-ot-layout.cc | 60 +++++++++++++++++++++-- + src/hb-ot-layout.hh | 23 +++++---- + src/hb-ot-shape.cc | 102 + ++++++++++++++-------------------------- + 7 files changed, 142 insertions(+), 107 deletions(-) + +commit 1909072235e59eb80f9169300279b65779b932a4 +Author: Behdad Esfahbod +Date: Wed Nov 7 16:42:16 2018 -0500 + + [aat] Add debug info to state machine + + src/hb-aat-layout-common.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit ca23567f41a2d6389f6fd2483a994cf5aa6aeaf8 +Author: Behdad Esfahbod +Date: Wed Nov 7 16:19:51 2018 -0500 + + Disable fallback mark positioning if kern table has cross-stream + kerning + + Happens even if the cross-stream kerning is for cursive attachment + only. Oh well.. + + src/hb-ot-layout.cc | 6 ++++++ + src/hb-ot-layout.hh | 3 +++ + src/hb-ot-shape.cc | 14 ++++++-------- + src/hb-ot-shape.hh | 2 +- + 4 files changed, 16 insertions(+), 9 deletions(-) + +commit 5cf6f94dfd30a468ab8464435e846811c39d9226 +Author: Behdad Esfahbod +Date: Wed Nov 7 16:07:22 2018 -0500 + + Don't apply both kerx and kern + + Ouch! + + src/hb-ot-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 41cff7afc916048810a7ea4aa33ecdee7401df74 +Author: Behdad Esfahbod +Date: Wed Nov 7 16:05:36 2018 -0500 + + Minor + + src/hb-ot-shape.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9af983af24788afad4b37bd2297b86cdca7c5c29 +Author: Behdad Esfahbod +Date: Wed Nov 7 16:03:09 2018 -0500 + + [kern] Switch to dispatch + + src/hb-aat-layout-kerx-table.hh | 7 +++++-- + src/hb-ot-kern-table.hh | 28 +++++++++++++++------------- + src/hb-ot-layout.cc | 6 ++---- + 3 files changed, 22 insertions(+), 19 deletions(-) + +commit bc06e2805ae55f5c152dfb70ee91c75830ad8f54 +Author: Behdad Esfahbod +Date: Wed Nov 7 16:02:40 2018 -0500 + + [kerx/kern] Add has_cross_stream() + + src/hb-aat-layout-kerx-table.hh | 15 +++++++++++++++ + src/hb-ot-kern-table.hh | 9 +++++++++ + 2 files changed, 24 insertions(+) + +commit ea579f9ccc87718d4c2ca8945a997e6679428a12 +Author: Behdad Esfahbod +Date: Wed Nov 7 15:44:40 2018 -0500 + + [kerx] Fix peculiar indexing that was needed previously + + Not needed now that we use GPOS attachment for cursive kerx. + + src/hb-aat-layout-kerx-table.hh | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +commit 6ee6cd93d8c61389cf242e42a531cc6e7214b21a +Author: Behdad Esfahbod +Date: Wed Nov 7 15:40:55 2018 -0500 + + [GPOS] Only mark unsafe-to-break if kerning happened + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1365 + + src/hb-ot-layout-gpos-table.hh | 56 + ++++++++++++++++++++++++------------------ + 1 file changed, 32 insertions(+), 24 deletions(-) + +commit 501a364d9bb6c5828f9d660bae8b6e93b158b275 +Author: Behdad Esfahbod +Date: Wed Nov 7 15:02:16 2018 -0500 + + [GPOS] Add TODO item + + src/hb-ot-layout-gpos-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 7a9629f2f11a11d1c064662a08a0172ac2001668 +Author: Behdad Esfahbod +Date: Wed Nov 7 14:52:36 2018 -0500 + + [kerx] Implement CrossStream kerning for non-state-machine subtables + + Untested. + + src/hb-aat-layout-kerx-table.hh | 12 ++++++------ + src/hb-kern.hh | 43 + +++++++++++++++++++++++++++++------------ + src/hb-ot-kern-table.hh | 4 ++-- + 3 files changed, 39 insertions(+), 20 deletions(-) + +commit 0eb4157011e78c332d781e28b54b020aa08957c0 +Author: Behdad Esfahbod +Date: Wed Nov 7 14:42:15 2018 -0500 + + [kerx] Disable backwards-kerning for non-state-machine tables + + That's what the spec says for Backwards flag, only applicable to + formats 1 and 4. + + src/hb-aat-layout-kerx-table.hh | 8 +++----- + src/hb-ot-kern-table.hh | 2 +- + 2 files changed, 4 insertions(+), 6 deletions(-) + +commit b2f687c2569a3cc0b1cd0335c5ca0f8d193f8a39 +Author: Behdad Esfahbod +Date: Wed Nov 7 14:38:29 2018 -0500 + + [kerx] Use GPOS attachment facilities for CrossStream kerning + + src/hb-aat-layout-kerx-table.hh | 51 + ++++++++++++++++++++++++++++------------- + 1 file changed, 35 insertions(+), 16 deletions(-) + +commit e10a856eb24ae45e301c3ffa778caa4c0a995bb9 +Author: Behdad Esfahbod +Date: Wed Nov 7 14:11:48 2018 -0500 + + [kerx] Format + + src/hb-aat-layout-kerx-table.hh | 58 + ++++++++++++++++++++--------------------- + 1 file changed, 28 insertions(+), 30 deletions(-) + +commit 649cc3ef2773950b0b5884d9d1caf414aac888bf +Author: Behdad Esfahbod +Date: Wed Nov 7 14:04:04 2018 -0500 + + [kerx] Don't disable crossKerning if kern feature is off + + src/hb-aat-layout-kerx-table.hh | 9 +++++---- + src/hb-ot-shape.cc | 2 +- + 2 files changed, 6 insertions(+), 5 deletions(-) + +commit 0c3b061ac244fa8a8657366e1b95523503fdf7be +Author: Behdad Esfahbod +Date: Wed Nov 7 13:58:41 2018 -0500 + + [kern] Apply erlier, where GPOS/kerx are applied + + src/hb-aat-layout-kerx-table.hh | 3 +-- + src/hb-ot-shape-fallback.cc | 9 +++++++++ + src/hb-ot-shape.cc | 12 +++++------- + 3 files changed, 15 insertions(+), 9 deletions(-) + +commit f4bad0086e40c70d66d6514f038ddda1411657c8 +Author: Behdad Esfahbod +Date: Wed Nov 7 13:51:17 2018 -0500 + + [kerx] Implement tupleKerning for Format1 + + Untested. + + src/hb-aat-layout-kerx-table.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 39b4ef6f18605e85c68cbcec534e137fc831dbca +Author: Behdad Esfahbod +Date: Wed Nov 7 13:48:45 2018 -0500 + + [kerx] Better sanitize tupleKerning + + src/hb-aat-layout-kerx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14772da06f9c67d0d40712369e26064e3dee2a91 +Author: Behdad Esfahbod +Date: Wed Nov 7 13:40:22 2018 -0500 + + [kern/kerx] Share KernTable, renamed to KerxTable + + src/hb-aat-layout-kerx-table.hh | 77 ++++++++++++++++++++++-------- + src/hb-ot-kern-table.hh | 103 + ++-------------------------------------- + 2 files changed, 61 insertions(+), 119 deletions(-) + +commit c038f5be6b70b8edffc701dd3e4e3cd08d14e2f0 +Author: Behdad Esfahbod +Date: Wed Nov 7 13:35:06 2018 -0500 + + [fallback] Minor + + src/hb-ot-shape-fallback.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit db6e658e8c0c4953c2f026f6a67a5d2fb4bdc204 +Author: Behdad Esfahbod +Date: Wed Nov 7 13:33:23 2018 -0500 + + [kern/kerx] More towards sharing KernTable + + src/hb-aat-layout-kerx-table.hh | 48 ++++++++++++++++++--------------- + src/hb-ot-kern-table.hh | 59 + ++++++++++++++++++++++++++++------------- + 2 files changed, 67 insertions(+), 40 deletions(-) + +commit 89ec095979bde94bd203ed2c394f6e40629e9e78 +Author: Behdad Esfahbod +Date: Wed Nov 7 13:10:05 2018 -0500 + + [kern] Disable Format1 and Format3 for OT-style tables + + src/hb-ot-kern-table.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit ab57bcae0fd4505c80bb4ccdef6838bb2805ce79 +Author: Behdad Esfahbod +Date: Wed Nov 7 13:04:21 2018 -0500 + + [kern] Minor + + src/hb-ot-kern-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 30af5b4a4c2071599dc87bc092a7329befcc45cc +Author: Behdad Esfahbod +Date: Wed Nov 7 12:57:10 2018 -0500 + + [kern] Move code + + src/hb-ot-kern-table.hh | 118 + +++++++++++++++++++++++++----------------------- + 1 file changed, 62 insertions(+), 56 deletions(-) + +commit 1ff300464a1075b8cd5311970afbbcf4bb3b6f3d +Author: Behdad Esfahbod +Date: Wed Nov 7 12:51:49 2018 -0500 + + [kern] Massage more + + src/hb-ot-kern-table.hh | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +commit 8e9f6cd0fddd572e048487aae3141d3dbb1b99cb +Author: Behdad Esfahbod +Date: Wed Nov 7 12:49:20 2018 -0500 + + [kerx] More minor + + src/hb-aat-layout-kerx-table.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit f8c3df7d4a685bb86a1c15a5ef95485e8ef30305 +Author: Behdad Esfahbod +Date: Wed Nov 7 12:48:06 2018 -0500 + + [kern/kerx] Minor + + src/hb-aat-layout-kerx-table.hh | 5 +++-- + src/hb-ot-kern-table.hh | 19 ++++++++++--------- + 2 files changed, 13 insertions(+), 11 deletions(-) + +commit f5e0a63a22f91720a997f5070b84e982e57de661 +Author: Behdad Esfahbod +Date: Wed Nov 7 12:32:39 2018 -0500 + + [kern/kerx] Towards sharing KernTable + + src/hb-aat-layout-kerx-table.hh | 4 ++-- + src/hb-ot-kern-table.hh | 19 +++++++------------ + 2 files changed, 9 insertions(+), 14 deletions(-) + +commit 330508497d301c0ba5d5fb5d0900b62c191aabb5 +Author: Behdad Esfahbod +Date: Wed Nov 7 12:27:44 2018 -0500 + + [kern/kerx] Minor + + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-ot-kern-table.hh | 5 +++-- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 1a5ef8490034f4bd8965a3c71d34a5930ebe11b7 +Author: Behdad Esfahbod +Date: Wed Nov 7 12:19:52 2018 -0500 + + [kern/kerx] Share Format2 + + This, enables Format2 for kern table, which was disabled before. + + src/hb-aat-layout-kerx-table.hh | 6 ++++ + src/hb-ot-kern-table.hh | 73 + +---------------------------------------- + 2 files changed, 7 insertions(+), 72 deletions(-) + +commit 8faec4e33486616fdc0d690ad80d4a38a73c8182 +Author: Behdad Esfahbod +Date: Wed Nov 7 12:16:38 2018 -0500 + + [kerx] Towards merging Format2 + + src/hb-aat-layout-kerx-table.hh | 17 ++++++++++------- + 1 file changed, 10 insertions(+), 7 deletions(-) + +commit ae8fd0dbfb57afadfe815c5bde4ad4a6485fd950 +Author: Michiharu Ariza +Date: Wed Nov 7 09:16:12 2018 -0800 + + clear stack after vsindex op + + src/hb-cff2-interp-cs.hh | 1 + + src/hb-ot-cff2-table.hh | 1 + + 2 files changed, 2 insertions(+) + +commit 7fed7d80f72b35900b41878ae59e38fd1cb49dc8 +Author: Michiharu Ariza +Date: Wed Nov 7 09:09:13 2018 -0800 + + fixed off-by-one error in CFF1 Encoding lookup + + src/hb-ot-cff1-table.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit d5c0ca210fef315fd039e5b1825a865f36606a3f +Author: Behdad Esfahbod +Date: Wed Nov 7 12:08:44 2018 -0500 + + [aat] Minor + + src/hb-aat-layout-common.hh | 16 ++++++++++------ + src/hb-ot-kern-table.hh | 4 ++-- + 2 files changed, 12 insertions(+), 8 deletions(-) + +commit e72e041c3cda164b2ffb02d770b35d0d70954818 +Author: Behdad Esfahbod +Date: Wed Nov 7 11:56:36 2018 -0500 + + [kerx] Rename + + src/hb-aat-layout-kerx-table.hh | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +commit 241ba7da518adee334fff105ae19dfb051868a57 +Author: Behdad Esfahbod +Date: Wed Nov 7 11:51:40 2018 -0500 + + [morx/kerx] Rename types + + src/hb-aat-layout-common.hh | 4 ++-- + src/hb-aat-layout-kerx-table.hh | 17 +++++++++-------- + src/hb-aat-layout-morx-table.hh | 4 ++-- + src/hb-ot-kern-table.hh | 4 ++-- + 4 files changed, 15 insertions(+), 14 deletions(-) + +commit c808e444da12840ac3ab1d78569504b9b7e876f9 +Author: Behdad Esfahbod +Date: Wed Nov 7 11:28:36 2018 -0500 + + [kern/kerx] Share Format1 subtable + + src/hb-aat-layout-kerx-table.hh | 9 +- + src/hb-ot-kern-table.hh | 187 + +--------------------------------------- + 2 files changed, 4 insertions(+), 192 deletions(-) + +commit a244190afa90ac253724a2ff23a3bdf0c507d0e6 +Author: Behdad Esfahbod +Date: Wed Nov 7 11:43:25 2018 -0500 + + [kerx] Minor + + src/hb-aat-layout-kerx-table.hh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 2a720911964a00ad607ff712be09ea3ea0925c9b +Author: Behdad Esfahbod +Date: Wed Nov 7 11:25:55 2018 -0500 + + [kerx] Minor + + src/hb-aat-layout-kerx-table.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit f5f4ca7871ec2be2b5666a7b9e6e5e28133b8393 +Author: Behdad Esfahbod +Date: Wed Nov 7 11:21:09 2018 -0500 + + [kern/kerx] Enable crossStream kerning in vertical + + CoreText doesn't, but no reason we shouldn't do. + + src/hb-aat-layout-kerx-table.hh | 8 ++++---- + src/hb-ot-kern-table.hh | 8 ++++---- + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit d5c88af4a23bffc09840c43e6b1403b64a9f74d5 +Author: Behdad Esfahbod +Date: Wed Nov 7 11:20:14 2018 -0500 + + [kerx] More towards sharing Format1 + + src/hb-aat-layout-kerx-table.hh | 35 +++++++++++++++++++++++++++++++---- + src/hb-aat-layout-morx-table.hh | 10 ++++++---- + 2 files changed, 37 insertions(+), 8 deletions(-) + +commit b693fd0dc6c7979dcacdff060ecf12a2e107071d +Author: Behdad Esfahbod +Date: Wed Nov 7 11:05:28 2018 -0500 + + [morx] Simplify + + src/hb-aat-layout-morx-table.hh | 27 +++++++++++---------------- + 1 file changed, 11 insertions(+), 16 deletions(-) + +commit ce3451dc2aad2241c148953842e696e9f53b5deb +Author: Behdad Esfahbod +Date: Wed Nov 7 11:02:04 2018 -0500 + + [kerx] Towards sharing Format1 + + src/hb-aat-layout-kerx-table.hh | 61 + +++++++++++++++++++++++++++++++---------- + 1 file changed, 47 insertions(+), 14 deletions(-) + +commit e890753ebbf0d20c1c86796837918d530610df3b +Author: Behdad Esfahbod +Date: Wed Nov 7 10:58:50 2018 -0500 + + [morx] Minor + + src/hb-aat-layout-morx-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5b17853547ca6848ee652ef6990a81bb345ac06f +Author: Behdad Esfahbod +Date: Wed Nov 7 10:45:25 2018 -0500 + + [kern/kerx] Share Format0 + + src/hb-aat-layout-kerx-table.hh | 22 +++++++++++++----- + src/hb-ot-kern-table.hh | 50 + ++++++----------------------------------- + 2 files changed, 23 insertions(+), 49 deletions(-) + +commit c97dde5d55929df394fbe57c1ba1a725592c6732 +Author: Behdad Esfahbod +Date: Wed Nov 7 10:39:39 2018 -0500 + + [kern/kerx] Towards merge more + + src/hb-aat-layout-kerx-table.hh | 75 + ++++++++++++++++++++++++++++++----------- + src/hb-kern.hh | 33 ------------------ + src/hb-ot-kern-table.hh | 7 ++-- + 3 files changed, 58 insertions(+), 57 deletions(-) + +commit 540ccc38b0f95804d08047f8b2d059bfd1e09337 +Author: Behdad Esfahbod +Date: Wed Nov 7 10:33:46 2018 -0500 + + [kern/kerx] More towards sharing + + src/hb-aat-layout-kerx-table.hh | 7 ++++--- + src/hb-ot-kern-table.hh | 10 +++++++--- + 2 files changed, 11 insertions(+), 6 deletions(-) + +commit d0f8f4c200670bc0bfbffbf301139a3613865a7f +Author: Behdad Esfahbod +Date: Wed Nov 7 10:25:25 2018 -0500 + + [kern] Move kern machine to hb-kern.hh + + src/Makefile.sources | 1 + + src/hb-aat-layout-kerx-table.hh | 5 +- + src/hb-kern.hh | 153 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-kern-table.hh | 115 +----------------------------- + src/hb-ot-shape-fallback.cc | 2 +- + 5 files changed, 157 insertions(+), 119 deletions(-) + +commit a6acff252c72457ecfa856fd6c57081b3a4290dd +Author: Behdad Esfahbod +Date: Wed Nov 7 10:19:46 2018 -0500 + + [kerx] Towards sharing subtables with kern + + src/hb-aat-layout-kerx-table.hh | 41 + +++++++++++++++++++++++------------------ + 1 file changed, 23 insertions(+), 18 deletions(-) + +commit befac337ca2c705e2cea60a9a92e40e0dbbc40aa +Author: Behdad Esfahbod +Date: Wed Nov 7 09:53:02 2018 -0500 + + [kern] Remove Override business + + Not used in any fonts. Not well-specified when mixing kerning with + Cross-Stream positioning. + + src/hb-ot-kern-table.hh | 16 ---------------- + 1 file changed, 16 deletions(-) + +commit 9d5027696e418b7c2a5ccbc18faafe6b9290d08b +Author: Behdad Esfahbod +Date: Wed Nov 7 09:16:53 2018 -0500 + + [post] Return true on truncation + + Client can check that buffer was completely filled out and reallocate. + + src/hb-ot-post-table.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 7d91f07edf29c4923716af6cee8eb94f948ac91f +Author: Behdad Esfahbod +Date: Wed Nov 7 09:14:42 2018 -0500 + + [post] Protect against huge empty tables + + src/hb-ot-post-table.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 5ed816ab5900ac4ff7feca3d98cbd92e62fd1754 +Author: Behdad Esfahbod +Date: Wed Nov 7 09:13:51 2018 -0500 + + [post] Minor + + src/hb-ot-post-table.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 64f0becd89cc2b0136c7dc1609abc9f957525cf8 +Author: Behdad Esfahbod +Date: Wed Nov 7 09:10:55 2018 -0500 + + [post] Fix bound checking + + src/hb-ot-post-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7ec694ddf25a313483044256f7ed88b644432e15 +Author: HinTak +Date: Wed Nov 7 13:19:36 2018 +0000 + + Use non-GRID-fitted values for metrics (#1363) + + * Use non-GRID-fitted values for metrics + + See freetype/src/base/ftobjs.c:ft_recompute_scaled_metrics() and + the usage of GRID_FIT_METRICS inside. + + Fixes https://github.com/behdad/harfbuzz/issues/1262 + + * Update hb-ft.cc + + src/hb-ft.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 59e04e42312293c30714a666c4479e209aec3c0e +Author: Behdad Esfahbod +Date: Wed Nov 7 00:25:48 2018 -0500 + + [kern/kerx] Fix cursive joining + + Tested with Waseem TTC: + + $ hb-shape Waseem.ttc جحخج + [F1Jeem_R2=3@0,180+479|M1Khah_L2_R2=2@0,682+403|M1Hah_L2_R2=1@0,1184+403|I1Jeem_L2=0@0,1184+744] + + src/hb-aat-layout-kerx-table.hh | 2 ++ + src/hb-ot-kern-table.hh | 2 ++ + 2 files changed, 4 insertions(+) + +commit 8d0f797139e853d13cb2383d541c2e691d9dbae3 +Author: Behdad Esfahbod +Date: Wed Nov 7 00:04:40 2018 -0500 + + [kern/kerx] Fix "reset" magic value + + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-ot-kern-table.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 0123976a0c1e2f629252969a7ff632dc2b1dbbc9 +Author: Behdad Esfahbod +Date: Tue Nov 6 21:45:40 2018 -0500 + + [kerx] Adjust CrossStream kern to match 'kern' table + + src/hb-aat-layout-kerx-table.hh | 62 + +++++++++++++++++++++++++++++++---------- + 1 file changed, 48 insertions(+), 14 deletions(-) + +commit 80a33b9ac351d81793f35a92e0255ffbf5ceb8b9 +Author: Behdad Esfahbod +Date: Tue Nov 6 21:41:28 2018 -0500 + + [kern] More tweaks + + Solves a mystery or two. I'm fairly confident this is what CoreText + does now. + + src/hb-ot-kern-table.hh | 40 ++++++++++++++++++++++------------------ + 1 file changed, 22 insertions(+), 18 deletions(-) + +commit 564e8ac0465d8ced3a98ecb55d09ffaa45eefc2f +Author: Behdad Esfahbod +Date: Tue Nov 6 21:04:40 2018 -0500 + + [kern] Adjust some more + + Getting closer. So many open questions still... + + src/hb-ot-kern-table.hh | 36 ++++++++++++++++++++++-------------- + 1 file changed, 22 insertions(+), 14 deletions(-) + +commit 4d003b8503f9c984abe2ac0de8c526a276ea8e54 +Author: Behdad Esfahbod +Date: Tue Nov 6 21:04:02 2018 -0500 + + [kern] Add TODO + + src/hb-ot-kern-table.hh | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 9810f0b80e5b6580a7a15debcec073dfc9ca759f +Author: Behdad Esfahbod +Date: Tue Nov 6 19:24:04 2018 -0500 + + [kern] Minor + + src/hb-ot-kern-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9c04b6058306cd4b2123a33a7cbeb47505434217 +Author: Behdad Esfahbod +Date: Tue Nov 6 18:35:58 2018 -0500 + + [kern] In Format1, adjust how kerning is done + + In a series of kerns in one action, kern all but last glyph forward, + and the last one backward. Seems to better match what CoreText + is doing. + + Test cases, with GeezaPro Arabic: + + $ ./hb-shape GeezaPro_10_10.ttc -u U+0631,U+0628 + [u0628.beh=1+1415|u0631.reh=0@-202,0+700] + + $ ./hb-shape GeezaPro_10_10.ttc -u U+0628,U+064F + [u064f.damma=0@0,-250+-250|u0628.beh=0@250,0+1665] + + In a later change, I'll make kern machine avoid producing negative + kerns. + + src/hb-ot-kern-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e8c47724638c29d78001905610c662de99c59cad +Author: Behdad Esfahbod +Date: Tue Nov 6 17:16:04 2018 -0500 + + [kern] XXX Negate CrossKerning sign + + Not sure why, but seems to better match GeezaPro Arabic w CoreText. + + Quite possibly I'm doing something very wrong... + + src/hb-ot-kern-table.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 01bf43ac01576a6415336cc56c74bb1a872566d1 +Author: Behdad Esfahbod +Date: Tue Nov 6 14:48:42 2018 -0500 + + [kern] Implement CrossStream kerning + + src/hb-aat-layout-kerx-table.hh | 75 + ++++++++++++++++++++++++++--------------- + src/hb-ot-kern-table.hh | 63 ++++++++++++++++++++++++++++------ + 2 files changed, 101 insertions(+), 37 deletions(-) + +commit b11830c09e0d78bbdaf86ef02191d00b3d8256c4 +Author: Behdad Esfahbod +Date: Tue Nov 6 15:23:18 2018 -0500 + + [kern] Improve Format 2 + + Still disabled. + + src/hb-aat-layout-common.hh | 20 +++++++++----------- + src/hb-ot-kern-table.hh | 35 ++++++----------------------------- + 2 files changed, 15 insertions(+), 40 deletions(-) + +commit c0383c6bb725bed2a48485988a427348384f3f87 +Author: Behdad Esfahbod +Date: Tue Nov 6 15:07:19 2018 -0500 + + Minor + + src/hb-aat-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 10e6f708f30986bab9f7b506935f2555d6b79ff4 +Author: Behdad Esfahbod +Date: Tue Nov 6 13:32:13 2018 -0500 + + [kern] Minor + + src/hb-ot-kern-table.hh | 30 +++++++++++------------------- + 1 file changed, 11 insertions(+), 19 deletions(-) + +commit 164eedd9181345d84d5f8059475ad4b97784fd46 +Author: Behdad Esfahbod +Date: Tue Nov 6 13:18:27 2018 -0500 + + [kern] Minor + + src/hb-ot-kern-table.hh | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 220a5991baa213b7bd173ea02090dc6fc8aef655 +Author: Behdad Esfahbod +Date: Tue Nov 6 13:51:39 2018 -0500 + + [kern/kerx] Fix trace numbering + + src/hb-aat-layout-kerx-table.hh | 1 + + src/hb-ot-kern-table.hh | 1 + + 2 files changed, 2 insertions(+) + +commit 7b21319edfd6531a444846f71e87303bc09f4621 +Author: Michiharu Ariza +Date: Tue Nov 6 13:59:07 2018 -0800 + + don't reject empty Dict + + src/hb-cff-interp-dict-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 43ee0e4d006ce7b4ade4483f2c8ec3d39723fc94 +Merge: ec6817c1 bfafe208 +Author: Michiharu Ariza +Date: Tue Nov 6 09:57:17 2018 -0800 + + Merge branch 'master' into cff-subset + +commit bfafe208da11817b5ebf3751f02af2dcdf57bd19 +Author: Behdad Esfahbod +Date: Tue Nov 6 12:11:45 2018 -0500 + + [kern] Switch to dispatch + + src/hb-aat-layout-kerx-table.hh | 12 ++++++------ + src/hb-ot-kern-table.hh | 31 +++++++++++++++---------------- + 2 files changed, 21 insertions(+), 22 deletions(-) + +commit 213fa3bf711dae5028e3d041e305cdd35223de77 +Author: Behdad Esfahbod +Date: Tue Nov 6 12:07:15 2018 -0500 + + [kern] Refactor to include header in each subtable type + + src/hb-ot-kern-table.hh | 189 + +++++++++++++++++++++++------------------------- + 1 file changed, 91 insertions(+), 98 deletions(-) + +commit b0da2cd0b9c1346b7cda5997fb799e895e34aace +Author: Behdad Esfahbod +Date: Tue Nov 6 11:16:45 2018 -0500 + + [kern] Some more + + src/hb-ot-kern-table.hh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 75b00b51c8fca5d605c479333eb3abd608623613 +Author: Behdad Esfahbod +Date: Tue Nov 6 11:13:40 2018 -0500 + + [kern] Renames + + src/hb-ot-kern-table.hh | 20 +++++++++----------- + 1 file changed, 9 insertions(+), 11 deletions(-) + +commit 5c3ccbc634158ba9f84d365c9a31a596f6d8825b +Author: Khaled Hosny +Date: Tue Nov 6 18:10:56 2018 +0200 + + Another missing backlash + + Did this ever work? + + test/api/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d29602b962c13836f4c0d46796bc693f66f9b9fe +Author: Khaled Hosny +Date: Tue Nov 6 18:07:47 2018 +0200 + + Add missing backslash + + test/api/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9bddfde25dc8c302c765a1e9a8a2c38c4a836e2e +Author: Behdad Esfahbod +Date: Tue Nov 6 11:03:34 2018 -0500 + + [util] Fix up previous commit + + util/options.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 3ec2e4fa7bec07ec181a0390e5f5fd695abee611 +Author: Behdad Esfahbod +Date: Tue Nov 6 10:49:19 2018 -0500 + + [util] Don't terminate string after a a 0 in -u + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1361 + + util/options.cc | 4 +++- + util/options.hh | 2 ++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 8790b2740a334f1789fb0cf329f2b8ac9733793c +Author: Behdad Esfahbod +Date: Tue Nov 6 10:24:54 2018 -0500 + + [fuzzing] Fix test + + test/fuzzing/hb-shape-fuzzer.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 3af0a7edd0c99aaef846ae787056d7664bc69d35 +Author: Behdad Esfahbod +Date: Tue Nov 6 10:20:57 2018 -0500 + + [fuzzing] Add make check-valgrind + + test/fuzzing/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit b062378ce640eb418cb413b595b79cc81a193209 +Author: Behdad Esfahbod +Date: Tue Nov 6 10:20:36 2018 -0500 + + [test] Minor + + test/api/.valgrind-suppressions | 0 + test/api/Makefile.am | 2 +- + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 37f421c951c853dff165df6731d0ab9c46350790 +Author: Behdad Esfahbod +Date: Tue Nov 6 10:03:38 2018 -0500 + + Minor + + src/hb-ot-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b6112e5ea4d08fcbfa8f7cb4ef3903514a6e99f3 +Author: Ebrahim Byagowi +Date: Tue Nov 6 11:42:47 2018 +0330 + + [test] Fix -Weverything bot complain + + test/api/test-ot-name.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a49df419f04b4065fc7f70a77c5cbc453e6ba906 +Author: Ebrahim Byagowi +Date: Tue Nov 6 11:26:30 2018 +0330 + + [test] Test hb_ot_name_{list_names,get_utf8} on test-ot-name + + test/api/test-ot-name.c | 27 ++++++++++++++++++++++++--- + 1 file changed, 24 insertions(+), 3 deletions(-) + +commit 9139cc23ea9fb339be9426860e0c72038d32a2ab +Author: Ebrahim Byagowi +Date: Tue Nov 6 11:17:14 2018 +0330 + + Fix link issue of some of the bots + + e.g. https://circleci.com/gh/harfbuzz/harfbuzz/52410 + + src/hb-ot-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 98b37f0c109d0f7454e91c9563c56d1903d6d496 +Author: Ebrahim Byagowi +Date: Tue Nov 6 09:16:28 2018 +0330 + + [mort] Fix table detection logic + + mort really needs some initial tests at least. + + src/hb-aat-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fa3ebf845fcffa827600fc4ca9fdde3aaa99f4c5 +Author: Behdad Esfahbod +Date: Mon Nov 5 23:34:07 2018 -0500 + + Simplify some more + + src/hb-aat-layout.cc | 10 +++++----- + src/hb-ot-layout.cc | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 61f52231f430c72e1b66b76dabb018cfe45a01d5 +Author: Behdad Esfahbod +Date: Mon Nov 5 23:28:52 2018 -0500 + + [math] Shorten names a bit + + src/hb-ot-math-table.hh | 4 ++-- + src/hb-ot-math.cc | 33 +++++++++++++++++++-------------- + 2 files changed, 21 insertions(+), 16 deletions(-) + +commit 737efbe65583a71d7df9ae7b423d9fb1d68599b7 +Author: Behdad Esfahbod +Date: Mon Nov 5 23:26:29 2018 -0500 + + [ot-layout] Simplify GSUB/GPOS access + + This concludes simplifying table access to face->table.XXXX. + + src/hb-ot-layout.cc | 31 +++++++++++++------------------ + 1 file changed, 13 insertions(+), 18 deletions(-) + +commit 5e68cec17913e9f6e98e5017a56c78a5614e4030 +Author: Behdad Esfahbod +Date: Mon Nov 5 23:23:57 2018 -0500 + + [ot-layout] Simplify GDEF access + + src/hb-ot-layout.cc | 44 ++++++++++++++++---------------------------- + 1 file changed, 16 insertions(+), 28 deletions(-) + +commit 33b006cc51b0d27cbe1d8ed498bbf2b548cb6554 +Author: Behdad Esfahbod +Date: Mon Nov 5 23:19:04 2018 -0500 + + [ot-layout] Simplify some access + + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 9 +++++---- + src/hb-ot-layout-gsub-table.hh | 9 +++++---- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-layout.hh | 12 +----------- + 5 files changed, 13 insertions(+), 21 deletions(-) + +commit db35409f0db9faf91a10defc81e4d6d60dc7822a +Author: Behdad Esfahbod +Date: Mon Nov 5 23:11:46 2018 -0500 + + [ot-layout] Remove ensures + + src/hb-ot-layout.cc | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +commit 9198de7b9b6020c1e3d6a48783e36db7e1f7e99a +Author: Behdad Esfahbod +Date: Mon Nov 5 23:10:37 2018 -0500 + + [ot-font] Remove ensure + + src/hb-ot-font.cc | 1 - + 1 file changed, 1 deletion(-) + +commit ea6d9b661fc3cf6bc4366feeb7694c0b712abfae +Author: Behdad Esfahbod +Date: Mon Nov 5 23:09:29 2018 -0500 + + [ot-face] Remove a few ensures + + src/hb-face.cc | 3 --- + 1 file changed, 3 deletions(-) + +commit 0fe7a745c9a323a3fc76beb011b6ab8919cf905b +Author: Behdad Esfahbod +Date: Mon Nov 5 23:08:33 2018 -0500 + + [ot-face] Simplify more table access + + src/hb-face.cc | 6 +++--- + src/hb-ot-face.hh | 3 --- + src/hb-ot-font.cc | 4 +--- + src/hb-ot-layout.cc | 34 +++++++++++++++++----------------- + 4 files changed, 21 insertions(+), 26 deletions(-) + +commit a35c92cbe771a75df40412fd248ad06f6a0cfebf +Author: Behdad Esfahbod +Date: Mon Nov 5 22:58:43 2018 -0500 + + [ot-face] Simplify table access + + Yoohoo! + + src/hb-aat-layout.cc | 107 + ++++++++++----------------------------------------- + src/hb-ot-color.cc | 66 ++++++++----------------------- + src/hb-ot-layout.cc | 20 ++-------- + src/hb-ot-math.cc | 47 ++++++++-------------- + src/hb-ot-name.cc | 11 +----- + src/hb-ot-var.cc | 33 ++++------------ + 6 files changed, 64 insertions(+), 220 deletions(-) + +commit 914b595f2598d5bdb2c750832d567a57d45db84e +Author: Behdad Esfahbod +Date: Mon Nov 5 22:39:50 2018 -0500 + + [ot-face] Include hb-ot-face directly in hb_face_t + + Simplifying access coming next. + + src/hb-face.cc | 4 ++++ + src/hb-face.hh | 3 +++ + src/hb-ot-face.cc | 24 ++---------------------- + src/hb-ot-face.hh | 39 +++++++++++++++------------------------ + src/hb-ot-font.cc | 24 ++++++++++++------------ + src/hb-ot-math.cc | 3 +-- + src/hb-ot-shape.cc | 5 +++-- + 7 files changed, 40 insertions(+), 62 deletions(-) + +commit 56ba998cddbb2ba5d24fb0b02d2bf77a46c0f23f +Author: Behdad Esfahbod +Date: Mon Nov 5 19:49:54 2018 -0500 + + [cmap] Push get_nominal_glyphs down into cmap accelerator + + src/hb-ot-cmap-table.hh | 21 +++++++++++++++++++++ + src/hb-ot-font.cc | 13 +++---------- + 2 files changed, 24 insertions(+), 10 deletions(-) + +commit 36d85dce25abd079252d973f804220bf7b97e987 +Author: Behdad Esfahbod +Date: Mon Nov 5 19:46:29 2018 -0500 + + [cmap] Use hb_nonnullptr_t + + src/hb-ot-cmap-table.hh | 34 ++++++++++++++-------------------- + 1 file changed, 14 insertions(+), 20 deletions(-) + +commit 8be74d85534534dbdd39a0a6f496e26e9f3e661d +Author: Behdad Esfahbod +Date: Mon Nov 5 18:47:22 2018 -0500 + + 2.1.1 + + NEWS | 8 ++++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 11 insertions(+), 3 deletions(-) + +commit 6482fda519ca7d173e3bcb3717aa30e237f04b25 +Author: Behdad Esfahbod +Date: Mon Nov 5 15:03:18 2018 -0500 + + [fuzzing] Fuzz glyph-id etc in test-ot-face + + test/api/test-ot-face.c | 57 + +++++++++++++++++++++-------------------- + test/fuzzing/hb-shape-fuzzer.cc | 19 +------------- + 2 files changed, 30 insertions(+), 46 deletions(-) + +commit 252632c477b963f305116d69fcafacd8bf7b97bf +Author: Behdad Esfahbod +Date: Mon Nov 5 14:33:41 2018 -0500 + + [uniscribe] Fix use of deprecated API + + src/hb-uniscribe.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit bb380ec18394b2c581b672ecbf98991e14897f2e +Author: Behdad Esfahbod +Date: Mon Nov 5 13:45:12 2018 -0500 + + [cmap] Make null accelerator safe + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1146 + + src/hb-ot-cmap-table.hh | 50 + ++++++++++++++++++++++++------------------------- + 1 file changed, 25 insertions(+), 25 deletions(-) + +commit f6fc5574d3dae177a54b10195e0d1f368a74f768 +Author: Behdad Esfahbod +Date: Mon Nov 5 13:23:54 2018 -0500 + + Add pointer magic operators to hb_atomic_ptr_t + + src/hb-atomic.hh | 3 +++ + src/hb-common.cc | 6 +++--- + src/hb-face.cc | 2 +- + src/hb-graphite2.cc | 8 ++++---- + src/hb-machinery.hh | 1 + + src/hb-ot-shape-complex-arabic.cc | 4 ++-- + src/hb-shape-plan.cc | 2 +- + 7 files changed, 15 insertions(+), 11 deletions(-) + +commit f6e7cb51b13aabb447dc97a59602d65eb42edc4b +Author: Behdad Esfahbod +Date: Mon Nov 5 13:23:07 2018 -0500 + + Fix const-confusion in hb_array_t as well + + src/hb-dsalgs.hh | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 0da22fb0ada8a54fc59739057f281a406a993212 +Author: Behdad Esfahbod +Date: Mon Nov 5 13:13:39 2018 -0500 + + [null] Tweak hb_nonnull_ptr_t some more + + src/hb-null.hh | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +commit 03348ce0051cfae7172ac0d09b83ed5f82fa842a +Author: Behdad Esfahbod +Date: Mon Nov 5 12:59:32 2018 -0500 + + Minor + + src/hb-aat-layout.cc | 12 ++++++------ + src/hb-ot-color.cc | 10 +++++----- + src/hb-ot-font.cc | 18 +++++++++--------- + src/hb-ot-layout.cc | 2 +- + src/hb-ot-math.cc | 2 +- + src/hb-ot-name.cc | 2 +- + src/hb-ot-var.cc | 6 ++---- + 7 files changed, 25 insertions(+), 27 deletions(-) + +commit ec6817c1bd82a60b84cb868e4d7ff4c65cb80ccc +Author: Michiharu Ariza +Date: Mon Nov 5 07:59:08 2018 -0800 + + remove build files accidentally pushed + + INSTALL | 370 - + Makefile | 954 -- + Makefile.in | 954 -- + aclocal.m4 | 1496 --- + ar-lib | 270 - + autom4te.cache/output.0 | 23333 + ---------------------------------------------- + autom4te.cache/output.1 | 23333 + ---------------------------------------------- + autom4te.cache/output.2 | 23333 + ---------------------------------------------- + autom4te.cache/requests | 555 -- + autom4te.cache/traces.0 | 3823 -------- + autom4te.cache/traces.1 | 1229 --- + autom4te.cache/traces.2 | 3823 -------- + compile | 347 - + config.guess | 1421 --- + config.h | 227 - + config.h.in | 226 - + config.log | 1560 ---- + config.status | 2420 ----- + config.sub | 1807 ---- + configure | 23333 + ---------------------------------------------- + depcomp | 791 -- + install-sh | 501 - + libtool | 11805 ----------------------- + ltmain.sh | 11147 ---------------------- + missing | 215 - + stamp-h1 | 1 - + test-driver | 148 - + 27 files changed, 139422 deletions(-) + +commit b721fdae662673ab706da897aaa1db126f8ca1a5 +Author: Michiharu Ariza +Date: Sun Nov 4 16:19:15 2018 -0800 + + fixed leaks in CFF subr subset + + src/hb-ot-cff-common.hh | 10 +++++++++- + src/hb-subset-cff-common.hh | 10 +++++++++- + 2 files changed, 18 insertions(+), 2 deletions(-) + +commit 85f5644e8e9fe18032e37d4153c3c928d087ac6a +Author: Michiharu Ariza +Date: Sun Nov 4 14:17:30 2018 -0800 + + added missing switch breaks + + src/hb-subset-cff-common.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 1682d1bbecaeeddc8a1678a01c57c0e0023bf7c4 +Merge: d8fadec0 b605db2f +Author: Michiharu Ariza +Date: Sun Nov 4 13:25:41 2018 -0800 + + Merge branch 'master' into cff-subset + +commit d8fadec098935335e69e46c1101da3f142824638 +Author: Michiharu Ariza +Date: Sun Nov 4 13:12:20 2018 -0800 + + added desubroutinize full font test profiles & expected fonts + + modified subset_test_suite.py to apply desubroutinize profiles to + CFF only (not to TT) + + ...urceSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 3640 -> + 3784 bytes + .../SourceSansPro-Regular.default.61,62,63.otf | Bin 3400 -> + 3496 bytes + .../SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 3596 -> + 3612 bytes + ...sPro-Regular.desubroutinize.1FC,21,41,20,62,63.otf | Bin 0 -> + 3640 bytes + .../SourceSansPro-Regular.desubroutinize.61,62,63.otf | Bin 0 -> + 3400 bytes + ...eSansPro-Regular.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 0 -> + 3596 bytes + ...eSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 3480 -> + 3564 bytes + .../SourceSansPro-Regular.drop-hints.61,62,63.otf | Bin 3276 -> + 3340 bytes + ...ourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 3448 -> + 3464 bytes + ...r.drop-hints.desubroutinize.1FC,21,41,20,62,63.otf | Bin 0 -> + 3480 bytes + ...Pro-Regular.drop-hints.desubroutinize.61,62,63.otf | Bin 0 -> + 3276 bytes + ...gular.drop-hints.desubroutinize.D7,D8,D9,DA,DE.otf | Bin 0 -> + 3448 bytes + ...-Regular.default.3042,3044,3046,3048,304A,304B.otf | Bin 6248 -> + 6324 bytes + ...-Regular.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6432 -> + 6568 bytes + .../SourceHanSans-Regular.default.61,63,65,6B.otf | Bin 5428 -> + 5500 bytes + ...-Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6552 -> + 6780 bytes + .../japanese/SourceHanSans-Regular.default.660E.otf | Bin 5196 -> + 5248 bytes + ....otf => SourceHanSans-Regular.desubroutinize..otf} | Bin + ...r.desubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> + 6248 bytes + ...r.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> + 6432 bytes + ...urceHanSans-Regular.desubroutinize.61,63,65,6B.otf | Bin 0 -> + 5428 bytes + ...r.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> + 6552 bytes + .../SourceHanSans-Regular.desubroutinize.660E.otf | Bin 0 -> + 5196 bytes + ...gular.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 6076 -> + 6132 bytes + ...gular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 6180 -> + 6304 bytes + .../SourceHanSans-Regular.drop-hints.61,63,65,6B.otf | Bin 5312 -> + 5344 bytes + ...gular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 6248 -> + 6472 bytes + .../SourceHanSans-Regular.drop-hints.660E.otf | Bin 5088 -> + 5140 bytes + ...rceHanSans-Regular.drop-hints.desubroutinize..otf} | Bin + ...s.desubroutinize.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> + 6076 bytes + ...s.desubroutinize.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> + 6180 bytes + ...-Regular.drop-hints.desubroutinize.61,63,65,6B.otf | Bin 0 -> + 5312 bytes + ...s.desubroutinize.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> + 6248 bytes + ...HanSans-Regular.drop-hints.desubroutinize.660E.otf | Bin 0 -> + 5140 bytes + test/subset/data/profiles/desubroutinize.txt | 1 + + .../data/profiles/drop-hints-desubroutinize.txt | 2 ++ + test/subset/generate-expected-outputs.py | 1 - + test/subset/subset_test_suite.py | 7 ++++++- + 38 files changed, 9 insertions(+), 2 deletions(-) + +commit b605db2f65e62ad6727a61481f78015933dbf207 +Author: Behdad Esfahbod +Date: Sun Nov 4 12:58:02 2018 -0500 + + [aat] Clean up ankr table include mess + + src/hb-aat-layout-ankr-table.hh | 2 ++ + src/hb-aat-layout-common.hh | 31 +++++++++--------------------- + src/hb-aat-layout-kerx-table.hh | 16 ++++++++-------- + src/hb-aat-layout.cc | 42 + +++++++++++++++++++++++++++++++++++++++-- + src/hb-ot-kern-table.hh | 1 - + src/hb-static.cc | 1 - + 6 files changed, 59 insertions(+), 34 deletions(-) + +commit bce437cf0b71e9b60bbf058eaf61593fed30ae33 +Author: Behdad Esfahbod +Date: Sun Nov 4 02:47:34 2018 -0500 + + [test] Call test-ot-face.c test from hb-shape-fuzzer + + Should increase coverage... + + test/api/test-ot-face.c | 28 ++++++++++++++++++---------- + test/fuzzing/hb-shape-fuzzer.cc | 6 ++++++ + 2 files changed, 24 insertions(+), 10 deletions(-) + +commit 777c22425cae97009ca4dc5b1e400670c4aa0799 +Author: Behdad Esfahbod +Date: Sun Nov 4 02:40:20 2018 -0500 + + [test] More funcs in test-ot-face + + test/api/test-font.c | 5 +++++ + test/api/test-ot-face.c | 21 +++++++++++++++++++-- + 2 files changed, 24 insertions(+), 2 deletions(-) + +commit 17335a8161e674e630287e18a6d304ec0c33767c +Author: Behdad Esfahbod +Date: Sun Nov 4 02:25:07 2018 -0500 + + Clean up buffer->swap_buffers() calls + + That function checks for buffer->successful already. No need + to check at call site. + + src/gen-vowel-constraints.py | 4 +--- + src/hb-aat-layout-common.hh | 3 +-- + src/hb-aat-layout-morx-table.hh | 3 +-- + src/hb-ot-shape-complex-indic.cc | 1 - + src/hb-ot-shape-complex-khmer.cc | 1 - + src/hb-ot-shape-complex-myanmar.cc | 1 - + src/hb-ot-shape-complex-thai.cc | 3 +-- + src/hb-ot-shape-complex-use.cc | 1 - + src/hb-ot-shape-complex-vowel-constraints.cc | 5 ++--- + src/hb-ot-shape.cc | 1 - + 10 files changed, 6 insertions(+), 17 deletions(-) + +commit 191ca0f15b7fc9ab959e1f6472c48839687402ec +Author: Michiharu Ariza +Date: Sat Nov 3 22:42:22 2018 -0700 + + CFF1 no-desubr fixes + + make sure charstring/subrs not ending with endchar/return handled + correctly + if no local subrs, skip serializing Subrs op in Private + misc fixes + + src/hb-ot-cff-common.hh | 13 +++++++++- + src/hb-subset-cff-common.hh | 59 + +++++++++++++++++++++++---------------------- + src/hb-subset-cff1.cc | 27 +++++++++++++++------ + 3 files changed, 62 insertions(+), 37 deletions(-) + +commit 4eb52460c8c6dc48af240f2254f76fae065bfa97 +Author: Behdad Esfahbod +Date: Sat Nov 3 21:45:39 2018 -0400 + + Fix >> + + src/hb-ot-post-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ae9ad1076e536aee370f9863cde8351b79f01b3b +Author: Behdad Esfahbod +Date: Sat Nov 3 21:41:50 2018 -0400 + + Fix "Warning: extra ";" ignored." + + src/hb.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit d0163afb7bed83935c6a54d57a0e7366caeba0b3 +Author: Behdad Esfahbod +Date: Sat Nov 3 21:38:24 2018 -0400 + + Revert "Add operator char * to the naked array types as well" + + This reverts commit db889c182ee5f54127285bfaab5bc94dafe46bda. + + Was resulting in ambigious overloads... + + src/hb-dsalgs.hh | 4 +--- + src/hb-open-type.hh | 2 -- + 2 files changed, 1 insertion(+), 5 deletions(-) + +commit c8f94a1ca6928f07749285da910b63087d485537 +Author: Behdad Esfahbod +Date: Sat Nov 3 21:07:39 2018 -0400 + + Minor + + src/hb-ot-name.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9779e602ed7ac214c0da2c90e104b38460422476 +Author: Behdad Esfahbod +Date: Sat Nov 3 20:50:56 2018 -0400 + + [test] Add test for empty face + + test/api/Makefile.am | 1 + + test/api/test-ot-face.c | 94 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 95 insertions(+) + +commit 1da4de7e7b71dfde734cb77ec6acb31f574585f2 +Author: Michiharu Ariza +Date: Sat Nov 3 15:41:29 2018 -0700 + + fix for subset fuzzer failure + + A called subr must be freshly parsed or completely parsed. otherwise + the prevoius parse must have terminated prematurely + + src/hb-subset-cff1.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0b0b38ec1e6a815a30bef98193043d255b52c4a1 +Author: Behdad Esfahbod +Date: Sat Nov 3 16:15:30 2018 -0400 + + Fix null accelerator's + + Fixes all except for cmap. To be done separately. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1146 + + src/hb-ot-color-cbdt-table.hh | 10 ++-------- + src/hb-ot-color-sbix-table.hh | 11 ++++------- + src/hb-ot-color-svg-table.hh | 11 ++++------- + src/hb-ot-glyf-table.hh | 6 +++--- + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + 8 files changed, 17 insertions(+), 29 deletions(-) + +commit db889c182ee5f54127285bfaab5bc94dafe46bda +Author: Behdad Esfahbod +Date: Sat Nov 3 16:04:19 2018 -0400 + + Add operator char * to the naked array types as well + + src/hb-dsalgs.hh | 4 +++- + src/hb-open-type.hh | 2 ++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit d6fdae310f2a98ca624c3a77c3aa03b8b3bd393a +Author: Behdad Esfahbod +Date: Sat Nov 3 16:02:03 2018 -0400 + + Add operator char * to hb_nonnull_ptr_t + + src/hb-null.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 7430ff604aa54bedcb07cc1c2962eae85fcade76 +Author: Behdad Esfahbod +Date: Sat Nov 3 15:59:13 2018 -0400 + + Template casts in hb_nonnull_ptr_t + + src/hb-null.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit da408fce98153e0fab3d82fe28813085feed0974 +Author: Behdad Esfahbod +Date: Sat Nov 3 15:49:37 2018 -0400 + + [blob] Allow null parent in create_sub_blob() + + Like font and unicode. + + src/hb-blob.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fb0f30f55a5d654b2f1f9b99efa9b8abc51dbf34 +Author: Behdad Esfahbod +Date: Sat Nov 3 15:24:14 2018 -0400 + + Add hb_nonnull_ptr_t + + Towards fixing https://github.com/harfbuzz/harfbuzz/issues/1146 + + src/hb-null.hh | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +commit 8d98c51d133b058a845ed7a84bfe8a43083bbb03 +Author: Behdad Esfahbod +Date: Sat Nov 3 15:14:57 2018 -0400 + + [kern] Third try fix access violation in Format3 + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11245 + + src/hb-ot-kern-table.hh | 1 - + 1 file changed, 1 deletion(-) + +commit f074da8c2b6a7061c71d12213a6c494c119eb20e +Author: Behdad Esfahbod +Date: Sat Nov 3 15:06:45 2018 -0400 + + [kern] Really fix access violation in Format3 + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11245 + + src/hb-ot-kern-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 93ef20a83b31e6528bb1835d2b4b83b913805885 +Author: Behdad Esfahbod +Date: Sat Nov 3 15:03:06 2018 -0400 + + Replace most uses of is_inert with is_immutable + + src/hb-buffer.cc | 32 ++++++++++++++++---------------- + src/hb-coretext.cc | 2 +- + src/hb-font.cc | 2 +- + src/hb-set.hh | 8 +++++--- + src/hb-shape-plan.cc | 2 +- + 5 files changed, 24 insertions(+), 22 deletions(-) + +commit 0589787ff55bff9bd5849c4443229e926cc574a5 +Author: Behdad Esfahbod +Date: Sat Nov 3 14:58:54 2018 -0400 + + [kern] Fix access violation in Format3 + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11245 + + src/hb-ot-kern-table.hh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 5570c87f21f061cc197e02bd0526ab44c63ed6f1 +Author: Behdad Esfahbod +Date: Sat Nov 3 14:51:38 2018 -0400 + + Port objects to use header.writable instead of immutable + + Saves 4 or 8 bytes per object on 64bit archs. + + src/hb-blob.cc | 12 ++++-------- + src/hb-blob.hh | 2 -- + src/hb-face.cc | 16 ++++++---------- + src/hb-face.hh | 2 -- + src/hb-font.cc | 46 +++++++++++++++++++--------------------------- + src/hb-font.hh | 4 ---- + src/hb-ft.cc | 2 +- + src/hb-object.hh | 11 ++++++++--- + src/hb-unicode.cc | 11 ++++------- + src/hb-unicode.hh | 2 -- + 10 files changed, 42 insertions(+), 66 deletions(-) + +commit ee351a38ec0c62b76dd1b3f20fe56cb4d63e62be +Author: Behdad Esfahbod +Date: Sat Nov 3 14:28:55 2018 -0400 + + [object] Add "writable" + + src/hb-object.hh | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit b8a78ce201608e9ac6d7f77447b2bbef6f09e9ff +Author: Ebrahim Byagowi +Date: Sat Nov 3 22:28:30 2018 +0330 + + [BASE] Improvements (#1347) + + src/hb-ot-layout-base-table.hh | 610 + ++++++++++++++++++----------------------- + src/hb-ot-layout.cc | 65 ++++- + src/hb-ot-layout.h | 16 -- + test/api/Makefile.am | 1 + + test/api/fonts/base.ttf | Bin 0 -> 5596 bytes + test/api/test-baseline.c | 58 ++++ + 6 files changed, 380 insertions(+), 370 deletions(-) + +commit c560ca92512c0283e826c059431273ffecf5d993 +Author: Ebrahim Byagowi +Date: Sat Nov 3 13:03:36 2018 +0330 + + [fuzz] A new testcase + + ...uzz-testcase-minimized-hb-shape-fuzzer-5735679418433536 | Bin 0 -> + 36 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 34b06d994a79124963d2a7432d0ec945e72bfdbd +Author: Michiharu Ariza +Date: Fri Nov 2 16:40:20 2018 -0700 + + fixed FDSelect size calcluation + + src/hb-ot-cff-common.hh | 2 +- + src/hb-subset-cff-common.cc | 6 +++--- + test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf | Bin 2576 -> + 3892 bytes + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit 481fdfdc23f557400ad3aceeceeab07add78f005 +Merge: 1bc710a8 2840a104 +Author: Michiharu Ariza +Date: Fri Nov 2 15:28:09 2018 -0700 + + Merge branch 'cff-subset' of https://github.com/harfbuzz/harfbuzz + into cff-subset + +commit 1bc710a8c94fbe08ca3a3e535c7b6597a57883df +Author: Michiharu Ariza +Date: Fri Nov 2 15:28:01 2018 -0700 + + added CFF1 desubr api test cases & bug fixes + + src/hb-cff1-interp-cs.hh | 7 -- + src/hb-ot-cff-common.hh | 56 ++++++---- + src/hb-subset-cff-common.hh | 100 + +++++++++-------- + src/hb-subset-cff1.cc | 53 ++++----- + .../fonts/SourceHanSans-Regular.41,3041,4C2E.otf | Bin 3892 -> + 2576 bytes + .../SourceHanSans-Regular.41,4C2E.nohints.otf | Bin 0 -> 2380 bytes + ...urceHanSans-Regular.41,4C2E.nosubrs.nohints.otf | Bin 0 -> 2360 bytes + .../SourceHanSans-Regular.41,4C2E.nosubrs.otf | Bin 0 -> 2548 bytes + test/api/fonts/SourceHanSans-Regular.41,4C2E.otf | Bin 2548 -> + 2576 bytes + test/api/fonts/SourceSansPro-Regular.abc.otf | Bin 3412 -> + 1812 bytes + .../api/fonts/SourceSansPro-Regular.ac.nohints.otf | Bin 3228 -> + 1592 bytes + .../SourceSansPro-Regular.ac.nosubrs.nohints.otf | Bin 0 -> 1540 bytes + .../api/fonts/SourceSansPro-Regular.ac.nosubrs.otf | Bin 0 -> 1632 bytes + test/api/fonts/SourceSansPro-Regular.ac.otf | Bin 3332 -> + 1708 bytes + test/api/test-subset-cff1.c | 122 + +++++++++++++++++++++ + 15 files changed, 232 insertions(+), 106 deletions(-) + +commit 2c68f34bddbe506d0b22948562f2f59b9a5b6050 +Author: Khaled Hosny +Date: Fri Nov 2 23:06:00 2018 +0200 + + [os2] Capitalize table tag and struct + + Other tables follow the case of the OT tag, except this one. + + src/hb-ot-hmtx-table.hh | 6 +++--- + src/hb-ot-os2-table.hh | 12 ++++++------ + src/hb-subset.cc | 4 ++-- + 3 files changed, 11 insertions(+), 11 deletions(-) + +commit 8034d1dda091998d356e77f249d3c9f50501cc77 +Author: Behdad Esfahbod +Date: Fri Nov 2 14:47:42 2018 -0400 + + [kern] Implement Format1 + + Also, implement backwards kerning for Format1 in kern and kerx. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1350 + + src/hb-aat-layout-kerx-table.hh | 11 +++- + src/hb-ot-kern-table.hh | 127 + ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 136 insertions(+), 2 deletions(-) + +commit 46b3885c1a8ea3b85efbdd1704edcee385797c5d +Author: Behdad Esfahbod +Date: Fri Nov 2 14:43:38 2018 -0400 + + [kern] Set subtable on sanitizer + + src/hb-ot-kern-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 74c7a2c6c892446dcec574986e128967bd570e47 +Author: Behdad Esfahbod +Date: Fri Nov 2 14:26:04 2018 -0400 + + [kern] Respect more flags + + src/hb-ot-kern-table.hh | 21 +++++++++++++++------ + 1 file changed, 15 insertions(+), 6 deletions(-) + +commit 9f880bad0d7291eaab10d814567c7a680e139c48 +Author: Behdad Esfahbod +Date: Fri Nov 2 13:57:41 2018 -0400 + + [kern] Minor + + We like check_struct() more. + + src/hb-ot-kern-table.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 04b82b181d06c229a98314c1620d3ae8a2825267 +Author: Behdad Esfahbod +Date: Fri Nov 2 13:47:33 2018 -0400 + + Remove pointer cast operators from ArrayOf<> + + ArrayOf<>, unlike UnsizedArrayOf<>, has data before the array. + This was confusing. Remove. + + src/hb-open-type.hh | 3 --- + 1 file changed, 3 deletions(-) + +commit f1df441bedaf5b2c7fadf9954ea39616af87702a +Author: Behdad Esfahbod +Date: Fri Nov 2 13:26:15 2018 -0400 + + [kern] Comment + + src/hb-ot-kern-table.hh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 095f5add0b1ca39dd09842594b80fae92f0796e4 +Author: Behdad Esfahbod +Date: Fri Nov 2 13:23:54 2018 -0400 + + [kern] Push apply loop to each subtable + + src/hb-ot-kern-table.hh | 153 + ++++++++++++++++++++++++++++++++++++++---------- + src/hb-ot-layout.cc | 28 ++++++--- + src/hb-ot-layout.hh | 8 ++- + src/hb-ot-shape.cc | 2 +- + 4 files changed, 149 insertions(+), 42 deletions(-) + +commit 949dad89a81ff5b6ef92e8737962b667249a3f2b +Author: Behdad Esfahbod +Date: Fri Nov 2 12:47:55 2018 -0400 + + [kern] Remove accelerator + + It wasn't doing anything. + + src/hb-ot-face.hh | 2 +- + src/hb-ot-kern-table.hh | 55 + ++++++++++++++----------------------------------- + src/hb-ot-layout.cc | 4 ++-- + 3 files changed, 18 insertions(+), 43 deletions(-) + +commit 0382b7184addf5b3723db40a57790e5e62ac1703 +Author: Behdad Esfahbod +Date: Fri Nov 2 12:23:26 2018 -0400 + + Use as_array in more places + + src/hb-aat-layout-morx-table.hh | 4 ++-- + src/hb-ot-layout-gsubgpos.hh | 22 +++++++++++++--------- + 2 files changed, 15 insertions(+), 11 deletions(-) + +commit 91de9dfcf3bba7cbeef1e709679c8e24ab684c97 +Author: Behdad Esfahbod +Date: Fri Nov 2 12:14:21 2018 -0400 + + Fix &array_of<> + + src/hb-dsalgs.hh | 3 +++ + src/hb-open-type.hh | 4 ++-- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 9b7cb137946013592c9a5a9f0a3464fb4613577b +Author: Behdad Esfahbod +Date: Fri Nov 2 12:00:55 2018 -0400 + + Fixup + + src/hb-dsalgs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6e06fe162ed79bb47f62aae03669cd72b99014a0 +Author: Behdad Esfahbod +Date: Fri Nov 2 11:56:55 2018 -0400 + + [kern] Implement Format3 + + Untested. + + src/hb-ot-kern-table.hh | 51 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 51 insertions(+) + +commit c6ef5dbd5c40cc8934756456221e080012a82530 +Author: Behdad Esfahbod +Date: Fri Nov 2 11:51:21 2018 -0400 + + Add cast operators to hb_array_t + + src/hb-dsalgs.hh | 21 +++++++++++++-------- + 1 file changed, 13 insertions(+), 8 deletions(-) + +commit 72462eb76584a2892f1d961c90fd289240ea9380 +Author: Behdad Esfahbod +Date: Fri Nov 2 11:46:24 2018 -0400 + + Add UnsizedArrayOf::as_array() instead of hb_array() template + + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-dsalgs.hh | 2 -- + src/hb-open-file.hh | 2 +- + src/hb-open-type.hh | 11 +++-------- + src/hb-ot-color-cpal-table.hh | 6 +++--- + 5 files changed, 8 insertions(+), 15 deletions(-) + +commit 1cf075ecb674cc0c7043bffe2fef5ef187c15335 +Author: Behdad Esfahbod +Date: Fri Nov 2 11:38:00 2018 -0400 + + Add get_size to UnsizedArrayOf + + src/hb-open-type.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit a4a7a623893fd4c8db3a987d81a1c80243006f1e +Author: Behdad Esfahbod +Date: Fri Nov 2 11:16:43 2018 -0400 + + [kern] Add buffer message + + src/hb-ot-kern-table.hh | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 0b2870085ddecdde8370eebc7c2bb346b1992b93 +Author: Michiharu Ariza +Date: Thu Nov 1 22:43:17 2018 -0700 + + removed unused code + + src/hb-cff-interp-common.hh | 18 ------------------ + 1 file changed, 18 deletions(-) + +commit 6186dbf1be4da88d9c4f1ef5cea19fd7779f29ab +Author: Michiharu Ariza +Date: Thu Nov 1 17:25:23 2018 -0700 + + added hb_subset_input_set_desubroutinize API + + hooked up with CFF1 subroutinizer + a renaming + + src/hb-subset-cff-common.hh | 2 +- + src/hb-subset-cff1.cc | 4 ++-- + src/hb-subset-input.cc | 13 +++++++++++++ + src/hb-subset.h | 5 +++++ + util/hb-subset.cc | 1 + + util/options.cc | 2 +- + 6 files changed, 23 insertions(+), 4 deletions(-) + +commit b1d0c589154d080ff519c3e80aea923185787b13 +Author: Michiharu Ariza +Date: Thu Nov 1 16:33:46 2018 -0700 + + removed extraneous ;s + + src/hb-cff-interp-common.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 2840a104c1288af79cbda720afa9e37aec6fb29d +Author: Michiharu Ariza +Date: Thu Nov 1 16:18:13 2018 -0700 + + tweaks to build with new merge + + src/hb-cff2-interp-cs.hh | 11 +++++++---- + src/hb-ot-cff2-table.cc | 9 +++++---- + src/hb-ot-cff2-table.hh | 7 +++---- + src/hb-subset-cff-common.cc | 12 ++++-------- + src/hb-subset-cff-common.hh | 3 +-- + src/hb-subset-cff1.cc | 3 +-- + src/hb-subset-cff2.cc | 3 +-- + 7 files changed, 22 insertions(+), 26 deletions(-) + +commit e600e5440b3b77294df47fae947758137ea02501 +Merge: 82248b92 de96e5c8 +Author: Michiharu Ariza +Date: Thu Nov 1 16:13:56 2018 -0700 + + Merge branch 'master' into cff-subset + +commit de96e5c81c7f473520df93052ecea162baa5a350 +Author: Behdad Esfahbod +Date: Thu Nov 1 18:13:58 2018 -0400 + + [Crap] Avoid operator= + + src/hb-null.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f9353bd68c112dea8962dd586bf5e664f75a2a07 +Author: Behdad Esfahbod +Date: Thu Nov 1 18:05:22 2018 -0400 + + [aat] Rely on vector auto initialization + + src/hb-aat-map.hh | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +commit 5a18d97b35d05c826c242e6847764c2418831a55 +Author: Behdad Esfahbod +Date: Thu Nov 1 18:01:26 2018 -0400 + + [aat] Remove unused forward declaration + + src/hb-aat-map.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 82248b9287e7b208c304e761393b745604a51c6e +Author: Michiharu Ariza +Date: Thu Nov 1 10:36:50 2018 -0700 + + fix leak attempt ^2 + + src/hb-subset-cff2.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a9c305c2b00b7e793dc3d8333eee43d677aebd42 +Author: Michiharu Ariza +Date: Thu Nov 1 10:31:21 2018 -0700 + + fix leaks + + src/hb-subset-cff1.cc | 4 ++-- + src/hb-subset-cff2.cc | 3 +-- + 2 files changed, 3 insertions(+), 4 deletions(-) + +commit 049ce078e51bebce50b17889f3edae3db3ea39f5 +Author: Michiharu Ariza +Date: Thu Nov 1 08:46:21 2018 -0700 + + fix bogus width with --no-hinting + + src/hb-cff1-interp-cs.hh | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 07ec792212063851ee41eae33792d3d90d31e6a1 +Author: Behdad Esfahbod +Date: Thu Nov 1 10:31:12 2018 -0400 + + Warning fix + + src/test-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c32280b30fb3844addda31a0d97ae7cb55ef07d2 +Author: Ebrahim Byagowi +Date: Thu Nov 1 15:31:14 2018 +0330 + + [ot-layout] minor + + src/hb-ot-layout.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit cad90be4ea56a85ddc084f86f36dd7129850f6d7 +Author: Ebrahim Byagowi +Date: Thu Nov 1 13:39:06 2018 +0330 + + [test] minor + + test/api/test-ot-color.c | 2 -- + 1 file changed, 2 deletions(-) + +commit d56e338a903a5a7c4f8ccd0f4d983cd492243ed6 +Author: Michiharu Ariza +Date: Wed Oct 31 22:30:34 2018 -0700 + + CFF1 no-desubroutinize + no-hinting + + no-desubroutinize option is disabled for now + code cleanup (esp. CFF1 width handling) + bug fixes & renaming + + src/hb-cff-interp-common.hh | 49 +++ + src/hb-cff-interp-cs-common.hh | 93 +++++- + src/hb-cff-interp-dict-common.hh | 45 +-- + src/hb-cff1-interp-cs.hh | 66 +++- + src/hb-cff2-interp-cs.hh | 1 + + src/hb-ot-cff-common.hh | 85 ++--- + src/hb-ot-cff1-table.hh | 20 +- + src/hb-ot-cff2-table.hh | 25 +- + src/hb-subset-cff-common.hh | 702 + ++++++++++++++++++++++++++++++++++++--- + src/hb-subset-cff1.cc | 242 +++++++++++--- + src/hb-subset-cff2.cc | 45 +-- + src/hb-subset-input.hh | 1 + + src/hb-subset-plan.cc | 1 + + src/hb-subset-plan.hh | 1 + + util/options.cc | 2 + + util/options.hh | 2 + + 16 files changed, 1130 insertions(+), 250 deletions(-) + +commit 52a00cd87f63c8ab32413a1a9ce792a3e2ec84e2 +Author: Behdad Esfahbod +Date: Wed Oct 31 19:05:53 2018 -0700 + + [aat] Implement 'aalt' mapping + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1160 + + src/hb-aat-map.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 6e3ea269fa1fe0a3de7a8a13c6e853c91231808e +Author: Behdad Esfahbod +Date: Wed Oct 31 19:00:11 2018 -0700 + + [aat] Add 'afrc' feature mapping + + https://github.com/harfbuzz/harfbuzz/issues/1342#issuecomment-434829028 + + src/hb-aat-layout.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 40b19fd46951e2f9b402e59e1fbbf06fde7ecd61 +Author: Behdad Esfahbod +Date: Wed Oct 31 18:51:45 2018 -0700 + + [aat] Fallback to old style "Letter Case" small caps + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1342 + + src/hb-aat-layout-morx-table.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit f9289319481a1e9762ad366b287e781c44ba9fc6 +Author: Behdad Esfahbod +Date: Wed Oct 31 18:25:05 2018 -0700 + + [test] Minor + + test/shaping/run-tests.py | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit cf203af8a33591c163b63dbdf0fd341bc4606190 +Author: Behdad Esfahbod +Date: Wed Oct 31 18:21:48 2018 -0700 + + Implement space fallback in vertical direction + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1343 + + src/hb-ot-shape-fallback.cc | 36 + +++++++++++++++++++-------- + test/shaping/data/in-house/tests/spaces.tests | 17 +++++++++++++ + 2 files changed, 42 insertions(+), 11 deletions(-) + +commit e01250230b1ad85e49cc0021365d1ee43feb9855 +Author: Behdad Esfahbod +Date: Wed Oct 31 18:14:00 2018 -0700 + + [hmtx/vmtx] Fix a crasher + + src/hb-ot-hmtx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 36e90ef56e6c0643ef61e947d7361c6fa4eadf10 +Author: Behdad Esfahbod +Date: Wed Oct 31 15:09:09 2018 -0700 + + [mort] Massage some more + + src/hb-aat-layout-common.hh | 28 ++++++++++++++++++++++++++++ + src/hb-aat-layout-morx-table.hh | 21 +++++---------------- + 2 files changed, 33 insertions(+), 16 deletions(-) + +commit cbaff4ef1910e2872bfff61f3d5427c076b3673d +Author: Behdad Esfahbod +Date: Wed Oct 31 15:06:12 2018 -0700 + + [mort] Some more + + src/hb-aat-layout-morx-table.hh | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +commit 3087046d3144afb50bcc13e4afa2d20d9f71f2c8 +Author: Behdad Esfahbod +Date: Wed Oct 31 14:59:14 2018 -0700 + + [mort] Refactor offset-to-index mapping + + src/hb-aat-layout-morx-table.hh | 27 ++++++++++++++++----------- + 1 file changed, 16 insertions(+), 11 deletions(-) + +commit b9db610add702da0a257db2eb21f3a7fb56682f7 +Author: Behdad Esfahbod +Date: Wed Oct 31 14:22:31 2018 -0700 + + Minor + + src/hb-font.cc | 28 ++++++++++++++-------------- + src/hb-font.h | 2 +- + 2 files changed, 15 insertions(+), 15 deletions(-) + +commit 995bf6c6f82d6b2dabcb81e1426910ee82b91b44 +Author: Behdad Esfahbod +Date: Wed Oct 31 13:21:33 2018 -0700 + + [sbix] Rely on blob->as<> checking size against Type::min_size + + src/hb-ot-color-sbix-table.hh | 6 ------ + 1 file changed, 6 deletions(-) + +commit 4d4e526b5cc703111eb445b7e319a4cd1917489f +Author: Behdad Esfahbod +Date: Wed Oct 31 13:19:42 2018 -0700 + + Improve blob->as<> + + It's true that blob->as<> should only be called on null or sanitized + data. But this change is safe, so keep it. + + src/hb-blob.hh | 2 +- + src/hb-ot-glyf-table.hh | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 5854d3fa251069f8158b97a831d1439c2ff8b510 +Author: Behdad Esfahbod +Date: Wed Oct 31 10:42:49 2018 -0700 + + [set] Warning fix with gcc 8.1 + + https://github.com/harfbuzz/harfbuzz/pull/1334 + + src/hb-dsalgs.hh | 6 ++++-- + src/hb-set.hh | 4 ++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit 850a7af3a419c6c4ab92bff59991758a2951d41f +Author: Ebrahim Byagowi +Date: Wed Oct 31 14:20:23 2018 +0330 + + [ot-color-test] Remove the non-working exact strike size storing + (#1339) + + src/test-ot-color.cc | 135 + +++++++++++++++++++++++---------------------------- + 1 file changed, 62 insertions(+), 73 deletions(-) + +commit 2e639c47c9d35ff7dc4dde21f744f9ee695a27f3 +Author: Ebrahim Byagowi +Date: Wed Oct 31 14:20:14 2018 +0330 + + [aat] Fix older compilers by not referencing enum directly (#1340) + + src/hb-aat-layout-morx-table.hh | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 642c9dcf1b34b51ffdbf88ccbef4762aa12a5cbe +Author: Ebrahim Byagowi +Date: Wed Oct 31 14:02:37 2018 +0330 + + [aat] Minor, remove extra semicolons + + src/hb-aat-layout-morx-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit c962d5e714a6f88c4cb20bed219177b1bc4a2dfd +Author: Behdad Esfahbod +Date: Wed Oct 31 01:16:33 2018 -0700 + + [mort] Make ligatures work + + ./hb-shape Apple_Chancery_10_12.ttf "Th th ll te to tr fr fu fj" + [T_h=0+2308|space=2+569|t_h=3+1687|space=5+569|l_l=6+1108|space=8+569|t_e=9+1408|space=11+569|t_o=12+1531|space=14+569|t_r=15+1385|space=17+569|f_r=18+1432|space=20+569|f_u=21+1733|space=23+569|f_j=24+1098] + + Part of https://github.com/harfbuzz/harfbuzz/issues/1331 + + src/hb-aat-layout-morx-table.hh | 25 +++++++++++++++++-------- + 1 file changed, 17 insertions(+), 8 deletions(-) + +commit c07798960004439fcd8fa0f4ae33e225428d1065 +Author: Behdad Esfahbod +Date: Wed Oct 31 00:36:03 2018 -0700 + + [mort] More Ligature work + + src/hb-aat-layout-morx-table.hh | 54 + ++++++++++++++++++++++++++++++----------- + 1 file changed, 40 insertions(+), 14 deletions(-) + +commit 431c6e496be56e441ee4b9b705f40a1246bdd0d6 +Author: Behdad Esfahbod +Date: Wed Oct 31 00:15:00 2018 -0700 + + [mort] Some Ligature work + + src/hb-aat-layout-morx-table.hh | 38 + +++++++++++++++++++++++++++++++------- + 1 file changed, 31 insertions(+), 7 deletions(-) + +commit 28b68cffe4e5ebf82217ebf439f428431d672af3 +Author: Behdad Esfahbod +Date: Tue Oct 30 23:33:30 2018 -0700 + + [mort] Implement / adjust Contextual substitution + + src/hb-aat-layout-morx-table.hh | 70 + ++++++++++++++++++++++++++++++----------- + src/hb-open-type.hh | 7 +++++ + 2 files changed, 59 insertions(+), 18 deletions(-) + +commit 11dbf0f12926b80d0c308c70a218342280045c23 +Author: Behdad Esfahbod +Date: Tue Oct 30 21:49:59 2018 -0700 + + [mort] More fixes] + + src/hb-aat-layout-common.hh | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit e1552af95b6c17571f7ee58ebac92f48d93c8f98 +Author: Behdad Esfahbod +Date: Tue Oct 30 21:09:05 2018 -0700 + + [maxp] Minor + + src/hb-ot-maxp-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0cf282a32e5b0fe1fec454ff293ffe04b33f1112 +Author: Behdad Esfahbod +Date: Tue Oct 30 20:51:44 2018 -0700 + + [mort] Grind some more + + src/hb-aat-layout-common.hh | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +commit 90667b31bc3e61e68e27966e4781aba456c6b93b +Author: Behdad Esfahbod +Date: Tue Oct 30 20:15:28 2018 -0700 + + [mort] Hook up more + + src/hb-aat-layout.cc | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +commit 9346b1f158dfd7d25ed0057b40aaa6980a85ea17 +Author: Behdad Esfahbod +Date: Tue Oct 30 20:04:13 2018 -0700 + + [morx] Remove stale comment + + src/hb-aat-layout-morx-table.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit f864ef215e1354a1e5a3c8796afafba761404e08 +Author: Behdad Esfahbod +Date: Tue Oct 30 19:42:21 2018 -0700 + + [mort] More massaging towards mort + + src/hb-aat-layout-morx-table.hh | 53 + +++++++++++++++++++++-------------------- + 1 file changed, 27 insertions(+), 26 deletions(-) + +commit 2d9467340b1498ccc0cd47bf915b84ab12dfa025 +Author: Behdad Esfahbod +Date: Tue Oct 30 19:33:31 2018 -0700 + + [mort] Fix version check in sanitize + + src/hb-aat-layout-morx-table.hh | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit c2527a1bc2b493473f06ea6ae79f0a87b722c4d3 +Author: Behdad Esfahbod +Date: Tue Oct 30 19:26:16 2018 -0700 + + [mort] Make it compile / hook it up + + Untested. + + src/hb-aat-layout-common.hh | 11 +++++----- + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-aat-layout.cc | 47 + ++++++++++++++++++++++++++--------------- + 3 files changed, 36 insertions(+), 24 deletions(-) + +commit 933babdc075c27fbcc1b726c3c9b2aa67338c6ad +Author: Behdad Esfahbod +Date: Tue Oct 30 19:22:43 2018 -0700 + + [mort] Fixup on previous commit + + src/hb-aat-layout-morx-table.hh | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +commit b053cabacd99ff69144a1459fe02ffd574c2416c +Author: Ebrahim Byagowi +Date: Tue Oct 30 18:41:34 2018 +0330 + + [mort] Bring back mort generalizations + + Started by reverting + https://github.com/harfbuzz/harfbuzz/commit/1f1c85a5 + + Just a starting point, if we agree even mort can come back. + + src/hb-aat-layout-common.hh | 76 +++++++++++++++++++---- + src/hb-aat-layout-kerx-table.hh | 17 ++--- + src/hb-aat-layout-morx-table.hh | 133 + ++++++++++++++++++++++++---------------- + src/hb-aat-layout.cc | 16 ++++- + src/hb-ot-face.hh | 1 + + 5 files changed, 171 insertions(+), 72 deletions(-) + +commit 5cd544a621f10b307bb97aea27ea54e55aacb2e9 +Author: Behdad Esfahbod +Date: Tue Oct 30 19:16:00 2018 -0700 + + Fix build + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1338 + + src/test-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 69297bb21640677532b7030332f803c0768c6579 +Author: Behdad Esfahbod +Date: Tue Oct 30 19:06:21 2018 -0700 + + [fuzzing] Call hb-ot-color API + + test/fuzzing/hb-shape-fuzzer.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1019391046cf01524c4ef20c9256a47b7411610b +Author: Behdad Esfahbod +Date: Tue Oct 30 15:52:26 2018 -0700 + + 2.1.0 + + NEWS | 81 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + RELEASING.md | 3 +- + configure.ac | 2 +- + docs/harfbuzz-docs.xml | 1 + + src/hb-ot-color.cc | 22 +++++++++----- + src/hb-ot-color.h | 4 +-- + src/hb-version.h | 6 ++-- + 7 files changed, 105 insertions(+), 14 deletions(-) + +commit bfd549daaa078e7edba5a65971b1d3e872664f2d +Author: Behdad Esfahbod +Date: Tue Oct 30 14:47:27 2018 -0700 + + Fix everything-bot + + src/hb-ot-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0e1ad5a075c6858ca60bad0e2da58b5256e15815 +Author: Garret Rieger +Date: Tue Oct 30 11:29:58 2018 -0700 + + [subset] Limit the number of scripts and langsys' that should be + checked when collecting features. + + src/hb-ot-layout-common.hh | 8 ++++++++ + src/hb-ot-layout.cc | 11 ++++++++++- + 2 files changed, 18 insertions(+), 1 deletion(-) + +commit a7aba99baab2d6e6105675ceedbe22222fa0f166 +Author: Behdad Esfahbod +Date: Tue Oct 30 14:04:09 2018 -0700 + + [name] Rename hb_name_id_t to hb_ot_name_id_t + + https://github.com/harfbuzz/harfbuzz/pull/1254 + + docs/harfbuzz-sections.txt | 3 +- + src/hb-ot-color-cpal-table.hh | 12 +++--- + src/hb-ot-color.cc | 6 +-- + src/hb-ot-color.h | 4 +- + src/hb-ot-layout.cc | 44 +++++++++---------- + src/hb-ot-layout.h | 28 ++++++------- + src/hb-ot-name-table.hh | 6 +-- + src/hb-ot-name.cc | 38 ++++++++--------- + src/hb-ot-name.h | 98 + +++++++++++++++++++++---------------------- + test/api/test-ot-color.c | 30 ++++++------- + test/api/test-ot-name.c | 8 ++-- + 11 files changed, 139 insertions(+), 138 deletions(-) + +commit 881e1054bc66fd07489d661dd5c3f84a5d077edc +Author: Simon Tooke +Date: Tue Oct 30 14:16:23 2018 -0400 + + fix various GCC function pointer warnings + + src/hb-debug.hh | 6 +++--- + src/hb-set.hh | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit dc9bd29feac6675c79343b88a06f03f356f9175b +Author: Behdad Esfahbod +Date: Tue Oct 30 13:16:07 2018 -0700 + + [CBDT] Implement Format18 get_extens + + Part of https://github.com/harfbuzz/harfbuzz/issues/1327 + + src/hb-ot-color-cbdt-table.hh | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit a2a7422aaf47dd43c2c55ad48dd15513f9d5b081 +Author: Behdad Esfahbod +Date: Tue Oct 30 13:14:56 2018 -0700 + + [CBDT] Bound checks in reference_png + + src/hb-ot-color-cbdt-table.hh | 57 + ++++++++++++++++++++++++++----------------- + 1 file changed, 34 insertions(+), 23 deletions(-) + +commit f236f790884d7b5c7afb73768724c360d4ea5212 +Author: Nathan Willis +Date: Tue Oct 30 11:24:56 2018 -0500 + + Docs Makefile: sync SGML list to harfbuzz-docs.xml include + list. Hopefully fixes distcheck failure. + + docs/Makefile.am | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 9f4b375e396fe65b30c792b9524a732da0b477d1 +Author: Nathan Willis +Date: Mon Oct 29 17:10:53 2018 -0500 + + Usermanual: minor wording updates, build fixes. + + ...rmanual-buffers-language-script-and-direction.xml | 8 +++++++- + docs/usermanual-clusters.xml | 6 ++++++ + docs/usermanual-fonts-and-faces.xml | 8 +++++++- + docs/usermanual-getting-started.xml | 6 ++++++ + docs/usermanual-glyph-information.xml | 8 +++++++- + docs/usermanual-install-harfbuzz.xml | 20 + +++++++++++++++++--- + docs/usermanual-opentype-features.xml | 8 +++++++- + docs/usermanual-shaping-concepts.xml | 6 ++++++ + docs/usermanual-what-is-harfbuzz.xml | 12 +++++++----- + 9 files changed, 70 insertions(+), 12 deletions(-) + +commit e110032b914db9f417cc152b2beb51cda0a91dd7 +Author: Nathan Willis +Date: Mon Oct 29 16:42:59 2018 -0500 + + Usermanual: update DTD in chapter XML to avoid HTML entity parsing + errors. + + docs/usermanual-what-is-harfbuzz.xml | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 01400f7425f7aec852f39ebee17aa502a74025fb +Author: Nathan Willis +Date: Sat Oct 20 17:21:49 2018 +0100 + + Usermanual; minor wording changes. + + docs/usermanual-getting-started.xml | 14 +++++++------- + docs/usermanual-install-harfbuzz.xml | 10 +++++++++- + docs/usermanual-what-is-harfbuzz.xml | 31 ++++++++++--------------------- + 3 files changed, 26 insertions(+), 29 deletions(-) + +commit e89f43dc0884cb4a73beff86e49b7bd8565a01f1 +Author: Khaled Hosny +Date: Sat Oct 20 16:12:45 2018 +0100 + + Minor; rewording unsafe-to-break note. + + Co-Authored-By: n8willis + + docs/usermanual-getting-started.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ccdfb634382596a6114380c72f2f344b1af23f94 +Author: Khaled Hosny +Date: Sat Oct 20 15:46:04 2018 +0100 + + Trivial; typo. + + Co-Authored-By: n8willis + + docs/usermanual-what-is-harfbuzz.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 722099487be72346e7109872b6abf30696f3b7c3 +Author: Khaled Hosny +Date: Sat Oct 20 15:45:24 2018 +0100 + + Minor; simplify example code + + Co-Authored-By: n8willis + + docs/usermanual-getting-started.xml | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 6e4dd58a4af003eeec93cbe90d1258d91a38b53c +Author: Khaled Hosny +Date: Sat Oct 20 15:44:51 2018 +0100 + + Minor: simplify example code + + Co-Authored-By: n8willis + + docs/usermanual-getting-started.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f9ee0deceebd8952a8d80f3fd7b264b33e70f703 +Author: Khaled Hosny +Date: Sat Oct 20 15:41:00 2018 +0100 + + Minor; drop 'OpenType' from sentence + + Co-Authored-By: n8willis + + docs/usermanual-what-is-harfbuzz.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f028da59d902c39e61021b48fc73f2821a9f3be2 +Author: Nathan Willis +Date: Sat Oct 20 15:18:29 2018 +0100 + + Minor. + + docs/harfbuzz-docs.xml | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit ed5547f828fe7559cc3331f05780ae9f041b1e0f +Author: Khaled Hosny +Date: Sat Oct 20 15:00:52 2018 +0100 + + Use 'glyphs' instead of 'text' + + Co-Authored-By: n8willis + + docs/harfbuzz-docs.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 236285545b5da8513f2b61fc8066ba78308a555a +Author: Nathan Willis +Date: Wed Oct 17 10:10:48 2018 -0500 + + Docs: minor, update Makefile w new file name. + + docs/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 163ab81ab0f4000d968cc55b418402497e605e6c +Author: Nathan Willis +Date: Tue Oct 16 17:48:15 2018 -0500 + + Docs: rename Hello HarfBuzz to Getting Started. + + docs/harfbuzz-docs.xml | + 2 +- + docs/{usermanual-hello-harfbuzz.xml => usermanual-getting-started.xml} + | 0 + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 9e7efa3f47557a77852a15d89619787fd9933ed1 +Author: Nathan Willis +Date: Tue Oct 16 17:46:03 2018 -0500 + + Docs: usermanual, add API Overview to Hello HarfBuzz chapter. Start + Terminology section. + + docs/usermanual-hello-harfbuzz.xml | 309 + +++++++++++++++++++++++++------------ + 1 file changed, 212 insertions(+), 97 deletions(-) + +commit 3a27e8fb97f716c17b03e3a4a634a4900bcb6045 +Author: Nathan Willis +Date: Fri Oct 12 18:23:26 2018 -0500 + + Docs: usermanual, add Shaping Concepts chapter. + + docs/harfbuzz-docs.xml | 5 +- + docs/usermanual-shaping-concepts.xml | 368 + +++++++++++++++++++++++++++++++++++ + 2 files changed, 371 insertions(+), 2 deletions(-) + +commit 9aa865dcc68ec207741e07ba3f7aacf4ac750c1c +Author: Nathan Willis +Date: Fri Oct 12 18:22:41 2018 -0500 + + Docs: usermanual, minor cleanup to What Is HarfBuzz chapter. + + docs/usermanual-what-is-harfbuzz.xml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 443f87213272be5ae0579dce4749b2036dfe3815 +Author: Nathan Willis +Date: Thu Oct 11 15:40:08 2018 -0500 + + Docs: move harfbuzz-ng-vs-old discussion down below the TOC; put + in note. + + docs/harfbuzz-docs.xml | 63 + ++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 43 insertions(+), 20 deletions(-) + +commit 792af5d254fddcdc4292dffb76b81d65754e65a9 +Author: Nathan Willis +Date: Thu Oct 11 14:05:59 2018 -0500 + + Docs: flesh out config options in Usermanual:Install chapter. + + docs/usermanual-install-harfbuzz.xml | 108 + +++++++++++++++++++++++++++-------- + 1 file changed, 85 insertions(+), 23 deletions(-) + +commit 325e2745cfa55f9ef114ee8eeaf7bd8176743822 +Author: Nathan Willis +Date: Wed Oct 10 17:01:21 2018 -0500 + + Docs: add basic config-options section to Usermanual Installation + chapter. + + docs/usermanual-install-harfbuzz.xml | 132 + ++++++++++++++++++++++++++++++++++- + 1 file changed, 131 insertions(+), 1 deletion(-) + +commit 97c1c46cd2241d77b531a582dd1a2432af976357 +Author: Nathan Willis +Date: Wed Oct 10 16:38:22 2018 -0500 + + Docs: update and linearize build instructions; add installation + overview material. + + docs/usermanual-install-harfbuzz.xml | 229 + ++++++++++++++++++++++++++++------- + 1 file changed, 188 insertions(+), 41 deletions(-) + +commit 088755f9e654d2ec638dce0c68d523084b9eaf5a +Author: Nathan Willis +Date: Wed Oct 10 16:37:29 2018 -0500 + + Docs: update usermanual What Is HarfBuzz material. + + docs/usermanual-what-is-harfbuzz.xml | 220 + +++++++++++++++++++++++++++-------- + 1 file changed, 172 insertions(+), 48 deletions(-) + +commit 0956ab41851d30f50c39c28730cf30ea0bbc5466 +Author: Nathan Willis +Date: Fri Sep 28 17:15:59 2018 -0500 + + Docs: Move What-HarfBuzz-doesnt-do to Usermanual-what-is-HarfBuzz. + + docs/usermanual-hello-harfbuzz.xml | 98 + +++------------------------------ + docs/usermanual-what-is-harfbuzz.xml | 101 + +++++++++++++++++++++++++++++++++-- + 2 files changed, 104 insertions(+), 95 deletions(-) + +commit fd270beedb331c4685e918f5a3ef5789a23ffaeb +Author: Nathan Willis +Date: Fri Sep 28 16:36:38 2018 -0500 + + Docs: Usermanual- What is HarfBuzz; add intro to shaping concepts. + + docs/usermanual-what-is-harfbuzz.xml | 51 + ++++++++++++++++++++++++++++++++++++ + 1 file changed, 51 insertions(+) + +commit d9fd92721002726c4aeaae9cc3a519a41f694e48 +Author: Nathan Willis +Date: Fri Sep 28 16:07:37 2018 -0500 + + Docs: update Usermanual-What Is HarfBuzz. + + docs/usermanual-what-is-harfbuzz.xml | 199 + +++++++++++++++++++++++------------ + 1 file changed, 130 insertions(+), 69 deletions(-) + +commit 0af3d176a64c0a57c7acb2a64ce8b9d08f449241 +Author: Khaled Hosny +Date: Tue Oct 30 17:05:28 2018 +0200 + + [sbix] Fix memory leak in early return + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11210 + + src/hb-ot-color-sbix-table.hh | 3 +++ + ...zz-testcase-minimized-hb-shape-fuzzer-5768601332613120 | Bin 0 -> + 108 bytes + 2 files changed, 3 insertions(+) + +commit edaa768253cfeb97d614537253f90d47aa93ff6f +Author: Behdad Esfahbod +Date: Tue Oct 30 01:35:58 2018 -0700 + + [util] Use fgets instead of getline such that windows passes + + util/hb-shape.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 56738429d667f6c35e5c7af30b51604fc133c23c +Author: Behdad Esfahbod +Date: Tue Oct 30 01:33:22 2018 -0700 + + [test] Fix warnings + + test/api/test-ot-tag.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 138f9e0f25752bbf7f8e867f230ca91442f40028 +Author: Behdad Esfahbod +Date: Tue Oct 30 01:31:13 2018 -0700 + + Minor + + src/hb-machinery.hh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 83a612739accf6b0f2e1cb1be15097402f7ecf33 +Author: Behdad Esfahbod +Date: Tue Oct 30 01:24:23 2018 -0700 + + [util] Minor + + util/options.cc | 6 ------ + util/options.hh | 8 ++------ + 2 files changed, 2 insertions(+), 12 deletions(-) + +commit 64e41d2c89c533f554e49ffbd18e6653a70ab999 +Author: Behdad Esfahbod +Date: Tue Oct 30 01:08:34 2018 -0700 + + [test] Fix Python3 + + test/shaping/run-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f7a08cd41df1ff3e44aa838306218ae0565b7273 +Author: Ebrahim Byagowi +Date: Tue Oct 30 11:29:09 2018 +0330 + + Fix extra semicolon issues and test that on CI (#1330) + + .circleci/config.yml | 2 +- + src/hb-machinery.hh | 16 ++++++++-------- + src/hb-ot-layout-common.hh | 6 +++--- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb.hh | 2 +- + util/options.hh | 2 +- + 6 files changed, 15 insertions(+), 15 deletions(-) + +commit 422debb830fe150c26e1628f77531f41f0871325 +Author: Behdad Esfahbod +Date: Tue Oct 30 00:51:43 2018 -0700 + + [test/shaping] Spawn one hb-shape per test file + + Speeds up runnings in-house tests from over 20s to 2s. + + test/shaping/run-tests.py | 32 ++++++++++++-------------------- + 1 file changed, 12 insertions(+), 20 deletions(-) + +commit 58e20f53bf61244e3eef09be8ebed60aaf52fb11 +Author: Behdad Esfahbod +Date: Tue Oct 30 00:50:18 2018 -0700 + + [util] Add hb-shape --batch + + util/hb-shape.cc | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +commit 6131fb6283cff87333db14b9b32e92be6139c3d6 +Author: Behdad Esfahbod +Date: Tue Oct 30 00:38:01 2018 -0700 + + [util] Don't close stdin/stdout + + util/options.cc | 6 ++++++ + util/options.hh | 8 ++++++-- + 2 files changed, 12 insertions(+), 2 deletions(-) + +commit 7e998d193a1429b42bb69582f9e5738aa6fd1a72 +Author: Behdad Esfahbod +Date: Mon Oct 29 23:31:42 2018 -0700 + + Fix spurious warning re uninitialized use + + src/hb-ot-layout-common.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 1b7bfb5e1864fc355715b536faac6693b5ce0218 +Author: Ebrahim Byagowi +Date: Tue Oct 30 10:19:40 2018 +0330 + + [cmake] Make build of tests and subset optional (#1329) + + .circleci/config.yml | 2 +- + CMakeLists.txt | 19 ++++++------------- + 2 files changed, 7 insertions(+), 14 deletions(-) + +commit b186274362725b7501211c2a782c1a0badd57107 +Author: Behdad Esfahbod +Date: Mon Oct 29 23:21:14 2018 -0700 + + [set/map] Fix uninitialized memory + + I keep forgetting that primitive types are NOT initialized during + construction. :| + + src/hb-map.hh | 4 ++-- + src/hb-object.hh | 1 + + src/hb-set.hh | 4 ++-- + 3 files changed, 5 insertions(+), 4 deletions(-) + +commit ad3cededdd5ee6a364161e9d27e4cf4d95a80177 +Author: Behdad Esfahbod +Date: Mon Oct 29 22:53:16 2018 -0700 + + [fuzzing] Make test runners less verbose + + test/fuzzing/run-shape-fuzzer-tests.py | 3 ++- + test/fuzzing/run-subset-fuzzer-tests.py | 1 - + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 4ef671f25f38895e3f87cd69687670c3d8ea4600 +Author: Behdad Esfahbod +Date: Mon Oct 29 22:46:19 2018 -0700 + + [unicode] Fix a long-standing double-declaration warning + + src/hb-unicode.cc | 31 +++++++------------------------ + 1 file changed, 7 insertions(+), 24 deletions(-) + +commit 166ae8b0aa3b1e7298a1bbb872647cb352a0f924 +Author: Behdad Esfahbod +Date: Mon Oct 29 22:40:37 2018 -0700 + + Remove now unused hb_auto_t<> + + src/hb-dsalgs.hh | 20 -------------------- + 1 file changed, 20 deletions(-) + +commit 56e0fd345c4e68753123a05cd80291e933d71061 +Author: Behdad Esfahbod +Date: Mon Oct 29 22:35:44 2018 -0700 + + Remove last use of hb_auto_t<> + + src/hb-ot-cmap-table.hh | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit ca5e5a4979fa4aca873ba986e60b3010aaf0b1de +Author: Behdad Esfahbod +Date: Mon Oct 29 22:30:21 2018 -0700 + + Port Coverage::Iter off hb_auto_t<> + + src/hb-ot-layout-common.hh | 4 +--- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 26 +++++++++++++------------- + src/hb-ot-layout-gsubgpos.hh | 8 ++++---- + 4 files changed, 19 insertions(+), 21 deletions(-) + +commit 3a4e5dd425a2a37ff4c37db953943386c0b6e5d8 +Author: Behdad Esfahbod +Date: Mon Oct 29 18:05:25 2018 -0700 + + Remove a few unnecessary hb_auto_t<>'s + + See a85641446c30247c4e948263f0f8c1147ed4efb9 + + src/hb-coretext.cc | 8 ++++---- + src/hb-ot-cmap-table.hh | 6 ++---- + src/hb-ot-layout-gsub-table.hh | 8 ++++---- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-layout.cc | 10 +++++----- + src/hb-subset-plan.cc | 2 +- + src/hb-subset.cc | 2 +- + src/hb-uniscribe.cc | 12 ++++++------ + 8 files changed, 24 insertions(+), 26 deletions(-) + +commit 67a22f377dee0dbd89f301f0a1fec6f787867b5e +Author: Behdad Esfahbod +Date: Mon Oct 29 17:37:41 2018 -0700 + + [set/map/vector] Make constructable, but not copy or assignable + + Disable copy/assign on them, as they shouldn't. + + Make constructor / destructor call init_shallow/fini_shallow, + and make those idempotent. So, these three can be constructed + on stack now and no init/fini call is needed. As such, + hb_auto_t<> is not needed anymore. I'll remove that separately. + + src/hb-map.hh | 6 ++++++ + src/hb-set.hh | 5 +++++ + src/hb-vector.hh | 37 ++++++++++++++++++++----------------- + src/hb.hh | 12 ++++++++++++ + 4 files changed, 43 insertions(+), 17 deletions(-) + +commit ea0e51d1b161245aaf5ad0f844bb5316b1cbcd5e +Author: Behdad Esfahbod +Date: Mon Oct 29 16:00:23 2018 -0700 + + Add HB_NO_CREATE_COPY_ASSIGN + + src/hb-open-type.hh | 10 +++++----- + src/hb.hh | 15 +++++++++------ + 2 files changed, 14 insertions(+), 11 deletions(-) + +commit 5b563640b2df5b100130c9901b666713b2e1767e +Author: Behdad Esfahbod +Date: Mon Oct 29 15:58:44 2018 -0700 + + Remove HB_DISALLOW_COPY_AND_ASSIGN from hb_ot_shape_planner_t + + It was arbitrary that this struct had it and not dozens of others. + + src/hb-ot-shape.hh | 3 --- + 1 file changed, 3 deletions(-) + +commit 14b353c1852be64db244f84bf5e95b4b7f3e65b6 +Author: Behdad Esfahbod +Date: Mon Oct 29 15:29:13 2018 -0700 + + One more iteration + + src/hb.hh | 1 - + 1 file changed, 1 deletion(-) + +commit c7c5df9ffd4f7bcc84a9a02a565ccc1807cca529 +Author: Behdad Esfahbod +Date: Mon Oct 29 15:16:52 2018 -0700 + + Try fixing older bots + + Older C++ doesn't allow struct-with-constructor in union. + + src/hb.hh | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +commit be87959a67b8ccf2b21d3cfdb7d16202f18df670 +Author: Behdad Esfahbod +Date: Mon Oct 29 15:16:38 2018 -0700 + + [cmap] Minor + + src/hb-ot-cmap-table.hh | 16 ++-------------- + 1 file changed, 2 insertions(+), 14 deletions(-) + +commit 35d410f2bad62e98f3634c5ee156d0aea9031067 +Author: Behdad Esfahbod +Date: Mon Oct 29 14:45:44 2018 -0700 + + Remove ASSERT_POD + + Newer compilers / language allows structs with constructor in union. + So, this was not actually testing anything. Indeed, the recent + change in DISALLOW_COPY *is* making some of our types non-POD. + That broke some bots. + + Just remove this since it wasn't doing much, and I'd rather have + DISALLOW_COPY. + + src/hb-blob.hh | 1 - + src/hb-buffer.hh | 1 - + src/hb-face.hh | 1 - + src/hb-font.hh | 2 -- + src/hb-machinery.hh | 5 +---- + src/hb-object.hh | 6 +----- + src/hb-ot-shape-complex-arabic-fallback.hh | 2 -- + src/hb-ot-shape-complex-arabic.cc | 2 -- + src/hb-ot-shape-complex-hangul.cc | 2 -- + src/hb-ot-shape-complex-indic.cc | 2 -- + src/hb-ot-shape-complex-khmer.cc | 2 -- + src/hb-ot-shape-complex-use.cc | 2 -- + src/hb-set-digest.hh | 4 ---- + src/hb-shape-plan.hh | 1 - + src/hb-subset-input.hh | 1 - + src/hb-subset-plan.hh | 1 - + src/hb-unicode.hh | 1 - + src/hb.hh | 26 + -------------------------- + 18 files changed, 2 insertions(+), 60 deletions(-) + +commit 6f0454e176efdb8b99c8aa59b5ad765ca455b8d6 +Author: Behdad Esfahbod +Date: Mon Oct 29 13:51:15 2018 -0700 + + Fix extra-semicolon warnings + + src/hb-machinery.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a256a92b3fbb72487cf073a63e646eab952b42ed +Author: Behdad Esfahbod +Date: Mon Oct 29 11:25:35 2018 -0700 + + Make Array types uncopyable-unassignable + + Finally! Catches hard-to-find errors like this: + + - const SortedArrayOf docs = + this+svgDocEntries; + + const SortedArrayOf &docs = + this+svgDocEntries; + + We implement this for our array types. This, in turn, trickles down + into all types that embed the arrays. So, as long as we define all + open-ended structs in terms of Array types (all can be done using + UnsizedArrayOf), this achieves the goal of making uncopyable all + structs that are variable-sized. Yay! + + src/hb-open-type.hh | 11 +++++++++++ + src/hb.hh | 6 ++++++ + 2 files changed, 17 insertions(+) + +commit 31cc1f74b7028ef88fa0e93e7f12166c7e06de8e +Author: Behdad Esfahbod +Date: Mon Oct 29 11:14:37 2018 -0700 + + [svg] Minor + + src/hb-ot-color-svg-table.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 1366bb9760d0f171f8f655e5739e74dfd2537652 +Author: Behdad Esfahbod +Date: Mon Oct 29 11:01:25 2018 -0700 + + Fix g-i warnings + + src/hb-ot-color.h | 4 +++- + src/hb-ot-name.cc | 4 ++-- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit ae802c2c6e001492f8f639e4c24546f0e21d86c7 +Author: Ebrahim Byagowi +Date: Mon Oct 29 13:42:14 2018 +0330 + + [test-ot-color] Minor + + src/test-ot-color.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7170e35096f0afd084be1350d080695c70c65d40 +Author: Ebrahim Byagowi +Date: Mon Oct 29 13:11:01 2018 +0330 + + Rename deprecated symbols list file name and clean it up (#1328) + + src/Makefile.am | 6 +++--- + src/gen-def.py | 9 ++++----- + test/api/Makefile.am | 2 +- + 3 files changed, 8 insertions(+), 9 deletions(-) + +commit 1dfe964378e97e45eedf9db9b9a7f675fe38c0bf +Merge: f10252b4 9c692e5b +Author: Ebrahim Byagowi +Date: Mon Oct 29 12:34:33 2018 +0330 + + Merge pull request #1326 from ebraminio/test-ot-color + + Revive and rename dump-emoji to test-ot-color but use public APIs + instead + +commit 9c692e5b8d195d8e82538594d89865c609d708f3 +Author: Ebrahim Byagowi +Date: Mon Oct 29 11:36:11 2018 +0330 + + [test-ot-color] Use public APIs on the tool + + src/Makefile.am | 9 +++ + src/test-ot-color.cc | 184 + +++++++++++++++++++++++++++++---------------------- + 2 files changed, 113 insertions(+), 80 deletions(-) + +commit fb525f8943b43fe241424c93461bee2b94af28e3 +Author: Ebrahim Byagowi +Date: Mon Oct 29 09:43:17 2018 +0330 + + Rename dump-emoji to test-ot-color + + src/{dump-emoji.cc => test-ot-color.cc} | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 81bcf47e9ea7eb447ff95ce48ecbc5c4439cb53f +Author: Ebrahim Byagowi +Date: Mon Oct 29 09:40:39 2018 +0330 + + Revive dump-emoji + + src/dump-emoji.cc | 322 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 322 insertions(+) + +commit f10252b4b637b4aa0b74bb75963ae1e1a41b5b9f +Author: Ebrahim Byagowi +Date: Mon Oct 29 10:29:58 2018 +0330 + + [svg] Fix incorrect array referencing + + src/hb-ot-color-svg-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5eb251aab041d89b06b0d3f65906ff6712608263 +Author: Behdad Esfahbod +Date: Sun Oct 28 23:16:13 2018 -0700 + + [cbdt] Implement strike selection logic + + src/hb-ot-color-cbdt-table.hh | 25 ++++++++++++++++++++----- + 1 file changed, 20 insertions(+), 5 deletions(-) + +commit 98bddbc8ef3330bc5635f6255e6b9c16593a1934 +Author: Behdad Esfahbod +Date: Sun Oct 28 23:14:15 2018 -0700 + + [sbix] Minor + + src/hb-ot-color-sbix-table.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 8cffee0577284839a24d9fb863206886d2373974 +Author: Behdad Esfahbod +Date: Sun Oct 28 23:07:59 2018 -0700 + + [cbdt] Simplify more + + src/hb-ot-color-cbdt-table.hh | 22 +++++++--------------- + 1 file changed, 7 insertions(+), 15 deletions(-) + +commit 574579d3766b7b42e62495cb9a98f3ffd91079e8 +Author: Behdad Esfahbod +Date: Sun Oct 28 23:04:37 2018 -0700 + + [color] Rename get_strike() to choose_strike() + + src/hb-ot-color-cbdt-table.hh | 8 ++++---- + src/hb-ot-color-sbix-table.hh | 10 +++++----- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit 0aa90271fdbb2b85389cd5af029b6d4468fb8146 +Author: Behdad Esfahbod +Date: Sun Oct 28 23:03:20 2018 -0700 + + [tests] Fix for recent rounding change in CBDT + + test/shaping/data/in-house/tests/color-fonts.tests | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e2ba96da4c39ba5fe941bf2704c1e7cc5f98034f +Author: Behdad Esfahbod +Date: Sun Oct 28 23:01:57 2018 -0700 + + [cbdt] Refactor get_strike() + + src/hb-ot-color-cbdt-table.hh | 39 + ++++++++++++++++----------------------- + src/hb-ot-color.cc | 2 +- + 2 files changed, 17 insertions(+), 24 deletions(-) + +commit 6983cca9c865752fe0a9a065f9b0278b686c3abc +Author: Behdad Esfahbod +Date: Sun Oct 28 22:46:18 2018 -0700 + + [cbdt] Minor + + src/hb-ot-color-cbdt-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e998fb9fbfbd79b476d758238af60f6a4ddff20c +Author: Behdad Esfahbod +Date: Sun Oct 28 22:45:53 2018 -0700 + + [color] Round extents when scaling + + src/hb-ot-color-cbdt-table.hh | 12 +++++++----- + src/hb-ot-color-sbix-table.hh | 12 ++++++------ + 2 files changed, 13 insertions(+), 11 deletions(-) + +commit c929ccfcea18c5c35d6d41ae921845eeffba978a +Author: Ebrahim Byagowi +Date: Mon Oct 29 08:41:13 2018 +0330 + + [ot-color/png] Consider strike ppem on scaling + + src/hb-ot-color-cbdt-table.hh | 5 +++-- + src/hb-ot-color-sbix-table.hh | 23 +++++++++++++++++++---- + src/hb-ot-color.cc | 2 +- + src/hb-ot-font.cc | 2 +- + test/api/test-ot-color.c | 4 ++-- + 5 files changed, 26 insertions(+), 10 deletions(-) + +commit a8c9facf7a73cca39e3fed1f637db4858e64414a +Author: Behdad Esfahbod +Date: Sun Oct 28 18:32:37 2018 -0700 + + [svg] Cosmetic + + src/hb-ot-color-svg-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9c1460e5685448ad4eac8faff9f05e456f87ed28 +Author: Behdad Esfahbod +Date: Sun Oct 28 18:29:14 2018 -0700 + + [svg] Use SortedArrayOf.bsearch + + src/hb-ot-color-svg-table.hh | 18 +++--------------- + 1 file changed, 3 insertions(+), 15 deletions(-) + +commit 18dd6363a5021cfd770b431a6320386f94447674 +Author: Behdad Esfahbod +Date: Sun Oct 28 18:26:49 2018 -0700 + + [svg] Minor + + src/hb-ot-color-svg-table.hh | 23 +++++++++++------------ + 1 file changed, 11 insertions(+), 12 deletions(-) + +commit 4876c938a20af356988d566ba95472d3bcbb133d +Author: Behdad Esfahbod +Date: Sun Oct 28 18:01:25 2018 -0700 + + [sbix] Comment + + src/hb-ot-color-sbix-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 519fca101466283ca5c993dec2ec2c6891d8add5 +Author: Behdad Esfahbod +Date: Sun Oct 28 16:32:20 2018 -0700 + + [color] Minor + + src/hb-ot-color.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e8ff27c2082ffcf3bd213e7a77d823dc1809857e +Author: Behdad Esfahbod +Date: Sun Oct 28 16:29:09 2018 -0700 + + Minor + + src/hb-open-type.hh | 6 ++++-- + src/hb-ot-layout-common.hh | 4 ++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit 65621723815138150e8a6354413ed14d53cf35b5 +Author: Behdad Esfahbod +Date: Sun Oct 28 16:27:18 2018 -0700 + + [sbix] Use LOffsetLArrayOf<> + + src/hb-open-type.hh | 2 ++ + src/hb-ot-color-sbix-table.hh | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit a3ddd8067f266e49d9451c53a0fd40aff8551af7 +Author: Behdad Esfahbod +Date: Sun Oct 28 16:26:03 2018 -0700 + + [sbix] Add get_strike + + src/hb-ot-color-sbix-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 95524ed9bccdcd0d6a46c5dcc372e96a0c34b5f0 +Author: Behdad Esfahbod +Date: Sun Oct 28 15:58:48 2018 -0700 + + [sbix] Remove sbix_len + + src/hb-ot-color-sbix-table.hh | 29 +++++++++++++++++++++-------- + 1 file changed, 21 insertions(+), 8 deletions(-) + +commit 69e9846452f829f82f6866a683845167b3d3d6e5 +Author: Behdad Esfahbod +Date: Sun Oct 28 15:53:11 2018 -0700 + + [sbix] Fix get_glyph_blob() on Null object + + src/hb-ot-color-sbix-table.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 4e0ee2af091634198c4b9b17036d9391a4e6b084 +Author: Behdad Esfahbod +Date: Sun Oct 28 15:44:40 2018 -0700 + + [sbix] Simplify ppem access + + If struct members are simple and needed publicly, we make them public. + + src/hb-ot-color-sbix-table.hh | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +commit 6ac9a4eaa3a47c9b9f2c7aa123255e82ccc53551 +Author: Behdad Esfahbod +Date: Sun Oct 28 15:43:54 2018 -0700 + + [sbix] Simplify glyph_length calc + + src/hb-ot-color-sbix-table.hh | 22 +++++----------------- + 1 file changed, 5 insertions(+), 17 deletions(-) + +commit 0730d623854dc17ce0c3f1f2755a90b656c8e52c +Author: Behdad Esfahbod +Date: Sun Oct 28 15:38:42 2018 -0700 + + [sbix] Check glyph data end is in range + + src/hb-ot-color-sbix-table.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b76dc03108d04975335dbf3580f8d02321cb5d25 +Author: Behdad Esfahbod +Date: Sun Oct 28 15:36:17 2018 -0700 + + [sbix] Reduce code + + src/hb-ot-color-sbix-table.hh | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 50fb02a219dbf168d300c4ccf9f29aee38a78e6c +Author: Behdad Esfahbod +Date: Sun Oct 28 15:33:12 2018 -0700 + + [sbix] Check glyph id before looking into unsafe array + + That 'Z' at end of imageOffsetsZ is a reminder that you should + check... + + src/hb-ot-color-sbix-table.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit a8cb9c73da29afa89b0253b6475ff220613e100a +Author: Behdad Esfahbod +Date: Sun Oct 28 15:30:57 2018 -0700 + + [sbix] Simplify 'dupe' handling logic + + src/hb-ot-color-sbix-table.hh | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit d7eb534e59064633732959c3771b6557cc97005e +Author: Behdad Esfahbod +Date: Sun Oct 28 15:27:04 2018 -0700 + + [sbix] Check offsets before proceeding + + src/hb-ot-color-sbix-table.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c8380bd3e4a2e51dfbe2e44e19738445be16ac75 +Author: Behdad Esfahbod +Date: Sun Oct 28 15:20:33 2018 -0700 + + [color] Remove more dump-emoji cruft + + src/hb-ot-color-cbdt-table.hh | 53 + ------------------------------------------- + src/hb-ot-color-sbix-table.hh | 13 ----------- + 2 files changed, 66 deletions(-) + +commit 68f2c832c894d71715073d4748ad321a9d271a0e +Author: Behdad Esfahbod +Date: Sun Oct 28 15:18:55 2018 -0700 + + Remove dump-emoji + + src/Makefile.am | 9 -- + src/dump-emoji.cc | 322 + ------------------------------------------ + src/hb-ot-color-sbix-table.hh | 4 +- + 3 files changed, 3 insertions(+), 332 deletions(-) + +commit b46de42b3a4bdf110154f4f067656f153f5a7d1b +Author: Behdad Esfahbod +Date: Sun Oct 28 15:13:45 2018 -0700 + + [sbix] Fix order of parameters + + src/hb-ot-color-sbix-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a91cda72abdfc5e401510474c59dd14026e8b6cb +Author: Behdad Esfahbod +Date: Sun Oct 28 15:12:05 2018 -0700 + + [sbix] Remove redundant parameter + + src/hb-ot-color-sbix-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit c712005f55b2a1e5c782302d8a548cf1231c01f0 +Author: Behdad Esfahbod +Date: Sun Oct 28 15:11:10 2018 -0700 + + [sbix] Add get_strike() + + src/hb-ot-color-sbix-table.hh | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +commit 400bc3f030b4ffebe24aa3562d8eb5fcc1cf4bdd +Author: Behdad Esfahbod +Date: Sun Oct 28 15:05:40 2018 -0700 + + [sbix] Remove a couple of extra checks + + src/hb-ot-color-sbix-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3770282c837aacbf49b16be1986c91a608faa7da +Author: Behdad Esfahbod +Date: Sun Oct 28 15:02:53 2018 -0700 + + [sbix] Rename sbix_table to table in accelerator + + src/hb-ot-color-sbix-table.hh | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 7346841807ad96fc65bfc6ee9e78c3f190488f2a +Author: Behdad Esfahbod +Date: Sun Oct 28 15:00:13 2018 -0700 + + [cbdt] Rename reference_blob_for_glyph() to reference_png() + + src/hb-ot-color-cbdt-table.hh | 8 ++++---- + src/hb-ot-color.cc | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 1f33b8525d578323d6c798c08fc23c56896f9de0 +Author: Behdad Esfahbod +Date: Sun Oct 28 14:56:55 2018 -0700 + + [sbix] Rename ugly reference_blob_for_glyph() to reference_png() + + src/hb-ot-color-sbix-table.hh | 16 +++++++--------- + src/hb-ot-color.cc | 4 +--- + 2 files changed, 8 insertions(+), 12 deletions(-) + +commit 946b5344193183133bfc9799e26d3d0436d86404 +Author: Behdad Esfahbod +Date: Sun Oct 28 14:52:25 2018 -0700 + + [sbix] Fix uninitialized variables + + src/hb-ot-color-sbix-table.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 01c7d53fb739b547f3633972194893f68a4738bc +Author: Behdad Esfahbod +Date: Sun Oct 28 14:51:18 2018 -0700 + + [sbix] Select best strike based on ppem + + src/hb-ot-color-sbix-table.hh | 50 + ++++++++++++++++++++++++------------------- + src/hb-ot-color.cc | 3 +-- + src/hb-ot-font.cc | 2 +- + 3 files changed, 30 insertions(+), 25 deletions(-) + +commit f9f26bff4c79d65a92affd6b73e2b3de017f2d6d +Author: Behdad Esfahbod +Date: Sun Oct 28 14:20:50 2018 -0700 + + [sbix] Move code around. Add get_extents() + + src/hb-ot-color-sbix-table.hh | 15 +++++++++++++-- + src/hb-ot-font.cc | 2 +- + 2 files changed, 14 insertions(+), 3 deletions(-) + +commit 48bc3039cb46d2b8cf672d86b63b4235a86252e6 +Author: Behdad Esfahbod +Date: Sun Oct 28 14:16:52 2018 -0700 + + [sbix] Check blob length against PNG header leangth + + src/hb-ot-color-sbix-table.hh | 37 +++++++++++++++++++++++-------------- + 1 file changed, 23 insertions(+), 14 deletions(-) + +commit d3ec31a57cb99048fb33bca65041da9dc884d8cb +Author: Ebrahim Byagowi +Date: Mon Oct 29 00:28:44 2018 +0330 + + [ot-color] More on PNGHeader fields + + src/hb-ot-color-sbix-table.hh | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 35fa3d326096639a33635e19f204a9cb31f20826 +Author: Ebrahim Byagowi +Date: Mon Oct 29 00:07:26 2018 +0330 + + [ot-color] Apply Behdad comment + + src/hb-ot-color-sbix-table.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 307d61867a2b70073eecd1e0cb9b7d912e1c3f06 +Author: Ebrahim Byagowi +Date: Mon Oct 29 00:03:01 2018 +0330 + + [ot-color] Make PNGHeader reading actually work + + src/hb-ot-color-sbix-table.hh | 6 +++--- + test/api/test-ot-color.c | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 632e9af862aba49ab31343c4fd07dffef6d2749f +Author: Ebrahim Byagowi +Date: Sun Oct 28 23:43:50 2018 +0330 + + [ot-color] Implement PNGHeader and test it, it doesn't work however + + src/hb-ot-color-sbix-table.hh | 20 +++++++++++++++----- + src/hb-ot-font.cc | 4 +--- + test/api/test-ot-color.c | 16 ++++++++++++++++ + 3 files changed, 32 insertions(+), 8 deletions(-) + +commit 38706a0746822865008f810f9f577740c32580fa +Author: Ebrahim Byagowi +Date: Sun Oct 28 23:19:04 2018 +0330 + + [ot-color] Preparation for setting PNG width/height in extents + + src/dump-emoji.cc | 7 +++--- + src/hb-ot-color-sbix-table.hh | 52 + +++++++++++++++++++++++++++++++++++-------- + src/hb-ot-color.cc | 14 +++++------- + src/hb-ot-font.cc | 7 +++++- + 4 files changed, 59 insertions(+), 21 deletions(-) + +commit d6d6f3bc225bab57c1ab29b41876c98ac4ec1e4d +Author: Behdad Esfahbod +Date: Sun Oct 28 11:41:33 2018 -0700 + + [docs] Add comment + + src/hb-ot-font.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 3d4c1f6a41022ec99adefa2bdd2489622e2f9a66 +Author: Ebrahim Byagowi +Date: Sun Oct 28 21:38:56 2018 +0330 + + [ot-color] Apply Behdad reviews + + docs/harfbuzz-sections.txt | 4 ++-- + src/hb-ot-color-cbdt-table.hh | 15 ++++----------- + src/hb-ot-color-sbix-table.hh | 6 ++---- + src/hb-ot-color.cc | 8 ++++---- + src/hb-ot-color.h | 4 ++-- + test/api/test-ot-color.c | 14 +++++++------- + 6 files changed, 21 insertions(+), 30 deletions(-) + +commit 8ef0d2ef928ac47278d7c6db8c8040a47f076e85 +Author: Ebrahim Byagowi +Date: Sun Oct 28 20:09:40 2018 +0330 + + [ot-color] Apply Behdad comment + + src/dump-emoji.cc | 2 +- + src/hb-ot-color-cbdt-table.hh | 16 +++++++--------- + src/hb-ot-color-sbix-table.hh | 14 ++++---------- + src/hb-ot-color.cc | 22 +++++++--------------- + src/hb-ot-color.h | 5 +---- + test/api/test-ot-color.c | 15 ++++----------- + 6 files changed, 24 insertions(+), 50 deletions(-) + +commit dbd419bedef06a07c844b6a748a5e2868016000c +Author: Ebrahim Byagowi +Date: Sat Oct 27 15:15:24 2018 +0330 + + [ot-color] Add public API for CBDT/sbix/SVG color Emojis + + docs/harfbuzz-sections.txt | 4 ++++ + src/dump-emoji.cc | 4 ++-- + src/hb-ot-color.cc | 39 ++++----------------------------------- + src/hb-ot-color.h | 24 ++++++++++++++++++++++++ + test/api/test-ot-color.c | 8 ++------ + 5 files changed, 36 insertions(+), 43 deletions(-) + +commit 6ce49a921a80f1238ddc537f77a1fceea5274a21 +Author: Behdad Esfahbod +Date: Sun Oct 28 08:26:30 2018 -0700 + + [name] Change hb_name_id_t back to unsigned int + + https://github.com/harfbuzz/harfbuzz/commit/d941f66c75fe26f909b1ba248535cc372bbde851#commitcomment-31076011 + + docs/harfbuzz-sections.txt | 2 -- + src/hb-ot-color-cpal-table.hh | 4 ++-- + src/hb-ot-layout.cc | 12 ++++++------ + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-name.h | 6 +++--- + src/test-size-params.cc | 2 +- + 6 files changed, 13 insertions(+), 15 deletions(-) + +commit a4f4f5ba5f64174dea931e02367aa4067d034383 +Author: Behdad Esfahbod +Date: Sun Oct 28 08:23:36 2018 -0700 + + [docs] Fix titles here as well + + src/hb-map.cc | 2 +- + src/hb-set.cc | 2 +- + src/hb-shape-plan.cc | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 213b6dd33564d0273b1db1c17a4e82548b727dfe +Author: Behdad Esfahbod +Date: Sat Oct 27 18:36:24 2018 -0700 + + [name] Make sure hb_name_id_t is int-sized + + https://github.com/harfbuzz/harfbuzz/commit/d941f66c75fe26f909b1ba248535cc372bbde851#commitcomment-31068905 + + src/hb-ot-name.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4740a3593d6bbb97758593b7d5cd1b86eccbed78 +Author: Behdad Esfahbod +Date: Sat Oct 27 05:07:54 2018 -0700 + + [docs] Divide reference API into three chapters + + docs/harfbuzz-docs.xml | 213 + +++++++++++++------------------------------------ + 1 file changed, 56 insertions(+), 157 deletions(-) + +commit 1d40d72f291ed5e11850f8bd51a8562b57de1997 +Author: Behdad Esfahbod +Date: Sat Oct 27 05:00:42 2018 -0700 + + [docs] Hook up hb-var + + docs/harfbuzz-docs.xml | 1 + + src/hb-ot-var.cc | 11 +++++++++++ + 2 files changed, 12 insertions(+) + +commit 80d9a427cf61f61512de13cd88bdc63d881019fe +Author: Behdad Esfahbod +Date: Sat Oct 27 04:58:32 2018 -0700 + + [docs] Document remaining sections + + src/hb-ot-color.cc | 10 ++++++++++ + src/hb-ot-font.cc | 10 ++++++++++ + src/hb-ot-layout.cc | 10 ++++++++++ + src/hb-ot-math.cc | 11 +++++++++++ + src/hb-ot-name.cc | 10 ++++++++++ + src/hb-ot-shape.cc | 10 ++++++++++ + 6 files changed, 61 insertions(+) + +commit cf5fa57f00613d324b55732d9e21c779ba0d2de2 +Author: Behdad Esfahbod +Date: Sat Oct 27 04:50:38 2018 -0700 + + [docs] Change section titles again + + I think I like the uniform "hb-*" more. + + src/hb-blob.cc | 2 +- + src/hb-buffer.cc | 2 +- + src/hb-common.cc | 4 ++-- + src/hb-deprecated.h | 12 ++++++++++++ + src/hb-face.cc | 2 +- + src/hb-font.cc | 2 +- + src/hb-shape.cc | 2 +- + src/hb-unicode.cc | 2 +- + 8 files changed, 20 insertions(+), 8 deletions(-) + +commit 04981ee05d83ed30c9f818106589a4de9c3e9b7f +Author: Behdad Esfahbod +Date: Sat Oct 27 04:40:43 2018 -0700 + + [docs] More + + src/hb-coretext.cc | 10 ++++++++++ + src/hb-ft.cc | 11 +++++++++++ + src/hb-glib.cc | 10 ++++++++++ + src/hb-gobject-structs.cc | 12 ++++++++++++ + src/hb-graphite2.cc | 10 ++++++++++ + src/hb-icu.cc | 10 ++++++++++ + src/hb-uniscribe.cc | 10 ++++++++++ + 7 files changed, 73 insertions(+) + +commit 5dd86aa33b4e52a0de4fcd96b2ea7bafcae8dd34 +Author: Behdad Esfahbod +Date: Sat Oct 27 04:28:40 2018 -0700 + + [docs] Rename section titles to object names + + More useful. + + src/hb-blob.cc | 2 +- + src/hb-buffer.cc | 2 +- + src/hb-face.cc | 4 ++-- + src/hb-font.cc | 4 ++-- + src/hb-map.cc | 2 +- + src/hb-set.cc | 2 +- + src/hb-shape-plan.cc | 2 +- + src/hb-unicode.cc | 2 +- + 8 files changed, 10 insertions(+), 10 deletions(-) + +commit 524fb70216d7fec17f5327237faa4d092ae15a00 +Author: Behdad Esfahbod +Date: Sat Oct 27 04:27:36 2018 -0700 + + [docs] More + + src/hb-map.cc | 11 ++++++++++- + src/hb-set.cc | 11 ++++++++++- + 2 files changed, 20 insertions(+), 2 deletions(-) + +commit 46072b7cb55bfeb8c46a78cbdb335dfdcce48298 +Author: Behdad Esfahbod +Date: Sat Oct 27 04:21:20 2018 -0700 + + [ot] Fold hb-ot-tag.h into hb-ot-layout.h + + docs/harfbuzz-docs.xml | 1 - + docs/harfbuzz-sections.txt | 20 +++++------- + src/Makefile.sources | 1 - + src/hb-graphite2.cc | 2 +- + src/hb-ot-layout.h | 42 ++++++++++++++++++++++++- + src/hb-ot-tag.h | 78 + ---------------------------------------------- + src/hb-ot.h | 1 - + src/hb-uniscribe.cc | 2 +- + 8 files changed, 51 insertions(+), 96 deletions(-) + +commit 00cf4e5eb6dcb04406d5a519712da799277cec2e +Author: Behdad Esfahbod +Date: Sat Oct 27 04:07:33 2018 -0700 + + [docs] Fill in some sections + + docs/harfbuzz-docs.xml | 20 ++++++-------- + docs/harfbuzz-sections.txt | 65 + +++++++++++++++++++--------------------------- + src/hb-blob.cc | 13 ++++++++++ + src/hb-buffer.cc | 3 ++- + src/hb-common.cc | 23 ++++++++++++++++ + src/hb-face.cc | 13 ++++++++++ + src/hb-font.cc | 13 ++++++++++ + src/hb-shape-plan.cc | 13 ++++++++++ + src/hb-shape.cc | 4 ++- + src/hb-unicode.cc | 14 ++++++++++ + 10 files changed, 129 insertions(+), 52 deletions(-) + +commit 55a19d73b4d5e7ddd328263d241a442f16f005b2 +Author: Behdad Esfahbod +Date: Sat Oct 27 04:01:19 2018 -0700 + + Move HB_EXTERN + + src/hb-common.h | 4 ++++ + src/hb.h | 4 ---- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 524e854c15f9d6c50c5456ae0e188f039dcf153c +Merge: 4ee3c827 8180c37d +Author: Ebrahim Byagowi +Date: Sat Oct 27 15:04:43 2018 +0330 + + Merge pull request #1318 from ebraminio/png + + Add a non-hooked _png _svg get emoji blob + +commit 8180c37df0a856dbc3564c0aefd8b2acab8baf8a +Author: Ebrahim Byagowi +Date: Sat Oct 27 14:45:00 2018 +0330 + + [ot-color] Remove _png and _svg public APIs + + docs/harfbuzz-sections.txt | 4 ---- + src/dump-emoji.cc | 11 ++++++++--- + src/hb-ot-color.cc | 39 +++++++++++++++++++++++++++++++++++---- + src/hb-ot-color.h | 24 ------------------------ + test/api/test-ot-color.c | 8 ++++++-- + 5 files changed, 49 insertions(+), 37 deletions(-) + +commit 9aa6279a2d64ab8057b0d7acbcc77044442c6d0e +Author: Ebrahim Byagowi +Date: Sat Oct 27 14:24:58 2018 +0330 + + [ot-color/png] Try to get image blob from sbix first options.aat + is set + + src/hb-ot-color.cc | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit b42661ee91ea92309e827a970f370cacc62c73aa +Author: Ebrahim Byagowi +Date: Sat Oct 27 14:15:38 2018 +0330 + + [ot-color] Add some documentation + + src/hb-ot-color.cc | 37 +++++++++++++++++++------------------ + src/hb-ot-color.h | 2 +- + 2 files changed, 20 insertions(+), 19 deletions(-) + +commit 4ee3c8272c31736980218cba95f97fed53d24e14 +Author: Behdad Esfahbod +Date: Sat Oct 27 03:18:45 2018 -0700 + + [docs] Fix hb_name_id_t + + Yep, was not recognized without this patch! + + src/hb-ot-name.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9435fb24daadf08add9a701816da01bd54c0cd78 +Author: Ebrahim Byagowi +Date: Sat Oct 27 13:32:14 2018 +0330 + + [ot-color/png] Implement CBDT part + + src/hb-ot-color-cbdt-table.hh | 56 + +++++++++++++++++++++++++++++++++++++++---- + src/hb-ot-color.cc | 19 ++------------- + src/hb-ot-color.h | 4 ++++ + test/api/test-ot-color.c | 25 ++++++++++++++++--- + 4 files changed, 79 insertions(+), 25 deletions(-) + +commit 9457cfd7bcc9c2fff38194f2bb82ab7be881bfeb +Author: Behdad Esfahbod +Date: Sat Oct 27 03:15:34 2018 -0700 + + [docs] Hook up hb-map + + docs/harfbuzz-docs.xml | 1 + + 1 file changed, 1 insertion(+) + +commit d941f66c75fe26f909b1ba248535cc372bbde851 +Author: Behdad Esfahbod +Date: Sat Oct 27 02:55:52 2018 -0700 + + [name] Make hb_name_id_t be the enum + + This is like hb_script_t. + + We had this exposed as unsigned int since 2.0.0 release in two APIs, + as well as hb_ot_layout_get_size_params() from earlier. + But since no one uses those (right?!), let's just fix this now. + + docs/harfbuzz-docs.xml | 6 ++++-- + docs/harfbuzz-sections.txt | 4 +++- + src/hb-ot-color-cpal-table.hh | 12 ++++++------ + src/hb-ot-layout.cc | 16 ++++++++-------- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-name.h | 15 ++++----------- + src/test-size-params.cc | 2 +- + 7 files changed, 27 insertions(+), 30 deletions(-) + +commit 40496a54a03864c5e6a1224c18b4b93a1f578eed +Author: Behdad Esfahbod +Date: Sat Oct 27 02:49:32 2018 -0700 + + [name] Move HB_NAME_ID_INVALID into the enum + + Don't know how to document anonymous enum members. + + src/hb-ot-name.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a8a55b9f892a5e4f086b20bbe337dc29182210af +Author: Behdad Esfahbod +Date: Sat Oct 27 02:45:57 2018 -0700 + + [name] Move around + + src/hb-ot-name.h | 74 + ++++++++++++++++++++++++++++---------------------------- + 1 file changed, 37 insertions(+), 37 deletions(-) + +commit 3b7e5f131383956e19642d28c938f1bc0d16295f +Author: Behdad Esfahbod +Date: Sat Oct 27 02:39:20 2018 -0700 + + [name] Rename hb_ot_name_get_names() to hb_ot_name_list_names() + + And swap return value positions, so can be annotated for + gobject-introspectin. + + docs/harfbuzz-sections.txt | 2 +- + src/hb-ot-name.cc | 17 ++++++++--------- + src/hb-ot-name.h | 6 +++--- + src/test-name-table.cc | 4 ++-- + 4 files changed, 14 insertions(+), 15 deletions(-) + +commit 4025ad804383dc8d5ace9654ae21d4d726d0dbc4 +Author: Behdad Esfahbod +Date: Sat Oct 27 02:35:06 2018 -0700 + + Document new API + + src/hb-common.h | 30 +++++++++++++++++++++++++- + src/hb-ot-color.cc | 16 +++++++------- + src/hb-ot-layout.cc | 2 +- + src/hb-ot-name.cc | 61 + ++++++++++++++++++++++++++++++++++++++++++++++++++++- + src/hb-ot-name.h | 15 +++++++++++++ + 5 files changed, 113 insertions(+), 11 deletions(-) + +commit 5e2a52f71a8d081441fbc1c57a3550e3a9573e46 +Author: Ebrahim Byagowi +Date: Sat Oct 27 12:44:33 2018 +0330 + + [sbix] Remove dump method from sbix accelerator + + src/dump-emoji.cc | 36 ++++++++++++++++++++++++------------ + src/hb-ot-color-sbix-table.hh | 26 ++++++++++---------------- + 2 files changed, 34 insertions(+), 28 deletions(-) + +commit 0353ac6cde47df8f5386733f5c12cc60732a5bf4 +Author: Ebrahim Byagowi +Date: Sat Oct 27 12:24:53 2018 +0330 + + Fix test-name-table on older bots + + src/test-name-table.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dc11a38107ac1f0a2d3edacae33ff7f10f5e894c +Author: Ebrahim Byagowi +Date: Sat Oct 27 12:15:25 2018 +0330 + + [sbix] Set num_glyphs on accelerator + + dump-emoji was broken without it + + src/hb-ot-color-sbix-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 6a38fd68a8f4e66d9248e0c943ae3a1cf45c521b +Author: Ebrahim Byagowi +Date: Sat Oct 27 10:50:53 2018 +0330 + + [ot-color/png] sbix runtime memory check + + src/hb-ot-color-cbdt-table.hh | 16 +++++++--------- + src/hb-ot-color-sbix-table.hh | 18 ++++++++++++------ + src/hb-ot-color-svg-table.hh | 4 ++-- + 3 files changed, 21 insertions(+), 17 deletions(-) + +commit ca645accb97841e01846e45cda32e6bd2ad15940 +Author: Behdad Esfahbod +Date: Sat Oct 27 00:39:31 2018 -0700 + + Comment + + src/hb-ot-shape-complex-indic.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 265ad408ca41e9d0b5a1056a751d834d4eadc911 +Author: Ebrahim Byagowi +Date: Fri Oct 26 23:55:11 2018 +0330 + + [ot-color/png] Implement sbix part + + docs/harfbuzz-sections.txt | 2 + + src/dump-emoji.cc | 5 ++- + src/hb-ot-color-cbdt-table.hh | 27 ++++++++---- + src/hb-ot-color-sbix-table.hh | 98 + +++++++++++++++++++++++++++++++++++++------ + src/hb-ot-color.cc | 64 ++++++++++++++++++++++++++++ + src/hb-ot-color.h | 9 ++++ + test/api/test-ot-color.c | 32 ++++++++++++++ + 7 files changed, 215 insertions(+), 22 deletions(-) + +commit 7f5941e162bf7806299656edafd452a47b5a55b9 +Author: Behdad Esfahbod +Date: Sat Oct 27 00:06:48 2018 -0700 + + Remove stale comment + + Ugliness was fixed in 30eab97a0072fbc22d353082249e0e6e546cd86b + But yeah, my smell detector was working. Ugliness was buggy. + + src/hb-ot-shape-normalize.cc | 1 - + 1 file changed, 1 deletion(-) + +commit e7400c0275cad4f584eeaf21ce6d5c6adca29bbb +Author: Behdad Esfahbod +Date: Fri Oct 26 22:09:17 2018 -0700 + + [docs] Hook up new symbols + + docs/harfbuzz-docs.xml | 46 + +++++++++++++++++++++++++++++++++++++++++----- + docs/harfbuzz-sections.txt | 21 +++++++++++++++++++++ + src/hb-ot-color.cc | 2 +- + 3 files changed, 63 insertions(+), 6 deletions(-) + +commit 6aa019c4af6b64bb732205e6051f3e73e1b70721 +Author: Behdad Esfahbod +Date: Fri Oct 26 22:02:17 2018 -0700 + + [morx] Fix merge_cluster to end at last ligature component + + Don't assume current position was a component in the ligature. + + src/hb-aat-layout-morx-table.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 00ae4be6bf8b1d0800043167c5cf95187ac12515 +Author: Behdad Esfahbod +Date: Fri Oct 26 21:59:20 2018 -0700 + + [morx] Fix bailing out ligation at end-of-text + + Check was after a move_to, which wouldn't work. + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11147 + + src/hb-aat-layout-morx-table.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 30eab97a0072fbc22d353082249e0e6e546cd86b +Author: Behdad Esfahbod +Date: Fri Oct 26 21:54:07 2018 -0700 + + Fix invalid memory read + + Buffer might be relocated inside replace_glyphs(). + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=895117 + + src/hb-ot-shape-normalize.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 79b2fa62ca7eb5a875778d3a2ecae63350083ba3 +Author: Behdad Esfahbod +Date: Fri Oct 26 21:21:18 2018 -0700 + + [indic] Fix infinite loop + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=863044 + + src/hb-ot-shape-complex-indic.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 39bd07aed5fe6ccddde53206bafceec32d56dcc1 +Author: Behdad Esfahbod +Date: Fri Oct 26 21:01:11 2018 -0700 + + Fix bunch of unused parameter warnings + + Show up with gcc -O0. + + There's a few more but those are functions that need to be filled in. + + Maybe this is a lost battle... + + src/gen-vowel-constraints.py | 4 ++-- + src/hb-aat-layout-common.hh | 7 +++++-- + src/hb-aat-layout-kerx-table.hh | 4 ++-- + src/hb-aat-layout-morx-table.hh | 10 +++++----- + src/hb-face.cc | 2 +- + src/hb-font.cc | 29 + ++++++++++++++-------------- + src/hb-graphite2.cc | 9 ++++++--- + src/hb-machinery.hh | 4 ++-- + src/hb-ot-color-cbdt-table.hh | 2 +- + src/hb-ot-glyf-table.hh | 4 ++-- + src/hb-ot-hmtx-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-math-table.hh | 2 +- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 6 +++--- + src/hb-ot-shape-complex-arabic.cc | 6 +++--- + src/hb-ot-shape-complex-hangul.cc | 2 +- + src/hb-ot-shape-complex-khmer.cc | 2 +- + src/hb-ot-shape-complex-myanmar.cc | 6 +++--- + src/hb-ot-shape-complex-use.cc | 8 ++++---- + src/hb-ot-shape-complex-vowel-constraints.cc | 4 ++-- + src/hb-ot-shape-fallback.cc | 4 ++-- + src/hb-ot-shape-normalize.cc | 4 +++- + src/hb-ot-shape.cc | 2 +- + src/hb-ot-tag.cc | 3 +-- + src/hb-ot-vorg-table.hh | 2 +- + src/hb-set.cc | 2 +- + src/hb-shape-plan.cc | 2 +- + src/hb-utf.hh | 2 +- + 29 files changed, 73 insertions(+), 65 deletions(-) + +commit b2e1ec374cbd2a6e4d79419bd5601a4e2ecb9864 +Author: Behdad Esfahbod +Date: Fri Oct 26 20:45:28 2018 -0700 + + [subset] Fix warning + + src/hb-subset.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 337ea0b7175793305e9d8935aecf385b707a5bc4 +Author: Behdad Esfahbod +Date: Fri Oct 26 20:31:14 2018 -0700 + + [fuzzing] Remove HB_NDEBUG + + Not sure why it ever was added. + + src/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 12058e44d100c28816f42c91c63a0f960a662181 +Author: Behdad Esfahbod +Date: Fri Oct 26 16:23:50 2018 -0700 + + [fuzzing] Add more test + + ...z-testcase-minimized-harfbuzz_fuzzer-5659690013556736 | Bin 0 -> + 2732 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit c965eeadbc71943f2336a20dc16ac691c805b90e +Author: Behdad Esfahbod +Date: Thu Oct 25 13:43:25 2018 -0700 + + [name] Default to "en" if language is not specified + + src/hb-ot-name.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 3fd6e5dbefe52a4a2e604c28a4edfbd40ed16027 +Author: Behdad Esfahbod +Date: Wed Oct 24 13:42:38 2018 -0700 + + [name] Add pre-defined nameIDs + + src/hb-ot-name.h | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +commit 20d0171d20cf9f3f93bdd6878bbc1d7d8329e75f +Author: Behdad Esfahbod +Date: Wed Oct 24 13:20:19 2018 -0700 + + [name] Fill out most missing language codes + + src/hb-ot-name-language.cc | 114 + +++++++++++++++++++++++---------------------- + 1 file changed, 58 insertions(+), 56 deletions(-) + +commit 622b014faf7bbe7a97f9aff959c434d1664c10d0 +Author: Behdad Esfahbod +Date: Wed Oct 24 12:40:15 2018 -0700 + + [name] Skip enumerating names with unknown language + + src/hb-ot-name-table.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2c39f359e4a7312e3b518f76815d79e42ee96a32 +Author: Behdad Esfahbod +Date: Wed Oct 24 12:34:30 2018 -0700 + + [utf] Remove unused typedef + + src/hb-utf.hh | 1 - + 1 file changed, 1 deletion(-) + +commit ce81c7429810ad3902c37e50016ca54b9bae6f91 +Author: Behdad Esfahbod +Date: Wed Oct 24 12:34:03 2018 -0700 + + [utf] Fix ASCII + + src/hb-utf.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 327546e633b590d6dedfb901810ccf490a0bf922 +Author: Behdad Esfahbod +Date: Tue Oct 23 23:33:44 2018 -0700 + + [name] Hook up ltag table + + src/hb-aat-layout.cc | 15 ++++++++++++++- + src/hb-aat-layout.hh | 5 +++++ + src/hb-aat-ltag-table.hh | 17 +++++++++++++++-- + src/hb-ot-face.hh | 3 ++- + src/hb-ot-name-table.hh | 9 +++++---- + 5 files changed, 41 insertions(+), 8 deletions(-) + +commit dc9a5f88b401fcad598946fcf735010c563741ac +Author: Behdad Esfahbod +Date: Tue Oct 23 23:16:06 2018 -0700 + + [name] Do record sanitization at run-time + + src/hb-dsalgs.hh | 62 + +++++++++++++++++++++++++++---------------------- + src/hb-ot-name-table.hh | 22 +++++++++++------- + src/hb-ot-name.cc | 2 +- + 3 files changed, 49 insertions(+), 37 deletions(-) + +commit a53d301b1c9f72cb42cc0fc321e2ad4dbac8e064 +Author: Behdad Esfahbod +Date: Tue Oct 23 23:05:55 2018 -0700 + + [name] Minor + + src/hb-ot-name-table.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit c442fd9a10b3e91ab18720188afff08325adf6dc +Author: Behdad Esfahbod +Date: Tue Oct 23 22:45:45 2018 -0700 + + [name] Add src/test-name-table tool to show all font names + + src/Makefile.am | 17 ++++++++----- + src/test-name-table.cc | 67 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 78 insertions(+), 6 deletions(-) + +commit 7007bd9dff9f8eef3263f1b39327552ff1ebae3f +Author: Behdad Esfahbod +Date: Tue Oct 23 22:44:36 2018 -0700 + + [name] Rebuild language list, include missing entries + + src/hb-ot-name-language.cc | 634 + ++++++++++++++++++++++++++------------------- + 1 file changed, 370 insertions(+), 264 deletions(-) + +commit 68f172101c1228a7d669d71da1d0eeb96a10565e +Author: Behdad Esfahbod +Date: Tue Oct 23 22:19:09 2018 -0700 + + [name] Fix cmp for invalid language + + src/hb-ot-name-table.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 888a65615c7b11222749ae85c124aaa9a36fe863 +Author: Behdad Esfahbod +Date: Tue Oct 23 22:16:32 2018 -0700 + + [name] Fix nul-termination bug + + src/hb-ot-name.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9b532e2ed432611005b19c40cac7e626afcccd08 +Author: Behdad Esfahbod +Date: Tue Oct 23 22:00:19 2018 -0700 + + [name] Add language mapping + + src/Makefile.sources | 2 + + src/hb-ot-name-language.cc | 349 + +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-name-language.hh | 40 ++++++ + src/hb-ot-name-table.hh | 21 ++- + 4 files changed, 399 insertions(+), 13 deletions(-) + +commit e2f9b657758cda3708c0a9db971c467ca59d5c19 +Author: Behdad Esfahbod +Date: Tue Oct 23 21:19:56 2018 -0700 + + [name] Start adding language support + + src/hb-ot-name-table.hh | 25 ++++++++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +commit 6db6bbe64bd63554919647c5b527e03aedbaee4e +Author: Behdad Esfahbod +Date: Tue Oct 23 21:12:58 2018 -0700 + + [name] Remove unused cmp function + + src/hb-ot-name-table.hh | 16 ---------------- + 1 file changed, 16 deletions(-) + +commit 4668a05006e6c4797df19651489b4589817e1e01 +Author: Behdad Esfahbod +Date: Tue Oct 23 20:51:53 2018 -0700 + + [name] Hook things up + + Accept Mac Latin name entries as ASCII as well. + + src/hb-ot-name-table.hh | 24 +++++++++++++++------ + src/hb-ot-name.cc | 8 +++++-- + src/hb-utf.hh | 55 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 79 insertions(+), 8 deletions(-) + +commit 69f5da0629f1e5a307fc49fe58490aa92d1bd0e2 +Author: Behdad Esfahbod +Date: Tue Oct 23 20:30:40 2018 -0700 + + [name] More + + It assumes all names are encoded in UTF16-BE. Other than that, + and not + listing languages correctly, it's *supposed* to work. + + src/hb-dsalgs.hh | 21 +++++++++++++++++++++ + src/hb-ot-name-table.hh | 37 + ++++++++++++++++++++++++++++++------- + src/hb-ot-name.cc | 12 ++++++++---- + src/hb-ot-os2-unicode-ranges.hh | 10 +++++----- + src/hb-unicode.cc | 8 ++++---- + src/hb-unicode.hh | 2 +- + 6 files changed, 69 insertions(+), 21 deletions(-) + +commit 64334aff8c2ea5aa066d77a95844bc6f84efe725 +Author: Behdad Esfahbod +Date: Tue Oct 23 20:15:53 2018 -0700 + + [name] Fix check + + src/hb-ot-name.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5531bd068e759a5acb3b8d301c0ff9c64844166e +Author: Behdad Esfahbod +Date: Tue Oct 23 20:04:05 2018 -0700 + + [name] Flesh out UTF-X to UTF-X conversion routines + + src/hb-ot-name.cc | 84 ++++++++++++++++++++++++++++++++++++------ + src/hb-ot-name.h | 10 ++--- + src/hb-utf.hh | 107 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 182 insertions(+), 19 deletions(-) + +commit 84811a06a26508effe9f4a9eaf1be15297ecf0cb +Author: Behdad Esfahbod +Date: Tue Oct 23 03:16:03 2018 -0700 + + [name] Fix for rebase changes to hb_array_t + + src/hb-ot-name-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1046b1938b16ab6be861b0828b446fa13cf0377b +Author: Behdad Esfahbod +Date: Wed Oct 17 05:42:23 2018 -0700 + + [name] Some more + + src/hb-ot-name.cc | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +commit b4d4d1ea787c829dea023d99f974a38bdc3de0ae +Author: Behdad Esfahbod +Date: Tue Oct 16 19:55:17 2018 -0700 + + [name] Return full string length from API + + src/hb-ot-name.cc | 6 +++--- + src/hb-ot-name.h | 6 +++--- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 8d304ef7f9094a71fabc3efd87b37a030c437adf +Author: Behdad Esfahbod +Date: Tue Oct 16 19:04:48 2018 -0700 + + [utf] Add UTF16-BE and UTF32-BE + + src/hb-buffer.cc | 4 +-- + src/hb-utf.hh | 80 + ++++++++++++++++++++++++++++++++------------------------ + 2 files changed, 48 insertions(+), 36 deletions(-) + +commit a826a8730f21ae996ae8f4d12c44dc18b9e8e933 +Author: Behdad Esfahbod +Date: Tue Oct 16 13:06:56 2018 -0700 + + [name] Hide internal details from public API + + src/hb-ot-name-table.hh | 23 +++++++++++++---------- + src/hb-ot-name.h | 3 +-- + 2 files changed, 14 insertions(+), 12 deletions(-) + +commit e7c595a9f09ba1552b2de1f8d56cbdcf376b9cad +Author: Behdad Esfahbod +Date: Mon Oct 15 23:34:54 2018 -0700 + + [name] More + + src/hb-ot-name.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 75cd8c86bd9b0973864bb92e0244bf038980765e +Author: Behdad Esfahbod +Date: Mon Oct 15 23:32:08 2018 -0700 + + [name] Add hb_ot_name_get_utf() + + src/hb-ot-name.cc | 24 ++++++++++++++++++------ + 1 file changed, 18 insertions(+), 6 deletions(-) + +commit c783d36324dd1e2031d3387064afab1ce5d90b6f +Author: Behdad Esfahbod +Date: Mon Oct 15 23:28:49 2018 -0700 + + [name] Pre-allocate array + + src/hb-ot-name-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit c2aa409537c3e8a7b8592ef90f8304bd6588561d +Author: Behdad Esfahbod +Date: Mon Oct 15 23:09:28 2018 -0700 + + [name] Start implementing hb_ot_name_get_utf16() + + src/hb-ot-name-table.hh | 6 ++++-- + src/hb-ot-name.cc | 22 ++++++++++++++++++++++ + src/hb-ot-name.h | 8 ++++++-- + 3 files changed, 32 insertions(+), 4 deletions(-) + +commit 740cde8991283b8b4e1e77e022175251eb37d3d1 +Author: Behdad Esfahbod +Date: Mon Oct 15 23:00:27 2018 -0700 + + [name] Implement hb_bytes_t get_name() + + src/hb-ot-name-table.hh | 24 +++++------------------- + 1 file changed, 5 insertions(+), 19 deletions(-) + +commit c3425f2401dffb1f3b5bd6fdbc0c3e9aad0f4306 +Author: Behdad Esfahbod +Date: Mon Oct 15 22:53:40 2018 -0700 + + [name] Add hb-ot-name.cc for realz + + src/hb-ot-name.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 50 insertions(+) + +commit 90420ed8cb297f1ceff75f5a75c8fa7b6ea6f65e +Author: Behdad Esfahbod +Date: Mon Oct 15 22:48:48 2018 -0700 + + [name] Implement hb_ot_name_get_names() + + src/Makefile.sources | 1 + + src/hb-ot-name-table.hh | 3 +-- + src/hb-ot-name.h | 4 ++-- + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit 9a6c87c17d51fd57e4225c776a0fabbfd313f4f4 +Author: Behdad Esfahbod +Date: Mon Oct 15 22:42:04 2018 -0700 + + [name] Finish accelerator sorting + + src/hb-ot-name-table.hh | 61 + +++++++++++++++++++++++++++++++++++++++++-------- + src/hb-ot-name.h | 3 ++- + 2 files changed, 53 insertions(+), 11 deletions(-) + +commit 2157e56b34e7b932dd144ee3563f5bd682bbed30 +Author: Behdad Esfahbod +Date: Mon Oct 15 22:22:50 2018 -0700 + + [name] Start implementing public API infrastructure + + src/hb-ot-face.cc | 1 + + src/hb-ot-face.hh | 7 +++--- + src/hb-ot-name-table.hh | 60 + +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-name.h | 3 +++ + 4 files changed, 68 insertions(+), 3 deletions(-) + +commit 0bf93ec0fb549d838b0a246de02a95559a9b2772 +Author: Behdad Esfahbod +Date: Mon Oct 15 21:34:10 2018 -0700 + + [name] Add public API declarations + + src/hb-ot-name.h | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit 982c2f4a65d127e56e09e7ab583f84099b8136bb +Author: Behdad Esfahbod +Date: Fri Oct 26 15:40:12 2018 -0700 + + [indic/khmer/myanmar/use] Clarify clear_syllable + + No logic change. + + src/hb-ot-shape-complex-indic.cc | 3 ++- + src/hb-ot-shape-complex-khmer.cc | 4 +--- + src/hb-ot-shape-complex-myanmar.cc | 40 + ++++++++++++++++++-------------------- + src/hb-ot-shape-complex-use.cc | 22 +++++++++++++++------ + 4 files changed, 38 insertions(+), 31 deletions(-) + +commit 143ffe65aa7f20d6c53219905cbc2520d680b8dd +Author: Ebrahim Byagowi +Date: Fri Oct 26 12:14:30 2018 +0330 + + [fuzz] Add a new testcase + + ...z-testcase-minimized-hb-shape-fuzzer-5658272078495744 | Bin 0 -> + 2252 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 30f18039b3c0e5748101f8934ae82aebfc5a83f7 +Author: Ebrahim Byagowi +Date: Fri Oct 26 09:34:34 2018 +0330 + + [svg] Rename _svg_create_blob to _glyph_reference_blob_svg + + docs/harfbuzz-sections.txt | 2 ++ + src/dump-emoji.cc | 2 +- + src/hb-ot-color.cc | 4 ++-- + src/hb-ot-color.h | 2 +- + test/api/test-ot-color.c | 6 +++--- + 5 files changed, 9 insertions(+), 7 deletions(-) + +commit 5cb1ce868138a10c0663a18c3891bc717aa4bc64 +Author: Ebrahim Byagowi +Date: Thu Oct 25 22:39:58 2018 +0330 + + [svg] Collapse SVGDocumentIndex into SVG + + src/hb-ot-color-svg-table.hh | 54 + +++++++++++++++----------------------------- + src/hb-ot-color.cc | 2 +- + test/api/test-ot-color.c | 2 +- + 3 files changed, 20 insertions(+), 38 deletions(-) + +commit 4ceabb8c2126fe365303b8d69e667005276c0241 +Author: Ebrahim Byagowi +Date: Thu Oct 25 21:52:35 2018 +0330 + + [svg] Hide start_glyph and end_glyph from API + + src/dump-emoji.cc | 21 ++++++++------------- + src/hb-ot-color-svg-table.hh | 42 + ++++++++++++------------------------------ + src/hb-ot-color.cc | 9 ++------- + src/hb-ot-color.h | 5 +---- + test/api/test-ot-color.c | 11 ++--------- + 5 files changed, 25 insertions(+), 63 deletions(-) + +commit c7a4e3dfb5c8dd4f8faf08e327bb1900c0096cf6 +Author: Ebrahim Byagowi +Date: Tue Oct 23 18:00:48 2018 +0330 + + [svg] Add public API + + * hb_ot_color_has_svg + * hb_ot_color_glyph_svg_create_blob + + src/dump-emoji.cc | 51 +++++++++++++++---------- + src/hb-open-type.hh | 1 - + src/hb-ot-color-sbix-table.hh | 2 + + src/hb-ot-color-svg-table.hh | 86 + ++++++++++++++++++++++++++++++++----------- + src/hb-ot-color.cc | 53 ++++++++++++++++++++++---- + src/hb-ot-color.h | 13 +++++++ + src/hb-ot-face.cc | 2 + + src/hb-ot-face.hh | 4 +- + src/hb-ot-layout.cc | 4 -- + test/api/test-ot-color.c | 43 +++++++++++++++++++--- + 10 files changed, 199 insertions(+), 60 deletions(-) + +commit e98af6d1eda33346f72de8a45fbd317fc0e15935 +Author: Behdad Esfahbod +Date: Thu Oct 25 22:25:29 2018 -0700 + + [layout] Try to speed up collect_lookups some more + + Barely made a dent :(. + + src/hb-ot-layout-common.hh | 2 ++ + src/hb-ot-layout.cc | 23 ++++------------------- + 2 files changed, 6 insertions(+), 19 deletions(-) + +commit eb44bfc864f91c0c833c3156475d191ac1b79c72 +Author: Behdad Esfahbod +Date: Thu Oct 25 21:42:19 2018 -0700 + + [layout] Memoize collect_features + + Fixes https://github.com/harfbuzz/harfbuzz/pull/1317 + Fixes https://oss-fuzz.com/v2/testcase-detail/6543700493598720 + + src/hb-ot-layout.cc | 55 + ++++++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 48 insertions(+), 7 deletions(-) + +commit 84098b1639775aea5bf3f5d91fa6e657b612ce3a +Author: Behdad Esfahbod +Date: Thu Oct 25 21:33:12 2018 -0700 + + [layout] Remove unintentionally added code + + src/hb-ot-layout-common.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 941600a9e06309f148d51403fa07dc56ce542572 +Author: Behdad Esfahbod +Date: Thu Oct 25 21:26:08 2018 -0700 + + [layout] Add hb_collect_features_context_t + + Towards https://github.com/harfbuzz/harfbuzz/pull/1317 + + src/hb-ot-layout.cc | 66 + +++++++++++++++++++++++++++++------------------------ + 1 file changed, 36 insertions(+), 30 deletions(-) + +commit c237cdfcc74d33f77b2399b4d08228c2fcf50df5 +Author: Behdad Esfahbod +Date: Thu Oct 25 21:17:30 2018 -0700 + + [lookup] Fold another function inline + + src/hb-ot-layout.cc | 48 +++++++++++++++++++++--------------------------- + 1 file changed, 21 insertions(+), 27 deletions(-) + +commit fe5520ddea3941f7a72888d908fd2b895e2f388e +Author: Behdad Esfahbod +Date: Thu Oct 25 20:58:34 2018 -0700 + + [layout] More prep work to memoize collect_features() work + + src/hb-ot-layout.cc | 62 + ++++++++++++++++++++--------------------------------- + 1 file changed, 23 insertions(+), 39 deletions(-) + +commit e8e67503ff0a50eb10ad410d6a76a282ea494cf4 +Author: Behdad Esfahbod +Date: Thu Oct 25 20:48:20 2018 -0700 + + [lookup] More prep work for memoizing collect_features + + https://github.com/harfbuzz/harfbuzz/pull/1317 + + src/hb-ot-layout-common.hh | 2 ++ + src/hb-ot-layout.cc | 83 + +++++++++++++++++++++------------------------- + 2 files changed, 40 insertions(+), 45 deletions(-) + +commit 96828b97a8fc2c50721ce040bdde63c462908791 +Author: Behdad Esfahbod +Date: Thu Oct 25 20:34:29 2018 -0700 + + [layout] Minor + + We were returning the accelerator's lookup count. Returns table's. + They are the same except for OOM cases. Just shorter code. + + src/hb-ot-layout.cc | 14 +------------- + 1 file changed, 1 insertion(+), 13 deletions(-) + +commit 73449cd213c3a12468e99b9c3d840fc60a334902 +Author: Behdad Esfahbod +Date: Thu Oct 25 20:32:05 2018 -0700 + + [layout] Fold one function inline + + Preparation for fixing https://github.com/harfbuzz/harfbuzz/pull/1317 + + src/hb-ot-layout.cc | 22 +++------------------- + 1 file changed, 3 insertions(+), 19 deletions(-) + +commit ba5ca6a762cb46a17f41673b14996a12e6cfe3d1 +Author: Behdad Esfahbod +Date: Thu Oct 25 17:41:26 2018 -0700 + + [morx] Use deleted-glyph, instead of actual deletion, in Ligation + + Closer to what CoreText does. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1302 + + src/hb-aat-layout-morx-table.hh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 5c272e3613667ca532f32764824784c63d797f57 +Author: Behdad Esfahbod +Date: Thu Oct 25 17:36:33 2018 -0700 + + [morx] Remove deleted-glyph at the end of processing + + src/hb-aat-layout-morx-table.hh | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit 1bb8ed86d6cfec0fc87c8e1930d9a86426b42001 +Author: Behdad Esfahbod +Date: Thu Oct 25 17:33:48 2018 -0700 + + [aat] Minor + + src/hb-aat-layout-common.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 102af615f15d04da20c17d80eb38f5948020f9ac +Author: Behdad Esfahbod +Date: Thu Oct 25 17:29:32 2018 -0700 + + [aat] Start adding support for DELETED-GLYPH + + https://github.com/harfbuzz/harfbuzz/issues/1302 + + src/hb-aat-layout-common.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 955aa56b11e4fa14bc6d5b1b56cb810e28fab6cd +Author: Behdad Esfahbod +Date: Thu Oct 25 16:50:38 2018 -0700 + + [vector] Make it act more like pointer + + Add pointer cast operator and plus operator. + + src/hb-coretext.cc | 2 +- + src/hb-machinery.hh | 2 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-set.hh | 8 ++++---- + src/hb-subset.cc | 2 +- + src/hb-uniscribe.cc | 12 ++++++------ + src/hb-vector.hh | 6 ++++++ + 7 files changed, 20 insertions(+), 14 deletions(-) + +commit 8d55e2adef9a376a5cf83c20aff2dba27dd64da8 +Author: Behdad Esfahbod +Date: Thu Oct 25 16:37:53 2018 -0700 + + [set] Minor + + src/hb-set.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 64c32edfe18f5ef3b348e5c84077ee1f6faf4f48 +Author: Behdad Esfahbod +Date: Thu Oct 25 16:35:36 2018 -0700 + + [set] Make array access more explicit + + Follow up on 94e421abbfc7ede9aaf3c8d86bb0ff9992ea3123 + + src/hb-set.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e3ceb2dde3525824de68914e12ad4e8a873ab90a +Author: Behdad Esfahbod +Date: Thu Oct 25 14:30:24 2018 -0700 + + Fix again + + test/shaping/data/in-house/fonts/DFONT.dfont | Bin 0 -> 3505 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit eceeb85666814023f57ee3517bbb304830a60c55 +Author: Ebrahim Byagowi +Date: Fri Oct 26 00:23:45 2018 +0330 + + [docs] Add hb-ot-color section + + docs/harfbuzz-sections.txt | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +commit be746009e9b7063dcb57e30e342f9410387ef8b6 +Author: Michiharu Ariza +Date: Thu Oct 25 13:40:40 2018 -0700 + + dropped support of legacy CFF CharString ops + + along with test & font + + src/hb-cff1-interp-cs.hh | 135 + +------------------------------------- + test/api/fonts/cff1_legacyops.otf | Bin 3104 -> 0 bytes + test/api/test-ot-extents-cff.c | 23 ------- + 3 files changed, 1 insertion(+), 157 deletions(-) + +commit 1cfe702872058ebc50d6cb5543daa38fb3a7ebfb +Author: Behdad Esfahbod +Date: Thu Oct 25 13:37:08 2018 -0700 + + Fixup + + test/shaping/data/in-house/fonts/{TRAK.tff => TRAK.ttf} | Bin + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 5739c876d0d080e7feaefd323245702c663f33be +Author: Behdad Esfahbod +Date: Thu Oct 25 13:23:33 2018 -0700 + + [test] Rename some fonts + + If we have duplicae font files in different directories, that would + break the oss-fuzz build currently. So, rename some to avoid + name class with text-rendering-test. Would be better to find + another solution. + + ...TestMORXTwentyeight.ttf => MORXTwentyeight.ttf} | Bin + .../data/in-house/fonts/{TestTRAK.ttf => TRAK.tff} | Bin + .../data/in-house/fonts/{TestTTC.ttc => TTC.ttc} | Bin + test/shaping/data/in-house/fonts/TestDFONT.dfont | Bin 3505 -> 0 bytes + test/shaping/data/in-house/tests/aat-morx.tests | 2 +- + test/shaping/data/in-house/tests/aat-trak.tests | 22 + ++++++++++----------- + test/shaping/data/in-house/tests/collections.tests | 12 +++++------ + 7 files changed, 18 insertions(+), 18 deletions(-) + +commit 21ede867df28d1214ca677a24ac65ab0b7e95f42 +Author: Behdad Esfahbod +Date: Thu Oct 25 13:19:34 2018 -0700 + + Fix possible overflow in bsearch impls + + From bungeman. + + Fixes https://github.com/harfbuzz/harfbuzz/pull/1314 + + src/hb-dsalgs.hh | 2 +- + src/hb-open-type.hh | 4 ++-- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-vector.hh | 2 +- + 5 files changed, 6 insertions(+), 6 deletions(-) + +commit 2ebf36010206cebdbe58bab6edf4e3bc011b6479 +Merge: 36c2c374 94e421ab +Author: Michiharu Ariza +Date: Thu Oct 25 13:05:06 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 94e421abbfc7ede9aaf3c8d86bb0ff9992ea3123 +Author: Ben Wagner +Date: Thu Oct 25 13:44:27 2018 -0400 + + Remove some use of Crap in hb-set. + + When hb_set_t::page_for_insert needs to insert at the end of the + page_map + it ends up evaluating '&page_map[i + 1]' which has hb_vector return an + lvalue of a Crap so that nothing can be moved to its address. This + turns + into issues with ThreadSanitizer on Crap when two threads modify + different + hb_set_t instances. This can be avoided by using '&page_map[i] + 1' + instead. + + src/hb-set.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2798ac1c28edc4ba6f2283784d1027393f588f8c +Author: azure-pipelines[bot] + +Date: Thu Oct 25 15:22:54 2018 +0000 + + Set up CI with Azure Pipelines + + azure-pipelines.yml | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit 9a830a17318446dab86e1439f7167d8a698eb856 +Author: Khaled Hosny +Date: Thu Oct 25 01:55:10 2018 +0200 + + [appveyor] Drop Cygwin builds again + + They are so slow and we had only a couple of Cygwin build failure + reported in ~5 years. + + appveyor.yml | 11 ----------- + 1 file changed, 11 deletions(-) + +commit 00e51a10832965f4c1d65a6d71c9582782f02c2b +Author: Khaled Hosny +Date: Wed Oct 24 22:58:22 2018 +0200 + + [appveyor] Limit make to three jobs + + https://github.com/harfbuzz/harfbuzz/pull/1309#issuecomment-432778270 + + appveyor.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ae9e8f292b2ad79b01776ae5785a94afbfc4b3e4 +Author: Behdad Esfahbod +Date: Wed Oct 24 16:46:07 2018 -0700 + + [vowel-constraints] Reset continuation on all dottedcircles + + One of the was missed before. Not intentional. + + src/gen-vowel-constraints.py | 9 +++++++-- + src/hb-ot-shape-complex-vowel-constraints.cc | 9 +++++++-- + 2 files changed, 14 insertions(+), 4 deletions(-) + +commit d2b20ba18dfe3fe507ee7cb64fd73e3f1e1e5ae0 +Author: Khaled Hosny +Date: Wed Oct 24 11:37:09 2018 +0200 + + [appveyor] Build on Cygwin and msys2 in parallel + + appveyor.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0d2fa7fd4c4df0dcf7800b1267d1126e5a4b1ab1 +Author: Khaled Hosny +Date: Wed Oct 24 11:23:21 2018 +0200 + + [appveyor] Do not update msys2 + + Looks like AppVeyor has new enough packages for our needs. Cuts + CI build + time by 5 minutes. + + appveyor.yml | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 6a3ad245609ce8496d08404b28217dca8d01c10b +Author: Khaled Hosny +Date: Wed Oct 24 09:49:08 2018 +0200 + + [appveyor] Organize config file a bit + + appveyor.yml | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 0cd7d041d83ae28e8c7d8a156750464af76de291 +Author: Khaled Hosny +Date: Wed Oct 24 09:43:10 2018 +0200 + + [appveyor] Don’t build branches with open PR twice + + appveyor.yml | 3 +++ + 1 file changed, 3 insertions(+) + +commit 401cdf07922f66c762dabfd8e3d45c35e33de7c0 +Author: Behdad Esfahbod +Date: Tue Oct 23 17:00:49 2018 -0700 + + [ot-font] Fix sign of ascent/descent + + Some fonts, like msmincho, have positive number as descent + in vhea table. That's wrong. Just enforce sign on ascent/descent + when reading both horizontal and vertical metrics. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1248 + + src/hb-ot-hmtx-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ba502dea1e81981f3893b5353400909bf60e354f +Author: Behdad Esfahbod +Date: Tue Oct 23 16:46:10 2018 -0700 + + [morx] Fix cluster-merging when ligating + + Only merge when actual ligature happened. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1305 + + src/hb-aat-layout-morx-table.hh | 7 ++++--- + test/shaping/data/in-house/Makefile.sources | 1 + + test/shaping/data/in-house/fonts/TestMORXTwentyeight.ttf | Bin 0 -> + 2660 bytes + test/shaping/data/in-house/tests/aat-morx.tests | 1 + + 4 files changed, 6 insertions(+), 3 deletions(-) + +commit aa5af8d041521507f8bc8ded8a365ee56098388c +Author: Garret Rieger +Date: Tue Oct 23 15:45:35 2018 -0700 + + Fix size calculation in DEFINE_SIZE_ARRAY_SIZED. + + src/hb-machinery.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 36c2c374bf9c2d0ca903e601760e69bfc3da5388 +Author: Michiharu Ariza +Date: Tue Oct 23 15:11:09 2018 -0700 + + removed unused multi_val from DictVal + + src/hb-cff-interp-common.hh | 16 ---------------- + src/hb-cff-interp-dict-common.hh | 3 --- + src/hb-ot-cff1-table.hh | 2 +- + src/hb-ot-cff2-table.hh | 1 - + 4 files changed, 1 insertion(+), 21 deletions(-) + +commit f33ad6d69216a983624e832177895481549bdc07 +Author: Behdad Esfahbod +Date: Tue Oct 23 14:31:51 2018 -0700 + + [aat] Fix up previous commit and add files + + src/hb-aat-map.cc | 62 +++++++++++++++++++++++++++++++ + src/hb-aat-map.hh | 106 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-map.cc | 1 + + src/hb-ot-shape.cc | 15 ++++++-- + 4 files changed, 181 insertions(+), 3 deletions(-) + +commit ffe347844803a6a9036d8357b744a982f5e5a6c9 +Author: Behdad Esfahbod +Date: Tue Oct 23 14:14:03 2018 -0700 + + [aat] Allow enabling/disabling features + + Only works at entire-buffer range, not sub-ranges. + + Test with: + + $ hb-shape Zapfino.dfont Zapfino + [Z_a_p_f_i_n_o=0+2333] + + $ hb-shape Zapfino.dfont Zapfino --features=-dlig + [Z=0+416|a=1@-21,0+264|p_f=2+433|i=4+181|n=5+261|o=6+250] + + $ hb-shape Zapfino.dfont Zapfino --features=+dlig + [Z_a_p_f_i_n_o=0+2333] + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1303 + + src/Makefile.sources | 2 ++ + src/hb-aat-layout-morx-table.hh | 29 +++++++++++++++++++++++++---- + src/hb-aat-layout.cc | 8 ++++++++ + src/hb-aat-layout.hh | 3 +++ + src/hb-ot-shape.cc | 4 ++++ + src/hb-ot-shape.hh | 5 +++++ + 6 files changed, 47 insertions(+), 4 deletions(-) + +commit 8be0e5fd4540b18e26b28b414bd99af3bb1548b1 +Author: Behdad Esfahbod +Date: Tue Oct 23 13:39:50 2018 -0700 + + [ot-map] Minor + + src/hb-ot-map.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e8fccbc36b2cc5e1c9f218c83cad7f606c03e7a1 +Author: Behdad Esfahbod +Date: Tue Oct 23 13:25:03 2018 -0700 + + Minor + + src/hb-ot-map.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 76324d95caa4b83cd4b515f516c2d3674455ea5e +Author: Behdad Esfahbod +Date: Tue Oct 23 13:09:30 2018 -0700 + + Shift code around + + src/hb-ot-shape.cc | 18 ++++++++++-------- + src/hb-ot-shape.hh | 9 +++------ + 2 files changed, 13 insertions(+), 14 deletions(-) + +commit e1241636d60a63cbfd741288716b55797a4dc8ee +Merge: 960267fc cf92d657 +Author: Michiharu Ariza +Date: Tue Oct 23 11:25:51 2018 -0700 + + Merge branch 'master' into cff-subset + +commit cf92d6579e91d326598dcff93457fe85dfa962c2 +Author: Behdad Esfahbod +Date: Tue Oct 23 03:10:56 2018 -0700 + + [trak] Allow disabling tracking for ranges of text + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1303 + + src/hb-aat-layout-trak-table.hh | 4 ++++ + src/hb-ot-shape.cc | 11 +++++++---- + src/hb-ot-shape.hh | 5 ++++- + test/shaping/data/in-house/tests/aat-trak.tests | 1 + + 4 files changed, 16 insertions(+), 5 deletions(-) + +commit 8869436cb8a338b46c138305966a4b7b2c3ee374 +Author: Behdad Esfahbod +Date: Tue Oct 23 03:07:48 2018 -0700 + + When parsing feature ranges, accept ';' instead of ':' + + src/hb-common.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 22ecefd88e1ea1841f363057b948aa792ac871a6 +Author: Ebrahim Byagowi +Date: Tue Oct 23 00:52:05 2018 +0330 + + Make tracking optout possible using 'trak' ot feature + + So '--features=-trak' or 'font-feature-settings: 'trak' 0;' + can prevent + applying of tracking if used. + + src/hb-ot-shape.cc | 10 +++++++--- + test/shaping/data/in-house/tests/aat-trak.tests | 2 ++ + 2 files changed, 9 insertions(+), 3 deletions(-) + +commit 6d40eb8372a2c74a6e1294b44a2b19c99d11e7da +Author: Behdad Esfahbod +Date: Tue Oct 23 02:51:42 2018 -0700 + + Touch up on previous commit + + https://github.com/harfbuzz/harfbuzz/pull/1273 + + src/HBIndicVowelConstraints.txt | 97 ++++++ + src/Makefile.am | 6 +- + src/Makefile.sources | 1 + + src/gen-vowel-constraints.py | 124 ++------ + src/hb-ot-shape-complex-indic.cc | 10 +- + src/hb-ot-shape-complex-use.cc | 11 +- + src/hb-ot-shape-complex-vowel-constraints.cc | 433 + ++++++++++++++++++++++++++ + src/hb-ot-shape-complex-vowel-constraints.hh | 447 + ++------------------------- + 8 files changed, 606 insertions(+), 523 deletions(-) + +commit 205737acdc268b1c90cf00bde2d2038519a8bf48 +Author: David Corbett +Date: Fri Oct 12 16:54:54 2018 -0400 + + [use] Prohibit visually ambiguous vowel sequences + + src/Makefile.am | 7 +- + src/Makefile.sources | 1 + + src/gen-vowel-constraints.py | 286 ++++++++++++++ + src/hb-ot-shape-complex-indic.cc | 272 +------------ + src/hb-ot-shape-complex-use.cc | 3 +- + src/hb-ot-shape-complex-vowel-constraints.hh | 434 + +++++++++++++++++++++ + test/shaping/README.md | 4 +- + .../46669c8860cbfea13562a6ca0d83130ee571137b.ttf | Bin 0 -> 7184 bytes + .../in-house/tests/use-vowel-letter-spoofing.tests | 94 +++++ + 9 files changed, 827 insertions(+), 274 deletions(-) + +commit 48ed598a356983f4623029dd5e87254fb59e3691 +Author: Behdad Esfahbod +Date: Tue Oct 23 02:19:32 2018 -0700 + + [VORG] Hook up to hb-ot-font's v_origin + + Fixes https://github.com/harfbuzz/harfbuzz/issues/544 + + Test added with NotoSansCJK, eg. with U+FF38. + + src/hb-ot-face.cc | 1 - + src/hb-ot-font.cc | 11 + +++++++++-- + src/hb-ot-vorg-table.hh | 6 ++++-- + .../fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf | Bin 0 -> + 2808 bytes + test/shaping/data/in-house/tests/vertical.tests | 1 + + 5 files changed, 14 insertions(+), 5 deletions(-) + +commit 097ecfd4a991d4fa306bab7330d9952966e94d1f +Author: Behdad Esfahbod +Date: Tue Oct 23 02:09:42 2018 -0700 + + [VORG] Add get_y_origin() + + Unhooked. + + src/hb-ot-vorg-table.hh | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +commit 6fb24d5e3e0cf61c0ed3574e5bcf4598a13d6b69 +Author: Behdad Esfahbod +Date: Tue Oct 23 01:58:59 2018 -0700 + + [VORG] Add VORG table + + Cherry-picked from cff-subset branch. + + src/Makefile.sources | 1 + + src/hb-ot-face.cc | 1 + + src/hb-ot-face.hh | 1 + + src/hb-ot-vorg-table.hh | 168 + ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 171 insertions(+) + +commit 531f9822b2e8a60f03c43d6f86ef9ed32c951f0e +Author: Behdad Esfahbod +Date: Tue Oct 23 01:32:08 2018 -0700 + + [morx] Add a few debug messages to Ligature chain + + src/hb-aat-layout-morx-table.hh | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 0e5bcdef7fb592f986ad5b4e07b80d2efb5e3344 +Author: Behdad Esfahbod +Date: Tue Oct 23 00:39:44 2018 -0700 + + [morx] Clear stack upon underflow when acting ligatures + + src/hb-aat-layout-morx-table.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 1bfb96a9c8d7653f0dee5c5fab3c6e85cea900cd +Author: Behdad Esfahbod +Date: Mon Oct 22 23:41:47 2018 -0700 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/Makefile.sources | 2 +- + .../data/text-rendering-tests/fonts/TestTRAKOne.ttf | Bin 0 -> + 1752 bytes + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 792071de4075cb9af0793f0d7c70da0780923bb6 +Author: Behdad Esfahbod +Date: Mon Oct 22 23:38:34 2018 -0700 + + [morx] Leave ligature on stack after ligating + + Test with Apple Color Emoji.ttf of ~66MB and following sequence: + + ./hb-shape Apple\ Color\ Emoji-old.ttf --font-funcs=ot -u + U+1F468,200d,U+1F469,200d,U+1F467,200d,1f466 + + Should form full family if matching works correctly. It first makes + family of three, then makes family of four out of that and the last + two characters. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1292 + + src/hb-aat-layout-morx-table.hh | 1 - + 1 file changed, 1 deletion(-) + +commit e1b8e933f099efae3c3e1f5706be19120b44de20 +Author: Ebrahim Byagowi +Date: Tue Oct 23 09:23:48 2018 +0330 + + [ci] Disable llvm-gcc + + #define Null(Type) Null::value>::value>() + + raises: + hb-blob.cc: In function 'hb_blob_t* hb_blob_get_empty()': + hb-blob.cc:194: error: using 'typename' outside of template + hb-blob.cc:194: error: using 'typename' outside of template + + Removing "typename"s fixes the issue but makes newer compiler fail + apparently. + + Probably downstream can patch that locally till we get a solution. + + .circleci/config.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8c78ced95b639730efd0edc521e4e81ad50af501 +Author: Behdad Esfahbod +Date: Mon Oct 22 21:49:42 2018 -0700 + + Unbreak builds + + src/hb-dsalgs.hh | 2 +- + src/hb-open-type.hh | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 8d689f8a7bccda861bcb286d52f1a90fca52df0f +Author: Behdad Esfahbod +Date: Mon Oct 22 21:33:18 2018 -0700 + + Add hb_array<>() specialization for UnsizedArrayOf + + Related https://github.com/harfbuzz/harfbuzz/issues/1301 + + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-open-file.hh | 2 +- + src/hb-open-type.hh | 8 ++++++++ + src/hb-ot-color-cpal-table.hh | 6 +++--- + 4 files changed, 13 insertions(+), 5 deletions(-) + +commit abfbba191141c3e3cf2a391f365b5323f9dc37c0 +Author: Behdad Esfahbod +Date: Mon Oct 22 21:27:45 2018 -0700 + + Add hb_array<>() + + Simplifies transient object creation. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1301 + + src/hb-aat-layout-trak-table.hh | 2 +- + src/hb-dsalgs.hh | 2 ++ + src/hb-open-file.hh | 3 +-- + src/hb-ot-color-cpal-table.hh | 6 +++--- + 4 files changed, 7 insertions(+), 6 deletions(-) + +commit 17ffbc070ff4190d8ebaf88f8db62f19e6fa370d +Author: Behdad Esfahbod +Date: Mon Oct 22 21:22:25 2018 -0700 + + [color] Use Index for colorIdx + + Doesn't matter, but matches the description. + + src/hb-ot-color-colr-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 07386ea410af13e8fc844eb939a6c6e47c2adaf1 +Author: Behdad Esfahbod +Date: Mon Oct 22 21:18:27 2018 -0700 + + Remove const and references when binding Null() + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1299 + + Removes anomaly I was seeing in cpal table trying to use implicit + Null(NameID). + + src/hb-atomic.hh | 5 +---- + src/hb-common.cc | 2 +- + src/hb-ft.cc | 2 +- + src/hb-null.hh | 4 ++-- + src/hb-open-type.hh | 6 ++---- + src/hb-ot-color-cpal-table.hh | 8 ++------ + src/hb-static.cc | 1 - + src/hb.hh | 9 +++++++++ + 8 files changed, 18 insertions(+), 19 deletions(-) + +commit b18acab7bce062fef397d3d8b0efc7826f473b50 +Author: Behdad Esfahbod +Date: Mon Oct 22 18:20:57 2018 -0700 + + [color] Add HB_COLOR + + Normally I would have added to_string / from_string like other types + have. But since we don't use hb_color_t much, I'm not going to + do that. + Although, if we did, we could use it in hb-view to parse colors... + + src/hb-common.h | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 228f96c9d09272c8f677935a640e75e173b817a3 +Author: Behdad Esfahbod +Date: Mon Oct 22 16:55:12 2018 -0700 + + [color] Finish reviewing / revamping CPAL + + Now to hb_color_t. + + src/hb-ot-color-cpal-table.hh | 52 + ++++++++++++++++++++++--------------------- + src/hb-ot-color.cc | 33 +++++---------------------- + src/hb-ot-color.h | 10 ++++----- + 3 files changed, 38 insertions(+), 57 deletions(-) + +commit 960267fc4315a138f0963e78407e3af2ec6007af +Author: Michiharu Ariza +Date: Mon Oct 22 16:37:39 2018 -0700 + + fix build attempt ^4 + + src/hb-ot-cff-common.hh | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 683fad062792a199e2fe86fe161f41b9389d08c3 +Author: Behdad Esfahbod +Date: Mon Oct 22 16:35:03 2018 -0700 + + [color] Minor + + src/hb-ot-color.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 14474d21040bf9b025b53bb9b0df599eaf260119 +Author: Behdad Esfahbod +Date: Mon Oct 22 16:30:30 2018 -0700 + + [color] Rely on CPALV1Tail Null object + + src/hb-ot-color-cpal-table.hh | 39 + ++++++++++++++------------------------- + 1 file changed, 14 insertions(+), 25 deletions(-) + +commit d7865107ea4664e04c03a1d79678cdcadc0d5ea5 +Author: Behdad Esfahbod +Date: Mon Oct 22 16:18:34 2018 -0700 + + Remove const from hb_array_t details + + Will come in through if desired. + + src/hb-aat-layout-trak-table.hh | 6 +++--- + src/hb-dsalgs.hh | 6 +++--- + src/hb-open-file.hh | 4 ++-- + 3 files changed, 8 insertions(+), 8 deletions(-) + +commit f3336580dd0c6959a1871f92b4a37f7c0a4b2160 +Author: Behdad Esfahbod +Date: Mon Oct 22 16:16:21 2018 -0700 + + [color] Use hb_array_t in CPAL + + Doesn't work though, ouch :(. Need to figure out if it's unreasonable + to expect Null(T) inside hb_array_t to see the later specialization + of Null for NameID. + + src/hb-open-type.hh | 3 ++- + src/hb-ot-color-cpal-table.hh | 47 + ++++++++++++++++++++++--------------------- + src/hb-static.cc | 1 + + 3 files changed, 27 insertions(+), 24 deletions(-) + +commit 5ae18855d115577ff796158d483db7b890d9956f +Author: Behdad Esfahbod +Date: Mon Oct 22 14:54:55 2018 -0700 + + [color] Check for null CPAL arrays + + We cannot use a nullable offset here though. + + src/hb-ot-color-cpal-table.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 69ab72e4aa7cbf197873d38f7e623866b4e40502 +Author: Behdad Esfahbod +Date: Mon Oct 22 14:51:40 2018 -0700 + + [color] More CPAL rename + + src/hb-ot-color-cpal-table.hh | 104 + +++++++++++++++++++++--------------------- + src/hb-ot-color.cc | 6 +-- + 2 files changed, 54 insertions(+), 56 deletions(-) + +commit 0befb06c468aa36f3337b5ef2235f6d69dda8397 +Author: Behdad Esfahbod +Date: Mon Oct 22 14:46:21 2018 -0700 + + [color] More CPAL rename + + src/hb-ot-color-cpal-table.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 3600d206037ef23d6448c79a3f010c4f903a971c +Author: Behdad Esfahbod +Date: Mon Oct 22 14:43:12 2018 -0700 + + [color] Rename vars in CPAL + + src/hb-ot-color-cpal-table.hh | 32 ++++++++++++++++---------------- + src/hb-ot-color.cc | 1 + + 2 files changed, 17 insertions(+), 16 deletions(-) + +commit ba055a8d53595ab49747ed3e02d90c9b6a3cf4f3 +Author: Michiharu Ariza +Date: Mon Oct 22 16:20:04 2018 -0700 + + fix build attempt ^3 + + test/api/test-ot-extents-cff.c | 2 +- + test/api/test-subset-cff1.c | 1 + + test/api/test-subset-cff2.c | 1 + + 3 files changed, 3 insertions(+), 1 deletion(-) + +commit b11032afaefb2c84f9a4bbffe95c91f6374df802 +Author: Michiharu Ariza +Date: Mon Oct 22 15:52:37 2018 -0700 + + fix build attempt ^2 + + src/hb-ot-cff-common.hh | 2 +- + test/api/test-ot-extents-cff.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 3d3df5575c5be0e3c69b99ca1d8df2cea1672aaf +Author: Michiharu Ariza +Date: Mon Oct 22 15:23:39 2018 -0700 + + fix build attempt + + src/hb-ot-cff-common.hh | 5 ++++- + test/api/test-ot-extents-cff.c | 11 +++++------ + test/api/test-subset-cff1.c | 19 +++++++++---------- + test/api/test-subset-cff2.c | 11 +++++------ + 4 files changed, 23 insertions(+), 23 deletions(-) + +commit 0babf761c986855f9cdd1a2679380ee6a02390c8 +Author: Ebrahim Byagowi +Date: Tue Oct 23 01:33:45 2018 +0330 + + Adopt dump-emoji with latest unreleased APIs changes (#1297) + + src/dump-emoji.cc | 24 +++++++++++------------- + 1 file changed, 11 insertions(+), 13 deletions(-) + +commit 7997144b5f08c81b2cce2c7c2a085fb7eeb506e3 +Author: Behdad Esfahbod +Date: Mon Oct 22 13:02:04 2018 -0700 + + [color] Revamp palette API + + src/hb-ot-color.cc | 81 ++++++++++++++--------------- + src/hb-ot-color.h | 26 +++++----- + test/api/test-ot-color.c | 130 + +++++++++++++++++++++++------------------------ + 3 files changed, 117 insertions(+), 120 deletions(-) + +commit 3bf91bd2690cda34a7687ed5465dc4bb0672f2b6 +Author: Behdad Esfahbod +Date: Mon Oct 22 12:40:38 2018 -0700 + + [color] Rewrite colr access + + COLR table has one function: return layers for a glyph, and we + expose exactly + that, so should just wire it through. Also use sub_array() for + verifiable + safety. + + Also, BaseGlyphRecord's null object is enough. We don't need to + special-case + the not-found. + + src/hb-dsalgs.hh | 11 +++++++++ + src/hb-open-type.hh | 2 +- + src/hb-ot-color-colr-table.hh | 53 + +++++++++++++++++++++++-------------------- + src/hb-ot-color.cc | 19 +--------------- + 4 files changed, 41 insertions(+), 44 deletions(-) + +commit 1de17bdb80b0668f4d4a4700e3f80c8caee3303d +Author: Behdad Esfahbod +Date: Mon Oct 22 10:29:01 2018 -0700 + + [colr] Add hb_ot_color_layer_t + + We never return parallel arrays from functions. That's inconvenient + and hard to bind. + + src/hb-ot-color.cc | 18 ++++++++---------- + src/hb-ot-color.h | 22 ++++++++++++++++------ + test/api/test-ot-color.c | 33 +++++++++++++++------------------ + 3 files changed, 39 insertions(+), 34 deletions(-) + +commit 3b3668acc8b16afacb96d8c525eff603ef5f411f +Author: Behdad Esfahbod +Date: Sun Oct 21 19:23:11 2018 -0700 + + [color] Rename / reorder a bit + + Implement has_data() for realz. + + src/hb-ot-color-colr-table.hh | 2 ++ + src/hb-ot-color-cpal-table.hh | 2 ++ + src/hb-ot-color.cc | 78 + ++++++++++++++++++++++++------------------- + src/hb-ot-color.h | 33 ++++++++++++------ + test/api/test-ot-color.c | 30 ++++++++--------- + 5 files changed, 85 insertions(+), 60 deletions(-) + +commit 570b77f7d2b41262ccb20fadbee2c6b455cd06c6 +Merge: 857c5827 d440c8d3 +Author: Michiharu Ariza +Date: Mon Oct 22 13:06:47 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 9085a72deb041cf10edfa61d24b7c25f947f736b +Author: Behdad Esfahbod +Date: Sun Oct 21 19:08:25 2018 -0700 + + [cpal] Touch up palette flags + + src/hb-ot-color.h | 16 ++++++++++------ + test/api/test-ot-color.c | 4 ++-- + 2 files changed, 12 insertions(+), 8 deletions(-) + +commit ee11fae9d0d2c16a3a4b4ecf5cf328ffe950bb03 +Author: Behdad Esfahbod +Date: Sun Oct 21 19:02:47 2018 -0700 + + [color] Rename "gid" to "glyph" + + We don't expose "gid" in API. + + src/hb-ot-color.cc | 12 ++++++------ + src/hb-ot-color.h | 8 ++++---- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit 228fa71bf9186faedff48b3a259d696c7c07b5b5 +Author: Behdad Esfahbod +Date: Sun Oct 21 17:43:29 2018 -0700 + + [colr] Move sanitize + + src/hb-ot-color-colr-table.hh | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +commit d440c8d3fbb907f17b1eb9287918009ced27a8c1 +Author: Ebrahim Byagowi +Date: Mon Oct 22 22:07:59 2018 +0330 + + Add chromacheck Emoji test fonts and minor preparations (#1294) + + src/hb-ot-color.cc | 26 ++++++++++++++++++++++++++ + src/hb-ot-face.hh | 8 +++++--- + test/api/fonts/README | 2 ++ + test/api/fonts/chromacheck-cbdt.ttf | Bin 0 -> 792 bytes + test/api/fonts/chromacheck-colr.ttf | Bin 0 -> 652 bytes + test/api/fonts/chromacheck-sbix.ttf | Bin 0 -> 864 bytes + test/api/fonts/chromacheck-svg.ttf | Bin 0 -> 792 bytes + test/api/hb-test.h | 2 +- + test/api/test-ot-color.c | 21 +++++++++++++++++++++ + 9 files changed, 55 insertions(+), 4 deletions(-) + +commit 857c58279e82897ed69e8ade2f736073fa12883b +Merge: 51fba41c b92b9d7e +Author: Michiharu Ariza +Date: Mon Oct 22 09:57:20 2018 -0700 + + Merge branch 'master' into cff-subset + +commit b92b9d7e5290eaa83e94fd40cddaee71628a3c2a +Author: Behdad Esfahbod +Date: Sun Oct 21 17:42:51 2018 -0700 + + [colr] Move compare function into a static + + Not sure if MSVC would be unhappy about this. + + src/hb-ot-color-colr-table.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit b6b171732a12b396a704984699bd0da906f5dc24 +Author: Behdad Esfahbod +Date: Sun Oct 21 17:41:49 2018 -0700 + + [colr] Minor + + src/hb-ot-color-colr-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit a6ade3471e730d7a8b56e4ed706a8eb126e957f6 +Author: Behdad Esfahbod +Date: Sun Oct 21 17:39:39 2018 -0700 + + [colr] Move sanitize() to right place + + Sanitize always comes just before data member definitions, so + it's easy to cross-check. + + src/hb-ot-color-colr-table.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 24adc1575745a711558dab79488760f1ceb24750 +Author: Behdad Esfahbod +Date: Sun Oct 21 17:39:00 2018 -0700 + + [colr] Touch up a bit + + When a struct is plain old data with no references, etc, it's okay + to mark its members public. + + src/hb-ot-color-colr-table.hh | 36 +++++++++++++++++++++++------------- + 1 file changed, 23 insertions(+), 13 deletions(-) + +commit cc6e77ca98e90fb531dd90a5c9c41d14d1dda9c4 +Author: Khaled Hosny +Date: Sun Oct 21 13:29:40 2018 +0200 + + [color] Fix documentation a bit + + src/hb-ot-color.cc | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 37ba2413c19f6a1d62868178fc80f870ee44e7ab +Author: Ebrahim Byagowi +Date: Sun Oct 21 11:46:51 2018 +0330 + + Minor + + src/hb-ot-color-cpal-table.hh | 10 +++++----- + src/hb-ot-color.cc | 25 ++++++++++++++----------- + src/hb-ot-color.h | 12 ++++++------ + 3 files changed, 25 insertions(+), 22 deletions(-) + +commit 44f79b4bf8ac341c5968a27f6a2a13a8af48b34f +Author: Ebrahim Byagowi +Date: Sun Oct 21 10:17:34 2018 +0330 + + Remove _palette_entry_count as can be done with _palette_colors + + src/hb-ot-color.cc | 18 ++---------------- + src/hb-ot-color.h | 3 --- + test/api/test-ot-color.c | 8 ++------ + 3 files changed, 4 insertions(+), 25 deletions(-) + +commit 6795dcfc0884b87b72fce8d902654f28ffe1366c +Author: Ebrahim Byagowi +Date: Sun Oct 21 09:51:15 2018 +0330 + + [test] Test hb_ot_color_has_{colr,cpal}_data + + src/dump-emoji.cc | 3 ++- + src/hb-ot-color.cc | 7 ++++--- + test/api/test-ot-color.c | 23 +++++++++++++++++++++++ + 3 files changed, 29 insertions(+), 4 deletions(-) + +commit b8ee3a0ec89d63721618ac90c01ac6da228f5055 +Author: Ebrahim Byagowi +Date: Sun Oct 21 09:44:16 2018 +0330 + + [CPAL] Add palette entry and enable palette flag API + + src/hb-ot-color-cpal-table.hh | 66 +++++++++++++++---------- + src/hb-ot-color.cc | 109 + ++++++++++++++++++++++++------------------ + src/hb-ot-color.h | 23 +++++++++ + test/api/test-ot-color.c | 35 ++++++++++++-- + 4 files changed, 158 insertions(+), 75 deletions(-) + +commit d4261b4bb6d20fac7deebacfbe120fb84a92e423 +Author: Ebrahim Byagowi +Date: Sun Oct 21 08:48:07 2018 +0330 + + Add API test for hb_ot_color_get_color_layers + + src/dump-emoji.cc | 3 ++- + src/hb-ot-color.cc | 2 +- + src/hb-ot-color.h | 2 ++ + test/api/test-ot-color.c | 31 +++++++++++++++++++++++++++++-- + 4 files changed, 34 insertions(+), 4 deletions(-) + +commit 456978d408cd41156e1123abfc3689800558e89b +Author: Ebrahim Byagowi +Date: Sun Oct 21 08:26:40 2018 +0330 + + Address COLR/CPAL reviews and revive cpal_v1 tests + + src/dump-emoji.cc | 26 ++++---- + src/hb-common.h | 12 ++++ + src/hb-ot-color-cpal-table.hh | 37 +++++------- + src/hb-ot-color.cc | 136 + +++++++++++++++++++++++++----------------- + src/hb-ot-color.h | 38 +++--------- + test/api/test-ot-color.c | 101 +++++++++++++++---------------- + 6 files changed, 179 insertions(+), 171 deletions(-) + +commit 687f679b80c071c69d0924f07a315f9d2691b7fc +Author: Ebrahim Byagowi +Date: Sat Oct 20 17:50:39 2018 +0330 + + [color] Fix alpha channel value and adjust spaces + + src/dump-emoji.cc | 36 ++++++++++++++++++------------------ + src/hb-buffer-serialize.cc | 14 +++++++------- + src/hb-ot-color.cc | 10 +++++----- + 3 files changed, 30 insertions(+), 30 deletions(-) + +commit 00e94ce24efb1f5b3a9cd13c0b9f81f405ad8055 +Author: Ebrahim Byagowi +Date: Sat Oct 20 00:31:04 2018 +0330 + + [dump-emoji] Formatting + + src/dump-emoji.cc | 26 ++++++++++++++++---------- + 1 file changed, 16 insertions(+), 10 deletions(-) + +commit e9d798dc12d42e97ae8c19e7b73e25abc34d265a +Author: Ebrahim Byagowi +Date: Fri Oct 19 18:30:01 2018 +0330 + + [test] Use hb_test_open_font_file + + test/api/test-ot-color.c | 16 ++-------------- + 1 file changed, 2 insertions(+), 14 deletions(-) + +commit e8a6f5b8039cce3f7ec568fd90fe73690e49a037 +Author: Ebrahim Byagowi +Date: Fri Oct 19 18:23:42 2018 +0330 + + Add three macros for separating color channels + + src/dump-emoji.cc | 8 ++++---- + src/hb-ot-color.cc | 1 - + src/hb-ot-color.h | 15 ++++++++++----- + test/api/test-ot-color.c | 10 +++++----- + 4 files changed, 19 insertions(+), 15 deletions(-) + +commit 0e33467e52942e62e04cf825a6bd105fa311c864 +Author: Ebrahim Byagowi +Date: Fri Oct 19 17:44:06 2018 +0330 + + Make ot-color tests pass + + test/api/test-ot-color.c | 52 + ++++++++++++++++++++++++------------------------ + 1 file changed, 26 insertions(+), 26 deletions(-) + +commit d4e928b1421c154adbda9b6e1f2cf804b21654cb +Author: Khaled Hosny +Date: Tue May 1 17:16:46 2018 +0200 + + [color] Minimal API for COLR/CPAL + + src/Makefile.sources | 1 + + src/dump-emoji.cc | 114 + +++++++++++---------- + src/hb-ot-color-colr-table.hh | 12 +-- + src/hb-ot-color-cpal-table.hh | 51 +++------ + src/hb-ot-color.cc | 87 +++++++++++----- + src/hb-ot-color.h | 85 +++++++++++++++ + src/hb-ot-face.hh | 3 + + src/hb-ot.h | 1 + + .../fonts/cpal-v0.ttf} | Bin + .../fonts/cpal-v1.ttf} | Bin + test/api/test-ot-color.c | 43 +++++--- + 11 files changed, 257 insertions(+), 140 deletions(-) + +commit 0229eaea299443b4faa3bd086f23ec1496d6112c +Author: Ebrahim Byagowi +Date: Mon Oct 22 10:51:37 2018 +0330 + + [fuzz] Add a found hb-subset testcase + + ...z-testcase-minimized-hb-subset-fuzzer-5725847365877760 | Bin 0 -> + 880 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 0ecddad7c5948ecd7879bc7507f8a7a2d99eee86 +Author: Ebrahim Byagowi +Date: Mon Oct 22 00:44:28 2018 +0330 + + [ci] Disable flaky -windows-x64 and add a comment for iOS + + .circleci/config.yml | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +commit 9b3461574f6473c8ff7c995202858cf46012eed8 +Author: Ebrahim Byagowi +Date: Sun Oct 21 11:37:38 2018 +0330 + + [fuzz] Add more testcases + + Fixed already but better to have anyway. + + One didn't have minimized but it was only 164 B, so + + ...uzz-testcase-minimized-hb-shape-fuzzer-5706010589659136 | Bin 0 -> + 52 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 4fa94a3e39c21bc1dcdbbd5bda99bff1e1490b0e +Merge: 217a3728 c110878c +Author: Ebrahim Byagowi +Date: Sun Oct 21 11:36:41 2018 +0330 + + Merge pull request #1290 from ebraminio/testopenfont + + [test] Unify font file opening across the tests + +commit c110878cb61f5df99e9d97dda253f2987ddce58e +Author: Ebrahim Byagowi +Date: Sun Oct 21 11:07:17 2018 +0330 + + [test] Unify font file opening across the tests + + test/api/hb-subset-test.h | 21 --------------------- + test/api/hb-test.h | 21 +++++++++++++++++++++ + test/api/test-collect-unicodes.c | 6 +++--- + test/api/test-multithread.c | 26 +++++--------------------- + test/api/test-ot-name.c | 27 ++++----------------------- + test/api/test-subset-cmap.c | 8 ++++---- + test/api/test-subset-glyf.c | 28 ++++++++++++++-------------- + test/api/test-subset-hdmx.c | 14 +++++++------- + test/api/test-subset-hmtx.c | 20 ++++++++++---------- + test/api/test-subset-os2.c | 4 ++-- + test/api/test-subset-post.c | 4 ++-- + test/api/test-subset-vmtx.c | 6 +++--- + test/api/test-subset.c | 6 +++--- + 13 files changed, 78 insertions(+), 113 deletions(-) + +commit 217a3728b4991a855070678bc079cb400eee605a +Author: Behdad Esfahbod +Date: Sat Oct 20 20:39:56 2018 -0700 + + [fuzzing] Add more font + + .../clusterfuzz-testcase-hb-shape-fuzzer-5097734906839040 | Bin 0 -> + 164 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 1e39833ba8547c90a0a4ed7f265a6c4bc8eb8fe1 +Author: Behdad Esfahbod +Date: Sat Oct 20 16:56:06 2018 -0700 + + [docs] Minor + + src/hb-buffer.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a5ad8c658dac1fbe63d1034cdfe8df33f50462b6 +Author: Behdad Esfahbod +Date: Sat Oct 20 16:52:55 2018 -0700 + + [docs] More fixes + + src/hb-ot-layout.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 2d9198f205fafda557520d7206f9cfbf3373353f +Author: Behdad Esfahbod +Date: Sat Oct 20 16:50:39 2018 -0700 + + [docs] Fix for hb-version.h being in src tree + + docs/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit 314b1af74f1fb71ea5cfcb5a58766773f0b2a5a1 +Author: Behdad Esfahbod +Date: Sat Oct 20 16:49:16 2018 -0700 + + [docs] Fix warning + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1260 + + src/hb-deprecated.h | 6 ------ + src/hb-unicode.cc | 1 + + 2 files changed, 1 insertion(+), 6 deletions(-) + +commit b713c1397718bf1f702a2ead2afb4dcee2c1505a +Author: Behdad Esfahbod +Date: Sat Oct 20 14:56:28 2018 -0700 + + [kerx] Implement tuple-kerning in Format0 + + src/hb-aat-layout-kerx-table.hh | 44 + ++++++++++++++++++++++++++++------------- + 1 file changed, 30 insertions(+), 14 deletions(-) + +commit 0a3b7a0fb0734a66926dfda5d95d3cacea8890ce +Author: Behdad Esfahbod +Date: Sat Oct 20 13:14:07 2018 -0700 + + 2.0.2 + + NEWS | 6 ++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 9 insertions(+), 3 deletions(-) + +commit 8931bc4a6b41a2a41069b99cb5c551fa30216f0b +Author: Ebrahim Byagowi +Date: Sat Oct 20 23:23:32 2018 +0330 + + [test] Fix -Wunused-parameter on test-font.c + + test/api/test-font.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 68b705076808d4b0a4ac3bfa945b8f9ae23db1df +Author: Behdad Esfahbod +Date: Sat Oct 20 12:09:41 2018 -0700 + + [kerx] Fix sanitize of KerxSubtableFormat2::array read + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11033 + + src/hb-aat-layout-kerx-table.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 00fdbca4f6a5c4623b9c4838da502cccce8aaa74 +Author: Behdad Esfahbod +Date: Sat Oct 20 12:04:51 2018 -0700 + + [aat] Fix LookupFormat10 sanitize + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11060 + + src/hb-aat-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f11c557662dee16a59bb54276c50a96e4e675201 +Author: Behdad Esfahbod +Date: Sat Oct 20 11:56:30 2018 -0700 + + [test] Fix leak + + test/api/test-font.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit 440a675c7cc72c7c77b4ad7b20c855c53808ef48 +Author: Ebrahim Byagowi +Date: Sat Oct 20 21:13:25 2018 +0330 + + [TODO] Remove BCP 47 language handling item + + Closes https://github.com/harfbuzz/harfbuzz/issues/1286 + + TODO | 2 -- + 1 file changed, 2 deletions(-) + +commit d39acc5a95f968b0dbfd5a942abda606d9aa3343 +Author: Ebrahim Byagowi +Date: Sat Oct 20 12:20:30 2018 +0330 + + [fuzzing] Add new testcases + + .../clusterfuzz-testcase-hb-shape-fuzzer-5688420752424960 | Bin 0 -> + 163 bytes + ...zz-testcase-minimized-hb-shape-fuzzer-5688420752424960 | Bin 0 -> + 69 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 1e55e21dea78aaaddc0715e7df96fd198ec8f78a +Merge: 964ae32a d084719f +Author: Ebrahim Byagowi +Date: Sat Oct 20 07:45:46 2018 +0330 + + Merge pull request #1283 from khaledhosny/cygwin + + Cygwin fixes and CI build + +commit 964ae32aac793540a49c44efab878592394d48db +Author: Ebrahim Byagowi +Date: Sat Oct 20 07:39:18 2018 +0330 + + Run valgrind on run-shape-fuzzer only when RUN_VALGRIND is set (#1285) + + .circleci/config.yml | 2 +- + test/fuzzing/run-shape-fuzzer-tests.py | 4 +++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +commit f70f994112b2577271c20a929f7b980fa1d17428 +Author: Behdad Esfahbod +Date: Fri Oct 19 20:00:36 2018 -0700 + + Minor + + test/api/test-ot-name.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4e09fb8f7a93ec0c8d7f71cd58772ba468b5523f +Author: Behdad Esfahbod +Date: Fri Oct 19 19:59:41 2018 -0700 + + Oops. Fix build + + test/api/test-map.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9e288d29d86ef27acacd397b1abf04d512f1e61e +Author: Behdad Esfahbod +Date: Fri Oct 19 19:47:27 2018 -0700 + + [test-map] Cosmetic + + test/api/test-map.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +commit 7c2c8ac301b526da8b5384d6b90f156ca096568e +Author: Behdad Esfahbod +Date: Fri Oct 19 19:37:46 2018 -0700 + + 2.0.1 + + NEWS | 15 ++++++++++++++- + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 17 insertions(+), 4 deletions(-) + +commit 5a24ea15e0c242c3e2a4a49980da3ab7dd61a3df +Author: Bruce Mitchener +Date: Sat Oct 20 08:09:52 2018 +0700 + + Make more 'coords' params const. + + src/hb-ot-layout-common.hh | 8 ++++---- + src/hb-ot-layout-gsubgpos.hh | 2 +- + src/hb-ot-var-hvar-table.hh | 2 +- + src/hb-ot-var-mvar-table.hh | 2 +- + 4 files changed, 7 insertions(+), 7 deletions(-) + +commit 08b7172969b442cc83b47f44e685a0495b2d8cd4 +Author: Behdad Esfahbod +Date: Fri Oct 19 19:12:33 2018 -0700 + + [font] Fix parallel funcs passing to eachover in infinite-loop + + Fixes test just added. + + src/hb-font.cc | 20 +++++++++++++------- + src/hb-font.hh | 8 ++++++++ + 2 files changed, 21 insertions(+), 7 deletions(-) + +commit 77d5c3df07bec8e9d2dd57f89d5810b768bdc4f5 +Author: Behdad Esfahbod +Date: Fri Oct 19 19:01:01 2018 -0700 + + [font] Add failing test amongst font-func parallels infinite-looping + + Reported by Nona while updating Android to HarfBuzz 2.0.0. + + test/api/test-font.c | 64 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 64 insertions(+) + +commit d084719ff5a9e0e363bf352037f85b884bff11a7 +Author: Khaled Hosny +Date: Sat Oct 20 00:18:36 2018 +0200 + + Add Cygwin CI build + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1274 + + appveyor.yml | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 29d877518fc2c29083cd7b955b422087966235f7 +Author: Behdad Esfahbod +Date: Fri Oct 19 16:06:54 2018 -0700 + + [kerx] Implement variation-kerning tables (without the variation part) + + SFSNDisplay uses these. We just apply the default kern without + variations right now. But at least makes the default kern work. + + src/hb-aat-layout-kerx-table.hh | 37 + +++++++++++++++++++++++++++++-------- + 1 file changed, 29 insertions(+), 8 deletions(-) + +commit f7c0b4319c6f82f1e0020a0029469d8953a7a161 +Author: Behdad Esfahbod +Date: Fri Oct 19 15:23:49 2018 -0700 + + [aat] Implement LookupFormat10 + + src/hb-aat-layout-ankr-table.hh | 6 +++-- + src/hb-aat-layout-common.hh | 55 + ++++++++++++++++++++++++++++++++++++++--- + src/hb-machinery.hh | 4 +++ + src/hb-open-type.hh | 3 +++ + 4 files changed, 63 insertions(+), 5 deletions(-) + +commit cf92cb7e002f479505fed8c2c55ab12dcbea2d83 +Author: Khaled Hosny +Date: Fri Oct 19 22:21:39 2018 +0200 + + Use g_strdup instead of strdup + + Cygwin does not seem to have strdup. + + util/options.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 30cbe6158de1ddc0546d55e4edc1fe264e1b86ef +Author: Khaled Hosny +Date: Fri Oct 19 22:04:56 2018 +0200 + + Use O_BINARY instead of _O_BINARY + + Cygwin does not seem to have the later + + src/hb-blob.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 257ded1f9ec653d15e79d2ea0a83bd8c5c53d831 +Author: Behdad Esfahbod +Date: Fri Oct 19 11:20:14 2018 -0700 + + [trak] Fix test for previous fix + + test/shaping/data/in-house/tests/aat-trak.tests | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 72bb139b807c21f1569058fb5fb260dcdd81eba4 +Author: Behdad Esfahbod +Date: Fri Oct 19 11:15:35 2018 -0700 + + [RELEASING] Post-mortem + + Re https://github.com/harfbuzz/harfbuzz/issues/1271 + + RELEASING.md | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 79b63561552bdfe8dc67a450d740fda8802486ad +Author: Behdad Esfahbod +Date: Fri Oct 19 11:00:20 2018 -0700 + + [trak] Fix extrapolation at end side + + src/hb-aat-layout-trak-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2352cc3539b2e58d0481cdb8b9cd48cbc09a778e +Author: Behdad Esfahbod +Date: Fri Oct 19 09:58:45 2018 -0700 + + [kerx] Whitespace + + src/hb-aat-layout-kerx-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 114f66dda6a07d61b5e64da5c44b05db7aa51cc9 +Author: Ebrahim Byagowi +Date: Fri Oct 19 12:05:26 2018 +0330 + + Fix hb_map_is_empty logic + + This needs reviewing + + src/hb-map.hh | 2 +- + test/api/test-map.c | 13 ++++++++----- + 2 files changed, 9 insertions(+), 6 deletions(-) + +commit 9df2fb1611e03e401f0d5a9432b440641085ba1e +Author: Ebrahim Byagowi +Date: Fri Oct 19 12:04:47 2018 +0330 + + Add API tests for hb_map_t + + src/Makefile.am | 2 +- + test/api/Makefile.am | 6 ++- + test/api/test-map.c | 114 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 120 insertions(+), 2 deletions(-) + +commit 8a5eba711069285e8d8b6d682eea0090256527bb +Author: Ebrahim Byagowi +Date: Fri Oct 19 10:20:16 2018 +0330 + + [test] cosmetic, use g_assert_cmpint + + test/api/test-ot-name.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit c6eb5e852c24e12fec3138cf9def5eb76acedfd6 +Author: Ebrahim Byagowi +Date: Fri Oct 19 10:14:25 2018 +0330 + + Don't report deprecated symbols as unused symbols + + src/Makefile.am | 2 ++ + test/api/Makefile.am | 4 +++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 34f357c78a7a530fdb3580ec9d3d865600c06128 +Author: Ebrahim Byagowi +Date: Fri Oct 19 10:13:53 2018 +0330 + + Add test for hb_set_del + + test/api/test-set.c | 3 +++ + 1 file changed, 3 insertions(+) + +commit 4594730f64e534e975065afce925b581fd9c6acd +Author: Bruce Mitchener +Date: Fri Oct 19 22:12:25 2018 +0700 + + Remove redundant return at end of void-returning function. + + src/hb-ot-layout-gsubgpos.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 093c7c4a54b37f5b12ad21e2d67f109597d068b1 +Author: Ebrahim Byagowi +Date: Fri Oct 19 18:46:41 2018 +0330 + + [ci] Run valgrind on test/api + + run-shape-fuzzer-tests.py automatically runs valgrind if see available + but test/api runs it by request, we probably should normalize the + approaches + later + + .circleci/config.yml | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 8d1e479d1dcf7789be99a6cd0db0b883a90299dc +Author: Bruce Mitchener +Date: Thu Oct 18 22:18:42 2018 +0700 + + Use bool literals instead of 0/1. + + src/hb-common.cc | 2 +- + src/hb-coretext.cc | 4 ++-- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-tag.cc | 2 +- + src/hb-shape-plan.cc | 8 ++++---- + 5 files changed, 9 insertions(+), 9 deletions(-) + +commit 257d0e5aa36fd5b3e54e04918ce12bb7d7e0d177 +Author: Bruce Mitchener +Date: Fri Oct 19 22:49:21 2018 +0700 + + Fix typos. + + BUILD.md | 2 +- + CMakeLists.txt | 8 ++++---- + README.python.md | 2 +- + README.wine.md | 6 +++--- + src/hb-machinery.hh | 2 +- + src/hb-null.hh | 4 ++-- + src/hb-open-file.hh | 2 +- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout-gdef-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 2 +- + 11 files changed, 17 insertions(+), 17 deletions(-) + +commit b7cef8cb1dfaf1f0f2c0d79b96b171049b69466a +Author: Ebrahim Byagowi +Date: Fri Oct 19 09:24:21 2018 +0330 + + Enable valgrind and dedicate a bot to it + + .circleci/config.yml | 13 +++++++++++++ + test/fuzzing/run-shape-fuzzer-tests.py | 31 + +++++++++++++++++++++++++++++++ + 2 files changed, 44 insertions(+) + +commit bccd09d6c7baa99fdaccb8c5b3ff7e1834edd3bf +Author: Ebrahim Byagowi +Date: Fri Oct 19 09:06:42 2018 +0330 + + Minor, tweak spaces on hb-shape-fuzzer.cc + + test/fuzzing/hb-shape-fuzzer.cc | 42 + ++++++++++++++++++++--------------------- + 1 file changed, 21 insertions(+), 21 deletions(-) + +commit fbf665b307c8cc9f16f5897671bfdd8719a195b5 +Author: Ebrahim Byagowi +Date: Fri Oct 19 08:09:53 2018 +0330 + + [fuzz] Add more found cases (#1275) + + ...clusterfuzz-testcase-hb-shape-fuzzer-5728971283496960 | Bin 0 -> + 101 bytes + ...terfuzz-testcase-minimized-hb-fuzzer-5713868010553344 | Bin 0 -> + 370 bytes + ...terfuzz-testcase-minimized-hb-fuzzer-6278851874258944 | Bin 0 -> + 598 bytes + ...z-testcase-minimized-hb-shape-fuzzer-5649959857160192 | Bin 0 -> + 3608 bytes + ...z-testcase-minimized-hb-shape-fuzzer-5664873493561344 | Bin 0 -> + 400 bytes + ...z-testcase-minimized-hb-shape-fuzzer-5762953198960640 | Bin 0 -> + 62 bytes + ...z-testcase-minimized-hb-shape-fuzzer-5764636557705216 | Bin 0 -> + 2184 bytes + ...-testcase-minimized-hb-subset-fuzzer-5690658895953920 | Bin 0 -> + 2735 bytes + ...-testcase-minimized-hb-subset-fuzzer-5695279609675776 | Bin 0 -> + 135 bytes + ...-testcase-minimized-hb-subset-fuzzer-5718215406125056 | Bin 0 -> + 107 bytes + ...-testcase-minimized-hb-subset-fuzzer-5743250149736448 | Bin 0 -> + 103 bytes + ...-testcase-minimized-hb-subset-fuzzer-5765071062958080 | Bin 0 -> + 329 bytes + ...ized-hb-subset-get-codepoints-fuzzer-5930139383758848 | Bin 0 -> + 9410 bytes + 13 files changed, 0 insertions(+), 0 deletions(-) + +commit 51fba41cc958ded3afc6c1e738895b0a81993e18 +Merge: e555ed96 3d9a0306 +Author: Michiharu Ariza +Date: Thu Oct 18 13:08:42 2018 -0700 + + Merge branch 'master' into cff-subset + +commit e555ed961e86104e059861efe4245b7b146dbd3b +Author: Michiharu Ariza +Date: Thu Oct 18 13:04:41 2018 -0700 + + added flex extents test + + test/api/fonts/cff1_flex.otf | Bin 0 -> 3152 bytes + test/api/test-ot-extents-cff.c | 23 +++++++++++++++++++++++ + 2 files changed, 23 insertions(+) + +commit 8679d02b4b3f2f9147c4ea0319eb39851c4e40e6 +Author: Michiharu Ariza +Date: Thu Oct 18 13:04:21 2018 -0700 + + implement flex ops for glyph extents/subset + + also removed unused CSInterpEnv::move_[xy]_with_arg + fixed bug a width being left over on argStack with CFF1 + + src/hb-cff-interp-cs-common.hh | 157 + +++++++++++++++++++++++++++++++++++------ + src/hb-cff1-interp-cs.hh | 1 + + src/hb-subset-cff1.cc | 4 -- + src/hb-subset-cff2.cc | 4 -- + 4 files changed, 138 insertions(+), 28 deletions(-) + +commit 3d9a0306ebb48706778fd2c487c3cacc7d508d6c +Author: Behdad Esfahbod +Date: Thu Oct 18 05:58:17 2018 -0700 + + 2.0.0 + + NEWS | 68 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + src/hb-buffer.cc | 4 ++-- + src/hb-common.h | 4 ++-- + src/hb-deprecated.h | 18 +++++++------- + src/hb-font.cc | 6 ++--- + src/hb-font.h | 2 +- + src/hb-ot-layout.cc | 8 +++---- + src/hb-ot-name.h | 4 ++-- + src/hb-ot-tag.cc | 4 ++-- + src/hb-ot-tag.h | 4 ++-- + src/hb-version.h | 6 ++--- + 12 files changed, 99 insertions(+), 31 deletions(-) + +commit 535ca678bf9c8ab470ebf5ad84a090328d79d42b +Author: Behdad Esfahbod +Date: Thu Oct 18 05:58:04 2018 -0700 + + [test] Don't use newer glib API + + test/api/test-ot-tag.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 03e144135b5c691e3942d1aef917fe2246665fb6 +Author: Ebrahim Byagowi +Date: Thu Oct 18 11:06:37 2018 +0330 + + [ubsan] Use unsigned int instead enum where needed (#1270) + + Actually the check is right, + + On -myanmar.hh, on that particular switch, OT_C is indic_category_t + but OT_D is myanmar_category_t so we are mixing the types in one + variable. + + And on -arabic.cc, step can goes one number higher than step_t enum + in the + loop so we are actually using it as an unsinged int. + + .circleci/config.yml | 2 +- + src/hb-ot-shape-complex-arabic.cc | 4 ++-- + src/hb-ot-shape-complex-myanmar.hh | 48 + +++++++++++++++++++------------------- + 3 files changed, 27 insertions(+), 27 deletions(-) + +commit 64df6b0b0f9d221e14811084f2412a01cf4deb46 +Author: Behdad Esfahbod +Date: Thu Oct 18 00:35:01 2018 -0700 + + [AUTHORS] Add Ebrahim and Khaled + + AUTHORS | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +commit f1ced9be378d7c7ad3ea35a1cee6f9aff7a44a13 +Author: Behdad Esfahbod +Date: Wed Oct 17 23:06:53 2018 -0700 + + More warning fix + + Okay, let's see if the gods are happy now... + + src/hb-static.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 40606abd0cd40faf3973d0a8c30af90d36ae8231 +Author: Behdad Esfahbod +Date: Wed Oct 17 23:06:37 2018 -0700 + + Fix build + + src/hb-static.cc | 1 + + 1 file changed, 1 insertion(+) + +commit c406aca19303e61fa5ba15d215386cfc6d920124 +Author: Behdad Esfahbod +Date: Wed Oct 17 22:58:43 2018 -0700 + + Fix warning + + src/hb-machinery.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 270a37c3244b32dd839a99eb379be241613ee895 +Author: Behdad Esfahbod +Date: Wed Oct 17 22:42:47 2018 -0700 + + Kick bots + + src/hb-aat-layout-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 6da8ef3f9f4706fe88715fabdba7904ff279539b +Author: Behdad Esfahbod +Date: Wed Oct 17 22:37:34 2018 -0700 + + Fix some wierdness... + + src/hb-static.cc | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 83780308b41b029513ac2568b6688d3eaad77338 +Author: Behdad Esfahbod +Date: Wed Oct 17 22:34:16 2018 -0700 + + [aat] Fix sanitize slowdown + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11034 + + src/hb-aat-layout-common.hh | 4 ++++ + src/hb-machinery.hh | 2 +- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit b9478e28ac4361353e4920d749cc5d29e5bfef67 +Author: Behdad Esfahbod +Date: Wed Oct 17 21:52:14 2018 -0700 + + Revert "[test] Remove not-fixed yet testcases (#1268)" + + This reverts commit 191eef823fe95355425621f8e002dfe7fe632383. + + ...rfuzz-testcase-minimized-hb-fuzzer-4548492505645056 | Bin 0 -> + 122 bytes + ...rfuzz-testcase-minimized-hb-fuzzer-6210176798425088 | Bin 0 -> + 1420 bytes + ...testcase-minimized-hb-shape-fuzzer-5738888765636608 | Bin 0 -> + 267731 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit af99b20dfddbca75e68f84c5aa465a54728990a6 +Author: Ebrahim Byagowi +Date: Thu Oct 18 08:35:20 2018 +0330 + + [ci/ubsan] Disable enum sanitization + + Behdad apparently not interested on them + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9e8a9b846ec24e9124d61706272a0e5fa58d7a24 +Author: Behdad Esfahbod +Date: Wed Oct 17 21:41:25 2018 -0700 + + [aat] Another try at fixing Lookup null objects... + + Ugly as hell, and don't even understand why some bits are needed. + But the logic is sound. + + src/hb-aat-layout-common.hh | 23 ++++++++++++++++++++--- + src/hb-static.cc | 4 ++++ + 2 files changed, 24 insertions(+), 3 deletions(-) + +commit 191eef823fe95355425621f8e002dfe7fe632383 +Author: Ebrahim Byagowi +Date: Thu Oct 18 08:04:18 2018 +0330 + + [test] Remove not-fixed yet testcases (#1268) + + I added them but now that I think, it is a bad idea to have them as + fuzzing bots will find good seeds to tweak in order to find easy new + testcases which causes duplicated issues. + + ...rfuzz-testcase-minimized-hb-fuzzer-4548492505645056 | Bin 122 -> + 0 bytes + ...rfuzz-testcase-minimized-hb-fuzzer-6210176798425088 | Bin 1420 -> + 0 bytes + ...testcase-minimized-hb-shape-fuzzer-5738888765636608 | Bin 267731 -> + 0 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 392e1f4ddd7eb649e1a71755b9bcf6431739f98f +Author: Ebrahim Byagowi +Date: Thu Oct 18 07:42:20 2018 +0330 + + [test/shape-fuzzer] fail on timeout and ubsan errors (#1267) + + test/fuzzing/run-shape-fuzzer-tests.py | 38 + ++++++++++++++++++++++++++++++---- + 1 file changed, 34 insertions(+), 4 deletions(-) + +commit eeddda3ec6c28b411d33c74938ec6198c7f6888d +Author: Ebrahim Byagowi +Date: Thu Oct 18 07:38:47 2018 +0330 + + [util] Better file-not-found error from hb-shape / hb-view + + fixes #1266 + + util/options.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 751c10e55e43e2266a5bba024d560c5127fae4b8 +Author: Ebrahim Byagowi +Date: Thu Oct 18 06:36:48 2018 +0330 + + [fuzz] Add more new testcases + + ...testcase-minimized-hb-shape-fuzzer-5718464350650368 | Bin 0 -> + 41 bytes + ...testcase-minimized-hb-shape-fuzzer-5738888765636608 | Bin 0 -> + 267731 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit fd282eb3285e6d20f77e8a3a7237b677433ccbb4 +Author: Ebrahim Byagowi +Date: Thu Oct 18 06:33:39 2018 +0330 + + [fuzz] Add a new testcase + + .../clusterfuzz-testcase-hb-shape-fuzzer-5634395566768128 | Bin 0 -> + 106 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 9d42d70269b879e67f3c7724beab8e4cdbfc877a +Author: Behdad Esfahbod +Date: Wed Oct 17 17:55:47 2018 -0700 + + [trak] Fix calc + + We were getting the first track record always. Ie. this line: + + if (trackTable[i].get_track_value () == 0.f) + { + - trackTableEntry = &trackTable[0]; + + trackTableEntry = &trackTable[i]; + break; + } + + The rest is cleanup. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1263 for the + most part. + + src/hb-aat-layout-trak-table.hh | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +commit 3341c7fbfb9bc8e137afd9f16da8cf18eb67b25b +Author: Behdad Esfahbod +Date: Wed Oct 17 15:04:35 2018 -0700 + + [fuzzing] Move fuzzing fonts from api/ here + + ...estcase-minimized-hb-subset-fuzzer-5521982557782016 | Bin 1228 -> + 0 bytes + ...estcase-minimized-hb-subset-fuzzer-5542653037903872 | Bin 160249 -> + 0 bytes + ...estcase-minimized-hb-subset-fuzzer-5609911946838016 | Bin 313 -> + 0 bytes + ...estcase-minimized-hb-subset-fuzzer-5670861909524480 | Bin 1298 -> + 0 bytes + ...estcase-minimized-hb-subset-fuzzer-5750092395970560 | Bin 72435 -> + 0 bytes + ...estcase-minimized-hb-subset-fuzzer-6651660668502016 | Bin 15229 -> + 0 bytes + ...ed-hb-subset-get-codepoints-fuzzer-5973295416475648 | Bin 109 -> + 0 bytes + ...ed-hb-subset-get-codepoints-fuzzer-6136125075750912 | Bin 65816 -> + 0 bytes + test/api/test-subset-glyf.c | 2 +- + test/api/test-subset-hdmx.c | 4 ++-- + test/api/test-subset-hmtx.c | 2 +- + test/api/test-subset.c | 6 +++--- + .../crash-4b60576767ee4d9fe1cc10959d89baf73d4e8249 | Bin + .../crash-b577db318b30f2851828a4c9ef97cb30678b1b54 | Bin + .../crash-ccc61c92d589f895174cdef6ff2e3b20e9999a1a | Bin + .../crash-e4e0bb1458a91b692eba492c907ae1f94e635480 | Bin + .../fonts/oom-6ef8c96d3710262511bcc730dce9c00e722cb653 | Bin + .../fonts/oom-ccc61c92d589f895174cdef6ff2e3b20e9999a1a | Bin + 18 files changed, 7 insertions(+), 7 deletions(-) + +commit 1f34388e8b40a77157f61c8e1a2fc7c4846c192e +Merge: 9ade3e7b 2e7c7165 +Author: Michiharu Ariza +Date: Wed Oct 17 09:34:48 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 2e7c716511e8b2cfcd059fa2a2ed4cdd48b351bf +Author: Behdad Esfahbod +Date: Tue Oct 16 18:35:03 2018 -0700 + + [buffer] Add an assert + + See if it helps debugging + https://bugs.chromium.org/p/chromium/issues/detail?id=895117 + + src/hb-buffer.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 5842756b1398253d38749c4c8a23a1450e642caf +Author: Behdad Esfahbod +Date: Tue Oct 16 18:28:55 2018 -0700 + + [fuzzing] Delete blink fuzzed data + + These are text, not font. + + ...minimized-blink_harfbuzz_shaper_fuzzer-5099655095123968 | Bin 88 -> + 0 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 25fe7e7e1031401d38db1efed360cd75ea7910b9 +Author: Behdad Esfahbod +Date: Tue Oct 16 18:22:54 2018 -0700 + + [aat] Comment + + src/hb-aat-layout-common.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 26092bb3d1aa239de5e933700e0371619d147f65 +Author: HinTak +Date: Wed Oct 17 00:54:39 2018 +0100 + + "allow-none" annotation for "out" parameters + + Fixes the following warnings: + hb-ot-tag.cc:330: Warning: HarfBuzz: invalid "allow-none" annotation: + only valid for pointer types and out parameters + hb-ot-tag.cc:334: Warning: HarfBuzz: invalid "allow-none" annotation: + only valid for pointer types and out parameters + + src/hb-ot-tag.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ba42651608da1be0d152e03ad42ea96fc8476ac7 +Author: Behdad Esfahbod +Date: Tue Oct 16 17:35:46 2018 -0700 + + Fix indent + + test/fuzzing/run-shape-fuzzer-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 49bdb54427b17d439eadf31732a5f2a0add46bf5 +Author: HinTak +Date: Wed Oct 17 00:36:04 2018 +0100 + + typo in gobject annotation - "in/out" should be "inout" + + "in/out" should be "inout" + + src/hb-ot-layout.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c0c190c16a2c1b281f40dacdcf515dc5a59ab3bb +Author: Behdad Esfahbod +Date: Tue Oct 16 16:39:29 2018 -0700 + + [fuzzing] Run tests against fuzzing fonts + + Some disable. + + test/fuzzing/run-shape-fuzzer-tests.py | 12 ++-- + test/fuzzing/run-subset-fuzzer-tests.py | 35 ++++++----- + test/shaping/data/in-house/Makefile.sources | 1 - + test/shaping/data/in-house/tests/fuzzed.tests | 84 + --------------------------- + 4 files changed, 24 insertions(+), 108 deletions(-) + +commit 7b37705fb579a39334be0618c6215c1b887bf9fc +Author: Behdad Esfahbod +Date: Tue Oct 16 16:33:06 2018 -0700 + + [fuzzing] Rename + + ...ebdebc6.ttf => 0509e80afb379d16560e9e47bdd7d888bebdebc6} | Bin + ...63b6daf.ttf => 1a6f1687b7a221f9f2c834b0b360d3c8463b6daf} | Bin + ...28b22cb.ttf => 205edd09bd3d141cc9580f650109556cc28b22cb} | Bin + ...f026462.ttf => 217a934cfe15c548b572c203dceb2befdf026462} | Bin + ...ac34f18.ttf => 3511ff5c1647150595846ac414c595cccac34f18} | Bin + ...675d5a3.ttf => 375d6ae32a3cbe52fbf81a4e5777e3377675d5a3} | Bin + ...9c9a56b.ttf => 43979b90b2dd929723cf4fe1715990bcb9c9a56b} | Bin + ...1a8e2b0.ttf => 558661aa659912f4d30ecd27bd09835171a8e2b0} | Bin + ...0655fa8.ttf => 5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8} | Bin + ...c149ddc.ttf => 641bd9db850193064d17575053ae2bf8ec149ddc} | Bin + ...bcf861f.ttf => 8240789f6d12d4cfc4b5e8e6f246c3701bcf861f} | Bin + ...1386016.ttf => a34a9191d9376bda419836effeef7e75c1386016} | Bin + ...bdae30e.ttf => a69118c2c2ada48ff803d9149daa54c9ebdae30e} | Bin + ...6b31fe2.ttf => b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2} | Bin + ...14a0467.ttf => e88c339237f52d21e01c55f01b9c1b4cc14a0467} | Bin + ...1395725.ttf => fab39d60d758cb586db5a504f218442cd1395725} | Bin + 16 files changed, 0 insertions(+), 0 deletions(-) + +commit 3676c685d407cc7b9b813b4a08e7c5bcd9a47ea1 +Author: Behdad Esfahbod +Date: Tue Oct 16 16:32:26 2018 -0700 + + [fuzzing] Move rest of fuzzing tests here + + .../fonts/0509e80afb379d16560e9e47bdd7d888bebdebc6.ttf | Bin + .../fonts/1a6f1687b7a221f9f2c834b0b360d3c8463b6daf.ttf | Bin + .../fonts/205edd09bd3d141cc9580f650109556cc28b22cb.ttf | Bin + .../fonts/217a934cfe15c548b572c203dceb2befdf026462.ttf | Bin + .../fonts/3511ff5c1647150595846ac414c595cccac34f18.ttf | Bin + .../fonts/375d6ae32a3cbe52fbf81a4e5777e3377675d5a3.ttf | Bin + .../fonts/43979b90b2dd929723cf4fe1715990bcb9c9a56b.ttf | Bin + .../fonts/558661aa659912f4d30ecd27bd09835171a8e2b0.ttf | Bin + .../fonts/5a5daf5eb5a4db77a2baa3ad9c7a6ed6e0655fa8.ttf | Bin + .../fonts/641bd9db850193064d17575053ae2bf8ec149ddc.ttf | Bin + .../fonts/8240789f6d12d4cfc4b5e8e6f246c3701bcf861f.ttf | Bin + .../fonts/a34a9191d9376bda419836effeef7e75c1386016.ttf | Bin + .../fonts/a69118c2c2ada48ff803d9149daa54c9ebdae30e.ttf | Bin + .../fonts/b9e2aaa0d75fcef6971ec3a96d806ba4a6b31fe2.ttf | Bin + .../fonts/e88c339237f52d21e01c55f01b9c1b4cc14a0467.ttf | Bin + .../fonts/fab39d60d758cb586db5a504f218442cd1395725.ttf | Bin + test/shaping/data/in-house/tests/fuzzed.tests | 16 + ---------------- + 17 files changed, 16 deletions(-) + +commit 1487173dcf4137fb210b15d9a869aa1f0c626d15 +Author: Behdad Esfahbod +Date: Tue Oct 16 16:30:38 2018 -0700 + + [fuzzing] Delete duplicate fonts + + .../233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf | Bin 1048576 -> + 0 bytes + .../243798dd281c1c77c065958e1ff467420faa9bde.ttf | Bin 225 -> + 0 bytes + .../9d8a94a67932a3ab75a596fc8b5c6d0392ca9e49.ttf | Bin 4545 -> + 0 bytes + .../b6acef662e0beb8d5fcf5b61c6b0ca69537b7402.ttf | Bin 3301 -> + 0 bytes + .../bbf4a308c402f0678c3e82844892a4da2ebe598f.ttf | Bin 204 -> + 0 bytes + .../dd9f0c7c7c36f75a18be0cab1cddf8f3ab0f366b.ttf | Bin 2786 -> + 0 bytes + .../ef2511f215aa3ca847cbfffbf861793b42170875.ttf | Bin 1152 -> + 0 bytes + test/shaping/data/in-house/tests/fuzzed.tests | 7 ------- + 8 files changed, 7 deletions(-) + +commit 49c041f7c5b135cbcbd1663e18047afd54fc948b +Author: Behdad Esfahbod +Date: Tue Oct 16 16:25:24 2018 -0700 + + Minor + + test/fuzzing/clusterfuzz-testcase-6107935408390144 | Bin 16800 -> 0 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 36f38ea7033b4e52c6cd94a8a0d686a95c0cc148 +Author: Behdad Esfahbod +Date: Tue Oct 16 16:24:03 2018 -0700 + + [gpos] Protect mark attachment against out-of-bounds + + Not sure how can happen, but does... + + src/hb-ot-layout-gpos-table.hh | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 1147ce2392ac6b3d12fdabe69ac5da9bae97e30d +Author: Behdad Esfahbod +Date: Tue Oct 16 16:18:32 2018 -0700 + + [fuzzing] Add more tests + + .../fuzzing/fonts/clusterfuzz-testcase-6107935408390144 | Bin 0 -> + 16800 bytes + ...-testcase-minimized-harfbuzz_fuzzer-5973566991106048 | Bin 0 -> + 4047 bytes + ...-testcase-minimized-hb-shape-fuzzer-5633985665826816 | Bin 0 -> + 73 bytes + 3 files changed, 0 insertions(+), 0 deletions(-) + +commit 12cbe195ae65656dbc9e32b4d50696bc4223136b +Author: Behdad Esfahbod +Date: Tue Oct 16 16:13:53 2018 -0700 + + [aat] Another non-null offset + + src/hb-aat-layout-ankr-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 87205ef935ede70365187549d133014669ea47f2 +Author: Behdad Esfahbod +Date: Tue Oct 16 15:40:44 2018 -0700 + + [aat] Make sure Lookup offset is never nulled + + It has unbounded size... + + Fixes https://oss-fuzz.com/v2/testcase-detail/5718889451749376 + + src/hb-aat-layout-ankr-table.hh | 2 +- + src/hb-aat-layout-common.hh | 3 ++- + src/hb-aat-layout-kerx-table.hh | 18 ++++++++---------- + src/hb-aat-layout-morx-table.hh | 4 ++-- + src/hb-open-type.hh | 12 ++++++------ + 5 files changed, 19 insertions(+), 20 deletions(-) + +commit 1aa353e4fc79dfa880559ff75113ed58fac8392b +Author: Behdad Esfahbod +Date: Tue Oct 16 15:26:51 2018 -0700 + + Fix tests + + test/shaping/data/in-house/tests/fuzzed.tests | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 98d4ad02b97628e5a9a7bfe3187ccc3851c00b18 +Author: Behdad Esfahbod +Date: Tue Oct 16 15:17:31 2018 -0700 + + [fuzzing] One more + + test/fuzzing/clusterfuzz-testcase-6107935408390144 | Bin 0 -> 16800 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit e6f267c3dfe3e93dfc726266672da5a235fbd930 +Author: Behdad Esfahbod +Date: Tue Oct 16 15:16:20 2018 -0700 + + [fuzzing] Add more clusterfuzz tests I had lying around + + .../fonts/clusterfuzz-testcase-5517117891805184 | Bin 0 -> + 178 bytes + ...sterfuzz-testcase-hb-shape-fuzzer-5746142327865344 | Bin 0 -> + 219 bytes + ...sterfuzz-testcase-hb-shape-fuzzer-5750379279548416 | Bin 0 -> + 317 bytes + .../clusterfuzz-testcase-minimized-4884742786777088 | Bin 0 -> + 393 bytes + .../clusterfuzz-testcase-minimized-5255344882188288 | Bin 0 -> 65 bytes + .../clusterfuzz-testcase-minimized-5720051798769664 | Bin 0 -> + 1048576 bytes + .../clusterfuzz-testcase-minimized-5924299061854208 | Bin 0 -> + 2786 bytes + .../clusterfuzz-testcase-minimized-6460279560863744 | Bin 0 -> + 589 bytes + ...ized-blink_harfbuzz_shaper_fuzzer-5099655095123968 | Bin 0 -> 88 bytes + ...estcase-minimized-hb-shape-fuzzer-5650286710882304 | Bin 0 -> 76 bytes + ...stcase-minimized-hb-shape-fuzzer-5672261407735808} | Bin + 11 files changed, 0 insertions(+), 0 deletions(-) + +commit e53206271db4a83834433ab5f82d16815a18b998 +Author: Ebrahim Byagowi +Date: Wed Oct 17 01:42:04 2018 +0330 + + Add all the fonts found by fuzzers to the repo (#1258) + + test/fuzzing/Makefile.am | 1 + + ...clusterfuzz-testcase-hb-fuzzer-4666056377368576 | Bin 0 -> 1152 bytes + ...clusterfuzz-testcase-hb-fuzzer-5662671558934528 | Bin 0 -> 242272 + bytes + ...clusterfuzz-testcase-hb-fuzzer-6243458541944832 | Bin 0 -> 370187 + bytes + ...clusterfuzz-testcase-hb-fuzzer-6303297511096320 | Bin 0 -> 4545 bytes + ...clusterfuzz-testcase-hb-fuzzer-6696647723581440 | Bin 0 -> 3266 bytes + ...z-testcase-minimized-hb-fuzzer-4523479581851648 | Bin 0 -> 322 bytes + ...z-testcase-minimized-hb-fuzzer-4535496598355968 | Bin 0 -> 2786 bytes + ...z-testcase-minimized-hb-fuzzer-4548492505645056 | Bin 0 -> 122 bytes + ...z-testcase-minimized-hb-fuzzer-4595692015190016 | Bin 0 -> 225 bytes + ...z-testcase-minimized-hb-fuzzer-4687441845813248 | Bin 0 -> 162 bytes + ...z-testcase-minimized-hb-fuzzer-4706238090706944 | Bin 0 -> 350 bytes + ...z-testcase-minimized-hb-fuzzer-4769173588672512 | Bin 0 -> 37 bytes + ...z-testcase-minimized-hb-fuzzer-4827735151083520 | Bin 0 -> 1384 bytes + ...z-testcase-minimized-hb-fuzzer-4841745322868736 | Bin 0 -> 660 bytes + ...z-testcase-minimized-hb-fuzzer-4884742786777088 | Bin 0 -> 393 bytes + ...z-testcase-minimized-hb-fuzzer-5216838347653120 | Bin 0 -> 157600 + bytes + ...z-testcase-minimized-hb-fuzzer-5255344882188288 | Bin 0 -> 65 bytes + ...z-testcase-minimized-hb-fuzzer-5294584596791296 | Bin 0 -> 1602 bytes + ...z-testcase-minimized-hb-fuzzer-5303930168803328 | Bin 0 -> 7321 bytes + ...z-testcase-minimized-hb-fuzzer-5331901587914752 | Bin 0 -> 3301 bytes + ...z-testcase-minimized-hb-fuzzer-5388906574905344 | Bin 0 -> 9937 bytes + ...z-testcase-minimized-hb-fuzzer-5517117891805184 | Bin 0 -> 178 bytes + ...z-testcase-minimized-hb-fuzzer-5617496443846656 | Bin 0 -> 195 bytes + ...z-testcase-minimized-hb-fuzzer-5672141338968064 | Bin 0 -> 176 bytes + ...z-testcase-minimized-hb-fuzzer-5700697074958336 | Bin 0 -> 878 bytes + ...z-testcase-minimized-hb-fuzzer-5720051798769664 | Bin 0 -> 1048576 + bytes + ...z-testcase-minimized-hb-fuzzer-5924299061854208 | Bin 0 -> 2786 bytes + ...z-testcase-minimized-hb-fuzzer-6023178755244032 | Bin 0 -> 2261 bytes + ...z-testcase-minimized-hb-fuzzer-6111685556305920 | Bin 0 -> 586 bytes + ...z-testcase-minimized-hb-fuzzer-6160439919509504 | Bin 0 -> 204 bytes + ...z-testcase-minimized-hb-fuzzer-6210176798425088 | Bin 0 -> 1420 bytes + ...z-testcase-minimized-hb-fuzzer-6260579246276608 | Bin 0 -> 700 bytes + ...z-testcase-minimized-hb-fuzzer-6264625609834496 | Bin 0 -> 1731 bytes + ...z-testcase-minimized-hb-fuzzer-6424351550210048 | Bin 0 -> 73 bytes + ...z-testcase-minimized-hb-fuzzer-6460279560863744 | Bin 0 -> 589 bytes + ...z-testcase-minimized-hb-fuzzer-6576177596596224 | Bin 0 -> 385 bytes + ...z-testcase-minimized-hb-fuzzer-6595199411159040 | Bin 0 -> 1862 bytes + ...z-testcase-minimized-hb-fuzzer-6624904746106880 | Bin 0 -> 42 bytes + ...z-testcase-minimized-hb-fuzzer-6723367514144768 | Bin 0 -> 1074 bytes + ...case-minimized-hb-shape-fuzzer-5630246225707008 | Bin 0 -> 109 bytes + ...case-minimized-hb-shape-fuzzer-5635082459545600 | Bin 0 -> 52 bytes + ...case-minimized-hb-shape-fuzzer-5652019562414080 | Bin 0 -> 49 bytes + ...case-minimized-hb-shape-fuzzer-5656511058018304 | Bin 0 -> 28 bytes + ...case-minimized-hb-shape-fuzzer-5659641787187200 | Bin 0 -> 3498 bytes + ...case-minimized-hb-shape-fuzzer-5668791174823936 | Bin 0 -> 3608 bytes + ...ase-minimized-hb-shape-fuzzer-56722614077358084 | Bin 0 -> 192 bytes + ...case-minimized-hb-shape-fuzzer-5674361600606208 | Bin 0 -> 518 bytes + ...case-minimized-hb-shape-fuzzer-5677421274071040 | Bin 0 -> 3608 bytes + ...case-minimized-hb-shape-fuzzer-5679244475105280 | Bin 0 -> 256 bytes + ...case-minimized-hb-shape-fuzzer-5685596677210112 | Bin 0 -> 58 bytes + ...case-minimized-hb-shape-fuzzer-5695615258853376 | Bin 0 -> 194 bytes + ...case-minimized-hb-shape-fuzzer-5696686572175360 | Bin 0 -> 256 bytes + ...case-minimized-hb-shape-fuzzer-5718889451749376 | Bin 0 -> 1680 bytes + ...case-minimized-hb-shape-fuzzer-5719982789361664 | Bin 0 -> 3608 bytes + ...case-minimized-hb-shape-fuzzer-5725129603022848 | Bin 0 -> 3608 bytes + ...case-minimized-hb-shape-fuzzer-5726089628876800 | Bin 0 -> 76 bytes + ...case-minimized-hb-shape-fuzzer-5729361857085440 | Bin 0 -> 2250 bytes + ...case-minimized-hb-shape-fuzzer-5733166795456512 | Bin 0 -> 78 bytes + ...case-minimized-hb-shape-fuzzer-5734736291430400 | Bin 0 -> 66 bytes + ...case-minimized-hb-shape-fuzzer-5740171484463104 | Bin 0 -> 186 bytes + ...case-minimized-hb-shape-fuzzer-5750379279548416 | Bin 0 -> 219 bytes + ...case-minimized-hb-shape-fuzzer-5762490181353472 | Bin 0 -> 101 bytes + ...ase-minimized-hb-subset-fuzzer-5359635656605696 | Bin 0 -> 393270 + bytes + ...ase-minimized-hb-subset-fuzzer-5521982557782016 | Bin 0 -> 1228 bytes + ...ase-minimized-hb-subset-fuzzer-5542653037903872 | Bin 0 -> 160249 + bytes + ...ase-minimized-hb-subset-fuzzer-5609911946838016 | Bin 0 -> 313 bytes + ...ase-minimized-hb-subset-fuzzer-5629878397829120 | Bin 0 -> 3746 bytes + ...ase-minimized-hb-subset-fuzzer-5651059347816448 | Bin 0 -> 2648 bytes + ...ase-minimized-hb-subset-fuzzer-5669437462544384 | Bin 0 -> 284427 + bytes + ...ase-minimized-hb-subset-fuzzer-5670861909524480 | Bin 0 -> 1298 bytes + ...ase-minimized-hb-subset-fuzzer-5696607199166464 | Bin 0 -> 28 bytes + ...ase-minimized-hb-subset-fuzzer-5711951464759296 | Bin 0 -> 284521 + bytes + ...ase-minimized-hb-subset-fuzzer-5747265633779712 | Bin 0 -> 177090 + bytes + ...ase-minimized-hb-subset-fuzzer-5750092395970560 | Bin 0 -> 72435 bytes + ...ase-minimized-hb-subset-fuzzer-5758598970343424 | Bin 0 -> 64 bytes + ...ase-minimized-hb-subset-fuzzer-6543700493598720 | Bin 0 -> 138425 + bytes + ...ase-minimized-hb-subset-fuzzer-6651660668502016 | Bin 0 -> 15229 bytes + ...b-subset-get-codepoints-fuzzer-5203067375976448 | Bin 0 -> 16310 bytes + ...b-subset-get-codepoints-fuzzer-5630904853069824 | Bin 0 -> 580 bytes + ...b-subset-get-codepoints-fuzzer-5687638085337088 | Bin 0 -> 1206 bytes + ...b-subset-get-codepoints-fuzzer-5736539338833920 | Bin 0 -> 512 bytes + ...b-subset-get-codepoints-fuzzer-5973295416475648 | Bin 0 -> 109 bytes + ...b-subset-get-codepoints-fuzzer-6136125075750912 | Bin 0 -> 65816 bytes + ...b-subset-get-codepoints-fuzzer-6394290358976512 | Bin 0 -> 1868 bytes + test/fuzzing/run-shape-fuzzer-tests.py | 4 + + test/shaping/data/in-house/tests/fuzzed.tests | 84 + +++++++++++++++++++++ + 87 files changed, 89 insertions(+) + +commit 2137582c9696b6e38d70b4a0d4199b315c9fd4ce +Author: Behdad Esfahbod +Date: Tue Oct 16 14:46:07 2018 -0700 + + [morx] Reword ligation + + Still fails MORX-41. Am talking to Sascha to better understand + what CoreText + is doing. + + src/hb-aat-layout-morx-table.hh | 25 + ++++++++++++---------- + test/shaping/data/text-rendering-tests/DISABLED | 2 ++ + .../data/text-rendering-tests/Makefile.sources | 2 +- + 3 files changed, 17 insertions(+), 12 deletions(-) + +commit c53a25c6579a4d3fe8e6a6fc198d70add41035ec +Author: Behdad Esfahbod +Date: Tue Oct 16 13:57:35 2018 -0700 + + [morx] Comment + + src/hb-aat-layout-morx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c46d42f8f2c303817467c6a4e19d69d0e433dba6 +Author: Behdad Esfahbod +Date: Tue Oct 16 13:39:54 2018 -0700 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/Makefile.sources | 1 + + .../text-rendering-tests/fonts/TestMORXFourtyone.ttf | Bin 0 -> + 2248 bytes + .../data/text-rendering-tests/tests/MORX-41.tests | 4 ++++ + 3 files changed, 5 insertions(+) + +commit 5eb7e7f6461bcf5b1e1d8ccb49eb904382762533 +Author: Behdad Esfahbod +Date: Tue Oct 16 13:32:52 2018 -0700 + + Revert "[vector] Simplify Sort" and "More of the same" + + This reverts commit de0b9a466490c2c13d6ec6f59d5122b0a87d3180. + This reverts commit 921f0e6ec722940a1e37660e1291aa69f9f39db8. + + Annnnd, revert. MSVC doesn't like it. + + src/hb-vector.hh | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 661340c475dc928f227d54b3f36eaf6f41c2b6e3 +Author: Behdad Esfahbod +Date: Tue Oct 16 13:24:29 2018 -0700 + + [kern] Scale kern pairs before applying + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1255 + Fixes https://github.com/harfbuzz/harfbuzz/issues/1252 + + src/hb-ot-kern-table.hh | 18 ++++++++++++------ + src/hb-ot-shape-fallback.cc | 2 +- + 2 files changed, 13 insertions(+), 7 deletions(-) + +commit de0b9a466490c2c13d6ec6f59d5122b0a87d3180 +Author: Behdad Esfahbod +Date: Mon Oct 15 22:20:26 2018 -0700 + + [vector] More of the same + + src/hb-vector.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 921f0e6ec722940a1e37660e1291aa69f9f39db8 +Author: Behdad Esfahbod +Date: Mon Oct 15 22:19:17 2018 -0700 + + [vector] Simplify sort + + Hopefully this fits fine with SFINAE with all our compilers. + + src/hb-vector.hh | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 61510b63c15e91d80e36a497260db0e2d6d36c66 +Author: Ebrahim Byagowi +Date: Tue Oct 16 14:17:21 2018 +0330 + + [test] Minor cleanup in test-multithread and test-ot-name (#1256) + + test/api/CMakeLists.txt | 2 +- + test/api/Makefile.am | 2 +- + test/api/test-multithread.c | 6 ++- + test/api/{test-ot-nameid.c => test-ot-name.c} | 58 + ++++++++++++++------------- + 4 files changed, 36 insertions(+), 32 deletions(-) + +commit 42b75dc3a701b13665115e2a234bfa5dedafef3f +Author: Ebrahim Byagowi +Date: Tue Oct 16 10:58:09 2018 +0330 + + [kerx] Minor, remove debug bit + + src/hb-aat-layout-kerx-table.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 11703afce6cebbb4c5e7cdea59ca59a1787608b8 +Author: Behdad Esfahbod +Date: Mon Oct 15 21:16:58 2018 -0700 + + [kerx] Fix Format6 sanitize + + Fixes https://oss-fuzz.com/v2/testcase-detail/5650286710882304 + + src/hb-aat-layout-kerx-table.hh | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +commit 4c27da7638f6d072c3ff93223488c4ab316236c1 +Author: Behdad Esfahbod +Date: Mon Oct 15 19:46:45 2018 -0700 + + [CBDT] Fix more offsetting + + Fixes https://oss-fuzz.com/v2/testcase-detail/5750379279548416 + + src/hb-ot-color-cbdt-table.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 9ade3e7bb81be43b3c0811614b9b9533127894b0 +Merge: 6420ffe0 0f85edb7 +Author: Michiharu Ariza +Date: Mon Oct 15 14:03:23 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 6420ffe00fc4f4c6ffa63b80d961f70bc36c2caf +Author: Michiharu Ariza +Date: Mon Oct 15 14:03:18 2018 -0700 + + fixed type casting bug + + src/hb-cff-interp-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0f85edb7781f4d5ec2de676979be75a0f6559d80 +Author: Behdad Esfahbod +Date: Mon Oct 15 11:15:54 2018 -0700 + + [morx] Another end-of-text corner case + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10990 + + src/hb-aat-layout-morx-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 55d5ea666c25f75e9b1bc2eb43cfb104a16ebe04 +Author: Behdad Esfahbod +Date: Mon Oct 15 11:04:49 2018 -0700 + + [kerx] Merge clusters in Ligature + + src/hb-aat-layout-morx-table.hh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit bb35725cd760f07fdb0586453512a106e534b739 +Author: Behdad Esfahbod +Date: Mon Oct 15 10:20:39 2018 -0700 + + [kerx/morx] More end-of-text protection + + src/hb-aat-layout-kerx-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8f3048a1f838484babc4948754c16dda8f53daf1 +Author: Ebrahim Byagowi +Date: Mon Oct 15 12:16:47 2018 +0330 + + [dump-emoji] minor + + src/dump-emoji.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 27e095a613ed0a753231405cab887da19e9aecd1 +Author: Ebrahim Byagowi +Date: Mon Oct 15 12:04:14 2018 +0330 + + [dump-emoji] better explaination of the usage + + src/dump-emoji.cc | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit 8dc6296818e3a52c003852aa185f2b7eb6afa5d3 +Author: Behdad Esfahbod +Date: Mon Oct 15 01:09:05 2018 -0700 + + [ot-font] Implement TrueType v_origin + + Fixes https://github.com/harfbuzz/harfbuzz/issues/537 + + src/hb-ot-font.cc | 31 +++++++++++++++++- + src/hb-ot-hmtx-table.hh | 43 + ++++++++++++++++--------- + test/shaping/data/in-house/tests/vertical.tests | 2 +- + 3 files changed, 59 insertions(+), 17 deletions(-) + +commit 6e07076fd094afc8c9c8ad8f08453e7882294592 +Author: Behdad Esfahbod +Date: Sun Oct 14 22:22:45 2018 -0700 + + [blob] Fix UBSan error + + src/hb-blob.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit fc812faaa96aa4e67814a92376b2da751d5a0aba +Author: Behdad Esfahbod +Date: Sun Oct 14 21:32:09 2018 -0700 + + [CBDT] Fix more offsetting issues + + Fixes https://github.com/harfbuzz/harfbuzz/issues/960 + + dump-emoji still segfaults. Needs debugging. + + src/hb-ot-color-cbdt-table.hh | 28 +++++++++++++++------------- + 1 file changed, 15 insertions(+), 13 deletions(-) + +commit 6aee3bb87cee88525b745a640df294cb721245f6 +Author: Behdad Esfahbod +Date: Sun Oct 14 21:08:42 2018 -0700 + + [CBDT] Fix offset handling + + Fixes https://github.com/harfbuzz/harfbuzz/issues/960 + + src/hb-ot-color-cbdt-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit da744c6b3e79b778f414ec9f4d9070d06ec2a706 +Author: Behdad Esfahbod +Date: Sun Oct 14 20:49:21 2018 -0700 + + [CBDT] More UnsizedArrayOf cleanup + + src/hb-ot-color-cbdt-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2995b4465bce52b30de2cb6ba24cc80d8602413d +Author: Behdad Esfahbod +Date: Sun Oct 14 20:37:57 2018 -0700 + + [CBDT] Simplify sanitize + + src/hb-ot-color-cbdt-table.hh | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 1c76c8f6ff7877e486f6e94d04b2dc65348b26d5 +Author: Behdad Esfahbod +Date: Sun Oct 14 19:39:31 2018 -0700 + + [morx] Handle end-of-text conditions in Insertion + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10955 + + src/hb-aat-layout-morx-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 60c13976733ea05e71c66c486d62e31ffbb71bac +Author: Behdad Esfahbod +Date: Sun Oct 14 19:36:46 2018 -0700 + + [buffer] Fix output_glyph at end of buffer + + Part of https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10955 + + src/hb-buffer.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 7efa38257b6f79d1c6e2a9bad29c33af276abe29 +Author: Behdad Esfahbod +Date: Sun Oct 14 19:30:44 2018 -0700 + + [aat] More protection against buffer fail + + src/hb-aat-layout-common.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit e1add2a275a8afa5efc22aa44a4e62646f0b0ba4 +Author: Behdad Esfahbod +Date: Sun Oct 14 16:26:03 2018 -0700 + + [hmtx] Whitespace + + src/hb-ot-hmtx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 62376a7d983442408059b0b8987e7ca8d1de154e +Author: Behdad Esfahbod +Date: Sun Oct 14 15:20:50 2018 -0700 + + Ignore signed-integer-overflow while kerning + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1247 + + src/hb-ot-kern-table.hh | 1 + + src/hb.hh | 9 +++++++++ + 2 files changed, 10 insertions(+) + +commit 40f2b9355cf827c7b82ea5e55b112ce0032a9abf +Author: Behdad Esfahbod +Date: Sun Oct 14 14:56:32 2018 -0700 + + [kerx] Fix Format1 sanitize + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10948 + + src/hb-aat-layout-kerx-table.hh | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 44af1f93ee32e236a5c14085c72d3fa102a14f5e +Author: Behdad Esfahbod +Date: Sun Oct 14 14:52:17 2018 -0700 + + [aat] Whitespace + + src/hb-aat-layout-common.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit db0d83ddc73ecf50ec4489fc10eddf3fa5835ae2 +Merge: 9228db06 56b8dd17 +Author: Michiharu Ariza +Date: Sat Oct 13 17:25:38 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 9228db06f46908afd0e62f5964470c37c66ba91f +Author: Michiharu Ariza +Date: Sat Oct 13 17:25:09 2018 -0700 + + added CFF1 Expert Encoding subset test & bug fixes + + src/hb-ot-cff1-table.hh | 8 +++++++- + src/hb-subset-cff1.cc | 10 ++++++++-- + test/api/fonts/cff1_expert.2D,F6E9,FB00.otf | Bin 0 -> 3096 bytes + test/api/fonts/cff1_expert.otf | Bin 0 -> 3656 bytes + test/api/test-subset-cff1.c | 21 +++++++++++++++++++++ + 5 files changed, 36 insertions(+), 3 deletions(-) + +commit 56b8dd17f677ffe97e4d917c47924e1ac7632c71 +Author: Behdad Esfahbod +Date: Sat Oct 13 19:03:33 2018 -0400 + + [aat] Finish off massaging table + + src/hb-aat-layout.cc | 163 + +++++++++++++++++++++++++-------------------------- + 1 file changed, 81 insertions(+), 82 deletions(-) + +commit e0c5e0d91bbc0c8b2bb547ba5cb118989affc617 +Author: Behdad Esfahbod +Date: Sat Oct 13 18:37:14 2018 -0400 + + [aat] WIP remove feature mapping here from hb-coretext + + Need to map enum values to numerics since we don't have CoreText + headers. + + src/hb-aat-layout.cc | 94 +++++++++++++++++++++++++ + src/hb-aat-layout.hh | 22 ++++++ + src/hb-coretext.cc | 189 + +-------------------------------------------------- + 3 files changed, 117 insertions(+), 188 deletions(-) + +commit cb057749131826dd89bc3b92527116a974ae3bbe +Author: Behdad Esfahbod +Date: Sat Oct 13 17:03:32 2018 -0400 + + [coretext] Prepare AAT feature mapping to be moved + + src/hb-coretext.cc | 39 ++++++++++++++++++++++----------------- + 1 file changed, 22 insertions(+), 17 deletions(-) + +commit de6e414c565de5f27b9da8c7b8b11f88659a4c42 +Author: Behdad Esfahbod +Date: Sat Oct 13 13:48:22 2018 -0400 + + [kerx] Sanitize more + + src/hb-aat-layout-kerx-table.hh | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 71f76f2f39c88998b430b171c99b85818d4fa0ab +Author: Behdad Esfahbod +Date: Sat Oct 13 13:36:27 2018 -0400 + + [kerx] Fix-up previous commit + + A "&" was missing. Go back to using pointers that are less + error-prone. + + src/hb-aat-layout-kerx-table.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 6d4b054234b4736ca9927268ee3e2d9a0f8f6ead +Author: Behdad Esfahbod +Date: Sat Oct 13 12:20:33 2018 -0400 + + [kerx] Use sanitizer instead of handcoded runtime sanitization + + src/hb-aat-layout-kerx-table.hh | 24 +++++++++--------------- + 1 file changed, 9 insertions(+), 15 deletions(-) + +commit 5733113662e668a25187e0042935d955e44fb488 +Author: Behdad Esfahbod +Date: Sat Oct 13 12:16:12 2018 -0400 + + [kerx] Wire up context down to get_kerning + + src/hb-aat-layout-kerx-table.hh | 32 ++++++++++++++------------------ + 1 file changed, 14 insertions(+), 18 deletions(-) + +commit c4502833b711a76cce1af0c5bf075692b965c991 +Author: Behdad Esfahbod +Date: Sat Oct 13 11:48:49 2018 -0400 + + [kerx] Use sanitizer.get_num_glyphs() instead of + face->get_num_glyphs() + + src/hb-aat-layout-kerx-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fc45e698f2d8a6d577f33b1e69a83714aceae528 +Author: Behdad Esfahbod +Date: Sat Oct 13 11:39:12 2018 -0400 + + [kerx] Protext against overflows + + src/hb-aat-layout-kerx-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit ed2ee78136c40de8e7b915dfdfd3ca92880912c3 +Author: Behdad Esfahbod +Date: Sat Oct 13 09:47:51 2018 -0400 + + [hangul] Fix use-after-free issue + + out_info might have moved since we copied it's position into local + info var. + + Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=894937 + + src/hb-ot-shape-complex-hangul.cc | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +commit 63109432cf61333e01af4ef5163d4202bb43f84d +Author: Ebrahim Byagowi +Date: Sat Oct 13 14:00:05 2018 +0330 + + Cosmetic and minor changes + + src/hb-buffer-serialize.cc | 4 +- + src/hb-ot-cmap-table.hh | 4 +- + src/hb-ot-layout-common.hh | 4 +- + src/hb-ot-layout-gsubgpos.hh | 8 +-- + src/hb-ot-layout.cc | 127 + +++++++++++++++++++------------------------ + src/hb-ot-layout.h | 25 +++++---- + src/hb-ot-math-table.hh | 8 +-- + src/hb-ot-name.h | 1 - + src/hb-ot-shape-complex.hh | 18 +++--- + 9 files changed, 93 insertions(+), 106 deletions(-) + +commit b64ef69b9e3d9cd4e81a2149cea3fe6e9e371cac +Author: Michiharu Ariza +Date: Fri Oct 12 14:14:21 2018 -0700 + + from encode_int removed assert hit by fuzzer + + clamp the value instead + + src/hb-subset-cff-common.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit c0a6814b49e376984a0cae9d385a6f6ba8c73579 +Author: Behdad Esfahbod +Date: Fri Oct 12 16:05:56 2018 -0400 + + Touch up new API + + New API: + +hb_ot_layout_feature_get_name_ids() + +hb_ot_layout_feature_get_characters() + + src/hb-ot-layout.cc | 16 +++++++++------- + src/hb-ot-layout.h | 2 -- + test/api/test-ot-nameid.c | 16 ++++++++++------ + 3 files changed, 19 insertions(+), 15 deletions(-) + +commit 477bc9aafeaf89708d13a436869126351e2d9b50 +Author: Behdad Esfahbod +Date: Fri Oct 12 15:52:31 2018 -0400 + + Add hb-ot-name.h + + Actual name-fetching API to come later. + + New API: + hb_name_id_t + HB_NAME_ID_INVALID + + src/Makefile.sources | 1 + + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout.h | 12 ++--------- + src/hb-ot-name.h | 54 + ++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot.h | 1 + + 5 files changed, 59 insertions(+), 11 deletions(-) + +commit dc49bd8d813571fe16d9e5342e4a3926ff947bd6 +Author: Ebrahim Byagowi +Date: Fri Oct 12 03:00:59 2018 +0330 + + Add two APIs for getting stylistic set labels + + * hb_ot_layout_feature_get_characters + * hb_ot_layout_feature_get_name_ids + + However HarfBuzz currently doesn't expose an API for retrieving + the actual + information associated with NameId from the `name` table and that + should be + done separately. + + docs/harfbuzz-sections.txt | 2 + + src/hb-ot-layout-common.hh | 14 +++++ + src/hb-ot-layout.cc | 133 + +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-layout.h | 29 ++++++++++ + test/api/CMakeLists.txt | 2 + + test/api/Makefile.am | 1 + + test/api/fonts/cv01.otf | Bin 0 -> 1956 bytes + test/api/test-ot-nameid.c | 96 ++++++++++++++++++++++++++++++++ + 8 files changed, 277 insertions(+) + +commit e9f9c0d81c73d8b6d87700aadb5b886bd289769a +Author: Behdad Esfahbod +Date: Thu Oct 11 21:37:45 2018 -0400 + + [sanitize] Reorder condition to silence bogus gcc warning + + Was givin a dozen of: + + ../../src/hb-machinery.hh: In member function ‘bool + AAT::ankr::sanitize(hb_sanitize_context_t*) const’: + ../../src/hb-machinery.hh:307:23: warning: missed loop optimization, + the loop counter may overflow [-Wunsafe-loop-optimizations] + bool ok = --this->max_ops > 0 && + ~~~~~~~~~~~~~~~~~~~~~~ + this->start <= p && + ~~~~~~~~~~~~~~~~~~~ + p <= this->end && + ~~~~~~~~~~~~~~~^~ + (unsigned int) (this->end - p) >= len; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + I believe those are bogus, but this silences them and does not + introduce + logic issues I believe. + + src/hb-machinery.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 1a6b5ac6c300ed2ccdcd8eadde433120f6e07f2a +Author: Behdad Esfahbod +Date: Thu Oct 11 21:22:49 2018 -0400 + + Add HB_DEPRECATED_FOR and mark relevant symbols + + src/hb-common.h | 8 ++++++++ + src/hb-deprecated.h | 10 +++++----- + src/hb-graphite2.h | 2 +- + 3 files changed, 14 insertions(+), 6 deletions(-) + +commit c9413d7bb575093411b39ac21974795b6ad91454 +Author: Behdad Esfahbod +Date: Thu Oct 11 21:19:39 2018 -0400 + + [graphite] Add HB_DEPRECATED annotation + + src/hb-graphite2.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 68c86af187ff645a1305ac3b64832f3bb2350519 +Author: Behdad Esfahbod +Date: Thu Oct 11 21:18:20 2018 -0400 + + Always compile deprecated symbols + + We haven't been keeping this updated. So, while we don't expose the + symbols in the headers if HB_DISABLE_DEPRECATED is defined, we still + always build them. + + src/hb-font.cc | 4 ---- + 1 file changed, 4 deletions(-) + +commit fc0153a1d4903a57b21974cc8d0b0a82d7bc43dc +Merge: 7d99a6ce c5510000 +Author: Michiharu Ariza +Date: Fri Oct 12 12:16:50 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 7d99a6cef80ec178c10dcf0e848394614c5e6912 +Author: Michiharu Ariza +Date: Fri Oct 12 02:16:07 2018 -0700 + + overhauled error handling in CFF interpreter + + minimized "if (error) return false" idiom + + src/hb-cff-interp-common.hh | 138 + +++++++++++++++++++++++---------------- + src/hb-cff-interp-cs-common.hh | 43 ++++++------ + src/hb-cff-interp-dict-common.hh | 72 +++++++++++--------- + src/hb-cff1-interp-cs.hh | 72 +++++++++++--------- + src/hb-cff2-interp-cs.hh | 50 +++++++------- + src/hb-ot-cff1-table.hh | 91 +++++++++++--------------- + src/hb-ot-cff2-table.hh | 71 +++++++++----------- + 7 files changed, 281 insertions(+), 256 deletions(-) + +commit c55100000bc20d7c8319cfc54294215a923ffc25 +Author: David Corbett +Date: Thu Oct 11 22:08:14 2018 -0400 + + Add missing colons to GObject annotations + + src/hb-ot-tag.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1e816d62efe1b3540ef605092b97794e68ec0832 +Author: David Corbett +Date: Thu Oct 11 20:37:49 2018 -0400 + + Fix Indic script tags in Graphite + + src/hb-graphite2.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bf8469be9a8932cc407b60daf4d494fef46e233b +Author: Behdad Esfahbod +Date: Thu Oct 11 20:45:00 2018 -0400 + + Attach CursivePositioning backwards, not forward + + This is how Uniscribe does it. So, adjust. This is only relevant + to fonts that apply cursive positioning from a contextual lookup. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1181 + + src/hb-ot-layout-gpos-table.hh | 20 + ++++++++++---------- + .../9fc3e6960b3520e5304033ef5fd540285f72f14d.ttf | Bin 0 -> 2380 bytes + .../data/in-house/tests/cursive-positioning.tests | 1 + + 3 files changed, 11 insertions(+), 10 deletions(-) + +commit bdb53ca24a5ad9671d8e29e17d1d8981505bd882 +Author: Behdad Esfahbod +Date: Thu Oct 11 20:20:00 2018 -0400 + + [myanmar] Implement Zawgyi shaper + + Enabled if script tag 'Qaag' is passed to HarfBuzz. Disables mark + advance-zeroing and fallback mark-positioning. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1162 + + src/hb-ot-shape-complex-myanmar.cc | 22 + +++++++++++++++++++++ + src/hb-ot-shape-complex.hh | 5 +++++ + src/hb.hh | 8 ++++++++ + test/shaping/data/in-house/Makefile.sources | 1 + + .../ab14b4eb9d7a67e293f51d30d719add06c9d6e06.ttf | Bin 0 -> 1792 bytes + .../data/in-house/tests/myanmar-zawgyi.tests | 1 + + 6 files changed, 37 insertions(+) + +commit 00c5c4a79dfb352a679a5c56bf9c756ab0fa98d2 +Author: Behdad Esfahbod +Date: Thu Oct 11 20:15:31 2018 -0400 + + [myanmar] Shuffle + + src/hb-ot-shape-complex-myanmar.cc | 33 +++++++++++++++++---------------- + 1 file changed, 17 insertions(+), 16 deletions(-) + +commit ec8f493bf9fefc33f027db24c4b175990b2d751c +Author: Behdad Esfahbod +Date: Thu Oct 11 20:15:00 2018 -0400 + + [graphite] Remove assert + + src/hb-graphite2.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 5646dcbd1125049c3af342fadfcfcbd523ce53d3 +Author: Behdad Esfahbod +Date: Thu Oct 11 19:39:07 2018 -0400 + + Minor + + src/hb-ot-tag.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 788e1478557603d30966f12449eef0d0bd51c880 +Author: Behdad Esfahbod +Date: Thu Oct 11 19:24:52 2018 -0400 + + [test] Add test for USE indic3 + + test/shaping/data/in-house/Makefile.sources | 1 + + .../fonts/3c96e7a303c58475a8c750bf4289bbe73784f37d.ttf | Bin 0 -> + 3364 bytes + test/shaping/data/in-house/tests/use-indic3.tests | 1 + + 3 files changed, 2 insertions(+) + +commit a11972787a2a90b541f92cc56bb885859390a0c0 +Author: Behdad Esfahbod +Date: Thu Oct 11 19:23:36 2018 -0400 + + Minor + + test/shaping/record-test.sh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 654365dc894326f04abaaba415f48ca5ba2d1286 +Author: Behdad Esfahbod +Date: Thu Oct 11 17:51:21 2018 -0400 + + Pass indic3 tags to USE shaper + + Fixes https://github.com/harfbuzz/harfbuzz/issues/539 + + src/hb-ot-shape-complex.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 28d091d045b042506a1ec2cdefe7cf0d718e8b22 +Author: David Corbett +Date: Thu Oct 11 17:15:22 2018 -0400 + + Parse Indic3 tags + + src/hb-ot-tag.cc | 11 ++++++++--- + test/api/test-ot-tag.c | 44 +++++++++++++++++++++++++------------------- + 2 files changed, 33 insertions(+), 22 deletions(-) + +commit 211cd3691ba01b1cb2eeb8a91ac3532181791a8a +Author: Behdad Esfahbod +Date: Thu Oct 11 17:31:29 2018 -0400 + + Remove remains of get-codepoint-fuzzer + + test/fuzzing/CMakeLists.txt | 7 +------ + test/fuzzing/run-subset-fuzzer-tests.py | 12 ------------ + 2 files changed, 1 insertion(+), 18 deletions(-) + +commit 120ed0272569e6a34172a511d4a5a70a3a18f1d2 +Author: Behdad Esfahbod +Date: Thu Oct 11 17:08:12 2018 -0400 + + [fuzzing] Fold get-codepoints-fuzzer into subset-fuzzer + + test/fuzzing/Makefile.am | 16 ---------------- + test/fuzzing/hb-subset-fuzzer.cc | 5 +++++ + test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 23 + ----------------------- + 3 files changed, 5 insertions(+), 39 deletions(-) + +commit 2c824d3644e16643c2bbe85fb88f9fb6fed53ce7 +Author: Behdad Esfahbod +Date: Thu Oct 11 16:41:01 2018 -0400 + + [aat] Fix two wrongs that made a right before! + + Unfortunately our static asserts (DEFINE_SIZE_STATIC) don't actually + fail when used in templates, thanks to SFINAE. Le sighs. + + Probably fixes + https://oss-fuzz.com/v2/testcase-detail/5740171484463104 + + src/hb-aat-layout-common.hh | 4 ++-- + src/hb-open-type.hh | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit e940530c9723c3a581a5d5b31e5f419865dd6cc7 +Author: Behdad Esfahbod +Date: Thu Oct 11 15:56:17 2018 -0400 + + [aat] Fix mul overflow + + Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10897 + + src/hb-aat-layout-common.hh | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +commit 1d995a340b9e17fc8dca7a3e88e0918de2d8f02c +Author: Behdad Esfahbod +Date: Thu Oct 11 15:42:54 2018 -0400 + + Minor + + test/api/hb-subset-test.h | 6 ++---- + test/api/test-multithread.c | 5 +---- + test/fuzzing/main.cc | 2 +- + 3 files changed, 4 insertions(+), 9 deletions(-) + +commit 0744a02cb12e4d800abb611dfa5d268bb2dfd9f3 +Author: Behdad Esfahbod +Date: Thu Oct 11 15:14:18 2018 -0400 + + [arabic] Update to latest UTR#53 + + From Lorna Evans: "That was a new character added to Unicode 11.0" + + src/hb-ot-shape-complex-arabic.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 57b05210b1a8968d18ccbbe70879b2e11b6a09f2 +Author: Behdad Esfahbod +Date: Thu Oct 11 15:03:21 2018 -0400 + + [test] Fix use of deprecated symbols + + test/api/test-ot-tag.c | 60 + ++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 46 insertions(+), 14 deletions(-) + +commit ca37172ee3908bac12cc3d97768b95ae571530d2 +Author: Michiharu Ariza +Date: Thu Oct 11 11:55:55 2018 -0700 + + fixed leak + + test/api/test-ot-extents-cff.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4f9e36e8cf5d9d3d3e5a1ed46149355ee5f5e9fb +Author: Behdad Esfahbod +Date: Thu Oct 11 14:32:59 2018 -0400 + + [graphite] Remove deprecated symbol use + + src/hb-graphite2.cc | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit da591f2a9d2ae2a5878d3b2ef78a6d589b19aab0 +Author: Behdad Esfahbod +Date: Thu Oct 11 14:30:15 2018 -0400 + + Whitespace + + src/hb-ot-tag.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 4d205f0462b19f371df495b9cc12c0128f507de9 +Author: Behdad Esfahbod +Date: Thu Oct 11 14:25:48 2018 -0400 + + [graphite] Fix deva/dev2 resolution + + See + https://github.com/harfbuzz/harfbuzz/pull/730#issuecomment-428277800 + + src/hb-graphite2.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8061664ad1a5933098adc3bc1dca0b5be48586ef +Author: Behdad Esfahbod +Date: Thu Oct 11 14:16:55 2018 -0400 + + Add doc stubs for recently added API + + Thanks to David Corbett who revamped our script and language + processing + and implemented full BCP 47 support. + + https://github.com/harfbuzz/harfbuzz/pull/730 + + New API: + +hb_ot_layout_table_select_script() + +hb_ot_layout_script_select_language() + +HB_OT_MAX_TAGS_PER_SCRIPT + +HB_OT_MAX_TAGS_PER_LANGUAGE + +hb_ot_tags_from_script_and_language() + +hb_ot_tags_to_script_and_language() + + Deprecated API: + -hb_ot_layout_table_choose_script() + -hb_ot_layout_script_find_language() + -hb_ot_tags_from_script() + -hb_ot_tag_from_language() + + src/hb-ot-layout.cc | 10 ++++++++++ + src/hb-ot-tag.cc | 21 ++++++++++++++++----- + src/hb-ot-tag.h | 10 ++++++++++ + src/hb-unicode.h | 2 +- + 4 files changed, 37 insertions(+), 6 deletions(-) + +commit cf975ac653bff369f4ed7ba7fc04fae6ce2cec95 +Author: Behdad Esfahbod +Date: Thu Oct 11 14:07:44 2018 -0400 + + Remove use of deprecated function + + src/hb-ot-layout.cc | 23 ++++++++++++----------- + src/hb-ot-layout.h | 12 ++++++------ + 2 files changed, 18 insertions(+), 17 deletions(-) + +commit 66790d64c7120b75c72bf91c769dc52d95858909 +Author: David Corbett +Date: Mon Sep 10 13:15:00 2018 -0400 + + Increase HB_OT_MAX_TAGS_PER_SCRIPT to 3 + + No script has 3 tags yet, but the plan is for the Indic scripts + to each + get a third tag someday. + + src/hb-ot-tag.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bca7a16938609539e4adb5cdf943734b7dfa1561 +Author: David Corbett +Date: Mon Sep 10 12:05:51 2018 -0400 + + Update language system tag registry to OT 1.8.3 + + src/gen-tag-table.py | 10 +++++++++- + src/hb-ot-tag-table.hh | 44 +++++++++++++++++++++++++++++++++----------- + 2 files changed, 42 insertions(+), 12 deletions(-) + +commit 7f1fbfe2e312f397db9271dd17a8e701489ffc79 +Author: David Corbett +Date: Mon Jul 23 21:19:23 2018 -0400 + + Add hb_ot_tags_to_script_and_language + + docs/harfbuzz-sections.txt | 3 +- + src/hb-ot-map.cc | 2 +- + src/hb-ot-tag.cc | 75 + ++++++++++++++++++++++++++++++++++++++++------ + src/hb-ot-tag.h | 18 +++++++---- + test/api/test-ot-tag.c | 33 ++++++++++++++++++-- + 5 files changed, 112 insertions(+), 19 deletions(-) + +commit 3f8877473fb4c72a6f3edfcfc927b9993a5f3616 +Author: David Corbett +Date: Thu Jul 19 13:48:07 2018 -0400 + + Switch on the first char of a complex language tag + + This results in a tenfold speed-up for the common case of tags + that are + not complex, in the sense of `hb_ot_tags_from_complex_language`. + + src/gen-tag-table.py | 171 ++++-- + src/hb-ot-tag-table.hh | 1580 + ++++++++++++++++++++++++------------------------ + 2 files changed, 922 insertions(+), 829 deletions(-) + +commit a754d44195021603306af2a296d06187eda95409 +Author: David Corbett +Date: Mon Jul 16 21:14:48 2018 -0400 + + Map Quechua languages to closest ones with tags + + OpenType only officially maps four ISO 639 codes to Quechua languages, + but prior versions of HarfBuzz also mapped qu to 'QUZ '. Because qu + is a + macrolanguage, the mapping now applies to all individual Quechua + languages. OpenType calls 'QUZ ' "Quechua", but it really corresponds + to + Cusco Quechua, so the individual Quechua languages should not all + necessarily be mapped to it. + + src/gen-tag-table.py | 32 ++++++++++++++++++++++++++ + src/hb-ot-tag-table.hh | 62 + +++++++++++++++++++++++++++----------------------- + 2 files changed, 65 insertions(+), 29 deletions(-) + +commit 65d01f77552a5102ee114d9917fd2ecf091a35c3 +Author: David Corbett +Date: Thu Jan 18 16:33:39 2018 -0500 + + Test deprecated tag fallback in a font + + The font supports the deprecated tag 'DHV ' instead of 'DIV '. dv is + mapped to 'DIV ' and 'DHV ', in that order. The test specifies + `--language=dv`, demonstrating that if a font does not support + the first + OpenType tag mapped to a BCP 47 tag, it will fall back to the + next tag. + + .../fonts/d3129450fafe5e5c98cfc25a4e71809b1b4d2855.ttf | Bin 0 -> + 956 bytes + test/shaping/data/in-house/tests/language-tags.tests | 1 + + 2 files changed, 1 insertion(+) + +commit 7c7cb2a98907d99ca86bdbfca0bf9c48bfa4ed49 +Author: David Corbett +Date: Sat Jan 20 15:53:09 2018 -0500 + + Match extlang subtags + + If the second subtag of a BCP 47 tag is three letters long, it denotes + an extended language. The tag converter ignores the language + subtag and + uses the extended language instead. + + There are some grandfathered exceptions, which are handled earlier. + + src/gen-tag-table.py | 2 +- + src/hb-ot-tag-table.hh | 21 +++++++++++++++++++++ + src/hb-ot-tag.cc | 10 +++++++++- + test/api/test-ot-tag.c | 7 +++++++ + 4 files changed, 38 insertions(+), 2 deletions(-) + +commit 2f1f961cc0f0f907916b4b00342d8a2dda8b4ee1 +Author: David Corbett +Date: Fri Dec 8 22:45:52 2017 -0500 + + Autogenerate the BCP 47 to OpenType mappings + + The new script, gen-tag-table.py, generates `ot_languages` + automatically + from the [OpenType language system tag registry][ot] and the [IANA + Language Subtag Registry][bcp47] with some manual modifications. If an + OpenType tag maps to a BCP 47 macrolanguage, all the macrolanguage's + individual languages are mapped to the same OpenType tag, except for + individual languages with their own OpenType mappings. Deprecated + BCP 47 tags are canonicalized. + + [ot]: + https://docs.microsoft.com/en-us/typography/opentype/spec/languagetags + [bcp47]: + https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry + + Some OpenType tags correspond to multiple ISO 639 codes. The mapping + from ISO 639 codes lists OpenType tags in priority order, such + that more + specific or more likely tags appear first. + + Some OpenType tags have no corresponding ISO 639 code in the + registry so + their mappings use BCP 47 subtags besides the language. For example, + any + BCP 47 tag with a fonipa variant subtag is mapped to 'IPPH', and + 'IPPH' + is mapped back to und-fonipa. + + Other OpenType tags have no corresponding ISO 639 code because it + is not + clear what they are for. HarfBuzz just ignores these tags. + + One such ignored tag is 'ZHP ' (Chinese Phonetic). It probably means + zh-Latn. However, it is used in Microsoft JhengHei and Microsoft YaHei + with the script tag 'hani', implying that it is not a romanization + scheme after all. It would be simple enough to add this mapping to + gen-tag-table.py once a definitive mapping is determined. + + The manual modifications are mainly either obvious mappings that the + OpenType registry omits or mappings for compatibility with previous + versions of HarfBuzz. Some of the old mappings were discarded, though, + for homophonous language names. For example, OpenType maps 'KUI ' to + kxu; previous versions of HarfBuzz also mapped it to kvd, because kvd + and kxu both happen to be called "Kui". + + gen-tag-table.py also generates a function to convert multi-subtag + tags + like el-polyton and zh-HK to OpenType tags, replacing + `ot_languages_zh` + and the hard-coded list of special cases in + `hb_ot_tags_from_language`. + It also generates a function to convert OpenType tags to BCP 47, + replacing the hard-coded list of special cases in + `hb_ot_tag_to_language`. + + src/Makefile.am | 9 +- + src/Makefile.sources | 1 + + src/gen-tag-table.py | 1013 ++++++++++++++++++++++++ + src/hb-ot-tag-table.hh | 1997 + ++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-tag.cc | 842 +------------------- + src/hb-ot-tag.h | 2 +- + test/api/test-ot-tag.c | 66 +- + 7 files changed, 3092 insertions(+), 838 deletions(-) + +commit 2c7d4db7af16e228bb30eddf7334a524b74ae26c +Author: David Corbett +Date: Fri Dec 29 20:19:05 2017 +0800 + + Deprecate obsolete functions + + `hb_ot_tags` replaces `hb_ot_tags_from_script` and + `hb_ot_tag_from_language`. + + `hb_ot_layout_table_select_script` replaces + `hb_ot_layout_table_choose_script`. + + `hb_ot_layout_script_select_language` replaces + `hb_ot_layout_script_find_language`. + + docs/harfbuzz-sections.txt | 8 ++++---- + src/hb-deprecated.h | 23 +++++++++++++++++++++++ + src/hb-ot-layout.h | 15 --------------- + src/hb-ot-tag.h | 8 -------- + 4 files changed, 27 insertions(+), 27 deletions(-) + +commit 91067716f5e7b15d9a642f69019246c83fc7c108 +Author: David Corbett +Date: Fri Dec 8 11:21:14 2017 -0500 + + Refactor the selection of script and language tags + + The old hb-ot-tag.cc functions, `hb_ot_tags_from_script` and + `hb_ot_tag_from_language`, are now wrappers around a new function: + `hb_ot_tags`. It converts a script and a language to arrays of script + tags and language tags. This will make it easier to add new script + tags + to scripts, like 'dev3'. It also allows for language fallback chains; + nothing produces more than one language yet though. + + Where the old functions return the default tags 'DFLT' and 'dflt', + `hb_ot_tags` returns an empty array. The caller is responsible for + using the default tag in that case. + + The new function also adds a new private use subtag syntax for script + overrides: "x-hbscabcd" requests a script tag of 'abcd'. + + The old hb-ot-layout.cc functions,`hb_ot_layout_table_choose_script` + and + `hb_ot_layout_script_find_language` are now wrappers around the new + functions `hb_ot_layout_table_select_script` and + `hb_ot_layout_script_select_language`. They are essentially the + same as + the old ones plus a tag count parameter. + + Closes #495. + + docs/harfbuzz-sections.txt | 5 + + src/hb-ot-layout.cc | 43 +- + src/hb-ot-layout.h | 16 + + src/hb-ot-map.cc | 13 +- + src/hb-ot-tag.cc | 1639 + ++++++++++++++++++++++++-------------------- + src/hb-ot-tag.h | 11 + + test/api/test-ot-tag.c | 107 +++ + 7 files changed, 1070 insertions(+), 764 deletions(-) + +commit a03f5f4dfbbf885db567c3909241a55eb5869fce +Author: David Corbett +Date: Thu Dec 28 22:59:29 2017 +0800 + + Replace "ISO 639" with "BCP 47" + + `hb_language_from_string` accepts not only ISO 639 but also BCP + 47. Not + all ISO 639 codes are valid BCP 47 tags but the function does + not accept + overlong language subtags anyway. + + src/hb-buffer.cc | 2 +- + src/hb-common.cc | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit ce6639cd27f79856466a5e8abf58f544f069e25d +Merge: a6b6faf2 0b9d60e1 +Author: Michiharu Ariza +Date: Thu Oct 11 10:53:48 2018 -0700 + + Merge branch 'master' into cff-subset + +commit a6b6faf2b87f113fb23cf8e040f8b7875e2daf80 +Author: Michiharu Ariza +Date: Thu Oct 11 10:53:44 2018 -0700 + + Replaced CFF1 J subset font for better coverage + + in api test-ot-extents-cff + + test/api/fonts/SourceHanSans-Regular.41,3041,4C2E.otf | Bin 0 -> + 3892 bytes + test/api/fonts/SourceHanSans-Regular.41,3041,4E9D.otf | Bin 5864 -> + 0 bytes + test/api/fonts/SourceHanSans-Regular.41,4C2E.otf | Bin 0 -> + 2548 bytes + test/api/fonts/SourceHanSans-Regular.41,4E9D.otf | Bin 5500 -> + 0 bytes + test/api/test-ot-extents-cff.c | 15 + +++++++++++++++ + test/api/test-subset-cff1.c | 18 + +++++++++--------- + 6 files changed, 24 insertions(+), 9 deletions(-) + +commit 0b9d60e1a1c4b7867ac907bbd7c004191a14e697 +Author: Behdad Esfahbod +Date: Thu Oct 11 13:26:58 2018 -0400 + + [aat] Apply kerx if GPOS kern was not applied + + Ned tells me this is what Apple does. + + src/hb-ot-shape.cc | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit b59a428af08d6451a47f40ed01e594815ebf6303 +Author: Behdad Esfahbod +Date: Thu Oct 11 13:24:17 2018 -0400 + + Minor + + src/hb-ot-shape.cc | 6 +++++- + src/hb-ot-shape.hh | 5 +++-- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit 100e95f48e3d137c654d206e858d6419ea62a12c +Author: Behdad Esfahbod +Date: Thu Oct 11 11:30:45 2018 -0400 + + [trak] Add tests + + test/shaping/data/in-house/Makefile.sources | 1 + + test/shaping/data/in-house/fonts/TestTRAK.ttf | Bin 0 -> 2456 bytes + test/shaping/data/in-house/tests/aat-trak.tests | 8 ++++++++ + 3 files changed, 9 insertions(+) + +commit 04f72e8990ea61ffc6b62105c75e0a3e1b1ebab4 +Author: Behdad Esfahbod +Date: Thu Oct 11 11:25:07 2018 -0400 + + [trak] Implement extrapolation + + This concludes trak, as well as AAT shaping support! + + src/hb-aat-layout-trak-table.hh | 39 + ++++++++++++++++++++------------------- + 1 file changed, 20 insertions(+), 19 deletions(-) + +commit d6a12dba6da6262fd9e5d8397b46ac8516136cae +Author: Behdad Esfahbod +Date: Thu Oct 11 11:10:06 2018 -0400 + + [trak] Fix, and hook up + + Works beautifully! Test coming. + + src/hb-aat-layout-common.hh | 4 ++-- + src/hb-aat-layout-trak-table.hh | 6 ++++-- + src/hb-aat-layout.cc | 25 ++++++++++++++++++++++++- + src/hb-aat-layout.hh | 8 ++++++++ + src/hb-ot-shape.cc | 2 ++ + 5 files changed, 40 insertions(+), 5 deletions(-) + +commit 3d7dea6dfdc9e75dcca100a79525aa3736dbe29c +Author: Behdad Esfahbod +Date: Thu Oct 11 10:32:08 2018 -0400 + + [trak] Handle nSizes=0 and 1 + + src/hb-aat-layout-trak-table.hh | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +commit 451f3de521ff1b7f4d3b8ebb2cc0b95d88c9314a +Author: Behdad Esfahbod +Date: Thu Oct 11 10:30:32 2018 -0400 + + [trak] Fix counting + + src/hb-aat-layout-trak-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit a5be380cae9b49ed85c8620f1921209ef61a72ad +Author: Behdad Esfahbod +Date: Thu Oct 11 10:29:02 2018 -0400 + + [trak] More + + src/hb-aat-layout-trak-table.hh | 26 +++++++++++++++++--------- + 1 file changed, 17 insertions(+), 9 deletions(-) + +commit d06c4a867f0d383d8c27f2957e646d9e3fe6853b +Author: Behdad Esfahbod +Date: Thu Oct 11 10:22:01 2018 -0400 + + [trak] Only adjust around first glyph + + Assumes graphemes only have one base glyph. + + src/hb-aat-layout-trak-table.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit 071a2cbcddcbafae9458e674c21db5001b39518d +Author: Behdad Esfahbod +Date: Thu Oct 11 10:18:46 2018 -0400 + + [trak] Clean up + + src/hb-aat-layout-trak-table.hh | 67 + +++++++++++++++++++++++------------------ + 1 file changed, 37 insertions(+), 30 deletions(-) + +commit fbbd926dba163d9a2a6a62f380951f03363c2b14 +Author: Behdad Esfahbod +Date: Thu Oct 11 01:22:29 2018 -0400 + + [kerx] Implement Format4 action_type=1 contour-point-based attachment + + Untested. + + This concludes kerx table support! + + src/hb-aat-layout-kerx-table.hh | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +commit b6bc0d4ff62e4509643db3b304306a72bbcb2c38 +Author: Behdad Esfahbod +Date: Thu Oct 11 01:17:57 2018 -0400 + + [kerx] Implement Format4 action_type=2 coordinate-based attachment + + Untested. + + src/hb-aat-layout-kerx-table.hh | 21 ++++++++++++--------- + 1 file changed, 12 insertions(+), 9 deletions(-) + +commit 1622ba5943d14b2d50d45dc17fb723f4c9ddb0bb +Author: Behdad Esfahbod +Date: Thu Oct 11 01:14:18 2018 -0400 + + [kerx] Implement Format4 'ankr'-based mark attachment + + Tested with Kannada MN: + + $ HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u 0CCD,0C95,0CD6 + [kn_ka.vattu=0+230|kn_ai_length_mark=1@326,0+607] + + src/hb-aat-layout-common.hh | 8 ++++++-- + src/hb-aat-layout-kerx-table.hh | 20 +++++++++++++++++--- + src/hb-aat-layout.cc | 20 ++++++++++++++++---- + src/hb-ot-layout-gpos-table.hh | 4 ---- + 4 files changed, 39 insertions(+), 13 deletions(-) + +commit 7bb4da7d9538f3d4b1d28030d43e0c3d720d821b +Author: Behdad Esfahbod +Date: Thu Oct 11 00:52:07 2018 -0400 + + [aat] Wire up 'ankr' table to apply context + + src/hb-aat-layout-common.hh | 7 +++++-- + src/hb-aat-layout.cc | 8 +++++++- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 28f0367aab648c486d6e8d0e13dbbb2af1b65dcc +Author: Behdad Esfahbod +Date: Thu Oct 11 00:12:49 2018 -0400 + + [kerx] Flesh out Format4 + + Doesn't apply actions yet. + + src/hb-aat-layout-kerx-table.hh | 122 + ++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 118 insertions(+), 4 deletions(-) + +commit 947962a287d9aca2cb509c11f44cb5150aa6daf1 +Author: Behdad Esfahbod +Date: Wed Oct 10 23:07:03 2018 -0400 + + [ankr] Implement table access + + src/hb-aat-layout-ankr-table.hh | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit 7281cb3eeb00091c6e6085895afd4a38a0516f35 +Author: Behdad Esfahbod +Date: Wed Oct 10 22:56:52 2018 -0400 + + [ankr] Start fixing + + src/hb-aat-layout-ankr-table.hh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 34caadc5c78e3d09faf11ef60bfade8f64f55de2 +Author: Behdad Esfahbod +Date: Wed Oct 10 22:17:07 2018 -0400 + + Ugh. Re-enable accidentally disabled GPOS + + src/hb-ot-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f7c45bc33ec1559c960a039b770d5c37bd82f057 +Author: Behdad Esfahbod +Date: Wed Oct 10 22:15:13 2018 -0400 + + [kerx] Allow granularly disabling kerning + + src/hb-aat-layout-kerx-table.hh | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 2b72c4b63d29eea39b646c8a1a1cfc2db732e1a6 +Author: Behdad Esfahbod +Date: Wed Oct 10 21:53:14 2018 -0400 + + [kerx] Comment + + src/hb-aat-layout-kerx-table.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit 9f450f07b0a1593962e3b45d00f2cf93916f3466 +Author: Behdad Esfahbod +Date: Wed Oct 10 21:46:58 2018 -0400 + + [kerx] Make Format1 work + + Tested using Kannada MN: + + $ HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u 0C95,0CCd,C95,CCD + [kn_ka.virama=0+1299|kn_ka.vattu=0+115|_blank=0@-115,0+385] + + $ HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u 0C95,0CCd,C95,CCD + --features=-kern + [kn_ka.virama=0+1799|kn_ka.vattu=0+230|_blank=0+0] + + I don't see the GPOS table in the font do the same. ¯\_(ツ)_/¯ + + src/hb-aat-layout-kerx-table.hh | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +commit b5aa5dbb1158a5dfba29f7b119df9b4b319e8489 +Merge: af61c3b1 ab1f30bd +Author: Michiharu Ariza +Date: Wed Oct 10 18:36:35 2018 -0700 + + Merge branch 'master' into cff-subset + +commit af61c3b10f83a00b4862cc0cb92fc9f0856e7dd6 +Author: Michiharu Ariza +Date: Wed Oct 10 18:35:12 2018 -0700 + + added vsindex test & fixed process_vsindex + + src/hb-cff2-interp-cs.hh | 12 +++++----- + test/api/fonts/AdobeVFPrototype_vsindex.otf | Bin 0 -> 7036 bytes + test/api/test-ot-extents-cff.c | 33 + ++++++++++++++++++++++++++++ + 3 files changed, 40 insertions(+), 5 deletions(-) + +commit 504cb68fc972c7f606bf9fc62015376382f78f45 +Author: Behdad Esfahbod +Date: Wed Oct 10 21:29:46 2018 -0400 + + Disable mark advance zeroing as well as mark fallback positioning + if doing kerx + + src/hb-ot-shape.cc | 50 + ++++++++++++++++++++++++++------------------------ + 1 file changed, 26 insertions(+), 24 deletions(-) + +commit 84967537966a76297c89460d95e7336f1bfc332d +Author: Behdad Esfahbod +Date: Wed Oct 10 21:18:37 2018 -0400 + + [kerx] Implement Format1 + + Untested. + + src/hb-aat-layout-kerx-table.hh | 62 + +++++++++++++++++++++++++++++++++-------- + src/hb-aat-layout-morx-table.hh | 2 +- + 2 files changed, 52 insertions(+), 12 deletions(-) + +commit c9165f5450b99e6d93e2a168b198384a221eef58 +Author: Behdad Esfahbod +Date: Wed Oct 10 20:43:21 2018 -0400 + + [kerx] More UnsizedArrayOf<> + + src/hb-aat-layout-kerx-table.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit ca54eba4846d0afda4601929556617a7ebe51714 +Author: Behdad Esfahbod +Date: Wed Oct 10 20:41:16 2018 -0400 + + [kerx] Fix bound-checking error introduced a couple commits past + + src/hb-aat-layout-kerx-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 339036dd970625e03696b4533ced1e25fc4fd131 +Author: Behdad Esfahbod +Date: Wed Oct 10 20:37:22 2018 -0400 + + [kerx] Start fleshing out Format1 + + src/hb-aat-layout-kerx-table.hh | 59 + +++++++++++++++++++++++++++++++++++------ + src/hb-aat-layout-morx-table.hh | 2 +- + 2 files changed, 52 insertions(+), 9 deletions(-) + +commit ab1f30bd059f1d2270793e9726b60666b328d2b8 +Author: Behdad Esfahbod +Date: Wed Oct 10 20:10:20 2018 -0400 + + [kerx] Implement Format6 + + Untested. The only Apple font shipping with this format is San + Francisco fonts + that use this for their kerx variation tables, which we don't support. + + src/hb-aat-layout-kerx-table.hh | 73 + +++++++++++++++++++++++++++++++++-------- + 1 file changed, 60 insertions(+), 13 deletions(-) + +commit c9a2ce9e05f91730a2150b9214dc6a49f31555c1 +Author: Behdad Esfahbod +Date: Wed Oct 10 20:00:44 2018 -0400 + + [kerx] Move bounds-checking to subtable length itself + + src/hb-aat-layout-kerx-table.hh | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +commit 22955b23cdeb48e46cdffd0eb906a855a420c4d1 +Author: Behdad Esfahbod +Date: Wed Oct 10 19:58:20 2018 -0400 + + [kerx] Start fleshing out Format6 + + src/hb-aat-layout-kerx-table.hh | 42 + ++++++++++++++++++++++++++++++++--------- + src/hb-open-type.hh | 3 +++ + 2 files changed, 36 insertions(+), 9 deletions(-) + +commit f6aaad9b4ffb42e6cd8398f6439fe420e393c8f6 +Author: Behdad Esfahbod +Date: Wed Oct 10 19:20:06 2018 -0400 + + [kerx] When rejecting variable kerning, also check for tupleCount + + src/hb-aat-layout-kerx-table.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7ed5366d3cfca9c533250cb419e8cc878f32505d +Author: Behdad Esfahbod +Date: Wed Oct 10 19:11:30 2018 -0400 + + [kerx] No-op + + Tested that Format0 works with Kannada MN font: + + $ make -j5 lib -s && HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc + -u 0C95,0CC2 + [kn_ka=0+1000|kn_matra_uu=0@-30,0+1345] + + $ make -j5 lib -s && HB_OPTIONS=aat ./hb-shape Kannada\ MN.ttc -u + 0C95,0CC2 --features=-kern + [kn_ka=0+1030|kn_matra_uu=0+1375] + + Note that GPOS does the same with 'dist' feature, and applies the + whole difference to the + same glyph: + + $ make -j5 lib -s && ./hb-shape Kannada\ MN.ttc -u 0C95,0CC2 + [kn_ka=0+970|kn_matra_uu=0+1375] + + $ make -j5 lib -s && ./hb-shape Kannada\ MN.ttc -u 0C95,0CC2 + --features=-dist + [kn_ka=0+1030|kn_matra_uu=0+1375] + + src/hb-aat-layout-kerx-table.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 7fa69e92ca3dd9d8fa92aba0e01098165d2b7975 +Author: Behdad Esfahbod +Date: Wed Oct 10 19:02:32 2018 -0400 + + Comment + + src/hb-machinery.hh | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 7e6e5bf6147596d6d096e2ba37f3a6eefd7429cd +Author: Behdad Esfahbod +Date: Wed Oct 10 18:59:07 2018 -0400 + + Fix option string matching + + src/hb-common.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5d34164d98f04816aafaa0abfc44cd899c7d70b3 +Author: Behdad Esfahbod +Date: Wed Oct 10 18:14:41 2018 -0400 + + [kern/kerx] Fix offset base + + Disable kern Format2. + + Fix kerx Format2. Manually tested this with Tamil MN font and + it works: + + $ HB_OPTIONS=aat ./hb-shape Tamil\ MN.ttc -u 0B94,0B95 + [tgv_au=0+3435|tgc_ka=1@-75,0+1517] + + HB_OPTIONS=aat ./hb-shape Tamil\ MN.ttc -u 0B94,0B95 --features=-kern + [tgv_au=0+3510|tgc_ka=1+1592] + + src/hb-aat-layout-kerx-table.hh | 73 + +++++++++++++++++++++++++---------------- + src/hb-ot-kern-table.hh | 7 ++++ + 2 files changed, 52 insertions(+), 28 deletions(-) + +commit 60f86d32d7c735ccf783b382e18ecdc096eaa682 +Author: Behdad Esfahbod +Date: Wed Oct 10 18:10:05 2018 -0400 + + [kerx] Don't loop over kerning subtables if kerning disabled + + src/hb-aat-layout-kerx-table.hh | 12 ++++++++++++ + src/hb-ot-shape.cc | 4 ++-- + src/hb-ot-shape.hh | 1 + + 3 files changed, 15 insertions(+), 2 deletions(-) + +commit 38a7a8a89ed035a1d1fc34a675a1860ad660b6ff +Author: Behdad Esfahbod +Date: Wed Oct 10 17:44:46 2018 -0400 + + Allow HB_OPTIONS=aat to prefer AAT tables over OT + + Fixes https://github.com/harfbuzz/harfbuzz/issues/322 + + src/hb-common.cc | 23 +++++++++++++++++++++-- + src/hb-debug.hh | 7 ++++--- + src/hb-ot-shape.cc | 24 ++++++++++++++++-------- + 3 files changed, 41 insertions(+), 13 deletions(-) + +commit 44f09afd5bd4f4f1ea47ca54ac9d605219b06910 +Author: Behdad Esfahbod +Date: Wed Oct 10 17:32:32 2018 -0400 + + [kerx] Skip variation subtables + + src/hb-aat-layout-kerx-table.hh | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 1e8fdd285f90b7b715b6d9ca9222a3c91cbea6b8 +Author: Behdad Esfahbod +Date: Wed Oct 10 16:32:35 2018 -0400 + + Remove HAVE_OT + + We never tested compiling without it. Just kill it. We always build + our own shaper. + + CMakeLists.txt | 1 - + configure.ac | 6 ------ + src/Makefile.am | 2 -- + src/hb-shaper-list.hh | 2 -- + src/hb.hh | 2 -- + test/api/Makefile.am | 4 +--- + test/api/test-c.c | 5 +---- + util/Makefile.am | 4 ---- + util/options.cc | 4 ---- + util/options.hh | 2 -- + 10 files changed, 2 insertions(+), 30 deletions(-) + +commit 7727e737566ddc826647e19fc645b296ad5a0cac +Author: Behdad Esfahbod +Date: Wed Oct 10 13:24:51 2018 -0400 + + [kerx] Actually hook up, and fix crash + + src/hb-aat-layout-common.hh | 6 ++++++ + src/hb-aat-layout-kerx-table.hh | 4 ++-- + src/hb-ot-shape.cc | 4 ++-- + 3 files changed, 10 insertions(+), 4 deletions(-) + +commit b3390990f508def9c375716614b92fc7b0038228 +Author: Behdad Esfahbod +Date: Wed Oct 10 12:07:49 2018 -0400 + + Add per-subtable set-digests + + This speeds up Roboto shaping by ~10%. I was hoping for more. + Still, good defense against lookups with many subtables. + + src/hb-null.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 108 + +++++++++++++++++++++++-------------------- + 2 files changed, 59 insertions(+), 51 deletions(-) + +commit e78549edfb4df617128a5f5ddd12692f1d0af4bf +Author: Behdad Esfahbod +Date: Wed Oct 10 11:54:48 2018 -0400 + + Move apply down into subtables accel + + src/hb-ot-layout-gsubgpos.hh | 10 +++++++++- + src/hb-ot-layout.cc | 17 +++-------------- + 2 files changed, 12 insertions(+), 15 deletions(-) + +commit 78c09bf21335a0f2b538b37de6647af08e3b1161 +Author: Behdad Esfahbod +Date: Wed Oct 10 11:50:46 2018 -0400 + + Move subtable array into lookup accel + + src/hb-null.hh | 2 +- + src/hb-ot-layout-gsubgpos.hh | 14 +++++++++++--- + src/hb-ot-layout.cc | 16 ++++++---------- + 3 files changed, 18 insertions(+), 14 deletions(-) + +commit 97e5913d5ac2cd313fb3923e9602358d7f75f11d +Author: Behdad Esfahbod +Date: Wed Oct 10 11:41:05 2018 -0400 + + Move more code + + src/hb-ot-layout-gsubgpos.hh | 17 +++++++++++++++++ + src/hb-ot-layout.cc | 12 ++++++------ + src/hb-ot-layout.hh | 20 ++------------------ + src/hb-ot-shape-complex-arabic-fallback.hh | 2 +- + 4 files changed, 26 insertions(+), 25 deletions(-) + +commit c8f2d9334c0f91ec30f1c7821eb44bb5149bd31c +Author: Behdad Esfahbod +Date: Wed Oct 10 11:36:28 2018 -0400 + + Move code + + In preparation to move add per-subtable set digests... + + src/hb-ot-layout-gsubgpos.hh | 50 ++++++++++++++++++++++++++++++++++++++ + src/hb-ot-layout.cc | 57 + ++++---------------------------------------- + 2 files changed, 54 insertions(+), 53 deletions(-) + +commit a03850a3567d532c3a4d7655aa71bfe73dfb0e33 +Author: Behdad Esfahbod +Date: Wed Oct 10 10:57:28 2018 -0400 + + Fix GPOS/kern interaction + + Oops. Was checking for kern feature in GSUB, not GPOS. + + src/hb-ot-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d1be805e784dfaadf2ce9caa830a3f851fdd67da +Author: Behdad Esfahbod +Date: Wed Oct 10 10:49:45 2018 -0400 + + More rewriting plan compile + + Hopefully more clear. + + src/hb-ot-shape.cc | 55 + ++++++++++++++++++++++++++++++++++++++---------------- + src/hb-ot-shape.hh | 1 - + 2 files changed, 39 insertions(+), 17 deletions(-) + +commit 961ab46b24ca9f3ef42a56398646191f106bf5bd +Author: Behdad Esfahbod +Date: Wed Oct 10 10:42:10 2018 -0400 + + More reshuffle plan compile + + src/hb-ot-shape.cc | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 2091b509e3e3b7fb7315539679fae81da2879280 +Author: Behdad Esfahbod +Date: Wed Oct 10 10:41:08 2018 -0400 + + [kerx] Hook up to shaper + + src/hb-aat-layout.cc | 31 ++++++++++++++++++++++++------- + src/hb-aat-layout.hh | 3 +++ + src/hb-ot-shape.cc | 6 ++++-- + src/hb-ot-shape.hh | 1 + + 4 files changed, 32 insertions(+), 9 deletions(-) + +commit 8d00c39bfc558895c63e22148d88db51cde39164 +Author: Behdad Esfahbod +Date: Wed Oct 10 10:18:39 2018 -0400 + + [kern] Minor + + src/hb-ot-shape-fallback.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit e655fd38cf20eefb1c071a52282a4caccb6f08ea +Author: Behdad Esfahbod +Date: Wed Oct 10 10:16:09 2018 -0400 + + Apply TT or fallback kerning when GPOS does not have kern feature + + Previously we only did if there was no GPOS whatsoever. This applies + to Arial, Times New Roman, etc in Win7. Was not kerning before. It + is now. + + src/hb-ot-shape.cc | 25 ++++++++++++++++--------- + 1 file changed, 16 insertions(+), 9 deletions(-) + +commit 754cf440bf80ced36461a98a5d4607a700f44fd3 +Author: Behdad Esfahbod +Date: Wed Oct 10 10:04:05 2018 -0400 + + Minor + + src/hb-ot-shape-fallback.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 187df7d7a9a1d9cd67cb2f72d4d6ed8cae1eed61 +Author: Ebrahim Byagowi +Date: Wed Oct 10 17:12:52 2018 +0330 + + [circleci] Add an iOS bot (#1233) + + .circleci/config.yml | 12 +++++ + CMakeLists.txt | 140 + ++++++++++++++++++++++++++++++++------------------- + 2 files changed, 100 insertions(+), 52 deletions(-) + +commit c06a5dff0b0f8d1c5aba53bcfd7fb0b680f1ca92 +Merge: 83c5298f 0537a401 +Author: Michiharu Ariza +Date: Tue Oct 9 22:00:10 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 83c5298f33e66cfd3d84d246297683f0de80c57d +Author: Michiharu Ariza +Date: Tue Oct 9 21:59:36 2018 -0700 + + added cff1_legacyops.otf as test-ot-extents-cff test case + + fixed roll operator bugs uncovered by the test + + src/hb-cff-interp-common.hh | 4 ++-- + test/api/fonts/cff1_legacyops.otf | Bin 0 -> 3104 bytes + test/api/test-ot-extents-cff.c | 23 +++++++++++++++++++++++ + 3 files changed, 25 insertions(+), 2 deletions(-) + +commit 0537a40193e803d50a99cd6b993d6d9301e84ebf +Author: Behdad Esfahbod +Date: Tue Oct 9 23:35:07 2018 -0400 + + [kerx] Comment + + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-ot-kern-table.hh | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 362d3241195bb7054c395fb4b029b6d55da4612a +Author: Behdad Esfahbod +Date: Tue Oct 9 23:27:00 2018 -0400 + + [aat] Rename + + src/hb-aat-layout-kerx-table.hh | 4 ++-- + src/hb-aat-layout-morx-table.hh | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 54c9ecb92d196e62901eef3f8bc025c024ed16bb +Author: Behdad Esfahbod +Date: Tue Oct 9 23:18:19 2018 -0400 + + [morx] Use subtable range for embedded sanitizer here as well + + src/hb-aat-layout-morx-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit d35315cc028e70dd1b3ffc8cb079a2336b22a0c3 +Author: Behdad Esfahbod +Date: Tue Oct 9 23:17:32 2018 -0400 + + [aat] Fixup recent commit + + For 329f2401082011007d9ce12b15ce0225cd267c57 + + max_ops is signed. + + src/hb-aat-layout-common.hh | 2 +- + src/hb-machinery.hh | 5 ++++- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 948f59a13a4c643ae310f5fc643e29fefd6c3787 +Author: Behdad Esfahbod +Date: Tue Oct 9 23:07:47 2018 -0400 + + [kerx] Use subtable range for runtime checks + + src/hb-aat-layout-kerx-table.hh | 4 +++- + src/hb-machinery.hh | 8 ++++++++ + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 329f2401082011007d9ce12b15ce0225cd267c57 +Author: Behdad Esfahbod +Date: Tue Oct 9 23:02:53 2018 -0400 + + [aat] Set embedded sanitizer max ops really high + + Since we consume it legitimately during shaping. + + src/hb-aat-layout-common.hh | 1 + + src/hb-machinery.hh | 2 ++ + 2 files changed, 3 insertions(+) + +commit ad763074861da60ed51211931788ca5b27fc1512 +Author: Behdad Esfahbod +Date: Tue Oct 9 22:57:00 2018 -0400 + + [kerx] Comment + + src/hb-aat-layout-kerx-table.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit db9600bbe15035cea6c2d4e8e9d184a5e23e357e +Author: Behdad Esfahbod +Date: Tue Oct 9 22:55:47 2018 -0400 + + [kerx] Remove junk + + src/hb-aat-layout-kerx-table.hh | 16 ---------------- + 1 file changed, 16 deletions(-) + +commit 27db859416c0362f211e2b42dc9a2ebb53b0e0f4 +Author: Behdad Esfahbod +Date: Tue Oct 9 22:52:41 2018 -0400 + + [kern/kerx] Adjust bounds check + + src/hb-aat-layout-kerx-table.hh | 8 +++----- + src/hb-ot-kern-table.hh | 8 +++----- + 2 files changed, 6 insertions(+), 10 deletions(-) + +commit c66f7f8c5deaac109e34bf65fc16cff92b74e69a +Author: Behdad Esfahbod +Date: Tue Oct 9 22:49:33 2018 -0400 + + [kerx] Implement Format2 apply() + + Still, not hooked. + + src/hb-aat-layout-kerx-table.hh | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit 4b461785bdf356e4b5586cb6e5b226f47da04b7d +Author: Behdad Esfahbod +Date: Tue Oct 9 22:46:30 2018 -0400 + + Fix check + + src/hb-aat-layout-kerx-table.hh | 2 ++ + src/hb-aat-layout.cc | 4 +++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +commit 4df8eb200def767d342762654b96d5d9314e5b21 +Author: Behdad Esfahbod +Date: Tue Oct 9 22:46:12 2018 -0400 + + [kern] Use kern subtable length for sanitizing in the accelerator + + src/hb-ot-kern-table.hh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +commit 8bff1d2994876a5202c8605d1cc37522431c6c84 +Author: Behdad Esfahbod +Date: Tue Oct 9 22:39:31 2018 -0400 + + [kern] Minor + + src/hb-ot-kern-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 53e55945000347fb19168bb4c13a470d30d46251 +Author: Behdad Esfahbod +Date: Tue Oct 9 22:35:22 2018 -0400 + + [kerx] Implement Format0 apply() + + Not hooked up to be called yet. + + src/hb-aat-layout-common.hh | 6 ++++-- + src/hb-aat-layout-kerx-table.hh | 29 ++++++++++++++++++++++++++--- + src/hb-aat-layout.cc | 6 ++++-- + src/hb-aat-layout.hh | 12 +++++++----- + src/hb-ot-shape.cc | 2 +- + 5 files changed, 42 insertions(+), 13 deletions(-) + +commit 60318f87153b559e5da103f0bfcce6bad8bab3b0 +Author: Behdad Esfahbod +Date: Tue Oct 9 22:25:53 2018 -0400 + + Minor + + src/hb-mutex.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 210f899acad1959d60892538ac1968a36dbbb51b +Author: Behdad Esfahbod +Date: Tue Oct 9 21:56:37 2018 -0400 + + [kern] Sanitize 4 bytes, not 2 + + src/hb-ot-kern-table.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 588518ea51b2226bdb41417946848d18c3913a67 +Author: Michiharu Ariza +Date: Tue Oct 9 14:48:04 2018 -0700 + + fixed test-ot-extents-cff failure on some platforms + + test/api/test-ot-extents-cff.c | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit be2f148da474d6dd30132c22dd467ea33a942edf +Author: Behdad Esfahbod +Date: Tue Oct 9 16:24:50 2018 -0400 + + [ft] Use mutex to lock access to FT_Face + + Makes our FT-backed hb_font_t safe to use from multiple threads. + Still, + the underlying FT_Face should NOT be used from other threads by client + or other libraries. + + Maybe I add a lock()/unlock() public API ala PangoFT2 and cairo-ft. + Maybe not. + + src/hb-ft.cc | 18 +++++++++++++++++- + src/hb-mutex.hh | 8 ++++++++ + test/api/test-multithread.c | 7 ++----- + 3 files changed, 27 insertions(+), 6 deletions(-) + +commit d18c3c5861d40291077eb8b8667dc2f12b649cf2 +Author: Behdad Esfahbod +Date: Tue Oct 9 16:07:55 2018 -0400 + + [ft] Remove (probably) stale comment + + src/hb-ft.cc | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 7003b601afd02b0ba7e839510a7d0b886da09aaa +Author: Behdad Esfahbod +Date: Tue Oct 9 15:55:26 2018 -0400 + + Minor + + src/hb-ot-shape-complex-arabic.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 07899435b8065d494e563f83e0a35300c828eefe +Author: Behdad Esfahbod +Date: Tue Oct 9 15:39:51 2018 -0400 + + Install ot-funcs on newly created funcs + + **Finally**! Casual users can stop caring about font-funcs + completely now, + like they haven't been needing to care re unicode-funcs for a + few years. + + src/hb-font.cc | 39 ++++++++++++++++++++++++++------------- + 1 file changed, 26 insertions(+), 13 deletions(-) + +commit 55153553675445e8aad06e363295d399aa79c54f +Author: Behdad Esfahbod +Date: Tue Oct 9 15:12:09 2018 -0400 + + [ot-font] Don't pre-load cmap table + + Now that we have get_h_advances() and get_nominal_glyphs() + implemented, the + overhead of doing a proper atomic load would be once per run, NOT + once per + glyph. So, no need to pre-load the tables to avoid that overhead. + + As such, hb_ot_font_set_funcs() has become really cheap. + Can *finally* make + it be default font functions on all newly created fonts! + + src/hb-ot-font.cc | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit ec84460e46fdaa5f8a3c16c8d48dabe2b0c869da +Author: Behdad Esfahbod +Date: Tue Oct 9 15:07:04 2018 -0400 + + [ot/ft] Implement get_nominal_glyphs() callback + + Some more measurable speedup. The recent commits' speedups are + as follows: + + Testing with Roboto, ****when disabling kern and liga****: + + Before: + + FT --features=-kern,-liga + user↦ 0m0.521s + + OT --features=-liga,-kern + user↦ 0m0.568s + + After: + + FT --features=-liga,-kern + user↦ 0m0.428s + + OT --features=-liga,-kern + user↦ 0m0.470s + + So, 17% speedup. + + Note that FT callbacks are faster than OT these days since we added + an advance + cache to FT. I don't think the difference is enough to justify + adding a cache + to OT. + + When not disabling kern, the thing is three times slower, so the + speedups + are three times less impressive... Still, 5% not bad for a codebase + that I + otherwise thought is optimized out. + + Note that, because of this and other optimiztions in our main shaper, + disabling kern and liga, the OT shaper is now *faster* than the + fallback + shaper. So, that's my recommendation to clients that need the + absolute + fastest... + + src/hb-ft.cc | 26 ++++++++++++++++++++++++++ + src/hb-ot-font.cc | 24 ++++++++++++++++++++++++ + 2 files changed, 50 insertions(+) + +commit e883f52732a25f5495ec30656489954afd8cc3a4 +Author: Behdad Esfahbod +Date: Tue Oct 9 14:50:57 2018 -0400 + + Call get_nominal_glyphs() for runs of simple clusters at a time + + Even without FT or OT font funcs implementing get_nominal_glyphs(), + there's measurable + speedup. + + src/hb-buffer.hh | 20 +++++++++++++++++++- + src/hb-ot-shape-normalize.cc | 9 +++++++++ + 2 files changed, 28 insertions(+), 1 deletion(-) + +commit 8008bca83b0bb310fc434dbdd339545af951193b +Author: Behdad Esfahbod +Date: Tue Oct 9 14:38:23 2018 -0400 + + Whitespace + + src/hb-font.hh | 2 +- + src/hb-ot-shape-normalize.cc | 52 + ++++++++++++++++++++++++-------------------- + 2 files changed, 29 insertions(+), 25 deletions(-) + +commit 30c114ffec335770452e60729224b1634586c5b0 +Author: Behdad Esfahbod +Date: Tue Oct 9 14:37:08 2018 -0400 + + Avoid sort and recompose stages if all clusters simple + + Even has measurable speedup... + + src/hb-ot-shape-normalize.cc | 52 + ++++++++++++++++++++++++-------------------- + 1 file changed, 29 insertions(+), 23 deletions(-) + +commit 9f79365c3b183278d14352ba6241c7d4ec274984 +Author: Behdad Esfahbod +Date: Tue Oct 9 14:36:25 2018 -0400 + + Fix warning + + How come this one is not generated by clang everything bot?! + + ../../../test/api/test-multithread.c:37:26: warning: initialization + discards ‘const’ qualifier from pointer target type + [-Wdiscarded-qualifiers] + static char *font_path = "fonts/Inconsolata-Regular.abc.ttf"; + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ../../../test/api/test-multithread.c:38:21: warning: initialization + discards ‘const’ qualifier from pointer target type + [-Wdiscarded-qualifiers] + + test/api/test-multithread.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 24382debe893450088acd1e4b387ac31145d4553 +Author: Behdad Esfahbod +Date: Tue Oct 9 14:33:24 2018 -0400 + + Rewrite main normalizer loop to isolate runs of simple clusters + + src/hb-ot-shape-normalize.cc | 24 +++++++++++++++++++----- + 1 file changed, 19 insertions(+), 5 deletions(-) + +commit b5371f18effbeb91565fd8c554c120b911641f0b +Author: Behdad Esfahbod +Date: Tue Oct 9 14:12:59 2018 -0400 + + Inline decompose_cluster + + Towards separating the common case into its own loop. + + src/hb-ot-shape-normalize.cc | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +commit f5f505b5120c316f06306318c6c2f0db4496ba04 +Merge: 8b349040 4035158d +Author: Michiharu Ariza +Date: Tue Oct 9 10:10:35 2018 -0700 + + Merge branch 'master' into cff-subset + +commit b314c4e9abf4236c6650a63d1287471b61f64885 +Author: Behdad Esfahbod +Date: Tue Oct 9 09:23:51 2018 -0400 + + [font] Add get_nominal_glyphs() callback (note the plural) + + Unused as of now. To be wired up to normalizer, which would remove + overhead and allow hb-ot-font initialization to become a no-op, so + we can enable it by default. + + docs/harfbuzz-sections.txt | 3 +++ + src/hb-font.cc | 33 +++++++++++++++++++++++++++++++++ + src/hb-font.h | 24 ++++++++++++++++++++++++ + src/hb-font.hh | 13 +++++++++++++ + 4 files changed, 73 insertions(+) + +commit ca6a317012a13ee84b58a69e14e74c94c5b158ff +Author: Behdad Esfahbod +Date: Tue Oct 9 09:06:07 2018 -0400 + + Minor + + src/hb-font.cc | 6 +++--- + src/hb-font.h | 8 ++++---- + src/hb-font.hh | 2 +- + 3 files changed, 8 insertions(+), 8 deletions(-) + +commit 4035158de46ce373b7521daf61c5b6df83312968 +Author: Chun-wei Fan +Date: Wed Jul 25 18:26:10 2018 +0800 + + test/api/test-subset-*.c: Fix build on pre-C99 + + Ensure that we have the variables at the beginning of the block. + These + are the only fixes that we need for building HarfBuzz on older + compilers. + + test/api/test-collect-unicodes.c | 9 ++++++--- + test/api/test-subset-glyf.c | 19 +++++++++++++------ + test/api/test-subset-hdmx.c | 8 ++++++-- + test/api/test-subset-hmtx.c | 3 ++- + test/api/test-subset-post.c | 3 ++- + test/api/test-subset-vmtx.c | 6 ++++-- + test/api/test-subset.c | 12 +++++++++--- + 7 files changed, 42 insertions(+), 18 deletions(-) + +commit 8e4ad1d7a0a35298ca04828ef1ef18b4c019ec03 +Author: Chun-wei Fan +Date: Wed Jul 25 18:12:34 2018 +0800 + + builds: Fix and clean up MSVC DLL builds + + Instead of passing a CFLAG/CXXFLAG to define HB_EXTERN, define it + directly in src/hb.hh as __declspec(dllexport) extern when we are + building HarfBuzz as DLLs on Visual Studio. Define HB_INTERNAL + as nothing without defining HB_NO_VISIBILITY when building HarfBuzz as + DLLs to avoid linker errors on Visual Studio builds. + + Also "install" harfbuzz-subset.dll into $(PREFIX)\bin as the + hb-subset utility will depend on that DLL at runtime, when HarfBuzz is + built as DLLs. Since it consists of private APIs that are subject to + change, we do not install its headers nor .lib file. + + CMakeLists.txt | 7 ++++++- + src/hb.hh | 10 ++++++++-- + 2 files changed, 14 insertions(+), 3 deletions(-) + +commit e640f3a6b16f41cee5f7868ec738fda01244e96a +Author: Behdad Esfahbod +Date: Tue Oct 9 08:28:07 2018 -0400 + + Another old bot fix + + src/hb-aat-layout-kerx-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e4f27f368f8f0509fa47f6a28f3984e90b40588f +Author: Behdad Esfahbod +Date: Tue Oct 9 08:20:10 2018 -0400 + + Try fixing older bots + + src/hb-ot-shape-fallback.cc | 42 + +++++++++++++++++++++--------------------- + 1 file changed, 21 insertions(+), 21 deletions(-) + +commit bee93e269711a3eda4e7d762b730522564fe6e87 +Author: Behdad Esfahbod +Date: Tue Oct 9 08:01:49 2018 -0400 + + Add const to get_*_advances API + + Ouch! + + src/hb-font.cc | 10 +++++----- + src/hb-font.h | 8 ++++---- + src/hb-font.hh | 6 +++--- + src/hb-ft.cc | 2 +- + src/hb-ot-font.cc | 4 ++-- + 5 files changed, 15 insertions(+), 15 deletions(-) + +commit eb2be97f864c726feaa2434e290f962ddfa97069 +Author: Behdad Esfahbod +Date: Tue Oct 9 07:48:52 2018 -0400 + + Port test off deprecated API + + test/api/test-shape.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit cc126f2817844a2e83e973129e5b2caa18de599f +Author: Behdad Esfahbod +Date: Tue Oct 9 01:10:15 2018 -0400 + + Minor + + src/Makefile.am | 2 +- + test/shaping/Makefile.am | 2 ++ + test/subset/Makefile.am | 2 +- + 3 files changed, 4 insertions(+), 2 deletions(-) + +commit b2fbe55b828ea5864bc0aed54db7109a2e189de2 +Author: Behdad Esfahbod +Date: Tue Oct 9 01:07:36 2018 -0400 + + [icu] Unbreak + + src/hb-icu.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a353c1768dc1d7934b8ac293761620f561304bb2 +Author: Behdad Esfahbod +Date: Tue Oct 9 01:05:28 2018 -0400 + + Remove test for deprecated hb_set_invert() + + test/api/test-set.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit a52bc039c33b3c01dbb96b815dc24df7f03bc4be +Author: Behdad Esfahbod +Date: Tue Oct 9 00:56:33 2018 -0400 + + Properly remove deprecated stuff + + src/hb-glib.cc | 15 ++++++--------- + src/hb-icu.cc | 15 ++++++--------- + src/hb-ucdn.cc | 15 ++++++--------- + 3 files changed, 18 insertions(+), 27 deletions(-) + +commit 8b349040e92b8894a7f8a609fac8070bcb110f96 +Merge: df964a09 fc509165 +Author: Michiharu Ariza +Date: Mon Oct 8 21:46:23 2018 -0700 + + Merge branch 'master' into cff-subset + +commit fc50916589a300e49183b5ee598e64ca28d0bd9a +Author: Behdad Esfahbod +Date: Tue Oct 9 00:39:42 2018 -0400 + + Remove deprecated decompose_compatibility stuff + + src/hb-glib.cc | 31 +----------------------------- + src/hb-icu.cc | 33 +------------------------------- + src/hb-ucdn.cc | 8 +------- + test/api/test-unicode.c | 51 + ------------------------------------------------- + 4 files changed, 3 insertions(+), 120 deletions(-) + +commit eed737f6726d3408191a4e64592805b70d8bb247 +Author: Behdad Esfahbod +Date: Tue Oct 9 00:33:30 2018 -0400 + + Remove deprecated eastasian_width + + src/hb-glib.cc | 8 +------ + src/hb-icu.cc | 19 +-------------- + src/hb-ucdn.cc | 9 +------ + test/api/test-unicode.c | 64 + ------------------------------------------------- + 4 files changed, 3 insertions(+), 97 deletions(-) + +commit 47030b1855f04c0d75899ffb6f5021fea3c19b90 +Author: Behdad Esfahbod +Date: Tue Oct 9 00:30:45 2018 -0400 + + [ft/ot] Remove implementation of deprecated kerning funcs + + src/hb-ft.cc | 19 ------------------- + src/hb-ot-font.cc | 13 ------------- + 2 files changed, 32 deletions(-) + +commit 977c8a8e5c811995f47b0eb721199d0dc3689e48 +Author: Behdad Esfahbod +Date: Tue Oct 9 00:22:08 2018 -0400 + + [kern] Minor + + src/hb-ot-kern-table.hh | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit ed5cfa42c7fb8d5ff2d74bdb452a0590174f4e19 +Author: Behdad Esfahbod +Date: Tue Oct 9 00:20:35 2018 -0400 + + [kern] Minor + + src/hb-aat-layout-kerx-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit d219f899f4b2fb4b39ebc1dff9fb648fc5d6d112 +Author: Behdad Esfahbod +Date: Tue Oct 9 00:01:09 2018 -0400 + + Deprecate font kern API + + docs/harfbuzz-sections.txt | 16 +++++++------- + src/hb-deprecated.h | 54 + ++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-font.cc | 3 +++ + src/hb-font.h | 51 + ------------------------------------------- + 4 files changed, 65 insertions(+), 59 deletions(-) + +commit a51958819fcf51ade3f8eb38001e680a419ebbba +Author: Behdad Esfahbod +Date: Mon Oct 8 23:57:45 2018 -0400 + + Apply TrueType/OpenType kern table when GPOS kern feature is not + available + + Fixes https://github.com/harfbuzz/harfbuzz/issues/250 + + src/hb-ot-kern-table.hh | 24 +++++++++++-------- + src/hb-ot-layout.cc | 57 + ++++++++++++++++++++------------------------- + src/hb-ot-layout.hh | 13 +++++++++++ + src/hb-ot-shape-fallback.cc | 4 ++-- + src/hb-ot-shape.cc | 10 +++++--- + src/hb-ot-shape.hh | 1 + + 6 files changed, 62 insertions(+), 47 deletions(-) + +commit 09ad2613c8d8a60dac69a878c2d568adfea054c8 +Author: Behdad Esfahbod +Date: Mon Oct 8 23:30:24 2018 -0400 + + Separate fallback kern vs mark positioning + + src/hb-ot-shape-fallback.cc | 12 ++++++------ + src/hb-ot-shape-fallback.hh | 12 ++++++------ + src/hb-ot-shape.cc | 15 ++++++++------- + src/hb-ot-shape.hh | 4 ++-- + 4 files changed, 22 insertions(+), 21 deletions(-) + +commit 3c23ff9b7c4241ec23054a95f1fdfbdef2c51f40 +Author: Behdad Esfahbod +Date: Mon Oct 8 23:26:26 2018 -0400 + + [kern] Add kerning driver to TT kern table + + src/hb-ot-kern-table.hh | 19 +++++++++++++++++-- + src/hb-ot-shape-fallback.cc | 2 +- + 2 files changed, 18 insertions(+), 3 deletions(-) + +commit 683c3a95330928129cfbb1488650f708414d68ba +Author: Behdad Esfahbod +Date: Mon Oct 8 23:09:48 2018 -0400 + + [kern] Abstract away kerning machine + + src/hb-font.hh | 2 +- + src/hb-ot-kern-table.hh | 71 + +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-shape-fallback.cc | 67 + +++++++++++------------------------------- + 3 files changed, 89 insertions(+), 51 deletions(-) + +commit fb4f43838154a77912a9fc3437110c81e9d34aac +Author: Behdad Esfahbod +Date: Mon Oct 8 22:44:16 2018 -0400 + + Add HB_DEPRECATED + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1232 + + src/hb-common.h | 9 +++++++++ + src/hb-deprecated.h | 12 ++++++------ + 2 files changed, 15 insertions(+), 6 deletions(-) + +commit 80e3102b8a216f9a751d073f9a2f7900ca758086 +Author: Behdad Esfahbod +Date: Mon Oct 8 22:41:08 2018 -0400 + + [kerx] Process coverage flags + + src/hb-aat-layout-kerx-table.hh | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +commit 26d7305da7a7e2cf765b068f565836442872ffe7 +Author: Behdad Esfahbod +Date: Mon Oct 8 22:31:35 2018 -0400 + + Deprecate decompose_compatibility stuff + + docs/harfbuzz-sections.txt | 7 +++--- + src/hb-deprecated.h | 63 + ++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-unicode.h | 47 ---------------------------------- + 3 files changed, 67 insertions(+), 50 deletions(-) + +commit 42b51eee54f143854b7c6c3be5d84bfbbd895100 +Author: Behdad Esfahbod +Date: Mon Oct 8 22:26:39 2018 -0400 + + Deprecate eastasian_width stuff + + docs/harfbuzz-sections.txt | 5 +++-- + src/hb-deprecated.h | 37 +++++++++++++++++++++++++++++++++++++ + src/hb-unicode.h | 28 ---------------------------- + 3 files changed, 40 insertions(+), 30 deletions(-) + +commit df964a09319bbf5b0a7528b906311726d4f640d6 +Author: Michiharu Ariza +Date: Mon Oct 8 15:38:05 2018 -0700 + + fixed test-subset-cff2 + + src/hb-cff2-interp-cs.hh | 7 +++---- + src/hb-ot-cff2-table.cc | 2 +- + 2 files changed, 4 insertions(+), 5 deletions(-) + +commit a90fd8b9feeee3b02d139f2e7db774766d7855cb +Merge: b51418f5 e42cd58c +Author: Michiharu Ariza +Date: Mon Oct 8 15:07:58 2018 -0700 + + Merge branch 'master' into cff-subset + +commit b51418f596097aa5d1b28fb0a02b613c36bacd8e +Author: Michiharu Ariza +Date: Mon Oct 8 15:05:36 2018 -0700 + + added CFF2 get_extents + + added source hb-ot-cff2-table.cc + augmented VariationData to return scalars + misc bug fixes, renaming, cleanup + + src/Makefile.sources | 2 + + src/hb-cff-interp-common.hh | 37 ++++++----- + src/hb-cff-interp-cs-common.hh | 134 + +++++++++++++++++++------------------- + src/hb-cff-interp-dict-common.hh | 6 +- + src/hb-cff2-interp-cs.hh | 102 ++++++++++++++++++++++++----- + src/hb-ot-cff1-table.hh | 4 +- + src/hb-ot-cff2-table.cc | 135 + +++++++++++++++++++++++++++++++++++++++ + src/hb-ot-cff2-table.hh | 71 ++++++++++++-------- + src/hb-ot-face.cc | 1 + + src/hb-ot-face.hh | 1 + + src/hb-ot-font.cc | 4 ++ + src/hb-ot-layout-common.hh | 28 +++++++- + src/hb-subset-cff1.cc | 2 +- + src/hb-subset-cff2.cc | 4 +- + test/api/test-ot-extents-cff.c | 36 +++++++++++ + 15 files changed, 426 insertions(+), 141 deletions(-) + +commit 286a45641fc6732bb7cab02f06c90396834541b1 +Author: Behdad Esfahbod +Date: Mon Oct 8 16:41:08 2018 -0400 + + Minor + + src/hb-ot-shape-normalize.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c0d3bf1bafe7b6d2e8f2798c1f55aaec71350d90 +Author: Behdad Esfahbod +Date: Mon Oct 8 16:32:44 2018 -0400 + + Minor + + src/hb-ot-shape.cc | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 9c1bb81f5c5ca64ad1c665edd16947e4bc6f6c46 +Author: Behdad Esfahbod +Date: Mon Oct 8 16:10:54 2018 -0400 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 3 --- + test/shaping/data/text-rendering-tests/Makefile.sources | 2 +- + test/shaping/data/text-rendering-tests/tests/MORX-35.tests | 4 ++-- + 3 files changed, 3 insertions(+), 6 deletions(-) + +commit 1a5a3325a26f4989ab8c4bb91515d4898ffa4631 +Author: Behdad Esfahbod +Date: Sun Oct 7 23:08:39 2018 -0400 + + [kerx] Minor + + src/hb-aat-layout-kerx-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d62b4011cc600ade2b130f81a077dd08d4e4464f +Author: Behdad Esfahbod +Date: Sun Oct 7 22:58:06 2018 -0400 + + [kern] Shout less + + src/hb-ot-kern-table.hh | 36 +++++++++++++++++++----------------- + 1 file changed, 19 insertions(+), 17 deletions(-) + +commit c6bb3a588f493630b40d8823532b482f407bacbf +Author: Behdad Esfahbod +Date: Sun Oct 7 22:52:53 2018 -0400 + + [kerx] Clean up Format2 + + src/hb-aat-layout-kerx-table.hh | 48 + ++++++++--------------------------------- + 1 file changed, 9 insertions(+), 39 deletions(-) + +commit 8aa83d97f9e7f63e2fcb4ae965b75a39961c7d87 +Author: Behdad Esfahbod +Date: Sun Oct 7 22:43:59 2018 -0400 + + [kern/kerx] Fix Format2 offsetting + + "The values in the right class table are stored pre-multiplied by the + number of bytes in a single kerning value, and the values in the left + class table are stored pre-multiplied by the number of bytes in one + row. This eliminates needing to multiply the row and column values + together to determine the location of the kerning value. The array can + be indexed by doing the right- and left-hand class mappings, + adding the + class values to the address of the array, and fetching the kerning + value to which the new address points." + + src/hb-aat-layout-kerx-table.hh | 2 +- + src/hb-ot-kern-table.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit ed2a404272bc99234c6f71f22b5a642834e59e6c +Author: Behdad Esfahbod +Date: Sun Oct 7 22:33:41 2018 -0400 + + [kerx] Clean up Format0 + + src/hb-aat-layout-kerx-table.hh | 48 + +++++++++++------------------------------ + 1 file changed, 12 insertions(+), 36 deletions(-) + +commit 4c3b19d52ec7a1fa46f8d0971e377a7d29b87e27 +Author: Behdad Esfahbod +Date: Sun Oct 7 22:30:42 2018 -0400 + + Support HBUINT32 BinSearchArrayOf + + src/hb-open-type.hh | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 456a68c506238e9c6b019244237d4443bd3589af +Author: Behdad Esfahbod +Date: Sun Oct 7 22:28:45 2018 -0400 + + Move code + + src/hb-aat-layout-common.hh | 105 + -------------------------------------------- + src/hb-open-type.hh | 105 + +++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 104 insertions(+), 106 deletions(-) + +commit 3515c8b187e2316dcf3abaefc84917b09449d485 +Author: Behdad Esfahbod +Date: Sun Oct 7 22:27:00 2018 -0400 + + [aat] Rename + + src/hb-aat-layout-common.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit e42cd58c997adafca5517faa9aacf651b90520f5 +Author: Behdad Esfahbod +Date: Sun Oct 7 20:46:11 2018 -0400 + + Rename invisible_codepoint to invisible_glyph in API + + Deleted recently added API: + hb_buffer_set_invisible_codepoint() + hb_buffer_get_invisible_codepoint() + + hb-shape / hb-view --invisible-codepoint + + New API: + hb_buffer_set_invisible_glyph() + hb_buffer_get_invisible_glyph() + + hb-shape / hb-view --invisible-glyph + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1216 + + docs/harfbuzz-sections.txt | 4 ++-- + src/hb-buffer.cc | 12 ++++++------ + src/hb-buffer.h | 6 +++--- + util/options.cc | 2 +- + util/options.hh | 6 +++--- + 5 files changed, 15 insertions(+), 15 deletions(-) + +commit 2a5cb37fdb43230217e055f3d7c770a35cfd5c21 +Author: Behdad Esfahbod +Date: Sun Oct 7 20:36:46 2018 -0400 + + Revert "[morx] Fix MORX-35" + + This reverts commit f62f6e90ad1f1a83f77771ad65ee1ffb79470a8a. + + src/hb-aat-layout-morx-table.hh | 14 + +++++--------- + test/shaping/data/text-rendering-tests/DISABLED | 3 +++ + test/shaping/data/text-rendering-tests/Makefile.sources | 2 +- + 3 files changed, 9 insertions(+), 10 deletions(-) + +commit 14ebf8af0c04efcae6ca788ac85601bfe462f28d +Author: Behdad Esfahbod +Date: Sun Oct 7 20:35:06 2018 -0400 + + [buffer] Improve shift_forward() + + "Improve" is a strong word in this case though, I understand. + + src/hb-buffer.cc | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +commit f62f6e90ad1f1a83f77771ad65ee1ffb79470a8a +Author: Behdad Esfahbod +Date: Sun Oct 7 18:06:53 2018 -0400 + + [morx] Fix MORX-35 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1224 + + src/hb-aat-layout-morx-table.hh | 14 + ++++++++++---- + test/shaping/data/text-rendering-tests/DISABLED | 3 --- + test/shaping/data/text-rendering-tests/Makefile.sources | 2 +- + 3 files changed, 11 insertions(+), 8 deletions(-) + +commit 94368855c6bd7201d562cab3d2107685589e69c8 +Author: Behdad Esfahbod +Date: Sun Oct 7 18:52:12 2018 -0400 + + Remove some code + + We use scratch-flags to short-circuit this function. No need for + previous + early loop. + + src/hb-ot-shape.cc | 16 +++------------- + 1 file changed, 3 insertions(+), 13 deletions(-) + +commit c07b91b812dc66b38b11329cd6a93258a3769f9e +Author: Behdad Esfahbod +Date: Sun Oct 7 18:00:14 2018 -0400 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/Makefile.sources | 6 +++++- + .../data/text-rendering-tests/fonts/TestMORXForty.ttf | Bin 0 -> + 2408 bytes + .../text-rendering-tests/fonts/TestMORXThirtyeight.ttf | Bin 0 -> + 2444 bytes + .../text-rendering-tests/fonts/TestMORXThirtynine.ttf | Bin 0 -> + 2436 bytes + .../text-rendering-tests/fonts/TestMORXThirtyseven.ttf | Bin 0 -> + 2444 bytes + .../data/text-rendering-tests/tests/MORX-35.tests | 4 ++-- + .../data/text-rendering-tests/tests/MORX-37.tests | 4 ++++ + .../data/text-rendering-tests/tests/MORX-38.tests | 4 ++++ + .../data/text-rendering-tests/tests/MORX-39.tests | 4 ++++ + .../data/text-rendering-tests/tests/MORX-40.tests | 4 ++++ + 10 files changed, 23 insertions(+), 3 deletions(-) + +commit fdce1e15434f14b7f4802edd67f7af737cf2b075 +Author: Behdad Esfahbod +Date: Sun Oct 7 14:01:33 2018 -0400 + + [kerx] Clean up kerx and KerxTable structures + + src/hb-aat-layout-kerx-table.hh | 169 + ++++++++++++++++++++++++++-------------- + src/hb-aat-layout-morx-table.hh | 2 +- + 2 files changed, 113 insertions(+), 58 deletions(-) + +commit 71b65eb27dd0867f51d9906887b9e372eb37f54a +Author: Behdad Esfahbod +Date: Sun Oct 7 18:41:52 2018 +0200 + + Add API for setting invisible-codepoint + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1216 + + New API: + hb_buffer_set_invisible_codepoint() + hb_buffer_get_invisible_codepoint() + + hb-shape / hb-view --invisible-codepoint + + docs/harfbuzz-sections.txt | 2 ++ + src/hb-buffer.cc | 42 + ++++++++++++++++++++++++++++++++++++++++++ + src/hb-buffer.h | 7 +++++++ + src/hb-buffer.hh | 1 + + src/hb-ot-shape.cc | 8 ++++---- + util/options.cc | 1 + + util/options.hh | 3 +++ + 7 files changed, 60 insertions(+), 4 deletions(-) + +commit 13da3be0b342e8e2f060eba8753c6957c477c4ee +Author: Behdad Esfahbod +Date: Sun Oct 7 18:23:45 2018 +0200 + + [ot-font] Load hmtx/vmtx lazily + + Since we have get_*_advanes() API now, the overhead is once per shape, + not once per glyph. + + Only cmap is warmed-up at set_funcs() time now. + + src/hb-ot-font.cc | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit 856db4c9184e39c0457cc07c815f90058937c8a2 +Author: Behdad Esfahbod +Date: Sun Oct 7 18:21:15 2018 +0200 + + Minor + + src/hb-ot-font.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f92330b5e0b1a5a61768494bd7081e3fc235b182 +Author: Behdad Esfahbod +Date: Sun Oct 7 17:51:50 2018 +0200 + + Minor + + test/api/test-multithread.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit b2e398c077cf9437298bfe2ee53b7407a5865c14 +Author: Behdad Esfahbod +Date: Sun Oct 7 16:31:33 2018 +0200 + + [coretext] Fix OS X check + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1230 + + src/hb-coretext.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 55942ad5c1ee999c9f590b8cc8fbde12e937aa6f +Author: Michiharu Ariza +Date: Sat Oct 6 14:49:44 2018 -0700 + + Merge branch 'master' into cff-subset + + TODO | 10 +-- + configure.ac | 2 +- + src/hb-aat-layout-common.hh | 4 +- + src/hb-aat-layout-morx-table.hh | 9 +- + src/hb-aat-layout.cc | 6 ++ + src/hb-aat-layout.hh | 2 + + src/hb-face.cc | 2 +- + src/hb-machinery.hh | 2 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-ot-shape.cc | 27 ++++-- + src/hb-ot-shape.hh | 5 ++ + src/hb-set.hh | 4 +- + src/hb-subset.cc | 2 +- + src/hb-vector.hh | 100 + ++++++++++++++------- + test/shaping/data/text-rendering-tests/DISABLED | 35 +------- + .../data/text-rendering-tests/Makefile.sources | 18 ++-- + .../data/text-rendering-tests/extract-tests.py | 18 +++- + .../text-rendering-tests/fonts/TestGSUBThree.ttf | Bin 0 -> 1504 bytes + .../fonts/TestMORXThirtyfive.ttf | Bin 0 -> 1968 bytes + .../fonts/TestMORXThirtyfour.ttf | Bin 0 -> 3608 bytes + .../fonts/TestMORXThirtysix.ttf | Bin 0 -> 1836 bytes + .../fonts/TestMORXThirtythree.ttf | Bin 0 -> 1520 bytes + .../fonts/TestMORXTwentyfour.ttf | Bin 0 -> 1828 bytes + .../data/text-rendering-tests/tests/GSUB-3.tests | 1 + + .../data/text-rendering-tests/tests/MORX-24.tests | 1 + + .../data/text-rendering-tests/tests/MORX-32.tests | 8 +- + .../data/text-rendering-tests/tests/MORX-33.tests | 3 + + .../data/text-rendering-tests/tests/MORX-34.tests | 1 + + .../data/text-rendering-tests/tests/MORX-35.tests | 2 + + .../data/text-rendering-tests/tests/MORX-36.tests | 1 + + test/shaping/run-tests.py | 19 ++-- + util/view-cairo.hh | 2 +- + 33 files changed, 173 insertions(+), 115 deletions(-) + +commit 7ee50af8366547c382047a30a94f7f5f739aabcb +Author: Behdad Esfahbod +Date: Sat Oct 6 21:31:44 2018 +0200 + + [morx] Fix memory access issues with unsafe_to_break + + src/hb-aat-layout-common.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit f58c5175890e666503b6f140d238e1abca91598e +Author: Ebrahim Byagowi +Date: Sat Oct 6 22:42:56 2018 +0330 + + Make msan output a little more readable + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9abe33963739f753cdfb007eed40101ce33f550 +Author: Ebrahim Byagowi +Date: Sat Oct 6 12:19:33 2018 +0330 + + Use tempfile in run-tests as a fix for Windows CI fails (#1228) + + test/shaping/run-tests.py | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 0816a549789a1b647443c2b33cfda3f4400a0f87 +Author: Behdad Esfahbod +Date: Sat Oct 6 02:40:57 2018 +0200 + + [uniscribe/coretext] Fix for previous change + + src/hb-coretext.cc | 2 +- + src/hb-uniscribe.cc | 12 ++++++------ + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 341206eb609202e4b2f0d03d29cb577ebe8390b9 +Author: Behdad Esfahbod +Date: Fri Oct 5 18:39:48 2018 +0200 + + [vector] Make hb_vector_t relocatable / nestable + + Ugly, but... + Fixes https://github.com/harfbuzz/harfbuzz/issues/1227 + + src/hb-face.cc | 2 +- + src/hb-machinery.hh | 2 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-set.hh | 4 +-- + src/hb-subset.cc | 2 +- + src/hb-vector.hh | 94 + +++++++++++++++++++++++++++++++------------------ + 7 files changed, 66 insertions(+), 42 deletions(-) + +commit 5469d80707d32c733b1c60f79ab2f217e879de55 +Author: Behdad Esfahbod +Date: Fri Oct 5 18:21:08 2018 +0200 + + Add hb_vector_t::fini_deep () + + src/hb-vector.hh | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 4831e615d173be9c7e140be0fa9017e4d9e499af +Author: Behdad Esfahbod +Date: Fri Oct 5 18:14:13 2018 +0200 + + [morx] Fix memory access issue + + If buffer was enlarged, info was being outdated. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1225 + + src/hb-aat-layout-common.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 5a41cf6be69adb0b5b29976a33c4c6dd6ce7afc5 +Author: Behdad Esfahbod +Date: Fri Oct 5 11:33:19 2018 +0200 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 3 +++ + test/shaping/data/text-rendering-tests/Makefile.sources | 2 ++ + .../text-rendering-tests/fonts/TestMORXThirtyfive.ttf | Bin 0 -> + 1968 bytes + .../text-rendering-tests/fonts/TestMORXThirtysix.ttf | Bin 0 -> + 1836 bytes + .../data/text-rendering-tests/tests/MORX-35.tests | 2 ++ + .../data/text-rendering-tests/tests/MORX-36.tests | 1 + + 6 files changed, 8 insertions(+) + +commit a62f37d6fa412b799b7247b813f6e65a968e7645 +Author: Behdad Esfahbod +Date: Fri Oct 5 02:49:29 2018 +0200 + + Change vendor features from Harf/Buzz to HARF/BUZZ + + https://github.com/harfbuzz/harfbuzz/commit/a01194aaf4c15160330b4042066263b2c963b658#commitcomment-30772041 + + "The tag space of tags consisting of four uppercase letters (A-Z) + with no punctuation, + spaces, or numbers, is reserved as a vendor space. Font vendors may + use such tags to + identify private features." + + src/hb-ot-shape.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e7a045e4db39e037badcab0ad1239c0cb56c1170 +Author: Michiharu Ariza +Date: Thu Oct 4 14:16:07 2018 -0700 + + fixed leak exposed by test-ot-extents-cff + + src/hb-cff-interp-common.hh | 3 +++ + src/hb-cff-interp-dict-common.hh | 4 ++++ + 2 files changed, 7 insertions(+) + +commit 6238edbd8b654d105bbd191dffabc7820f0a3223 +Author: Michiharu Ariza +Date: Thu Oct 4 13:59:36 2018 -0700 + + added CFF glyph extents API test + + test/api/Makefile.am | 1 + + test/api/test-ot-extents-cff.c | 65 + ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 66 insertions(+) + +commit 0222d57c357c775f25866653700b9dcb7d5bb807 +Author: Michiharu Ariza +Date: Thu Oct 4 09:37:57 2018 -0700 + + tweaked previous warning fixes + + src/hb-cff-interp-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7b3ae5ffd202346cb3742fe0f8cfafe8c36a4bd5 +Author: Behdad Esfahbod +Date: Thu Oct 4 16:36:42 2018 +0200 + + More bot fixes + + test/shaping/run-tests.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 310bdac4a08b99a25de6a16a20464873f90b52e4 +Author: Behdad Esfahbod +Date: Thu Oct 4 16:31:14 2018 +0200 + + Fix a warning + + util/view-cairo.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0abce58139bb58b8b97171db6387d2ac7eebdee0 +Author: Behdad Esfahbod +Date: Thu Oct 4 16:23:42 2018 +0200 + + [test] Choose 'ot' shaper specifically + + Now that we added morx support, our OS X bot is running them through + CoreText + and failing (with a DoS / infinite loop no less!). Always run + tests through + our own shaper. + + test/shaping/run-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c93d379bf2414eb6ee6d38fb9753ddf818a777ea +Author: Behdad Esfahbod +Date: Thu Oct 4 13:28:13 2018 +0200 + + [TODO] Clean up + + TODO | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +commit a01194aaf4c15160330b4042066263b2c963b658 +Author: Behdad Esfahbod +Date: Thu Oct 4 13:00:37 2018 +0200 + + Enable two OpenType features, 'Harf' and 'Buzz' + + One early, before script-specific features, one late, after. + Allows font + developers to detect us and behave differently if needed. + + src/hb-ot-shape.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 55468ca01b4cdf274900fb752fbf9ae05a78705e +Author: Behdad Esfahbod +Date: Thu Oct 4 12:13:55 2018 +0200 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/Makefile.sources | 6 +++++- + test/shaping/data/text-rendering-tests/extract-tests.py | 12 + ++++++++++++ + .../data/text-rendering-tests/fonts/TestGSUBThree.ttf | Bin 0 -> + 1504 bytes + .../text-rendering-tests/fonts/TestMORXThirtyfour.ttf | Bin 0 -> + 3608 bytes + .../text-rendering-tests/fonts/TestMORXThirtythree.ttf | Bin 0 -> + 1520 bytes + .../text-rendering-tests/fonts/TestMORXTwentyfour.ttf | Bin 0 -> + 1828 bytes + .../shaping/data/text-rendering-tests/tests/GSUB-3.tests | 1 + + .../data/text-rendering-tests/tests/MORX-24.tests | 1 + + .../data/text-rendering-tests/tests/MORX-32.tests | 8 ++++---- + .../data/text-rendering-tests/tests/MORX-33.tests | 3 +++ + .../data/text-rendering-tests/tests/MORX-34.tests | 1 + + test/shaping/run-tests.py | 15 + +++++++++------ + 12 files changed, 36 insertions(+), 11 deletions(-) + +commit 6ff8a8a10b62a54a87d53b0af66ccaba5d58b107 +Author: Behdad Esfahbod +Date: Thu Oct 4 12:09:45 2018 +0200 + + Minor + + test/shaping/data/text-rendering-tests/extract-tests.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 14ff3cbe0f30dea24e1bb175b1e8e41039f6afdc +Author: Behdad Esfahbod +Date: Thu Oct 4 11:34:21 2018 +0200 + + Apply morx if there's no GSUB! + + src/hb-ot-shape.cc | 23 ++++++++++++---- + src/hb-ot-shape.hh | 5 ++++ + test/shaping/data/text-rendering-tests/DISABLED | 32 + ---------------------- + .../data/text-rendering-tests/Makefile.sources | 14 +++++----- + 4 files changed, 29 insertions(+), 45 deletions(-) + +commit 3417037eb13a59dce6add0b1691ddb1b2b54c1e4 +Author: Behdad Esfahbod +Date: Thu Oct 4 11:08:15 2018 +0200 + + [aat] Add +hb_aat_layout_has_substitution + + src/hb-aat-layout-morx-table.hh | 2 ++ + src/hb-aat-layout.cc | 6 ++++++ + src/hb-aat-layout.hh | 2 ++ + 3 files changed, 10 insertions(+) + +commit 1f14107f71a6c3da8270ed21c3588f945fa91733 +Author: Sascha Brawer +Date: Thu Oct 4 09:17:08 2018 +0200 + + Minor: Fix autoconf warning + + Before this change, autoconf was emitting the following warnings: + + ``` + configure.ac:22: warning: AC_COMPILE_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + configure.ac:22: warning: AC_RUN_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + configure.ac:22: warning: AC_COMPILE_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + configure.ac:22: warning: AC_RUN_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + configure.ac:22: warning: AC_COMPILE_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + configure.ac:22: warning: AC_RUN_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + configure.ac:22: warning: AC_COMPILE_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + configure.ac:22: warning: AC_RUN_IFELSE was called before + AC_USE_SYSTEM_EXTENSIONS + ../../lib/autoconf/specific.m4:368: AC_USE_SYSTEM_EXTENSIONS is + expanded from... + configure.ac:22: the top level + ``` + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7810bb1a59ea71afeed7ea489400801ebdf642e4 +Author: Sascha Brawer +Date: Thu Oct 4 09:24:08 2018 +0200 + + [morx] Only insert glyphs at mark when a mark has been set before + + This reverts commit f4072e8cb81072cd6d51a2607efedb76c02e7db1. + https://github.com/harfbuzz/harfbuzz/issues/1195 + + src/hb-aat-layout-morx-table.hh | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 3ef358909eb7e26ca9630e61c7ba142d9e94389e +Author: Michiharu Ariza +Date: Wed Oct 3 18:08:25 2018 -0700 + + fixed warnings + + src/hb-cff-interp-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1aeaee9dfc7ee3ca410919c41e55452a0b6b9bf6 +Author: Michiharu Ariza +Date: Wed Oct 3 17:44:45 2018 -0700 + + fixed cff2 subset test data + + test/api/fonts/AdobeVFPrototype.abc.nohints.otf | Bin 0 -> 7800 bytes + test/api/test-subset-cff2.c | 4 ++-- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 8be5a9186be3ca4c50c73f372be4dbad08ac1863 +Merge: d7b384ad 5de2d9cd +Author: Michiharu Ariza +Date: Wed Oct 3 17:06:18 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 5de2d9cdbdca870901c0ba9472f5b78c48ba0a58 +Author: Ebrahim Byagowi +Date: Thu Oct 4 02:14:18 2018 +0330 + + Minor, fix double-promotion warnings (#1221) + + .circleci/config.yml | 2 +- + src/dump-emoji.cc | 2 +- + src/hb-common.cc | 2 +- + src/hb-ot-var-fvar-table.hh | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit c2c7e6471ca912c91c82f6d71338082978f13dc6 +Author: Ebrahim Byagowi +Date: Thu Oct 4 00:29:40 2018 +0330 + + State our graphite2 dependency no-deprecated compile flag (#1220) + + .circleci/config.yml | 2 +- + .travis.yml | 2 -- + configure.ac | 2 +- + 3 files changed, 2 insertions(+), 4 deletions(-) + +commit e4e74c2751ac24178086cce2811d34d8019b6f85 +Author: mhosken +Date: Thu Oct 4 02:33:26 2018 +0700 + + Update Graphite API to latest (#1215) + + src/hb-graphite2.cc | 28 +++++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +commit 81f5eb09eca010337ffb3369000a3d5c1e8e2cda +Author: Behdad Esfahbod +Date: Wed Oct 3 21:30:48 2018 +0200 + + Add emoji test for recent work + + test/shaping/data/in-house/Makefile.sources | 2 +- + .../fonts/3cf6f8ac6d647473a43a3100e7494b202b2cfafe.ttf | Bin 0 -> + 16596 bytes + test/shaping/data/in-house/tests/emoji-flag-tags.tests | 2 -- + test/shaping/data/in-house/tests/emoji.tests | 4 ++++ + 4 files changed, 5 insertions(+), 3 deletions(-) + +commit 9e2824cca0e42a53fafda7b2feb095986df40675 +Author: Ebrahim Byagowi +Date: Wed Oct 3 22:49:02 2018 +0330 + + [ci] Delete azure-pipelines + + End of experiment, we might get back to it later + + azure-pipelines.yml | 10 ---------- + 1 file changed, 10 deletions(-) + +commit b710ea4fdeb1a620b396bd07665fc129fe5fc074 +Author: Behdad Esfahbod +Date: Wed Oct 3 21:17:59 2018 +0200 + + Clean Fitzpatrick hack + + src/hb-ot-layout.hh | 2 +- + src/hb-ot-shape.cc | 9 +++++++-- + src/hb-unicode.hh | 20 -------------------- + 3 files changed, 8 insertions(+), 23 deletions(-) + +commit 95e5f1ae69036108f318b93b11d85b2ebc19109b +Author: Behdad Esfahbod +Date: Wed Oct 3 21:11:13 2018 +0200 + + Unbreak Fitzpatrick + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1159 + + src/hb-ot-layout.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 03fb6dd4c7d12a98cc0ef325432658c3c76ab208 +Author: Behdad Esfahbod +Date: Wed Oct 3 21:02:16 2018 +0200 + + Rewrite grapheme-formation in terms of new work + + Also, don't attach ZWNJ to previous cluster. Closer to Unicode + graphemes. + + src/hb-coretext.cc | 2 +- + src/hb-ot-shape.cc | 48 + ++++++---------------- + .../in-house/tests/indic-joiner-candrabindu.tests | 2 +- + .../data/in-house/tests/indic-joiners.tests | 6 +-- + 4 files changed, 18 insertions(+), 40 deletions(-) + +commit 68106b1d9b96caf79b0a778a7da75caf54e7d44a +Author: Behdad Esfahbod +Date: Wed Oct 3 20:50:12 2018 +0200 + + Minor + + src/hb-ot-layout.hh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 3f1c741b7a85d9c2d66e7f2446e988470c538b49 +Author: Behdad Esfahbod +Date: Wed Oct 3 20:45:19 2018 +0200 + + [test] Split a test + + .../fonts/4d4206e30b2dbf1c1ef492a8eae1c9e7829ebad8.ttf | Bin 0 -> + 51924 bytes + .../fonts/bb29ce50df2bdba2d10726427c6b7609bf460e04.ttf | Bin 74856 -> + 0 bytes + .../in-house/tests/mongolian-variation-selector.tests | 17 + ++++++++++++++++- + 3 files changed, 16 insertions(+), 1 deletion(-) + +commit ba813aab0909375af0c8f8e0c34595680c2762a4 +Author: Ebrahim Byagowi +Date: Wed Oct 3 21:52:15 2018 +0330 + + Update azure-pipelines.yml + + azure-pipelines.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 06922acbc4558699e43a4ed98ffb21f1e84abfc6 +Author: Behdad Esfahbod +Date: Wed Oct 3 20:19:17 2018 +0200 + + Fix distcheck + + src/Makefile.sources | 1 + + 1 file changed, 1 insertion(+) + +commit 4eea2e279b019ac627b2b9e2234a194957971022 +Author: Behdad Esfahbod +Date: Wed Oct 3 20:16:03 2018 +0200 + + [thai] Set continuation on decomposed nikhahit + + src/hb-ot-shape-complex-thai.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 8edc91022c3943fb306cee26ed6eb85381b5ea76 +Author: Behdad Esfahbod +Date: Wed Oct 3 20:13:20 2018 +0200 + + [indic] Reset continuation on inserted dottedcircle + + src/hb-ot-shape-complex-indic.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 2a6f15213ec30e5eb07465dd9dc81c2c386cb1e0 +Author: Behdad Esfahbod +Date: Wed Oct 3 20:09:14 2018 +0200 + + [buffer] Inline some more + + src/hb-buffer.cc | 44 -------------------------------------------- + src/hb-buffer.hh | 52 + ++++++++++++++++++++++++++++++++++++++++++++-------- + 2 files changed, 44 insertions(+), 52 deletions(-) + +commit 6f39c22029867c6d00cf70d7df242a28ca8f12bc +Author: Behdad Esfahbod +Date: Wed Oct 3 20:06:32 2018 +0200 + + Add code + + src/hb-ot-layout.hh | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 19d50aa2620f1464da8e00185b746e46fb0d80c4 +Author: Behdad Esfahbod +Date: Wed Oct 3 20:05:28 2018 +0200 + + [indic] Simplify dottedcircle + + src/hb-ot-shape-complex-indic.cc | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +commit 3b7831851052ecf2611a115cc2b80ef970d83df8 +Author: Behdad Esfahbod +Date: Wed Oct 3 19:44:15 2018 +0200 + + [emoji] Mark emoji contination sequences as continuation + + This adds a new grapheme bit. Not used yet. + + Part of https://github.com/harfbuzz/harfbuzz/issues/1159 + + src/hb-ot-layout.hh | 83 + +++++++++++++++++++++++++---------------------------- + src/hb-ot-shape.cc | 24 ++++++++++++++++ + src/hb-unicode.hh | 5 ---- + 3 files changed, 63 insertions(+), 49 deletions(-) + +commit 123326e20a30a51e25339c2eca272e4e6c847742 +Author: Behdad Esfahbod +Date: Wed Oct 3 19:19:51 2018 +0200 + + Dotted-circle all marks, not just non-spacing, at text beginning + + src/hb-ot-shape.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 4146c00caa29e53ee9a29def151f12792ac76596 +Author: Ebrahim Byagowi +Date: Wed Oct 3 21:26:58 2018 +0330 + + [test] Use an in-repo font for test-multithread (#1218) + + As Khaled's suggestion, hard-coded font paths was only for my own + testing. + + test/api/hb-subset-test.h | 13 +++++++++---- + test/api/test-multithread.c | 41 + ++++++++++++++++++++++++++--------------- + test/fuzzing/main.cc | 6 ++++++ + 3 files changed, 41 insertions(+), 19 deletions(-) + +commit fde9b8852d7cd6224afeffcfe363f4b445ab1ece +Author: azure-pipelines[bot] + +Date: Wed Oct 3 17:47:05 2018 +0000 + + [ci] Add a test Azure Pipelines Linux bot + + Related #1219 + + azure-pipelines.yml | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 674560cf244054a7e8c16073a59aa1b01e1ba5ea +Author: Behdad Esfahbod +Date: Wed Oct 3 19:10:28 2018 +0200 + + Fix build + + src/test-unicode-ranges.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 45e55f70801e2ccd28e1ee30bdf5341b1ac6efe5 +Author: Behdad Esfahbod +Date: Wed Oct 3 18:07:49 2018 +0200 + + [indic] Fix clang everything + + src/hb-ot-shape-complex-indic.cc | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 4df02e3240ada0734748a47572baa2fc1c6afbd1 +Author: Behdad Esfahbod +Date: Wed Oct 3 17:54:09 2018 +0200 + + Minor + + src/hb-ot-os2-unicode-ranges.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1e8f195b96765480007808da60789de9ac501c3b +Author: Behdad Esfahbod +Date: Wed Oct 3 17:46:48 2018 +0200 + + [emoji] Add emoji Extended_Pictographic table and function + + Part of https://github.com/harfbuzz/harfbuzz/issues/1159 + + . + + src/Makefile.am | 12 +- + src/gen-emoji-table.py | 64 ++++++++++ + src/hb-ot-os2-table.hh | 2 +- + src/hb-ot-os2-unicode-ranges.hh | 6 +- + src/hb-unicode-emoji-table.hh | 269 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-unicode.cc | 16 +++ + src/hb-unicode.hh | 37 +++++- + 7 files changed, 398 insertions(+), 8 deletions(-) + +commit 1dc601b04a816a5b5ed12ae1c01ddcfd60a8398f +Author: Behdad Esfahbod +Date: Wed Oct 3 17:27:46 2018 +0200 + + [os2] Minor rename/shuffle + + ...unicode-ranges.py => gen-os2-unicode-ranges.py} | 2 +- + src/hb-ot-os2-unicode-ranges.hh | 45 + +++++++++++----------- + 2 files changed, 24 insertions(+), 23 deletions(-) + +commit 7a1ab0464d3ee1ca5c9b31215fbffb8601ae860d +Author: lantw44 +Date: Wed Oct 3 23:22:43 2018 +0800 + + Fix test-multithread build on FreeBSD (#1217) + + Add the default font path used by FreeBSD ports. + + test/api/test-multithread.c | 2 ++ + 1 file changed, 2 insertions(+) + +commit df32eaae42b505b00de4a8b5efce9ab948bed847 +Author: Behdad Esfahbod +Date: Wed Oct 3 14:44:25 2018 +0200 + + [indic] Disallow vowel mark combinations that spoof other vowel marks + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1019 + + New numbers: + + BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%) + DEVANAGARI: 707261 out of 707394 tests passed. 133 failed (0.0188014%) + GUJARATI: 366353 out of 366457 tests passed. 104 failed (0.0283799%) + GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%) + KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%) + MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed + (0.0188871%) + ORIYA: 42327 out of 42329 tests passed. 2 failed (0.00472489%) + SINHALA: 271596 out of 271847 tests passed. 251 failed (0.0923313%) + TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%) + TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%) + + Devanagari regressed because Uniscribe doesn't enforce the full set. + + Tests added with the *-vowel-letters.txt files in tree and Noto fonts. + + src/hb-ot-shape-complex-indic.cc | 256 + ++++++++++++++++++++- + test/shaping/data/in-house/Makefile.sources | 1 + + .../03e3f463c3a985bc42096620cc415342818454fb.ttf | Bin 0 -> 2904 bytes + .../1a5face3fcbd929d228235c2f72bbd6f8eb37424.ttf | Bin 0 -> 8188 bytes + .../2c25beb56d9c556622d56b0b5d02b4670c034f89.ttf | Bin 0 -> 2460 bytes + .../604026ae5aaca83c49cd8416909d71ba3e1c1194.ttf | Bin 0 -> 4120 bytes + .../738d9f3b8c2dfd03875bf35a61d28fd78faf17c8.ttf | Bin 0 -> 2336 bytes + .../7d18685e1529e4ceaad5b6095dfab2f9789e5bce.ttf | Bin 0 -> 3452 bytes + .../881642af1667ae30a54e58de8be904566d00508f.ttf | Bin 0 -> 2760 bytes + .../af85624080af5627fb050f570d148a62f04fda74.ttf | Bin 0 -> 2656 bytes + .../tests/indic-vowel-letter-spoofing.tests | 53 +++++ + 11 files changed, 309 insertions(+), 1 deletion(-) + +commit 1b8d5e999192035c08f918aa1fcfcebdea67d82e +Author: Behdad Esfahbod +Date: Wed Oct 3 14:44:19 2018 +0200 + + [thai] Minor + + src/hb-ot-shape-complex-thai.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit d3d0cbd27831a6ea41b89f50d380296565c0016d +Author: Behdad Esfahbod +Date: Wed Oct 3 13:54:21 2018 +0200 + + Typo + + .../{bengali-vowel-leters.txt => bengali-vowel-letters.txt} + | 0 + .../{gujarati-vowel-letter.txt => gujarati-vowel-letters.txt} + | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 0dd9101fd0ddff80fff10ba98e93523aed95c8f5 +Author: Behdad Esfahbod +Date: Wed Oct 3 13:26:26 2018 +0200 + + Minor + + src/hb-ot-shape-complex-indic.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 9c4ffd10c4040ada9b1ffeb13c35f1330336359e +Author: Behdad Esfahbod +Date: Wed Oct 3 12:53:54 2018 +0200 + + Minor + + src/hb-ot-shape-complex.hh | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit bd1be8738fc4c73635cab7d77965264748d747cc +Author: HinTak +Date: Wed Oct 3 07:11:22 2018 +0800 + + Missing colon for gobject annotation + + There should be a colon separating "(transfer full)" and the + rest. Warned by g-ir-scanner. + + src/hb-face.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 75114e01d29b90f72a9398ed5dbc4298aba5a6b8 +Author: Behdad Esfahbod +Date: Wed Oct 3 12:29:56 2018 +0200 + + [use] Add Halant_Or_Vowel_Modifier category + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1102 + + src/gen-use-table.py | 7 +- + src/hb-ot-shape-complex-use-machine.hh | 518 + +++++++++++---------- + src/hb-ot-shape-complex-use-machine.rl | 9 +- + src/hb-ot-shape-complex-use-table.cc | 4 +- + src/hb-ot-shape-complex-use.hh | 5 +- + .../28f497629c04ceb15546c9a70e0730125ed6698d.ttf | Bin 0 -> 1496 bytes + .../shaping/data/in-house/tests/use-syllable.tests | 3 + + 7 files changed, 301 insertions(+), 245 deletions(-) + +commit d7b384ad0d0a3e1d35ef92a6e98a97bb9c367f48 +Author: Michiharu Ariza +Date: Tue Oct 2 21:08:36 2018 -0700 + + silence warning ^3 + + src/hb-subset-cff1.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e9cc71ac86bd771d9fcb2ee1eb620060db92ac1a +Author: Michiharu Ariza +Date: Tue Oct 2 20:44:30 2018 -0700 + + silence warning ^2 + + src/hb-subset-cff1.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2700db9ade23cbf69d17a7a1802a7f144c25f8dc +Author: Michiharu Ariza +Date: Tue Oct 2 15:05:26 2018 -0700 + + rm build files + + build/test/api/.libs/test-collect-unicodes | Bin 14336 -> 0 bytes + build/test/api/.libs/test-multithread | Bin 10936 -> 0 bytes + build/test/api/test-collect-unicodes | 210 + ----------------------------- + build/test/api/test-multithread | 210 + ----------------------------- + 4 files changed, 420 deletions(-) + +commit 51d5bf4ca2ebb9b8aa3b2777781e328fb93ceea7 +Author: Michiharu Ariza +Date: Tue Oct 2 14:38:06 2018 -0700 + + silence warnings + + src/hb-cff-interp-cs-common.hh | 2 +- + src/hb-subset-cff1.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 35b64dfb57cac0d949363e9b19352dd4274c2584 +Author: Michiharu Ariza +Date: Tue Oct 2 14:13:36 2018 -0700 + + silence & fix new warnings + + src/hb-cff-interp-dict-common.hh | 3 ++- + src/hb-cff1-interp-cs.hh | 9 +++++---- + src/hb-ot-cff-common.hh | 4 ++-- + src/hb-subset-cff1.cc | 4 ++-- + src/hb-subset-cff2.cc | 4 ++-- + 5 files changed, 13 insertions(+), 11 deletions(-) + +commit eed7e6bbc8e7be99d59a7822a1c37bc715c379b3 +Author: Michiharu Ariza +Date: Tue Oct 2 13:45:14 2018 -0700 + + redefine OpCodes as define instead of enum + + in order to eradicate duplicate enum warnings + + src/hb-cff-interp-common.hh | 348 + ++++++++++++++++++++++---------------------- + 1 file changed, 174 insertions(+), 174 deletions(-) + +commit 9cdd70b344b9dc34a29aeca79028cbb5d949ca1d +Merge: 3dd43f02 6353cc1f +Author: Michiharu Ariza +Date: Tue Oct 2 13:43:21 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 6353cc1f83c862910860976411a1157f7ed571bc +Author: Ebrahim Byagowi +Date: Tue Oct 2 21:39:19 2018 +0330 + + [circleci] Fix some of warnings from clang-everything bot (#1211) + + * -Wshift-sign-overflow + * -Wmissing-prototypes + + .circleci/config.yml | 4 ++-- + src/dump-emoji.cc | 19 ++++++++++--------- + src/hb-ucdn.cc | 3 +++ + src/test-unicode-ranges.cc | 4 ++-- + test/fuzzing/hb-subset-fuzzer.cc | 32 +++++++++++++++++--------------- + util/ansi-print.cc | 4 ++-- + 6 files changed, 36 insertions(+), 30 deletions(-) + +commit 9f1dee32fbad3b1486725c18570199156b57a94d +Author: Behdad Esfahbod +Date: Tue Oct 2 18:56:20 2018 +0200 + + [tests] Allow test-runner to ignore shaping output + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1212 + + test/shaping/data/in-house/tests/fuzzed.tests | 46 + +++++++++++++-------------- + test/shaping/run-tests.py | 2 +- + 2 files changed, 24 insertions(+), 24 deletions(-) + +commit fef7af1e22efb399517137b35d0ba9f307411ca3 +Author: Behdad Esfahbod +Date: Tue Oct 2 18:46:13 2018 +0200 + + [tibetan] Remove unused Tibetan shaper + + src/Makefile.sources | 1 - + src/hb-ot-shape-complex-tibetan.cc | 63 + -------------------------------------- + src/hb-ot-shape-complex.hh | 1 - + 3 files changed, 65 deletions(-) + +commit 32a438166fbccac6e0d9a615a492fc8cabfd21ab +Author: Behdad Esfahbod +Date: Tue Oct 2 18:43:29 2018 +0200 + + [tibetan] Route Tibetan through USE + + Fixes https://github.com/harfbuzz/harfbuzz/pull/933 + https://github.com/harfbuzz/harfbuzz/issues/1012 + + Tibetan failures go from 0 to 2: + + TIBETAN: 208467 out of 208469 tests passed. 2 failed (0.000959375%) + + src/gen-use-table.py | 30 ++++++++++------ + src/hb-ot-shape-complex-use-table.cc | 70 + ++++++++++++++++++++++-------------- + src/hb-ot-shape-complex.hh | 8 +---- + 3 files changed, 65 insertions(+), 43 deletions(-) + +commit 77792187be1405599e6aecfc3ed1fc771d505ddb +Author: Behdad Esfahbod +Date: Tue Oct 2 18:20:16 2018 +0200 + + [khmer] Remove unused khmer_position() + + src/dump-khmer-data.cc | 8 +++----- + src/hb-ot-shape-complex-khmer.hh | 1 - + 2 files changed, 3 insertions(+), 6 deletions(-) + +commit 5101abd42f4027edf182eddfa58c629b11c2a7f6 +Author: Behdad Esfahbod +Date: Tue Oct 2 17:49:06 2018 +0200 + + [indic/use] Factor common expressions in ragel machine + + No machine change. + + src/hb-ot-shape-complex-indic-machine.hh | 46 + ++++++++++++++++---------------- + src/hb-ot-shape-complex-indic-machine.rl | 10 ++++--- + src/hb-ot-shape-complex-use-machine.hh | 38 +++++++++++++------------- + src/hb-ot-shape-complex-use-machine.rl | 20 +++++++------- + 4 files changed, 58 insertions(+), 56 deletions(-) + +commit 6f457f8370de5d96452ee3a2d1b0a97b025ef1d1 +Author: Behdad Esfahbod +Date: Tue Oct 2 17:46:27 2018 +0200 + + [indic] Minor flip grammar around + + No behavior change. + + src/hb-ot-shape-complex-indic-machine.rl | 2 +- + src/hb-ot-shape-complex-use-machine.rl | 1 - + 2 files changed, 1 insertion(+), 2 deletions(-) + +commit d992982d23ef0c39ea42595ed0e8a4752977d1a5 +Author: Behdad Esfahbod +Date: Tue Oct 2 17:16:01 2018 +0200 + + [indic] Add some confusable sequences from Unicode Standard + + .../script-bengali/bengali-vowel-leters.txt | 3 ++ + .../devanagari-atomic-consonants.txt | 33 + ++++++++++++++++++++++ + .../script-devanagari/devanagari-vowel-letters.txt | 17 +++++++++++ + .../script-gujarati/gujarati-vowel-letter.txt | 8 ++++++ + .../script-gurmukhi/gurmukhi-vowel-letters.txt | 9 ++++++ + .../script-kannada/kannada-vowel-letters.txt | 3 ++ + .../script-malayalam/malayalam-vowel-letters.txt | 5 ++++ + .../script-oriya/oriya-vowel-letters.txt | 3 ++ + .../script-telugu/telugu-vowel-letters.txt | 5 ++++ + 9 files changed, 86 insertions(+) + +commit 40d5d19d5b875eef526a2a66892c3f638f633fa3 +Author: Behdad Esfahbod +Date: Tue Oct 2 17:04:05 2018 +0200 + + [ragel] Use ts/te (token-start / token-end) instead of manual tracking + + src/hb-ot-shape-complex-indic-machine.hh | 22 ++++++++++------------ + src/hb-ot-shape-complex-indic-machine.rl | 8 +++----- + src/hb-ot-shape-complex-khmer-machine.hh | 22 ++++++++++------------ + src/hb-ot-shape-complex-khmer-machine.rl | 8 +++----- + src/hb-ot-shape-complex-myanmar-machine.hh | 22 ++++++++++------------ + src/hb-ot-shape-complex-myanmar-machine.rl | 8 +++----- + src/hb-ot-shape-complex-use-machine.hh | 22 ++++++++++------------ + src/hb-ot-shape-complex-use-machine.rl | 8 +++----- + 8 files changed, 52 insertions(+), 68 deletions(-) + +commit 9efddb9de821fc909a3ea8354f3dfd39c823e97b +Author: Behdad Esfahbod +Date: Tue Oct 2 16:05:26 2018 +0200 + + Treat a base+mark... ligature as base, not ligature + + Fixes https://github.com/harfbuzz/harfbuzz/issues/746 + + src/hb-ot-layout-gsubgpos.hh | 22 +++++++++++++++------- + 1 file changed, 15 insertions(+), 7 deletions(-) + +commit 3cca978723db43233d25402254d297dfccf991a3 +Author: Behdad Esfahbod +Date: Tue Oct 2 15:02:16 2018 +0200 + + Move code around + + src/hb-ot-layout-gsub-table.hh | 3 --- + src/hb-ot-layout-gsubgpos.hh | 22 +++++++++++----------- + 2 files changed, 11 insertions(+), 14 deletions(-) + +commit 0a371fee4d22ed63207aa76c00b05b75bbc95f5f +Author: Behdad Esfahbod +Date: Tue Oct 2 14:48:39 2018 +0200 + + Minor + + src/hb-ot-map.hh | 6 ++++-- + src/hb-ot-shape-complex-arabic.cc | 6 +++--- + src/hb-ot-shape-complex-myanmar.cc | 4 ++-- + src/hb-ot-shape-complex-use.cc | 8 ++++---- + src/hb-ot-shape.cc | 4 ++-- + 5 files changed, 15 insertions(+), 13 deletions(-) + +commit 94d15528f80dbb7110d816fb5845f257f605a0be +Author: Behdad Esfahbod +Date: Tue Oct 2 14:45:09 2018 +0200 + + Minor + + src/hb-ot-map.hh | 1 + + src/hb-ot-shape.cc | 39 ++++++++++++++++++--------------------- + 2 files changed, 19 insertions(+), 21 deletions(-) + +commit 729f634728fb553300021d52089495271dfb19fd +Author: Behdad Esfahbod +Date: Tue Oct 2 14:40:14 2018 +0200 + + Disable joiner-skipping when looking back for base to attach mark to + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1189 + + src/hb-ot-shape.cc | 5 ++++- + test/shaping/data/in-house/Makefile.sources | 1 + + .../fonts/641ca9d7808b01cafa9a666c13811c9b56eb9c52.ttf | Bin 0 -> + 11492 bytes + .../data/in-house/tests/arabic-mark-attach.tests | 1 + + 4 files changed, 6 insertions(+), 1 deletion(-) + +commit c36f3f5bef52e660541933f003fafa6e3a14785d +Author: Behdad Esfahbod +Date: Tue Oct 2 14:34:29 2018 +0200 + + [arabic] Use manual-zwj instead of flipping joiners + + src/hb-buffer.hh | 3 +-- + src/hb-ot-layout.hh | 12 ++---------- + src/hb-ot-shape-complex-arabic.cc | 41 + ++++++--------------------------------- + 3 files changed, 9 insertions(+), 47 deletions(-) + +commit 48c513fec978819927535bc86b43be74315f746c +Author: Behdad Esfahbod +Date: Tue Oct 2 14:17:42 2018 +0200 + + Minor + + src/hb-ot-shape-complex-arabic.cc | 2 +- + src/hb-ot-shape-complex-default.cc | 2 +- + src/hb-ot-shape-complex-hangul.cc | 2 +- + src/hb-ot-shape-complex-hebrew.cc | 14 +------------- + src/hb-ot-shape-complex-indic.cc | 2 +- + src/hb-ot-shape-complex-indic.hh | 2 -- + src/hb-ot-shape-complex-khmer.cc | 2 +- + src/hb-ot-shape-complex-myanmar.cc | 4 ++-- + src/hb-ot-shape-complex-thai.cc | 2 +- + src/hb-ot-shape-complex-tibetan.cc | 2 +- + src/hb-ot-shape-complex-use.cc | 2 +- + src/hb-ot-shape-complex.hh | 11 ++++------- + src/hb-ot-shape.cc | 8 ++++---- + 13 files changed, 19 insertions(+), 36 deletions(-) + +commit cca757ae56d6a82cfad35edc6dbae58049a34f91 +Author: Behdad Esfahbod +Date: Tue Oct 2 13:27:11 2018 +0200 + + Minor + + src/hb-ot-shape.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 96eca87f89588126d3fa5c7f3884ae2f302a91e1 +Author: Behdad Esfahbod +Date: Tue Oct 2 13:24:40 2018 +0200 + + Move things + + src/hb-ot-shape.cc | 22 ++++++++++------------ + src/hb-ot-shape.hh | 3 +++ + 2 files changed, 13 insertions(+), 12 deletions(-) + +commit 588a4ac8bc9fd20464c7a77ead27ae34478c9bc8 +Author: Behdad Esfahbod +Date: Tue Oct 2 13:13:47 2018 +0200 + + Rename + + src/hb-ot-face.cc | 20 +++++++------- + src/hb-ot-face.hh | 78 + +++++++++++++++++++++++++++---------------------------- + 2 files changed, 49 insertions(+), 49 deletions(-) + +commit 10b6c7c63870fa04cd8adcf9f38644c2a799db8a +Author: Behdad Esfahbod +Date: Tue Oct 2 13:11:18 2018 +0200 + + Minor include cleanup + + src/hb-ot-shape-complex.hh | 1 + + src/hb-ot-shape.cc | 4 +--- + src/hb-ot-shape.hh | 2 +- + 3 files changed, 3 insertions(+), 4 deletions(-) + +commit 1d1734e985e1f2a746b4fff0cd82d96d477577d5 +Author: Behdad Esfahbod +Date: Tue Oct 2 13:04:05 2018 +0200 + + Shuffle code around + + src/hb-ot-shape-complex-hebrew.cc | 2 +- + src/hb-ot-shape-fallback.cc | 2 +- + src/hb-ot-shape-normalize.cc | 2 +- + src/hb-ot-shape.cc | 32 ++++++++++++++++++++++++++++---- + src/hb-ot-shape.hh | 29 ++++++----------------------- + 5 files changed, 37 insertions(+), 30 deletions(-) + +commit bf5088b3dcd94106937290c180f3f40bc8524b48 +Author: Ebrahim Byagowi +Date: Tue Oct 2 11:07:06 2018 +0330 + + Minor, fix -Weverthing bot warnings (#1210) + + test/api/test-buffer.c | 8 ++++---- + test/api/test-multithread.c | 3 +-- + 2 files changed, 5 insertions(+), 6 deletions(-) + +commit d27e5ec3a236b8eb37ef9ce558ad54077e46b003 +Author: Khaled Hosny +Date: Tue Oct 2 08:25:29 2018 +0200 + + Skip BOM in the Python sample file + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1208 + + src/sample.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit f9ea3dc4c6e85c417dd4c8546e5ebe02b67131b9 +Author: HinTak +Date: Tue Oct 2 06:43:06 2018 +0100 + + Missing "out" indicator (#1209) + + Missing "out" indicator. Affect gobject introspection. + + src/hb-font.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9742679b8253919f8bfec8a77532092044e951aa +Author: Ebrahim Byagowi +Date: Tue Oct 2 03:20:48 2018 +0330 + + [circleci] Remove some of the not needed flags + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f72b748371da2d7ce327a5d15feea46960aa7dd3 +Author: Ebrahim Byagowi +Date: Tue Oct 2 00:16:08 2018 +0330 + + [circleci] Fix "msan" and "everything" bots (#1205) + + .circleci/config.yml | 13 ++++++------- + src/check-symbols.sh | 2 -- + test/fuzzing/main.cc | 22 +++++++++------------- + test/fuzzing/run-shape-fuzzer-tests.py | 2 -- + test/fuzzing/run-subset-fuzzer-tests.py | 2 -- + 5 files changed, 15 insertions(+), 26 deletions(-) + +commit 8bf4027d23318c7e1ff7fe9f5e7ad8b0380e5415 +Author: Behdad Esfahbod +Date: Mon Oct 1 20:05:00 2018 +0200 + + [indic] Remove Consonant_Medial from grammar and code + + The only Indic CM is U+0A75 GURMUKHI SIGN YAKASH, which Uniscribe + doesn't treat + specially, and font designers design for that. So, do the same. + + src/hb-ot-shape-complex-indic-machine.hh | 1244 + ++++++++++++++---------------- + src/hb-ot-shape-complex-indic-machine.rl | 10 +- + src/hb-ot-shape-complex-indic.cc | 2 +- + src/hb-ot-shape-complex-indic.hh | 6 +- + 4 files changed, 589 insertions(+), 673 deletions(-) + +commit ab4c37f73a7d4fcf48584cda3fff94e98a672086 +Author: Behdad Esfahbod +Date: Mon Oct 1 19:35:48 2018 +0200 + + [khmer] Add mark-ordering tests + + Fixes https://github.com/harfbuzz/harfbuzz/issues/667 + + test/shaping/data/in-house/Makefile.sources | 2 ++ + .../b6031119874ae9ff1dd65383a335e361c0962220.ttf | Bin 0 -> 2564 bytes + .../data/in-house/tests/khmer-mark-order.tests | 25 + +++++++++++++++++++++ + 3 files changed, 27 insertions(+) + +commit 51436547162a18e88144e7125ad6ce4a69a08d4b +Author: Behdad Esfahbod +Date: Mon Oct 1 19:09:58 2018 +0200 + + [khmer] Rewrite grammar completely + + Based on experimenting with Uniscribe to extract grammar and + categories. + + Failures down from 44 to 35: + + KHMER: 299089 out of 299124 tests passed. 35 failed (0.0117008%) + + We still don't enforce the one-matra rule pre-decomposition, + but enforce + an order and one-matra-per-position post-decomposition. + + https://github.com/harfbuzz/harfbuzz/issues/667 + + src/hb-ot-shape-complex-indic.hh | 2 +- + src/hb-ot-shape-complex-khmer-machine.hh | 300 + ++++++++++++++++++++----------- + src/hb-ot-shape-complex-khmer-machine.rl | 42 +++-- + src/hb-ot-shape-complex-khmer.cc | 4 +- + src/hb-ot-shape-complex-khmer.hh | 99 +++++----- + 5 files changed, 270 insertions(+), 177 deletions(-) + +commit 3dd43f0234febd434d89927adf2ee19f0489c5a7 +Merge: ab16b24c eb1e6028 +Author: Michiharu Ariza +Date: Mon Oct 1 10:22:06 2018 -0700 + + Merge branch 'master' into cff-subset + +commit aaaa65baa7fcfb65ae814528bdd93cc5c4ea540d +Author: Behdad Esfahbod +Date: Mon Oct 1 16:59:48 2018 +0200 + + [khmer] Remove unused code + + src/hb-ot-shape-complex-khmer.hh | 12 ------------ + 1 file changed, 12 deletions(-) + +commit eb1e60287732ede6040ce6f7498c10909448d248 +Author: Behdad Esfahbod +Date: Mon Oct 1 15:31:50 2018 +0200 + + [test] Try import unicodedata2 as unicodedata + + test/shaping/hb_test_tools.py | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 81afdbe803ca949d915d03cab4a6ed6c6e6ff304 +Author: Behdad Esfahbod +Date: Mon Oct 1 15:01:04 2018 +0200 + + [use] Disable automatic ZWJ for 'akhn' feature + + Fixes https://github.com/harfbuzz/harfbuzz/issues/746 + + src/hb-ot-shape-complex-use.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ceef311dcaea7e1ecfedb4f1257a705572611f0f +Author: Behdad Esfahbod +Date: Mon Oct 1 12:45:06 2018 +0200 + + [use] Change categories for Left_And_* matras + + These are only relevant to Sinhala, because they decompose in other + cases. The USE spec categorizes them all as VPst. No idea why we + weren't following that before. + + src/gen-use-table.py | 4 ++-- + src/hb-ot-shape-complex-use-table.cc | 24 ++++++++++++------------ + 2 files changed, 14 insertions(+), 14 deletions(-) + +commit 3426a361571a1996b5a895fb9374ce3a4a7f9af3 +Author: Behdad Esfahbod +Date: Mon Oct 1 12:55:57 2018 +0200 + + Unbreak bots + + src/hb-cache.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 98ac01d3b3deb7c7f5411f6f25c6e7588d84b5f9 +Author: Behdad Esfahbod +Date: Mon Oct 1 12:10:00 2018 +0200 + + [morx] Break out if buffer gets into error + + Was getting stuck not making progress somehow. + + src/hb-aat-layout-common.hh | 2 ++ + src/hb-aat-layout-morx-table.hh | 4 ++++ + 2 files changed, 6 insertions(+) + +commit df827a6ab88cd8bde346176fc53a5c2d57eee808 +Author: Behdad Esfahbod +Date: Mon Oct 1 11:34:20 2018 +0200 + + [cache] Fix cache coherency corner-case + + If key_bits+value_bits-cache_bits==32 then -1 is ambiguous... + + src/hb-cache.hh | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 0fa1edbd3bbf825be078677dc46c3440f9802551 +Author: Ebrahim Byagowi +Date: Mon Oct 1 09:40:29 2018 +0330 + + [circleci] Couple of fixes (#1200) + + * Raise error on warnings on -everything + * Enable fontconfig to two bots + * Fix msan bot now that all of its real complain are gone + + .circleci/config.yml | 14 ++++++-------- + src/check-symbols.sh | 2 ++ + src/hb-ucdn.cc | 2 ++ + test/fuzzing/run-shape-fuzzer-tests.py | 2 ++ + test/fuzzing/run-subset-fuzzer-tests.py | 2 ++ + util/helper-cairo.cc | 2 ++ + 6 files changed, 16 insertions(+), 8 deletions(-) + +commit 3babb0813c69d2b419f06773f366a44a9ad32cdb +Author: Behdad Esfahbod +Date: Sun Sep 30 20:02:30 2018 +0200 + + [msan] Disable icu explicitly + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit dc9b47ae87096d34d146e50e44e742a76861976f +Author: Behdad Esfahbod +Date: Sun Sep 30 18:35:12 2018 +0200 + + [msan] Remove uninstrumented libraries + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ad1c190ecfbac66ffeef69db769073a33331eed3 +Author: Behdad Esfahbod +Date: Sun Sep 30 18:26:45 2018 +0200 + + Correct fix for glib-mkenum warning + + src/hb-buffer.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 1dd1e56bf42af5b11afc3e34f78869e93d39867e +Author: Behdad Esfahbod +Date: Sun Sep 30 18:25:58 2018 +0200 + + Revert "Fix glib-mkenum warning" + + This reverts commit 247756a7d89008ee6a7d1171dc07ba22454c6034. + + Was wrong. Right fix coming. + + src/hb-buffer.h | 2 ++ + 1 file changed, 2 insertions(+) + +commit 3f08750fa6772e7e342b96192b84cb9963f7335b +Author: Behdad Esfahbod +Date: Sun Sep 30 18:23:34 2018 +0200 + + Move _POSIX_SOURCE to hb.hh + + src/hb-blob.cc | 5 ----- + src/hb.hh | 4 ++++ + 2 files changed, 4 insertions(+), 5 deletions(-) + +commit 90dd255e570bf8ea3436e2f29242068845256e55 +Author: Behdad Esfahbod +Date: Sun Sep 30 18:19:54 2018 +0200 + + Change _HB_SCRIPT_MAX_VALUE from 0xFFFFFFFF to 0x7FFFFFFF + + Fixes https://github.com/harfbuzz/harfbuzz/issues/504 + + src/hb-common.h | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit dcfcb950b81a2865ef01f5a69087264b79ed1bfd +Author: Behdad Esfahbod +Date: Sun Sep 30 18:14:50 2018 +0200 + + [test] Fix -Wunused-parameter warnings + + test/api/hb-test.h | 1 + + test/api/test-blob.c | 2 +- + test/api/test-c.c | 2 +- + test/api/test-font.c | 16 ++++++++-------- + test/api/test-multithread.c | 2 +- + test/api/test-ot-color.c | 2 +- + test/api/test-shape.c | 14 +++++++------- + test/api/test-unicode.c | 10 +++++----- + 8 files changed, 25 insertions(+), 24 deletions(-) + +commit be0b2ed3162f465dbf44a0f018d4e2af5dcdf87c +Author: Behdad Esfahbod +Date: Sun Sep 30 18:01:20 2018 +0200 + + More warning fixes + + test/api/test-multithread.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 5c65ed800de4caef5ee9ad2111225fa5d8235737 +Author: Behdad Esfahbod +Date: Sun Sep 30 17:48:55 2018 +0200 + + Fix bug introduced in 9b0b40b3c1ac8155c80ed5dc976228f4d3ec7e1f + + Also discovered by msan bot. + + src/hb-ot-shape-fallback.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 247756a7d89008ee6a7d1171dc07ba22454c6034 +Author: Behdad Esfahbod +Date: Sun Sep 30 13:10:54 2018 +0200 + + Fix glib-mkenum warning + + GEN hb-gobject-enums.h + WARNING: Failed to parse "/*< private >*/" in ../../src/hb-buffer.h + + src/hb-buffer.h | 2 -- + 1 file changed, 2 deletions(-) + +commit 0a89f9572fe2d0d9fbf0297e0a69307f0ba1a17c +Author: Ebrahim Byagowi +Date: Sun Sep 30 17:44:15 2018 +0330 + + [circleci] Pass ‌freetype compile flags to right place + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ad701f05cc86c22e8e53b7f5458887457e3a5e5f +Author: Ebrahim Byagowi +Date: Sun Sep 30 17:30:42 2018 +0330 + + [circleci] Use an instrumented freetype on msan bot + + .circleci/config.yml | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 57aabbc29ec6dfa7f1b57da7b6c62fdc547f8ef8 +Author: Ebrahim Byagowi +Date: Sun Sep 30 16:31:28 2018 +0330 + + [circleci] Another on fixing msan + + .circleci/config.yml | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 24f148df3ecc899c9cf6d5359d3d35ee5e84a98c +Author: Ebrahim Byagowi +Date: Sun Sep 30 14:46:56 2018 +0330 + + [circleci] minor + + .circleci/config.yml | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 0a9aab672287149540e8d90b5063ad4c562c423c +Author: Ebrahim Byagowi +Date: Sun Sep 30 14:45:43 2018 +0330 + + [circleci] Try to fix msan bot + + .circleci/config.yml | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit b5285b34798cb7ee672343d00cbe066ea8a2ef83 +Author: Behdad Esfahbod +Date: Sun Sep 30 12:23:01 2018 +0200 + + [util] Remove unneeded virtual + + clang warning: + + ../../util/options.hh:72:13: warning: destination for this 'memset' + call is a pointer to dynamic class + 'option_parser_t'; vtable pointer will be overwritten + [-Wdynamic-class-memaccess] + memset (this, 0, sizeof (*this)); + ~~~~~~ ^ + ../../util/options.hh:72:13: note: explicitly cast the pointer to + silence this warning + memset (this, 0, sizeof (*this)); + ^ + (void*) + + util/options.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 89ed040b21b366c927199bedd0e4cb060389d076 +Author: Behdad Esfahbod +Date: Sun Sep 30 06:06:26 2018 -0400 + + [util] Fix more non-virtual-destructor warnings + + util/options.hh | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +commit 2382dd07fa6ff49638b146a523e9d2e93cf69ceb +Author: Behdad Esfahbod +Date: Sun Sep 30 05:54:47 2018 -0400 + + Minor + + util/options.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 9caa432d0c5c09c8151cfce1e2cc184fbdd89594 +Author: Behdad Esfahbod +Date: Sun Sep 30 05:49:08 2018 -0400 + + [util] Use HB_FALLTHROUGH + + Sure, gcc knows to warn about this as well: + + ../../util/options.cc:175:17: warning: this statement may fall through + [-Wimplicit-fallthrough=] + case 1: m.r = m.t; + ~~~~^~~~~ + ../../util/options.cc:176:5: note: here + case 2: m.b = m.t; + ^~~~ + + But HOLY SMOKES, look at clang -Weverything bot message: + + options.cc:176:5: warning: unannotated fall-through between switch + labels [-Wimplicit-fallthrough] + case 2: m.b = m.t; + ^ + options.cc:176:5: note: insert 'HB_FALLTHROUGH;' to silence this + warning + case 2: m.b = m.t; + ^ + HB_FALLTHROUGH; + + Right, it's telling me to insert "HB_FALLTHROUGH;" there!!!!!!!!! + + util/options.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 2e728a7d86c714d845524a0722c2b653feb9d915 +Author: Behdad Esfahbod +Date: Sun Sep 30 05:47:36 2018 -0400 + + [util] Mark var static + + From clang -Weverything bot: + + options.cc:39:3: warning: no previous extern declaration + for non-static variable 'supported_font_funcs' + [-Wmissing-variable-declarations] + + util/options.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e910a1aef4b2413c627240fc06d2a5696b24747a +Author: Behdad Esfahbod +Date: Sun Sep 30 05:46:20 2018 -0400 + + [util] Add empty virtual destructor to option_group_t + + From clang -Weverything bot: + + ./options.hh:57:8: warning: 'option_group_t' has virtual functions + but non-virtual destructor [-Wnon-virtual-dtor] + struct option_group_t + ^ + + util/options.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit b1e07e1e6cc7a8e5445c7aeb9491ae629029011b +Author: Behdad Esfahbod +Date: Sun Sep 30 05:43:22 2018 -0400 + + [indic/khmer] Remove use of global constructors + + Alternative woul have been to resurrect F_COMBINE that I removed in + 70136a78cb9eda244767f8e8a3d30d0f3c569d01 + + But this does it for now. I'm not sure why check-static-inits.sh + didn't + catch this before. Clang -Weverything bot did: + + CXX libharfbuzz_la-hb-ot-shape-complex-indic.lo + hb-ot-shape-complex-indic.cc:99:1: warning: declaration requires a + global constructor [-Wglobal-constructors] + indic_features[] = + ^ + 1 warning generated. + CXX libharfbuzz_la-hb-ot-shape-complex-khmer.lo + hb-ot-shape-complex-khmer.cc:36:1: warning: declaration requires a + global constructor [-Wglobal-constructors] + khmer_features[] = + ^ + 1 warning generated. + + src/hb-ot-map.hh | 2 ++ + src/hb-ot-shape-complex-indic.cc | 34 +++++++++++++++++----------------- + src/hb-ot-shape-complex-khmer.cc | 18 +++++++++--------- + 3 files changed, 28 insertions(+), 26 deletions(-) + +commit 00cd00e64130694ff7b49456d4bc421a153b4e6d +Author: Behdad Esfahbod +Date: Sun Sep 30 05:34:30 2018 -0400 + + Tweak HB_TAG and HB_UNTAG + + uint32_t was getting promoted to signed int, which is not what + we wanted... + + Wow, clang has become good at generating warnings... + + ../../src/hb-common.h:349:29: warning: signed shift result + (0xFF000000) sets the sign bit of the shift expression's type ('int') + and becomes negative [-Wshift-sign-overflow] + _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX, /*< + skip >*/ + ^~~~~~~~~~ + ../../src/hb-common.h:93:20: note: expanded from macro 'HB_TAG_MAX' + define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff) + ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + ../../src/hb-common.h:89:57: note: expanded from macro 'HB_TAG' + define HB_TAG(c1,c2,c3,c4) + ((hb_tag_t)((((uint8_t)(c1))<<24)|(((uint8_t)(c2))<<16)|(((uint8_t)(c3))<<8)|((uint8_t)(c4)))) + ~~~~~~~~~~~~~~~^ ~~ + ../../src/hb-common.h:349:3: warning: ISO C restricts enumerator + values to range of 'int' (4294967295 is too large) [-Wpedantic] + _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX, /*< + skip >*/ + ^ ~~~~~~~~~~ + + src/hb-common.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8a31e406291f4cb27480fc85049f08abd739cb59 +Author: Behdad Esfahbod +Date: Sun Sep 30 05:27:39 2018 -0400 + + [font] Make *_advance() fallback to *_advances + + And remove redundant implementations. + + src/hb-font.cc | 12 ++++++++++++ + src/hb-ft.cc | 19 ------------------- + src/hb-ot-font.cc | 22 ---------------------- + 3 files changed, 12 insertions(+), 41 deletions(-) + +commit bd07d2878ff28baecf7b4b587a18ffbb744b7eb1 +Author: Behdad Esfahbod +Date: Sun Sep 30 03:54:40 2018 -0400 + + Use buffer scratch_flags to remember if we had any joiners + + src/hb-buffer.hh | 3 ++- + src/hb-ot-layout.hh | 12 ++++++++++-- + src/hb-ot-shape-complex-arabic.cc | 3 +++ + 3 files changed, 15 insertions(+), 3 deletions(-) + +commit ba0f0f156fe05bda760efcb0c8d34f303fa26ab0 +Author: Behdad Esfahbod +Date: Sun Sep 30 03:49:52 2018 -0400 + + Document setlocale() threadsafety issue + + "Fixes" //github.com/harfbuzz/harfbuzz/issues/1191 + + src/hb-buffer.cc | 2 ++ + src/hb-common.cc | 7 +++++++ + 2 files changed, 9 insertions(+) + +commit 06be2aa93fa6ea8cc32684a4b51bfe927c5202bb +Author: Ebrahim Byagowi +Date: Sun Sep 30 00:15:25 2018 +0330 + + [ci] Build glib and freetype and enable msan bot (#1198) + + .circleci/config.yml | 41 +++++++++++++++++++++-------------------- + 1 file changed, 21 insertions(+), 20 deletions(-) + +commit cefdef0247026f941eba8930c73b66b0498bb63c +Author: Ebrahim Byagowi +Date: Sat Sep 29 10:19:54 2018 +0330 + + Minor on test-multithread, align the actual and expected results + + test/api/test-multithread.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 678beff64ca3b2963de25d8a76a2bf3710c3d7a6 +Author: Ebrahim Byagowi +Date: Sat Sep 29 10:16:14 2018 +0330 + + [circleci] Add -Wno-reserved-id-macro to clang-everything + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c763b9440189b541316054ba4f623e728b5aae77 +Author: Behdad Esfahbod +Date: Fri Sep 28 20:53:07 2018 -0400 + + [test-multithread] Disable FreeType funcs + + test/api/test-multithread.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 9b0b40b3c1ac8155c80ed5dc976228f4d3ec7e1f +Author: Behdad Esfahbod +Date: Fri Sep 28 11:16:18 2018 -0400 + + Fix fallback kerning to check for current glyph's mask + + src/hb-ot-shape-fallback.cc | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 909a07b587884e9cd1d92ba9f3d5b96d8774c67a +Author: Ebrahim Byagowi +Date: Sat Sep 29 03:10:13 2018 +0330 + + [circleci] Improve clang-everything bot log, more to come + + #1196 + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9be8062b4d241f02bb96df436e98f10f08bda4f8 +Author: Ebrahim Byagowi +Date: Sat Sep 29 02:11:05 2018 +0330 + + [ci] Another try on mingw bot + + appveyor.yml | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit d4d261a97723b27fb9ad9a69b8dc7fd8c560a98b +Author: Ebrahim Byagowi +Date: Sat Sep 29 01:57:50 2018 +0330 + + [ci] Another try on fixing mingw bots + + Per + https://github.com/Alexpux/MSYS2-packages/issues/163#issuecomment-73555971 + + appveyor.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7b68edf2abc7680199360d52ed283cfc4f49b7d5 +Author: Ebrahim Byagowi +Date: Fri Sep 28 20:53:48 2018 +0330 + + [tests] Don't try to get glyph names on failures + + As it may cause a race unrelated to the issue actually happened + + test/api/test-multithread.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d289d6381864649504abfb1196ac20a1d4664a4e +Author: Ebrahim Byagowi +Date: Fri Sep 28 20:47:21 2018 +0330 + + [ci] Trying to fix mingw bot + + As https://github.com/Alexpux/MSYS2-packages/issues/702 + + appveyor.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 33231a855f0e3d2a14e5e2fcb921c6fc773ae6cf +Author: Behdad Esfahbod +Date: Fri Sep 28 11:06:49 2018 -0400 + + Fix pthread fail for real + + Using a hack... + + test/api/Makefile.am | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 8cb8209c911a69442f23f744981e3ed01e44a3fc +Author: Behdad Esfahbod +Date: Fri Sep 28 10:55:28 2018 -0400 + + Fix bot fails + + test/api/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f4072e8cb81072cd6d51a2607efedb76c02e7db1 +Author: Behdad Esfahbod +Date: Fri Sep 28 10:14:23 2018 -0400 + + [morx] Remove mark_set from Insertion + + text-rendering-tests test MORX-32 shows that for Insertion, an unset + mark is treated + as mark set at 0. This is unlike the Reordering lookup where un + unset mark performs + nothing. + + Fixes MORX-32. + + src/hb-aat-layout-morx-table.hh | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +commit 0d18ec5467818fa8f763ec2871146a64d39987e7 +Author: Behdad Esfahbod +Date: Fri Sep 28 10:00:07 2018 -0400 + + [morx] unsafe-to-break in Insertion + + Makes MORX-29, MORX-30, MORX-31 pass. + + src/hb-aat-layout-morx-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 02bebe42c1ffbd8e11b232c943317c8cd8141afb +Author: Behdad Esfahbod +Date: Fri Sep 28 09:51:35 2018 -0400 + + [test/text-rendering-tests] Update from upstream + + test/shaping/data/text-rendering-tests/DISABLED | 4 ++++ + test/shaping/data/text-rendering-tests/Makefile.sources | 4 ++++ + .../text-rendering-tests/fonts/TestMORXThirtyone.ttf | Bin 0 -> + 2964 bytes + .../text-rendering-tests/fonts/TestMORXThirtytwo.ttf | Bin 0 -> + 2948 bytes + .../text-rendering-tests/fonts/TestMORXTwentynine.ttf | Bin 0 -> + 3012 bytes + .../data/text-rendering-tests/tests/MORX-29.tests | 4 ++++ + .../data/text-rendering-tests/tests/MORX-30.tests | 4 ++++ + .../data/text-rendering-tests/tests/MORX-31.tests | 8 ++++++++ + .../data/text-rendering-tests/tests/MORX-32.tests | 4 ++++ + 9 files changed, 28 insertions(+) + +commit 4cd342baea323bf9709340bbabfc092c976c239c +Author: Behdad Esfahbod +Date: Fri Sep 28 09:47:45 2018 -0400 + + Fix ubsan bot + + test/api/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit b435df3a5b6f7fddc091c4362a36840305144a57 +Author: Behdad Esfahbod +Date: Fri Sep 28 09:13:14 2018 -0400 + + More atomic tuneup + + src/hb-atomic.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 7e6e094abd27fd022fe9aea1872ef82f6a0cdcec +Author: Behdad Esfahbod +Date: Fri Sep 28 08:45:57 2018 -0400 + + [test-multithread] Install ot funcs before filling ref buffer + + test/api/test-multithread.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 21fbee831e0eab2c2f4513825c939158f4578156 +Author: Behdad Esfahbod +Date: Fri Sep 28 08:43:37 2018 -0400 + + [test-multithread] Take num-threads and num-iters from command-line + + test/api/test-multithread.c | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 598be3bb38fd11a288f8155b8c27ffef4ebdd8b9 +Author: Behdad Esfahbod +Date: Fri Sep 28 08:33:26 2018 -0400 + + Minor + + test/api/test-multithread.c | 1 + + 1 file changed, 1 insertion(+) + +commit c09bf3d50589c8eb95b322ef3e4eb8a288dacebe +Author: Ebrahim Byagowi +Date: Fri Sep 28 16:13:01 2018 +0330 + + test-multithread, check the results on every iteration (#1194) + + test/api/test-multithread.c | 59 + ++++++++++++++++++++++++--------------------- + 1 file changed, 32 insertions(+), 27 deletions(-) + +commit dbc3070a15290310bb5aade11d04eb24fe958094 +Author: Ebrahim Byagowi +Date: Fri Sep 28 16:01:15 2018 +0330 + + Make test-multithread pass the tsan bot test (#1193) + + test/api/test-multithread.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit d2542cd28c70b2ba7ab28c0fe5459a1b4a873478 +Author: Behdad Esfahbod +Date: Thu Sep 27 17:23:24 2018 -0400 + + More atomic fixup + + src/hb-atomic.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3ee96984f4633852736b33640c89d1706bc77e0b +Author: Behdad Esfahbod +Date: Thu Sep 27 17:20:26 2018 -0400 + + Fixup atomics from recent change + + src/hb-atomic.hh | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 305468708dc9ce9dadad36c117c380f13bcc6a26 +Author: Behdad Esfahbod +Date: Thu Sep 27 16:54:23 2018 -0400 + + [cache] Use atomic writes in clear() + + To help TSan. + + src/hb-cache.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 9e9a36ee651502b69717895385387951a2d0802a +Author: Volker Krause +Date: Thu Sep 27 16:33:49 2018 +0200 + + Fix infinite loop when walking up the directory hierarchy (#1183) + + A single find_package(harfbuzz) line in user code resulted in + this loop + getting stuck when _harfbuzz_libdir_iter became "/". + + src/harfbuzz-config.cmake.in | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 0c1d852bc41a4f69f890be4817c84bd7de56e07a +Author: Ebrahim Byagowi +Date: Thu Sep 27 11:53:17 2018 +0330 + + Use clang for compiling freetype for tsan bot + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ab16b24cc94389ac66a9353327d2a87a7c230ed4 +Author: Michiharu Ariza +Date: Wed Sep 26 18:51:36 2018 -0700 + + tweaked get_fd fix + + src/hb-ot-cff-common.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit dac70f252a84e1a255375eaacffc2cb3f3fc6e58 +Author: Michiharu Ariza +Date: Wed Sep 26 16:30:26 2018 -0700 + + Added CFF1 J font subset to api test + + Also fixed FDSelect3_4::get_fd + Fixed test_subset_cff1_strip_hints (wrong font names!) + + src/hb-ot-cff-common.hh | 2 +- + .../fonts/SourceHanSans-Regular.41,3041,4E9D.otf | Bin 0 -> 5864 bytes + test/api/fonts/SourceHanSans-Regular.41,4E9D.otf | Bin 0 -> 5500 bytes + test/api/test-subset-cff1.c | 25 + +++++++++++++++++++-- + 4 files changed, 24 insertions(+), 3 deletions(-) + +commit 662f7d7e8bfa77b21ffa05e853f61dda993dcc8a +Author: Behdad Esfahbod +Date: Wed Sep 26 18:42:37 2018 -0400 + + [arabic] Do the joiner-flipping only for rlig feature + + See comment. + + src/hb-ot-shape-complex-arabic.cc | 24 +++++++++++++++++++----- + 1 file changed, 19 insertions(+), 5 deletions(-) + +commit 7f30629cddcf0196d7b754df0cb2d4a8e5fed4b6 +Author: Behdad Esfahbod +Date: Wed Sep 26 16:40:23 2018 -0400 + + [ft] Make TSan happy + + src/hb-ft.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit ec743fce2a72a1cb76ac9401747a442a03a051d9 +Author: Behdad Esfahbod +Date: Wed Sep 26 16:37:18 2018 -0400 + + Add more atomic intrinsics + + src/hb-atomic.hh | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +commit d183b33c1dd42055a9432f4a756ea20856913201 +Author: Behdad Esfahbod +Date: Wed Sep 26 16:29:35 2018 -0400 + + Rename test + + test/api/Makefile.am | 2 +- + test/api/{test-subset-codepoints.c => test-collect-unicodes.c} | 0 + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit c9c75fe3d9eb36f166d594ceb5889a1dc0b14fe6 +Author: Ebrahim Byagowi +Date: Thu Sep 27 00:08:06 2018 +0330 + + [ci] Compile freetype on tsan and put sanitizer flags on correct + places (#1188) + + .circleci/config.yml | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +commit 39da1914b4fd1c58d61cb29c78a0904ff6b905c6 +Author: Ebrahim Byagowi +Date: Wed Sep 26 23:32:45 2018 +0330 + + Test freetype funcs on test-multithread (#1187) + + test/api/Makefile.am | 6 ++++-- + test/api/test-multithread.c | 25 +++++++++++++++++-------- + 2 files changed, 21 insertions(+), 10 deletions(-) + +commit e88009a93f5d13ed31b6262f928761e9574dcef1 +Author: Ebrahim Byagowi +Date: Wed Sep 26 22:53:02 2018 +0330 + + Minor, remove the no longer needed comment on test-multithread + + test/api/test-multithread.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 90a0f9fa0c020c268ac3ba31c7f1337eed85f35e +Author: Behdad Esfahbod +Date: Wed Sep 26 15:03:07 2018 -0400 + + Make TSan happy with make_immutable() + + src/hb-blob.cc | 2 ++ + src/hb-face.cc | 2 ++ + src/hb-font.cc | 4 ++++ + src/hb-unicode.cc | 2 ++ + 4 files changed, 10 insertions(+) + +commit 34d5a2595331c568ae524057d031c9d5d2573978 +Author: Behdad Esfahbod +Date: Wed Sep 26 15:02:21 2018 -0400 + + Fix test-multithread and increase num_threads to 30 + + What were you thinking? ;) + + test/api/test-multithread.c | 56 + +++++++++++++++++++++------------------------ + 1 file changed, 26 insertions(+), 30 deletions(-) + +commit 8bb73dad7f3279e1f1362cf9a137504e8ef08985 +Author: Ebrahim Byagowi +Date: Wed Sep 26 20:50:51 2018 +0330 + + Add a multithreaded test (#1184) + + test/api/Makefile.am | 6 ++ + test/api/test-multithread.c | 146 + ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 152 insertions(+) + +commit 04caf11608d2db13eb6ed2ecc3d406e284b4c13c +Author: Behdad Esfahbod +Date: Wed Sep 26 12:13:47 2018 -0400 + + [hb-view] Change subpixel bits from 8 to 6 + + To match FreeType units, such that FreeType gets correct size from us. + This matters more now that we allow setting --ft-load-flags. + + util/hb-view.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 824111d4842b9a7bbbdcd147325f8f372ed3d37c +Author: Behdad Esfahbod +Date: Tue Sep 25 12:47:37 2018 -0400 + + Fix iOS build + + Fixes https://github.com/harfbuzz/harfbuzz/pull/1179 + + src/hb-coretext.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4b4be7701f635f8378e7f868cfbe8d4571fc841f +Author: Ebrahim Byagowi +Date: Tue Sep 25 09:24:35 2018 +0330 + + [circle] Add an obsessive clang bot (#1178) + + .circleci/config.yml | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +commit ae7f0e83d4417fac2455c44eaea15b3cca03d18e +Author: Michiharu Ariza +Date: Mon Sep 24 22:49:44 2018 -0700 + + fixed memory leaks + + in CFF1 & CFF2 accelerators, VORG subsetter + + src/hb-ot-cff1-table.hh | 2 ++ + src/hb-ot-cff2-table.hh | 2 ++ + src/hb-ot-vorg-table.hh | 3 +++ + 3 files changed, 7 insertions(+) + +commit 258b456566abd266657725b3fc4e70f18b370d5d +Author: Michiharu Ariza +Date: Mon Sep 24 16:50:47 2018 -0700 + + Added CFF1 & CFF2 api tests + + test/api/Makefile.am | 4 + + test/api/fonts/AdobeVFPrototype.abc.otf | Bin 0 -> 7800 bytes + test/api/fonts/AdobeVFPrototype.ac.nohints.otf | Bin 0 -> 7152 bytes + test/api/fonts/AdobeVFPrototype.ac.otf | Bin 0 -> 7336 bytes + test/api/fonts/SourceSansPro-Regular.abc.otf | Bin 0 -> 3412 bytes + .../api/fonts/SourceSansPro-Regular.ac.nohints.otf | Bin 0 -> 3228 bytes + test/api/fonts/SourceSansPro-Regular.ac.otf | Bin 0 -> 3332 bytes + test/api/test-subset-cff1.c | 104 + +++++++++++++++++++++ + test/api/test-subset-cff2.c | 104 + +++++++++++++++++++++ + 9 files changed, 212 insertions(+) + +commit 8282e881b51363811078bce53fad6aa5b41f7b41 +Author: Behdad Esfahbod +Date: Mon Sep 24 19:43:01 2018 -0400 + + Disable msan bot again + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1175 + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6c0e7eb6a6f3f888442c0a97ce6a771631990ed6 +Author: Behdad Esfahbod +Date: Mon Sep 24 19:07:23 2018 -0400 + + Minor + + src/hb-ot-map.hh | 1 + + src/hb-ot-shape-complex-indic.cc | 34 +++++++++++++++++----------------- + src/hb-ot-shape-complex-khmer.cc | 18 +++++++++--------- + 3 files changed, 27 insertions(+), 26 deletions(-) + +commit d748dc76644f28d4130f9cb1dee7a22cbe81c25d +Author: Behdad Esfahbod +Date: Mon Sep 24 18:30:50 2018 -0400 + + More iter inits + + src/hb-ot-layout-gsubgpos.hh | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +commit d9867497d09af929554eaa89cc6fee865b018646 +Author: Behdad Esfahbod +Date: Mon Sep 24 18:11:59 2018 -0400 + + Minor + + src/hb-ot-shape.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 70136a78cb9eda244767f8e8a3d30d0f3c569d01 +Author: Behdad Esfahbod +Date: Mon Sep 24 18:03:34 2018 -0400 + + Remove F_COMBINE + + Now I wonder if any bots will be unhappy we calling | in static + const initializations... + Or would that cost runtime init? Our tests don't detect any.. + + src/hb-ot-map.hh | 2 -- + src/hb-ot-shape-complex-arabic.cc | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +commit f048ead84a4d3fe0bb712ed228c2f39c01ce9705 +Author: Behdad Esfahbod +Date: Mon Sep 24 18:01:53 2018 -0400 + + Some more + + src/hb-ot-map.cc | 5 +++-- + src/hb-ot-map.hh | 13 +++++++------ + src/hb-ot-shape-complex-arabic.cc | 18 +++++++++--------- + src/hb-ot-shape-complex-hangul.cc | 2 +- + src/hb-ot-shape-complex-indic.cc | 8 ++++---- + src/hb-ot-shape-complex-khmer.cc | 8 ++++---- + src/hb-ot-shape-complex-myanmar.cc | 10 +++++----- + src/hb-ot-shape-complex-tibetan.cc | 2 +- + src/hb-ot-shape-complex-use.cc | 20 ++++++++++---------- + src/hb-ot-shape.cc | 30 +++++++++++++++--------------- + 10 files changed, 59 insertions(+), 57 deletions(-) + +commit 1676f608c8e4f880789252ca448bb008f6dd51b4 +Author: Behdad Esfahbod +Date: Mon Sep 24 17:55:03 2018 -0400 + + Minor refactoring + + src/hb-ot-map.hh | 15 ++++++++++- + src/hb-ot-shape-complex-hangul.cc | 2 +- + src/hb-ot-shape-complex-indic.cc | 52 + +++++++++++++++----------------------- + src/hb-ot-shape-complex-khmer.cc | 38 ++++++++++------------------ + src/hb-ot-shape-complex-myanmar.cc | 2 +- + 5 files changed, 51 insertions(+), 58 deletions(-) + +commit 10203339600e85d6aaffba6034ac250e72fdfc12 +Author: Ebrahim Byagowi +Date: Tue Sep 25 01:00:32 2018 +0330 + + [circleci] Update sanitizer bots with newer clang and Ubuntu version + (#1176) + + .circleci/config.yml | 48 + ++++++++++++++++++++++++++++++++---------------- + 1 file changed, 32 insertions(+), 16 deletions(-) + +commit 12b8baa7653741ba13a89cd40f1f36b8bac11666 +Author: Behdad Esfahbod +Date: Mon Sep 24 17:22:39 2018 -0400 + + [msan] Enable again to get a build log, and try to play with + suppressions + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aec0d3cbc923a8801c5bd9e9ae05801a31a7260c +Author: Behdad Esfahbod +Date: Mon Sep 24 13:12:15 2018 -0400 + + [ubsan] Re-enable now that it passes locally + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4839807340cc73d5ba826dff4b4ba358775a213d +Author: Behdad Esfahbod +Date: Mon Sep 24 13:11:34 2018 -0400 + + [check-static-inits.sh] Allow some if ubsan is in effect + + src/check-static-inits.sh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0604bf2b3846b200c56447ffe542bf69c0529a06 +Merge: 76e54d2b 45f5aa97 +Author: Michiharu Ariza +Date: Mon Sep 24 10:09:25 2018 -0700 + + Merge branch 'master' into cff-subset + +commit e45ba31dc723988150ef766758fa89fecd50ca03 +Author: Behdad Esfahbod +Date: Mon Sep 24 13:04:48 2018 -0400 + + [check-symbols.sh] Allow weak objects "V" + + ubsan generates these. + + src/check-symbols.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d07f3111b4bc38798e16a2459b80a16d7a9f9ff1 +Author: Behdad Esfahbod +Date: Mon Sep 24 13:01:35 2018 -0400 + + Link API test programs with C++ linker + + Needed to make ubsan work. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1174 + + test/api/Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit a96508cfc9bd9013d24b18547fcd9c03e08fe2f2 +Author: Behdad Esfahbod +Date: Mon Sep 24 12:52:42 2018 -0400 + + [msan] Add MSAN_OPTIONS=exitcode=42 + + Default exit value is 77, which causes autotools to "skip" test. + + .circleci/config.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 45f5aa97905996e3486c6dbba8493b11cfa0cf15 +Author: Behdad Esfahbod +Date: Mon Sep 24 12:43:29 2018 -0400 + + [circleci] Disable msan and ubsan builds + + https://github.com/harfbuzz/harfbuzz/issues/1174 + https://github.com/harfbuzz/harfbuzz/issues/1175 + + .circleci/config.yml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2d93148a0f915bb52433ecc9d66845191a2f9135 +Author: Behdad Esfahbod +Date: Mon Sep 24 11:52:22 2018 -0400 + + Ignore weak symbols in check-symbols.sh + + Some clang versions leave a std::round(float) weak symbol around... + + src/check-symbols.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 55bae6825ed2058255a512a73293e3cdff0e78a4 +Author: Behdad Esfahbod +Date: Mon Sep 24 10:43:06 2018 -0400 + + [docs] A few improvements + + If we wrote just this much every day... + + src/hb-buffer.cc | 4 ++++ + src/hb-buffer.h | 20 +++++++++++++++----- + src/hb-face.cc | 11 +++++++---- + src/hb-font.cc | 12 +++++++----- + 4 files changed, 33 insertions(+), 14 deletions(-) + +commit 57fa2c23de8b6b66894d6872d192ac90ec8bf05a +Author: Behdad Esfahbod +Date: Mon Sep 24 09:57:52 2018 -0400 + + Readjust Hebrew composition again + + src/hb-ot-shape-complex-hebrew.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7f335390f3a498119319a0e6c3ce7656a3902066 +Author: Behdad Esfahbod +Date: Mon Sep 24 09:56:18 2018 -0400 + + Revert change that would decompose text if GPOS mark feature is + available + + https://github.com/harfbuzz/harfbuzz/issues/653#issuecomment-423905920 + + src/hb-ot-shape-normalize.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit a6f4b2f7cd088aeb44e1aac672434641f4f9e484 +Author: Behdad Esfahbod +Date: Mon Sep 24 09:54:37 2018 -0400 + + Fix normalization + + https://github.com/harfbuzz/harfbuzz/commit/62d1e0852a5549a1b510ad46a4b89f12730bb708#commitcomment-30613091 + + src/hb-ot-shape-normalize.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 3583fb03b14a10ec5ab5f9c480e150934101fd0b +Author: Behdad Esfahbod +Date: Sun Sep 23 22:33:38 2018 -0400 + + Simplify ZWJ-skipping a bit + + Towards disabling ZWJ-skipping in certain GPOS contexts. + + Part of https://github.com/flutter/flutter/issues/16886 + + src/hb-ot-layout-gsubgpos.hh | 6 +++--- + src/hb-ot-shape-complex-indic.cc | 21 ++++++++++++++++----- + src/hb-ot-shape-complex-khmer.cc | 21 ++++++++++++++------- + src/hb-ot-shape-complex-myanmar.cc | 15 ++++++++++++++- + src/hb-ot-shape-complex-use.cc | 15 +++++++++++++-- + 5 files changed, 60 insertions(+), 18 deletions(-) + +commit 9516cbd3df7ccdb40b27a7ba99a1e0da8a6b170c +Author: Behdad Esfahbod +Date: Sun Sep 23 22:00:34 2018 -0400 + + Reinit skippy iters when auto_zwj / auto_zwnj change + + Ouch. How did we not hit this bug before... + + src/hb-ot-layout-gsubgpos.hh | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit 62d1e0852a5549a1b510ad46a4b89f12730bb708 +Author: Behdad Esfahbod +Date: Sun Sep 23 21:32:18 2018 -0400 + + Prefer decomposed form if font has GPOS mark feature + + Fixes https://github.com/harfbuzz/harfbuzz/issues/653 + + src/hb-ot-shape-complex-hebrew.cc | 2 +- + src/hb-ot-shape-normalize.cc | 126 + ++++++++++++++++++++------------------ + src/hb-ot-shape-normalize.hh | 7 ++- + 3 files changed, 72 insertions(+), 63 deletions(-) + +commit d7f21777e6a797758ab234555f5f7e07c87278f9 +Author: Behdad Esfahbod +Date: Sun Sep 23 19:12:52 2018 -0400 + + [ot-font] Fix leak + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1171 + + I'm glad we have leak-detector bots now. + + src/hb-ot-post-table.hh | 1 + + 1 file changed, 1 insertion(+) + +commit ae39a53f55e6b812defb4c7b48562651c9eb13a3 +Author: Ebrahim Byagowi +Date: Sat Sep 22 14:22:17 2018 +0330 + + Add bots with address- and thread-sanitizer + + .circleci/config.yml | 52 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 52 insertions(+) + +commit 24dd6c1a9d8d571c30dce4d39c1975b1d1cedc2a +Author: Matt Oliver +Date: Sun Sep 23 18:08:30 2018 +1000 + + src/hb-blob.cc: Fix mmap functionality with UWP. + + src/hb-blob.cc | 27 +++++++++++++++++++++++++++ + src/hb.hh | 4 +++- + 2 files changed, 30 insertions(+), 1 deletion(-) + +commit b7f1bbc2f8b14a402fa9e42e88919dc0173373ce +Author: Khaled Hosny +Date: Sat Sep 22 16:41:56 2018 +0200 + + [test] Fix printing subprocess error messages + + Decode the string as Python 3 returns bytes string, and also don’t + assume that it ends with a new line. + + test/shaping/run-tests.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 403019482b0d7f17fbdb5def2be5f43e28bafcf3 +Author: Ebrahim Byagowi +Date: Sat Sep 22 17:24:03 2018 +0330 + + Fix test-subset-* leak issues + + See also https://github.com/harfbuzz/harfbuzz/pull/1169 + + test/api/hb-subset-test.h | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit f6ebe1f4dc95a7c4b3a0af23086873a11867c1d9 +Author: Ebrahim Byagowi +Date: Sat Sep 22 17:05:52 2018 +0330 + + Fix test-ot-math leak issue + + See also https://github.com/harfbuzz/harfbuzz/pull/1169 + + test/api/test-ot-math.c | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 669ac81ac52e9d559324db851a9ee46ef651e7b0 +Author: Ebrahim Byagowi +Date: Sat Sep 22 16:49:23 2018 +0330 + + Fix test-set leak issue + + See also https://github.com/harfbuzz/harfbuzz/pull/1169 + + test/api/test-set.c | 1 + + 1 file changed, 1 insertion(+) + +commit ef9307fd2227bf0f750d8f7fafae466affc81454 +Author: Ebrahim Byagowi +Date: Sat Sep 22 16:45:31 2018 +0330 + + Fix test-font leak issue + + See also https://github.com/harfbuzz/harfbuzz/pull/1169 + + test/api/test-font.c | 1 + + 1 file changed, 1 insertion(+) + +commit 76e54d2bd804414183858ca198157050419dfe6c +Author: Michiharu Ariza +Date: Fri Sep 21 12:16:36 2018 -0700 + + fixed subroutinized CFF2 flattening + + and some code cleanup + + src/hb-cff-interp-common.hh | 2 +- + src/hb-cff-interp-cs-common.hh | 13 ------------- + src/hb-cff2-interp-cs.hh | 7 ++++--- + 3 files changed, 5 insertions(+), 17 deletions(-) + +commit 321e592333014f713557e8ce8041dcb5de710218 +Author: Michiharu Ariza +Date: Thu Sep 20 10:31:06 2018 -0700 + + Added desubroutinize option to generate-expected-outputs.py + + Currently hb-subset always desubroutinizes CFF fonts. + Note that even with this option fonttools won't generate the expected + subset CFF fonts. They were manually created & tweaked to match + hb-subset output. + + test/subset/generate-expected-outputs.py | 1 + + 1 file changed, 1 insertion(+) + +commit f212c050ad50898d5105d1d3a6ea3498f94ee462 +Author: Michiharu Ariza +Date: Thu Sep 20 09:45:43 2018 -0700 + + Added VORG struct and its subsetter + + new file: hb-ot-vorg-table.hh + + src/Makefile.sources | 1 + + src/hb-ot-vorg-table.hh | 163 + ++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset.cc | 5 +- + 3 files changed, 168 insertions(+), 1 deletion(-) + +commit 5fd8bce945e7efaa48d0c29eb8b2700027bd3c0b +Author: Behdad Esfahbod +Date: Wed Sep 19 22:34:09 2018 -0400 + + [morx] Fix mark_set check + + src/hb-aat-layout-morx-table.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 1377adc8a88c627891cb8b9cea511d8f9f5324f9 +Author: Michiharu Ariza +Date: Wed Sep 19 17:00:10 2018 -0700 + + Added SourceHanSans-Regular for CFF subset test + + Disabled FDSelect serialization to format 0 for compatibility with + fonttools + + src/hb-subset-cff-common.cc | 16 + +++++++++++++--- + .../japanese/SourceHanSans-Regular.default..otf | Bin 0 -> + 2340 bytes + ...Regular.default.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> + 6248 bytes + ...Regular.default.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> + 6432 bytes + .../SourceHanSans-Regular.default.61,63,65,6B.otf | Bin 0 -> + 5428 bytes + ...Regular.default.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> + 6552 bytes + .../japanese/SourceHanSans-Regular.default.660E.otf | Bin 0 -> + 5196 bytes + .../japanese/SourceHanSans-Regular.drop-hints..otf | Bin 0 -> + 2188 bytes + ...ular.drop-hints.3042,3044,3046,3048,304A,304B.otf | Bin 0 -> + 6076 bytes + ...ular.drop-hints.3042,3044,3046,73E0,5EA6,8F38.otf | Bin 0 -> + 6180 bytes + .../SourceHanSans-Regular.drop-hints.61,63,65,6B.otf | Bin 0 -> + 5312 bytes + ...ular.drop-hints.660E,6975,73E0,5EA6,8F38,6E05.otf | Bin 0 -> + 6248 bytes + .../SourceHanSans-Regular.drop-hints.660E.otf | Bin 0 -> + 5088 bytes + test/subset/data/fonts/SourceHanSans-Regular.otf | Bin 0 -> + 16427580 bytes + test/subset/data/tests/japanese.tests | 1 + + 15 files changed, 14 insertions(+), 3 deletions(-) + +commit 0739b28169eb63332b31420deb5bf58b5446f154 +Author: Behdad Esfahbod +Date: Wed Sep 19 17:32:21 2018 -0400 + + [aat] Minor + + src/hb-aat-layout-common.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7671cb9b04770d50b1b2a05a24f6fadc35993cd1 +Author: Behdad Esfahbod +Date: Wed Sep 19 17:10:26 2018 -0400 + + [coretext] Minor + + src/hb-coretext.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit dc8ed45292ce4e522c3bda03fd83873da7b6591e +Author: Behdad Esfahbod +Date: Wed Sep 19 16:46:41 2018 -0400 + + [morx] Implement forward/backward processing + + We reverse too many times. Can be optimized. But I doubt many fonts + use reverse lookups, so doesn't matter. + + Other than not applying user features, this completes morx table + implementation. + + src/hb-aat-layout-morx-table.hh | 40 + ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 40 insertions(+) + +commit 3bccd62196b5dff70d446c3fe053b1b47bb9c19e +Author: Behdad Esfahbod +Date: Wed Sep 19 16:24:34 2018 -0400 + + [morx] Implement horiz-only/vert-only subtables + + src/hb-aat-layout-morx-table.hh | 24 +++++++++++++++++++++++- + 1 file changed, 23 insertions(+), 1 deletion(-) + +commit 041a08de3d0ca74d3e2fdccfa5311ff26a8b97e4 +Author: Behdad Esfahbod +Date: Wed Sep 19 16:02:56 2018 -0400 + + [morx] Improve buffer position in Insertion w DontAdvance and wo + + Just speculation. Needs tests to determine which is correct behavior. + + src/hb-aat-layout-morx-table.hh | 23 ++++++++++++++++++----- + 1 file changed, 18 insertions(+), 5 deletions(-) + +commit ebeccf3e63bff96b7a7766dea566704a9cbeae44 +Author: Michiharu Ariza +Date: Tue Sep 18 17:24:30 2018 -0700 + + fixed char widths & standard Encoding in subset CFF + + also merged flush_n_args to flush_args into one + takes start index of the arguments on stack instead of count + + src/hb-cff-interp-cs-common.hh | 20 +++++--------------- + src/hb-cff1-interp-cs.hh | 11 +++++++---- + src/hb-cff2-interp-cs.hh | 2 +- + src/hb-subset-cff1.cc | 22 ++++++++++++++++------ + src/hb-subset-cff2.cc | 12 ++++++------ + 5 files changed, 35 insertions(+), 32 deletions(-) + +commit bf4eb2e4cf8d08b674f81954e22b331cca2b3721 +Author: Michiharu Ariza +Date: Tue Sep 18 15:53:37 2018 -0700 + + Added SourceSansPro-Regular along as CFF full-font test case + + derived "expected" subset fonts from fonttools then manually tweaked + further so they resemble hb-subset output + + ...ourceSansPro-Regular.default.1FC,21,41,20,62,63.otf | Bin 0 -> + 3640 bytes + .../SourceSansPro-Regular.default.61,62,63.otf | Bin 0 -> + 3400 bytes + .../SourceSansPro-Regular.default.D7,D8,D9,DA,DE.otf | Bin 0 -> + 3596 bytes + ...ceSansPro-Regular.drop-hints.1FC,21,41,20,62,63.otf | Bin 0 -> + 3480 bytes + .../SourceSansPro-Regular.drop-hints.61,62,63.otf | Bin 0 -> + 3276 bytes + ...SourceSansPro-Regular.drop-hints.D7,D8,D9,DA,DE.otf | Bin 0 -> + 3448 bytes + test/subset/data/fonts/SourceSansPro-Regular.otf | Bin 0 -> + 220852 bytes + test/subset/data/tests/full-font.tests | 1 + + test/subset/run-tests.py | 4 ++-- + test/subset/subset_test_suite.py | 5 +++++ + 10 files changed, 8 insertions(+), 2 deletions(-) + +commit e75e7224c9c02ab99e132a51fe8801e29827cac5 +Author: Michiharu Ariza +Date: Mon Sep 17 15:34:39 2018 -0700 + + include curve control points in extents + + this makes results consistent with FT + also optimized handling of path end points + + src/hb-cff-interp-cs-common.hh | 6 +++--- + src/hb-ot-cff1-table.cc | 27 +++++++++++++++++++++++++-- + 2 files changed, 28 insertions(+), 5 deletions(-) + +commit 98b94f8ba53276887ab583eeeb4cb097c7b84b2c +Author: Michiharu Ariza +Date: Mon Sep 17 13:56:39 2018 -0700 + + fix static_assert failure in OffsetTo + + src/hb-ot-cff2-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d050ab8d3e73debfb414fc8c9426180459150b61 +Merge: f0a4e0c2 388ab916 +Author: Michiharu Ariza +Date: Mon Sep 17 13:07:29 2018 -0700 + + Merge branch 'master' into cff-subset + +commit f0a4e0c2ca5ee0225765590384216d5d5367de7e +Author: Michiharu Ariza +Date: Mon Sep 17 12:11:56 2018 -0700 + + fix build attempt ^3 + + src/hb-ot-cff1-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f0d74971aee5ce309bdfa2a4397667f14ee15f42 +Author: Michiharu Ariza +Date: Mon Sep 17 12:02:12 2018 -0700 + + fix attempt ^2: unuse INT32_MAX/MIN + + src/hb-ot-cff1-table.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 4d963a2711e6035e97e246241d8420273363f857 +Author: Michiharu Ariza +Date: Mon Sep 17 11:28:33 2018 -0700 + + fix build attempt + + src/hb-ot-cff1-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 388ab91642734e1ba0d7a4a4f29a17b15f1b249d +Author: Behdad Esfahbod +Date: Mon Sep 17 19:29:34 2018 +0200 + + [morx] Implement InsertionChain + + src/hb-aat-layout-morx-table.hh | 87 + ++++++++++++++++------------------------- + 1 file changed, 33 insertions(+), 54 deletions(-) + +commit c0c85b852d37dad75eeef473e6dd3ec91a3b559b +Author: Michiharu Ariza +Date: Mon Sep 17 11:14:56 2018 -0700 + + implemented get_glyph_extents with CFF1 + + Implemented path operators in a new struct PathProc hooked up + to CSOpSet + Added current point to CSInterpEnv + + src/hb-cff-interp-common.hh | 86 ++++++++- + src/hb-cff-interp-cs-common.hh | 425 + +++++++++++++++++++++++++++++++++++++++-- + src/hb-cff1-interp-cs.hh | 18 +- + src/hb-cff2-interp-cs.hh | 10 +- + src/hb-null.hh | 2 +- + src/hb-ot-cff1-table.cc | 82 ++++++++ + src/hb-ot-cff1-table.hh | 95 +++++---- + src/hb-ot-face.cc | 1 + + src/hb-ot-face.hh | 1 + + src/hb-ot-font.cc | 2 + + src/hb-subset-cff1.cc | 4 +- + src/hb-subset-cff2.cc | 10 +- + 12 files changed, 657 insertions(+), 79 deletions(-) + +commit d8d1e7df0057c79f54d855b7bfec2d21f59b09e8 +Author: David Corbett +Date: Mon Sep 17 11:09:51 2018 -0400 + + Don't enforce a native direction for Old Hungarian + + src/hb-common.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6a97d0f3d377a35ea691d15ac142ce043f953e71 +Author: Simon Hausmann +Date: Mon Sep 17 10:33:34 2018 +0200 + + Fix installation of cmake config when building with cmake (#1161) + + When building with the auto tools, the manually mantained + harfbuzz-config.cmake is installed. When building with cmake, we + can use + cmake to generate the correct config files for us and install them. + + CMakeLists.txt | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 606bf57430370810f7bb62ba12b9685d8943685d +Author: Behdad Esfahbod +Date: Sun Sep 16 19:33:48 2018 +0200 + + Revert forcing use of single-parameter static_assert() + + Some clang versions define static_assert as a macro apparently, + so we cannot + redefine it... + + This reverts commit 94bfea0ce6a7b4d5641c198d50751748a353df11. + This reverts commit 4e62627831e7457ed60ff87712570065b14b200a. + + src/hb-atomic.hh | 4 ++-- + src/hb-buffer.cc | 2 +- + src/hb-buffer.hh | 4 ++-- + src/hb-cache.hh | 4 ++-- + src/hb-coretext.cc | 2 +- + src/hb-debug.hh | 2 +- + src/hb-dsalgs.hh | 4 ++-- + src/hb-machinery.hh | 4 ++-- + src/hb-null.hh | 8 +++---- + src/hb-open-type.hh | 4 ++-- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout-gdef-table.hh | 6 +++--- + src/hb-ot-layout.cc | 14 ++++++------ + src/hb-ot-map.cc | 2 +- + src/hb-ot-math-table.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 2 +- + src/hb-ot-shape-complex-indic.hh | 2 +- + src/hb-ot-shape-complex-use.cc | 2 +- + src/hb-set-digest.hh | 4 ++-- + src/hb-set.hh | 6 +++--- + src/hb-uniscribe.cc | 2 +- + src/hb.hh | 34 + +++++++++++++----------------- + util/options.cc | 3 ++- + 23 files changed, 58 insertions(+), 61 deletions(-) + +commit cbcaba6ffdf6b147d45baa95d62fd29cec67ed54 +Author: Behdad Esfahbod +Date: Sun Sep 16 19:25:19 2018 +0200 + + One more bot fix + + src/hb-unicode.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94bfea0ce6a7b4d5641c198d50751748a353df11 +Author: Behdad Esfahbod +Date: Sun Sep 16 19:12:19 2018 +0200 + + Fix build, another try + + util/options.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 89dd4b959773d35981299551074ccc7a1eb332bd +Author: Behdad Esfahbod +Date: Sun Sep 16 18:11:46 2018 +0200 + + Fix bots + + "Unused private member" warning turned error. ugh. + + src/hb-aat-layout-morx-table.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 4e62627831e7457ed60ff87712570065b14b200a +Author: Behdad Esfahbod +Date: Sun Sep 16 18:09:36 2018 +0200 + + Enforce single-param static_assert() only + + So we don't accidentally break it again. + + src/hb-atomic.hh | 4 ++-- + src/hb-buffer.cc | 2 +- + src/hb-buffer.hh | 4 ++-- + src/hb-cache.hh | 4 ++-- + src/hb-coretext.cc | 2 +- + src/hb-debug.hh | 2 +- + src/hb-dsalgs.hh | 4 ++-- + src/hb-machinery.hh | 4 ++-- + src/hb-null.hh | 8 +++---- + src/hb-open-type.hh | 4 ++-- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout-gdef-table.hh | 6 +++--- + src/hb-ot-layout.cc | 14 ++++++------ + src/hb-ot-map.cc | 2 +- + src/hb-ot-math-table.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 2 +- + src/hb-ot-shape-complex-indic.hh | 2 +- + src/hb-ot-shape-complex-use.cc | 2 +- + src/hb-set-digest.hh | 4 ++-- + src/hb-set.hh | 6 +++--- + src/hb-uniscribe.cc | 2 +- + src/hb.hh | 34 + +++++++++++++++++------------- + 22 files changed, 60 insertions(+), 56 deletions(-) + +commit f1a86e1e6f3906f33fc89de694a4bbbc3e40d2bc +Author: Behdad Esfahbod +Date: Sun Sep 16 18:01:32 2018 +0200 + + Remove unused try + + src/hb-null.hh | 13 ------------- + 1 file changed, 13 deletions(-) + +commit ebd50b3c83a22a0fdba53271275b8619a23739aa +Author: Behdad Esfahbod +Date: Sun Sep 16 17:57:12 2018 +0200 + + Fix static_assert + + src/hb-open-type.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 10642b3fbfbc1776e784b190c43a9e0693dd423a +Author: Behdad Esfahbod +Date: Sat Sep 15 19:43:33 2018 +0200 + + Disallow null-enabled offsets to unsized structures... + + ...like UnsizedArrayOf<>. + + This fixes a class of crasher bugs, mostly with color and AAT tables. + We + cannot use nullable offsets to varsized data that does not declare + min_size, + because it's nost safe to use our fixed-size null pool for types + that have + their size external. So, use non_null'able offsets for these. + + A further enhancement would be to make use of min_size in Null<> + itself. + Will try that after. + + src/hb-aat-layout-common.hh | 8 ++++---- + src/hb-aat-layout-feat-table.hh | 2 +- + src/hb-aat-layout-morx-table.hh | 10 +++++----- + src/hb-aat-layout-trak-table.hh | 4 ++-- + src/hb-aat-ltag-table.hh | 2 +- + src/hb-open-type.hh | 5 +++++ + src/hb-ot-color-cbdt-table.hh | 4 +--- + src/hb-ot-color-colr-table.hh | 4 ++-- + src/hb-ot-color-cpal-table.hh | 8 ++++---- + src/hb-ot-color-svg-table.hh | 2 +- + src/hb-ot-layout-common.hh | 18 ++++++++++-------- + src/hb-ot-layout-jstf-table.hh | 4 ++-- + 12 files changed, 38 insertions(+), 33 deletions(-) + +commit 9ff76c6025b55d184c96b193f23aa935ab32f1fc +Author: Behdad Esfahbod +Date: Sat Sep 15 18:31:14 2018 +0200 + + [morx] Respect default feature settings + + Does NOT apply user-selected features. But at least now enables + correct subtables. + + src/hb-aat-layout-morx-table.hh | 34 +++++++++++++++++++++++----------- + 1 file changed, 23 insertions(+), 11 deletions(-) + +commit 2f97da6e2d6629e112789d399765d90f96952c0a +Author: Behdad Esfahbod +Date: Sat Sep 15 14:51:50 2018 +0200 + + [aat] Change version field + + src/hb-aat-layout-morx-table.hh | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 29c2bd1795b933a611512af50a14f25e25d43159 +Author: Behdad Esfahbod +Date: Sat Sep 15 14:47:18 2018 +0200 + + [morx] Add stub for InsertionChain + + src/hb-aat-layout-morx-table.hh | 209 + ++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 200 insertions(+), 9 deletions(-) + +commit f8ccb545c47abe8f0f4ed318ff7b5bf176913893 +Author: Behdad Esfahbod +Date: Fri Sep 14 18:59:53 2018 +0200 + + [dfont] Disable null-processsing for offsets + + An offset to unsized arrayis not safe to be redirected to our + fixed-sized + null pool. Plus, we want to reject, not repair, bad-looking dfonts. + + src/hb-open-file.hh | 8 ++++---- + src/hb-open-type.hh | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 01b9148d9ae7d18228538774243e49840cfd2499 +Author: Behdad Esfahbod +Date: Fri Sep 14 14:23:09 2018 +0200 + + [unicode] Move Fitzpatrick hack from ot-layout into unicode.hh + + src/hb-ot-layout.hh | 12 +----------- + src/hb-unicode.hh | 36 +++++++++++++++++++++++++++--------- + 2 files changed, 28 insertions(+), 20 deletions(-) + +commit 6ebbf514ac90712fe089b2b64f68d1cf681edd5d +Author: Behdad Esfahbod +Date: Fri Sep 14 12:15:53 2018 +0200 + + Minor + + src/hb-ot-layout.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 957dbed388fc3214248f6aca65902ad277d070fb +Author: Behdad Esfahbod +Date: Fri Sep 14 12:14:42 2018 +0200 + + Fix builds + + src/hb-aat-layout-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4653e6cf3c1ef5005886d901df30e952d57eed6c +Author: Behdad Esfahbod +Date: Fri Sep 14 11:31:33 2018 +0200 + + [aat] Add enums for pre-defined state and classes + + Not sure how I didn't add before... + + src/hb-aat-layout-common.hh | 19 ++++++++++++++++--- + 1 file changed, 16 insertions(+), 3 deletions(-) + +commit 67449c39331babb88f7d29d737895d786cd5da33 +Author: Behdad Esfahbod +Date: Fri Sep 14 10:58:00 2018 +0200 + + Don't dereference offset before check_struct() + + src/hb-open-file.hh | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit f2c4720ae696096d90493db218ef1283681561e7 +Merge: 1234a813 ca746f26 +Author: Michiharu Ariza +Date: Thu Sep 13 12:44:00 2018 -0700 + + Merge branch 'master' into cff-subset + +commit ca746f261e1e54cec2f9c8bc7a6f930491e19418 +Author: Behdad Esfahbod +Date: Thu Sep 13 20:35:21 2018 +0200 + + [dfont] Also check dataLen range in sanitize + + Just to disagree with myself re being done with this code... + + src/hb-open-file.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 3789c557ca06aef430726f4942cafecac6fe4eef +Author: Behdad Esfahbod +Date: Thu Sep 13 20:30:04 2018 +0200 + + [dfont] Solve the mystery +2 offset thing! + + Previously, ResourceForkHeader was defined as 30 bytes, having the + typeCountM1 as last member. + There was a mysterious offset-by-2 in the code, derived from FontTools + and JDK code this was + ported from. + + In testing, I observed that typeListZ offset is actually 28. + Suggesting that the typeCountM1 + does NOT actually belong to ResourceForkHeader, but belongs to the + array itself. Adjusting for + that resolves the mystery +2 offset hack, so everything is clean + and good now. + + This, concludes my dfont hacking. The code looks great now, and + I'm happy to leave it. + Fuzzers might disagree though, we will see! + + src/hb-open-file.hh | 30 ++++++++++++------------------ + src/hb-open-type.hh | 44 ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 56 insertions(+), 18 deletions(-) + +commit effc7ced72a6ce0fea328a8b68dc3d55f09774f1 +Author: Behdad Esfahbod +Date: Thu Sep 13 20:21:54 2018 +0200 + + Rename HeadlessArrayOf::len to lenP1 + + So it doesn't accidentally match our templates, etc. + + src/hb-open-type.hh | 14 +++++++------- + src/hb-ot-layout-gsub-table.hh | 10 +++++----- + src/hb-ot-layout-gsubgpos.hh | 10 +++++----- + 3 files changed, 17 insertions(+), 17 deletions(-) + +commit 1234a8136891429bb7353f47480595f44615f322 +Author: Michiharu Ariza +Date: Thu Sep 13 10:55:56 2018 -0700 + + add head table to CFF/CFF2 + + src/hb-ot-cff1-table.hh | 4 ++++ + src/hb-ot-cff2-table.hh | 4 ++++ + 2 files changed, 8 insertions(+) + +commit 180a88a96ce327e4103df3635c73559de65d1546 +Author: Behdad Esfahbod +Date: Thu Sep 13 19:19:57 2018 +0200 + + [dfont] Some more + + src/hb-open-file.hh | 21 ++++++++------------- + 1 file changed, 8 insertions(+), 13 deletions(-) + +commit 0ab0f1e5ac5ccb07c57364e9f5be0b991398eb6f +Author: Behdad Esfahbod +Date: Thu Sep 13 19:13:01 2018 +0200 + + [dfont] Push methods further down + + src/hb-open-file.hh | 58 + ++++++++++++++++++++++++++++++----------------------- + 1 file changed, 33 insertions(+), 25 deletions(-) + +commit 8c9bdcc1feeab321a642bdaac50b716e48ce4263 +Author: Behdad Esfahbod +Date: Thu Sep 13 19:08:22 2018 +0200 + + [dfont] Minor + + src/hb-open-file.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 4479d3a2eda57d278700f5c78414ef6ef617d2a9 +Author: Behdad Esfahbod +Date: Thu Sep 13 19:05:59 2018 +0200 + + [dfon]t Sanitize OpenTypeFontFace + + src/hb-dsalgs.hh | 6 ------ + src/hb-open-file.hh | 21 +++++++++------------ + 2 files changed, 9 insertions(+), 18 deletions(-) + +commit 3fba41906fba28c5ea01cc0749654de862453bf4 +Author: Behdad Esfahbod +Date: Thu Sep 13 18:49:16 2018 +0200 + + [dfont] Minor + + src/hb-open-file.hh | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +commit bf852f0e62a8bdbb809af6a975f8ae8eed708d70 +Author: Behdad Esfahbod +Date: Thu Sep 13 18:47:53 2018 +0200 + + [dfont] Make test pass + + Offset 0 is not null in this context. + + src/hb-open-file.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 29faebe911a13916aa3d737e93d38deedc53567f +Author: Behdad Esfahbod +Date: Thu Sep 13 18:45:35 2018 +0200 + + Allow Offset<>'s that have no 0==null + + src/hb-open-type.hh | 43 +++++++++++++++++++++---------------------- + 1 file changed, 21 insertions(+), 22 deletions(-) + +commit 82f4d776c21b7c1224dd7073ce69cdf76d85f16b +Author: Behdad Esfahbod +Date: Thu Sep 13 18:27:20 2018 +0200 + + [dfont] Minor + + src/hb-open-file.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 07e0ca930c29757217c2f9e4e0e6954657b6b82d +Author: Behdad Esfahbod +Date: Thu Sep 13 17:39:09 2018 +0200 + + [bytes] Rename content to arrayZ + + src/hb-dsalgs.hh | 16 ++++++++-------- + src/hb-ot-post-table.hh | 2 +- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit dbb764dceb61365b7360a48d581ba5a4b3526e98 +Author: Behdad Esfahbod +Date: Thu Sep 13 16:49:26 2018 +0200 + + [dfont] Clean up sanitize() + + I don't think I broke anything. Fuzzers will let me know.. + + src/hb-dsalgs.hh | 8 ++++ + src/hb-open-file.hh | 122 + ++++++++++++++++++++++++---------------------------- + 2 files changed, 64 insertions(+), 66 deletions(-) + +commit 361fc2686152ad8c0ebaf19e0522e0fc58ba3953 +Author: Behdad Esfahbod +Date: Thu Sep 13 16:47:33 2018 +0200 + + Fix OffsetTo::sanitize() after reshuffling + + src/hb-open-type.hh | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit 4c6b0fb5f6668a6e562260d16f629ad3c41e8961 +Author: Behdad Esfahbod +Date: Thu Sep 13 16:39:30 2018 +0200 + + OffsetTo::sanitize() Add version with three user_data + + src/hb-open-type.hh | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +commit a73bea69c599787b4cfeac92a3afd00749e00434 +Author: Behdad Esfahbod +Date: Thu Sep 13 16:31:31 2018 +0200 + + OffsetTo::sanitize() more shuffling + + src/hb-open-type.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit b482e5231cd5987082dd2c05fd649c3653f3c67a +Author: Behdad Esfahbod +Date: Thu Sep 13 16:29:49 2018 +0200 + + OffsetTo::sanitize() reshuffling + + src/hb-open-type.hh | 26 +++++++++++++++++++------- + 1 file changed, 19 insertions(+), 7 deletions(-) + +commit 3cae9c75153277b9cfaaba20e0de84e420aeb1eb +Author: Michiharu Ariza +Date: Wed Sep 12 17:23:08 2018 -0700 + + fixed hb_plan_subset_cff_fdselect + + FDSelect3/4 sentinel size wasn't taken into account + + src/hb-subset-cff-common.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 0f159a38a62bbf1b7fb267694a5d91d8135da625 +Author: Michiharu Ariza +Date: Wed Sep 12 16:08:54 2018 -0700 + + fixed serialize_fdselect_3_4 + + src/hb-ot-cff-common.hh | 6 ++++ + src/hb-ot-cff1-table.hh | 6 ---- + src/hb-subset-cff-common.cc | 68 + ++++++++++++++++++++++++++------------------- + src/hb-subset-cff-common.hh | 10 +++---- + src/hb-subset-cff1.cc | 12 ++++---- + src/hb-subset-cff2.cc | 12 ++++---- + 6 files changed, 63 insertions(+), 51 deletions(-) + +commit 1608481d88919ca748e367146e3a78458d5bbe8f +Author: Michiharu Ariza +Date: Wed Sep 12 13:22:19 2018 -0700 + + fixed bugs in Charset serialization + + also some code cleanup + + src/hb-ot-cff1-table.hh | 4 ++-- + src/hb-subset-cff1.cc | 44 ++++++++++++++++++++------------------------ + 2 files changed, 22 insertions(+), 26 deletions(-) + +commit f45ac6296add6435ea5a902f7519187414aa8092 +Author: Michiharu Ariza +Date: Tue Sep 11 22:41:50 2018 -0700 + + fixed name mixup in Remap::reset + + it was causing inconsistent Strings Index subset results + + src/hb-ot-cff-common.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 497e7fb264ec5cb799c038cbe693b70410b18da3 +Author: Michiharu Ariza +Date: Tue Sep 11 16:47:55 2018 -0700 + + misc bug fixes + + Added OpCode_FontMatrix to TopDictOpSet (yet to parse values) + fixed a wrong assert in encode_int + + src/hb-cff-interp-dict-common.hh | 3 +++ + src/hb-subset-cff-common.hh | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +commit 5b453f77f804cd8421a45d8276ed3e04041da23c +Author: Michiharu Ariza +Date: Tue Sep 11 16:20:39 2018 -0700 + + fixed off-by-one error with offSize + + src/hb-ot-cff-common.hh | 5 +++-- + src/hb-subset-cff1.cc | 4 ++-- + src/hb-subset-cff2.cc | 2 +- + 3 files changed, 6 insertions(+), 5 deletions(-) + +commit 1499029a9695e26beaf72e11287be60ad9e40cfe +Author: Michiharu Ariza +Date: Tue Sep 11 13:56:52 2018 -0700 + + fixed a bug + + src/hb-cff-interp-dict-common.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0bd5912a08698fb7880e1354e45bf63ef45125a5 +Author: Michiharu Ariza +Date: Tue Sep 11 13:24:27 2018 -0700 + + make parse_bcd locale free + + src/hb-cff-interp-dict-common.hh | 92 + +++++++++++++++++++++++++++++----------- + 1 file changed, 68 insertions(+), 24 deletions(-) + +commit bb38d0f66388ec37ee9b0e81176d60c66fc17a19 +Author: Michiharu Ariza +Date: Tue Sep 11 10:43:15 2018 -0700 + + Implement parse_bcd + + src/hb-cff-interp-common.hh | 15 -------------- + src/hb-cff-interp-dict-common.hh | 44 + ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 44 insertions(+), 15 deletions(-) + +commit 45e564a51917475ef6481825a6efb5b99bf1912e +Merge: c6f75c30 d5c50927 +Author: Michiharu Ariza +Date: Tue Sep 11 09:46:37 2018 -0700 + + Merge branch 'master' into cff-subset + +commit bd75fd45cdbd0edb24568326bb7fde59d299a82c +Author: Behdad Esfahbod +Date: Tue Sep 11 18:12:26 2018 +0200 + + [dfont] Some renaming, plus add link to reference doc + + src/hb-open-file.hh | 79 + ++++++++++++++++++++++++----------------------------- + 1 file changed, 35 insertions(+), 44 deletions(-) + +commit 4134ec1307bbaff24972e238bc5e4a403cd3f1c1 +Author: Behdad Esfahbod +Date: Tue Sep 11 17:56:03 2018 +0200 + + [dfont] Sanitize only sfnt resources as OpenTypeFontFile + + src/hb-open-file.hh | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit 6b5e4d07adb6b739dc294da513c4a7acd03977f7 +Author: Behdad Esfahbod +Date: Tue Sep 11 17:26:24 2018 +0200 + + [dfont] Minor + + src/hb-open-file.hh | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit d5c509272f2fbd1b4c56e3b530da7e42e7f03901 +Author: Behdad Esfahbod +Date: Tue Sep 11 17:18:21 2018 +0200 + + [dfont] Fix test expecatation and minor touch up + + I have no way to authoritatively know, but looks like test font only + has one + face. So, adjust test expectation instead. + + src/hb-open-file.hh | 18 + ++++++------------ + test/shaping/data/in-house/tests/collections.tests | 2 +- + 2 files changed, 7 insertions(+), 13 deletions(-) + +commit 2b2ed1e536061cfd3a0f29522118f42b451678bd +Author: Ebrahim Byagowi +Date: Mon Jul 2 17:26:43 2018 +0430 + + [dfont] Add test + + test/shaping/data/in-house/Makefile.sources | 1 + + test/shaping/data/in-house/fonts/TestDFONT.dfont | Bin 0 -> 3505 bytes + test/shaping/data/in-house/fonts/TestTTC.ttc | Bin 0 -> 2608 bytes + test/shaping/data/in-house/tests/collections.tests | 6 ++++++ + 4 files changed, 7 insertions(+) + +commit 9479ffefbfa3ea4ee39747e34177d26ab1ebbec9 +Author: Behdad Esfahbod +Date: Tue Sep 11 16:41:26 2018 +0200 + + [dfont] Re-enable and fix offset handling + + Fixes https://github.com/harfbuzz/harfbuzz/pull/1085 + + src/hb-face.cc | 5 +++-- + src/hb-open-file.hh | 19 +++++++++++++------ + 2 files changed, 16 insertions(+), 8 deletions(-) + +commit a1814e2bec3a43b9eeb4d50a67daae3fc52fd0a5 +Author: Behdad Esfahbod +Date: Tue Sep 11 14:45:23 2018 +0200 + + Whitespace + + src/hb-open-file.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 383060cc3354e12611dec3082a6fe08fdb25f652 +Author: Behdad Esfahbod +Date: Tue Sep 11 14:41:19 2018 +0200 + + [ft] Invalidate advance cache if font size changed + + src/hb-ft.cc | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 54998befc43ef38e47b74b3153380adbcf6279d4 +Author: Behdad Esfahbod +Date: Tue Sep 11 14:35:26 2018 +0200 + + [ft] Cache advances + + I decided to always use the cache, instead of my previous sketch + direction + that was to only allocate and use cache if fast advances are not + available. + The cache is a mere 1kb, so just use it... + + TODO: Invalidate cache on font size change. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/651 + Fixes https://github.com/harfbuzz/harfbuzz/pull/1082 + + src/hb-cache.hh | 2 +- + src/hb-ft.cc | 37 +++++++++++++++++-------------------- + 2 files changed, 18 insertions(+), 21 deletions(-) + +commit f90bab8560816b60b4b3f2379b36c08756b21e6c +Author: Behdad Esfahbod +Date: Tue Sep 11 14:21:15 2018 +0200 + + [util] Add --ft-load-flags + + Useful for performance testing. + + Not hooked to cairo yet. Just changes shaping, not rasterization. + + util/helper-cairo.cc | 2 +- + util/options.cc | 4 ++++ + util/options.hh | 2 ++ + 3 files changed, 7 insertions(+), 1 deletion(-) + +commit 93f7596254808d567b9e1e01fb4855efcd34677c +Author: Behdad Esfahbod +Date: Tue Sep 11 14:11:10 2018 +0200 + + [util] Add -n shorthand for --num-iterations + + Meh. + + util/options.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 047a84c5dd76cdfc072de25c572e30866f87a1f7 +Author: Behdad Esfahbod +Date: Tue Sep 11 14:05:16 2018 +0200 + + [ft] Towards caching slow get_h_advance results + + Related to https://github.com/harfbuzz/harfbuzz/pull/1082 + + src/hb-ft.cc | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +commit 237f21537842e6b471cdd6c86b98edfc0da0756c +Author: Behdad Esfahbod +Date: Tue Sep 11 13:05:47 2018 +0200 + + [ft] Add advances() callback + + src/hb-ft.cc | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +commit cbea7d49ab8d4765a2d72dcbf608d326bdf9af3d +Author: Behdad Esfahbod +Date: Tue Sep 11 12:56:17 2018 +0200 + + [ot-font] Rename + + src/hb-ot-font.cc | 74 + +++++++++++++++++++++++++++---------------------------- + 1 file changed, 37 insertions(+), 37 deletions(-) + +commit d8a67dac2a673138bb4d41cd7eab97c9ee987958 +Author: Behdad Esfahbod +Date: Tue Sep 11 12:55:54 2018 +0200 + + [ot-font] Add advances() callbacks + + src/hb-ot-font.cc | 43 ++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 42 insertions(+), 1 deletion(-) + +commit 0ea42e117ba2c76e118974fe114ae5d9ceef5743 +Author: Behdad Esfahbod +Date: Tue Sep 11 12:22:42 2018 +0200 + + [cache] Minor + + src/hb-cache.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0f520adaacca3c7b6d8e84a7722343184105f612 +Author: Behdad Esfahbod +Date: Tue Sep 11 12:02:34 2018 +0200 + + Revert "Remove unused hb_cache_t" + + This reverts commit 473b17af4d421f4ce7ac18c769731bb2aa4088f8. + + Updates to recent changes. + + src/Makefile.sources | 1 + + src/hb-cache.hh | 75 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ft.cc | 1 + + 3 files changed, 77 insertions(+) + +commit cfdea884754ed40ffa5cc00cb1ecaa86cb46a394 +Author: Behdad Esfahbod +Date: Tue Sep 11 10:57:48 2018 +0200 + + [random] Switch to 32bit RNG + + src/hb-ot-layout-gsubgpos.hh | 7 ++++--- + test/shaping/data/in-house/tests/rand.tests | 4 ++-- + 2 files changed, 6 insertions(+), 5 deletions(-) + +commit 08260c708ae6adc4efa9bde5e9ede01b7e4d42cc +Author: Behdad Esfahbod +Date: Tue Sep 11 10:51:19 2018 +0200 + + [random] Shuffle + + src/hb-ot-layout-gsub-table.hh | 5 +---- + src/hb-ot-layout-gsubgpos.hh | 6 ++++++ + 2 files changed, 7 insertions(+), 4 deletions(-) + +commit 71c9f84e7c0afe41a8987b8a4ebc2b45a22fac56 +Author: Behdad Esfahbod +Date: Mon Sep 10 22:37:19 2018 +0200 + + Make --features rand=1 available to the user + + Use rand=255 to mean "randomize". + + Part of https://github.com/harfbuzz/harfbuzz/pull/803 + + src/hb-ot-layout-gsub-table.hh | 11 ++++------- + src/hb-ot-layout-gsubgpos.hh | 1 + + src/hb-ot-map.cc | 4 ++-- + src/hb-ot-map.hh | 3 +++ + src/hb-ot-shape.cc | 2 +- + 5 files changed, 11 insertions(+), 10 deletions(-) + +commit cc1c4fdf88f6953dcd07fb42ee963404657cdef4 +Author: Behdad Esfahbod +Date: Mon Sep 10 16:36:05 2018 +0200 + + Respect user's wish if they set rand feature manually + + Except if the set it to 1, which would mean "randomize"... Ugly. + + src/hb-ot-layout-gsub-table.hh | 30 ++++++++++++++++-------------- + 1 file changed, 16 insertions(+), 14 deletions(-) + +commit 80de4bcd2677bfb0907ea7059524f918b109ac37 +Author: Behdad Esfahbod +Date: Mon Sep 10 16:24:52 2018 +0200 + + Minor clean up of 'rand' patchset + + src/hb-ot-layout-gsub-table.hh | 7 +++++-- + src/hb-ot-layout-gsubgpos.hh | 7 ++++--- + src/hb-ot-shape.cc | 13 ++++++------- + test/shaping/data/in-house/tests/rand.tests | 2 +- + 4 files changed, 16 insertions(+), 13 deletions(-) + +commit b545e27d8891f1e7f1fd034dd84abe44c839c380 +Author: David Corbett +Date: Fri Feb 23 12:22:32 2018 -0500 + + Don't seed the RNG from the contents of the buffer + + src/hb-ot-layout-gsubgpos.hh | 7 ++----- + src/hb-ot-layout.cc | 5 +---- + test/shaping/data/in-house/tests/rand.tests | 2 +- + 3 files changed, 4 insertions(+), 10 deletions(-) + +commit 2de96e846844d21888af6893378b21a33fc19232 +Author: David Corbett +Date: Sat Jan 27 19:48:38 2018 -0500 + + Test 'rand' + + test/shaping/data/in-house/Makefile.sources | 1 + + .../fonts/5bb74492f5e0ffa1fbb72e4c881be035120b6513.ttf | Bin 0 -> + 1352 bytes + test/shaping/data/in-house/tests/rand.tests | 3 +++ + 3 files changed, 4 insertions(+) + +commit f05df643b44d9bbfd742e93f02c235fc821190d0 +Author: David Corbett +Date: Fri Jan 26 21:36:15 2018 -0500 + + Allow requesting a specific glyph for 'rand' + + Randomization only happens by default. If the user specifies a + value for + 'rand', that value is respected. + + src/hb-ot-map.cc | 3 ++- + src/hb-ot-map.hh | 4 +++- + src/hb-ot-shape.cc | 7 ++++++- + 3 files changed, 11 insertions(+), 3 deletions(-) + +commit c2a75e07e54314f6c611dda0f050ed5f09909e43 +Author: David Corbett +Date: Thu Jan 25 14:22:03 2018 -0500 + + Implement 'rand' + + src/hb-ot-layout-gsub-table.hh | 19 ++++++++++++------- + src/hb-ot-layout-gsubgpos.hh | 8 ++++++++ + src/hb-ot-layout.cc | 8 ++++++++ + src/hb-ot-map.cc | 7 +++++-- + src/hb-ot-map.hh | 4 +++- + src/hb-ot-shape.cc | 1 + + 6 files changed, 37 insertions(+), 10 deletions(-) + +commit c6f75c3049685440d166bd4169b36abac2df4fdd +Author: Michiharu Ariza +Date: Mon Sep 10 17:02:31 2018 -0700 + + fix build attempt + + src/hb-ot-cff1-table.hh | 70 + ++++++++++++++++++++++++------------------------- + src/hb-subset-cff1.cc | 16 +++++------ + 2 files changed, 43 insertions(+), 43 deletions(-) + +commit 96471fe8593575deceb44d3757c227f65f10a25e +Author: Behdad Esfahbod +Date: Tue Sep 11 01:39:23 2018 +0200 + + [uniscribe] Fix build + + src/hb-uniscribe.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cc52e53cf0cb76809145ae7407a8b613e9e61153 +Author: Michiharu Ariza +Date: Mon Sep 10 16:27:49 2018 -0700 + + Removed unused subr subset code + + src/hb-subset-cff-common.hh | 98 + ++------------------------------------------- + src/hb-subset-cff1.cc | 92 + +++++------------------------------------- + src/hb-subset-cff2.cc | 90 + ++++------------------------------------- + 3 files changed, 22 insertions(+), 258 deletions(-) + +commit becd84aa2f2902ea9d2d1677b28945e103a68816 +Author: Behdad Esfahbod +Date: Tue Sep 11 01:26:18 2018 +0200 + + Add HB_FEATURE_GLOBAL_START/END + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1141 + + New API: + HB_FEATURE_GLOBAL_START + HB_FEATURE_GLOBAL_END + + docs/harfbuzz-sections.txt | 2 ++ + src/hb-common.cc | 4 ++-- + src/hb-common.h | 13 +++++++++++++ + 3 files changed, 17 insertions(+), 2 deletions(-) + +commit 13a8786c7c580651d8a6db9345b9aa85ca8ed956 +Author: Behdad Esfahbod +Date: Tue Sep 11 01:07:06 2018 +0200 + + Add (unused) hb_array_t<> + + src/hb-dsalgs.hh | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit bccf3e1827eec07433340eea705597201b6d0a32 +Author: Behdad Esfahbod +Date: Tue Sep 11 01:04:50 2018 +0200 + + Minor + + src/hb-open-type.hh | 1 - + 1 file changed, 1 deletion(-) + +commit dff2c45f1e2a30767f6813d3cb6a70978d98d424 +Author: Behdad Esfahbod +Date: Mon Sep 10 23:29:26 2018 +0200 + + Port rest from VAR to UnsizedArrayOf<> + + src/hb-aat-layout-common.hh | 14 +++++++------- + src/hb-aat-layout-morx-table.hh | 16 ++++++++-------- + src/hb-open-type.hh | 10 +++++----- + src/hb-ot-cmap-table.hh | 8 +++++--- + src/hb-ot-color-cbdt-table.hh | 16 ++++++++-------- + src/hb-ot-glyf-table.hh | 10 +++++----- + src/hb-ot-hdmx-table.hh | 30 +++++++++++++----------------- + src/hb-ot-hmtx-table.hh | 8 ++++---- + src/hb-ot-kern-table.hh | 20 ++++++++++---------- + src/hb-ot-layout-common.hh | 9 +++++---- + src/hb-ot-layout-gpos-table.hh | 26 +++++++++++++------------- + src/hb-ot-math-table.hh | 36 +++++++++++++++++++----------------- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-name-table.hh | 13 +++++++------ + src/hb-ot-post-table.hh | 5 +++-- + 15 files changed, 113 insertions(+), 110 deletions(-) + +commit 1666b89e300c86347dc82131423463cbfed8cc0f +Author: Michiharu Ariza +Date: Mon Sep 10 16:00:20 2018 -0700 + + subset CFF1 String Index + + Repurposed FDMap as Remap then subclassed for remapping SIDs + misc code cleanup + + src/hb-cff-interp-common.hh | 2 - + src/hb-cff-interp-dict-common.hh | 12 +- + src/hb-ot-cff-common.hh | 96 +++++++++-- + src/hb-ot-cff1-table.hh | 251 +++++++++++++++++++---------- + src/hb-ot-cff2-table.hh | 12 +- + src/hb-subset-cff-common.cc | 24 +-- + src/hb-subset-cff-common.hh | 20 ++- + src/hb-subset-cff1.cc | 334 + ++++++++++++++++++++++++++++++++------- + src/hb-subset-cff2.cc | 8 +- + 9 files changed, 565 insertions(+), 194 deletions(-) + +commit 9507b05a7a65962d5d02eb424e4f5d8570976f4e +Author: Behdad Esfahbod +Date: Mon Sep 10 23:18:07 2018 +0200 + + Simplify sanitize->check_array() + + Fix a bug in CBDT sanitize, and redundant check in avar. + + src/hb-aat-layout-common.hh | 10 ++++------ + src/hb-aat-layout-morx-table.hh | 2 +- + src/hb-machinery.hh | 3 ++- + src/hb-open-type.hh | 6 +++--- + src/hb-ot-color-cbdt-table.hh | 4 ++-- + src/hb-ot-kern-table.hh | 2 +- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 8 ++++---- + src/hb-ot-layout-gsubgpos.hh | 4 ++-- + src/hb-ot-math-table.hh | 8 ++------ + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-var-avar-table.hh | 4 ++-- + src/hb-ot-var-fvar-table.hh | 2 +- + src/hb-ot-var-hvar-table.hh | 2 +- + src/hb-ot-var-mvar-table.hh | 2 +- + 15 files changed, 28 insertions(+), 33 deletions(-) + +commit bc485a98122131efc4768fef9147823f2bce146b +Author: Behdad Esfahbod +Date: Mon Sep 10 23:02:24 2018 +0200 + + Port some VAR arrays to UnsizedArrayOf<> + + Fix avar sanitize(). + + src/hb-ot-layout-gsubgpos.hh | 59 + +++++++++++++++++++++++--------------------- + src/hb-ot-var-avar-table.hh | 10 +++++--- + src/hb-ot-var-fvar-table.hh | 7 +++--- + src/hb-ot-var-hvar-table.hh | 9 ++++--- + src/hb-ot-var-mvar-table.hh | 9 ++++--- + 5 files changed, 51 insertions(+), 43 deletions(-) + +commit 1bc7a8d6c4deb9fa6e010d7be08b68cad88579ae +Author: Behdad Esfahbod +Date: Mon Sep 10 22:51:26 2018 +0200 + + [indic] Cache hb_options().uniscribe_bug_compatible on indic_plan + + src/hb-ot-shape-complex-indic.cc | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 24f1d9622489a016904314a5d4e3c637da2e1c77 +Author: Behdad Esfahbod +Date: Mon Sep 10 18:19:37 2018 +0200 + + Unbreak HB_OPTIONS + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1154 + + src/hb-debug.hh | 3 +++ + 1 file changed, 3 insertions(+) + +commit e46c51f1e985ac9c0ffa90fda4ea436d54b4009c +Author: Behdad Esfahbod +Date: Mon Sep 10 17:38:19 2018 +0200 + + [indic] Do NOT allow matra after Halant,ZWJ + + Fixes https://github.com/harfbuzz/harfbuzz/issues/556 + + Devanagari regresses 12 tests, and Gujarati 2. See: + + https://github.com/harfbuzz/harfbuzz/issues/556#issuecomment-419957472 + + New numbers: + + BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%) + DEVANAGARI: 707299 out of 707394 tests passed. 95 failed (0.0134296%) + GUJARATI: 366353 out of 366457 tests passed. 104 failed (0.0283799%) + GURMUKHI: 60729 out of 60747 tests passed. 18 failed (0.0296311%) + KANNADA: 951300 out of 951913 tests passed. 613 failed (0.0643966%) + MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed + (0.0188871%) + ORIYA: 42327 out of 42329 tests passed. 2 failed (0.00472489%) + SINHALA: 271596 out of 271847 tests passed. 251 failed (0.0923313%) + TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%) + TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%) + + src/hb-ot-shape-complex-indic-machine.hh | 1688 + ++++++++++++++---------------- + src/hb-ot-shape-complex-indic-machine.rl | 2 +- + 2 files changed, 784 insertions(+), 906 deletions(-) + +commit 5dfd6e07626a9022a995eb7fa16767eff66c6047 +Author: Behdad Esfahbod +Date: Mon Sep 10 15:45:32 2018 +0200 + + Fix sanitize or Context Rule + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1110 + + src/hb-ot-layout-gsubgpos.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 20a11a824d2a07a8544649477ad03e809bdd8e19 +Author: Behdad Esfahbod +Date: Mon Sep 10 13:56:28 2018 +0200 + + Revert "[subset] Disable GSUB/GPOS subsetting for now" + + This reverts commit 616fd34a69bb69bc35c7e4ea939e71c3ea2e92cb. + + src/hb-subset.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 54d332dd9b0263821376161cdffb60ffb3c7847f +Author: Behdad Esfahbod +Date: Mon Sep 10 11:37:24 2018 +0200 + + 1.9.0 + + NEWS | 19 +++++++++++++++++++ + configure.ac | 2 +- + src/hb-face.cc | 10 +++++----- + src/hb-unicode.h | 5 +++++ + src/hb-version.h | 6 +++--- + 5 files changed, 33 insertions(+), 9 deletions(-) + +commit 616fd34a69bb69bc35c7e4ea939e71c3ea2e92cb +Author: Behdad Esfahbod +Date: Mon Sep 10 11:19:49 2018 +0200 + + [subset] Disable GSUB/GPOS subsetting for now + + So I can get a release out. I haven't debugged those yet, and they + are producing bad tables. + + src/hb-subset.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d42f0e5809964136911cbbd845bc423a8dfd5e31 +Author: Behdad Esfahbod +Date: Mon Sep 10 11:05:33 2018 +0200 + + [atomic] Fix pointer type passed to InterlockedExchangeAdd() + + John Emmas reported on mailing list that build with MSVC is failing. + Not sure why bots don't catch it, but this should fix. + + src/hb-atomic.hh | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit fda994e1d45c4d34601af7272f37ea257f92a3d8 +Author: Behdad Esfahbod +Date: Fri Sep 7 15:02:57 2018 -0400 + + Use enum instead of "static const" in class scope + + Technically, static const needs an out-of-class definition. Eg: + + CXXLD libharfbuzz-subset.la + Undefined symbols for architecture x86_64: + "OT::FeatureVariationRecord::min_size", referenced from: + bool OT::GSUBGPOS::subset(hb_subset_context_t*) + constin libharfbuzz_subset_la-hb-subset.o + bool OT::GSUBGPOS::subset(hb_subset_context_t*) + constin libharfbuzz_subset_la-hb-subset.o + "OT::Record::min_size", referenced from: + OT::Script::subset(hb_subset_context_t*) constin + libharfbuzz_subset_la-hb-subset.o + "OT::IntType::min_size", referenced from: + OT::Script::subset(hb_subset_context_t*) constin + libharfbuzz_subset_la-hb-subset.o + OT::RecordListOf::subset(hb_subset_context_t*) + const in libharfbuzz_subset_la-hb-subset.o + ld: symbol(s) not found for architecture x86_64 + collect2: ld returned 1 exit status + make[4]: *** [libharfbuzz-subset.la] Error 1 + make[3]: *** [all-recursive] Error 1 + make[2]: *** [all] Error 2 + make[1]: *** [all-recursive] Error 1 + make: *** [all] Error 2 + Exited with code 2 + + src/hb-buffer.hh | 2 +- + src/hb-machinery.hh | 8 ++++---- + src/hb-open-file.hh | 2 +- + src/hb-open-type.hh | 2 +- + src/hb-ot-layout-common.hh | 2 +- + src/hb-ot-layout.cc | 4 ++-- + src/hb-set-digest.hh | 4 ++-- + src/hb-set.hh | 12 ++++++------ + 8 files changed, 18 insertions(+), 18 deletions(-) + +commit 1e88b1755c37eaa171c08f7bedb93f110238c80f +Merge: 22b88632 ebe67137 +Author: Michiharu Ariza +Date: Fri Sep 7 10:50:55 2018 -0700 + + Merge branch 'master' into cff-subset + +commit ebe67137ab3559c2c6aaf53442ca223cb34df5af +Author: Behdad Esfahbod +Date: Fri Sep 7 10:46:13 2018 -0400 + + Try fixing bots + + src/hb-ot-layout-common.hh | 32 ++++++++++++++++++-------------- + 1 file changed, 18 insertions(+), 14 deletions(-) + +commit 5f17dbc3025093308d2191a4abd2eec24db35c0e +Author: Behdad Esfahbod +Date: Fri Sep 7 10:24:22 2018 -0400 + + [subset] Fix div-by-zero + + src/hb-subset.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 22b88632d5bd3676642b0a1d93f27e47438c140b +Merge: 2a74536a 21bf1470 +Author: Michiharu Ariza +Date: Thu Sep 6 22:27:44 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 2a74536aae443a8b7f23ed018dec14a013c04dfe +Author: Michiharu Ariza +Date: Thu Sep 6 18:26:13 2018 -0700 + + fix build attempt ^2 + + Added hb-ot-cff1-table.cc to hb-subset sources + Deleted unused variable (charset) + + src/Makefile.sources | 1 + + src/hb-subset-cff1.cc | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +commit 55268df9d4b287883c8266e316cda44f4011f424 +Author: Michiharu Ariza +Date: Thu Sep 6 17:56:05 2018 -0700 + + fix build attempt + + Added HB_INTERNAL to static funtion declarations + + src/hb-ot-cff1-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit aca73c9df2054f62cf10a5c27bc5fa7823747f8b +Author: Michiharu Ariza +Date: Thu Sep 6 17:28:15 2018 -0700 + + subset CFF1 Encoding & Charset + + fixed misc Charset bugs + added source file hb-ot-cff1.table.cc + renamed things for clarity & consistency + + src/Makefile.sources | 1 + + src/hb-cff-interp-dict-common.hh | 15 +- + src/hb-ot-cff-common.hh | 34 ++-- + src/hb-ot-cff1-table.cc | 130 +++++++++++++ + src/hb-ot-cff1-table.hh | 403 + ++++++++++++++++++++++++++++++++------- + src/hb-ot-cff2-table.hh | 24 +-- + src/hb-subset-cff1.cc | 247 ++++++++++++++++++++---- + src/hb-subset-cff2.cc | 30 +-- + 8 files changed, 737 insertions(+), 147 deletions(-) + +commit 21bf147054f6b5bd1c430c0e02a8c4058ed229a1 +Author: Garret Rieger +Date: Wed Sep 5 18:04:52 2018 -0700 + + [subset] Fix hdmx subsetted size calculation. + + src/hb-ot-hdmx-table.hh | 14 ++++++++++---- + test/api/fonts/Roboto-Regular.multihdmx.a.ttf | Bin 0 -> 2052 bytes + test/api/fonts/Roboto-Regular.multihdmx.abc.ttf | Bin 0 -> 2468 bytes + test/api/test-subset-hdmx.c | 20 + ++++++++++++++++++++ + 4 files changed, 30 insertions(+), 4 deletions(-) + +commit 1e6599f59680c81356b2e9ddddb61252490337a0 +Author: Behdad Esfahbod +Date: Wed Sep 5 19:29:42 2018 -0700 + + Fix older compilers re '>>' at nested template declarations + + src/hb-ot-layout-gsub-table.hh | 8 ++++---- + src/hb-subset.cc | 2 +- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit a1e5e07c735091e82d66ac56a4e27341f589369d +Author: Behdad Esfahbod +Date: Wed Sep 5 16:24:28 2018 -0700 + + [subset] Hook up GSUB/GPOS, but still disabled + + They are still in the drop list. + + src/hb-ot-hdmx-table.hh | 3 +- + src/hb-subset.cc | 75 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 77 insertions(+), 1 deletion(-) + +commit 0d160d5ff5158fd4190201becd652c8f28ef4430 +Author: Behdad Esfahbod +Date: Mon Sep 3 20:50:11 2018 -0700 + + [subset] Implement subsetting of SingleSubst + + src/hb-machinery.hh | 2 ++ + src/hb-null.hh | 43 +++++++++++++++++++----------- + src/hb-ot-layout-gsub-table.hh | 59 + +++++++++++++++++++++++++++++++++++------- + src/hb-vector.hh | 2 ++ + 4 files changed, 81 insertions(+), 25 deletions(-) + +commit 5ea03d2951375bfcc1258c2c0b5c33efc6ebf7f8 +Author: Michiharu Ariza +Date: Tue Sep 4 11:29:15 2018 -0700 + + fix build by untemplatizing DictOpSet & DictVal + + as they aren't instantiated with BlendArg (yet) + + src/hb-cff-interp-dict-common.hh | 21 +++++++++------------ + src/hb-cff2-interp-cs.hh | 1 - + src/hb-ot-cff1-table.hh | 8 ++++---- + src/hb-ot-cff2-table.hh | 16 ++++++++-------- + src/hb-subset-cff-common.hh | 4 ++-- + 5 files changed, 23 insertions(+), 27 deletions(-) + +commit f2d299b0b75fd110cdc6b16de31e7212e292cc14 +Author: Michiharu Ariza +Date: Tue Sep 4 10:25:21 2018 -0700 + + Drop hints from CFF2 charstrings + + Templatized ArgStack so it may store the default value along with + blend deltas as BlendArg while parsing blend operator arguments in + CFF2 charstring + Added get_region_count() method to VarRegionList & VariationStore + + src/hb-cff-interp-common.hh | 67 +++++++++++++++++++++++++++------ + src/hb-cff1-interp-cs.hh | 5 ++- + src/hb-cff2-interp-cs.hh | 91 + +++++++++++++++++++++++++++++++++++++++------ + src/hb-ot-cff2-table.hh | 22 ++++++----- + src/hb-ot-layout-common.hh | 6 +++ + src/hb-subset-cff-common.hh | 60 ++++++++++++++++-------------- + src/hb-subset-cff1.cc | 5 ++- + src/hb-subset-cff2.cc | 54 ++++++++++++++++++++++----- + 8 files changed, 235 insertions(+), 75 deletions(-) + +commit 3f00d0b0df14d69859b15568ff28a810d08f59ea +Author: Behdad Esfahbod +Date: Mon Sep 3 18:54:32 2018 -0700 + + [subset] Keep glyph set in plan + + Should remove the vector version at some point... + + src/hb-subset-plan.cc | 19 ++++++++++--------- + src/hb-subset-plan.hh | 3 +-- + 2 files changed, 11 insertions(+), 11 deletions(-) + +commit dc50493a8da05d6561242136d63cae836486c150 +Author: Behdad Esfahbod +Date: Mon Sep 3 18:23:23 2018 -0700 + + [subset] Towards subsetting SingleSubstFormat1 + + Why does subset plan not have a hb_set_t of glyphs? + + src/hb-machinery.hh | 10 +++++++++- + src/hb-ot-layout-gsub-table.hh | 12 +++++++++++- + 2 files changed, 20 insertions(+), 2 deletions(-) + +commit 339d3603b916cebf24ff86d9842b766261e1b262 +Author: Behdad Esfahbod +Date: Mon Sep 3 17:33:34 2018 -0700 + + [subset] Wire up subset() call down to subtables + + src/hb-ot-layout-common.hh | 36 +++++++++++++++++++++++ + src/hb-ot-layout-gpos-table.hh | 67 + +++++++++++++++++++++++++++++++++++++++--- + src/hb-ot-layout-gsub-table.hh | 54 ++++++++++++++++++++++++++++------ + src/hb-ot-layout-gsubgpos.hh | 42 ++++++++++++++++++++++++++ + 4 files changed, 186 insertions(+), 13 deletions(-) + +commit 7b2ef551da0d53cd94106035b1f065a759cf3cd5 +Author: Behdad Esfahbod +Date: Mon Sep 3 17:16:09 2018 -0700 + + Templatize Lookup::sanitize() + + src/hb-ot-layout-common.hh | 40 + ++++++++++++++++++++++++++++------------ + src/hb-ot-layout-gpos-table.hh | 7 ++----- + src/hb-ot-layout-gsub-table.hh | 25 +++---------------------- + 3 files changed, 33 insertions(+), 39 deletions(-) + +commit 9c3747c5e50423e0a7202f249728d5c5b2b09073 +Author: Behdad Esfahbod +Date: Mon Sep 3 16:53:03 2018 -0700 + + [subset] More + + src/hb-ot-layout-gpos-table.hh | 10 +++++---- + src/hb-ot-layout-gsub-table.hh | 48 + +++++++++++++++++++++--------------------- + src/hb-ot-layout-gsubgpos.hh | 22 +++++++++++++------ + 3 files changed, 45 insertions(+), 35 deletions(-) + +commit 6d618522d63a94230ad708fc49c1c73927da0137 +Author: Behdad Esfahbod +Date: Mon Sep 3 16:41:28 2018 -0700 + + Templatize GSUBGPOS::sanitize() + + src/hb-ot-layout-gpos-table.hh | 6 +----- + src/hb-ot-layout-gsub-table.hh | 14 +++++--------- + src/hb-ot-layout-gsubgpos.hh | 4 +++- + 3 files changed, 9 insertions(+), 15 deletions(-) + +commit 49c44b58f6c2536ea5f403c54a40cab41b905150 +Author: Behdad Esfahbod +Date: Mon Sep 3 16:37:17 2018 -0700 + + [subset] Fix serialize_subset() calls + + Ouch. + + src/hb-open-type.hh | 2 +- + src/hb-ot-layout-common.hh | 6 +++--- + src/hb-ot-layout-gsub-table.hh | 13 ++++++------- + src/hb-ot-layout-gsubgpos.hh | 6 +++--- + 4 files changed, 13 insertions(+), 14 deletions(-) + +commit 7c9cfa2b4002c18585a26134ab987ceb7ebc97a2 +Author: Behdad Esfahbod +Date: Sun Sep 2 19:47:50 2018 -0700 + + Add intersects() method to GSUB/GPOS lookups + + src/hb-ot-layout-common.hh | 77 +++++++++-- + src/hb-ot-layout-gpos-table.hh | 103 ++++++++++---- + src/hb-ot-layout-gsub-table.hh | 205 +++++++++++++++++++-------- + src/hb-ot-layout-gsubgpos.hh | 306 + ++++++++++++++++++++++++++++++++--------- + 4 files changed, 528 insertions(+), 163 deletions(-) + +commit 61ce62e55455bb0d6c9db3b076676ab18e51d449 +Author: Behdad Esfahbod +Date: Sun Sep 2 17:00:27 2018 -0700 + + [subset] Minor + + Remove Lookup::subset(). + + src/hb-ot-layout-common.hh | 11 ----------- + src/hb-ot-layout-gsubgpos.hh | 2 +- + 2 files changed, 1 insertion(+), 12 deletions(-) + +commit bfa72a9a72a15d977f503f12eef376a355679d76 +Author: Behdad Esfahbod +Date: Sat Sep 1 18:34:50 2018 -0700 + + [subset] Towards GSUB/GPOS subsetting + + Add subset() call for GSUBGPOS struct and its dependencies. + Not hooked up anywhere. + + src/hb-machinery.hh | 10 ++++-- + src/hb-open-type.hh | 25 ++++++++++++- + src/hb-ot-layout-common.hh | 80 + +++++++++++++++++++++++++++++++++++------- + src/hb-ot-layout-gdef-table.hh | 33 ++++++++++------- + src/hb-ot-layout-gsub-table.hh | 11 ++++-- + src/hb-ot-layout-gsubgpos.hh | 19 ++++++++++ + 6 files changed, 145 insertions(+), 33 deletions(-) + +commit 6803ed8674028a656957910381150ab28d75a5f8 +Author: Behdad Esfahbod +Date: Fri Aug 31 17:11:08 2018 -0700 + + [serialize] Add reset() + + src/hb-machinery.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit e58b190292f85c9676fe14cf63d2831d4d6e6bab +Author: Behdad Esfahbod +Date: Fri Aug 31 16:46:35 2018 -0700 + + [subset] De-templatize hb_subset_context_t + + We're going to (finally) use virtual methods for + hb_serialize_context_t + customization, so don't need to carry a Serializer template variable + around... Simplifies code. + + src/hb-machinery.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 5 ++--- + src/hb-subset.hh | 7 +++---- + 3 files changed, 6 insertions(+), 8 deletions(-) + +commit 22acd424ca77c16d28405021f06c5562497920ab +Author: Behdad Esfahbod +Date: Fri Aug 31 16:38:04 2018 -0700 + + [serialize] Add a couple small methods + + src/hb-machinery.hh | 25 +++++++++++++++++-------- + src/hb-open-file.hh | 3 +-- + src/hb-ot-layout-gsub-table.hh | 1 + + 3 files changed, 19 insertions(+), 10 deletions(-) + +commit d1f29908c281b1685eea00b71bae934d9f1f20eb +Author: Behdad Esfahbod +Date: Fri Aug 31 16:31:00 2018 -0700 + + [subset] Add hb_subset_context_t<> + + src/hb-open-type.hh | 1 + + src/hb-ot-cmap-table.hh | 1 - + src/hb-ot-hdmx-table.hh | 1 - + src/hb-ot-hmtx-table.hh | 1 - + src/hb-ot-layout-gsub-table.hh | 9 +++++++++ + src/hb-ot-maxp-table.hh | 1 - + src/hb-ot-os2-table.hh | 1 - + src/hb-ot-post-table.hh | 1 - + src/hb-subset.hh | 21 +++++++++++++++++++++ + 9 files changed, 31 insertions(+), 6 deletions(-) + +commit fcf177885b4c3d732ffeb82936da906969a269d3 +Author: Michiharu Ariza +Date: Fri Aug 31 16:28:47 2018 -0700 + + templatized ArgStack as a prep to store blends + + src/hb-cff-interp-common.hh | 46 + +++++++++++++++++++++--------------- + src/hb-cff-interp-cs-common.hh | 41 ++++++++++++++++++-------------- + src/hb-cff-interp-dict-common.hh | 35 ++++++++++++++++----------- + src/hb-cff1-interp-cs.hh | 15 +++++++----- + src/hb-cff2-interp-cs.hh | 14 +++++++---- + src/hb-ot-cff1-table.hh | 32 ++++++++++++------------- + src/hb-ot-cff2-table.hh | 51 + ++++++++++++++++++++++++++-------------- + src/hb-subset-cff-common.hh | 4 ++-- + src/hb-subset-cff1.cc | 1 - + src/hb-subset-cff2.cc | 2 +- + 10 files changed, 142 insertions(+), 99 deletions(-) + +commit 968168bf0e369927cd6a7f63608d844abe123a7b +Author: Michiharu Ariza +Date: Fri Aug 31 13:28:16 2018 -0700 + + drop hints from CFF1 charstrings + + renamed confusing Stack.size to Stack.count + + src/hb-cff-interp-common.hh | 43 +++++++----- + src/hb-cff-interp-cs-common.hh | 140 + +++++++++++++++++---------------------- + src/hb-cff-interp-dict-common.hh | 4 +- + src/hb-cff1-interp-cs.hh | 14 ++-- + src/hb-cff2-interp-cs.hh | 18 ++--- + src/hb-ot-cff1-table.hh | 26 ++++---- + src/hb-ot-cff2-table.hh | 20 +++--- + src/hb-subset-cff1.cc | 53 ++++++++------- + src/hb-subset-cff2.cc | 69 +++++++++---------- + 9 files changed, 190 insertions(+), 197 deletions(-) + +commit aba0a945c5f8724cc7bd1a9b7f7b5df1c64b03f4 +Author: Behdad Esfahbod +Date: Fri Aug 31 13:25:19 2018 -0700 + + [subset] Add hb-subset-input.hh and make hb-subset.hh toplevel include + + src/Makefile.sources | 1 + + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-glyf-table.hh | 2 -- + src/hb-ot-hdmx-table.hh | 2 +- + src/hb-ot-hmtx-table.hh | 2 +- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-os2-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-subset-glyf.cc | 1 - + src/hb-subset-glyf.hh | 2 +- + src/hb-subset-input.hh | 57 + +++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-subset-plan.cc | 3 +-- + src/hb-subset-plan.hh | 2 +- + src/hb-subset.cc | 3 +-- + src/hb-subset.hh | 23 +++----------------- + 15 files changed, 71 insertions(+), 35 deletions(-) + +commit 18d01eac7f2870e2804ceed2c70a604a5dc6a320 +Author: Behdad Esfahbod +Date: Fri Aug 31 13:00:57 2018 -0700 + + Minor + + src/hb-ot-shape-complex-arabic-fallback.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 8c5e03b5415f83312719ebb3cd284229e52a4843 +Author: Michiharu Ariza +Date: Thu Aug 30 17:21:56 2018 -0700 + + Added drop_hints to SubrFlattener + + src/hb-cff-interp-cs-common.hh | 20 +++++++++++++++++++- + src/hb-subset-cff-common.hh | 18 ++++++++++++++---- + src/hb-subset-cff1.cc | 35 ++++++++++++++++++++++------------ + src/hb-subset-cff2.cc | 43 + ++++++++++++++++++++++++++---------------- + 4 files changed, 83 insertions(+), 33 deletions(-) + +commit a23b892fe6cc4859a30edc7ffc003ab7624aa5f0 +Author: Behdad Esfahbod +Date: Wed Aug 29 18:28:39 2018 -0700 + + Shuffle + + src/hb-machinery.hh | 62 + +++++++++++++++++++++++++++-------------------------- + 1 file changed, 32 insertions(+), 30 deletions(-) + +commit 93fe0faaee45b8fb646f7aa33620105c62193885 +Author: Behdad Esfahbod +Date: Wed Aug 29 18:24:03 2018 -0700 + + [subset] Clean up hb_subset_input_t API + + src/hb-subset-input.cc | 44 + +++++++++++++++++++--------------------- + src/hb-subset-plan.cc | 4 ++-- + src/hb-subset-plan.hh | 10 ++++----- + src/hb-subset.cc | 2 +- + src/hb-subset.h | 14 +++++++++---- + src/hb-subset.hh | 4 ++-- + test/api/test-subset-glyf.c | 10 ++++----- + test/fuzzing/hb-subset-fuzzer.cc | 10 ++++----- + util/hb-subset.cc | 3 +-- + 9 files changed, 52 insertions(+), 49 deletions(-) + +commit 9fd08cc238f8e2f7be1eaefca110021382efe606 +Author: Michiharu Ariza +Date: Wed Aug 29 18:18:18 2018 -0700 + + CFF2 subroutine flattner + + Factored out CFF1 & CFF2 common subsetting code in + hb-subset-cff-common.hh + + src/hb-cff2-interp-cs.hh | 34 +++++-- + src/hb-subset-cff-common.hh | 154 +++++++++++++++++++++++++++++ + src/hb-subset-cff1.cc | 135 +++----------------------- + src/hb-subset-cff2.cc | 229 + ++++++++++++++++++-------------------------- + 4 files changed, 285 insertions(+), 267 deletions(-) + +commit d237ce71810045ee400c52740cd8ab6e1113aada +Author: Behdad Esfahbod +Date: Wed Aug 29 18:13:07 2018 -0700 + + [subset] Bail if subsetting a table failed + + src/hb-subset.cc | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit f39166f0c0c09fac7874fda6b0b0825f20768e3e +Author: Behdad Esfahbod +Date: Wed Aug 29 18:09:55 2018 -0700 + + [subset] Remove unused hb_subset_profile_t + + We might reintroduce it later, but for now remove, as it was unused. + Some things that should have been in this object (drop_hints, etc) + are already in hb_subset_input_t. So, for now, keep everything there. + + src/hb-subset-plan.cc | 3 +-- + src/hb-subset-plan.hh | 1 - + src/hb-subset.cc | 39 + +++------------------------------------ + src/hb-subset.h | 16 +--------------- + test/api/hb-subset-test.h | 4 +--- + test/api/test-subset-hdmx.c | 8 ++------ + test/api/test-subset-hmtx.c | 4 +--- + test/api/test-subset.c | 12 +++--------- + test/fuzzing/hb-subset-fuzzer.cc | 5 +---- + util/hb-subset.cc | 4 +--- + 10 files changed, 14 insertions(+), 82 deletions(-) + +commit 2ccc322cf88a01248aa5df88a5073db3dfb40eea +Author: Behdad Esfahbod +Date: Wed Aug 29 16:38:04 2018 -0700 + + [ot-font] Clean up cmap with gid=0 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1145 + + src/hb-ot-cmap-table.hh | 25 +++++++++++++++---------- + 1 file changed, 15 insertions(+), 10 deletions(-) + +commit 0c7b633f528bae4a0cf5ca816f75a0d84206b3fb +Author: Ross Burton +Date: Wed Aug 29 22:37:39 2018 +0100 + + Delete pkg.m4 + + pkg.m4 is provided by pkg-config, which is a requirement to build, + and this copy is ancient. Delete it to avoid it being used instead + of the host copy. + + m4/pkg.m4 | 157 + -------------------------------------------------------------- + 1 file changed, 157 deletions(-) + +commit b95bf075d7b62baf7d6fa1d8f0d1f16fad934975 +Author: Michiharu Ariza +Date: Wed Aug 29 14:41:52 2018 -0700 + + fix build attempt ^2 + + src/hb-subset-cff1.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 1d1afddfd21155ef136c2d96b1d6c286bdc8925f +Author: Michiharu Ariza +Date: Wed Aug 29 13:36:39 2018 -0700 + + corrected preprocessor guards + + src/hb-cff-interp-common.hh | 6 +++--- + src/hb-cff-interp-cs-common.hh | 6 +++--- + src/hb-cff-interp-dict-common.hh | 6 +++--- + src/hb-ot-cff-common.hh | 6 +++--- + src/hb-subset-cff-common.hh | 6 +++--- + 5 files changed, 15 insertions(+), 15 deletions(-) + +commit 8af9690ac7ce41fb1db878d556df5c4ee624eaa0 +Merge: 0ad081ec fee0f41c +Author: Michiharu Ariza +Date: Wed Aug 29 13:26:17 2018 -0700 + + Merge branch 'master' into cff-subset + + Renamed cff "private" source/headers without the suffix + +commit 0ad081ec324e734cfca60d4d2c36a1be5bc8a067 +Author: Michiharu Ariza +Date: Wed Aug 29 12:56:48 2018 -0700 + + attempt to fix build failure + + src/hb-subset-cff1.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a11420b48c405e1a43e2ba62893e9a0872e5f496 +Author: Michiharu Ariza +Date: Wed Aug 29 12:14:30 2018 -0700 + + Subroutine flattener for CFF1 + + Subr-flattened charstrings are temporarily re-encoded in ByteStrBuff + during "plan" phase, then copied to hb_serialize_context_t during + "write" phase + + CSOpSet may callback opcode processing "virtual" functions via CRTP + + Numer struct may store a value as fixed optionally in addition to + int and float + + src/hb-cff-interp-common-private.hh | 53 ++++++++++-- + src/hb-cff-interp-cs-common-private.hh | 109 ++++++++++++++++++----- + src/hb-cff1-interp-cs.hh | 35 +++++--- + src/hb-cff2-interp-cs.hh | 14 +-- + src/hb-ot-cff-common-private.hh | 10 +-- + src/hb-subset-cff-common-private.hh | 102 +++++++++++++++++++++- + src/hb-subset-cff1.cc | 152 + ++++++++++++++++++++++----------- + src/hb-subset-cff2.cc | 7 +- + 8 files changed, 372 insertions(+), 110 deletions(-) + +commit fee0f41c6c1e50621d10b07802ca36a9b295b53d +Author: Behdad Esfahbod +Date: Tue Aug 28 18:27:41 2018 -0700 + + Don't declare extern symbols as inline + + clang -O3 was completely removing _get_gdef(), causing link + failure when needed from another compilation unit. Surprisingly, + "extern inline" didn't fix it. + + src/hb-ot-layout.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 967741e4c468ebf0a40f91934ed1923506099806 +Author: Behdad Esfahbod +Date: Tue Aug 28 18:18:02 2018 -0700 + + Add explicit to hb_auto_t 1param constructors + + src/hb-dsalgs.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit c0a3f38f78362a183b30afd109dcebfca563d144 +Author: Behdad Esfahbod +Date: Tue Aug 28 17:22:38 2018 -0700 + + Fix distcheck + + src/Makefile.sources | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2dde6c803a9e50c5bff74095187b0cb2e12eebdd +Author: Behdad Esfahbod +Date: Tue Aug 28 11:02:00 2018 -0700 + + Explicitly pass reference in hb_auto_t constructor + + Fixes clang bots as well as fuzzer issue. + + src/hb-dsalgs.hh | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit a26806801005c28115ae9e48bdcf3bbbc1bcd767 +Author: Behdad Esfahbod +Date: Sun Aug 26 15:18:46 2018 -0700 + + [ot-face] Remove tables_t. The face_data_t is what tables_t was + + src/hb-aat-layout.cc | 4 ++-- + src/hb-face.cc | 6 +++--- + src/hb-ot-face.cc | 8 ++++---- + src/hb-ot-face.hh | 28 ++++++++++++---------------- + src/hb-ot-font.cc | 25 +++++++++++-------------- + src/hb-ot-layout.cc | 36 ++++++++++++++++++------------------ + src/hb-ot-math.cc | 4 ++-- + src/hb-ot-var.cc | 4 ++-- + 8 files changed, 54 insertions(+), 61 deletions(-) + +commit 3a0b3a29cc246d0b1e5989c9e8c1e6d544046dcc +Author: Behdad Esfahbod +Date: Sun Aug 26 15:11:24 2018 -0700 + + Free up hb-ot-face.hh from includes + + There might be a better way to do this, but I couldn't find... + + src/hb-face.cc | 1 + + src/hb-ot-cmap-table.hh | 1 + + src/hb-ot-color-cbdt-table.hh | 2 ++ + src/hb-ot-face.cc | 10 ++++++++++ + src/hb-ot-face.hh | 15 ++------------- + src/hb-ot-font.cc | 7 +++++++ + src/hb-ot-glyf-table.hh | 2 ++ + src/hb-ot-hmtx-table.hh | 3 +++ + src/hb-ot-kern-table.hh | 2 ++ + src/hb-ot-layout-gdef-table.hh | 1 + + src/hb-ot-layout-gpos-table.hh | 2 ++ + src/hb-ot-layout-gsub-table.hh | 1 + + src/hb-ot-post-table.hh | 2 ++ + 13 files changed, 36 insertions(+), 13 deletions(-) + +commit a84309afc8817cd386e555af21dfcdc03388b329 +Author: Behdad Esfahbod +Date: Sun Aug 26 09:33:01 2018 -0700 + + [face] Use saved cmap in collect_unicodes() APIs + + src/hb-face.cc | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +commit c624e18a24311c66737dde4ce515aa1eca892b94 +Author: Behdad Esfahbod +Date: Sun Aug 26 09:19:20 2018 -0700 + + [OT] Move code around + + src/hb-ot-layout-gsub-table.hh | 18 ------------------ + src/hb-ot-layout.cc | 23 +++++++++++++++++++++-- + 2 files changed, 21 insertions(+), 20 deletions(-) + +commit 399909468204b76769857508e74f802d648ca0a5 +Author: Behdad Esfahbod +Date: Sun Aug 26 09:12:25 2018 -0700 + + [OT] Use relaxed ops for recursing into GSUB/GPOS lookups again + + src/hb-ot-layout-gpos-table.hh | 4 ++-- + src/hb-ot-layout-gsub-table.hh | 4 ++-- + src/hb-ot-layout.cc | 12 ++++++++++-- + src/hb-ot-layout.hh | 4 ++-- + 4 files changed, 16 insertions(+), 8 deletions(-) + +commit d8c57e85d9981b4c7a11fae4f31100359574cf13 +Author: Behdad Esfahbod +Date: Sun Aug 26 09:03:31 2018 -0700 + + [GDEF] Move code around + + src/hb-ot-layout-gdef-table.hh | 118 +----------------------------------- + src/hb-ot-layout.cc | 134 + ++++++++++++++++++++++++++++++++++++++--- + src/hb-ot-layout.hh | 14 +---- + 3 files changed, 128 insertions(+), 138 deletions(-) + +commit 453e0c60b1c87d2cd2527d6d2de673f65458a9fd +Author: Behdad Esfahbod +Date: Sun Aug 26 01:30:52 2018 -0700 + + Add template keyword + + I swear I have no idea why this is needed, but it is... + + src/hb-ot-layout-gsubgpos.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c44b0caf0d0cddb7228dcec0b9d25bb62f641abc +Author: Behdad Esfahbod +Date: Sun Aug 26 01:29:30 2018 -0700 + + Fixup + + src/hb-ot-layout-gpos-table.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4096fbe487d90de04020e32e8487295ecd4d8836 +Author: Behdad Esfahbod +Date: Sun Aug 26 01:25:54 2018 -0700 + + [ot-face] Port GDEF to unified table accelerator model as well + + src/hb-ot-face.cc | 108 ---------------------------------- + src/hb-ot-face.hh | 2 +- + src/hb-ot-layout-gdef-table.hh | 129 + +++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-layout.cc | 14 ++++- + src/hb-ot-layout.hh | 5 +- + 5 files changed, 147 insertions(+), 111 deletions(-) + +commit b929100f8782816c2621715f6c007ecefc419d83 +Author: Behdad Esfahbod +Date: Sun Aug 26 01:15:47 2018 -0700 + + [ot-face] Unify GSUB/GPOS accelerators in the table accelerator + framework + + src/hb-aat-layout.cc | 4 +--- + src/hb-ot-face.cc | 40 + ++-------------------------------------- + src/hb-ot-face.hh | 25 +++++++++++-------------- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 6 +++--- + src/hb-ot-layout-gsubgpos.hh | 24 +++++++++++++----------- + src/hb-ot-layout.cc | 33 +++++++++++++++++---------------- + src/hb-ot-layout.hh | 17 +++++++++++++++++ + src/hb-ot-shape.cc | 1 + + 9 files changed, 66 insertions(+), 86 deletions(-) + +commit 963413fc5454d92621ae83a8d9c9324e404b8166 +Author: Behdad Esfahbod +Date: Sun Aug 26 00:47:55 2018 -0700 + + WIP + + src/hb-ot-cmap-table.hh | 1 - + src/hb-ot-face.hh | 22 ---------------------- + src/hb-ot-layout-gpos-table.hh | 2 ++ + src/hb-ot-layout-gsub-table.hh | 2 ++ + src/hb-ot-layout-gsubgpos.hh | 31 ++++++++++++++++++++++++++++++- + src/hb-ot-layout.hh | 18 +++++++++++++++++- + 6 files changed, 51 insertions(+), 25 deletions(-) + +commit e6cb9380651c753485f721bd3df523d03be41d91 +Author: Behdad Esfahbod +Date: Sun Aug 26 00:21:29 2018 -0700 + + [ot-face] Unify accelerators and tables + + src/hb-machinery.hh | 4 ++-- + src/hb-ot-cmap-table.hh | 3 ++- + src/hb-ot-face.cc | 6 +++-- + src/hb-ot-face.hh | 58 + +++++++++++++------------------------------------ + src/hb-ot-font.cc | 6 ++--- + 5 files changed, 26 insertions(+), 51 deletions(-) + +commit 7f8b6fe67d64b41786edbf8650efb1c0deba573f +Author: Behdad Esfahbod +Date: Sun Aug 26 00:07:12 2018 -0700 + + Minor + + src/hb-ot-face.hh | 1 - + 1 file changed, 1 deletion(-) + +commit 59bca0d2cb6010bc237afb2255ccda3b8dd0585d +Author: Behdad Esfahbod +Date: Sun Aug 26 00:06:12 2018 -0700 + + [ot-font] Rename + + src/hb-ot-face.hh | 12 ++++++------ + src/hb-ot-font.cc | 24 ++++++++++++------------ + 2 files changed, 18 insertions(+), 18 deletions(-) + +commit 1c48a7ef06b82ef9ca013066d1fb3c6fda82aa0c +Author: Behdad Esfahbod +Date: Sat Aug 25 23:54:06 2018 -0700 + + [ot-font] Cache tables on face, not font + + src/hb-ot-cmap-table.hh | 1 + + src/hb-ot-face.cc | 2 ++ + src/hb-ot-face.hh | 55 +++++++++++++++++++++++++++----- + src/hb-ot-font.cc | 75 + ++++---------------------------------------- + src/hb-ot-layout-gsubgpos.hh | 1 + + src/hb-ot-layout.hh | 1 - + 6 files changed, 58 insertions(+), 77 deletions(-) + +commit 71f8893eff56bff651e3df6288becc68ecea6cd1 +Author: Behdad Esfahbod +Date: Sat Aug 25 23:27:45 2018 -0700 + + [ot-font] Use init0 + + src/hb-ot-font.cc | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit f36ae6f8a82485bbf727f24dfd7da8f32002cad6 +Author: Behdad Esfahbod +Date: Sat Aug 25 23:19:34 2018 -0700 + + [ot-font] Make everything (cmap/metrics) lazy + + src/hb-machinery.hh | 5 +++++ + src/hb-ot-font.cc | 51 + ++++++++++++++++++++++++++------------------------- + 2 files changed, 31 insertions(+), 25 deletions(-) + +commit 62fc54725a3863473829f3a3748c9336e4dc0787 +Author: Behdad Esfahbod +Date: Sat Aug 25 23:15:52 2018 -0700 + + [ot-font] Fallback vertical advance to UPEM + + Used to be ascent+descent. Whatever. This is more convenient for + upcoming changes. + + src/hb-ot-font.cc | 2 +- + test/shaping/data/in-house/tests/vertical.tests | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit d950022c8ae3f85546272b38b187d6ed9f5ff16f +Author: Behdad Esfahbod +Date: Sat Aug 25 23:06:37 2018 -0700 + + Add hb-ot-face.cc/hh + + src/Makefile.sources | 2 + + src/hb-ot-face.cc | 206 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-face.hh | 144 +++++++++++++++++++++++++++++++++++ + src/hb-ot-layout.cc | 172 ------------------------------------------ + src/hb-ot-layout.hh | 108 +-------------------------- + src/hb-ot-math.cc | 2 +- + src/hb-ot-var.cc | 2 +- + 7 files changed, 355 insertions(+), 281 deletions(-) + +commit dae39c58fb63c2211e2842121bbe6d5b8b18651b +Author: Behdad Esfahbod +Date: Sat Aug 25 22:44:39 2018 -0700 + + [face] Introduce character-map API + + New API: + +hb_face_collect_unicodes + +hb_face_collect_variation_selectors + +hb_face_collect_variation_unicodes + + docs/harfbuzz-sections.txt | 3 ++ + src/hb-face.cc | 61 + ++++++++++++++++++++++++- + src/hb-face.h | 19 ++++++++ + src/hb-subset.cc | 53 + --------------------- + src/hb-subset.h | 15 ------ + test/api/test-subset-codepoints.c | 6 +-- + test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 2 +- + 7 files changed, 86 insertions(+), 73 deletions(-) + +commit 66384db97c439a64d729f9206657d0b37ec0cb32 +Author: Behdad Esfahbod +Date: Sat Aug 25 22:39:17 2018 -0700 + + Minor + + src/hb-subset.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c77ae40852aabb1698da9e8d488f75bae2f4e734 +Author: Behdad Esfahbod +Date: Sat Aug 25 22:36:36 2018 -0700 + + Rename hb-*private.hh to hb-*.hh + + Sorry for the noise, downstream custom builders. Please adjust. + + src/Makefile.sources | 75 + +++++++++++----------- + src/check-includes.sh | 8 +-- + src/dump-indic-data.cc | 2 +- + src/dump-khmer-data.cc | 2 +- + src/dump-myanmar-data.cc | 2 +- + src/dump-use-data.cc | 2 +- + src/gen-indic-table.py | 2 +- + src/gen-use-table.py | 2 +- + src/hb-aat-layout-ankr-table.hh | 2 +- + src/hb-aat-layout-bsln-table.hh | 2 +- + ...t-common-private.hh => hb-aat-layout-common.hh} | 8 +-- + src/hb-aat-layout-feat-table.hh | 2 +- + src/hb-aat-layout-kerx-table.hh | 4 +- + src/hb-aat-layout-morx-table.hh | 6 +- + src/hb-aat-layout-trak-table.hh | 6 +- + src/hb-aat-layout.cc | 8 +-- + src/{hb-aat-layout-private.hh => hb-aat-layout.hh} | 14 ++-- + src/hb-aat-ltag-table.hh | 2 +- + src/{hb-atomic-private.hh => hb-atomic.hh} | 8 +-- + src/hb-blob.cc | 4 +- + src/{hb-blob-private.hh => hb-blob.hh} | 8 +-- + src/hb-buffer-deserialize-json.hh | 2 +- + src/hb-buffer-deserialize-json.rl | 2 +- + src/hb-buffer-deserialize-text.hh | 2 +- + src/hb-buffer-deserialize-text.rl | 2 +- + src/hb-buffer-serialize.cc | 2 +- + src/hb-buffer.cc | 4 +- + src/{hb-buffer-private.hh => hb-buffer.hh} | 10 +-- + src/hb-common.cc | 4 +- + src/hb-coretext.cc | 4 +- + src/hb-debug.hh | 4 +- + src/hb-directwrite.cc | 4 +- + src/hb-dsalgs.hh | 2 +- + src/hb-face.cc | 8 +-- + src/{hb-face-private.hh => hb-face.hh} | 12 ++-- + src/hb-fallback-shape.cc | 2 +- + src/hb-font.cc | 6 +- + src/{hb-font-private.hh => hb-font.hh} | 12 ++-- + src/hb-ft.cc | 6 +- + src/hb-glib.cc | 6 +- + src/hb-gobject-enums.cc.tmpl | 2 +- + src/hb-gobject-structs.cc | 2 +- + src/hb-graphite2.cc | 2 +- + src/hb-icu.cc | 6 +- + src/{hb-iter-private.hh => hb-iter.hh} | 8 +-- + src/{hb-machinery-private.hh => hb-machinery.hh} | 12 ++-- + src/hb-map.cc | 2 +- + src/{hb-map-private.hh => hb-map.hh} | 8 +-- + src/{hb-mutex-private.hh => hb-mutex.hh} | 8 +-- + src/hb-null.hh | 2 +- + src/{hb-object-private.hh => hb-object.hh} | 14 ++-- + src/{hb-open-file-private.hh => hb-open-file.hh} | 8 +-- + src/{hb-open-type-private.hh => hb-open-type.hh} | 14 ++-- + src/hb-ot-cmap-table.hh | 4 +- + src/hb-ot-color-cbdt-table.hh | 2 +- + src/hb-ot-color-colr-table.hh | 2 +- + src/hb-ot-color-cpal-table.hh | 2 +- + src/hb-ot-color-sbix-table.hh | 2 +- + src/hb-ot-color-svg-table.hh | 2 +- + src/hb-ot-color.cc | 6 +- + src/hb-ot-font.cc | 6 +- + src/hb-ot-glyf-table.hh | 4 +- + src/hb-ot-hdmx-table.hh | 2 +- + src/hb-ot-head-table.hh | 2 +- + src/hb-ot-hhea-table.hh | 2 +- + src/hb-ot-hmtx-table.hh | 2 +- + src/hb-ot-kern-table.hh | 2 +- + src/hb-ot-layout-base-table.hh | 4 +- + ...ut-common-private.hh => hb-ot-layout-common.hh} | 14 ++-- + src/hb-ot-layout-gdef-table.hh | 4 +- + src/hb-ot-layout-gpos-table.hh | 2 +- + src/hb-ot-layout-gsub-table.hh | 2 +- + ...subgpos-private.hh => hb-ot-layout-gsubgpos.hh} | 14 ++-- + src/hb-ot-layout-jstf-table.hh | 2 +- + src/hb-ot-layout.cc | 8 +-- + src/{hb-ot-layout-private.hh => hb-ot-layout.hh} | 16 ++--- + src/hb-ot-map.cc | 4 +- + src/{hb-ot-map-private.hh => hb-ot-map.hh} | 8 +-- + src/hb-ot-math-table.hh | 4 +- + src/hb-ot-math.cc | 4 +- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-name-table.hh | 2 +- + src/hb-ot-os2-table.hh | 2 +- + src/hb-ot-os2-unicode-ranges.hh | 2 +- + src/hb-ot-post-macroman.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 4 +- + src/hb-ot-shape-complex-arabic-win1256.hh | 2 +- + src/hb-ot-shape-complex-arabic.cc | 6 +- + ...ic-private.hh => hb-ot-shape-complex-arabic.hh} | 10 +-- + src/hb-ot-shape-complex-default.cc | 2 +- + src/hb-ot-shape-complex-hangul.cc | 2 +- + src/hb-ot-shape-complex-hebrew.cc | 2 +- + src/hb-ot-shape-complex-indic-machine.hh | 2 +- + src/hb-ot-shape-complex-indic-machine.rl | 2 +- + src/hb-ot-shape-complex-indic-table.cc | 2 +- + src/hb-ot-shape-complex-indic.cc | 4 +- + ...dic-private.hh => hb-ot-shape-complex-indic.hh} | 12 ++-- + src/hb-ot-shape-complex-khmer-machine.hh | 2 +- + src/hb-ot-shape-complex-khmer-machine.rl | 2 +- + src/hb-ot-shape-complex-khmer.cc | 4 +- + ...mer-private.hh => hb-ot-shape-complex-khmer.hh} | 10 +-- + src/hb-ot-shape-complex-myanmar-machine.hh | 2 +- + src/hb-ot-shape-complex-myanmar-machine.rl | 2 +- + src/hb-ot-shape-complex-myanmar.cc | 2 +- + ...r-private.hh => hb-ot-shape-complex-myanmar.hh} | 10 +-- + src/hb-ot-shape-complex-thai.cc | 2 +- + src/hb-ot-shape-complex-tibetan.cc | 2 +- + src/hb-ot-shape-complex-use-machine.hh | 2 +- + src/hb-ot-shape-complex-use-machine.rl | 2 +- + src/hb-ot-shape-complex-use-table.cc | 2 +- + src/hb-ot-shape-complex-use.cc | 4 +- + ...x-use-private.hh => hb-ot-shape-complex-use.hh} | 10 +-- + ...e-complex-private.hh => hb-ot-shape-complex.hh} | 12 ++-- + src/hb-ot-shape-fallback.cc | 4 +- + ...fallback-private.hh => hb-ot-shape-fallback.hh} | 10 +-- + src/hb-ot-shape-normalize.cc | 6 +- + ...rmalize-private.hh => hb-ot-shape-normalize.hh} | 8 +-- + src/hb-ot-shape.cc | 20 +++--- + src/{hb-ot-shape-private.hh => hb-ot-shape.hh} | 12 ++-- + src/hb-ot-tag.cc | 2 +- + src/hb-ot-var-avar-table.hh | 2 +- + src/hb-ot-var-fvar-table.hh | 2 +- + src/hb-ot-var-hvar-table.hh | 2 +- + src/hb-ot-var-mvar-table.hh | 2 +- + src/hb-ot-var.cc | 4 +- + src/{hb-set-digest-private.hh => hb-set-digest.hh} | 8 +-- + src/hb-set.cc | 2 +- + src/{hb-set-private.hh => hb-set.hh} | 8 +-- + src/hb-shape-plan.cc | 10 +-- + src/{hb-shape-plan-private.hh => hb-shape-plan.hh} | 10 +-- + src/hb-shape.cc | 12 ++-- + ...hb-shaper-impl-private.hh => hb-shaper-impl.hh} | 16 ++--- + src/hb-shaper.cc | 6 +- + src/{hb-shaper-private.hh => hb-shaper.hh} | 8 +-- + src/hb-static.cc | 8 +-- + src/hb-string-array.hh | 2 +- + src/hb-subset-glyf.cc | 2 +- + src/hb-subset-glyf.hh | 2 +- + src/hb-subset-input.cc | 4 +- + src/hb-subset-plan.cc | 6 +- + src/hb-subset-plan.hh | 6 +- + src/hb-subset.cc | 8 +-- + src/{hb-subset-private.hh => hb-subset.hh} | 10 +-- + src/hb-ucdn.cc | 6 +- + src/hb-unicode.cc | 6 +- + src/{hb-unicode-private.hh => hb-unicode.hh} | 8 +-- + src/hb-uniscribe.cc | 6 +- + src/{hb-utf-private.hh => hb-utf.hh} | 8 +-- + src/{hb-vector-private.hh => hb-vector.hh} | 8 +-- + src/hb-warning.cc | 6 +- + src/{hb-private.hh => hb.hh} | 12 ++-- + src/main.cc | 4 +- + src/test-buffer-serialize.cc | 2 +- + src/test-size-params.cc | 2 +- + src/test-unicode-ranges.cc | 2 +- + src/test-would-substitute.cc | 2 +- + src/test.cc | 2 +- + test/api/test-common.c | 1 - + util/Makefile.am | 4 +- + util/ansi-print.hh | 3 +- + util/hb-subset.cc | 2 +- + util/helper-cairo-ansi.hh | 2 +- + util/helper-cairo.hh | 2 +- + util/main-font-text.hh | 2 +- + util/options.hh | 2 +- + util/shape-consumer.hh | 2 +- + util/view-cairo.hh | 2 +- + 168 files changed, 452 insertions(+), 455 deletions(-) + +commit 82b12bcadd50c9e86bbe82623a1cbc0b4afdd237 +Author: Behdad Esfahbod +Date: Sat Aug 25 22:07:17 2018 -0700 + + [unicode] Add HB_UNICODE_MAX + + New API: + HB_UNICODE_MAX + + docs/harfbuzz-sections.txt | 1 + + src/hb-ot-cmap-table.hh | 8 ++------ + src/hb-unicode.h | 3 +++ + 3 files changed, 6 insertions(+), 6 deletions(-) + +commit b09a0336ca856a2b1040e7fabd5819b64749e308 +Author: Behdad Esfahbod +Date: Sat Aug 25 22:04:39 2018 -0700 + + [cmap] More hb_auto_t<>(...) + + src/hb-subset.cc | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +commit 28634db07e6ecbdb7e59ed8f989212272a97de86 +Author: Behdad Esfahbod +Date: Sat Aug 25 21:23:43 2018 -0700 + + [cmap] Fix skipping gid0 in Format4 collect_unicodes() + + src/hb-ot-cmap-table.hh | 20 ++++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +commit acce1fa3ea9707d0883cd66397fd187d3268905c +Author: Behdad Esfahbod +Date: Sat Aug 25 21:15:39 2018 -0700 + + Use new hb_auto_t<> constructor with Coverage::Iter + + src/hb-ot-layout-common-private.hh | 65 + ++++++++++++++++++++++++-------------- + src/hb-ot-layout-gsub-table.hh | 30 ++++++------------ + 2 files changed, 52 insertions(+), 43 deletions(-) + +commit ddea4d19cf6d64270e14418f02e7ff1f1b9458db +Author: Behdad Esfahbod +Date: Sat Aug 25 21:08:15 2018 -0700 + + Add 1-param passthrough constructor to hb_auto_t<> + + And use. + + src/hb-dsalgs.hh | 1 + + src/hb-ot-cmap-table.hh | 7 +++---- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit c8cfb702e96bf4e89495fcc56f965c88bfa77dca +Author: Behdad Esfahbod +Date: Sat Aug 25 16:14:32 2018 -0700 + + [cmap] Minor + + src/hb-ot-cmap-table.hh | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 1dcf5fb038e7c2d3d03a50c4cd9869a922f9adf7 +Author: Behdad Esfahbod +Date: Sat Aug 25 16:11:26 2018 -0700 + + [cmap Add hb_subset_collect_variation_unicodes() + + To be moved to hb-face.h later. + + src/hb-ot-cmap-table.hh | 59 + +++++++++++++++++++++++++++++++++++++++++-------- + src/hb-subset.cc | 25 ++++++++++++++++++++- + src/hb-subset.h | 10 +++++++-- + 3 files changed, 82 insertions(+), 12 deletions(-) + +commit 4806b3800d77603c203e8bb2e88baeb2b3a14f05 +Author: Behdad Esfahbod +Date: Sat Aug 25 15:56:07 2018 -0700 + + [cmap] Add hb_subset_collect_variation_selectors() + + To be moved to hb-face later. + + src/hb-ot-cmap-table.hh | 20 ++++++++++++++++---- + src/hb-subset.cc | 30 ++++++++++++++++++++++++++---- + src/hb-subset.h | 8 +++++++- + 3 files changed, 49 insertions(+), 9 deletions(-) + +commit 3336de24790ac1a12852ac2a3e2fff4d6bb19bc7 +Author: Behdad Esfahbod +Date: Sat Aug 25 15:41:25 2018 -0700 + + [cmap] Remove unused code + + src/hb-ot-cmap-table.hh | 10 ---------- + 1 file changed, 10 deletions(-) + +commit 1becabe06c0c58aaf69a9ba641508e77a60f3451 +Author: Behdad Esfahbod +Date: Sat Aug 25 15:37:56 2018 -0700 + + [cmap] Use bsearch to find subtables + + src/hb-ot-cmap-table.hh | 5 +---- + test/shaping/data/in-house/tests/fuzzed.tests | 2 +- + 2 files changed, 2 insertions(+), 5 deletions(-) + +commit 02fe03e09a3258e07d2d6749990f6d31dd2a8525 +Author: Behdad Esfahbod +Date: Sat Aug 25 15:33:05 2018 -0700 + + [cmap] Factor out find_best_subtable + + src/hb-ot-cmap-table.hh | 52 + +++++++++++++++++++++++++++++-------------------- + 1 file changed, 31 insertions(+), 21 deletions(-) + +commit b41c43b4e112bfa38fef35694842f242c28a7da2 +Author: Behdad Esfahbod +Date: Sat Aug 25 15:25:03 2018 -0700 + + Minor + + src/hb-ot-cmap-table.hh | 48 + ++++++++++++++++++++++++++---------------------- + 1 file changed, 26 insertions(+), 22 deletions(-) + +commit 7d382fa276f44b7b163e98d434cc79f958bf87fb +Author: Behdad Esfahbod +Date: Sat Aug 25 09:35:45 2018 -0700 + + [cmap] Implement collect_unicodes() for Format0/6/10 + + src/hb-ot-cmap-table.hh | 23 +++++++++++++++++++---- + 1 file changed, 19 insertions(+), 4 deletions(-) + +commit bd0e542525d41d9ebe51cbcab8151d65eb984b2e +Author: Behdad Esfahbod +Date: Sat Aug 25 09:33:30 2018 -0700 + + [cmap] Simplify collect_unicodes() + + Don't use accelerator (almost). Hooks up Format13 as well. + + src/hb-ot-cmap-table.hh | 52 + +++++++++++++++++++++++++++---------------------- + 1 file changed, 29 insertions(+), 23 deletions(-) + +commit d60c465627d76fcfbeb37d6b8f9382f3b84ace6e +Author: Behdad Esfahbod +Date: Sat Aug 25 08:47:06 2018 -0700 + + Rename get_all_codepoints() to collect_unicodes() + + src/hb-ot-cmap-table.hh | 26 + ++++++++++++------------- + src/hb-subset.cc | 6 +++--- + src/hb-subset.h | 4 ++-- + test/api/test-subset-codepoints.c | 18 ++++++++--------- + test/fuzzing/hb-subset-get-codepoints-fuzzer.cc | 2 +- + 5 files changed, 28 insertions(+), 28 deletions(-) + +commit 531051b8b904cf4eb6a50bacebc11c2d85e40140 +Author: Behdad Esfahbod +Date: Sat Aug 25 08:44:18 2018 -0700 + + [ot-font] Return char-not-found if mapped to gid 0 + + OpenType cmap table can use gid=0 to mean "not covered" to produce + more optimized cmap subtables. Return false from get_nominal_glyph() + for those. hb-ft already does this. + + src/hb-ot-cmap-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit aadb2a9188f143126392c0b0f139326dcf7f9c8d +Author: Behdad Esfahbod +Date: Sat Aug 25 08:18:53 2018 -0700 + + Add face-builder + + New API: + +hb_face_builder_create + +hb_face_builder_add_table + + docs/harfbuzz-sections.txt | 5 +- + src/hb-face.cc | 149 + +++++++++++++++++++++++++++++++++++++++++++++ + src/hb-face.h | 14 +++++ + src/hb-subset-plan.cc | 2 +- + src/hb-subset-plan.hh | 2 +- + src/hb-subset-private.hh | 7 --- + src/hb-subset.cc | 129 --------------------------------------- + 7 files changed, 169 insertions(+), 139 deletions(-) + +commit 6cac9dc9ccb76945e9dfacafc169afad4a6e1e88 +Author: Behdad Esfahbod +Date: Fri Aug 24 10:29:45 2018 -0700 + + [blob] Add as_bytes() + + src/hb-blob-private.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 29a9a0883877c598413de78cd0c61f07bc393b2c +Author: Behdad Esfahbod +Date: Fri Aug 24 10:24:45 2018 -0700 + + [sanitize] Document how sanitize machinery works + + src/hb-machinery-private.hh | 62 + +++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 62 insertions(+) + +commit 142ac5a6be6088771e0ee4b135ba753c80036a9a +Author: Behdad Esfahbod +Date: Fri Aug 24 10:07:49 2018 -0700 + + [serialize] Add copy_bytes() and copy_blob() + + src/hb-dsalgs.hh | 3 +++ + src/hb-machinery-private.hh | 21 ++++++++++++++++++++- + 2 files changed, 23 insertions(+), 1 deletion(-) + +commit 1c6b3693245d38103cab224d75262d45dc88c71c +Author: Behdad Esfahbod +Date: Wed Aug 15 20:12:25 2018 -0700 + + [ot] Rename hb_ot_layout_t to hb_ot_face_data_t + + src/hb-aat-layout.cc | 17 +----- + src/hb-ot-color.cc | 6 +-- + src/hb-ot-layout-gpos-table.hh | 6 +-- + src/hb-ot-layout-gsub-table.hh | 8 ++- + src/hb-ot-layout-gsubgpos-private.hh | 2 +- + src/hb-ot-layout-private.hh | 12 ++--- + src/hb-ot-layout.cc | 100 + +++++++++++++++++------------------ + src/hb-ot-math.cc | 2 +- + src/hb-ot-shape.cc | 5 +- + src/hb-ot-var.cc | 4 +- + 10 files changed, 71 insertions(+), 91 deletions(-) + +commit 27c32d8afbdf5b587b14f3b194f79882680348ba +Author: Michiharu Ariza +Date: Wed Aug 22 11:36:39 2018 -0700 + + fixed "Fixed" number decoding + + src/hb-cff-interp-common-private.hh | 11 ++++++++++- + src/hb-cff-interp-cs-common-private.hh | 4 ++-- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 811a651bbd3f1bda7ed8eaee9af8e9dbbc8f80de +Author: Michiharu Ariza +Date: Mon Aug 20 14:04:46 2018 -0700 + + fixed bugs with empty CFFIndex, fullset FDMap + + src/hb-ot-cff-common-private.hh | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +commit 5cde2f55cd2f8917954f3a3f60bd571c86b3aa59 +Author: Michiharu Ariza +Date: Fri Aug 17 16:50:13 2018 -0700 + + drop hints from CFF & CFF2 Private + + src/hb-cff-interp-dict-common-private.hh | 24 ++++++++++++++ + src/hb-subset-cff1.cc | 53 + +++++++++++++++++++++++++++--- + src/hb-subset-cff2.cc | 55 + +++++++++++++++++++++++++++++--- + 3 files changed, 123 insertions(+), 9 deletions(-) + +commit cef75ea41a513a612a683bced27ced31761204b5 +Author: Michiharu Ariza +Date: Fri Aug 17 13:13:18 2018 -0700 + + Added CFF2 Subr nullifier + + along with CFF2 charstring interpreter + factored out common code between CFF1 & CFF2 to CSInterpreter + moved fetch_op from Interpreter to InterpEnv + misc code clean up & bug fixes + + src/Makefile.sources | 1 + + src/hb-cff-interp-common-private.hh | 44 +++++++-------- + src/hb-cff-interp-cs-common-private.hh | 95 + +++++++++++++++++++++++++++++-- + src/hb-cff-interp-dict-common-private.hh | 3 +- + src/hb-cff1-interp-cs.hh | 82 --------------------------- + src/hb-cff2-interp-cs.hh | 97 + ++++++++++++++++++++++++++++++++ + src/hb-ot-cff-common-private.hh | 4 ++ + src/hb-ot-cff2-table.hh | 7 ++- + src/hb-subset-cff1.cc | 1 + + src/hb-subset-cff2.cc | 62 ++++++++++++++++++-- + 10 files changed, 278 insertions(+), 118 deletions(-) + +commit f57d6bcbca276cec54d1e5308c308265e8e983b9 +Author: Michiharu Ariza +Date: Thu Aug 16 08:03:46 2018 -0700 + + renamed CFF::Index to CFF::CFFIndex + + to avoid confusion with OT::Index + + src/hb-ot-cff-common-private.hh | 38 + +++++++++++++++++++------------------- + src/hb-ot-cff1-table.hh | 4 ++-- + src/hb-ot-cff2-table.hh | 2 +- + src/hb-subset-cff2.cc | 4 ++-- + 4 files changed, 24 insertions(+), 24 deletions(-) + +commit c4ae426a3d3f9411b94d35745ca0e14677cd7bdb +Author: Michiharu Ariza +Date: Thu Aug 16 00:59:46 2018 -0700 + + treat h/vstem the same as h/vstemhm + + src/hb-cff1-interp-cs.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit e67bb3fbcf39385ea1db136aeca61291364fb75b +Author: Michiharu Ariza +Date: Thu Aug 16 00:25:57 2018 -0700 + + renamed OT::cff to OT::cff1 for consistency + + along with HB_OT_TAG_cff1 + + src/hb-ot-cff1-table.hh | 14 +++++++------- + src/hb-subset-cff1.cc | 16 ++++++++-------- + src/hb-subset.cc | 4 ++-- + 3 files changed, 17 insertions(+), 17 deletions(-) + +commit fdbfa1848b2f279c0f7a885bc1a985fa3375cfcd +Author: Michiharu Ariza +Date: Thu Aug 16 00:13:09 2018 -0700 + + renamed CFF version 1 structs and sources to CFF1 from CFF + + "CFF" is used for shared structs & sources between CFF1 & CFF2 + except OT:cff is for CFF version 1 table + + src/Makefile.sources | 8 +- + src/{hb-cff-interp-cs.hh => hb-cff1-interp-cs.hh} | 22 ++-- + src/{hb-ot-cff-table.hh => hb-ot-cff1-table.hh} | 150 + +++++++++++----------- + src/hb-ot-font.cc | 2 +- + src/{hb-subset-cff.cc => hb-subset-cff1.cc} | 86 ++++++------- + src/{hb-subset-cff.hh => hb-subset-cff1.hh} | 8 +- + src/hb-subset.cc | 2 +- + 7 files changed, 139 insertions(+), 139 deletions(-) + +commit 867f68bd8a74634ac6220bd76c8bafe3e2226041 +Author: Michiharu Ariza +Date: Wed Aug 15 15:53:50 2018 -0700 + + fix build attempt ^7 + + src/hb-subset-cff2.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 685db67bb07505729fdb997129ffd068bbe3c40d +Author: Michiharu Ariza +Date: Wed Aug 15 15:45:17 2018 -0700 + + fix build attempt ^6 + + src/hb-subset-cff2.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 2810caafeb9a621d53653f454dab0fa3e7f5c4a3 +Author: Michiharu Ariza +Date: Wed Aug 15 15:30:24 2018 -0700 + + fix build attempt ^5 + + src/hb-subset-cff2.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 25b8310b2a3e074c9d1d723ab6d10a29f8d189be +Merge: 7aa23f35 22defe09 +Author: Michiharu Ariza +Date: Wed Aug 15 15:00:55 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 7aa23f3597e4783b88ad526021cc4cafc05395f2 +Author: Michiharu Ariza +Date: Wed Aug 15 15:00:32 2018 -0700 + + fix build attempt ^4 + + src/hb-cff-interp-cs.hh | 10 +++++----- + src/hb-subset-cff.cc | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit 270452a44653773b3dc584729ec438ff922e2739 +Author: Michiharu Ariza +Date: Wed Aug 15 13:15:08 2018 -0700 + + fix build attempt ^3 + + src/hb-cff-interp-common-private.hh | 2 -- + src/hb-cff-interp-cs-common-private.hh | 1 + + src/hb-cff-interp-cs.hh | 1 + + src/hb-subset-cff.cc | 2 +- + 4 files changed, 3 insertions(+), 3 deletions(-) + +commit c234839f25e68700c3489c55fda2773f2e00eecb +Author: Michiharu Ariza +Date: Wed Aug 15 13:04:43 2018 -0700 + + fix build attempt ^2 + + src/hb-cff-interp-common-private.hh | 2 ++ + src/hb-cff-interp-cs-common-private.hh | 6 +++--- + src/hb-cff-interp-cs.hh | 6 +++--- + src/hb-cff-interp-dict-common-private.hh | 6 +++--- + src/hb-subset-cff.cc | 6 +++--- + 5 files changed, 14 insertions(+), 12 deletions(-) + +commit eab07e713a67da2c5b368c59808f7e2db1cf0b0b +Author: Michiharu Ariza +Date: Wed Aug 15 12:15:55 2018 -0700 + + fix build + + src/Makefile.sources | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 633ce88de93f5c565ee7fb8acdbd93c57779524b +Author: Michiharu Ariza +Date: Wed Aug 15 12:00:19 2018 -0700 + + CFF Subrs subsetting + + Unreferenced subroutines are nullified (not removed) in a subset font + + Separate Interpreter struct from hb-ot-cff-common-private.hh in a + set of four header files, augmented for CharString (CS): + hb-cff-interp-common-private.hh + hb-cff-interp-dict-common-private.hh + hb-cff-interp-cs-common-private.hh + hb-cff-interp-cs.hh + + Interpreter runtime is separated off as a new struct InterpEnv + sub-classed differently for Dict and CharString (CS) + + src/Makefile.sources | 8 +- + src/hb-cff-interp-common-private.hh | 581 + +++++++++++++++++++++++++++++++ + src/hb-cff-interp-cs-common-private.hh | 174 +++++++++ + src/hb-cff-interp-cs.hh | 282 +++++++++++++++ + src/hb-cff-interp-dict-common-private.hh | 183 ++++++++++ + src/hb-ot-cff-common-private.hh | 562 + ++---------------------------- + src/hb-ot-cff-table.hh | 165 ++++----- + src/hb-ot-cff2-table.hh | 147 ++++---- + src/hb-subset-cff-common-private.hh | 83 +++++ + src/hb-subset-cff.cc | 118 +++++-- + src/hb-subset-cff2.cc | 38 +- + 11 files changed, 1585 insertions(+), 756 deletions(-) + +commit 22defe0965adddaa09eebc13df7fa6c64e2abba3 +Author: Emil A Eklund +Date: Tue Aug 14 14:47:20 2018 -0700 + + Add guard around free_static_C_locale + + Add HB_USE_ATEXIT guard around free_static_C_locale missed by previous + commit. + + src/hb-common.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7112c6413ca7a1773847fe258145cc5162420953 +Author: Emil A Eklund +Date: Tue Aug 14 13:50:24 2018 -0700 + + Guard free_static function definitions with macro + + Add HB_USE_ATEXIT macros around free_static function definitions to + avoid unused function compiler warnings/errors. + + src/hb-ft.cc | 5 ++++- + src/hb-glib.cc | 3 ++- + src/hb-icu.cc | 3 ++- + src/hb-ot-font.cc | 3 ++- + src/hb-shape.cc | 4 +++- + src/hb-shaper.cc | 3 ++- + 6 files changed, 15 insertions(+), 6 deletions(-) + +commit 63be5dcdde61275822d931b2924425478bc1dac1 +Author: Behdad Esfahbod +Date: Tue Aug 14 10:59:34 2018 -0700 + + 1.8.8 + + NEWS | 18 ++++++++++++++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 21 insertions(+), 3 deletions(-) + +commit c9a22fa124310c98c73b8d7b495ed354542a75de +Author: Behdad Esfahbod +Date: Mon Aug 13 17:02:21 2018 -0700 + + [icu] Pass normalizer instance down as user_data + + src/hb-icu.cc | 23 +++++++++-------------- + 1 file changed, 9 insertions(+), 14 deletions(-) + +commit f0ef096b8cab33aa9e26edba9b15696bf907e268 +Author: Behdad Esfahbod +Date: Mon Aug 13 10:30:41 2018 -0700 + + Don't add reference in get_unicode_funcs() functions + + Users don't expect a new reference returned from a get() function. + Indeed, all users of that API I foud where NOT destroying the + reference. + Just change the implementations to NOT return a reference. + + This applies to the following APIs: + hb_unicode_funcs_get_default() + hb_glib_get_unicode_funcs() + hb_icu_get_unicode_funcs() + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1134 + + src/hb-buffer.cc | 3 +-- + src/hb-glib.cc | 2 +- + src/hb-icu.cc | 2 +- + src/hb-ucdn.cc | 2 +- + 4 files changed, 4 insertions(+), 5 deletions(-) + +commit 9bbd1cdf068635f4a737f1fc9ab54ba075601a5d +Author: Behdad Esfahbod +Date: Sun Aug 12 18:20:53 2018 -0700 + + [uniscribe] Use lazy loader + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1129 + + src/hb-uniscribe.cc | 56 + +++++++++++++++++++++++++++-------------------------- + 1 file changed, 29 insertions(+), 27 deletions(-) + +commit 266368993625e0cfb6eef9188f8b9aa29fb97391 +Author: Behdad Esfahbod +Date: Sun Aug 12 18:10:59 2018 -0700 + + Another clang bot fix + + src/hb-shape.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 989e71a982658145f28f83f2111bdab9561f3db0 +Author: Behdad Esfahbod +Date: Sun Aug 12 17:47:59 2018 -0700 + + Silence clang + + src/hb-machinery-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6750ec692cdd682bd33cb1c37b137cf3bb641d43 +Author: Behdad Esfahbod +Date: Sun Aug 12 17:42:16 2018 -0700 + + [lazy] Use for C_locale + + src/hb-common.cc | 60 + ++++++++++++++++++++++++++++---------------------------- + 1 file changed, 30 insertions(+), 30 deletions(-) + +commit 747d2564e6bdcc15cf6a197e543fb732924159c5 +Author: Behdad Esfahbod +Date: Sun Aug 12 17:32:10 2018 -0700 + + [lazy] Port more + + src/hb-machinery-private.hh | 1 - + src/hb-shaper.cc | 78 + ++++++++++++++++++++------------------------- + src/hb-uniscribe.cc | 3 +- + 3 files changed, 37 insertions(+), 45 deletions(-) + +commit 7bd508a0c4ce426f474bfcc729cb39207dd1f7b4 +Author: Behdad Esfahbod +Date: Sun Aug 12 17:19:55 2018 -0700 + + [lazy] Rename free() + + src/hb-ft.cc | 4 ++-- + src/hb-glib.cc | 2 +- + src/hb-icu.cc | 2 +- + src/hb-machinery-private.hh | 4 ++-- + src/hb-ot-font.cc | 2 +- + src/hb-shape.cc | 6 +++--- + src/hb-ucdn.cc | 2 +- + 7 files changed, 11 insertions(+), 11 deletions(-) + +commit a3b97db910662e26bafe6e6bc1c36b437f4ed931 +Author: Behdad Esfahbod +Date: Sun Aug 12 17:14:32 2018 -0700 + + [lazy] Port more to it + + src/hb-shape.cc | 75 + +++++++++++++++++++++++++++++---------------------------- + 1 file changed, 38 insertions(+), 37 deletions(-) + +commit 6901090945d7e16102f3a2b168465434032b9a09 +Author: Behdad Esfahbod +Date: Sun Aug 12 16:57:06 2018 -0700 + + [lazy] Make hb_lazy_loader_t<> more usable + + src/hb-ft.cc | 7 +++--- + src/hb-machinery-private.hh | 57 + +++++++++++++++++++++++++++------------------ + 2 files changed, 37 insertions(+), 27 deletions(-) + +commit bb905e9afcc3eb28a22ba78c09e661a814d04c1f +Author: Behdad Esfahbod +Date: Sun Aug 12 16:40:08 2018 -0700 + + [lazy] Minor + + src/hb-machinery-private.hh | 36 ++++++++++++++++++------------------ + src/hb-ot-font.cc | 8 ++++---- + 2 files changed, 22 insertions(+), 22 deletions(-) + +commit 3945cd78a96bdd287e203a0261bac490df1314b0 +Author: Behdad Esfahbod +Date: Sun Aug 12 16:33:48 2018 -0700 + + Minor + + src/hb-machinery-private.hh | 4 ---- + 1 file changed, 4 deletions(-) + +commit c21a1b95dffedb6ed66b384f4adf07e6d05d4b9f +Author: Behdad Esfahbod +Date: Sun Aug 12 16:30:39 2018 -0700 + + [icu] Use get_relaxed for normalizer access + + We've had the proper barriers already. No need for more with + every access. + + src/hb-icu.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 125fefa2a6b23cf7eb4559904b23aff3731d5dba +Author: Behdad Esfahbod +Date: Sun Aug 12 16:29:41 2018 -0700 + + [icu] Fix for breakage after recent change + + src/hb-icu.cc | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit 53442be1edc73993bdcaffc4b895c07f1ea03ba0 +Author: Behdad Esfahbod +Date: Sun Aug 12 16:20:11 2018 -0700 + + [lazy] Use for ft_library + + src/hb-ft.cc | 61 + ++++++++++++++++++++++----------------------- + src/hb-glib.cc | 2 +- + src/hb-icu.cc | 2 +- + src/hb-machinery-private.hh | 2 +- + src/hb-ot-font.cc | 2 +- + src/hb-ucdn.cc | 2 +- + 6 files changed, 35 insertions(+), 36 deletions(-) + +commit 7a8d480378af4094645dfb1527a61a94b4786b54 +Author: Behdad Esfahbod +Date: Sun Aug 12 16:00:13 2018 -0700 + + [lazy] Add .free() + + src/hb-ft.cc | 2 +- + src/hb-glib.cc | 2 +- + src/hb-icu.cc | 2 +- + src/hb-machinery-private.hh | 4 ++++ + src/hb-ot-font.cc | 2 +- + src/hb-ucdn.cc | 2 +- + 6 files changed, 9 insertions(+), 5 deletions(-) + +commit c7ca30a5337cb660e650d51ddd17d389909357c2 +Author: Behdad Esfahbod +Date: Sun Aug 12 13:46:53 2018 -0700 + + [ot/ft] Port font_funcs statis to lazy-loader + + src/hb-ft.cc | 56 + ++++++++++++++++++++++----------------------- + src/hb-machinery-private.hh | 14 ++++++++++++ + src/hb-ot-font.cc | 49 +++++++++++++++++---------------------- + 3 files changed, 62 insertions(+), 57 deletions(-) + +commit cb3fc3685c03c8ed07bcf05188f5d6c582fd5aaa +Author: Behdad Esfahbod +Date: Sun Aug 12 13:39:01 2018 -0700 + + [ucdn/glib/icu] Port unicode_funcs statics to lazy-loader + + src/hb-glib.cc | 50 ++++++++++++++++++-------------------- + src/hb-icu.cc | 59 + ++++++++++++++++----------------------------- + src/hb-machinery-private.hh | 28 ++++++++++++++++----- + src/hb-ucdn.cc | 51 +++++++++++++++++---------------------- + 4 files changed, 88 insertions(+), 100 deletions(-) + +commit 1b6b481262465ae1865c66c4d499b4b2c8d297fb +Author: Behdad Esfahbod +Date: Sun Aug 12 13:16:40 2018 -0700 + + [lazy] Allow calling fini() multiple times + + src/hb-machinery-private.hh | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 918ad9f5d9b85384f24157523272a4ffc1927d16 +Author: Behdad Esfahbod +Date: Sun Aug 12 13:12:29 2018 -0700 + + [lazy] More + + src/hb-machinery-private.hh | 45 + +++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 37 insertions(+), 8 deletions(-) + +commit 5abdf5eebadf9a4fbd50c1a893c9654de74d22ac +Author: Behdad Esfahbod +Date: Sun Aug 12 12:40:24 2018 -0700 + + [lazy] More shuffle + + src/hb-machinery-private.hh | 80 + +++++++++++++++++++-------------------------- + 1 file changed, 34 insertions(+), 46 deletions(-) + +commit 5d9863be6ecf873033cbab732207dd420f3866e7 +Author: Behdad Esfahbod +Date: Sun Aug 12 12:27:47 2018 -0700 + + Minor + + src/hb-machinery-private.hh | 6 ++++-- + src/hb-ot-layout-private.hh | 2 +- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit f9a3eab81008c01a458d16f274b1a0eaaae00e7c +Author: Behdad Esfahbod +Date: Sun Aug 12 12:21:56 2018 -0700 + + Add explicit_operator + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1127 + + src/hb-iter-private.hh | 2 +- + src/hb-private.hh | 15 ++++++++++++++- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit 470acb6c322fc64556d59847d829d95caa2d51e6 +Author: Behdad Esfahbod +Date: Sun Aug 12 12:09:20 2018 -0700 + + Rename + + src/hb-machinery-private.hh | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 39607dc98e433ef577c1de0f309ce40fc40529be +Author: Martin Hosken +Date: Thu Aug 9 15:16:32 2018 +0700 + + Support _ in feature ids + + src/hb-common.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a3a8c85b027779365bb33e2063221b4650fbac3b +Merge: 145f371d 652cd45c +Author: Michiharu Ariza +Date: Fri Aug 10 13:41:42 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 145f371d71965b86635025c73117db0e24f2df75 +Author: Michiharu Ariza +Date: Fri Aug 10 13:07:53 2018 -0700 + + fixed TRACE build failure + + src/hb-ot-cff-common-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a97ed342d18bdb262400c8ab6501df110fe4e18f +Author: Michiharu Ariza +Date: Fri Aug 10 12:55:22 2018 -0700 + + fixed inclusion of excluded Private & local Subrs + + It was bloating a multi-FD subset font unnecessarily + defined a wrapper struct FDMap for fdmap + + src/hb-ot-cff-common-private.hh | 34 ++++++++++++++++++++----- + src/hb-subset-cff-common-private.cc | 6 ++--- + src/hb-subset-cff-common-private.hh | 4 +-- + src/hb-subset-cff.cc | 48 + +++++++++++++++++++---------------- + src/hb-subset-cff2.cc | 50 + ++++++++++++++++++++----------------- + 5 files changed, 87 insertions(+), 55 deletions(-) + +commit 64c541226457907ec1801a5766050ee64feb67e8 +Author: Michiharu Ariza +Date: Fri Aug 10 11:07:07 2018 -0700 + + Added CFF support + + Added sources hb-ot-cff-table.hh, hb-subset-cff.cc & hh + Templatized Index because CFF uses 16-bit count while CFF2 uses 32-bit + Misc code cleanup & bug fixes + + src/Makefile.sources | 9 +- + src/hb-ot-cff-common-private.hh | 477 ++++++++++++------- + src/hb-ot-cff-table.hh | 919 + ++++++++++++++++++++++++++++++++++++ + src/hb-ot-cff2-table.hh | 235 ++++----- + src/hb-ot-font.cc | 1 + + src/hb-subset-cff-common-private.cc | 6 +- + src/hb-subset-cff-common-private.hh | 4 +- + src/hb-subset-cff.cc | 560 ++++++++++++++++++++++ + src/hb-subset-cff.hh | 38 ++ + src/hb-subset-cff2.cc | 104 ++-- + src/hb-subset.cc | 4 + + 11 files changed, 1991 insertions(+), 366 deletions(-) + +commit 652cd45c650b1cdce2585dcee614e5a9cdda530c +Author: Behdad Esfahbod +Date: Thu Aug 9 01:02:02 2018 -0700 + + [coretext] Another try + + src/hb-coretext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3f3585ca1406edd74138f78739612c167ab57913 +Author: Behdad Esfahbod +Date: Thu Aug 9 00:58:17 2018 -0700 + + Fix coretext build (hopefully) + + src/hb-coretext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aa3b6017ed71fc251522ff1bedcdae965b4c1c1c +Author: Behdad Esfahbod +Date: Thu Aug 9 00:56:28 2018 -0700 + + Revert "[iter] Make operator bool explicit" + + This reverts commit 66920a6bace7c54c8166c4ed938b6ffc5fabcf2b. + + Some of our bots (Oracle Studio and Apple gcc 4.2) do not allow + explicit except for constructors. + + https://github.com/harfbuzz/harfbuzz/issues/1127 + + src/hb-iter-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e1a2354220c369bd5a62d255acc42c60cd14c473 +Author: Behdad Esfahbod +Date: Thu Aug 9 00:53:25 2018 -0700 + + [atomic] More + + src/hb-atomic-private.hh | 2 -- + src/hb-object-private.hh | 7 +++++-- + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit f1f4b45ac3d228a6b11e33357725de065e2ba2be +Author: Behdad Esfahbod +Date: Thu Aug 9 00:28:40 2018 -0700 + + Fix lazy_loader fini() + + Was creating object even if wasn't there. + + src/hb-machinery-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1f7380944df9aa81cd48a4764c763d692533c4a6 +Author: Behdad Esfahbod +Date: Thu Aug 9 00:22:37 2018 -0700 + + [atomic] Add hb_atomic_ptr_t<> and port all uses + + Found and fixed a couple bugs. + + Found a couple multithreading issues. Marked them with "XXX-MT-bug". + + src/hb-atomic-private.hh | 34 +++++++++++++++++++++++++++++++--- + src/hb-common.cc | 34 ++++++++++++++++++---------------- + src/hb-face-private.hh | 3 ++- + src/hb-face.cc | 6 +++--- + src/hb-font.cc | 2 +- + src/hb-ft.cc | 22 ++++++++++++---------- + src/hb-glib.cc | 11 ++++++----- + src/hb-graphite2.cc | 16 +++++++++------- + src/hb-icu.cc | 22 ++++++++++++---------- + src/hb-machinery-private.hh | 17 +++++++++-------- + src/hb-object-private.hh | 29 +++++++++++++++-------------- + src/hb-ot-font.cc | 11 ++++++----- + src/hb-ot-layout-private.hh | 2 +- + src/hb-ot-post-table.hh | 9 +++++---- + src/hb-ot-shape-complex-arabic.cc | 9 +++++---- + src/hb-shape-plan.cc | 19 +++++++++++-------- + src/hb-shape.cc | 11 ++++++----- + src/hb-shaper-impl-private.hh | 2 +- + src/hb-shaper-private.hh | 16 +++++++++------- + src/hb-shaper.cc | 18 ++++++++++-------- + src/hb-ucdn.cc | 11 ++++++----- + src/hb-uniscribe.cc | 14 +++++++------- + 22 files changed, 185 insertions(+), 133 deletions(-) + +commit 6e42f4c53ff52cc242051e80600e19513136f6d1 +Author: Behdad Esfahbod +Date: Wed Aug 8 22:51:35 2018 -0700 + + [atomic] Remove hb_atomic_int_impl_t now that it's always int + + src/hb-atomic-private.hh | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +commit 1227a9e5a5befffa688c1cce141533fd80144d14 +Author: Behdad Esfahbod +Date: Wed Aug 8 22:45:49 2018 -0700 + + [atomic] Unify typedef + + Removes volatile from fallback implementation. That was handwavy + anyway. + + src/hb-atomic-private.hh | 22 ++++++++-------------- + 1 file changed, 8 insertions(+), 14 deletions(-) + +commit 5cd1888c9dcb8b32bcfe08be38bdd13fd8a09b5e +Author: Behdad Esfahbod +Date: Wed Aug 8 22:43:53 2018 -0700 + + [atomic] Change Mac atomic int type to int + + If ever int is not 32bit, we'll fix this... + + src/hb-atomic-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e1de86eac188e804c6737fcad66ae09cf25ef221 +Author: Behdad Esfahbod +Date: Wed Aug 8 22:42:33 2018 -0700 + + [atomic] Change Windows atomic int type to int + + src/hb-atomic-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit aee2d10b2bf09814b32bccdecd4c3fbebafc542e +Author: Behdad Esfahbod +Date: Wed Aug 8 22:40:10 2018 -0700 + + [atomic] Change Solaris atomic int to signed + + src/hb-atomic-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit b6fdcf4f8bd09e065c767939125861c9dc8ff18f +Author: Behdad Esfahbod +Date: Wed Aug 8 21:54:08 2018 -0700 + + 1.8.7 + + NEWS | 6 ++++++ + RELEASING.md | 3 +++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 4 files changed, 12 insertions(+), 3 deletions(-) + +commit 51ffc3e65aacbece63995be99e2bc20538e3eb75 +Author: Behdad Esfahbod +Date: Wed Aug 8 22:01:04 2018 -0700 + + Fix previous commit to use atomic operations + + src/hb-machinery-private.hh | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 883957688cc4aa4335e5131a60b3ac3b53290726 +Author: Behdad Esfahbod +Date: Wed Aug 8 21:42:18 2018 -0700 + + Fix assertion failure + + https://bugzilla.mozilla.org/show_bug.cgi?id=1476334 + + src/hb-machinery-private.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit e49a38b20e82e50bca96751470e945cbe0524880 +Author: Behdad Esfahbod +Date: Tue Aug 7 09:55:42 2018 -0700 + + 1.8.6 + + NEWS | 15 +++++++++++++++ + configure.ac | 2 +- + src/hb-font.cc | 6 +++--- + src/hb-font.h | 4 ++-- + src/hb-version.h | 4 ++-- + 5 files changed, 23 insertions(+), 8 deletions(-) + +commit b0ff79acd804e47a2a3db73746cf9c6dc986950a +Author: Behdad Esfahbod +Date: Tue Aug 7 09:52:06 2018 -0700 + + Add +hb_font_get_glyph_advances_for_direction + + New API: + +hb_font_get_glyph_advances_for_direction + + docs/harfbuzz-sections.txt | 1 + + src/hb-font-private.hh | 12 ++++++++++++ + src/hb-font.cc | 20 ++++++++++++++++++++ + src/hb-font.h | 8 ++++++++ + 4 files changed, 41 insertions(+) + +commit 28e2f467e1c7dd5e82d105efa8c4580dbfc93960 +Author: Behdad Esfahbod +Date: Tue Aug 7 09:47:00 2018 -0700 + + Actually add hb_font_get_glyph_[hv]_advances + + New API: + +hb_font_get_glyph_h_advances + +hb_font_get_glyph_v_advances + + src/hb-font.cc | 37 +++++++++++++++++++++++++++++++++++++ + src/hb-font.h | 15 +++++++++++++++ + 2 files changed, 52 insertions(+) + +commit 996775191a3fdeeeaee80e3123ef2240e6390b3d +Author: Behdad Esfahbod +Date: Tue Aug 7 09:44:01 2018 -0700 + + Minor + + src/hb-font-private.hh | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 3d7c555a19ca0725c386aa6da648ecf2ae50fc19 +Author: Behdad Esfahbod +Date: Tue Aug 7 09:37:52 2018 -0700 + + Remove get_advances_nil and alias it to get_advances_default + + src/hb-font.cc | 36 ++---------------------------------- + 1 file changed, 2 insertions(+), 34 deletions(-) + +commit 66920a6bace7c54c8166c4ed938b6ffc5fabcf2b +Author: Behdad Esfahbod +Date: Mon Aug 6 15:32:13 2018 -0700 + + [iter] Make operator bool explicit + + We would need to write: + + for (Iter it (...); bool (t); t++) + + instead of: + + for (Iter it (...); t; t++) + + But I think it's an improvement in code readability in the long term. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1127 + + src/hb-iter-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 161ece4c3097096f355dc5ea514320a8dc678bea +Merge: e8d695eb 79e21984 +Author: Michiharu Ariza +Date: Mon Aug 6 11:23:50 2018 -0700 + + Merge branch 'master' into cff-subset + +commit e8d695ebaa4b5d36d907042fb6930244e87b1e29 +Author: Michiharu Ariza +Date: Mon Aug 6 11:13:06 2018 -0700 + + removed CMakeCache.txt + + build/CMakeCache.txt | 1 - + 1 file changed, 1 deletion(-) + +commit 9fae33b9f3fd7fce816c3db71089db4ce0c82d4c +Author: Michiharu Ariza +Date: Mon Aug 6 10:44:12 2018 -0700 + + Silence Codacy + + build/CMakeCache.txt | 1 + + src/hb-subset-cff-common-private.cc | 8 +++++--- + src/hb-subset-cff2.cc | 4 +++- + 3 files changed, 9 insertions(+), 4 deletions(-) + +commit 5561b818498431adb52f958d1e9589620f0e6539 +Author: Michiharu Ariza +Date: Mon Aug 6 10:04:53 2018 -0700 + + subset FDSelect and FDArray + + Added a set of sources hb-subset-cff-common-private.cc & .hh for + FDSelect subseting code. + Added FDSelect format 4 (CFF2 only) support. Shared its implementation + with format 3 as a template. + + src/Makefile.sources | 2 + + src/hb-ot-cff-common-private.hh | 130 ++++++++++++++++------- + src/hb-ot-cff2-table.hh | 71 ++++++++++++- + src/hb-subset-cff-common-private.cc | 200 + ++++++++++++++++++++++++++++++++++++ + src/hb-subset-cff-common-private.hh | 54 ++++++++++ + src/hb-subset-cff2.cc | 71 ++++++++++--- + 6 files changed, 476 insertions(+), 52 deletions(-) + +commit 79e21984b13bdb879f3007ba9a97fde47df340d3 +Author: Behdad Esfahbod +Date: Mon Aug 6 09:45:17 2018 -0700 + + Add batch advance width callback function + + New API: + +hb_font_funcs_set_glyph_h_advances_func + +hb_font_funcs_set_glyph_v_advances_func + +hb_font_get_glyph_h_advances + +hb_font_get_glyph_h_advances_func_t + +hb_font_get_glyph_v_advances + +hb_font_get_glyph_v_advances_func_t + + docs/harfbuzz-sections.txt | 6 + + src/hb-font-private.hh | 41 +++++-- + src/hb-font.cc | 299 + +++++++++++++++++++++++++++------------------ + src/hb-font.h | 53 ++++++-- + src/hb-ot-shape.cc | 3 +- + 5 files changed, 255 insertions(+), 147 deletions(-) + +commit 9533364cc3a8cccbae793de1873a727de73f64d5 +Author: Koji Ishii +Date: Wed Aug 1 13:01:08 2018 +0900 + + batchwidth + + src/hb-font-private.hh | 13 +++++++++++++ + src/hb-font.cc | 37 +++++++++++++++++++++++++++++++++++++ + src/hb-font.h | 15 +++++++++++++++ + src/hb-ot-shape.cc | 4 ++-- + 4 files changed, 67 insertions(+), 2 deletions(-) + +commit b912fbea17c50e229977345012227810ed7641e9 +Author: Behdad Esfahbod +Date: Mon Aug 6 06:30:12 2018 -0700 + + Remove most uses of direct comparison to Null objects + + src/hb-ot-glyf-table.hh | 6 +++--- + src/hb-ot-head-table.hh | 4 ++-- + src/hb-ot-layout-gdef-table.hh | 1 + + src/hb-ot-layout-gsubgpos-private.hh | 1 + + src/hb-ot-layout.cc | 6 +++--- + src/hb-ot-math-table.hh | 2 ++ + src/hb-ot-math.cc | 2 +- + src/hb-ot-shape-complex-arabic-fallback.hh | 3 ++- + src/hb-ot-var-fvar-table.hh | 2 ++ + src/hb-ot-var.cc | 2 +- + src/hb-subset.cc | 2 +- + src/main.cc | 2 +- + 12 files changed, 20 insertions(+), 13 deletions(-) + +commit 3506672ce9d8685ce4e113716b0d06adbc7981b7 +Author: Behdad Esfahbod +Date: Mon Aug 6 06:17:48 2018 -0700 + + Port _nil objects to Null() machinery + + Finally, unified! + + src/hb-blob-private.hh | 1 + + src/hb-blob.cc | 29 ++++++------- + src/hb-buffer-private.hh | 4 +- + src/hb-buffer.cc | 44 ++++++++++---------- + src/hb-face-private.hh | 6 +-- + src/hb-face.cc | 5 ++- + src/hb-font-private.hh | 10 +++-- + src/hb-font.cc | 66 + ++++++++++++++++-------------- + src/hb-null.hh | 11 ++++- + src/hb-ot-shape-complex-arabic-fallback.hh | 11 +++-- + src/hb-shape-plan-private.hh | 1 + + src/hb-shape-plan.cc | 50 +++++++++++----------- + src/hb-unicode-private.hh | 7 ++-- + src/hb-unicode.cc | 5 ++- + 14 files changed, 137 insertions(+), 113 deletions(-) + +commit 1abd427acfb7229b8607646bdde59f29306b86e1 +Author: Behdad Esfahbod +Date: Mon Aug 6 05:53:35 2018 -0700 + + [BASE] Rename horzi/vert to h/v + + src/hb-ot-layout-base-table.hh | 68 + +++++++++++++++++++++--------------------- + 1 file changed, 34 insertions(+), 34 deletions(-) + +commit da48aca1be89efbb8b3ca4471f542aa54aff17c4 +Author: Behdad Esfahbod +Date: Mon Aug 6 05:52:12 2018 -0700 + + [BASE] Misc fixes + + The code was badly broken. In better shape now, but still, needs + a full review before ever working. + + src/hb-ot-layout-base-table.hh | 163 + +++++++++++++++++------------------------ + 1 file changed, 68 insertions(+), 95 deletions(-) + +commit f9cfa5cb0e70203279e74fb6adb0cd4570238ff8 +Author: Behdad Esfahbod +Date: Mon Aug 6 05:29:15 2018 -0700 + + Change null-pool specialization to min_size again + + src/hb-null.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 25147ff8086ab65995fe046cfdf8007604de6962 +Author: Behdad Esfahbod +Date: Mon Aug 6 05:01:52 2018 -0700 + + Move Null system to hb-null.hh + + src/Makefile.sources | 1 + + src/hb-null.hh | 97 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-private.hh | 65 +---------------------------------- + 3 files changed, 99 insertions(+), 64 deletions(-) + +commit f800368df33e7ec15c3e77bdb9f4b464899322d3 +Author: Behdad Esfahbod +Date: Mon Aug 6 04:58:34 2018 -0700 + + Remove unused macros + + src/hb-object-private.hh | 1 - + src/hb-vector-private.hh | 1 - + 2 files changed, 2 deletions(-) + +commit 19e0091299f06856002c702792b448b06da637a8 +Author: Behdad Esfahbod +Date: Mon Aug 6 04:54:31 2018 -0700 + + Minor + + src/hb-private.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 37be774af921812018f723521b90f2ab54f661c5 +Author: Behdad Esfahbod +Date: Mon Aug 6 04:51:38 2018 -0700 + + Minor + + src/hb-private.hh | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit e1acff806b469e58f568bf5ad6ba578207821e87 +Author: Behdad Esfahbod +Date: Mon Aug 6 04:42:46 2018 -0700 + + Move hb_vector_t to hb-vector-private.hh + + src/Makefile.sources | 1 + + src/hb-dsalgs.hh | 297 + ----------------------------------------------- + src/hb-object-private.hh | 109 ++++++++++++++++- + src/hb-vector-private.hh | 239 ++++++++++++++++++++++++++++++++++++++ + 4 files changed, 346 insertions(+), 300 deletions(-) + +commit be336dadc07460a53de51be32dd5d1f218b398b6 +Author: Behdad Esfahbod +Date: Mon Aug 6 04:32:51 2018 -0700 + + Move some more code around + + src/hb-dsalgs.hh | 43 +++++++++++++++++++++++++++++++++++++++++++ + src/hb-private.hh | 51 + +-------------------------------------------------- + 2 files changed, 44 insertions(+), 50 deletions(-) + +commit 92806ee055c8efb68fcbe9e1750ce2532a1f8ab3 +Author: Behdad Esfahbod +Date: Sun Aug 5 21:41:52 2018 -0700 + + Move null data definitions to hb-static.cc + + Also remove " " null data for Tag. Just use zeroes. + + src/hb-open-type-private.hh | 3 +-- + src/hb-ot-layout-common-private.hh | 5 ++--- + src/hb-private.hh | 12 +++++++----- + src/hb-static.cc | 10 +++++++++- + 4 files changed, 19 insertions(+), 11 deletions(-) + +commit 1b4d5a2402302e90867c178b6b2ad07541091a74 +Author: Behdad Esfahbod +Date: Fri Aug 3 19:55:09 2018 -0700 + + Minor + + src/hb-ot-layout-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7df7963b46223f47e89a5a38c597c874aaa93141 +Author: Behdad Esfahbod +Date: Fri Aug 3 19:54:33 2018 -0700 + + Make lazy loader deal with OOM + + src/hb-machinery-private.hh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 30ff8ac865a266c8dca11eeac155c2cd3d1aa159 +Author: Behdad Esfahbod +Date: Fri Aug 3 17:32:00 2018 -0700 + + Rename + + src/hb-machinery-private.hh | 6 +++--- + src/hb-ot-font.cc | 8 ++++---- + 2 files changed, 7 insertions(+), 7 deletions(-) + +commit 85ba4a190f30da5147d3b2ddac4d58dda31181f1 +Author: Behdad Esfahbod +Date: Fri Aug 3 17:06:42 2018 -0700 + + [ot] Comment + + src/hb-ot-layout-private.hh | 2 ++ + 1 file changed, 2 insertions(+) + +commit 07afc1a213bde91fdfc44dd613f2e82ac1617c9f +Author: Behdad Esfahbod +Date: Fri Aug 3 17:03:32 2018 -0700 + + [ot] Add misc tables to tables_t + + Most unused. + + src/hb-ot-layout-private.hh | 36 ++++++++++++++++++++++-------------- + 1 file changed, 22 insertions(+), 14 deletions(-) + +commit 74b4df2cdef68b74536d9c29426b242199a63a6f +Author: Behdad Esfahbod +Date: Fri Aug 3 16:57:40 2018 -0700 + + [ot] Move GDEF into tables_t + + src/hb-machinery-private.hh | 6 ++++++ + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-ot-layout-gsubgpos-private.hh | 2 +- + src/hb-ot-layout-private.hh | 7 +------ + src/hb-ot-layout.cc | 15 +++++---------- + 5 files changed, 14 insertions(+), 18 deletions(-) + +commit 0271c7ab3b76dbf8a4e3e92eaf67d9d61b7a63dc +Author: Behdad Esfahbod +Date: Fri Aug 3 16:45:57 2018 -0700 + + [ot] Move GSUB/GPOS into tables_t + + src/hb-machinery-private.hh | 6 ++---- + src/hb-ot-layout-gpos-table.hh | 4 ++-- + src/hb-ot-layout-gsub-table.hh | 4 ++-- + src/hb-ot-layout-private.hh | 7 ++---- + src/hb-ot-layout.cc | 49 + +++++++++++++++++++----------------------- + 5 files changed, 30 insertions(+), 40 deletions(-) + +commit f73d2775cf649d148ace7c2593da9666d60fc1be +Author: Behdad Esfahbod +Date: Fri Aug 3 16:34:25 2018 -0700 + + [ot] More shuffling + + Misc. table loading now properly automated. + + src/hb-ot-layout-private.hh | 67 + +++++++++++++++++++++++++++++---------------- + src/hb-ot-layout.cc | 25 +++++++++++------ + src/hb-ot-math.cc | 2 +- + 3 files changed, 61 insertions(+), 33 deletions(-) + +commit 52fbd23d868a989d51b7df5be40be582890d13e5 +Author: Behdad Esfahbod +Date: Fri Aug 3 16:22:16 2018 -0700 + + [ot] Minor + + src/hb-aat-layout.cc | 4 ++-- + src/hb-face-private.hh | 7 ++----- + src/hb-machinery-private.hh | 1 + + src/hb-ot-layout-private.hh | 15 +++++++++------ + src/hb-ot-layout.cc | 20 ++++++++++---------- + src/hb-ot-math.cc | 2 +- + src/hb-ot-var.cc | 4 ++-- + 7 files changed, 27 insertions(+), 26 deletions(-) + +commit cc3f4e00aa5da1d9f0430adefe30689b3daa8282 +Author: Michiharu Ariza +Date: Fri Aug 3 15:00:37 2018 -0700 + + silence gcc + + src/hb-ot-cff2-table.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 00970dd2420c3dcc58c25568be4abe6586c159df +Author: Michiharu Ariza +Date: Fri Aug 3 14:35:09 2018 -0700 + + Removed parsed hint fields from CFF2PrivateDictValues + + Instead moved & stored uniformly in values vector (renamed from + opstrs) + This should be fine as we aren't likely going to use them as hints + after all + Templatized DictValues whether to parse them out + For subsetter, they aren't parsed + + src/hb-ot-cff-common-private.hh | 113 ++++++++++++++---------- + src/hb-ot-cff2-table.hh | 185 + ++++++++++++---------------------------- + src/hb-subset-cff2.cc | 2 +- + 3 files changed, 120 insertions(+), 180 deletions(-) + +commit 6a0a298aabe777e2c1ed443f100fe6142c83e3b3 +Author: Behdad Esfahbod +Date: Thu Aug 2 23:13:19 2018 -0700 + + [ot] Move code around + + src/hb-ot-layout.cc | 211 + ++++++++++++++++++++++++++-------------------------- + 1 file changed, 106 insertions(+), 105 deletions(-) + +commit 5e718a751efdda89511c9f30238b500125193499 +Author: Behdad Esfahbod +Date: Thu Aug 2 23:04:42 2018 -0700 + + [ot] Use switch for checking for blacklisted GDEF tables + + Faster / more compact code. + + src/hb-ot-layout.cc | 107 + +++++++++++++++++++++++++++++----------------------- + 1 file changed, 59 insertions(+), 48 deletions(-) + +commit b5cdf5280d5b00df5356cc5c3236844ca0576bd0 +Author: Behdad Esfahbod +Date: Thu Aug 2 22:56:42 2018 -0700 + + [ot] In GDEF blacklisting logic, remove the glyph index check + for Times + + Just blacklist based on table sizes like we do for other fonts. + + src/hb-ot-layout.cc | 12 ------------ + 1 file changed, 12 deletions(-) + +commit c988b119994ef78d400bc7d3139785312da0be75 +Author: Behdad Esfahbod +Date: Thu Aug 2 20:04:37 2018 -0700 + + Move code around + + src/hb-ot-font.cc | 41 ++++++++++++++++++++++++++--------------- + 1 file changed, 26 insertions(+), 15 deletions(-) + +commit 76f7397c10832b891a082e30afc74222bd5ffd7b +Author: Michiharu Ariza +Date: Thu Aug 2 16:28:10 2018 -0700 + + templatized CFF2 accelerator for lean Private dict interpretting + for subset + + also fixed local subrs serialization + + src/hb-ot-cff-common-private.hh | 8 ++- + src/hb-ot-cff2-table.hh | 119 + ++++++++++++++++++++++++++++++++-------- + src/hb-subset-cff2.cc | 13 +++-- + 3 files changed, 109 insertions(+), 31 deletions(-) + +commit 43040564e661fdd616d39e84fde07612d55bb785 +Author: Michiharu Ariza +Date: Thu Aug 2 12:23:10 2018 -0700 + + removed TRACE_SERIALIZE from non-member function _write_cff2 + + src/hb-subset-cff2.cc | 29 ++++++++++++++--------------- + 1 file changed, 14 insertions(+), 15 deletions(-) + +commit e2fd49e4779663e3138bd1990736a9cf850303bf +Merge: 693ae804 d4d1bf81 +Author: Michiharu Ariza +Date: Thu Aug 2 11:39:22 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 693ae804743c60968d4339465fa6480e0ed8396c +Author: Michiharu Ariza +Date: Thu Aug 2 11:22:42 2018 -0700 + + more silencing fixes + + src/hb-ot-cff2-table.hh | 2 +- + src/hb-subset-cff2.cc | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit f6da44983178e345ddbac1bcd1691ddb330399c6 +Author: Michiharu Ariza +Date: Thu Aug 2 10:52:08 2018 -0700 + + silence archlinux + + src/hb-ot-cff-common-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 58279c3db4f31bf3f9a509d1d88bca01b57c6b81 +Author: Michiharu Ariza +Date: Thu Aug 2 10:18:01 2018 -0700 + + silence Codacy + + src/hb-ot-cff-common-private.hh | 25 +++++++++++++++++++------ + src/hb-ot-cff2-table.hh | 14 +++++++------- + 2 files changed, 26 insertions(+), 13 deletions(-) + +commit 574b37e933f98e35c2bdae04458a95522bbfbb82 +Author: Behdad Esfahbod +Date: Thu Aug 2 02:22:38 2018 -0700 + + Minor + + src/hb-ot-font.cc | 2 +- + src/hb-ot-layout-private.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit d4d1bf8177b127caa57b146c932f553dca1ad933 +Author: Behdad Esfahbod +Date: Thu Aug 2 02:04:02 2018 -0700 + + Fix for recent rename + + src/hb-graphite2.cc | 2 +- + src/hb-uniscribe.cc | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 91126aa11a5fa2bff72137df4768ad13fc9b7803 +Author: Behdad Esfahbod +Date: Thu Aug 2 02:03:13 2018 -0700 + + [uniscribe] Update for recent changes + + src/hb-uniscribe.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 66952ec47b5f09d88b83fb6a71b1cdb26c53668d +Author: Behdad Esfahbod +Date: Thu Aug 2 01:44:20 2018 -0700 + + Remove unused table reference + + src/hb-ot-layout-private.hh | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit 443de26fa56dd1ef149d3ce4206f4495eceec2eb +Author: Behdad Esfahbod +Date: Thu Aug 2 01:41:19 2018 -0700 + + Minor + + src/hb-face.cc | 1 - + src/hb-ot-layout-private.hh | 12 ++++++------ + 2 files changed, 6 insertions(+), 7 deletions(-) + +commit ee35af738b5c802ca62eb1c39b77f0bd992329df +Author: Behdad Esfahbod +Date: Thu Aug 2 01:37:57 2018 -0700 + + Make lazy-loader safe for nil objectification + + src/hb-machinery-private.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 6404c49d0735d92779089ddef5c1d34aad1542d7 +Author: Behdad Esfahbod +Date: Thu Aug 2 01:36:08 2018 -0700 + + Minor + + src/hb-machinery-private.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ff7826e90bce46985651015059872d1d8559b6ce +Author: Behdad Esfahbod +Date: Thu Aug 2 01:27:40 2018 -0700 + + Reduce storage by sharing face amongst lazy_loaders + + src/hb-machinery-private.hh | 113 + ++++++++++++++++++++++++-------------------- + src/hb-ot-font.cc | 19 ++++---- + src/hb-ot-layout-private.hh | 11 +++-- + src/hb-ot-layout.cc | 9 ++-- + 4 files changed, 85 insertions(+), 67 deletions(-) + +commit bdd3c11a19d87999eeaff2c82f21c6938d1d9342 +Author: Behdad Esfahbod +Date: Thu Aug 2 00:38:46 2018 -0700 + + Internal templatization of lazy-loaders + + src/hb-machinery-private.hh | 74 + ++++++++++++++++++++------------------------- + 1 file changed, 32 insertions(+), 42 deletions(-) + +commit ed7b2e58fc9afb547656cf28eb4a253d989de43c +Author: Behdad Esfahbod +Date: Wed Aug 1 23:59:09 2018 -0700 + + Remove OT namespace from hb-machinery-private.hh + + src/dump-emoji.cc | 4 ++-- + src/hb-aat-layout.cc | 2 +- + src/hb-face.cc | 4 ++-- + src/hb-machinery-private.hh | 14 +++++--------- + src/hb-ot-font.cc | 8 ++++---- + src/hb-ot-layout-private.hh | 10 +++++----- + src/hb-ot-layout.cc | 8 ++++---- + src/hb-ot-shape-complex-arabic-fallback.hh | 18 +++++++++--------- + src/hb-static.cc | 4 ++-- + src/hb-subset-glyf.cc | 2 +- + src/hb-subset.cc | 8 ++++---- + src/hb-uniscribe.cc | 2 +- + 12 files changed, 40 insertions(+), 44 deletions(-) + +commit cb1491f92e24649433988ff81a89347dccf07c8b +Author: Behdad Esfahbod +Date: Wed Aug 1 22:50:45 2018 -0700 + + Minor + + src/hb-blob-private.hh | 5 ----- + src/hb-machinery-private.hh | 10 ++++++---- + 2 files changed, 6 insertions(+), 9 deletions(-) + +commit 16ccfafbbd48c7a9737ce1d12e75406a050b71a9 +Author: Behdad Esfahbod +Date: Wed Aug 1 22:50:06 2018 -0700 + + [face] Sprinkle const in the API + + src/hb-face.cc | 17 +++++++++-------- + src/hb-face.h | 16 ++++++++-------- + 2 files changed, 17 insertions(+), 16 deletions(-) + +commit 3d22aefedebb5277c5d79011e48e7be1a26a53c1 +Author: Behdad Esfahbod +Date: Wed Aug 1 18:03:32 2018 -0700 + + Rename + + src/hb-coretext.cc | 46 + +++++++++++++++++++++++----------------------- + src/hb-directwrite.cc | 28 ++++++++++++++-------------- + src/hb-fallback-shape.cc | 24 ++++++++++++------------ + src/hb-graphite2.cc | 26 +++++++++++++------------- + src/hb-ot-shape.cc | 20 ++++++++++---------- + src/hb-shaper-private.hh | 2 +- + src/hb-uniscribe.cc | 34 +++++++++++++++++----------------- + 7 files changed, 90 insertions(+), 90 deletions(-) + +commit 1a624c6e06763a8a61bc686d2d44272d4ef50d4a +Author: Behdad Esfahbod +Date: Wed Aug 1 17:53:30 2018 -0700 + + Add comment re (our only) race condition + + src/hb-shaper-private.hh | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 19ce0b24c0173fed11104a8ab039e856cbf40924 +Author: Michiharu Ariza +Date: Wed Aug 1 17:34:59 2018 -0700 + + removed unused field OpStr::update + + src/hb-ot-cff-common-private.hh | 4 +--- + src/hb-ot-cff2-table.hh | 22 +++++++++++----------- + 2 files changed, 12 insertions(+), 14 deletions(-) + +commit 3bda54c43b248ee2bc18a9210fb4d880bb4d82ac +Author: Michiharu Ariza +Date: Wed Aug 1 16:32:27 2018 -0700 + + fixed Index::serialize + + The bug was causing CharString of the last glyph corrupt + + src/hb-ot-cff-common-private.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 16f4dc9b73a197a5ab0ad29dcf5a7ed7495ec4e1 +Author: Michiharu Ariza +Date: Wed Aug 1 16:06:52 2018 -0700 + + fixed CFF2VariationStore::serialize + + also get_size + + src/hb-ot-cff2-table.hh | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 44d1fb37efa20852cc466c0f0bba95dbd24ce288 +Author: Behdad Esfahbod +Date: Wed Aug 1 14:51:51 2018 -0700 + + 1.8.5 + + NEWS | 8 ++++++++ + configure.ac | 2 +- + src/hb-ot-layout.cc | 2 +- + src/hb-version.h | 4 ++-- + 4 files changed, 12 insertions(+), 4 deletions(-) + +commit 13f4c137c686aed5c2888b5c47d9f16892be0d5e +Author: Behdad Esfahbod +Date: Wed Aug 1 14:13:59 2018 -0700 + + [atomic] Fix Solaris ones to add proper barriers + + src/hb-atomic-private.hh | 52 + +++++++++++++++++++++++++++++++++--------------- + 1 file changed, 36 insertions(+), 16 deletions(-) + +commit 19dfaa351568887a74cee2c46d6acfcc3fa718ff +Author: Behdad Esfahbod +Date: Wed Aug 1 14:02:39 2018 -0700 + + [atomic] Remove volatile from IBM impl signature + + src/hb-atomic-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2093a3e0cbb98c2daa39f308d50a12f0a719bc81 +Author: Behdad Esfahbod +Date: Wed Aug 1 14:00:46 2018 -0700 + + [atomic] Oops + + src/hb-atomic-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 19b98348ffc660501e518bf48cd63d232f7585e7 +Author: Behdad Esfahbod +Date: Wed Aug 1 13:59:59 2018 -0700 + + [atomic] Use read-barrier for get() + + src/hb-atomic-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 006d4f031a30dd04f5bb9c3d1daca187ef6b7f1e +Author: Behdad Esfahbod +Date: Wed Aug 1 13:59:31 2018 -0700 + + [atomic] Some more minor tweaks + + src/hb-atomic-private.hh | 31 ++++++++++++++++++++----------- + 1 file changed, 20 insertions(+), 11 deletions(-) + +commit 28d03a8afcc1f0ba6d9d0d88f669cc53bb030dd8 +Author: Ebrahim Byagowi +Date: Thu Aug 2 00:11:43 2018 +0430 + + [ci] Fix Appveyor bot (#1123) + + appveyor.yml | 1 + + 1 file changed, 1 insertion(+) + +commit b2ff582c8c1a0fea60ee323dc820ce6fe807b063 +Author: Michiharu Ariza +Date: Wed Aug 1 11:30:38 2018 -0700 + + Implemented hb_subset_cff2 + + Added serialize functions to CFF2 structs + Fixed issues & bugs & code cleanup + Now subsetting CFF2 table outputs something + + src/hb-ot-cff-common-private.hh | 428 + +++++++++++++++++++++++++++++++++++----- + src/hb-ot-cff2-table.hh | 237 +++++++++++++++++----- + src/hb-private.hh | 2 +- + src/hb-subset-cff2.cc | 392 + +++++++++++++++++++++++++++++++----- + 4 files changed, 914 insertions(+), 145 deletions(-) + +commit 1a7fed631880fff8a947ebec9c7427efff581916 +Author: Ebrahim Byagowi +Date: Wed Aug 1 12:15:44 2018 +0430 + + Revert "Add a new API, hb_ot_layout_get_feature_name_ids (#976)" + (#1121) + + This reverts commit 0c1b287b72e91e0898d75acb5d5acf1c6b9a7498. + + docs/harfbuzz-sections.txt | 1 - + src/hb-ot-layout-common-private.hh | 14 ------- + src/hb-ot-layout.cc | 86 + -------------------------------------- + src/hb-ot-layout.h | 8 ---- + 4 files changed, 109 deletions(-) + +commit dfc86e4b35ffdeb8f73e83511712e75413bbb7d9 +Author: Behdad Esfahbod +Date: Wed Aug 1 00:22:18 2018 -0700 + + [atomic] Fix cast to fallback ptr_get() + + src/hb-atomic-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7a4d576e81c4de68ea66b2d5fe7712e29d715272 +Author: Behdad Esfahbod +Date: Wed Aug 1 00:19:25 2018 -0700 + + [gobject] Fix copy/paste error + + src/hb-gobject-structs.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ad275627425c9b3c4fb1e69aa408067bd0bb77da +Author: Behdad Esfahbod +Date: Tue Jul 31 23:01:05 2018 -0700 + + [atomic] On IBM, use light-weight sync for everything + + lwsync() is a full read/write-barrier. That's all we need, never + need sync(). I'm not sure why an isync() was used in fetch_and_add, + but since that's a read-modify-write, I just changed it to have + lwsync() on both sides. + + src/hb-atomic-private.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit fd638d215feb058c2294e447cc68f6f50e2b481d +Author: Behdad Esfahbod +Date: Tue Jul 31 23:00:15 2018 -0700 + + [atomic] Add XXX items around Solaris ops + + Since add_int and cas are both read-modify-write, I wonder if we + also need a barrier after them. + + src/hb-atomic-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 896ff15ae60a4a4b94c62946e69196b877839bb5 +Author: Behdad Esfahbod +Date: Tue Jul 31 22:51:38 2018 -0700 + + [atomic] Fix get() impl + + Originally, glib's atomic_get was implemented as "memory_barrier; + load". + I copied this into cairo, fontconfig, and harfbuzz. However, that's + wrong. Correct way is "load; memory_barrier". The details are long + and hard to fully grasp. Best to read: + + https://www.kernel.org/doc/Documentation/memory-barriers.txt + + Also see my report against GNOME: + + https://gitlab.gnome.org/GNOME/glib/issues/1449 + + Note that this is irrelevant if C++11-like atomic ops are available. + + src/hb-atomic-private.hh | 28 +++++++++++++++++----------- + 1 file changed, 17 insertions(+), 11 deletions(-) + +commit d7a15799d40dac1f9521674a82c3293a7cb42ee4 +Author: Behdad Esfahbod +Date: Tue Jul 31 22:28:28 2018 -0700 + + [gobject] Hook up hb_map_t + + docs/harfbuzz-sections.txt | 2 ++ + src/hb-gobject-structs.cc | 1 + + src/hb-gobject-structs.h | 4 ++++ + src/hb-map.cc | 6 ++---- + 4 files changed, 9 insertions(+), 4 deletions(-) + +commit 63c74e8d1d85067cbeffe635eb5ed4e8aa130776 +Author: Behdad Esfahbod +Date: Tue Jul 31 22:21:21 2018 -0700 + + [atomic] Fix fallback impl + + src/hb-atomic-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4bc16aca4760ac9ffd8c63bbaea24fc7d234f715 +Author: Behdad Esfahbod +Date: Tue Jul 31 21:05:51 2018 -0700 + + [atomic] Add get_relaxed / set_relaxed + + To help TSan and be more "correct". + + src/hb-atomic-private.hh | 37 ++++++++++++++++++++++------------- + src/hb-common.cc | 4 ++-- + src/hb-debug.hh | 42 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-object-private.hh | 12 ++++++------ + src/hb-ot-shape-complex-indic.cc | 22 +++++++++++---------- + src/hb-private.hh | 28 --------------------------- + 6 files changed, 86 insertions(+), 59 deletions(-) + +commit 3dd1b88765f6ce91bd0558a16cdd8cf0c1e15d1b +Author: Behdad Esfahbod +Date: Tue Jul 31 19:33:37 2018 -0700 + + [atomic] Use CONSUME, not ACQUIRE, memory-order for get() + + Although, all implementations just elevate that to ACQUIRE. + But requirement for us is just CONSUME. + + src/hb-atomic-private.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 06b91d935da1a40ef9de6697717eb0af1015989e +Author: Behdad Esfahbod +Date: Tue Jul 31 19:29:49 2018 -0700 + + Revert "[atomic] Make pointer get op relaxed instead of acquire" + + This reverts commit b1e5650c67266dc158f22355fed206cd1c413f70. + + After lots of head-scratching and finally finding the only truly + readable source to be the good old: + + https://www.kernel.org/doc/Documentation/memory-barriers.txt + + I've convinced myself that we need consume memory-ordering on get(). + The location of memory-barrier in a load should be after, not before + the load. That needs fixing. I'll do that separately. + + src/hb-atomic-private.hh | 34 +++++++++++++++++++++++++--------- + 1 file changed, 25 insertions(+), 9 deletions(-) + +commit 2bdd903c69eb3a34f3d3bf5e4f4c94cd66337117 +Author: Garret Rieger +Date: Tue Jul 31 17:44:02 2018 -0700 + + [subset] limit the max codepoint value to the unicode limit. + When collecting all codepoints in the cmap avoid using large amount + of memory for fonts that declare coverage over all 32 bit integers. + + src/hb-ot-cmap-table.hh | 9 +++++++-- + ...mized-hb-subset-get-codepoints-fuzzer-5973295416475648 | Bin 0 -> + 109 bytes + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 7278d9df3093a87f99cec9b4cea38bd688c5d020 +Author: Garret Rieger +Date: Tue Jul 31 17:59:19 2018 -0700 + + [subset] Add hb_ot_layout_collect_features to harfbuzz-sections.txt. + Add the fuzzer test case for feature collection timeout. + + docs/harfbuzz-sections.txt | 1 + + ...estcase-minimized-hb-subset-fuzzer-5542653037903872 | Bin 0 -> + 160249 bytes + 2 files changed, 1 insertion(+) + +commit 89733755a48feef0a663e1ea7b8294949581ce7e +Author: Garret Rieger +Date: Mon Jul 30 18:10:43 2018 -0700 + + [subset] use add_array to populate feature_indexes. + This is much faster then calling a bunch of individual add()'s. + + src/hb-ot-layout-common-private.hh | 7 +++++++ + src/hb-ot-layout.cc | 40 + +++++++++++++++++++------------------- + 2 files changed, 27 insertions(+), 20 deletions(-) + +commit 7d92bef9c5afb319d125f60b0fce4763afeaa686 +Author: Garret Rieger +Date: Mon Jul 30 17:17:43 2018 -0700 + + [subset] collect features first, then use those to collect lookups. + + src/hb-ot-layout.cc | 148 + +++++++++++++++++++++++++--------------------------- + src/hb-ot-layout.h | 7 +++ + 2 files changed, 78 insertions(+), 77 deletions(-) + +commit af876cce3066833c7c34d213a578eec6b09dd5c9 +Author: Behdad Esfahbod +Date: Tue Jul 31 15:27:29 2018 -0700 + + [indic] Flip default logic for double-halants in old-school + + Oriya went down from 9 to 2. + + BENGALI: 353725 out of 354188 tests passed. 463 failed (0.130722%) + DEVANAGARI: 707311 out of 707394 tests passed. 83 failed (0.0117332%) + 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%) + MALAYALAM: 1048136 out of 1048334 tests passed. 198 failed + (0.0188871%) + MYANMAR: 1115830 out of 1123883 tests passed. 8053 failed (0.716534%) + ORIYA: 42327 out of 42329 tests passed. 2 failed (0.00472489%) + SINHALA: 271596 out of 271847 tests passed. 251 failed (0.0923313%) + TAMIL: 1091754 out of 1091754 tests passed. 0 failed (0%) + TELUGU: 970555 out of 970573 tests passed. 18 failed (0.00185457%) + + src/hb-ot-shape-complex-indic.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 92ba9905caa060466230f63b428ccee767696464 +Author: Behdad Esfahbod +Date: Tue Jul 31 15:19:32 2018 -0700 + + [indic] Allow double-halant in old-spec Devanagari + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1071 + + src/hb-ot-shape-complex-indic.cc | 18 + ++++++++++++------ + .../b722a7d09e60421f3efbc706ad348ab47b88567b.ttf | Bin 0 -> + 4672 bytes + test/shaping/data/in-house/tests/indic-old-spec.tests | 2 ++ + 3 files changed, 14 insertions(+), 6 deletions(-) + +commit fe099a844b9b8fe05dd4eb187b5ca3769441f012 +Author: Behdad Esfahbod +Date: Tue Jul 31 14:20:31 2018 -0700 + + [test] Add Khmer tests, with NotoSansKhmer-Regular.ttf + + Note that there's minor positioning differences, and ONE reordering + difference between what we get for these and what Uniscribe gets. + Probably same as what's described in commit message for + 1a96cc825dc9c8e3b6eef1403fe0864a1cfc0245 + + .../3998336402905b8be8301ef7f47cf7e050cbb1bd.ttf | Bin 0 -> 24392 bytes + test/shaping/data/in-house/tests/khmer-misc.tests | 89 + +++++++++++++++++++++ + 2 files changed, 89 insertions(+) + +commit 5772edc0ea8f697c6123e439c5d0c3e813ebeb45 +Author: Behdad Esfahbod +Date: Tue Jul 31 14:10:31 2018 -0700 + + [khmer] Typo + + src/hb-ot-shape-complex-khmer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2d6edc9008182c1446951f2c5c04df20094597f8 +Author: Behdad Esfahbod +Date: Tue Jul 31 13:56:55 2018 -0700 + + [test] Add Khmer test texts from recent bugs + + test/shaping/texts/in-house/shaper-khmer/misc.txt | 66 + +++++++++++++++++++++++ + 1 file changed, 66 insertions(+) + +commit df26a32c8fd22cbd486e2a1014d30b9f38f51cd1 +Author: Behdad Esfahbod +Date: Tue Jul 31 13:55:53 2018 -0700 + + [test] Move things around for shaper updates + + .../texts/in-house/shaper-indic/{indic => }/script-assamese/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-assamese/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-assamese/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-assamese/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-assamese/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../script-assamese/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt + | 0 + .../{indic => }/script-assamese/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-bengali/misc/misc.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-bengali/misc/reph.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-bengali/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-bengali/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-bengali/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../script-bengali/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-bengali/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../script-bengali/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt + | 0 + .../{indic => }/script-bengali/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../shaper-indic/{indic => }/script-devanagari/misc/dottedcircle.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-devanagari/misc/eyelash.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-devanagari/misc/joiners.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-devanagari/misc/misc.txt + | 0 + .../shaper-indic/{indic => }/script-devanagari/misc/spec-deviations.txt + | 0 + .../shaper-indic/{indic => }/script-devanagari/misc/tricky-reordering.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-devanagari/utrrs/LICENSE + | 0 + .../in-house/shaper-indic/{indic => }/script-devanagari/utrrs/README + | 0 + .../in-house/shaper-indic/{indic => }/script-devanagari/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../codepoint/IndicFontFeatureCodepoint-DevnagariSpecificAddition.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-GenericPunctuation.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../script-devanagari/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt + | 0 + .../{indic => }/script-devanagari/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-gujarati/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-gujarati/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-gujarati/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-gujarati/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../script-gujarati/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt + | 0 + .../{indic => }/script-gujarati/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/misc/misc.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-gurmukhi/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-gurmukhi/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-GurmukhiSpecific.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../script-gurmukhi/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt + | 0 + .../{indic => }/script-gurmukhi/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-kannada/misc/misc.txt + | 0 + .../shaper-indic/{indic => }/script-kannada/misc/right-matras.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-kannada/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-kannada/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-kannada/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../script-kannada/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-kannada/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../{indic => }/script-kannada/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-malayalam/misc/cibu.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-malayalam/misc/dot-reph.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-malayalam/misc/misc.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-malayalam/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-malayalam/utrrs/README + | 0 + .../in-house/shaper-indic/{indic => }/script-malayalam/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-malayalam/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../{indic => }/script-malayalam/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-oriya/misc/bindu.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-oriya/misc/misc.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-oriya/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-oriya/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-oriya/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalConsonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-OriyaSpecific.txt + | 0 + .../script-oriya/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../{indic => }/script-oriya/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../in-house/shaper-indic/{indic => }/script-sinhala/misc/extensive.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-sinhala/misc/misc.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-sinhala/misc/reph.txt + | 0 + .../shaper-indic/{indic => }/script-sinhala/misc/split-matras.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-sinhala/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-sinhala/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-sinhala/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Punctuation.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../{indic => }/script-sinhala/utrrs/gpos/IndicFontFeatureGPOS.txt + | 0 + .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Conjunct.txt + | 0 + .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Rakaaraansaya.txt + | 0 + .../{indic => }/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Repaya.txt + | 0 + .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Special-Cases.txt + | 0 + .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-TouchingLetters.txt + | 0 + .../script-sinhala/utrrs/gsub/IndicFontFeatureGSUB-Yansaya.txt + | 0 + .../{indic => }/script-sinhala/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-tamil/misc/misc.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-tamil/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-tamil/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-tamil/utrrs/SOURCES + | 0 + .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-CurrencySymbols.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Numerics.txt + | 0 + .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../script-tamil/utrrs/codepoint/IndicFontFeatureCodepoint-Symbols.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-TamilSymbol.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-tamil/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../script-tamil/utrrs/gpos/IndicFontFeatureGPOS-BelowBase.txt + | 0 + .../{indic => }/script-tamil/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-telugu/misc/misc.txt + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-telugu/utrrs/LICENSE + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-telugu/utrrs/README + | 0 + .../texts/in-house/shaper-indic/{indic => }/script-telugu/utrrs/SOURCES + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-AdditionalVowels.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-Consonants.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-DependentVowels.txt + | 0 + .../script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Digits.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-IndependentVowels.txt + | 0 + .../script-telugu/utrrs/codepoint/IndicFontFeatureCodepoint-Reserved.txt + | 0 + .../utrrs/codepoint/IndicFontFeatureCodepoint-VariousSigns.txt + | 0 + .../script-telugu/utrrs/gpos/IndicFontFeatureGPOS-AboveBase.txt + | 0 + .../{indic => }/script-telugu/utrrs/gsub/IndicFontFeatureGSUB.txt + | 0 + .../south-east-asian/script-khmer/misc => shaper-khmer}/misc.txt + | 0 + .../script-khmer/misc => shaper-khmer}/other-marks-invalid.txt + | 0 + .../south-east-asian/script-khmer/misc => shaper-khmer}/other-marks.txt + | 0 + .../south-east-asian => shaper-use}/script-javanese/misc.txt + | 0 + 174 files changed, 0 insertions(+), 0 deletions(-) + +commit 6ddd669e205cf2c1c3b0a362330b686386f68519 +Author: Behdad Esfahbod +Date: Tue Jul 31 13:38:07 2018 -0700 + + [khmer] Clear syllables before presentation features + + Probably not what Uniscribe does, but good idea? + + src/hb-ot-shape-complex-khmer.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 8eef1964a708c3db52e5e7312689c4664afa9839 +Author: Behdad Esfahbod +Date: Tue Jul 31 13:35:10 2018 -0700 + + [khmer] Revert previous change, and remove pauses + + This makes test suite happy again (at 44) while fixing the sequences + we were fixing, which were the following with KhmerUI.ttf: + + U+1789,U+17BC + U+1789,U+17D2,U+1789 + U+1789,U+17D2,U+1789,U+17BC + + Fixes rest of https://github.com/harfbuzz/harfbuzz/issues/974 + + src/hb-ot-shape-complex-khmer.cc | 23 ++++++++++------------- + 1 file changed, 10 insertions(+), 13 deletions(-) + +commit 7c658ea2f20a77cac35e8988e54316425396198a +Author: Behdad Esfahbod +Date: Tue Jul 31 12:49:02 2018 -0700 + + [khmer] Apply ccmp after basic features + + Part of https://github.com/harfbuzz/harfbuzz/issues/974 + + src/hb-ot-shape-complex-khmer.cc | 22 +++++++++++++++++----- + 1 file changed, 17 insertions(+), 5 deletions(-) + +commit 1a96cc825dc9c8e3b6eef1403fe0864a1cfc0245 +Author: Behdad Esfahbod +Date: Tue Jul 31 11:45:32 2018 -0700 + + [khmer] Rewrite most of shaper to better follow spec + + Khmer spec has only one reordering phase, and only simple prebase + matra and Coeng-Ro reordering. Implement that. Specifically, + this was done to address recognizing different orders of the matra + and Coeng-Ro sequence. That said, some combinations are now + reordered differently from Uniscribe. Not clear if that's intended + or a bug in Uniscribe. The following two sequences render the same + in Uniscribe whereas we reorder them differently: + + U+17A0,U+17D2,U+179A,U+17C2 + U+17A0,U+17C2,U+17D2,U+179A + + For that reason, our test suite numbers regressed slightly. Used + to be at 34 for fails, now at: + + KHMER: 299080 out of 299124 tests passed. 44 failed (0.0147096%) + + But generally a good change, and removed lots of code. + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1026 + + src/hb-ot-shape-complex-indic-private.hh | 4 +- + src/hb-ot-shape-complex-khmer.cc | 460 + ++++--------------------------- + src/hb-ot-shape-complex-private.hh | 13 - + 3 files changed, 64 insertions(+), 413 deletions(-) + +commit f5152cea423947cd8a85332566443b4e2e091672 +Author: Behdad Esfahbod +Date: Tue Jul 31 01:27:04 2018 -0700 + + [shaper] Move code around + + src/hb-shaper-private.hh | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit 36d0fbbc52bdf2c71da022fb1fdc31eca17078ce +Author: Behdad Esfahbod +Date: Tue Jul 31 01:15:04 2018 -0700 + + [shaper] Remove a macro + + src/hb-shaper-private.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit b1e5650c67266dc158f22355fed206cd1c413f70 +Author: Behdad Esfahbod +Date: Tue Jul 31 01:02:31 2018 -0700 + + [atomic] Make pointer get op relaxed instead of acquire + + We only use it before cmpexch, so relaxed is fine and faster for + common case. + + src/hb-atomic-private.hh | 34 +++++++++------------------------- + 1 file changed, 9 insertions(+), 25 deletions(-) + +commit 66ccd8ac405c9c25b37de9eb467a7382880dda35 +Author: Behdad Esfahbod +Date: Mon Jul 30 17:03:06 2018 -0700 + + [serialize] Increase stage count from 8 to 32 + + Indic shaper uses many stages. Now we are provably not limiting + functionality whereas the previous limit of 8 was assuming real-world + practices. + + src/hb-ot-layout-common-private.hh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ee8cf919654cb191e955fe1f89b1ebfb2b8b32ee +Author: Behdad Esfahbod +Date: Mon Jul 30 16:59:41 2018 -0700 + + [serialize] Remove unused truncate() method + + src/hb-machinery-private.hh | 6 ------ + 1 file changed, 6 deletions(-) + +commit 8782f80cce147c101b605501d9fd9c7d64338314 +Author: Michiharu Ariza +Date: Mon Jul 30 15:27:20 2018 -0700 + + fixed FDSelect0::sanitize + + src/hb-ot-cff-common-private.hh | 1 + + 1 file changed, 1 insertion(+) + +commit 9c4cadaef01733b32ab6190dd91552ee7145f3c3 +Author: Michiharu Ariza +Date: Mon Jul 30 14:28:40 2018 -0700 + + Added sanitize functions & calls + + Added sanitize functions to FDSelect + Added satnitize calls for FDSelect, VariationStore, FDArray, TopDict + + src/hb-ot-cff-common-private.hh | 67 + ++++++++++++++++++++++++++++++++--------- + src/hb-ot-cff2-table.hh | 26 +++++++++++----- + src/hb-subset-cff2.cc | 2 +- + 3 files changed, 72 insertions(+), 23 deletions(-) + +commit 161b642ec5babc7e4b81d41f725d81ad2caa9330 +Merge: 3a61c3e9 5edf454a +Author: Michiharu Ariza +Date: Mon Jul 30 12:22:09 2018 -0700 + + Merge branch 'master' into cff-subset + +commit 5edf454aa64aad461c90bd991e7eaf27668b7e6b +Author: Garret Rieger +Date: Thu Jul 26 17:42:02 2018 -0700 + + [subset] During lookup collection remember the features we've + already processed. + + src/hb-ot-layout.cc | 26 + +++++++++++++++++---- + ...ase-minimized-hb-subset-fuzzer-5670861909524480 | Bin 0 -> 1298 bytes + ...b-subset-get-codepoints-fuzzer-6136125075750912 | Bin 0 -> 65816 bytes + 3 files changed, 21 insertions(+), 5 deletions(-) + +commit 42c183f80355fe7cadac2931a23d389285c8b98c +Author: Behdad Esfahbod +Date: Fri Jul 27 14:55:29 2018 -0700 + + Minor + + src/hb-ft.cc | 5 +++-- + src/hb-ot-shape.cc | 5 +++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit ecab6604e57ea2bb4e78250a7a400e15b3e86f7a +Author: Behdad Esfahbod +Date: Wed Jul 25 17:37:38 2018 -0700 + + [serialize] Allocate for markFilteringSet + + src/hb-ot-layout-common-private.hh | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit 7f08818c441517f73c5bea0a2a88f494dfc8fa58 +Author: Behdad Esfahbod +Date: Wed Jul 25 17:22:05 2018 -0700 + + Minor + + src/hb-iter-private.hh | 8 +++++--- + src/hb-machinery-private.hh | 1 - + 2 files changed, 5 insertions(+), 4 deletions(-) + +commit 2e25d8f49181ab1d7fda520ae6587d293a982acf +Author: prrace +Date: Fri Jul 27 13:58:27 2018 -0700 + + Fix unlikely leaks + + src/hb-ft.cc | 4 +++- + src/hb-ot-shape.cc | 4 +++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 3c2842cbcf8cded73d1e310379e1a4ca124a6fc2 +Author: Behdad Esfahbod +Date: Wed Jul 25 17:07:17 2018 -0700 + + Add hb-iter-private.hh + + Unused so far. + + src/Makefile.sources | 1 + + src/hb-iter-private.hh | 147 + ++++++++++++++++++++++++++++++++++++++++++++ + src/hb-machinery-private.hh | 1 + + 3 files changed, 149 insertions(+) + +commit 92b1e025c639d006f55400bf68fc23bdeaa1c716 +Author: Behdad Esfahbod +Date: Wed Jul 25 16:58:47 2018 -0700 + + Move some code from hb-open-type-private.hh to hb-machinery-private.hh + + src/Makefile.sources | 1 + + src/hb-machinery-private.hh | 702 + ++++++++++++++++++++++++++++++++++++++++++++ + src/hb-open-type-private.hh | 669 + +---------------------------------------- + 3 files changed, 706 insertions(+), 666 deletions(-) + +commit 6b11fea99716e22522b563d919ef7c72fe9a3c45 +Author: Behdad Esfahbod +Date: Wed Jul 25 16:01:37 2018 -0700 + + [closure] Allocate out set on the stack + + src/hb-ot-layout-gsubgpos-private.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 74467b790154838e86c3ca8df0eaafe82e87f976 +Author: Behdad Esfahbod +Date: Wed Jul 25 14:30:07 2018 -0700 + + Fix compile + + src/hb-shaper-private.hh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit bf90f35302c319ec4699ccbcd1e28b15ef2ec423 +Author: Behdad Esfahbod +Date: Tue Jul 24 18:00:14 2018 -0700 + + [coretext] Add note + + src/hb-shaper-private.hh | 4 ++++ + 1 file changed, 4 insertions(+) + +commit fb58cb4b5ca7043fa746b1a01790abf53bedfa86 +Author: Garret Rieger +Date: Wed Jul 25 13:39:17 2018 -0700 + + [subset] Only used reachable lookups for gsub closure. + + src/hb-subset-plan.cc | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit c38bd4025f3f6ff4c1a39cc106b8618361a0c62b +Author: Behdad Esfahbod +Date: Tue Jul 24 09:43:27 2018 -0700 + + [closure] Separate in and out glyphs + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1107 + + src/hb-ot-layout-gsub-table.hh | 26 ++++++++++++++++++-------- + src/hb-ot-layout-gsubgpos-private.hh | 16 +++++++++++++++- + 2 files changed, 33 insertions(+), 9 deletions(-) + +commit 85646fdadb2f102333485e07425361795b4e0412 +Author: Garret Rieger +Date: Mon Jul 23 15:37:18 2018 -0700 + + [subset] Limit the iterations of the closure algorithm. + Prevents O(n^2) run times. + + src/hb-ot-layout-common-private.hh | 7 +++++++ + src/hb-ot-layout.cc | 5 ++++- + 2 files changed, 11 insertions(+), 1 deletion(-) + +commit 94759d4cf8986388399026ef5204ac55ee187180 +Author: Behdad Esfahbod +Date: Mon Jul 23 15:01:39 2018 -0700 + + Fix visibility on mingw32 + + Should fix bots again. + + src/hb-private.hh | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 61eddbd8ef64dc66e3c42723533d53967e61c9af +Author: Behdad Esfahbod +Date: Mon Jul 23 14:44:10 2018 -0700 + + Fix infinite loop in loading num_glyphs within sanitizer + + src/hb-open-type-private.hh | 13 ++++++++++--- + src/hb-static.cc | 4 +++- + 2 files changed, 13 insertions(+), 4 deletions(-) + +commit e22a48ac95a60fac5e1bca26eed7f5623d73a7be +Author: Behdad Esfahbod +Date: Mon Jul 23 13:24:26 2018 -0700 + + One more visibility trick + + Should fix Windows build again. + + src/hb-common.cc | 9 +++++++++ + src/hb-private.hh | 20 ++------------------ + src/hb-static.cc | 4 +++- + 3 files changed, 14 insertions(+), 19 deletions(-) + +commit e57a638bdec378eed8e83513818c8add3ffae896 +Author: Behdad Esfahbod +Date: Mon Jul 23 12:00:02 2018 -0700 + + One more + + src/hb-ot-cmap-table.hh | 40 ++++++++++++++++++++-------------------- + 1 file changed, 20 insertions(+), 20 deletions(-) + +commit 36ed163fdd50419e4619c665a4a9dbf97f66c349 +Author: Behdad Esfahbod +Date: Mon Jul 23 11:57:45 2018 -0700 + + Remove unnecessary OT:: namespace specifiers + + src/hb-ot-cmap-table.hh | 30 +++++++++++++++--------------- + src/hb-ot-color-sbix-table.hh | 4 ++-- + src/hb-ot-color-svg-table.hh | 4 ++-- + src/hb-ot-glyf-table.hh | 4 ++-- + src/hb-ot-hmtx-table.hh | 2 +- + src/hb-ot-maxp-table.hh | 6 +++--- + src/hb-ot-os2-table.hh | 4 ++-- + src/hb-ot-post-table.hh | 2 +- + 8 files changed, 28 insertions(+), 28 deletions(-) + +commit c6bc7c38314ea831418fdd1434bbe5afc0875f33 +Author: Behdad Esfahbod +Date: Mon Jul 23 11:46:46 2018 -0700 + + Set num glyphs on sanitizer reference_table() + + Move out-of-class definitions of two methods to hb-static so they + are accessible in libharfbuzz-subset. + + src/hb-face.cc | 20 -------------------- + src/hb-open-type-private.hh | 1 + + src/hb-static.cc | 22 ++++++++++++++++++++++ + 3 files changed, 23 insertions(+), 20 deletions(-) + +commit 9401829d4e93f6f433957fa2d053f3b9d42da557 +Author: Behdad Esfahbod +Date: Sun Jul 22 22:50:58 2018 -0700 + + Remove Sanitizer<> + + src/hb-open-type-private.hh | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +commit 8e3e41272b3896274459c5961aac813ef2666321 +Author: Behdad Esfahbod +Date: Sun Jul 22 22:49:26 2018 -0700 + + Port rest of code away from Sanitizer<> + + src/hb-face.cc | 4 ++-- + src/main.cc | 3 +-- + 2 files changed, 3 insertions(+), 4 deletions(-) + +commit d6a8f64045ca3bf4c7d01520909fa0c7dfca4d64 +Author: Behdad Esfahbod +Date: Sun Jul 22 22:47:19 2018 -0700 + + Port dump-emoji away from Sanitizer<> + + src/dump-emoji.cc | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 14f78d2b3bb1e1292efbd6a3e3f0d618179c171a +Author: Behdad Esfahbod +Date: Sun Jul 22 22:45:26 2018 -0700 + + . + + src/hb-aat-layout.cc | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 4547051f48ca6aa53309b81a768b5b44c4ab6e3b +Author: Behdad Esfahbod +Date: Sun Jul 22 22:44:22 2018 -0700 + + Minor + + src/hb-open-file-private.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit 740ae27d5c0f5ff87e2ff489fb49d5db1a0c95be +Author: Behdad Esfahbod +Date: Sun Jul 22 22:40:56 2018 -0700 + + Port sbix off of Sanitizer<> + + src/hb-ot-color-sbix-table.hh | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 9583e0077d0a3a043f8b5bd23925014e04da8d32 +Author: Behdad Esfahbod +Date: Sun Jul 22 22:40:32 2018 -0700 + + Port more off of Sanitizer<> + + src/hb-face.cc | 4 ++-- + src/hb-open-type-private.hh | 2 +- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-color-cbdt-table.hh | 4 ++-- + src/hb-ot-color-svg-table.hh | 4 +--- + src/hb-ot-glyf-table.hh | 8 ++++---- + src/hb-ot-hmtx-table.hh | 10 +++++----- + src/hb-ot-kern-table.hh | 2 +- + src/hb-ot-layout.cc | 6 +++--- + src/hb-ot-maxp-table.hh | 2 +- + src/hb-ot-os2-table.hh | 2 +- + src/hb-ot-post-table.hh | 2 +- + src/hb-subset.cc | 4 +--- + 13 files changed, 24 insertions(+), 28 deletions(-) + +commit e7737b41d793bfce9455d1797eb5e0af60794f23 +Author: Behdad Esfahbod +Date: Sun Jul 22 22:24:31 2018 -0700 + + Add sanitizer reference_table, also fix clang build + + Clang is being really peculiar. Fix with: + + - inline hb_blob_t *sanitize (hb_blob_t *blob) { return + c->sanitize (blob); } + + inline hb_blob_t *sanitize (hb_blob_t *blob) { return + c[0].template/*clang idiosyncrasy*/sanitize_blob (blob); } + + src/hb-open-type-private.hh | 10 ++++++++-- + src/hb-ot-post-table.hh | 2 +- + src/hb-subset-glyf.cc | 2 +- + src/hb-uniscribe.cc | 2 +- + 4 files changed, 11 insertions(+), 5 deletions(-) + +commit 62fa7cd1ccff4d4448ef84f9cc146464672636aa +Author: David Corbett +Date: Fri Apr 13 18:45:37 2018 -0400 + + Order Chakma split vowels in accordance with NFC + + Fixes #1105. + + src/gen-use-table.py | 10 ++++++++++ + src/hb-ot-shape-complex-use-table.cc | 4 ++-- + src/hb-ot-shape-complex-use.cc | 21 + +-------------------- + .../2a670df15b73a5dc75a5cc491bde5ac93c5077dc.ttf | Bin 0 -> 1344 bytes + test/shaping/data/in-house/tests/use.tests | 5 +++++ + 5 files changed, 18 insertions(+), 22 deletions(-) + +commit 0c1b287b72e91e0898d75acb5d5acf1c6b9a7498 +Author: Ebrahim Byagowi +Date: Sat Jul 21 21:14:48 2018 +0430 + + Add a new API, hb_ot_layout_get_feature_name_ids (#976) + + This new API returns cvXX and ssXX related NameId, things like + featUiLabelNameId, featUiTooltipTextNameId, sampleTextNameId, + ... of cvXX + and UINameId of ssXX, in a unified way. + + However HarfBuzz currently doesn't expose an API for retrieving + the actual + information associated with NameId from the `name` table and that + should be + done separately. + + docs/harfbuzz-sections.txt | 1 + + src/hb-ot-layout-common-private.hh | 14 +++++++ + src/hb-ot-layout.cc | 86 + ++++++++++++++++++++++++++++++++++++++ + src/hb-ot-layout.h | 8 ++++ + 4 files changed, 109 insertions(+) + +commit 3a61c3e935cf649ba65ef0cb4daa9f06ab5d3c0a +Author: Michiharu Ariza +Date: Wed Jul 18 14:17:52 2018 -0700 + + first push of CFF/CFF2 work + + Index, Dict structs + hooked up to hb-subset (takes CFF2, outputs empty CFF2) + + src/Makefile.sources | 4 + + src/hb-ot-cff-common-private.hh | 475 + ++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-cff2-table.hh | 386 ++++++++++++++++++++++++++++++++ + src/hb-ot-font.cc | 2 + + src/hb-subset-cff2.cc | 121 ++++++++++ + src/hb-subset-cff2.hh | 38 ++++ + src/hb-subset.cc | 4 + + 7 files changed, 1030 insertions(+) + +commit 93b65d9fe331a217640069fad4159cb7c3ec35e6 +Author: Ebrahim Byagowi +Date: Tue Jul 17 23:29:16 2018 +0430 + + Remove dump-fon (#1100) + + It had interesting stuffs like EXE parsing and + big-endian parsers but added in an attempt to find + a solution for #681 which later found not related. + + src/Makefile.am | 4 - + src/dump-fon.cc | 555 + -------------------------------------------------------- + 2 files changed, 559 deletions(-) + +commit d5cd47a69c40966b4d5b5aed87dd7ac6f070c37a +Author: Ebrahim Byagowi +Date: Tue Jul 17 22:32:37 2018 +0430 + + Remove AAT's gcid/fmtx (#1099) + + We are not going to use them, at least in the foreseeable future + + src/Makefile.sources | 2 -- + src/hb-aat-fmtx-table.hh | 67 + -------------------------------------------- + src/hb-aat-gcid-table.hh | 73 + ------------------------------------------------ + src/hb-aat-layout.cc | 2 -- + 4 files changed, 144 deletions(-) + +commit 1e9e344b2ba076a5fd6d57d1705e17a59c3875ce +Author: Behdad Esfahbod +Date: Tue Jul 17 19:17:59 2018 +0200 + + Fix hb_face_count() sanitize referencing + + src/hb-face.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit a8cc0b5907e61199334a3a886fe22efe9cc17149 +Author: Behdad Esfahbod +Date: Tue Jul 17 19:09:03 2018 +0200 + + Remove TODO that is not gonna be done + + Previously the idea was to cache sanitize results externally (think, + in Fontconfig) and avoid resanitizing every time. That's, not a good + idea. + + src/hb-open-type-private.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit be7073840097c873ce4954c6cffadab175a007d3 +Author: Behdad Esfahbod +Date: Tue Jul 17 18:45:25 2018 +0200 + + Move sanitizer code around a bit + + src/hb-aat-layout-common-private.hh | 4 +- + src/hb-open-type-private.hh | 95 + ++++++++++++++++++++----------------- + src/hb-ot-color-sbix-table.hh | 12 ++--- + src/hb-ot-layout-common-private.hh | 3 -- + 4 files changed, 58 insertions(+), 56 deletions(-) + +commit db5d430effce67db57ddea2545694b7275ee8b35 +Author: Behdad Esfahbod +Date: Tue Jul 17 18:14:45 2018 +0200 + + [aat] Update for blob changes + + Also, uncomment code again, just "if (0)" it out, so it doesn't get + stale again. + + src/hb-aat-layout.cc | 58 + ++------------------------------------------- + src/hb-open-type-private.hh | 27 +++++++++++++-------- + src/hb-ot-layout-private.hh | 1 + + src/hb-ot-layout.cc | 2 ++ + src/hb-ot-shape.cc | 6 ++--- + 5 files changed, 25 insertions(+), 69 deletions(-) + +commit 68310a65cba7eed20f8696f4c670bb195677f467 +Author: Behdad Esfahbod +Date: Tue Jul 17 13:20:40 2018 +0200 + + 1.8.4 + + NEWS | 7 +++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 10 insertions(+), 3 deletions(-) + +commit 04b7b81bcbf19cb85d06d930192d6591ba45ef72 +Author: Behdad Esfahbod +Date: Tue Jul 17 10:57:01 2018 +0200 + + Reland "Implement C++11-style GCC builtin atomic ops" + + Fixed the crasher in it. + + src/hb-atomic-private.hh | 22 +++++++++++++++++++--- + src/hb-object-private.hh | 2 +- + 2 files changed, 20 insertions(+), 4 deletions(-) + +commit 019d18e9ae643134bfc3861be65ac618a5892c92 +Author: Behdad Esfahbod +Date: Tue Jul 17 10:59:19 2018 +0200 + + Minor + + src/Makefile.am | 1 + + test/api/Makefile.am | 2 ++ + 2 files changed, 3 insertions(+) + +commit 3edef5a19b5c0f30381ae6fe01c3370ded37f6ca +Author: Behdad Esfahbod +Date: Tue Jul 17 10:50:01 2018 +0200 + + Revert "Implement C++11-style GCC builtin atomic ops" + + This reverts commit 21fa170f0bfb0109c506ed17f5aff8b062564ffa. + + Is crashing. Oops. + + src/hb-atomic-private.hh | 22 +++------------------- + src/hb-object-private.hh | 2 +- + 2 files changed, 4 insertions(+), 20 deletions(-) + +commit 21fa170f0bfb0109c506ed17f5aff8b062564ffa +Author: Behdad Esfahbod +Date: Mon Jul 16 17:58:02 2018 +0200 + + Implement C++11-style GCC builtin atomic ops + + Hopefully fixes bots. + + src/hb-atomic-private.hh | 22 +++++++++++++++++++--- + src/hb-object-private.hh | 2 +- + 2 files changed, 20 insertions(+), 4 deletions(-) + +commit 804b59cf4901d471253016e0cbf82cc1bbbc1d15 +Author: Behdad Esfahbod +Date: Mon Jul 16 15:44:58 2018 +0200 + + Relax C++11 atomic ops memory order to acquire-release + + src/hb-atomic-private.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit bda242409fc0cbb79a0ff00eba9856c4b0a9c7a1 +Author: Behdad Esfahbod +Date: Mon Jul 16 15:41:09 2018 +0200 + + Implement C++11 operations + + Fixes https://github.com/harfbuzz/harfbuzz/issues/345 + + src/hb-atomic-private.hh | 27 ++++++++++++++++++++++++--- + src/hb-open-type-private.hh | 2 +- + src/hb-ot-shape-complex-arabic.cc | 2 +- + 3 files changed, 26 insertions(+), 5 deletions(-) + +commit 524411224054b23bab4adad7343314df45c9c183 +Merge: 2aae617a 269eb456 +Author: Cosimo Lupo +Date: Mon Jul 16 14:42:43 2018 +0200 + + Merge pull request #1094 from anthrotype/fix-appveyor-msys2 + + appveyor.yml: try updating msys2 to fix failing mingw-w64-x86_64 build + +commit 269eb45650be66901627da7f1014339065a948a5 +Author: Cosimo Lupo +Date: Mon Jul 16 14:14:42 2018 +0200 + + appveyor.yml: try only updating msys2 core, not the rest of the + packages + + maybe it'll get a bit faster + + appveyor.yml | 1 - + 1 file changed, 1 deletion(-) + +commit 3ab52c6cb5c405366af804d278216e2d02a39ecb +Author: Cosimo Lupo +Date: Mon Jul 16 12:57:27 2018 +0200 + + appveyor.yml: pass --needed option to pacman + + so it won't attempt reinstalling packages which are already installed + + appveyor.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5631d70d36aa7952d343ea794bd5169a730706ae +Author: Cosimo Lupo +Date: Mon Jul 16 12:41:59 2018 +0200 + + appveyor.yml: try updating msys2 to fix failing mingw-w64-x86_64 build + + https://github.com/harfbuzz/harfbuzz/pull/1093#issuecomment-405201903 + https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/job/ky7lao1ii1bi7ew4#L71 + + appveyor.yml | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2aae617a84f47836f10efd30df43e13e3a9447e1 +Author: Behdad Esfahbod +Date: Wed Jul 11 17:27:23 2018 +0200 + + Move _hb_alignof later again + + It uses constexpr... + + src/hb-private.hh | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit f3a74c16ecafdca135a647ebe85117c35c1ef585 +Author: Behdad Esfahbod +Date: Wed Jul 11 17:23:53 2018 +0200 + + Make hb_vector_t 8 bytes smaller + + src/hb-dsalgs.hh | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit 44999f8b758374015f5d48c83f9adcb464607c2f +Author: Behdad Esfahbod +Date: Wed Jul 11 17:00:59 2018 +0200 + + Align NullPool and CrapPool to HB_VECTOR_SIZE + + src/hb-dsalgs.hh | 3 +-- + src/hb-private.hh | 64 + ++++++++++++++++++++++++++++++++----------------------- + src/hb-static.cc | 4 ++-- + 3 files changed, 40 insertions(+), 31 deletions(-) + +commit 20a318d06acaabdee0090339dfa621aab46f1441 +Author: Behdad Esfahbod +Date: Wed Jul 11 17:00:13 2018 +0200 + + Fix return type of alignof() fallback + + src/hb-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 58cb4d9f73f1292454e3673d5e7ae5a58a566522 +Author: Behdad Esfahbod +Date: Wed Jul 11 16:44:21 2018 +0200 + + Minor + + test/api/test-ot-math.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 7796857c93b779e3c93eedd1cceb217d691dfd81 +Author: Behdad Esfahbod +Date: Wed Jul 11 15:27:37 2018 +0200 + + Minor + + RELEASING.md | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2b76767bf572364d3d647cdd139f2044a7ad06b2 +Author: Behdad Esfahbod +Date: Wed Jul 11 15:27:13 2018 +0200 + + 1.8.3 + + NEWS | 8 ++++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 11 insertions(+), 3 deletions(-) + +commit 718dfd4189275b1e4233dc7c12ab457352fccfcb +Author: Behdad Esfahbod +Date: Tue Jul 10 16:34:31 2018 +0200 + + Fix shift + + src/hb-dsalgs.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 25aa411ac524ed08624033da473a5e050ff41633 +Author: Behdad Esfahbod +Date: Tue Jul 10 16:05:03 2018 +0200 + + Put back include dependencies + + src/hb-object-private.hh | 2 ++ + src/hb-private.hh | 7 ++++--- + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 491d93bf74dd0483715ecca430715b69664e1211 +Author: Behdad Esfahbod +Date: Tue Jul 10 16:03:31 2018 +0200 + + Move more stuff from hb-private.hh to hb-dsalgs.hh + + src/hb-debug.hh | 1 + + src/hb-dsalgs.hh | 237 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-private.hh | 246 + +----------------------------------------------------- + 3 files changed, 240 insertions(+), 244 deletions(-) + +commit f477765661c196ac17b2c86731881a3da36a5ae6 +Author: Behdad Esfahbod +Date: Tue Jul 10 15:49:05 2018 +0200 + + Move more stuff to hb-dsalgs.hh + + src/hb-dsalgs.hh | 83 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-private.hh | 81 + ----------------------------------------------------- + 2 files changed, 83 insertions(+), 81 deletions(-) + +commit be7f664f723fb4e7bcf15c1c2b7c6bec46f90393 +Author: Behdad Esfahbod +Date: Tue Jul 10 15:23:08 2018 +0200 + + Move hb_bytes_t to hb-dsalgs.hh + + src/hb-dsalgs.hh | 45 ++++++++++++++++++++++++++++++++++----------- + src/hb-private.hh | 26 -------------------------- + 2 files changed, 34 insertions(+), 37 deletions(-) + +commit 7a00f7eb2e3859db4563071934e76142bfd13916 +Author: Behdad Esfahbod +Date: Tue Jul 10 14:42:10 2018 +0200 + + Remove hb_auto_array_t + + src/hb-dsalgs.hh | 2 -- + 1 file changed, 2 deletions(-) + +commit be458eb05962dd5f5c60a25f54cf0b20e7d8b055 +Author: Behdad Esfahbod +Date: Tue Jul 10 14:41:04 2018 +0200 + + Include more basic internal headers from hb-private.hh + + src/hb-blob-private.hh | 2 -- + src/hb-blob.cc | 1 - + src/hb-buffer-private.hh | 1 - + src/hb-common.cc | 2 -- + src/hb-coretext.cc | 1 - + src/hb-directwrite.cc | 1 - + src/hb-face-private.hh | 1 - + src/hb-font-private.hh | 1 - + src/hb-ft.cc | 1 - + src/hb-map-private.hh | 1 - + src/hb-object-private.hh | 4 ---- + src/hb-open-type-private.hh | 1 - + src/hb-ot-layout-common-private.hh | 1 - + src/hb-ot-layout-gsubgpos-private.hh | 1 - + src/hb-ot-shape-complex-arabic.cc | 1 - + src/hb-private.hh | 6 +++++- + src/hb-set-private.hh | 1 - + src/hb-shape-plan-private.hh | 1 - + src/hb-shape-plan.cc | 1 - + src/hb-subset-input.cc | 1 - + src/hb-subset-plan.hh | 1 - + src/hb-subset.cc | 1 - + src/hb-unicode-private.hh | 1 - + src/hb-uniscribe.cc | 1 - + src/hb-warning.cc | 4 +--- + 25 files changed, 6 insertions(+), 32 deletions(-) + +commit bddeb2b10ca2f4b4bee6f7eaaf5615875a67111d +Author: Behdad Esfahbod +Date: Tue Jul 10 14:12:37 2018 +0200 + + Minor renamings of internal inline functions + + src/hb-buffer.cc | 4 ++-- + src/hb-dsalgs.hh | 2 +- + src/hb-map-private.hh | 2 +- + src/hb-open-type-private.hh | 4 ++-- + src/hb-ot-cmap-table.hh | 2 +- + src/hb-ot-hdmx-table.hh | 2 +- + src/hb-ot-layout-gpos-table.hh | 4 ++-- + src/hb-ot-layout-gsub-table.hh | 2 +- + src/hb-ot-map.cc | 4 ++-- + src/hb-ot-shape.cc | 4 ++-- + src/hb-private.hh | 27 ++++++++++++++------------- + src/hb-set-private.hh | 6 +++--- + src/hb-subset.cc | 2 +- + 13 files changed, 33 insertions(+), 32 deletions(-) + +commit d652ef299d123f28409e755ed2d2411295293f19 +Author: Behdad Esfahbod +Date: Tue Jul 10 14:05:00 2018 +0200 + + Move hb_vector_t and hb_lockable_set_t to hb-dsalgs.hh + + src/hb-dsalgs.hh | 311 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + src/hb-private.hh | 315 + ------------------------------------------------------ + 2 files changed, 311 insertions(+), 315 deletions(-) + +commit 9e53b083295ad910a87e778ebd16cbe69ebe2130 +Author: Behdad Esfahbod +Date: Tue Jul 10 14:03:58 2018 +0200 + + Move hb_stable_sort to hb-dsalgs.hh + + Also, include hb-dsalgs.hh from end of hb-pricate.hh + + src/hb-dsalgs.hh | 51 + +++++++++++++++++++++++++++++++++++++++++ + src/hb-ot-os2-unicode-ranges.hh | 1 - + src/hb-ot-post-table.hh | 1 - + src/hb-private.hh | 51 + ++--------------------------------------- + 4 files changed, 53 insertions(+), 51 deletions(-) + +commit 39f11d8e72c6b2568f3b70847c6c9d1f374cd49c +Author: Behdad Esfahbod +Date: Tue Jul 10 14:01:39 2018 +0200 + + Minor + + src/hb-private.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 763f878cc0595162255c58ffe7a82ac1ca51cb0b +Author: Behdad Esfahbod +Date: Tue Jul 10 13:47:41 2018 +0200 + + Fix syntax + + Oops. + + src/hb-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 83ea277178544cd7e417bdfb7b600ede94910e13 +Author: Behdad Esfahbod +Date: Tue Jul 10 13:17:27 2018 +0200 + + Add posix_memalign() fallback + + configure.ac | 2 +- + src/hb-private.hh | 40 ++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 41 insertions(+), 1 deletion(-) + +commit 292c100d6141eb2e981fa632602d73768f748727 +Author: Behdad Esfahbod +Date: Tue Jul 10 13:16:52 2018 +0200 + + Always compile (but not use) alignof() and round() fallback codes + + Catches compile-errors in them better. + + src/hb-private.hh | 23 ++++++++++++----------- + 1 file changed, 12 insertions(+), 11 deletions(-) + +commit 27c5317d918971c2fb67c213621a19ac790440e4 +Author: Behdad Esfahbod +Date: Tue Jul 10 13:03:42 2018 +0200 + + Fix alignof impl + + src/hb-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bca83618cda7ee4f683b4685d10db9e1bef4983c +Author: Behdad Esfahbod +Date: Tue Jul 10 12:58:13 2018 +0200 + + Add fallback implementation for constexpr and alignof + + src/hb-private.hh | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 7cb47d0f3f202843ebc7fb8801bf388bb90ba3aa +Author: Behdad Esfahbod +Date: Tue Jul 10 12:51:29 2018 +0200 + + Minor + + src/hb-set-private.hh | 1 + + 1 file changed, 1 insertion(+) + +commit bf9e9676dda686f5b76826b4e3148f4a0b512e3c +Merge: 46d8f0d5 53f73409 +Author: Cosimo Lupo +Date: Mon Jul 9 20:24:22 2018 +0200 + + Merge pull request #1091 from anthrotype/fix-gen-def-py + + gen-def.py: pass headers as arguments so that msys2 can convert + posix paths + +commit 53f73409a91241765ae6a0cadf7600676988b6af +Author: Cosimo Lupo +Date: Mon Jul 9 18:54:23 2018 +0100 + + CMakeLists.txt: don't pass header args as single space-separated + string + + let python's parse command-line args as usual + + CMakeLists.txt | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 83d2233a5c47cf1feadcdece5bd4a6b498c6ee7a +Author: Cosimo Lupo +Date: Mon Jul 9 18:48:20 2018 +0100 + + CMakeLists.txt: pass headers as arguments to gen-def.py; call using + PYTHON_EXECUTABLE + + CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ccdd15655480fe35226c0b757e28d3527fe2e6af +Author: Cosimo Lupo +Date: Mon Jul 9 18:26:44 2018 +0100 + + src/Makefile.am: pass headers to gen-def.py as arguments, not env vars + + src/Makefile.am | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit e3a931ef0b86419b5e4ba17de51535393471ed9d +Author: Cosimo Lupo +Date: Mon Jul 9 18:11:29 2018 +0100 + + gen-def.py: pass headers as arguments so that msys2 can convert + posix paths + + When one is not using the msys2 python, the header files that are + passed in as environment + variable cannot be found. + + https://ci.appveyor.com/project/fonttools/ttfautohint-py/build/1.0.65/job/rkremny4jjid9nl2#L803 + + This is because msys2 shell and make use POSIX paths + (e.g. /c/Users/clupo/...) + whereas non-msys2 python.exe uses native Windows paths + (e.g. C:\Users\clupo\...). + + Msys2 will automatically convert command line arguments (but not + environment variables) from + POSIX to Windows paths when calling a native win32 executable, + so we pass the header paths + as arguments instead of environment variables. + + This way the gen-def.py script can support both mingw python running + in an MSYS2 shell, and + native win32 python. + + src/gen-def.py | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 46d8f0d5521c3dd0b10c78e66153faefdb9046db +Author: David Corbett +Date: Fri Jul 6 15:47:03 2018 -0400 + + Do not enforce a native direction of LTR for Runic + + Fixes #481 + + src/hb-common.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 936dadc6610666aa5781e8662b859f18f9baa636 +Author: David Corbett +Date: Sat Jul 7 11:08:17 2018 -0400 + + Regenerate the USE table for Grantha and Bhaiksuki (#1090) + + Completes #1037 and fixes #1035. + + src/hb-ot-shape-complex-use-table.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1ebaa090d80bf0b59308d2c70f5e58dd8da47450 +Author: Behdad Esfahbod +Date: Thu Jul 5 14:04:13 2018 +0430 + + Disable vectorization + + Disable vectorization for now. To correctly use them, we should + use posix_memalign() to allocate them. Otherwise, can cause + misaligned access. + + https://bugs.chromium.org/p/chromium/issues/detail?id=860184 + + src/hb-private.hh | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +commit 18a06f8a662ca7a9e63f74c6443e24a035c40655 +Author: Behdad Esfahbod +Date: Thu Jul 5 14:03:48 2018 +0430 + + Fix warning + + ../../src/hb-ot-layout-gsubgpos-private.hh:391:18: warning: + missed loop optimization, the loop counter may overflow + [-Wunsafe-loop-optimizations] + + src/hb-ot-layout-gsubgpos-private.hh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 058708a665cdd9e796581dbcf60a5778d3f5e240 +Author: Behdad Esfahbod +Date: Thu Jul 5 13:16:00 2018 +0430 + + Allow disabling vector_size use + + src/hb-private.hh | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit d8a7dedc83042c5a643195172830acf78f2e59ff +Author: Ebrahim Byagowi +Date: Wed Jul 4 15:33:39 2018 +0430 + + Use CreateFileW explicitly and pass wchar_t to it (#1087) + + src/hb-blob.cc | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +commit 9940504e933d6766f87dca7fccc3c2f889976a22 +Author: Behdad Esfahbod +Date: Tue Jul 3 14:29:25 2018 +0430 + + [indic] Adjust left-matra repositioning and Halant,ZWJ sequence + + From the new code (first paragraph is from the OT Devanagari spec.): + + /* 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. + * + * IMPLEMENTATION NOTES: + * + * It looks like the last sentence is wrong. Testing, with Windows + 7 Uniscribe + * and Devanagari shows that the behavior is best described as: + * + * "If ZWJ follows this halant, matra is NOT repositioned after + this halant. + * If ZWNJ follows this halant, position is moved after it." + * + * Test case, with Adobe Devanagari or Nirmala UI: + * + * U+091F,U+094D,U+200C,U+092F,U+093F + * (Matra moves to the middle, after ZWNJ.) + * + * U+091F,U+094D,U+200D,U+092F,U+093F + * (Matra does NOT move, stays to the left.) + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1070 + + Test case added with Adobe Devanagari. + + src/hb-ot-shape-complex-indic.cc | 37 + +++++++++++++++++++++ + .../8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf | Bin 0 -> 4364 bytes + .../data/in-house/tests/indic-joiners.tests | 4 +++ + 3 files changed, 41 insertions(+) + +commit 2cb075fe26201f3e370fccfff6c1bc242b5acc79 +Author: Behdad Esfahbod +Date: Tue Jul 3 13:04:05 2018 +0430 + + Fix unused function '_hb_mapped_file_destroy' if no mmap + + src/hb-blob.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 343e8c694b03eea625523229a9468fbb456e3aea +Author: Behdad Esfahbod +Date: Tue Jul 3 12:43:59 2018 +0430 + + 1.8.2 + + NEWS | 8 ++++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 11 insertions(+), 3 deletions(-) + +commit 29e7879bcf3fe955a0be3bb41e929e68f39ad01e +Author: Behdad Esfahbod +Date: Tue Jul 3 12:38:21 2018 +0430 + + Disable .dfont code for now + + The get_table imple was wrong, as table offsets in a dfont are + relative to the resource. We were treating them as relative to + the big blob itself. To be fixed. + + Part of https://github.com/harfbuzz/harfbuzz/pull/1085 + + src/hb-open-file-private.hh | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 32348a43c154eac6bfb21b9e8044b38ed763601e +Author: Ebrahim Byagowi +Date: Sun Jul 1 15:32:43 2018 +0430 + + Fix trak table apply logic + + In collaboration with Behdad + + src/hb-aat-layout-trak-table.hh | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 225b92b7d4437360f8779850ee0aae85966679b5 +Author: Ebrahim Byagowi +Date: Sun Jul 1 14:32:00 2018 +0430 + + Support dfont font files (#949) + + src/hb-open-file-private.hh | 196 + ++++++++++++++++++++++++++++++++++++++++++++ + src/hb-open-type-private.hh | 1 + + src/main.cc | 3 + + 3 files changed, 200 insertions(+) + +commit 5d8cafcf6a47ce73afff06499f6be23c72ab6797 +Author: Ebrahim Byagowi +Date: Sun Jul 1 01:54:14 2018 +0430 + + Improve nommap naming and use C style comments on create_from_file + (#1084) + + .circleci/config.yml | 2 +- + src/hb-blob.cc | 16 ++++++++-------- + 2 files changed, 9 insertions(+), 9 deletions(-) + +commit d3c0980ac234698627cb281e5526cc99139eed30 +Author: Behdad Esfahbod +Date: Sat Jun 30 15:59:25 2018 +0430 + + Adjust MarkBasePos heuristic in presence of MultipleSubst + + From the issue: + "In this font, the virama,ya first forms a ligature, then decomposes + back to + virama,ya. This causes those two to be marked parts of a MultipleSubst + sequence. When attaching the matra, we look for the first of the + MultipleSubst + sequence because that's where we attach to (because of eg #740). In + this case, + the first glyph in the MultipleSubst sequence is a mark, so we skip + it and + attach to the base char before it." + + Font in question is Nirmala UI from Windows 10. Test sequence: + + U+0926,U+094D,U+092F,U+0941 + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1020 + + src/hb-ot-layout-gpos-table.hh | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 8b9cbe3b24be2ae0166e682103e22ec916316ecf +Author: Behdad Esfahbod +Date: Sat Jun 30 12:28:03 2018 +0430 + + [indic] Tweak for old-spec Bengali and halant-ya-halant + + Fixes https://github.com/harfbuzz/harfbuzz/issues/1073 + + src/hb-ot-shape-complex-indic.cc | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +commit 9541c9dae10156fb61e4786545d1976cdcfb6bda +Author: punchcutter +Date: Sun Jun 24 22:54:57 2018 -0700 + + Rebase and update USE overrides for Bhaiksuki Gap Fillers and + Grantha Anusvara + + src/gen-use-table.py | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 7b8dfac560abe89d48cfc2f6efb4a61820bd28bf +Author: Behdad Esfahbod +Date: Sat Jun 30 09:16:54 2018 +0430 + + [khmer] Fix infinite-loop in cluster merging + + Indic shaper already had this check. We removed it when forking + Khmer shaper by mistake. + + Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1464623 + + src/hb-ot-shape-complex-khmer.cc | 31 +++++++++++++++++-------------- + 1 file changed, 17 insertions(+), 14 deletions(-) + +commit 25970a93aa6596d50ae538c6274625f95153572c +Author: Ebrahim Byagowi +Date: Thu Jun 28 14:32:36 2018 +0430 + + armcc compatibility, don't use EINTR if doesn't exist + + Fixes #1081 + + src/hb-blob.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8a51f91b7035bbfaf39af1b962faf1613d2ea3b7 +Author: Ebrahim Byagowi +Date: Thu Jun 28 13:22:21 2018 +0430 + + Minor on hb_blob_create_from_file, reuse ferror result + + Oops + + src/hb-blob.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 71971800ed1c0501a58e6ff7730e3cebec2ef2f8 +Author: Ebrahim Byagowi +Date: Wed Jun 27 18:14:52 2018 +0430 + + [ci] Don't fail on apt update and revive clang-O3-O0 + + .circleci/config.yml | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7b4099f35f766d33d483a4b9d0805ef16020ea23 +Author: Ebrahim Byagowi +Date: Wed Jun 27 16:54:44 2018 +0430 + + Minor, rename blob to data on blob_from_file + + src/hb-blob.cc | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +commit fa090ed4d47df12b2e611c9a667c398742f7e4ba +Author: Ebrahim Byagowi +Date: Wed Jun 27 14:13:26 2018 +0430 + + Minor touches on hb_blob_create_from_file (#1079) + + * Handle EINTR on fallback reader + * Increase fallback reader limitation size limitation to 2 << 28 + * Ensure _O_BINARY does exist if MMAP is used on Windows + (maybe superfluous but makes me more confident) + + src/hb-blob.cc | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +commit 01dff1ea1aa871fa19a92c2afd63c8cb5dd6e455 +Author: Behdad Esfahbod +Date: Tue Jun 26 18:00:58 2018 -0400 + + Make round() fallback portable to systems that do have round() + + Makes compiling without HAVE_ROUND on systems that do have it work. + + src/hb-private.hh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7db2e9ea38329b9393c9e8cc905b180735c9b0f4 +Author: Ebrahim Byagowi +Date: Tue Jun 26 10:46:10 2018 +0430 + + Minor on hb_blob_create_from_file + + Add one more "unlikely" annotation and use explicit nullptr check + for more consistency. + + src/hb-blob.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4f8753464ae44dfb60bee81ede10448175db7b90 +Author: Garret Rieger +Date: Fri Jun 22 15:29:34 2018 -0700 + + [subset] Add fuzzer test case that caused a timeout to the corpus. + + ...testcase-minimized-hb-subset-fuzzer-5750092395970560 | Bin 0 -> + 72435 bytes + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 35ce8f31d37cf7c2a1f8265d36ba4c2c9a3efb2c +Author: Ebrahim Byagowi +Date: Mon Jun 25 22:23:43 2018 +0430 + + Unify our pipe reader with the fallback reader (#1068) + + And assign one bot to use the path always using NOMMAPFILEREADER + token. + + It's limited to 200mb so no more fun with using /dev/zero on hb-view! + + .circleci/config.yml | 6 +- + src/hb-blob.cc | 152 + ++++++++++++++++++++++----------------------------- + 2 files changed, 68 insertions(+), 90 deletions(-) + +commit f57804a8a596e88843ddc8b88afac7526349b89b +Author: Ebrahim Byagowi +Date: Mon Jun 25 18:45:49 2018 +0430 + + Resolve ttx absolute path before use (#1075) + + test/subset/run-tests.py | 101 + ++++++++++++++++++++++++++--------------------- + 1 file changed, 57 insertions(+), 44 deletions(-) + +commit 159ddb872986f121818e816d2ea75d271075ba1f +Author: Ebrahim Byagowi +Date: Sun Jun 24 23:09:16 2018 +0430 + + Treat - just as /dev/stdin and remove one extra file reader (#1065) + + util/options.cc | 27 +++++++++------------------ + 1 file changed, 9 insertions(+), 18 deletions(-) + +commit b2a187918757a0faaf0f564ec2b0766c09fa364c +Author: Behdad Esfahbod +Date: Sat Jun 23 10:32:28 2018 -0400 + + In Coverage iterator, bail out if table smells + + In particular, if CoverageFormat2 has unsorted ranges, bail out. + Otherwise, 64k ranges of each 64k glyphs can DoS closure() method. + + We can do the same for CoverageFormat1, but that one does not expose + the quadratic behavior, so, fine. + + src/hb-ot-layout-common-private.hh | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +commit 941f2b85489b344698bf036922c589483034a7f2 +Author: Ebrahim Byagowi +Date: Mon Jun 18 20:35:40 2018 +0430 + + Support pipe and friends on hb_blob_create_from_file (#1061) + + With this hb-view/hb-shape support pipes and possibly socket and + named pipe + also, anything fails just on mmap. + + We can later do the same for Windows also. + + This however reveals two issues, the fact most of our bots don't + have HAVE_MMAP and using + this instead the other fread/fopen reader can make failure on CI. I + should look at them separately + this change however is very low risk I believe. + + src/hb-blob.cc | 44 +++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 43 insertions(+), 1 deletion(-) + +commit d0c2889dfc43da92c76d6eab5482b1298744dc9c +Author: Ebrahim Byagowi +Date: Mon Jun 18 19:59:33 2018 +0430 + + Revert file blob sanitization and index checking (#1062) + + As + https://github.com/harfbuzz/harfbuzz/pull/1059#issuecomment-397912812 + we + like to still work with blobs that harfbuzz itself can't handle + directly that are failing sanitization + currently apparently. + + util/options.cc | 12 ++---------- + util/options.hh | 2 +- + 2 files changed, 3 insertions(+), 11 deletions(-) + +commit c53697d3f2a3fae8b68ec4c5146c7000a07e0963 +Author: Ebrahim Byagowi +Date: Sun Jun 17 17:04:55 2018 +0430 + + Verbose fail when something is wrong with hb-shape/hb-view input + font file (#1059) + + This checks if the blob isn't empty and uses `hb_face_count` + to see if the font file passes the simple font file sanitization + so can detect if the input is actually a font and checks also + whether input font-index is out of range. + + util/options.cc | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit aa0c5df4199ef4e96df2b856c8f629e49fdd5120 +Author: Ebrahim Byagowi +Date: Sun Jun 17 16:49:34 2018 +0430 + + Fix reading fonts from stdin (#1060) + + We were passing the font path directly to freetype so rendering + was broken when we are getting the font from stdin. + + This fixes it by using FT_New_Memory_Face instead. + + This fixes: + * build/util/hb-view /dev/stdin text < font.ttf + * build/util/hb-view - text < font.ttf + * cat font.ttf | build/util/hb-view - text + + but doesn't work on + * cat font.ttf | build/util/hb-view /dev/stdin text + + which I will try to fix separately. + + util/helper-cairo.cc | 14 ++++++++++---- + util/options.cc | 5 ++--- + util/options.hh | 4 +++- + 3 files changed, 15 insertions(+), 8 deletions(-) + +commit 3654d9be6b017e66307fe0ffe635266938b14702 +Author: Behdad Esfahbod +Date: Tue Jun 12 19:38:04 2018 -0400 + + 1.8.1 + + NEWS | 8 ++++++++ + configure.ac | 2 +- + src/hb-version.h | 4 ++-- + 3 files changed, 11 insertions(+), 3 deletions(-) + commit f3e58ab8a957cdf36bddef793c473664744885a7 Author: Behdad Esfahbod Date: Tue Jun 12 19:32:04 2018 -0400 diff --git a/Makefile.in b/Makefile.in index 7ea6386..6faf227 100644 --- a/Makefile.in +++ b/Makefile.in @@ -96,8 +96,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ @@ -328,6 +327,8 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ diff --git a/NEWS b/NEWS index 12010bd..ef87dad 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,341 @@ +Overview of changes leading to 2.3.1 +Wednesday, January 30, 2019 +==================================== +- AAT bug fixes. +- Misc internal housekeeping cleanup. + + +Overview of changes leading to 2.3.0 +Thursday, December 20, 2018 +==================================== +- Fix regression on big-endian architectures. Ouch! +- Misc bug and build fixes. +- Fix subsetting of simple GSUB/GDEF. +- Merge CFF / CFF2 support contributed by Adobe. This mostly involves + the subsetter, but also get_glyph_extents on CFF fonts. + +New API in hb-aat.h: ++hb_aat_layout_has_substitution() ++hb_aat_layout_has_positioning() ++hb_aat_layout_has_tracking() + + +Overview of changes leading to 2.2.0 +Thursday, November 29, 2018 +==================================== +- Misc shaping bug fixes. +- Add font variations named-instance API. +- Deprecate font variations axis enumeration API and add replacement. +- AAT shaping improvements: + o Fixed 'kern' table Format 2 implementation. + o Implement 'feat' table API for feature detection. + o Blacklist 'GSUB' table of fonts from 'MUTF' foundry that also have 'morx'. + +New API: ++hb_aat_layout_feature_type_t ++hb_aat_layout_feature_selector_t ++hb_aat_layout_get_feature_types() ++hb_aat_layout_feature_type_get_name_id ++hb_aat_layout_feature_selector_info_t ++HB_AAT_LAYOUT_NO_SELECTOR_INDEX ++hb_aat_layout_feature_type_get_selector_infos() ++hb_ot_var_axis_flags_t ++hb_ot_var_axis_info_t ++hb_ot_var_get_axis_infos() ++hb_ot_var_find_axis_info() ++hb_ot_var_get_named_instance_count() ++hb_ot_var_named_instance_get_subfamily_name_id() ++hb_ot_var_named_instance_get_postscript_name_id() ++hb_ot_var_named_instance_get_design_coords() + +Deprecated API: ++HB_OT_VAR_NO_AXIS_INDEX ++hb_ot_var_axis_t ++hb_ot_var_get_axes() ++hb_ot_var_find_axis() + + +Overview of changes leading to 2.1.3 +Friday, November 16, 2018 +==================================== +- Fix AAT 'mort' shaping, which was broken in 2.1.2 + + +Overview of changes leading to 2.1.2 +Friday, November 16, 2018 +==================================== +- Various internal changes. +- AAT shaping improvements: + o Implement kern table Format 1 state-machine-based kerning. + o Implement cross-stream kerning (cursive positioning, etc). + o Ignore emptyish GSUB tables (zero scripts) if morx present. + o Don't apply GPOS if morx is being applied. Matches Apple. + + +-Overview of changes leading to 2.1.1 +Monday, November 5, 2018 +==================================== +- AAT improvements: + o Implement 'mort' table. + o Implement 'kern' subtables Format 1 and Format 3. + + +Overview of changes leading to 2.1.0 +Tuesday, October 30, 2018 +==================================== +- AAT shaping improvements: + o Allow user controlling AAT features, for whole buffer only currently. + o Several 'morx' fixes. + o Implement tuple-kerns in 'kerx'; Fixes kerning with Apple default + San Francisco fonts. +- Support for color fonts: + o COLR/CPAL API to fetch color layers. + o SVG table to fetch SVG documents. + o CBDT/sbix API to fetch PNG images. +- New 'name' table API. +- hb-ot-font now uses 'VORG' table to correctly position CFF glyphs + in vertical layout. +- Various fuzzer-found bug fixes. + +Changed API: + +A type and a macro added in 2.0.0 were renamed: + +hb_name_id_t -> hb_ot_name_id_t +HB_NAME_ID_INVALID -> HB_OT_NAME_ID_INVALID + +New API: + ++hb_color_t ++HB_COLOR ++hb_color_get_alpha() ++hb_color_get_red() ++hb_color_get_green() ++hb_color_get_blue() ++hb_ot_color_has_palettes() ++hb_ot_color_palette_get_count() ++hb_ot_color_palette_get_name_id() ++hb_ot_color_palette_color_get_name_id() ++hb_ot_color_palette_flags_t ++hb_ot_color_palette_get_flags() ++hb_ot_color_palette_get_colors() ++hb_ot_color_has_layers() ++hb_ot_color_layer_t ++hb_ot_color_glyph_get_layers() ++hb_ot_color_has_svg() ++hb_ot_color_glyph_reference_svg() ++hb_ot_color_has_png() ++hb_ot_color_glyph_reference_png() + ++hb_ot_name_id_t ++HB_OT_NAME_ID_INVALID ++HB_OT_NAME_ID_COPYRIGHT ++HB_OT_NAME_ID_FONT_FAMILY ++HB_OT_NAME_ID_FONT_SUBFAMILY ++HB_OT_NAME_ID_UNIQUE_ID ++HB_OT_NAME_ID_FULL_NAME ++HB_OT_NAME_ID_VERSION_STRING ++HB_OT_NAME_ID_POSTSCRIPT_NAME ++HB_OT_NAME_ID_TRADEMARK ++HB_OT_NAME_ID_MANUFACTURER ++HB_OT_NAME_ID_DESIGNER ++HB_OT_NAME_ID_DESCRIPTION ++HB_OT_NAME_ID_VENDOR_URL ++HB_OT_NAME_ID_DESIGNER_URL ++HB_OT_NAME_ID_LICENSE ++HB_OT_NAME_ID_LICENSE_URL ++HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY ++HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY ++HB_OT_NAME_ID_MAC_FULL_NAME ++HB_OT_NAME_ID_SAMPLE_TEXT ++HB_OT_NAME_ID_CID_FINDFONT_NAME ++HB_OT_NAME_ID_WWS_FAMILY ++HB_OT_NAME_ID_WWS_SUBFAMILY ++HB_OT_NAME_ID_LIGHT_BACKGROUND ++HB_OT_NAME_ID_DARK_BACKGROUND ++HB_OT_NAME_ID_VARIATIONS_PS_PREFIX ++hb_ot_name_entry_t ++hb_ot_name_list_names() ++hb_ot_name_get_utf8() ++hb_ot_name_get_utf16() ++hb_ot_name_get_utf32() + + +Overview of changes leading to 2.0.2 +Saturday, October 20, 2018 +==================================== +- Fix two minor memory access issues in AAT tables. + + +Overview of changes leading to 2.0.1 +Friday, October 19, 2018 +==================================== +- Fix hb-version.h reported release version that went wrong (1.8.0) + with previous release. +- Fix extrapolation in 'trak' table. +- Fix hb-font infinite-recursion issue with some font funcs and + subclassed fonts. +- Implement variation-kerning format in kerx table, although without + variation. +- Fix return value of hb_map_is_empty(). + + +Overview of changes leading to 2.0.0 +Thursday, October 18, 2018 +==================================== +- Added AAT shaping support (morx/kerx/trak). + Automatically used if GSUB/GPOS are not available respectively. + Set HB_OPTIONS=aat env var to have morx/kerx preferred over + GSUB/GPOS. +- Apply TrueType kern table internally, instead of relying on + hb_font_t callbacks. +- Khmer shaper significantly rewritten to better match Uniscribe. +- Indic3 tags ('dev3', etc) are passed to USE shaper. +- .dfont Mac font containers implemented. +- Script- and language-mapping revamped to better use BCP 47. +- Misc USE and Indic fixes. +- Misc everything fixes. +- Too many things to list. Biggest release since 0.9.1, with + over 500 commits in just over 5 weeks! Didn't intend it to + be a big release. Just happened to become. +- hb-ft now locks underlying FT_Face during use. + +API changes: + +- Newly-created hb_font_t's now have our internal "hb-ot-font" + callbacks set on them, so they should work out of the box + without any callbacks set. If callbacks are set, everything + is back to what it was before, the fallback callbacks are + null. If you to get the internal implementation modified, + sub_font it. + +- New hb_font_funcs_set_nominal_glyphs_func() allows speeding + up character to glyph mapping. + +New API: ++HB_FEATURE_GLOBAL_START ++HB_FEATURE_GLOBAL_END ++hb_buffer_set_invisible_glyph() ++hb_buffer_get_invisible_glyph() ++hb_font_funcs_set_nominal_glyphs_func() ++hb_ot_layout_table_select_script() ++hb_ot_layout_script_select_language() ++hb_ot_layout_feature_get_name_ids() ++hb_ot_layout_feature_get_characters() ++hb_name_id_t ++HB_NAME_ID_INVALID ++HB_OT_MAX_TAGS_PER_SCRIPT ++hb_ot_tags_from_script_and_language() ++hb_ot_tags_to_script_and_language() + +Deprecated API: +-hb_font_funcs_set_glyph_func() +-hb_unicode_eastasian_width_func_t +-hb_unicode_funcs_set_eastasian_width_func() +-hb_unicode_eastasian_width() +-hb_unicode_decompose_compatibility_func_t +-HB_UNICODE_MAX_DECOMPOSITION_LEN +-hb_unicode_funcs_set_decompose_compatibility_func() +-hb_unicode_decompose_compatibility() +-hb_font_funcs_set_glyph_h_kerning_func() +-hb_font_funcs_set_glyph_v_kerning_func() +-hb_font_get_glyph_h_kerning() +-hb_font_get_glyph_v_kerning() +-hb_font_get_glyph_kerning_for_direction() +-hb_ot_layout_table_choose_script() +-hb_ot_layout_script_find_language() +-hb_ot_tags_from_script() +-hb_ot_tag_from_language() + + +Overview of changes leading to 1.9.0 +Monday, September 10, 2018 +==================================== +- Added 'cmap' API to hb_face_t. +- Face-builder API. +- hb-ot-font re-creation should be much leaner now, as the + font tables it uses are cached on hb_face_t now. +- Internal source header file name changes: + hb-*-private.hh is renamed to hb-*.hh. + +New API: ++HB_UNICODE_MAX ++hb_face_collect_unicodes() ++hb_face_collect_variation_selectors() ++hb_face_collect_variation_unicodes() ++hb_face_builder_create() ++hb_face_builder_add_table() + + +Overview of changes leading to 1.8.8 +Tuesday, August 14, 2018 +==================================== +- Fix hb-icu crash on architectures where compare_exchange_weak() can + fail falsely. This bug was introduced in 1.8.4. + https://bugs.chromium.org/p/chromium/issues/detail?id=873568 +- More internal refactoring of atomic operations and singletons. +- API changes: + The following functions do NOT reference their return value before + returning: + * hb_unicode_funcs_get_default() + * hb_glib_get_unicode_funcs() + * hb_icu_get_unicode_funcs() + This is consistent with their naming ("get", instead of "reference") + as well as how they are used in the wild (ie. no one calls destroy() + on their return value.) + + +Overview of changes leading to 1.8.7 +Wednesday, August 8, 2018 +==================================== +- Fix assertion failure with GDEF-blacklisted fonts. + + +Overview of changes leading to 1.8.6 +Tuesday, August 7, 2018 +==================================== +- Internal code shuffling. +- New API to speed up getting advance widths for implementations + that have heavy overhead in get_h_advance callback: ++hb_font_funcs_set_glyph_h_advances_func ++hb_font_funcs_set_glyph_v_advances_func ++hb_font_get_glyph_advances_for_direction ++hb_font_get_glyph_h_advances ++hb_font_get_glyph_h_advances_func_t ++hb_font_get_glyph_v_advances ++hb_font_get_glyph_v_advances_func_t + + +Overview of changes leading to 1.8.5 +Wednesday, August 1, 2018 +==================================== +- Major Khmer shaper improvements to better match Microsoft. +- Indic bug fixes. +- Internal improvements to atomic operations. + + +Overview of changes leading to 1.8.4 +Tuesday, July 17, 2018 +==================================== +- Fix build on non-C++11. +- Use C++-style GCC atomics and C++11 atomics. + + +Overview of changes leading to 1.8.3 +Wednesday, July 11, 2018 +==================================== +- A couple of Indic / USE bug fixes. +- Disable vectorization, as it was causing unaligned access bus error on + certain 32bit architectures. + + +Overview of changes leading to 1.8.2 +Tuesday, July 3, 2018 +==================================== +- Fix infinite loop in Khmer shaper. +- Improve hb_blob_create_from_file() for streams. + + Overview of changes leading to 1.8.1 Tuesday, June 12, 2018 ==================================== @@ -5,6 +343,7 @@ Tuesday, June 12, 2018 - Add correctness bug in hb_set_t operations, introduced in 1.7.7. - Remove HB_SUBSET_BUILTIN build option. Not necessary. + Overview of changes leading to 1.8.0 Tuesday, June 5, 2018 ==================================== diff --git a/README b/README index 55775c8..fd93be8 100644 --- a/README +++ b/README @@ -1,9 +1,10 @@ -[![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) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz) -[![Coverage Status](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz) +[![Travis Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg?branch=master)](https://travis-ci.org/harfbuzz/harfbuzz) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true&branch=master)](https://ci.appveyor.com/project/harfbuzz/harfbuzz) +[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz/tree/master) +[![Coverity Code Health](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz) +[![Codacy Code Health](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz) +[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/master/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz) +[![Coverals Code Coverage](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz) [ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/) This is HarfBuzz, a text shaping library. diff --git a/README.python.md b/README.python.md index 4c0ba9b..7cf091a 100644 --- a/README.python.md +++ b/README.python.md @@ -23,7 +23,7 @@ Then make sure you also have GI_TYPELIB_PATH pointing to the resulting $prefix/lib/girepository-* directory. Make sure you have pygobject installed. Then check that the following -import works in your Python interpretter: +import works in your Python interpreter: ```python from gi.repository import HarfBuzz diff --git a/README.wine.md b/README.wine.md index 851d2bf..799eb63 100644 --- a/README.wine.md +++ b/README.wine.md @@ -1,6 +1,6 @@ For the development of HarfBuzz, the Microsoft shaping technology, Uniscribe, as a widely used and tested shaper is used as more-or-less OpenType reference -implemenetation and that specially is important where OpenType specification +implementation and that specially is important where OpenType specification is or wasn't that clear. For having access to Uniscribe on Linux/macOS these steps are recommended: @@ -27,8 +27,8 @@ steps are recommended: Now you can use hb-shape using `wine winbuild/util/hb-shape.exe` but if you like to to use the original Uniscribe, -8. Bring a 32bit version of `usp10.dll` for youself from `C:\Windows\SysWOW64\usp10.dll` of your - Windows installation (asuming you have a 64-bit installation, otherwise `C:\Windows\System32\usp10.dll`) +8. Bring a 32bit version of `usp10.dll` for yourself from `C:\Windows\SysWOW64\usp10.dll` of your + Windows installation (assuming you have a 64-bit installation, otherwise `C:\Windows\System32\usp10.dll`) that it is not a DirectWrite proxy ([for more info](https://en.wikipedia.org/wiki/Uniscribe)). Rule of thumb, your `usp10.dll` should have a size more than 500kb, otherwise it is designed to work with DirectWrite which Wine can't work with its original one. diff --git a/RELEASING.md b/RELEASING.md index 0aef610..1fd8365 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -8,7 +8,8 @@ HarfBuzz release walk-through checklist: Document them in NEWS. All API and API semantic changes should be clearly marked as API additions, API changes, or API deletions. Document deprecations. Ensure all new API / deprecations are in listed correctly in - docs/harfbuzz-sections.txt + docs/harfbuzz-sections.txt. If release added new API, add entry for new + API index at the end of docs/harfbuzz-docs.xml. If there's a backward-incompatible API change (including deletions for API used anywhere), that's a release blocker. Do NOT release. @@ -25,11 +26,17 @@ HarfBuzz release walk-through checklist: 6. Do "make distcheck", if it passes, you get a tarball. Otherwise, fix things and commit them separately before making release, + Note: Check src/hb-version.h and make sure the new version number is + there. Sometimes, it does not get updated. If that's the case, + "touch configure.ac" and rebuild. Also check that there is no hb-version.h + in your build/src file. Typically it will fail the distcheck if there is. + That's what happened to 2.0.0 going out with 1.8.0 hb-version.h... So, that's + a clue. 7. "make release-files". Enter your GPG password. This creates a sha256 hash and signs it. -8. Now that you have release files built, commit NEWS and configure.ac changes, +8. Now that you have release files, commit NEWS, configure.ac, and src/hb-version.h, as well as any REPLACEME changes you made. The commit message is simply the release number. Eg. "1.4.7" diff --git a/TODO b/TODO index 6dac0be..d8e4105 100644 --- a/TODO +++ b/TODO @@ -1,9 +1,3 @@ -General fixes: -============= - -- Implement 'rand' feature. - - API issues: =========== @@ -19,11 +13,7 @@ API additions - Add hb-cairo glue -- Add sanitize API (and a cached version, that saves result on blob user-data) - -- BCP 47 language handling / API (language_matches?) - -- Add hb_font_create_unscaled()? +- Add sanitize API. - Add query / enumeration API for aalt-like features? diff --git a/aclocal.m4 b/aclocal.m4 index 178d1c5..ecde363 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -117,6 +117,282 @@ AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE], _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require]) ]) +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl serial 11 (pkg-config-0.29) +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + # Copyright (C) 2002-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation @@ -1316,4 +1592,3 @@ m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) -m4_include([m4/pkg.m4]) diff --git a/config.guess b/config.guess index 2e9ad7f..31e01ef 100755 --- a/config.guess +++ b/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2016 Free Software Foundation, Inc. +# Copyright 1992-2017 Free Software Foundation, Inc. -timestamp='2016-10-02' +timestamp='2017-11-07' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -15,7 +15,7 @@ timestamp='2016-10-02' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -27,7 +27,7 @@ timestamp='2016-10-02' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . @@ -39,7 +39,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2016 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -244,6 +244,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} exit ;; + *:MidnightBSD:*:*) + echo ${UNAME_MACHINE}-unknown-midnightbsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -259,6 +262,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; + *:Redox:*:*) + echo ${UNAME_MACHINE}-unknown-redox + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -315,15 +321,6 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in exitcode=$? trap '' 0 exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; @@ -485,13 +482,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); @@ -614,7 +611,7 @@ EOF *:AIX:*:*) echo rs6000-ibm-aix exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and @@ -635,8 +632,8 @@ EOF 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` @@ -749,7 +746,7 @@ EOF { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) @@ -758,7 +755,7 @@ EOF *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) @@ -837,10 +834,11 @@ EOF UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin @@ -854,10 +852,6 @@ EOF *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; @@ -873,27 +867,12 @@ EOF echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; @@ -1096,7 +1075,7 @@ EOF i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + i*86:*:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} @@ -1303,14 +1282,21 @@ EOF if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub @@ -1334,15 +1320,18 @@ EOF *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-?:NONSTOP_KERNEL:*:*) + NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; - NSR-?:NONSTOP_KERNEL:*:*) + NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk${UNAME_RELEASE} + exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; @@ -1414,16 +1403,28 @@ EOF exit ;; esac +echo "$0: unable to guess system type" >&2 + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -33,7 +33,7 @@ timestamp='2016-11-04' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -57,7 +57,7 @@ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -67,7 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2016 Free Software Foundation, Inc. +Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -229,9 +229,6 @@ case $os in -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; -psos*) os=-psos ;; @@ -263,7 +260,7 @@ case $basic_machine in | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ - | i370 | i860 | i960 | ia64 \ + | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ @@ -315,7 +312,7 @@ case $basic_machine in | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ - | we32k \ + | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown @@ -388,7 +385,7 @@ case $basic_machine in | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ @@ -446,6 +443,7 @@ case $basic_machine in | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ + | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ @@ -641,7 +639,7 @@ case $basic_machine in basic_machine=rs6000-bull os=-bosx ;; - dpx2* | dpx2*-bull) + dpx2*) basic_machine=m68k-bull os=-sysv3 ;; @@ -903,7 +901,7 @@ case $basic_machine in basic_machine=v70-nec os=-sysv ;; - next | m*-next ) + next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) @@ -948,6 +946,9 @@ case $basic_machine in nsr-tandem) basic_machine=nsr-tandem ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf @@ -1243,6 +1244,9 @@ case $basic_machine in basic_machine=a29k-wrs os=-vxworks ;; + wasm32) + basic_machine=wasm32-unknown + ;; w65*) basic_machine=w65-wdc os=-none @@ -1251,6 +1255,9 @@ case $basic_machine in basic_machine=hppa1.1-winbond os=-proelf ;; + x64) + basic_machine=x86_64-pc + ;; xbox) basic_machine=i686-pc os=-mingw32 @@ -1358,8 +1365,8 @@ esac if [ x"$os" != x"" ] then case $os in - # First match some system type aliases - # that might get confused with valid system types. + # First match some system type aliases that might get confused + # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux @@ -1379,9 +1386,9 @@ case $os in -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; - # First accept the basic system types. + # Now accept the basic system types. # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. + # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ @@ -1397,7 +1404,7 @@ case $os in | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ @@ -1409,7 +1416,7 @@ case $os in | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ - | -onefs* | -tirtos* | -phoenix* | -fuchsia*) + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1484,7 +1491,7 @@ case $os in -nova*) os=-rtmk-nova ;; - -ns2 ) + -ns2) os=-nextstep2 ;; -nsk*) @@ -1539,6 +1546,19 @@ case $os in -dicos*) os=-dicos ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; -nacl*) ;; -ios) @@ -1638,6 +1658,9 @@ case $basic_machine in sparc-* | *-sun) os=-sunos4.1.1 ;; + pru-*) + os=-elf + ;; *-be) os=-beos ;; @@ -1683,7 +1706,7 @@ case $basic_machine in m88k-omron*) os=-luna ;; - *-next ) + *-next) os=-nextstep ;; *-sequent) @@ -1818,7 +1841,7 @@ echo $basic_machine$os exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/configure b/configure index bd784a3..54a04a1 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for HarfBuzz 1.8.1. +# Generated by GNU Autoconf 2.69 for HarfBuzz 2.3.1. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='HarfBuzz' PACKAGE_TARNAME='harfbuzz' -PACKAGE_VERSION='1.8.1' -PACKAGE_STRING='HarfBuzz 1.8.1' +PACKAGE_VERSION='2.3.1' +PACKAGE_STRING='HarfBuzz 2.3.1' PACKAGE_BUGREPORT='https://github.com/harfbuzz/harfbuzz/issues/new' PACKAGE_URL='http://harfbuzz.org/' @@ -702,8 +702,6 @@ GLIB_CFLAGS GLIB_DEPS HAVE_FALLBACK_FALSE HAVE_FALLBACK_TRUE -HAVE_OT_FALSE -HAVE_OT_TRUE HAVE_PTHREAD_FALSE HAVE_PTHREAD_TRUE PTHREAD_CFLAGS @@ -742,6 +740,8 @@ HB_VERSION_MINOR HB_VERSION_MAJOR GIT RAGEL +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH PKG_CONFIG CXXCPP am__fastdepCXX_FALSE @@ -925,6 +925,8 @@ CXXFLAGS CCC CXXCPP PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR GTKDOC_DEPS_CFLAGS GTKDOC_DEPS_LIBS GLIB_CFLAGS @@ -1493,7 +1495,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 1.8.1 to adapt to many kinds of systems. +\`configure' configures HarfBuzz 2.3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1564,7 +1566,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of HarfBuzz 1.8.1:";; + short | recursive ) echo "Configuration of HarfBuzz 2.3.1:";; esac cat <<\_ACEOF @@ -1644,6 +1646,10 @@ Some influential environment variables: CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path GTKDOC_DEPS_CFLAGS C compiler flags for GTKDOC_DEPS, overriding pkg-config GTKDOC_DEPS_LIBS @@ -1743,7 +1749,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -HarfBuzz configure 1.8.1 +HarfBuzz configure 2.3.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2018,97 +2024,6 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_func -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## -------------------------------------------------------------- ## -## Report this to https://github.com/harfbuzz/harfbuzz/issues/new ## -## -------------------------------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. @@ -2276,6 +2191,97 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_decl +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## -------------------------------------------------------------- ## +## Report this to https://github.com/harfbuzz/harfbuzz/issues/new ## +## -------------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes @@ -2607,7 +2613,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by HarfBuzz $as_me 1.8.1, which was +It was created by HarfBuzz $as_me 2.3.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3476,7 +3482,7 @@ fi # Define the identity of the package. PACKAGE='harfbuzz' - VERSION='1.8.1' + VERSION='2.3.1' # Some tools Automake needs. @@ -13453,67 +13459,6 @@ CC=$lt_save_CC # Check for programs - - ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = xyes; then : - MINIX=yes -else - MINIX= -fi - - - if test "$MINIX" = yes; then - -$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h - - -$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h - - -$as_echo "#define _MINIX 1" >>confdefs.h - - fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 -$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if ${ac_cv_safe_to_define___extensions__+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -# define __EXTENSIONS__ 1 - $ac_includes_default -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_safe_to_define___extensions__=yes -else - ac_cv_safe_to_define___extensions__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 -$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } - test $ac_cv_safe_to_define___extensions__ = yes && - $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h - - $as_echo "#define _ALL_SOURCE 1" >>confdefs.h - - $as_echo "#define _GNU_SOURCE 1" >>confdefs.h - - $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h - - $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h - - ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -18335,6 +18280,11 @@ fi + + + + + if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. @@ -18447,7 +18397,6 @@ $as_echo "yes" >&6; } $as_echo "no" >&6; } PKG_CONFIG="" fi - fi RAGEL=${RAGEL-"${am_missing_run}ragel"} @@ -18461,10 +18410,10 @@ GIT=${GIT-"${am_missing_run}git"} -HB_VERSION_MAJOR=1 -HB_VERSION_MINOR=8 +HB_VERSION_MAJOR=2 +HB_VERSION_MINOR=3 HB_VERSION_MICRO=1 -HB_VERSION=1.8.1 +HB_VERSION=2.3.1 @@ -18475,7 +18424,7 @@ HB_VERSION=1.8.1 -HB_LIBTOOL_VERSION_INFO=10800:1:10800 +HB_LIBTOOL_VERSION_INFO=20301:0:20301 @@ -18727,46 +18676,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5 $as_echo_n "checking for GTKDOC_DEPS... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$GTKDOC_DEPS_CFLAGS"; then - pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GTKDOC_DEPS_CFLAGS"; then + pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$GTKDOC_DEPS_LIBS"; then - pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GTKDOC_DEPS_LIBS"; then + pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -18774,24 +18723,24 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0"` + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` else - GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0"` + GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - : + fi fi @@ -18874,7 +18823,7 @@ fi # Functions and headers -for ac_func in atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l +for ac_func in atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l posix_memalign do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -19014,9 +18963,6 @@ fi # by overriding CXXFLAGS. CXXFLAGS="-fno-rtti $CXXFLAGS -fno-exceptions -fno-threadsafe-statics" - # Assorted warnings - CXXFLAGS="$CXXFLAGS -Wcast-align" - case "$host" in *-*-mingw*) ;; @@ -19721,21 +19667,6 @@ fi -have_ot=true -if $have_ot; then - -$as_echo "#define HAVE_OT 1" >>confdefs.h - -fi - if $have_ot; then - HAVE_OT_TRUE= - HAVE_OT_FALSE='#' -else - HAVE_OT_TRUE='#' - HAVE_OT_FALSE= -fi - - have_fallback=true if $have_fallback; then @@ -19769,46 +19700,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$GLIB_CFLAGS"; then - pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GLIB_CFLAGS"; then + pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GLIB_DEPS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$GLIB_DEPS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "$GLIB_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$GLIB_LIBS"; then - pkg_cv_GLIB_LIBS="$GLIB_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GLIB_LIBS"; then + pkg_cv_GLIB_LIBS="$GLIB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GLIB_DEPS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$GLIB_DEPS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "$GLIB_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -19816,17 +19747,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$GLIB_DEPS"` + GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$GLIB_DEPS" 2>&1` else - GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$GLIB_DEPS"` + GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$GLIB_DEPS" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS @@ -19869,46 +19800,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT" >&5 $as_echo_n "checking for GOBJECT... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$GOBJECT_CFLAGS"; then - pkg_cv_GOBJECT_CFLAGS="$GOBJECT_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GOBJECT_CFLAGS"; then + pkg_cv_GOBJECT_CFLAGS="$GOBJECT_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0 glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-2.0 glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "gobject-2.0 glib-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$GOBJECT_LIBS"; then - pkg_cv_GOBJECT_LIBS="$GOBJECT_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GOBJECT_LIBS"; then + pkg_cv_GOBJECT_LIBS="$GOBJECT_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0 glib-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-2.0 glib-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GOBJECT_LIBS=`$PKG_CONFIG --libs "gobject-2.0 glib-2.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -19916,17 +19847,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gobject-2.0 glib-2.0"` + GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gobject-2.0 glib-2.0" 2>&1` else - GOBJECT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gobject-2.0 glib-2.0"` + GOBJECT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gobject-2.0 glib-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GOBJECT_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else GOBJECT_CFLAGS=$pkg_cv_GOBJECT_CFLAGS @@ -20087,46 +20018,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 $as_echo_n "checking for CAIRO... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$CAIRO_CFLAGS"; then - pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$CAIRO_CFLAGS"; then + pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.8.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo >= 1.8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= 1.8.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$CAIRO_LIBS"; then - pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$CAIRO_LIBS"; then + pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.8.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo >= 1.8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= 1.8.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -20134,17 +20065,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cairo >= 1.8.0"` + CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= 1.8.0" 2>&1` else - CAIRO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cairo >= 1.8.0"` + CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= 1.8.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS @@ -20178,46 +20109,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO_FT" >&5 $as_echo_n "checking for CAIRO_FT... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$CAIRO_FT_CFLAGS"; then - pkg_cv_CAIRO_FT_CFLAGS="$CAIRO_FT_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$CAIRO_FT_CFLAGS"; then + pkg_cv_CAIRO_FT_CFLAGS="$CAIRO_FT_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-ft\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo-ft") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_FT_CFLAGS=`$PKG_CONFIG --cflags "cairo-ft" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$CAIRO_FT_LIBS"; then - pkg_cv_CAIRO_FT_LIBS="$CAIRO_FT_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$CAIRO_FT_LIBS"; then + pkg_cv_CAIRO_FT_LIBS="$CAIRO_FT_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo-ft\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo-ft") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_FT_LIBS=`$PKG_CONFIG --libs "cairo-ft" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -20225,17 +20156,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - CAIRO_FT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cairo-ft"` + CAIRO_FT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo-ft" 2>&1` else - CAIRO_FT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cairo-ft"` + CAIRO_FT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo-ft" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_FT_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else CAIRO_FT_CFLAGS=$pkg_cv_CAIRO_FT_CFLAGS @@ -20275,46 +20206,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5 $as_echo_n "checking for FONTCONFIG... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$FONTCONFIG_CFLAGS"; then - pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$FONTCONFIG_CFLAGS"; then + pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5 ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$FONTCONFIG_LIBS"; then - pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$FONTCONFIG_LIBS"; then + pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5 ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -20322,17 +20253,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fontconfig"` + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fontconfig" 2>&1` else - FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fontconfig"` + FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fontconfig" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FONTCONFIG_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS @@ -20375,46 +20306,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ICU" >&5 $as_echo_n "checking for ICU... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$ICU_CFLAGS"; then - pkg_cv_ICU_CFLAGS="$ICU_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$ICU_CFLAGS"; then + pkg_cv_ICU_CFLAGS="$ICU_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"icu-uc\""; } >&5 ($PKG_CONFIG --exists --print-errors "icu-uc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ICU_CFLAGS=`$PKG_CONFIG --cflags "icu-uc" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$ICU_LIBS"; then - pkg_cv_ICU_LIBS="$ICU_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$ICU_LIBS"; then + pkg_cv_ICU_LIBS="$ICU_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"icu-uc\""; } >&5 ($PKG_CONFIG --exists --print-errors "icu-uc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ICU_LIBS=`$PKG_CONFIG --libs "icu-uc" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -20422,17 +20353,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - ICU_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "icu-uc"` + ICU_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "icu-uc" 2>&1` else - ICU_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "icu-uc"` + ICU_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "icu-uc" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ICU_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else ICU_CFLAGS=$pkg_cv_ICU_CFLAGS @@ -20623,7 +20554,7 @@ else fi have_graphite2=false -GRAPHITE2_DEPS="graphite2" +GRAPHITE2_DEPS="graphite2 >= 1.2.0" if test "x$with_graphite2" = "xyes" -o "x$with_graphite2" = "xauto"; then @@ -20631,46 +20562,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GRAPHITE2" >&5 $as_echo_n "checking for GRAPHITE2... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$GRAPHITE2_CFLAGS"; then - pkg_cv_GRAPHITE2_CFLAGS="$GRAPHITE2_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GRAPHITE2_CFLAGS"; then + pkg_cv_GRAPHITE2_CFLAGS="$GRAPHITE2_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GRAPHITE2_DEPS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$GRAPHITE2_DEPS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GRAPHITE2_CFLAGS=`$PKG_CONFIG --cflags "$GRAPHITE2_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$GRAPHITE2_LIBS"; then - pkg_cv_GRAPHITE2_LIBS="$GRAPHITE2_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$GRAPHITE2_LIBS"; then + pkg_cv_GRAPHITE2_LIBS="$GRAPHITE2_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$GRAPHITE2_DEPS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$GRAPHITE2_DEPS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GRAPHITE2_LIBS=`$PKG_CONFIG --libs "$GRAPHITE2_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -20678,17 +20609,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - GRAPHITE2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$GRAPHITE2_DEPS"` + GRAPHITE2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$GRAPHITE2_DEPS" 2>&1` else - GRAPHITE2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$GRAPHITE2_DEPS"` + GRAPHITE2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$GRAPHITE2_DEPS" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GRAPHITE2_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else GRAPHITE2_CFLAGS=$pkg_cv_GRAPHITE2_CFLAGS @@ -20751,46 +20682,46 @@ pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5 $as_echo_n "checking for FREETYPE... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$FREETYPE_CFLAGS"; then - pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$FREETYPE_CFLAGS"; then + pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$FREETYPE_DEPS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$FREETYPE_DEPS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "$FREETYPE_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$FREETYPE_LIBS"; then - pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" - else - if test -n "$PKG_CONFIG" && \ +if test -n "$FREETYPE_LIBS"; then + pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$FREETYPE_DEPS\""; } >&5 ($PKG_CONFIG --exists --print-errors "$FREETYPE_DEPS") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "$FREETYPE_DEPS" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -20798,17 +20729,17 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$FREETYPE_DEPS"` + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$FREETYPE_DEPS" 2>&1` else - FREETYPE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$FREETYPE_DEPS"` + FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$FREETYPE_DEPS" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FREETYPE_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - : + : elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } : else FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS @@ -21170,7 +21101,7 @@ fi fi -ac_config_files="$ac_config_files Makefile src/Makefile src/harfbuzz-config.cmake src/hb-ucdn/Makefile util/Makefile 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 test/subset/Makefile test/subset/data/Makefile docs/Makefile docs/version.xml" +ac_config_files="$ac_config_files Makefile src/Makefile src/harfbuzz-config.cmake src/hb-ucdn/Makefile util/Makefile test/Makefile test/api/Makefile test/fuzzing/Makefile test/shaping/Makefile test/shaping/data/Makefile test/shaping/data/aots/Makefile test/shaping/data/in-house/Makefile test/shaping/data/text-rendering-tests/Makefile test/subset/Makefile test/subset/data/Makefile docs/Makefile docs/version.xml" cat >confcache <<\_ACEOF @@ -21358,10 +21289,6 @@ if test -z "${HAVE_PTHREAD_TRUE}" && test -z "${HAVE_PTHREAD_FALSE}"; then as_fn_error $? "conditional \"HAVE_PTHREAD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${HAVE_OT_TRUE}" && test -z "${HAVE_OT_FALSE}"; then - as_fn_error $? "conditional \"HAVE_OT\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi if test -z "${HAVE_FALLBACK_TRUE}" && test -z "${HAVE_FALLBACK_FALSE}"; then as_fn_error $? "conditional \"HAVE_FALLBACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 @@ -21823,7 +21750,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by HarfBuzz $as_me 1.8.1, which was +This file was extended by HarfBuzz $as_me 2.3.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -21890,7 +21817,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -HarfBuzz config.status 1.8.1 +HarfBuzz config.status 2.3.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -22413,6 +22340,7 @@ do "test/fuzzing/Makefile") CONFIG_FILES="$CONFIG_FILES test/fuzzing/Makefile" ;; "test/shaping/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/Makefile" ;; "test/shaping/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/Makefile" ;; + "test/shaping/data/aots/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/aots/Makefile" ;; "test/shaping/data/in-house/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/in-house/Makefile" ;; "test/shaping/data/text-rendering-tests/Makefile") CONFIG_FILES="$CONFIG_FILES test/shaping/data/text-rendering-tests/Makefile" ;; "test/subset/Makefile") CONFIG_FILES="$CONFIG_FILES test/subset/Makefile" ;; diff --git a/configure.ac b/configure.ac index 13cd1ce..b7827a6 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [1.8.1], + [2.3.1], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) @@ -19,7 +19,6 @@ LT_PREREQ([2.2]) LT_INIT([disable-static]) # Check for programs -AC_USE_SYSTEM_EXTENSIONS AC_PROG_CC AC_PROG_CC_C99 AM_PROG_CC_C_O @@ -78,7 +77,7 @@ GTK_DOC_CHECK([1.15],[--flavour no-tmpl]) ]) # Functions and headers -AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l) +AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l posix_memalign) save_libs="$LIBS" LIBS="$LIBS -lm" @@ -103,9 +102,6 @@ if test "x$GCC" = "xyes"; then # by overriding CXXFLAGS. CXXFLAGS="-fno-rtti $CXXFLAGS -fno-exceptions -fno-threadsafe-statics" - # Assorted warnings - CXXFLAGS="$CXXFLAGS -Wcast-align" - case "$host" in *-*-mingw*) ;; @@ -148,12 +144,6 @@ AM_CONDITIONAL(HAVE_PTHREAD, $have_pthread) dnl ========================================================================== -have_ot=true -if $have_ot; then - AC_DEFINE(HAVE_OT, 1, [Have native OpenType Layout backend]) -fi -AM_CONDITIONAL(HAVE_OT, $have_ot) - have_fallback=true if $have_fallback; then AC_DEFINE(HAVE_FALLBACK, 1, [Have simple TrueType Layout backend]) @@ -330,7 +320,7 @@ AC_ARG_WITH(graphite2, [Use the graphite2 library @<:@default=no@:>@])],, [with_graphite2=no]) have_graphite2=false -GRAPHITE2_DEPS="graphite2" +GRAPHITE2_DEPS="graphite2 >= 1.2.0" AC_SUBST(GRAPHITE2_DEPS) if test "x$with_graphite2" = "xyes" -o "x$with_graphite2" = "xauto"; then PKG_CHECK_MODULES(GRAPHITE2, $GRAPHITE2_DEPS, have_graphite2=true, :) @@ -514,6 +504,7 @@ test/api/Makefile test/fuzzing/Makefile test/shaping/Makefile test/shaping/data/Makefile +test/shaping/data/aots/Makefile test/shaping/data/in-house/Makefile test/shaping/data/text-rendering-tests/Makefile test/subset/Makefile diff --git a/docs/Makefile.am b/docs/Makefile.am index a993538..9b54b40 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -62,7 +62,6 @@ CFILE_GLOB=$(top_srcdir)/src/hb-*.cc # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h -EXTRA_HFILES=$(top_builddir)/src/hb-version.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png @@ -73,14 +72,15 @@ HTML_IMAGES= \ # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files= \ + usermanual-what-is-harfbuzz.xml \ + usermanual-install-harfbuzz.xml \ + usermanual-getting-started.xml \ + usermanual-shaping-concepts.xml \ usermanual-buffers-language-script-and-direction.xml \ - usermanual-clusters.xml \ usermanual-fonts-and-faces.xml \ - usermanual-glyph-information.xml \ - usermanual-hello-harfbuzz.xml \ - usermanual-install-harfbuzz.xml \ + usermanual-clusters.xml \ usermanual-opentype-features.xml \ - usermanual-what-is-harfbuzz.xml \ + usermanual-glyph-information.xml \ version.xml # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded diff --git a/docs/Makefile.in b/docs/Makefile.in index 100c353..3e2825e 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -104,8 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) @@ -253,6 +252,8 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -382,7 +383,6 @@ CFILE_GLOB = $(top_srcdir)/src/hb-*.cc # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h -EXTRA_HFILES = $(top_builddir)/src/hb-version.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png @@ -394,14 +394,15 @@ HTML_IMAGES = \ # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = \ + usermanual-what-is-harfbuzz.xml \ + usermanual-install-harfbuzz.xml \ + usermanual-getting-started.xml \ + usermanual-shaping-concepts.xml \ usermanual-buffers-language-script-and-direction.xml \ - usermanual-clusters.xml \ usermanual-fonts-and-faces.xml \ - usermanual-glyph-information.xml \ - usermanual-hello-harfbuzz.xml \ - usermanual-install-harfbuzz.xml \ + usermanual-clusters.xml \ usermanual-opentype-features.xml \ - usermanual-what-is-harfbuzz.xml \ + usermanual-glyph-information.xml \ version.xml @@ -809,6 +810,7 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_con if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ + test -f $$file && cp $$file $(abs_builddir)/html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp diff --git a/docs/harfbuzz-docs.xml b/docs/harfbuzz-docs.xml index 9452a92..2735338 100644 --- a/docs/harfbuzz-docs.xml +++ b/docs/harfbuzz-docs.xml @@ -12,28 +12,21 @@ HarfBuzz is an OpenType - text shaping engine. - - - The current HarfBuzz codebase, formerly known as harfbuzz-ng, is - versioned 1.x.x and is stable and under active maintenance. This is - what is used in latest versions of Firefox, GNOME, ChromeOS, Chrome, - LibreOffice, XeTeX, Android, and KDE, among other places. The canonical - source tree is available - here. - Also available on - github. - See for release tarballs. + text shaping engine. Using the HarfBuzz library allows + programs to convert a sequence of Unicode input into + properly formatted and positioned glyph output—for any writing + system and language. + - The old HarfBuzz codebase, these days known as harfbuzz-old, was - derived from FreeType, - Pango, and - Qt and is available - here. - It is not actively developed or maintained, and is extremely buggy. All - users are encouraged to switch over to the new HarfBuzz as soon as - possible. There are no release tarballs of old HarfBuzz whatsoever. + The canonical source-code tree is available at + github.com/harfbuzz/harfbuzz + and is also available at + cgit.freedesktop.org/harfbuzz. + See for + release tarballs. @@ -42,7 +35,8 @@ User's manual - + + @@ -58,152 +52,124 @@ http://[SERVER]/libharfbuzz/.--> + + + + The current HarfBuzz codebase is versioned 2.x.x and is stable + and under active maintenance. This is what is used in latest + versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice, + XeTeX, Android, and KDE, among other places. + + + Prior to 2012, the original HarfBuzz codebase (which, these + days, is referred to as harfbuzz-old) was + derived from code in FreeType, Pango, and + Qt. + It is not actively developed or + maintained, and is extremely buggy. All users of harfbuzz-old + are encouraged to switch over to the new HarfBuzz as soon as possible. + + + To make this distinction clearer in discussions, the current + HarfBuzz codebase is sometimes referred to as + harfbuzz-ng. + + + For reference purposes, the harfbuzz-old source tree is archived + here. There + are no release tarballs of harfbuzz-old whatsoever. + + + Reference manual - HarfBuzz API - - - - + Core API + + + + + + - + - - - + - - - + + OpenType API + - + + + + + - - - - + + Apple Advanced Typography API + + + + Integration API + - + + + - - - - - + + + + API Index + Index of deprecated API + + Index of new symbols in 2.1.0 + Index of new symbols in 2.0.0 + Index of new symbols in 1.9.0 + Index of new symbols in 1.8.6 + Index of new symbols in 1.8.5 + Index of new symbols in 1.8.1 + Index of new symbols in 1.8.0 + Index of new symbols in 1.7.7 + Index of new symbols in 1.7.5 + Index of new symbols in 1.6.0 + Index of new symbols in 1.5.0 + Index of new symbols in 1.4.3 + Index of new symbols in 1.4.2 + Index of new symbols in 1.4.0 + Index of new symbols in 1.3.3 + Index of new symbols in 1.2.3 + Index of new symbols in 1.1.3 + Index of new symbols in 1.1.2 + Index of new symbols in 1.0.5 + Index of new symbols in 0.9.42 + Index of new symbols in 0.9.41 + Index of new symbols in 0.9.39 + Index of new symbols in 0.9.38 + Index of new symbols in 0.9.31 + Index of new symbols in 0.9.30 + Index of new symbols in 0.9.28 + Index of new symbols in 0.9.22 + Index of new symbols in 0.9.20 + Index of new symbols in 0.9.11 + Index of new symbols in 0.9.10 + Index of new symbols in 0.9.8 + Index of new symbols in 0.9.7 + Index of new symbols in 0.9.5 + Index of new symbols in 0.9.2 diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt index 5715d77..fd7682e 100644 --- a/docs/harfbuzz-sections.txt +++ b/docs/harfbuzz-sections.txt @@ -1,8 +1,20 @@ -
-hb HB_H_IN -HB_EXTERN +HB_OT_H_IN +
+ +
+hb-aat-layout +HB_AAT_LAYOUT_NO_SELECTOR_INDEX +hb_aat_layout_feature_type_t +hb_aat_layout_feature_selector_t +hb_aat_layout_feature_selector_info_t +hb_aat_layout_feature_type_get_name_id +hb_aat_layout_feature_type_get_selector_infos +hb_aat_layout_get_feature_types +hb_aat_layout_has_positioning +hb_aat_layout_has_substitution +hb_aat_layout_has_tracking
@@ -67,6 +79,8 @@ hb_buffer_set_user_data hb_buffer_get_user_data hb_buffer_get_glyph_infos hb_buffer_get_glyph_positions +hb_buffer_get_invisible_glyph +hb_buffer_set_invisible_glyph hb_buffer_set_replacement_codepoint hb_buffer_get_replacement_codepoint hb_buffer_normalize_glyphs @@ -144,6 +158,10 @@ uint16_t uint32_t uint64_t uint8_t + +HB_EXTERN +HB_DEPRECATED +HB_DEPRECATED_FOR
@@ -153,7 +171,30 @@ HB_BUFFER_SERIALIZE_FLAGS_DEFAULT HB_SCRIPT_CANADIAN_ABORIGINAL hb_font_funcs_set_glyph_func hb_font_get_glyph_func_t +hb_ot_layout_table_choose_script +hb_ot_layout_table_find_script +hb_ot_tag_from_language +hb_ot_tags_from_script +HB_OT_VAR_NO_AXIS_INDEX +hb_ot_var_axis_t +hb_ot_var_find_axis +hb_ot_var_get_axes hb_set_invert +hb_unicode_eastasian_width_func_t +hb_unicode_eastasian_width +hb_unicode_funcs_set_eastasian_width_func +HB_UNICODE_MAX_DECOMPOSITION_LEN +hb_unicode_decompose_compatibility_func_t +hb_unicode_decompose_compatibility +hb_unicode_funcs_set_decompose_compatibility_func +hb_font_funcs_set_glyph_h_kerning_func +hb_font_funcs_set_glyph_v_kerning_func +hb_font_get_glyph_h_kerning +hb_font_get_glyph_h_kerning_func_t +hb_font_get_glyph_kerning_for_direction +hb_font_get_glyph_kerning_func_t +hb_font_get_glyph_v_kerning +hb_font_get_glyph_v_kerning_func_t
@@ -170,6 +211,7 @@ hb_coretext_font_get_ct_font
hb-face hb_face_count +hb_face_t hb_face_create hb_face_create_for_tables hb_face_destroy @@ -188,7 +230,11 @@ hb_face_set_glyph_count hb_face_set_index hb_face_set_upem hb_face_set_user_data -hb_face_t +hb_face_collect_unicodes +hb_face_collect_variation_selectors +hb_face_collect_variation_unicodes +hb_face_builder_create +hb_face_builder_add_table
@@ -208,13 +254,14 @@ hb_font_funcs_set_glyph_contour_point_func hb_font_funcs_set_glyph_extents_func hb_font_funcs_set_glyph_from_name_func hb_font_funcs_set_glyph_h_advance_func -hb_font_funcs_set_glyph_h_kerning_func +hb_font_funcs_set_glyph_h_advances_func hb_font_funcs_set_glyph_h_origin_func hb_font_funcs_set_glyph_name_func hb_font_funcs_set_glyph_v_advance_func -hb_font_funcs_set_glyph_v_kerning_func +hb_font_funcs_set_glyph_v_advances_func hb_font_funcs_set_glyph_v_origin_func hb_font_funcs_set_nominal_glyph_func +hb_font_funcs_set_nominal_glyphs_func hb_font_funcs_set_user_data hb_font_funcs_set_variation_glyph_func hb_font_funcs_t @@ -223,6 +270,8 @@ hb_font_get_face hb_font_get_glyph hb_font_get_glyph_advance_for_direction hb_font_get_glyph_advance_func_t +hb_font_get_glyph_advances_for_direction +hb_font_get_glyph_advances_func_t hb_font_get_glyph_contour_point hb_font_get_glyph_contour_point_for_origin hb_font_get_glyph_contour_point_func_t @@ -233,24 +282,24 @@ hb_font_get_glyph_from_name hb_font_get_glyph_from_name_func_t hb_font_get_glyph_h_advance hb_font_get_glyph_h_advance_func_t -hb_font_get_glyph_h_kerning -hb_font_get_glyph_h_kerning_func_t +hb_font_get_glyph_h_advances +hb_font_get_glyph_h_advances_func_t hb_font_get_glyph_h_origin hb_font_get_glyph_h_origin_func_t -hb_font_get_glyph_kerning_for_direction -hb_font_get_glyph_kerning_func_t hb_font_get_glyph_name hb_font_get_glyph_name_func_t hb_font_get_glyph_origin_for_direction hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_advance hb_font_get_glyph_v_advance_func_t -hb_font_get_glyph_v_kerning -hb_font_get_glyph_v_kerning_func_t +hb_font_get_glyph_v_advances +hb_font_get_glyph_v_advances_func_t hb_font_get_glyph_v_origin hb_font_get_glyph_v_origin_func_t hb_font_get_nominal_glyph hb_font_get_nominal_glyph_func_t +hb_font_get_nominal_glyphs +hb_font_get_nominal_glyphs_func_t hb_font_get_parent hb_font_get_ppem hb_font_get_ptem @@ -327,7 +376,9 @@ HB_GOBJECT_TYPE_FACE HB_GOBJECT_TYPE_FONT HB_GOBJECT_TYPE_FONT_FUNCS HB_GOBJECT_TYPE_GLYPH_FLAGS +HB_GOBJECT_TYPE_MAP HB_GOBJECT_TYPE_MEMORY_MODE +HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS HB_GOBJECT_TYPE_OT_MATH_CONSTANT HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART @@ -358,7 +409,9 @@ hb_gobject_face_get_type hb_gobject_font_funcs_get_type hb_gobject_font_get_type hb_gobject_glyph_flags_get_type +hb_gobject_map_get_type hb_gobject_memory_mode_get_type +hb_gobject_ot_color_palette_flags_get_type hb_gobject_ot_layout_glyph_class_get_type hb_gobject_ot_math_constant_get_type hb_gobject_ot_math_glyph_part_get_type @@ -382,11 +435,6 @@ HB_GOBJECT_H_IN
-hb-gobject - -
- -
hb-graphite2 HB_GRAPHITE2_TAG_SILF hb_graphite2_face_get_gr_face @@ -421,9 +469,27 @@ hb_map_t
-hb-ot - -HB_OT_H_IN +hb-ot-color +hb_color_t +HB_COLOR +hb_color_get_alpha +hb_color_get_blue +hb_color_get_green +hb_color_get_red +hb_ot_color_glyph_get_layers +hb_ot_color_glyph_reference_png +hb_ot_color_glyph_reference_svg +hb_ot_color_has_layers +hb_ot_color_has_palettes +hb_ot_color_has_png +hb_ot_color_has_svg +hb_ot_color_layer_t +hb_ot_color_palette_color_get_name_id +hb_ot_color_palette_flags_t +hb_ot_color_palette_get_colors +hb_ot_color_palette_get_count +hb_ot_color_palette_get_flags +hb_ot_color_palette_get_name_id
@@ -432,22 +498,40 @@ hb_ot_font_set_funcs
-hb-ot-shape -hb_ot_shape_glyphs_closure +hb-ot-name +hb_ot_name_id_t +HB_OT_NAME_ID_INVALID +hb_ot_name_entry_t +hb_ot_name_list_names +hb_ot_name_get_utf16 +hb_ot_name_get_utf32 +hb_ot_name_get_utf8
hb-ot-layout +HB_OT_MAX_TAGS_PER_LANGUAGE +HB_OT_MAX_TAGS_PER_SCRIPT +HB_OT_TAG_DEFAULT_LANGUAGE +HB_OT_TAG_DEFAULT_SCRIPT +hb_ot_tag_to_language +hb_ot_tag_to_script +hb_ot_tags_from_script_and_language +hb_ot_tags_to_script_and_language HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX HB_OT_LAYOUT_NO_FEATURE_INDEX HB_OT_LAYOUT_NO_SCRIPT_INDEX HB_OT_LAYOUT_NO_VARIATIONS_INDEX +HB_OT_TAG_BASE HB_OT_TAG_GDEF HB_OT_TAG_GPOS HB_OT_TAG_GSUB HB_OT_TAG_JSTF hb_ot_layout_collect_lookups +hb_ot_layout_collect_features +hb_ot_layout_feature_get_characters hb_ot_layout_feature_get_lookups +hb_ot_layout_feature_get_name_ids hb_ot_layout_feature_with_variations_get_lookups hb_ot_layout_get_attach_points hb_ot_layout_get_glyph_class @@ -469,12 +553,12 @@ hb_ot_layout_lookups_substitute_closure hb_ot_layout_lookup_would_substitute hb_ot_layout_script_find_language hb_ot_layout_script_get_language_tags -hb_ot_layout_table_choose_script +hb_ot_layout_script_select_language hb_ot_layout_table_find_feature_variations -hb_ot_layout_table_find_script hb_ot_layout_table_get_feature_tags hb_ot_layout_table_get_script_tags hb_ot_layout_table_get_lookup_count +hb_ot_layout_table_select_script hb_ot_shape_plan_collect_lookups hb_ot_layout_language_get_required_feature_index @@ -484,23 +568,6 @@ Xhb_ot_layout_lookup_substitute
-hb-ot-var -HB_OT_TAG_VAR_AXIS_ITALIC -HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE -HB_OT_TAG_VAR_AXIS_SLANT -HB_OT_TAG_VAR_AXIS_WEIGHT -HB_OT_TAG_VAR_AXIS_WIDTH -HB_OT_VAR_NO_AXIS_INDEX -hb_ot_var_axis_t -hb_ot_var_has_data -hb_ot_var_find_axis -hb_ot_var_get_axis_count -hb_ot_var_get_axes -hb_ot_var_normalize_variations -hb_ot_var_normalize_coords -
- -
hb-ot-math HB_OT_TAG_MATH HB_OT_MATH_SCRIPT @@ -521,13 +588,29 @@ hb_ot_math_get_glyph_assembly
-hb-ot-tag -HB_OT_TAG_DEFAULT_LANGUAGE -HB_OT_TAG_DEFAULT_SCRIPT -hb_ot_tag_from_language -hb_ot_tag_to_language -hb_ot_tag_to_script -hb_ot_tags_from_script +hb-ot-shape +hb_ot_shape_glyphs_closure +
+ +
+hb-ot-var +HB_OT_TAG_VAR_AXIS_ITALIC +HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE +HB_OT_TAG_VAR_AXIS_SLANT +HB_OT_TAG_VAR_AXIS_WEIGHT +HB_OT_TAG_VAR_AXIS_WIDTH +hb_ot_var_has_data +hb_ot_var_axis_flags_t +hb_ot_var_axis_info_t +hb_ot_var_find_axis_info +hb_ot_var_get_axis_count +hb_ot_var_get_axis_infos +hb_ot_var_get_named_instance_count +hb_ot_var_named_instance_get_subfamily_name_id +hb_ot_var_named_instance_get_postscript_name_id +hb_ot_var_named_instance_get_design_coords +hb_ot_var_normalize_variations +hb_ot_var_normalize_coords
@@ -566,6 +649,8 @@ hb_set_union
hb-shape +HB_FEATURE_GLOBAL_END +HB_FEATURE_GLOBAL_START hb_feature_t hb_feature_from_string hb_feature_to_string @@ -592,16 +677,14 @@ hb_shape_plan_t
hb-unicode -HB_UNICODE_MAX_DECOMPOSITION_LEN +HB_UNICODE_MAX hb_unicode_combining_class hb_unicode_combining_class_func_t hb_unicode_combining_class_t hb_unicode_compose hb_unicode_compose_func_t hb_unicode_decompose -hb_unicode_decompose_compatibility hb_unicode_decompose_func_t -hb_unicode_eastasian_width hb_unicode_funcs_create hb_unicode_funcs_destroy hb_unicode_funcs_get_default @@ -613,9 +696,7 @@ hb_unicode_funcs_make_immutable hb_unicode_funcs_reference hb_unicode_funcs_set_combining_class_func hb_unicode_funcs_set_compose_func -hb_unicode_funcs_set_decompose_compatibility_func hb_unicode_funcs_set_decompose_func -hb_unicode_funcs_set_eastasian_width_func hb_unicode_funcs_set_general_category_func hb_unicode_funcs_set_mirroring_func hb_unicode_funcs_set_script_func diff --git a/docs/harfbuzz.types b/docs/harfbuzz.types index 462211c..bd87111 100644 --- a/docs/harfbuzz.types +++ b/docs/harfbuzz.types @@ -1,3 +1,5 @@ +hb_gobject_aat_layout_feature_selector_get_type +hb_gobject_aat_layout_feature_type_get_type hb_gobject_blob_get_type hb_gobject_buffer_cluster_level_get_type hb_gobject_buffer_content_type_get_type @@ -14,13 +16,16 @@ hb_gobject_font_get_type hb_gobject_glyph_flags_get_type hb_gobject_glyph_info_get_type hb_gobject_glyph_position_get_type +hb_gobject_map_get_type hb_gobject_memory_mode_get_type +hb_gobject_ot_color_palette_flags_get_type hb_gobject_ot_layout_glyph_class_get_type hb_gobject_ot_math_constant_get_type hb_gobject_ot_math_glyph_part_flags_get_type hb_gobject_ot_math_glyph_part_get_type hb_gobject_ot_math_glyph_variant_get_type hb_gobject_ot_math_kern_get_type +hb_gobject_ot_var_axis_flags_get_type hb_gobject_script_get_type hb_gobject_segment_properties_get_type hb_gobject_set_get_type diff --git a/docs/html/a-clustering-example-for-levels-0-and-1.html b/docs/html/a-clustering-example-for-levels-0-and-1.html index 2d953d3..714859a 100644 --- a/docs/html/a-clustering-example-for-levels-0-and-1.html +++ b/docs/html/a-clustering-example-for-levels-0-and-1.html @@ -5,10 +5,10 @@ A clustering example for levels 0 and 1: HarfBuzz Manual - - + + - + @@ -16,66 +16,105 @@ Home Up -Prev +Prev Next -
+

A clustering example for levels 0 and 1

- Let's say we start with the following character sequence and cluster - values: -

+ The basic shaping operations affect clusters in a predictable + manner when using level 0 or level 1: +

+
    +
  • + When two or more clusters merge, the + resulting merged cluster takes as its cluster value the + minimum of the incoming cluster values. +

  • +
  • + When a cluster decomposes, all of the + resulting child clusters inherit as their cluster value the + cluster value of the parent cluster. +

  • +
  • + When a character is reordered, the + reordered character and all clusters that the character + moves past as part of the reordering are merged into one cluster. +

  • +
+

+ The functionality, guarantees, and benefits of level 0 and level + 1 behavior can be seen with some examples. First, let us examine + what happens with cluster values when shaping involves cluster + merging with ligatures and decomposition. +

+

+ Let's say we start with the following character sequence (top row) and + initial cluster values (bottom row): +

-   A,B,C,D,E
-   0,1,2,3,4
-
+ A,B,C,D,E + 0,1,2,3,4 +

- We then map the characters to glyphs. For simplicity, let's assume - that each character maps to the corresponding, identical-looking - glyph: -

+ During shaping, HarfBuzz maps these characters to glyphs from + the font. For simplicity, let us assume that each character maps + to the corresponding, identical-looking glyph: +

-   A,B,C,D,E
-   0,1,2,3,4
-
+ A,B,C,D,E + 0,1,2,3,4 +

- Now if, for example, B and C - ligate, then the clusters to which they belong "merge". - This merged cluster takes for its cluster number the minimum of all - the cluster numbers of the clusters that went in. In this case, we - get: -

+ Now if, for example, B and C + form a ligature, then the clusters to which they belong + "merge". This merged cluster takes for its cluster + value the minimum of all the cluster values of the clusters that + went in to the ligature. In this case, we get: +

-   A,BC,D,E
-   0,1 ,3,4
-
+ A,BC,D,E + 0,1 ,3,4 +

- Now let's assume that the BC glyph decomposes - into three components, and D also decomposes into - two. The components each inherit the cluster value of their parent: -

+ because 1 is the minimum of the set {1,2}, which were the + cluster values of B and + C. +

+

+ Next, let us say that the BC ligature glyph + decomposes into three components, and D also + decomposes into two components. Whenever a cluster decomposes, + its components each inherit the cluster value of their parent: +

-   A,BC0,BC1,BC2,D0,D1,E
-   0,1  ,1  ,1  ,3 ,3 ,4
-
+ A,BC0,BC1,BC2,D0,D1,E + 0,1 ,1 ,1 ,3 ,3 ,4 +

- Now if BC2 and D0 ligate, then - their clusters (numbers 1 and 3) merge into - min(1,3) = 1: -

+ Next, if BC2 and D0 form a + ligature, then their clusters (cluster values 1 and 3) merge into + min(1,3) = 1: +

-   A,BC0,BC1,BC2D0,D1,E
-   0,1  ,1  ,1    ,1 ,4
-
+ A,BC0,BC1,BC2D0,D1,E + 0,1 ,1 ,1 ,1 ,4 + +

+ Note that the entirety of cluster 3 merges into cluster 1, not + just the D0 glyph. This reflects the fact + that the cluster must be treated as an + indivisible unit. +

- At this point, cluster 1 means: the character sequence - BCD is represented by glyphs - BC0,BC1,BC2D0,D1 and cannot be broken down any - further. -

+ At this point, cluster 1 means: the character sequence + BCD is represented by glyphs + BC0,BC1,BC2D0,D1 and cannot be broken down any + further. +

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/aat-shaping.html b/docs/html/aat-shaping.html new file mode 100644 index 0000000..e1fff44 --- /dev/null +++ b/docs/html/aat-shaping.html @@ -0,0 +1,45 @@ + + + + +AAT shaping: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+AAT shaping

+

+ In contrast to OpenType shaping, AAT shaping does not specify a + predefined set of shaping models or a set of supported scripts. +

+

+ Instead, each AAT font includes a complete set of rules that + implement the desired shaping model for the intended + script. These rules include finite-state machines to match glyph + sequences and the shaping operations to perform. +

+

+ Notably, AAT shaping rules are expressed for glyphs in the font, + not for Unicode codepoints. AAT shaping can perform the same + shaping operations used in OpenType shaping, as well as other + functions that have not been defined for OpenType shaping. +

+
+ + + \ No newline at end of file diff --git a/docs/html/adding-text-to-the-buffer.html b/docs/html/adding-text-to-the-buffer.html index dac5fa1..b1157fb 100644 --- a/docs/html/adding-text-to-the-buffer.html +++ b/docs/html/adding-text-to-the-buffer.html @@ -8,7 +8,7 @@ - + @@ -30,6 +30,6 @@

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/annotation-glossary.html b/docs/html/annotation-glossary.html index 452944b..acf5467 100644 --- a/docs/html/annotation-glossary.html +++ b/docs/html/annotation-glossary.html @@ -6,8 +6,8 @@ - - + + @@ -31,7 +31,7 @@ T Home Up -Prev +Prev
@@ -58,6 +58,8 @@
nullable

NULL may be passed as the value in, out, in-out; or as a return value.

O

+
optional
+

NULL may be passed instead of a pointer to a location.

out

Parameter for returning results. Default is transfer full.

out caller-allocates
@@ -74,6 +76,6 @@

Don't free data after the code is done.

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/api-index-0-9-10.html b/docs/html/api-index-0-9-10.html index 8e20a6e..b670ca5 100644 --- a/docs/html/api-index-0-9-10.html +++ b/docs/html/api-index-0-9-10.html @@ -6,20 +6,18 @@ - - - + + + - + - - + +

@@ -29,13 +27,8 @@ hb_ot_layout_get_size_params, function in hb-ot-layout
-

S

-
-hb_set_invert, function in hb-deprecated -
-
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-11.html b/docs/html/api-index-0-9-11.html index 93491db..4f604c0 100644 --- a/docs/html/api-index-0-9-11.html +++ b/docs/html/api-index-0-9-11.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,19 +16,19 @@ B Home Up -Prev -Next +Prev +Next

Index of new symbols in 0.9.11

B

-hb_buffer_clear_contents, function in Buffers +hb_buffer_clear_contents, function in hb-buffer
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-2.html b/docs/html/api-index-0-9-2.html index b6c781d..921e090 100644 --- a/docs/html/api-index-0-9-2.html +++ b/docs/html/api-index-0-9-2.html @@ -6,9 +6,9 @@ - - - + + + @@ -34,8 +34,8 @@ V Home Up -Prev -Next +Prev +Next

@@ -90,115 +90,115 @@
-hb_buffer_add_utf16, function in Buffers +hb_buffer_add_utf16, function in hb-buffer
-hb_buffer_add_utf32, function in Buffers +hb_buffer_add_utf32, function in hb-buffer
-hb_buffer_add_utf8, function in Buffers +hb_buffer_add_utf8, function in hb-buffer
-hb_buffer_allocation_successful, function in Buffers +hb_buffer_allocation_successful, function in hb-buffer
-hb_buffer_create, function in Buffers +hb_buffer_create, function in hb-buffer
-hb_buffer_destroy, function in Buffers +hb_buffer_destroy, function in hb-buffer
-hb_buffer_get_direction, function in Buffers +hb_buffer_get_direction, function in hb-buffer
-hb_buffer_get_empty, function in Buffers +hb_buffer_get_empty, function in hb-buffer
-hb_buffer_get_glyph_infos, function in Buffers +hb_buffer_get_glyph_infos, function in hb-buffer
-hb_buffer_get_glyph_positions, function in Buffers +hb_buffer_get_glyph_positions, function in hb-buffer
-hb_buffer_get_language, function in Buffers +hb_buffer_get_language, function in hb-buffer
-hb_buffer_get_length, function in Buffers +hb_buffer_get_length, function in hb-buffer
-hb_buffer_get_script, function in Buffers +hb_buffer_get_script, function in hb-buffer
-hb_buffer_get_unicode_funcs, function in Buffers +hb_buffer_get_unicode_funcs, function in hb-buffer
-hb_buffer_get_user_data, function in Buffers +hb_buffer_get_user_data, function in hb-buffer
-hb_buffer_normalize_glyphs, function in Buffers +hb_buffer_normalize_glyphs, function in hb-buffer
-hb_buffer_pre_allocate, function in Buffers +hb_buffer_pre_allocate, function in hb-buffer
-hb_buffer_reference, function in Buffers +hb_buffer_reference, function in hb-buffer
-hb_buffer_reset, function in Buffers +hb_buffer_reset, function in hb-buffer
-hb_buffer_reverse, function in Buffers +hb_buffer_reverse, function in hb-buffer
-hb_buffer_reverse_clusters, function in Buffers +hb_buffer_reverse_clusters, function in hb-buffer
-hb_buffer_serialize_format_t, enum in Buffers +hb_buffer_serialize_format_t, enum in hb-buffer
-hb_buffer_set_direction, function in Buffers +hb_buffer_set_direction, function in hb-buffer
-hb_buffer_set_language, function in Buffers +hb_buffer_set_language, function in hb-buffer
-hb_buffer_set_length, function in Buffers +hb_buffer_set_length, function in hb-buffer
-hb_buffer_set_script, function in Buffers +hb_buffer_set_script, function in hb-buffer
-hb_buffer_set_unicode_funcs, function in Buffers +hb_buffer_set_unicode_funcs, function in hb-buffer
-hb_buffer_set_user_data, function in Buffers +hb_buffer_set_user_data, function in hb-buffer

D

@@ -328,15 +328,11 @@
-hb_font_funcs_set_glyph_func, function in hb-deprecated -
-
-
hb_font_funcs_set_glyph_h_advance_func, function in hb-font
-hb_font_funcs_set_glyph_h_kerning_func, function in hb-font +hb_font_funcs_set_glyph_h_kerning_func, function in hb-deprecated
@@ -352,7 +348,7 @@
-hb_font_funcs_set_glyph_v_kerning_func, function in hb-font +hb_font_funcs_set_glyph_v_kerning_func, function in hb-deprecated
@@ -404,7 +400,7 @@
-hb_font_get_glyph_h_kerning, function in hb-font +hb_font_get_glyph_h_kerning, function in hb-deprecated
@@ -412,7 +408,7 @@
-hb_font_get_glyph_kerning_for_direction, function in hb-font +hb_font_get_glyph_kerning_for_direction, function in hb-deprecated
@@ -428,7 +424,7 @@
-hb_font_get_glyph_v_kerning, function in hb-font +hb_font_get_glyph_v_kerning, function in hb-deprecated
@@ -555,7 +551,7 @@
-hb_ot_tag_to_language, function in hb-ot-tag +hb_ot_tag_to_language, function in hb-ot-layout

S

@@ -644,15 +640,15 @@
-hb_shape, function in Shaping +hb_shape, function in hb-shape
-hb_shape_full, function in Shaping +hb_shape_full, function in hb-shape
-hb_shape_list_shapers, function in Shaping +hb_shape_list_shapers, function in hb-shape

T

@@ -674,14 +670,6 @@
-hb_unicode_decompose_compatibility, function in hb-unicode -
-
-
-hb_unicode_eastasian_width, function in hb-unicode -
-
-
hb_unicode_funcs_create, function in hb-unicode
@@ -722,18 +710,10 @@
-hb_unicode_funcs_set_decompose_compatibility_func, function in hb-unicode -
-
-
hb_unicode_funcs_set_decompose_func, function in hb-unicode
-hb_unicode_funcs_set_eastasian_width_func, function in hb-unicode -
-
-
hb_unicode_funcs_set_general_category_func, function in hb-unicode
@@ -772,6 +752,6 @@
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-20.html b/docs/html/api-index-0-9-20.html index 5e237d7..290acb6 100644 --- a/docs/html/api-index-0-9-20.html +++ b/docs/html/api-index-0-9-20.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,23 +16,23 @@ B Home Up -Prev -Next +Prev +Next

Index of new symbols in 0.9.20

B

-hb_buffer_flags_t, enum in Buffers +hb_buffer_flags_t, enum in hb-buffer
-hb_buffer_serialize_flags_t, enum in Buffers +hb_buffer_serialize_flags_t, enum in hb-buffer
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-22.html b/docs/html/api-index-0-9-22.html index 68ce10b..7e56b79 100644 --- a/docs/html/api-index-0-9-22.html +++ b/docs/html/api-index-0-9-22.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ O Home Up -Prev -Next +Prev +Next

@@ -29,6 +29,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-28.html b/docs/html/api-index-0-9-28.html index bff8406..1fa3ea2 100644 --- a/docs/html/api-index-0-9-28.html +++ b/docs/html/api-index-0-9-28.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ O Home Up -Prev -Next +Prev +Next

@@ -29,6 +29,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-30.html b/docs/html/api-index-0-9-30.html index 96983c9..863701e 100644 --- a/docs/html/api-index-0-9-30.html +++ b/docs/html/api-index-0-9-30.html @@ -6,9 +6,9 @@ - - - + + + @@ -18,8 +18,8 @@ V Home Up -Prev -Next +Prev +Next

@@ -36,6 +36,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-31.html b/docs/html/api-index-0-9-31.html index b169c5a..7326017 100644 --- a/docs/html/api-index-0-9-31.html +++ b/docs/html/api-index-0-9-31.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,31 +16,31 @@ B Home Up -Prev -Next +Prev +Next +
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-38.html b/docs/html/api-index-0-9-38.html index d992efc..196a9cc 100644 --- a/docs/html/api-index-0-9-38.html +++ b/docs/html/api-index-0-9-38.html @@ -6,9 +6,9 @@ - - - + + + @@ -18,8 +18,8 @@ G Home Up -Prev -Next +Prev +Next

@@ -40,6 +40,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-39.html b/docs/html/api-index-0-9-39.html index af17300..91f6acc 100644 --- a/docs/html/api-index-0-9-39.html +++ b/docs/html/api-index-0-9-39.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,19 +16,19 @@ B Home Up -Prev -Next +Prev +Next

Index of new symbols in 0.9.39

B

-hb_buffer_add_latin1, function in Buffers +hb_buffer_add_latin1, function in hb-buffer
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-41.html b/docs/html/api-index-0-9-41.html index 92a80e0..b5913e9 100644 --- a/docs/html/api-index-0-9-41.html +++ b/docs/html/api-index-0-9-41.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,19 +16,19 @@ B Home Up -Prev -Next +Prev +Next

Index of new symbols in 0.9.41

B

-hb_buffer_reverse_range, function in Buffers +hb_buffer_reverse_range, function in hb-buffer
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-42.html b/docs/html/api-index-0-9-42.html index fe8cd8c..b048b2d 100644 --- a/docs/html/api-index-0-9-42.html +++ b/docs/html/api-index-0-9-42.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,23 +16,27 @@ B Home Up -Prev -Next +Prev +Next

Index of new symbols in 0.9.42

B

-hb_buffer_get_cluster_level, function in Buffers +hb_buffer_cluster_level_t, enum in hb-buffer
-hb_buffer_set_cluster_level, function in Buffers +hb_buffer_get_cluster_level, function in hb-buffer +
+
+
+hb_buffer_set_cluster_level, function in hb-buffer
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-5.html b/docs/html/api-index-0-9-5.html index f1801c5..9054ab0 100644 --- a/docs/html/api-index-0-9-5.html +++ b/docs/html/api-index-0-9-5.html @@ -6,9 +6,9 @@ - - - + + + @@ -20,28 +20,28 @@ T Home Up -Prev -Next +Prev +Next

Index of new symbols in 0.9.5

B

-hb_buffer_get_content_type, function in Buffers +hb_buffer_get_content_type, function in hb-buffer
-hb_buffer_set_content_type, function in Buffers +hb_buffer_set_content_type, function in hb-buffer

F

-hb_feature_from_string, function in Shaping +hb_feature_from_string, function in hb-shape
-hb_feature_to_string, function in Shaping +hb_feature_to_string, function in hb-shape

T

@@ -51,6 +51,6 @@
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-7.html b/docs/html/api-index-0-9-7.html index e6b8ee2..8ffe5dd 100644 --- a/docs/html/api-index-0-9-7.html +++ b/docs/html/api-index-0-9-7.html @@ -6,9 +6,9 @@ - - - + + + @@ -22,55 +22,55 @@ S Home Up -Prev -Next +Prev +Next +
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-0-9-8.html b/docs/html/api-index-0-9-8.html index bf22b18..c42dee8 100644 --- a/docs/html/api-index-0-9-8.html +++ b/docs/html/api-index-0-9-8.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ O Home Up -Prev -Next +Prev +Next

@@ -29,6 +29,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-0-5.html b/docs/html/api-index-1-0-5.html index 805ef95..47bc601 100644 --- a/docs/html/api-index-1-0-5.html +++ b/docs/html/api-index-1-0-5.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ F Home Up -Prev -Next +Prev +Next

@@ -37,6 +37,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-1-2.html b/docs/html/api-index-1-1-2.html index 0b57389..5a774cc 100644 --- a/docs/html/api-index-1-1-2.html +++ b/docs/html/api-index-1-1-2.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ F Home Up -Prev -Next +Prev +Next

@@ -33,6 +33,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-1-3.html b/docs/html/api-index-1-1-3.html index 6ac7520..cc9d926 100644 --- a/docs/html/api-index-1-1-3.html +++ b/docs/html/api-index-1-1-3.html @@ -6,9 +6,9 @@ - - - + + + @@ -18,15 +18,15 @@ F Home Up -Prev -Next +Prev +Next

Index of new symbols in 1.1.3

B

-hb_buffer_set_message_func, function in Buffers +hb_buffer_set_message_func, function in hb-buffer

F

@@ -44,6 +44,6 @@
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-2-3.html b/docs/html/api-index-1-2-3.html index 0da0a7b..36bf20c 100644 --- a/docs/html/api-index-1-2-3.html +++ b/docs/html/api-index-1-2-3.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ F Home Up -Prev -Next +Prev +Next

@@ -41,6 +41,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-3-3.html b/docs/html/api-index-1-3-3.html index c10e208..f5687f5 100644 --- a/docs/html/api-index-1-3-3.html +++ b/docs/html/api-index-1-3-3.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ O Home Up -Prev -Next +Prev +Next

@@ -81,6 +81,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-4-0.html b/docs/html/api-index-1-4-0.html new file mode 100644 index 0000000..c6bfe97 --- /dev/null +++ b/docs/html/api-index-1-4-0.html @@ -0,0 +1,30 @@ + + + + +Index of new symbols in 1.4.0: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.4.0

+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-1-4-2.html b/docs/html/api-index-1-4-2.html index facfc1e..e7fd690 100644 --- a/docs/html/api-index-1-4-2.html +++ b/docs/html/api-index-1-4-2.html @@ -6,9 +6,9 @@ - - - + + + @@ -20,8 +20,8 @@ V Home Up -Prev -Next +Prev +Next

@@ -45,35 +45,23 @@

O

-hb_ot_var_axis_t, struct in hb-ot-var +hb_ot_var_get_axis_count, function in hb-ot-var
-hb_ot_var_find_axis, function in hb-ot-var +hb_ot_var_has_data, function in hb-ot-var
-hb_ot_var_get_axes, function in hb-ot-var +hb_ot_var_normalize_coords, function in hb-ot-var
-hb_ot_var_get_axis_count, function in hb-ot-var +hb_ot_var_normalize_variations, function in hb-ot-var
-hb_ot_var_has_data, function in hb-ot-var -
-
-
-hb_ot_var_normalize_coords, function in hb-ot-var -
-
-
-hb_ot_var_normalize_variations, function in hb-ot-var -
-
-
-HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var +HB_OT_VAR_NO_AXIS_INDEX, macro in hb-deprecated

V

@@ -91,6 +79,6 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-4-3.html b/docs/html/api-index-1-4-3.html index 0cf5823..9b333ed 100644 --- a/docs/html/api-index-1-4-3.html +++ b/docs/html/api-index-1-4-3.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ F Home Up -Prev -Next +Prev +Next

@@ -29,6 +29,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-5-0.html b/docs/html/api-index-1-5-0.html index 5fb0943..0321f7a 100644 --- a/docs/html/api-index-1-5-0.html +++ b/docs/html/api-index-1-5-0.html @@ -6,9 +6,9 @@ - - - + + + @@ -18,28 +18,32 @@ G Home Up -Prev -Next +Prev +Next

Index of new symbols in 1.5.0

B

-hb_buffer_append, function in Buffers +hb_buffer_append, function in hb-buffer
-hb_buffer_diff, function in Buffers +hb_buffer_diff, function in hb-buffer

G

-hb_glyph_info_get_glyph_flags, function in Buffers +hb_glyph_flags_t, enum in hb-buffer +
+
+
+hb_glyph_info_get_glyph_flags, function in hb-buffer
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-6-0.html b/docs/html/api-index-1-6-0.html index 585a60a..cf383a5 100644 --- a/docs/html/api-index-1-6-0.html +++ b/docs/html/api-index-1-6-0.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,8 +16,8 @@ F Home Up -Prev -Next +Prev +Next

@@ -33,6 +33,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/api-index-1-7-5.html b/docs/html/api-index-1-7-5.html new file mode 100644 index 0000000..3863eea --- /dev/null +++ b/docs/html/api-index-1-7-5.html @@ -0,0 +1,30 @@ + + + + +Index of new symbols in 1.7.5: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.7.5

+ +
+ + + \ No newline at end of file diff --git a/docs/html/api-index-1-7-7.html b/docs/html/api-index-1-7-7.html new file mode 100644 index 0000000..277561c --- /dev/null +++ b/docs/html/api-index-1-7-7.html @@ -0,0 +1,100 @@ + + + + +Index of new symbols in 1.7.7: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.7.7

+

B

+
+hb_blob_create_from_file, function in hb-blob +
+
+

F

+
+hb_face_count, function in hb-face +
+
+

M

+
+hb_map_allocation_successful, function in hb-map +
+
+
+hb_map_clear, function in hb-map +
+
+
+hb_map_create, function in hb-map +
+
+
+hb_map_del, function in hb-map +
+
+
+hb_map_destroy, function in hb-map +
+
+
+hb_map_get, function in hb-map +
+
+
+hb_map_get_empty, function in hb-map +
+
+
+hb_map_get_population, function in hb-map +
+
+
+hb_map_get_user_data, function in hb-map +
+
+
+hb_map_has, function in hb-map +
+
+
+hb_map_is_empty, function in hb-map +
+
+
+hb_map_reference, function in hb-map +
+
+
+hb_map_set, function in hb-map +
+
+
+hb_map_set_user_data, function in hb-map +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-1-8-0.html b/docs/html/api-index-1-8-0.html new file mode 100644 index 0000000..65476d8 --- /dev/null +++ b/docs/html/api-index-1-8-0.html @@ -0,0 +1,45 @@ + + + + +Index of new symbols in 1.8.0: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.8.0

+

B

+
+hb_blob_copy_writable_or_fail, function in hb-blob +
+
+

S

+
+hb_set_previous, function in hb-set +
+
+
+hb_set_previous_range, function in hb-set +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-1-8-1.html b/docs/html/api-index-1-8-1.html new file mode 100644 index 0000000..2db6d73 --- /dev/null +++ b/docs/html/api-index-1-8-1.html @@ -0,0 +1,41 @@ + + + + +Index of new symbols in 1.8.1: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.8.1

+

O

+
+hb_ot_layout_lookups_substitute_closure, function in hb-ot-layout +
+
+

S

+
+hb_set_is_subset, function in hb-set +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-1-8-5.html b/docs/html/api-index-1-8-5.html new file mode 100644 index 0000000..4c31dfc --- /dev/null +++ b/docs/html/api-index-1-8-5.html @@ -0,0 +1,34 @@ + + + + +Index of new symbols in 1.8.5: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.8.5

+

O

+
+hb_ot_layout_collect_features, function in hb-ot-layout +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-1-8-6.html b/docs/html/api-index-1-8-6.html new file mode 100644 index 0000000..b930c3f --- /dev/null +++ b/docs/html/api-index-1-8-6.html @@ -0,0 +1,50 @@ + + + + +Index of new symbols in 1.8.6: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.8.6

+

F

+
+hb_font_funcs_set_glyph_h_advances_func, function in hb-font +
+
+
+hb_font_funcs_set_glyph_v_advances_func, function in hb-font +
+
+
+hb_font_get_glyph_advances_for_direction, function in hb-font +
+
+
+hb_font_get_glyph_h_advances, function in hb-font +
+
+
+hb_font_get_glyph_v_advances, function in hb-font +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-1-9-0.html b/docs/html/api-index-1-9-0.html new file mode 100644 index 0000000..c04ee2e --- /dev/null +++ b/docs/html/api-index-1-9-0.html @@ -0,0 +1,57 @@ + + + + +Index of new symbols in 1.9.0: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 1.9.0

+

F

+
+hb_face_builder_add_table, function in hb-face +
+
+
+hb_face_builder_create, function in hb-face +
+
+
+hb_face_collect_unicodes, function in hb-face +
+
+
+hb_face_collect_variation_selectors, function in hb-face +
+
+
+hb_face_collect_variation_unicodes, function in hb-face +
+
+

U

+
+HB_UNICODE_MAX, macro in hb-unicode +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-2-0-0.html b/docs/html/api-index-2-0-0.html new file mode 100644 index 0000000..bf4c644 --- /dev/null +++ b/docs/html/api-index-2-0-0.html @@ -0,0 +1,92 @@ + + + + +Index of new symbols in 2.0.0: HarfBuzz Manual + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/html/api-index-2-1-0.html b/docs/html/api-index-2-1-0.html new file mode 100644 index 0000000..f1e19aa --- /dev/null +++ b/docs/html/api-index-2-1-0.html @@ -0,0 +1,121 @@ + + + + +Index of new symbols in 2.1.0: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.1.0

+

C

+
+hb_color_get_alpha, macro in hb-ot-color +
+
+
+hb_color_get_blue, macro in hb-ot-color +
+
+
+hb_color_get_green, macro in hb-ot-color +
+
+
+hb_color_get_red, macro in hb-ot-color +
+
+
+hb_color_t, typedef in hb-ot-color +
+
+

O

+
+hb_ot_color_glyph_get_layers, function in hb-ot-color +
+
+
+hb_ot_color_glyph_reference_png, function in hb-ot-color +
+
+
+hb_ot_color_glyph_reference_svg, function in hb-ot-color +
+
+
+hb_ot_color_has_layers, function in hb-ot-color +
+
+
+hb_ot_color_has_palettes, function in hb-ot-color +
+
+
+hb_ot_color_has_png, function in hb-ot-color +
+
+
+hb_ot_color_has_svg, function in hb-ot-color +
+
+
+hb_ot_color_palette_color_get_name_id, function in hb-ot-color +
+
+
+hb_ot_color_palette_flags_t, enum in hb-ot-color +
+
+
+hb_ot_color_palette_get_colors, function in hb-ot-color +
+
+
+hb_ot_color_palette_get_count, function in hb-ot-color +
+
+
+hb_ot_color_palette_get_flags, function in hb-ot-color +
+
+
+hb_ot_color_palette_get_name_id, function in hb-ot-color +
+
+
+hb_ot_name_get_utf16, function in hb-ot-name +
+
+
+hb_ot_name_get_utf32, function in hb-ot-name +
+
+
+hb_ot_name_get_utf8, function in hb-ot-name +
+
+
+hb_ot_name_list_names, function in hb-ot-name +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/api-index-full.html b/docs/html/api-index-full.html index 591bfe4..5e0cb84 100644 --- a/docs/html/api-index-full.html +++ b/docs/html/api-index-full.html @@ -6,14 +6,16 @@ - - - + + + - - - + +

API Index

-

B

+

A

+
+hb_aat_layout_feature_selector_t, enum in hb-aat-layout +
+
+
+hb_aat_layout_feature_type_get_name_id, function in hb-aat-layout +
+
+
+hb_aat_layout_feature_type_get_selector_infos, function in hb-aat-layout +
+
+
+hb_aat_layout_feature_type_t, enum in hb-aat-layout +
+
+
+hb_aat_layout_get_feature_types, function in hb-aat-layout +
+
+
+hb_aat_layout_has_positioning, function in hb-aat-layout +
+
+
+hb_aat_layout_has_substitution, function in hb-aat-layout +
+
+
+hb_aat_layout_has_tracking, function in hb-aat-layout +
+
+
+HB_AAT_LAYOUT_NO_SELECTOR_INDEX, macro in hb-aat-layout +
+
+

B

hb_blob_copy_writable_or_fail, function in hb-blob
@@ -116,67 +155,67 @@
-hb_buffer_add, function in Buffers +hb_buffer_add, function in hb-buffer
-hb_buffer_add_codepoints, function in Buffers +hb_buffer_add_codepoints, function in hb-buffer
-hb_buffer_add_latin1, function in Buffers +hb_buffer_add_latin1, function in hb-buffer
-hb_buffer_add_utf16, function in Buffers +hb_buffer_add_utf16, function in hb-buffer
-hb_buffer_add_utf32, function in Buffers +hb_buffer_add_utf32, function in hb-buffer
-hb_buffer_add_utf8, function in Buffers +hb_buffer_add_utf8, function in hb-buffer
-hb_buffer_allocation_successful, function in Buffers +hb_buffer_allocation_successful, function in hb-buffer
-hb_buffer_append, function in Buffers +hb_buffer_append, function in hb-buffer
-hb_buffer_clear_contents, function in Buffers +hb_buffer_clear_contents, function in hb-buffer
-hb_buffer_cluster_level_t, enum in Buffers +hb_buffer_cluster_level_t, enum in hb-buffer
-hb_buffer_content_type_t, enum in Buffers +hb_buffer_content_type_t, enum in hb-buffer
-hb_buffer_create, function in Buffers +hb_buffer_create, function in hb-buffer
-hb_buffer_deserialize_glyphs, function in Buffers +hb_buffer_deserialize_glyphs, function in hb-buffer
-hb_buffer_destroy, function in Buffers +hb_buffer_destroy, function in hb-buffer
-hb_buffer_diff, function in Buffers +hb_buffer_diff, function in hb-buffer
-hb_buffer_diff_flags_t, enum in Buffers +hb_buffer_diff_flags_t, enum in hb-buffer
@@ -184,103 +223,107 @@
-hb_buffer_flags_t, enum in Buffers +hb_buffer_flags_t, enum in hb-buffer
-hb_buffer_get_cluster_level, function in Buffers +hb_buffer_get_cluster_level, function in hb-buffer
-hb_buffer_get_content_type, function in Buffers +hb_buffer_get_content_type, function in hb-buffer
-hb_buffer_get_direction, function in Buffers +hb_buffer_get_direction, function in hb-buffer
-hb_buffer_get_empty, function in Buffers +hb_buffer_get_empty, function in hb-buffer
-hb_buffer_get_flags, function in Buffers +hb_buffer_get_flags, function in hb-buffer
-hb_buffer_get_glyph_infos, function in Buffers +hb_buffer_get_glyph_infos, function in hb-buffer
-hb_buffer_get_glyph_positions, function in Buffers +hb_buffer_get_glyph_positions, function in hb-buffer
-hb_buffer_get_language, function in Buffers +hb_buffer_get_invisible_glyph, function in hb-buffer
-hb_buffer_get_length, function in Buffers +hb_buffer_get_language, function in hb-buffer
-hb_buffer_get_replacement_codepoint, function in Buffers +hb_buffer_get_length, function in hb-buffer
-hb_buffer_get_script, function in Buffers +hb_buffer_get_replacement_codepoint, function in hb-buffer
-hb_buffer_get_segment_properties, function in Buffers +hb_buffer_get_script, function in hb-buffer
-hb_buffer_get_unicode_funcs, function in Buffers +hb_buffer_get_segment_properties, function in hb-buffer
-hb_buffer_get_user_data, function in Buffers +hb_buffer_get_unicode_funcs, function in hb-buffer
-hb_buffer_guess_segment_properties, function in Buffers +hb_buffer_get_user_data, function in hb-buffer
-hb_buffer_message_func_t, user_function in Buffers +hb_buffer_guess_segment_properties, function in hb-buffer
-hb_buffer_normalize_glyphs, function in Buffers +hb_buffer_message_func_t, user_function in hb-buffer
-hb_buffer_pre_allocate, function in Buffers +hb_buffer_normalize_glyphs, function in hb-buffer
-hb_buffer_reference, function in Buffers +hb_buffer_pre_allocate, function in hb-buffer
-HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT, macro in Buffers +hb_buffer_reference, function in hb-buffer
-hb_buffer_reset, function in Buffers +HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT, macro in hb-buffer
-hb_buffer_reverse, function in Buffers +hb_buffer_reset, function in hb-buffer
-hb_buffer_reverse_clusters, function in Buffers +hb_buffer_reverse, function in hb-buffer
-hb_buffer_reverse_range, function in Buffers +hb_buffer_reverse_clusters, function in hb-buffer +
+
+
+hb_buffer_reverse_range, function in hb-buffer
@@ -288,79 +331,83 @@
-hb_buffer_serialize_flags_t, enum in Buffers +hb_buffer_serialize_flags_t, enum in hb-buffer
-hb_buffer_serialize_format_from_string, function in Buffers +hb_buffer_serialize_format_from_string, function in hb-buffer
-hb_buffer_serialize_format_t, enum in Buffers +hb_buffer_serialize_format_t, enum in hb-buffer
-hb_buffer_serialize_format_to_string, function in Buffers +hb_buffer_serialize_format_to_string, function in hb-buffer
-hb_buffer_serialize_glyphs, function in Buffers +hb_buffer_serialize_glyphs, function in hb-buffer
-hb_buffer_serialize_list_formats, function in Buffers +hb_buffer_serialize_list_formats, function in hb-buffer
-hb_buffer_set_cluster_level, function in Buffers +hb_buffer_set_cluster_level, function in hb-buffer
-hb_buffer_set_content_type, function in Buffers +hb_buffer_set_content_type, function in hb-buffer
-hb_buffer_set_direction, function in Buffers +hb_buffer_set_direction, function in hb-buffer
-hb_buffer_set_flags, function in Buffers +hb_buffer_set_flags, function in hb-buffer
-hb_buffer_set_language, function in Buffers +hb_buffer_set_invisible_glyph, function in hb-buffer
-hb_buffer_set_length, function in Buffers +hb_buffer_set_language, function in hb-buffer
-hb_buffer_set_message_func, function in Buffers +hb_buffer_set_length, function in hb-buffer
-hb_buffer_set_replacement_codepoint, function in Buffers +hb_buffer_set_message_func, function in hb-buffer
-hb_buffer_set_script, function in Buffers +hb_buffer_set_replacement_codepoint, function in hb-buffer
-hb_buffer_set_segment_properties, function in Buffers +hb_buffer_set_script, function in hb-buffer
-hb_buffer_set_unicode_funcs, function in Buffers +hb_buffer_set_segment_properties, function in hb-buffer
-hb_buffer_set_user_data, function in Buffers +hb_buffer_set_unicode_funcs, function in hb-buffer
-hb_buffer_t, typedef in Buffers +hb_buffer_set_user_data, function in hb-buffer +
+
+
+hb_buffer_t, typedef in hb-buffer

C

@@ -369,6 +416,30 @@
+HB_COLOR, macro in hb-ot-color +
+
+
+hb_color_get_alpha, macro in hb-ot-color +
+
+
+hb_color_get_blue, macro in hb-ot-color +
+
+
+hb_color_get_green, macro in hb-ot-color +
+
+
+hb_color_get_red, macro in hb-ot-color +
+
+
+hb_color_t, typedef in hb-ot-color +
+
+
hb_coretext_face_create, function in hb-coretext
@@ -439,6 +510,26 @@

F

+hb_face_builder_add_table, function in hb-face +
+
+
+hb_face_builder_create, function in hb-face +
+
+
+hb_face_collect_unicodes, function in hb-face +
+
+
+hb_face_collect_variation_selectors, function in hb-face +
+
+
+hb_face_collect_variation_unicodes, function in hb-face +
+
+
hb_face_count, function in hb-face
@@ -519,15 +610,23 @@
-hb_feature_from_string, function in Shaping +hb_feature_from_string, function in hb-shape +
+
+
+HB_FEATURE_GLOBAL_END, macro in hb-shape
-hb_feature_t, struct in Shaping +HB_FEATURE_GLOBAL_START, macro in hb-shape
-hb_feature_to_string, function in Shaping +hb_feature_t, struct in hb-shape +
+
+
+hb_feature_to_string, function in hb-shape
@@ -595,7 +694,7 @@
-hb_font_funcs_set_glyph_func, function in hb-deprecated +hb_font_funcs_set_glyph_h_advances_func, function in hb-font
@@ -603,7 +702,7 @@
-hb_font_funcs_set_glyph_h_kerning_func, function in hb-font +hb_font_funcs_set_glyph_h_kerning_func, function in hb-deprecated
@@ -615,11 +714,15 @@
+hb_font_funcs_set_glyph_v_advances_func, function in hb-font +
+
+
hb_font_funcs_set_glyph_v_advance_func, function in hb-font
-hb_font_funcs_set_glyph_v_kerning_func, function in hb-font +hb_font_funcs_set_glyph_v_kerning_func, function in hb-deprecated
@@ -627,6 +730,10 @@
+hb_font_funcs_set_nominal_glyphs_func, function in hb-font +
+
+
hb_font_funcs_set_nominal_glyph_func, function in hb-font
@@ -671,6 +778,14 @@
+hb_font_get_glyph_advances_for_direction, function in hb-font +
+
+
+hb_font_get_glyph_advances_func_t, user_function in hb-font +
+
+
hb_font_get_glyph_advance_for_direction, function in hb-font
@@ -719,15 +834,23 @@
+hb_font_get_glyph_h_advances, function in hb-font +
+
+
+hb_font_get_glyph_h_advances_func_t, typedef in hb-font +
+
+
hb_font_get_glyph_h_advance_func_t, typedef in hb-font
-hb_font_get_glyph_h_kerning, function in hb-font +hb_font_get_glyph_h_kerning, function in hb-deprecated
-hb_font_get_glyph_h_kerning_func_t, typedef in hb-font +hb_font_get_glyph_h_kerning_func_t, typedef in hb-deprecated
@@ -739,11 +862,11 @@
-hb_font_get_glyph_kerning_for_direction, function in hb-font +hb_font_get_glyph_kerning_for_direction, function in hb-deprecated
-hb_font_get_glyph_kerning_func_t, user_function in hb-font +hb_font_get_glyph_kerning_func_t, user_function in hb-deprecated
@@ -767,15 +890,23 @@
+hb_font_get_glyph_v_advances, function in hb-font +
+
+
+hb_font_get_glyph_v_advances_func_t, typedef in hb-font +
+
+
hb_font_get_glyph_v_advance_func_t, typedef in hb-font
-hb_font_get_glyph_v_kerning, function in hb-font +hb_font_get_glyph_v_kerning, function in hb-deprecated
-hb_font_get_glyph_v_kerning_func_t, typedef in hb-font +hb_font_get_glyph_v_kerning_func_t, typedef in hb-deprecated
@@ -964,19 +1095,15 @@
-hb_glyph_flags_t, enum in Buffers -
-
-
-hb_glyph_info_get_glyph_flags, function in Buffers +hb_glyph_flags_t, enum in hb-buffer
-hb_glyph_info_t, struct in Buffers +hb_glyph_info_get_glyph_flags, function in hb-buffer
-hb_glyph_position_t, struct in Buffers +hb_glyph_position_t, struct in hb-buffer
@@ -1044,10 +1171,18 @@
+hb_gobject_map_get_type, function in hb-gobject +
+
+
hb_gobject_memory_mode_get_type, function in hb-gobject
+hb_gobject_ot_color_palette_flags_get_type, function in hb-gobject +
+
+
hb_gobject_ot_layout_glyph_class_get_type, function in hb-gobject
@@ -1152,10 +1287,18 @@
+HB_GOBJECT_TYPE_MAP, macro in hb-gobject +
+
+
HB_GOBJECT_TYPE_MEMORY_MODE, macro in hb-gobject
+HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS, macro in hb-gobject +
+
+
HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS, macro in hb-gobject
@@ -1232,10 +1375,6 @@
-hb_graphite2_font_get_gr_font, function in hb-graphite2 -
-
-
HB_GRAPHITE2_TAG_SILF, macro in hb-graphite2
@@ -1275,67 +1414,67 @@

M

-hb_map_allocation_successful, function in hb-map +hb_map_allocation_successful, function in hb-map
-hb_map_clear, function in hb-map +hb_map_clear, function in hb-map
-hb_map_create, function in hb-map +hb_map_create, function in hb-map
-hb_map_del, function in hb-map +hb_map_del, function in hb-map
-hb_map_destroy, function in hb-map +hb_map_destroy, function in hb-map
-hb_map_get, function in hb-map +hb_map_get, function in hb-map
-hb_map_get_empty, function in hb-map +hb_map_get_empty, function in hb-map
-hb_map_get_population, function in hb-map +hb_map_get_population, function in hb-map
-hb_map_get_user_data, function in hb-map +hb_map_get_user_data, function in hb-map
-hb_map_has, function in hb-map +hb_map_has, function in hb-map
-hb_map_is_empty, function in hb-map +hb_map_is_empty, function in hb-map
-hb_map_reference, function in hb-map +hb_map_reference, function in hb-map
-hb_map_set, function in hb-map +hb_map_set, function in hb-map
-hb_map_set_user_data, function in hb-map +hb_map_set_user_data, function in hb-map
-hb_map_t, typedef in hb-map +hb_map_t, typedef in hb-map
-HB_MAP_VALUE_INVALID, macro in hb-map +HB_MAP_VALUE_INVALID, macro in hb-map
@@ -1348,10 +1487,66 @@ HB_MAP_VALUE_INVALID, macro in hb-map

O

+hb_ot_color_glyph_get_layers, function in hb-ot-color +
+
+
+hb_ot_color_glyph_reference_png, function in hb-ot-color +
+
+
+hb_ot_color_glyph_reference_svg, function in hb-ot-color +
+
+
+hb_ot_color_has_layers, function in hb-ot-color +
+
+
+hb_ot_color_has_palettes, function in hb-ot-color +
+
+
+hb_ot_color_has_png, function in hb-ot-color +
+
+
+hb_ot_color_has_svg, function in hb-ot-color +
+
+
+hb_ot_color_palette_color_get_name_id, function in hb-ot-color +
+
+
+hb_ot_color_palette_flags_t, enum in hb-ot-color +
+
+
+hb_ot_color_palette_get_colors, function in hb-ot-color +
+
+
+hb_ot_color_palette_get_count, function in hb-ot-color +
+
+
+hb_ot_color_palette_get_flags, function in hb-ot-color +
+
+
+hb_ot_color_palette_get_name_id, function in hb-ot-color +
+
+
hb_ot_font_set_funcs, function in hb-ot-font
+hb_ot_layout_collect_features, function in hb-ot-layout +
+
+
hb_ot_layout_collect_lookups, function in hb-ot-layout
@@ -1360,10 +1555,18 @@ HB_MAP_VALUE_INVALID, macro in hb-map
+hb_ot_layout_feature_get_characters, function in hb-ot-layout +
+
+
hb_ot_layout_feature_get_lookups, function in hb-ot-layout
+hb_ot_layout_feature_get_name_ids, function in hb-ot-layout +
+
+
hb_ot_layout_feature_with_variations_get_lookups, function in hb-ot-layout
@@ -1456,15 +1659,11 @@ HB_MAP_VALUE_INVALID, macro in hb-map
-hb_ot_layout_script_find_language, function in hb-ot-layout -
-
-
hb_ot_layout_script_get_language_tags, function in hb-ot-layout
-hb_ot_layout_table_choose_script, function in hb-ot-layout +hb_ot_layout_script_select_language, function in hb-ot-layout
@@ -1472,7 +1671,7 @@ HB_MAP_VALUE_INVALID, macro in hb-map
-hb_ot_layout_table_find_script, function in hb-ot-layout +hb_ot_layout_table_find_script, function in hb-deprecated
@@ -1488,6 +1687,10 @@ HB_MAP_VALUE_INVALID, macro in hb-map
+hb_ot_layout_table_select_script, function in hb-ot-layout +
+
+
hb_ot_math_constant_t, enum in hb-ot-math
@@ -1548,6 +1751,34 @@ HB_MAP_VALUE_INVALID, macro in hb-map
+HB_OT_MAX_TAGS_PER_LANGUAGE, macro in hb-ot-layout +
+
+
+HB_OT_MAX_TAGS_PER_SCRIPT, macro in hb-ot-layout +
+
+
+hb_ot_name_get_utf16, function in hb-ot-name +
+
+
+hb_ot_name_get_utf32, function in hb-ot-name +
+
+
+hb_ot_name_get_utf8, function in hb-ot-name +
+
+
+hb_ot_name_id_t, typedef in hb-ot-name +
+
+
+hb_ot_name_list_names, function in hb-ot-name +
+
+
hb_ot_shape_glyphs_closure, function in hb-ot-shape
@@ -1556,19 +1787,23 @@ HB_MAP_VALUE_INVALID, macro in hb-map
-hb_ot_tags_from_script, function in hb-ot-tag +hb_ot_tags_from_script_and_language, function in hb-ot-layout +
+
+
+hb_ot_tags_to_script_and_language, function in hb-ot-layout
-HB_OT_TAG_DEFAULT_LANGUAGE, macro in hb-ot-tag +HB_OT_TAG_BASE, macro in hb-ot-layout
-HB_OT_TAG_DEFAULT_SCRIPT, macro in hb-ot-tag +HB_OT_TAG_DEFAULT_LANGUAGE, macro in hb-ot-layout
-hb_ot_tag_from_language, function in hb-ot-tag +HB_OT_TAG_DEFAULT_SCRIPT, macro in hb-ot-layout
@@ -1592,63 +1827,79 @@ HB_MAP_VALUE_INVALID, macro in hb-map
-hb_ot_tag_to_language, function in hb-ot-tag +hb_ot_tag_to_language, function in hb-ot-layout +
+
+
+hb_ot_tag_to_script, function in hb-ot-layout
-hb_ot_tag_to_script, function in hb-ot-tag +HB_OT_TAG_VAR_AXIS_ITALIC, macro in hb-ot-var
-HB_OT_TAG_VAR_AXIS_ITALIC, macro in hb-ot-var +HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE, macro in hb-ot-var
-HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE, macro in hb-ot-var +HB_OT_TAG_VAR_AXIS_SLANT, macro in hb-ot-var
-HB_OT_TAG_VAR_AXIS_SLANT, macro in hb-ot-var +HB_OT_TAG_VAR_AXIS_WEIGHT, macro in hb-ot-var
-HB_OT_TAG_VAR_AXIS_WEIGHT, macro in hb-ot-var +HB_OT_TAG_VAR_AXIS_WIDTH, macro in hb-ot-var
-HB_OT_TAG_VAR_AXIS_WIDTH, macro in hb-ot-var +hb_ot_var_axis_flags_t, enum in hb-ot-var
-hb_ot_var_axis_t, struct in hb-ot-var +hb_ot_var_find_axis_info, function in hb-ot-var
-hb_ot_var_find_axis, function in hb-ot-var +hb_ot_var_get_axis_count, function in hb-ot-var
-hb_ot_var_get_axes, function in hb-ot-var +hb_ot_var_get_axis_infos, function in hb-ot-var
-hb_ot_var_get_axis_count, function in hb-ot-var +hb_ot_var_get_named_instance_count, function in hb-ot-var
-hb_ot_var_has_data, function in hb-ot-var +hb_ot_var_has_data, function in hb-ot-var
-hb_ot_var_normalize_coords, function in hb-ot-var +hb_ot_var_named_instance_get_design_coords, function in hb-ot-var
-hb_ot_var_normalize_variations, function in hb-ot-var +hb_ot_var_named_instance_get_postscript_name_id, function in hb-ot-var
-HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var +hb_ot_var_named_instance_get_subfamily_name_id, function in hb-ot-var +
+
+
+hb_ot_var_normalize_coords, function in hb-ot-var +
+
+
+hb_ot_var_normalize_variations, function in hb-ot-var +
+
+
+HB_OT_VAR_NO_AXIS_INDEX, macro in hb-deprecated

P

@@ -1687,19 +1938,19 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
-HB_SEGMENT_PROPERTIES_DEFAULT, macro in Buffers +HB_SEGMENT_PROPERTIES_DEFAULT, macro in hb-buffer
-hb_segment_properties_equal, function in Buffers +hb_segment_properties_equal, function in hb-buffer
-hb_segment_properties_hash, function in Buffers +hb_segment_properties_hash, function in hb-buffer
-hb_segment_properties_t, struct in Buffers +hb_segment_properties_t, struct in hb-buffer
@@ -1763,10 +2014,6 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
-hb_set_invert, function in hb-deprecated -
-
-
hb_set_is_empty, function in hb-set
@@ -1827,15 +2074,15 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
-hb_shape, function in Shaping +hb_shape, function in hb-shape
-hb_shape_full, function in Shaping +hb_shape_full, function in hb-shape
-hb_shape_list_shapers, function in Shaping +hb_shape_list_shapers, function in hb-shape
@@ -1941,18 +2188,10 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
-hb_unicode_decompose_compatibility, function in hb-unicode -
-
-
hb_unicode_decompose_func_t, user_function in hb-unicode
-hb_unicode_eastasian_width, function in hb-unicode -
-
-
hb_unicode_funcs_create, function in hb-unicode
@@ -1997,18 +2236,10 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
-hb_unicode_funcs_set_decompose_compatibility_func, function in hb-unicode -
-
-
hb_unicode_funcs_set_decompose_func, function in hb-unicode
-hb_unicode_funcs_set_eastasian_width_func, function in hb-unicode -
-
-
hb_unicode_funcs_set_general_category_func, function in hb-unicode
@@ -2041,7 +2272,11 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
-HB_UNICODE_MAX_DECOMPOSITION_LEN, macro in hb-unicode +HB_UNICODE_MAX, macro in hb-unicode +
+
+
+HB_UNICODE_MAX_DECOMPOSITION_LEN, macro in hb-deprecated
@@ -2127,6 +2362,6 @@ HB_OT_VAR_NO_AXIS_INDEX, macro in hb-ot-var
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/buffers-language-script-and-direction.html b/docs/html/buffers-language-script-and-direction.html index c5309a6..d88dc05 100644 --- a/docs/html/buffers-language-script-and-direction.html +++ b/docs/html/buffers-language-script-and-direction.html @@ -6,9 +6,9 @@ - + - + @@ -16,7 +16,7 @@ Home Up -Prev +Prev Next
@@ -39,14 +39,15 @@

Creating and destroying buffers

- As we saw in our initial example, a buffer is created and + As we saw in our Getting Started example, a + buffer is created and initialized with hb_buffer_create(). This produces a new, empty buffer object, instantiated with some default values and ready to accept your Unicode strings.

- HarfBuzz manages the memory of objects that it creates (such as - buffers), so you don't have to. When you have finished working on + HarfBuzz manages the memory of objects (such as buffers) that it + creates, so you don't have to. When you have finished working on a buffer, you can call hb_buffer_destroy():

@@ -82,6 +83,6 @@ void somefunc(hb_buffer_t *buffer) {
 
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/building.html b/docs/html/building.html index ea051f9..6454786 100644 --- a/docs/html/building.html +++ b/docs/html/building.html @@ -2,13 +2,13 @@ -Building: HarfBuzz Manual +Building HarfBuzz: HarfBuzz Manual - - - - + + + + @@ -17,64 +17,402 @@ Home Up Prev -Next +Next

-Building

+Building HarfBuzz
+
+

+Building on Linux

+

+ (1) To build HarfBuzz on Linux, you must first install the + development packages for FreeType, Cairo, and GLib. The exact + commands required for this step will vary depending on + the Linux distribution you use. +

- On Linux, install the development packages for FreeType, Cairo, and GLib. - For example, on Ubuntu / Debian, you would do: + For example, on an Ubuntu or Debian system, you would run:

-sudo apt-get install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
+	sudo apt install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev
       

- whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do: + On Fedora, RHEL, CentOS, or other Red-Hat–based systems, you would run: +

+
+	sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel
+      
+

+ +

+

+ (2) The next step depends on whether you + are building from the source in a downloaded release tarball or + from the source directly from the git repository. +

+

+ (2)(a) If you downloaded the HarfBuzz + source code in a tarball, you can now extract the source. +

+

+ From a shell in the top-level directory of the extracted source + code, you can run ./configure followed by + make as with any other standard package. +

+

+ This should leave you with a shared + library in the src/ directory, and a few + utility programs including hb-view and + hb-shape under the util/ + directory. +

+

+ (2)(b) If you are building from the source in the HarfBuzz git + repository, rather than installing from a downloaded tarball + release, then you must install two more auxiliary tools before you + can build for the first time: pkg-config and + ragel. +

+

+ On Ubuntu or Debian, run:

-sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel
+	sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
       

- or using MacPorts: + On Fedora, RHEL, CentOS, run:

-sudo port install freetype glib2 cairo
+	sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
       

+

- 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/. + With pkg-config and ragel + installed, you can now run ./autogen.sh, + followed by ./configure and + make to build HarfBuzz.

+
+
+

+Building on Windows

- If you are bootstrapping 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: + On Windows, consider using Microsoft's free vcpkg utility + to build HarfBuzz, its dependencies, and other open-source + libraries. +

+

+ If you need to build HarfBuzz from source, first put the + ragel binary on your + PATH, then follow the appveyor CI cmake + build + instructions. +

+
+
+

+Building on macOS

+

+ There are two ways to build HarfBuzz on Mac systems: MacPorts + and Homebrew. The process is similar to the process used on a + Linux system. +

+

+ (1) You must first install the + development packages for FreeType, Cairo, and GLib. If you are + using MacPorts, you should run:

-sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools
+	sudo port install freetype glib2 cairo
       

- and on Fedora, RHEL, CentOS:

+

+ If you are using Homebrew, you should run: +

+
	
+	  brew install freetype glib cairo
+	
+

+

+

+ (2) The next step depends on whether you are building from the + source in a downloaded release tarball or from the source directly + from the git repository. +

+

+ (2)(a) If you are installing HarfBuzz + from a downloaded tarball release, extract the tarball and + open a Terminal in the extracted source-code directory. Run: +

-sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc
-      
+ ./configure + +

+ followed by: +

+
	
+	  make
+	
+

+ to build HarfBuzz. +

- or using MacPorts: + (2)(b) Alternatively, if you are building + HarfBuzz from the source in the HarfBuzz git repository, then + you must install several built-time dependencies before + proceeding. +

+

If you are + using MacPorts, you should run:

-sudo port install autoconf automake libtool pkgconfig ragel gtk-doc
+	sudo port install autoconf automake libtool pkgconfig ragel gtk-doc 
       

-

+ to install the build dependencies. +

+

If you are using Homebrew, you should run: +

+
	
+	  brew install autoconf automake libtool pkgconfig ragel gtk-doc
+	
+

+ Finally, you can run: +

+
+	  ./autogen.sh
+	
+

+

+

+ (3) You can now build HarfBuzz (on either + a MacPorts or a Homebrew system) by running: +

+
+	  ./configure
+	
+

+ followed by: +

+
+	  make
+	
+

+

+

+ This should leave you with a shared + library in the src/ directory, and a few + utility programs including hb-view and + hb-shape under the util/ + directory. +

+
+
+

+Configuration options

+

+ The instructions in the "Building HarfBuzz" section will build + the source code under its default configuration. If needed, + the following additional configuration options are available. +

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

--with-libstdc++

+

+ Allow linking with libstdc++. (Default = no) +

+

+ This option enables or disables linking HarfBuzz to the + system's libstdc++ library. +

+

--with-glib

+

+ Use GLib. (Default = auto) +

+

+ This option enables or disables usage of the GLib + library. The default setting is to check for the + presence of GLib and, if it is found, build with + GLib support. GLib is native to GNU/Linux systems but is + available on other operating system as well. +

+

--with-gobject

+

+ Use GObject. (Default = no) +

+

+ This option enables or disables usage of the GObject + library. The default setting is to check for the + presence of GObject and, if it is found, build with + GObject support. GObject is native to GNU/Linux systems but is + available on other operating system as well. +

+

--with-cairo

+

+ Use Cairo. (Default = auto) +

+

+ This option enables or disables usage of the Cairo + graphics-rendering library. The default setting is to + check for the presence of Cairo and, if it is found, + build with Cairo support. +

+

+ Note: Cairo is used only by the HarfBuzz + command-line utilities, and not by the HarfBuzz library. +

+

--with-fontconfig

+

+ Use Fontconfig. (Default = auto) +

+

+ This option enables or disables usage of the Fontconfig + library, which provides font-matching functions and + provides access to font properties. The default setting + is to check for the presence of Fontconfig and, if it is + found, build with Fontconfig support. +

+

+ Note: Fontconfig is used only by the HarfBuzz + command-line utilities, and not by the HarfBuzz library. +

+

--with-icu

+

+ Use the ICU library. (Default = auto) +

+

+ This option enables or disables usage of the + International Components for + Unicode (ICU) library, which provides access + to Unicode Character Database (UCD) properties as well + as normalization and conversion functions. The default + setting is to check for the presence of ICU and, if it + is found, build with ICU support. +

+

--with-ucdn

+

+ Use HarfBuzz's built-in UCDN library. (Default = auto) +

+

+ The HarfBuzz source tree includes a Unicode + Database and Normalization (UCDN) library + that provides access to basic character properties in + the Unicode Character Database (UCD) as well as low-level + normalization functions. HarfBuzz can be built without + this UCDN support if the usage of a different UCDN + library is desired. +

+

--with-graphite2

+

+ Use the Graphite2 library. (Default = no) +

+

+ This option enables or disables usage of the Graphite2 + library, which provides support for the Graphite shaping + model. +

+

--with-freetype

+

+ Use the FreeType library. (Default = auto) +

+

+ This option enables or disables usage of the FreeType + font-rendering library. The default setting is to check for the + presence of FreeType and, if it is found, build with + FreeType support. +

+

--with-uniscribe

+

+ Use the Uniscribe + library (experimental). (Default = no) +

+

+ This option enables or disables usage of the Uniscribe + font-rendering library. Uniscribe is available on + Windows systems. Uniscribe support is used only for + testing purposes and does not need to be enabled for + HarfBuzz to run on Windows systems. +

+

--with-directwrite

+

+ Use the DirectWrite library (experimental). (Default = no) +

+

+ This option enables or disables usage of the DirectWrite + font-rendering library. DirectWrite is available on + Windows systems. DirectWrite support is used only for + testing purposes and does not need to be enabled for + HarfBuzz to run on Windows systems. +

+

--with-coretext

+

+ Use the CoreText library. (Default = no) +

+

+ This option enables or disables usage of the CoreText + library. CoreText is available on macOS and iOS systems. +

+
+
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/ch01s03.html b/docs/html/ch01s03.html new file mode 100644 index 0000000..afce4d1 --- /dev/null +++ b/docs/html/ch01s03.html @@ -0,0 +1,108 @@ + + + + +What does HarfBuzz do?: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+What does HarfBuzz do?

+

+ HarfBuzz provides text shaping through a cross-platform + C API that accepts sequences of Unicode codepoints as input. Currently, + the following OpenType shaping models are supported: +

+
    +
  • + Indic (covering Devanagari, Bengali, Gujarati, + Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu, and + Sinhala) +

  • +
  • + Arabic (covering Arabic, N'Ko, Syriac, and Mongolian) +

  • +
  • + Thai and Lao +

  • +
  • + Khmer +

  • +
  • + Myanmar +

  • +
  • + Tibetan +

  • +
  • + Hangul +

  • +
  • + Hebrew +

  • +
  • + The Universal Shaping Engine or USE + (covering complex scripts not covered by the above shaping + models) +

  • +
  • + A default shaping model for non-complex scripts + (covering Latin, Cyrillic, Greek, Armenian, Georgian, Tifinagh, + and many others) +

  • +
  • + Emoji (including emoji modifier sequences, flag sequences, + and ZWJ sequences) +

  • +
+

+ In addition to OpenType shaping, HarfBuzz supports the latest + version of Graphite shaping (the "Graphite 2" model) and AAT + shaping. +

+

+ HarfBuzz can read and understand TrueType fonts (.ttf), TrueType + collections (.ttc), and OpenType fonts (.otf, including those + fonts that contain TrueType-style outlines and those that + contain PostScript CFF or CFF2 outlines). +

+

+ HarfBuzz is designed and tested to run on top of the FreeType + font renderer. It can run on Linux, Android, Windows, macOS, and + iOS systems. +

+

+ In addition to its core shaping functionality, HarfBuzz provides + functions for accessing other font features, including optional + GSUB and GPOS OpenType features, as well as + all color-font formats (CBDT, + sbix, COLR/CPAL, and + SVG-OT) and OpenType variable fonts. HarfBuzz + also includes a font-subsetting feature. HarfBuzz can perform + some low-level math-shaping operations, although it does not + currently perform full shaping for mathematical typesetting. +

+

+ A suite of command-line utilities is also provided in the + source-code tree, designed to help users test and debug + HarfBuzz's features on real-world fonts and input. +

+
+ + + \ No newline at end of file diff --git a/docs/html/ch03s02.html b/docs/html/ch03s02.html new file mode 100644 index 0000000..e3f5af9 --- /dev/null +++ b/docs/html/ch03s02.html @@ -0,0 +1,150 @@ + + + + +Terminology: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Terminology

+

+ +

+
++++ + + + + + + + + + + + + + + + + + + + + + + +

script

+

+ In text shaping, a script is a + writing system: a set of symbols, rules, and conventions + that is used to represent a language or multiple + languages. +

+

+ In general computing lingo, the word "script" can also + be used to mean an executable program (usually one + written in a human-readable programming language). For + the sake of clarity, HarfBuzz documents will always use + more specific terminology when referring to this + meaning, such as "Python script" or "shell script." In + all other instances, "script" refers to a writing system. +

+

+ For developers using HarfBuzz, it is important to note + the distinction between a script and a language. Most + scripts are used to write a variety of different + languages, and many languages may be written in more + than one script. +

+

shaper

+ In HarfBuzz, a shaper is a + handler for a specific script-shaping model. HarfBuzz + implements separate shapers for Indic, Arabic, Thai and + Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew, the + Universal Shaping Engine (USE), and a default shaper for + non-complex scripts. +

cluster

+

+ In text shaping, a cluster is a + sequence of codepoints that must be treated as an + indivisible unit. Clusters can include code-point + sequences that form a ligature or base-and-mark + sequences. Tracking and preserving clusters is important + when shaping operations might separate or reorder + code points. +

+

+ HarfBuzz provides three cluster + levels that implement different + approaches to the problem of preserving clusters during + shaping operations. +

+

grapheme

+

+ In linguistics, a grapheme is one + of the indivisible units that make up a writing system or + script. Often, graphemes are individual symbols (letters, + numbers, punctuation marks, logograms, etc.) but, + depending on the writing system, a particular grapheme + might correspond to a sequence of several Unicode code + points. +

+

+ In practice, HarfBuzz and other text-shaping engines + are not generally concerned with graphemes. However, it + is important for developers using HarfBuzz to recognize + that there is a difference between graphemes and shaping + clusters (see above). The two concepts may overlap + frequently, but there is no guarantee that they will be + identical. +

+

syllable

+

+ In linguistics, a syllable is an + a sequence of sounds that makes up a building block of a + particular language. Every language has its own set of + rules describing what constitutes a valid syllable. +

+

+ For text-shaping purposes, the various definitions of + "syllable" are important because script-specific shaping + operations may be applied at the syllable level. For + example, a reordering rule might specify that a vowel + mark be reordered to the beginning of the syllable. +

+

+ Syllables will consist of one or more Unicode code + points. The definition of a syllable for a particular + writing system might correspond to how HarfBuzz + identifies clusters (see above) for the same writing + system. However, it is important for developers using + HarfBuzz to recognize that there is a difference between + syllables and shaping clusters. The two concepts may + overlap frequently, but there is no guarantee that they + will be identical. +

+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch03s03.html b/docs/html/ch03s03.html new file mode 100644 index 0000000..1905b84 --- /dev/null +++ b/docs/html/ch03s03.html @@ -0,0 +1,99 @@ + + + + +A simple shaping example: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+A simple shaping example

+

+ Below is the simplest HarfBuzz shaping example possible. +

+
  1. + Create a buffer and put your text in it. +

+
+      #include <hb.h>
+      hb_buffer_t *buf;
+      buf = hb_buffer_create();
+      hb_buffer_add_utf8(buf, text, -1, 0, -1);
+    
+
  1. + Guess the script, language and direction of the buffer. +

+
+      hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
+      hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
+      hb_buffer_set_language(buf, hb_language_from_string("en", -1));
+    
+
  1. + Create a face and a font, using FreeType for now. +

+
+      #include <hb-ft.h>
+      FT_New_Face(ft_library, font_path, index, &face);
+      FT_Set_Char_Size(face, 0, 1000, 0, 0);
+      hb_font_t *font = hb_ft_font_create(face);
+    
+
  1. + Shape! +

+
+      hb_shape(font, buf, NULL, 0);
+    
+
  1. + Get the glyph and position information. +

+
+      hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &glyph_count);
+      hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count);
+    
+
  1. + Iterate over each glyph. +

+
+      for (i = 0; i < glyph_count; ++i) {
+      glyphid = glyph_info[i].codepoint;
+      x_offset = glyph_pos[i].x_offset / 64.0;
+      y_offset = glyph_pos[i].y_offset / 64.0;
+      x_advance = glyph_pos[i].x_advance / 64.0;
+      y_advance = glyph_pos[i].y_advance / 64.0;
+      draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset);
+      cursor_x += x_advance;
+      cursor_y += y_advance;
+      }
+    
+
  1. + Tidy up. +

+
+      hb_buffer_destroy(buf);
+      hb_font_destroy(hb_ft_font);
+    
+

+ This example shows enough to get us started using HarfBuzz. In + the sections that follow, we will use the remainder of + HarfBuzz's API to refine and extend the example and improve its + text-shaping capabilities. +

+
+ + + \ No newline at end of file diff --git a/docs/html/ch08.html b/docs/html/ch08.html deleted file mode 100644 index 2de5896..0000000 --- a/docs/html/ch08.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - -HarfBuzz API: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-

-HarfBuzz API

-
-
-hb -
-
-hb-common -
-
-hb-unicode -
-
-Buffers — Input and output buffers -
-
-hb-blob -
-
-hb-face -
-
-hb-font -
-
-Shaping — Conversion of text strings into positioned glyphs -
-
-hb-version -
-
-hb-deprecated -
-
-hb-set -
-
-hb-ot -
-
-hb-ot-layout -
-
-hb-ot-tag -
-
-hb-ot-font -
-
-hb-ot-shape -
-
-hb-ot-math -
-
-hb-shape-plan -
-
-hb-glib -
-
-hb-icu -
-
-hb-ft -
-
-hb-graphite2 -
-
-hb-uniscribe -
-
-hb-coretext -
-
-hb-gobject -
-
-
- - - \ No newline at end of file diff --git a/docs/html/ch09.html b/docs/html/ch09.html new file mode 100644 index 0000000..1c709c4 --- /dev/null +++ b/docs/html/ch09.html @@ -0,0 +1,67 @@ + + + + +Core API: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Core API

+
+
+hb-blob — Binary data containers +
+
+hb-buffer — Input and output buffers +
+
+hb-common — Common data types +
+
+hb-deprecated — Deprecated API +
+
+hb-face — Font face objects +
+
+hb-font — Font objects +
+
+hb-map — Object representing integer to integer mapping +
+
+hb-set — Object representing a set of integers +
+
+hb-shape-plan — Object representing a shaping plan +
+
+hb-shape — Conversion of text strings into positioned glyphs +
+
+hb-unicode — Unicode character property access +
+
+hb-version — Information about the version of HarfBuzz in use +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch10.html b/docs/html/ch10.html new file mode 100644 index 0000000..a80ab8c --- /dev/null +++ b/docs/html/ch10.html @@ -0,0 +1,52 @@ + + + + +OpenType API: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+OpenType API

+
+
+hb-ot-color — OpenType Color Fonts +
+
+hb-ot-font — OpenType font implementation +
+
+hb-ot-layout — OpenType Layout +
+
+hb-ot-math — OpenType Math information +
+
+hb-ot-name — OpenType font name information +
+
+hb-ot-shape — OpenType shaping support +
+
+hb-ot-var — OpenType Font Variations +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/ch11.html b/docs/html/ch11.html new file mode 100644 index 0000000..3c9039c --- /dev/null +++ b/docs/html/ch11.html @@ -0,0 +1,32 @@ + + + + +Apple Advanced Typography API: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Apple Advanced Typography API

+
+hb-aat-layout — Apple Advanced Typography Layout +
+
+ + + \ No newline at end of file diff --git a/docs/html/ch12.html b/docs/html/ch12.html new file mode 100644 index 0000000..0c63823 --- /dev/null +++ b/docs/html/ch12.html @@ -0,0 +1,52 @@ + + + + +Integration API: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Integration API

+
+
+hb-coretext — CoreText integration +
+
+hb-ft — FreeType integration +
+
+hb-glib — GLib integration +
+
+hb-gobject — GObject integration +
+
+hb-graphite2 — Graphite2 integration +
+
+hb-icu — ICU integration +
+
+hb-uniscribe — Windows integration +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/clusters.html b/docs/html/clusters.html index 2b3078f..9162099 100644 --- a/docs/html/clusters.html +++ b/docs/html/clusters.html @@ -2,13 +2,13 @@ -: HarfBuzz Manual +Clusters: HarfBuzz Manual - - + + @@ -17,81 +17,109 @@ Home Up Prev -Next +Next

- In shaping text, a cluster is a sequence of - code points that needs to be treated as a single, indivisible unit. -

+ In text shaping, a cluster is a sequence of + characters that needs to be treated as a single, indivisible + unit. A single letter or symbol can be a cluster of its + own. Other clusters correspond to longer subsequences of the + input code points — such as a ligature or conjunct form + — and require the shaper to ensure that the cluster is not + broken during the shaping process. +

- When you add text to a HB buffer, each character is associated with - a cluster value. This is an arbitrary number as - far as HB is concerned. -

+ A cluster is distinct from a grapheme, + which is the smallest unit of meaning in a writing system or + script. +

- Most clients will use UTF-8, UTF-16, or UTF-32 indices, but the - actual number does not matter. Moreover, it is not required for the - cluster values to be monotonically increasing, but pretty much all - of HB's tests are performed on monotonically increasing cluster - numbers. Nevertheless, there is no such assumption in the code - itself. With that in mind, let's examine what happens with cluster - values during shaping under each cluster-level. -

+ The definitions of the two terms are similar. However, clusters + are only relevant for script shaping and glyph layout. In + contrast, graphemes are a property of the underlying script, and + are of interest when client programs implement orthographic + or linguistic functionality. +

- HarfBuzz provides three levels of clustering - support. Level 0 is the default behavior and reproduces the behavior - of the old HarfBuzz library. Level 1 tweaks this behavior slightly - to produce better results, so level 1 clustering is recommended for - code that is not required to implement backward compatibility with - the old HarfBuzz. -

+ For example, two individual letters are often two separate + graphemes. When two letters form a ligature, however, they + combine into a single glyph. They are then part of the same + cluster and are treated as a unit by the shaping engine — + even though the two original, underlying letters remain separate + graphemes. +

- Level 2 differs significantly in how it treats cluster values. - Levels 0 and 1 both process ligatures and glyph decomposition by - merging clusters; level 2 does not. -

+ HarfBuzz is concerned with clusters, not + with graphemes — although client programs using HarfBuzz + may still care about graphemes for other reasons from time to time. +

- The conceptual model for what the cluster values mean, in levels 0 - and 1, is this: -

-
    + During the shaping process, there are several shaping operations + that may merge adjacent characters (for example, when two code + points form a ligature or a conjunct form and are replaced by a + single glyph) or split one character into several (for example, + when decomposing a code point through the + ccmp feature). Operations like these alter + clusters; HarfBuzz tracks the changes to ensure that no clusters + get lost or broken during shaping. +

    +

    + HarfBuzz records cluster information independently from how + shaping operations affect the individual glyphs returned in an + output buffer. Consequently, a client program using HarfBuzz can + utilize the cluster information to implement features such as: +

    +
      +
    • + Correctly positioning the cursor within a shaped text run, + even when characters have formed ligatures, composed or + decomposed, reordered, or undergone other shaping operations. +

    • - the sequence of cluster values will always remain monotone -

    • + Correctly highlighting a text selection that includes some, + but not all, of the characters in a word. +

    • - each value represents a single cluster -

    • + Applying text attributes (such as color or underlining) to + part, but not all, of a word. +

    • - each cluster contains one or more glyphs and one or more - characters -

    • + Generating output document formats (such as PDF) with + embedded text that can be fully extracted. +

      +
    • + Determining the mapping between input characters and output + glyphs, such as which glyphs are ligatures. +

    • +
    • + Performing line-breaking, justification, and other + line-level or paragraph-level operations that must be done + after shaping is complete, but which require examining + character-level properties. +

    -

    - Assuming that initial cluster numbers were monotonically increasing - and distinct, then all adjacent glyphs having the same cluster - number belong to the same cluster, and all characters belong to the - cluster that has the highest number not larger than their initial - cluster number. This will become clearer with an example. -

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/complex-scripts.html b/docs/html/complex-scripts.html new file mode 100644 index 0000000..4ee994b --- /dev/null +++ b/docs/html/complex-scripts.html @@ -0,0 +1,57 @@ + + + + +Complex scripts: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Complex scripts

+

+ In text-shaping terminology, scripts are generally classified as + either complex or non-complex. +

+

+ Complex scripts are those for which transforming the input + sequence into the final layout requires some combination of + operations—such as context-dependent substitutions, + context-dependent mark positioning, glyph-to-glyph joining, + glyph reordering, or glyph stacking. +

+

+ In some complex scripts, the shaping rules require that a text + run be divided into syllables before the operations can be + applied. Other complex scripts may apply shaping operations over + entire words or over the entire text run, with no subdivision + required. +

+

+ Non-complex scripts, by definition, do not require these + operations. However, correctly shaping a text run in a + non-complex script may still involve Unicode normalization, + ligature substitutions, mark positioning, kerning, and applying + other font features. The key difference is that a text run in a + non-complex script can be processed sequentially and in the same + order as the input sequence of Unicode codepoints, without + requiring an analysis stage. +

+
+ + + \ No newline at end of file diff --git a/docs/html/customizing-unicode-functions.html b/docs/html/customizing-unicode-functions.html index 2167383..090b871 100644 --- a/docs/html/customizing-unicode-functions.html +++ b/docs/html/customizing-unicode-functions.html @@ -8,7 +8,7 @@ - + @@ -26,6 +26,6 @@

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/deprecated-api-index.html b/docs/html/deprecated-api-index.html index fb043a8..5162862 100644 --- a/docs/html/deprecated-api-index.html +++ b/docs/html/deprecated-api-index.html @@ -6,9 +6,9 @@ - - - + + + @@ -17,13 +17,15 @@  |  F  |  - G + O  |  - S + S +  |  + U Home Up -Prev -Next +Prev +Next

@@ -39,16 +41,44 @@

F

-hb_font_funcs_set_glyph_func, function in hb-deprecated +hb_font_funcs_set_glyph_h_kerning_func, function in hb-deprecated +
+
+
+hb_font_funcs_set_glyph_v_kerning_func, function in hb-deprecated
hb_font_get_glyph_func_t, user_function in hb-deprecated
-

G

-hb_graphite2_font_get_gr_font, function in hb-graphite2 +hb_font_get_glyph_h_kerning, function in hb-deprecated +
+
+
+hb_font_get_glyph_h_kerning_func_t, typedef in hb-deprecated +
+
+
+hb_font_get_glyph_kerning_for_direction, function in hb-deprecated +
+
+
+hb_font_get_glyph_kerning_func_t, user_function in hb-deprecated +
+
+
+hb_font_get_glyph_v_kerning, function in hb-deprecated +
+
+
+hb_font_get_glyph_v_kerning_func_t, typedef in hb-deprecated +
+
+

O

+
+HB_OT_VAR_NO_AXIS_INDEX, macro in hb-deprecated

S

@@ -56,12 +86,13 @@ HB_SCRIPT_CANADIAN_ABORIGINAL, macro in hb-deprecated
+

U

-hb_set_invert, function in hb-deprecated +HB_UNICODE_MAX_DECOMPOSITION_LEN, macro in hb-deprecated
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/fonts-and-faces.html b/docs/html/fonts-and-faces.html index a7abf0e..87dd7a6 100644 --- a/docs/html/fonts-and-faces.html +++ b/docs/html/fonts-and-faces.html @@ -8,7 +8,7 @@ - + @@ -35,6 +35,6 @@
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/getting-started.html b/docs/html/getting-started.html new file mode 100644 index 0000000..3372136 --- /dev/null +++ b/docs/html/getting-started.html @@ -0,0 +1,96 @@ + + + + +Getting started with HarfBuzz: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Getting started with HarfBuzz

+ +
+

+An overview of the HarfBuzz shaping API

+

+ The core of the HarfBuzz shaping API is the function + hb_shape(). This function takes a font, a + buffer containing a string of Unicode codepoints and + (optionally) a list of font features as its input. It replaces + the codepoints in the buffer with the corresponding glyphs from + the font, correctly ordered and positioned, and with any of the + optional font features applied. +

+

+ In addition to holding the pre-shaping input (the Unicode + codepoints that comprise the input string) and the post-shaping + output (the glyphs and positions), a HarfBuzz buffer has several + properties that affect shaping. The most important are the + text-flow direction (e.g., left-to-right, right-to-left, + top-to-bottom, or bottom-to-top), the script tag, and the + language tag. +

+

+ For input string buffers, flags are available to denote when the + buffer represents the beginning or end of a paragraph, to + indicate whether or not to visibly render Unicode Default + Ignorable codepoints, and to modify the cluster-merging + behavior for the buffer. For shaped output buffers, the + individual X and Y offsets and advances + (the logical dimensions) of each glyph are + accessible. HarfBuzz also flags glyphs as + UNSAFE_TO_BREAK if breaking the string at + that glyph (e.g., in a line-breaking or hyphenation process) + would require re-shaping the text. +

+

+ HarfBuzz also provides methods to compare the contents of + buffers, join buffers, normalize buffer contents, and handle + invalid codepoints, as well as to determine the state of a + buffer (e.g., input codepoints or output glyphs). Buffer + lifecycles are managed and all buffers are reference-counted. +

+

+ Although the default hb_shape() function is + sufficient for most use cases, a variant is also provide that + lets you specify which of HarfBuzz's shapers to use on a buffer. +

+

+ HarfBuzz can read TrueType fonts, TrueType collections, OpenType + fonts, and OpenType collections. Functions are provided to query + font objects about metrics, Unicode coverage, available tables and + features, and variation selectors. Individual glyphs can also be + queried for metrics, variations, and glyph names. OpenType + variable fonts are supported, and HarfBuzz allows you to set + variation-axis coordinates on font objects. +

+

+ HarfBuzz provides glue code to integrate with various other + libraries, including FreeType, GObject, and CoreText. Support + for integrating with Uniscribe and DirectWrite is experimental + at present. +

+
+
+ + + \ No newline at end of file diff --git a/docs/html/graphite-shaping.html b/docs/html/graphite-shaping.html new file mode 100644 index 0000000..5285e3f --- /dev/null +++ b/docs/html/graphite-shaping.html @@ -0,0 +1,45 @@ + + + + +Graphite shaping: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Graphite shaping

+

+ In contrast to OpenType shaping, Graphite shaping does not + specify a predefined set of shaping models or a set of supported + scripts. +

+

+ Instead, each Graphite font contains a complete set of rules that + implement the required shaping model for the intended + script. These rules include finite-state machines to match + sequences of codepoints to the shaping operations to perform. +

+

+ Graphite shaping can perform the same shaping operations used in + OpenType shaping, as well as other functions that have not been + defined for OpenType shaping. +

+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-Buffers.html b/docs/html/harfbuzz-Buffers.html deleted file mode 100644 index af4e7a3..0000000 --- a/docs/html/harfbuzz-Buffers.html +++ /dev/null @@ -1,2974 +0,0 @@ - - - - -Buffers: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-
-
- - -
-

Buffers

-

Buffers — Input and output buffers

-
-
-

Functions

-
---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-hb_buffer_t * - -hb_buffer_create () -
-hb_buffer_t * - -hb_buffer_reference () -
-hb_buffer_t * - -hb_buffer_get_empty () -
-void - -hb_buffer_destroy () -
-void - -hb_buffer_reset () -
-void - -hb_buffer_clear_contents () -
-hb_bool_t - -hb_buffer_pre_allocate () -
-hb_bool_t - -hb_buffer_allocation_successful () -
-void - -hb_buffer_add () -
-void - -hb_buffer_add_codepoints () -
-void - -hb_buffer_add_utf32 () -
-void - -hb_buffer_add_utf16 () -
-void - -hb_buffer_add_utf8 () -
-void - -hb_buffer_add_latin1 () -
-void - -hb_buffer_append () -
-void - -hb_buffer_set_content_type () -
-hb_buffer_content_type_t - -hb_buffer_get_content_type () -
-void - -hb_buffer_set_direction () -
-hb_direction_t - -hb_buffer_get_direction () -
-void - -hb_buffer_set_script () -
-hb_script_t - -hb_buffer_get_script () -
-void - -hb_buffer_set_language () -
-hb_language_t - -hb_buffer_get_language () -
-void - -hb_buffer_set_flags () -
-hb_buffer_flags_t - -hb_buffer_get_flags () -
-void - -hb_buffer_set_cluster_level () -
-hb_buffer_cluster_level_t - -hb_buffer_get_cluster_level () -
-hb_bool_t - -hb_buffer_set_length () -
unsigned int - -hb_buffer_get_length () -
-void - -hb_buffer_set_segment_properties () -
-void - -hb_buffer_get_segment_properties () -
-void - -hb_buffer_guess_segment_properties () -
-void - -hb_buffer_set_unicode_funcs () -
-hb_unicode_funcs_t * - -hb_buffer_get_unicode_funcs () -
-hb_bool_t - -hb_buffer_set_user_data () -
-void * - -hb_buffer_get_user_data () -
-hb_glyph_info_t * - -hb_buffer_get_glyph_infos () -
-hb_glyph_position_t * - -hb_buffer_get_glyph_positions () -
-void - -hb_buffer_set_replacement_codepoint () -
-hb_codepoint_t - -hb_buffer_get_replacement_codepoint () -
-void - -hb_buffer_normalize_glyphs () -
-void - -hb_buffer_reverse () -
-void - -hb_buffer_reverse_range () -
-void - -hb_buffer_reverse_clusters () -
unsigned int - -hb_buffer_serialize_glyphs () -
-hb_bool_t - -hb_buffer_deserialize_glyphs () -
-hb_buffer_serialize_format_t - -hb_buffer_serialize_format_from_string () -
const char * - -hb_buffer_serialize_format_to_string () -
const char ** - -hb_buffer_serialize_list_formats () -
-hb_bool_t - -hb_segment_properties_equal () -
unsigned int - -hb_segment_properties_hash () -
-hb_buffer_diff_flags_t - -hb_buffer_diff () -
-void - -hb_buffer_set_message_func () -
-hb_glyph_flags_t - -hb_glyph_info_get_glyph_flags () -
-hb_bool_t - -(*hb_buffer_message_func_t) () -
-
-
-

Types and Values

- -
-
-

Object Hierarchy

-
    GBoxed
-    ├── hb_buffer_t
-    ├── hb_glyph_info_t
-    ├── hb_glyph_position_t
-    ╰── hb_segment_properties_t
-    GEnum
-    ├── hb_buffer_cluster_level_t
-    ├── hb_buffer_content_type_t
-    ╰── hb_buffer_serialize_format_t
-    GFlags
-    ├── hb_buffer_diff_flags_t
-    ├── hb_buffer_flags_t
-    ├── hb_buffer_serialize_flags_t
-    ╰── hb_glyph_flags_t
-
-
-
-

Includes

-
#include <hb.h>
-
-
-
-

Description

-

Buffers serve dual role in HarfBuzz; they hold the input characters that are -passed hb_shape(), and after shaping they hold the output glyphs.

-
-
-

Functions

-
-

hb_buffer_create ()

-
hb_buffer_t *
-hb_buffer_create (void);
-

Creates a new hb_buffer_t with all properties to defaults.

-

[Xconstructor]

-
-

Returns

-

A newly allocated hb_buffer_t with a reference count of 1. The initial -reference count should be released with hb_buffer_destroy() when you are done -using the hb_buffer_t. This function never returns NULL. If memory cannot -be allocated, a special hb_buffer_t object will be returned on which -hb_buffer_allocation_successful() returns false.

-

[transfer full]

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_reference ()

-
hb_buffer_t *
-hb_buffer_reference (hb_buffer_t *buffer);
-

Increases the reference count on buffer - by one. This prevents buffer - from -being destroyed until a matching call to hb_buffer_destroy() is made.

-

[skip]

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The referenced hb_buffer_t.

-

[transfer full]

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_empty ()

-
hb_buffer_t *
-hb_buffer_get_empty (void);
-
-

Returns

-

.

-

[transfer full]

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_destroy ()

-
void
-hb_buffer_destroy (hb_buffer_t *buffer);
-

Deallocate the buffer -. -Decreases the reference count on buffer - by one. If the result is zero, then -buffer - and all associated resources are freed. See hb_buffer_reference().

-

[skip]

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_reset ()

-
void
-hb_buffer_reset (hb_buffer_t *buffer);
-

Resets the buffer to its initial status, as if it was just newly created -with hb_buffer_create().

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_clear_contents ()

-
void
-hb_buffer_clear_contents (hb_buffer_t *buffer);
-

Similar to hb_buffer_reset(), but does not clear the Unicode functions and -the replacement code point.

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.11

-
-
-
-

hb_buffer_pre_allocate ()

-
hb_bool_t
-hb_buffer_pre_allocate (hb_buffer_t *buffer,
-                        unsigned int size);
-

Pre allocates memory for buffer - to fit at least size - number of items.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

size

number of items to pre allocate.

 
-
-
-

Returns

-

true if buffer -memory allocation succeeded, false otherwise.

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_allocation_successful ()

-
hb_bool_t
-hb_buffer_allocation_successful (hb_buffer_t *buffer);
-

Check if allocating memory for the buffer succeeded.

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

true if buffer -memory allocation succeeded, false otherwise.

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_add ()

-
void
-hb_buffer_add (hb_buffer_t *buffer,
-               hb_codepoint_t codepoint,
-               unsigned int cluster);
-

Appends a character with the Unicode value of codepoint - to buffer -, and -gives it the initial cluster value of cluster -. Clusters can be any thing -the client wants, they are usually used to refer to the index of the -character in the input text stream and are output in -hb_glyph_info_t.cluster field.

-

This function does not check the validity of codepoint -, it is up to the -caller to ensure it is a valid Unicode code point.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

codepoint

a Unicode code point.

 

cluster

the cluster value of codepoint -.

 
-
-

Since: 0.9.7

-
-
-
-

hb_buffer_add_codepoints ()

-
void
-hb_buffer_add_codepoints (hb_buffer_t *buffer,
-                          const hb_codepoint_t *text,
-                          int text_length,
-                          unsigned int item_offset,
-                          int item_length);
-

Appends characters from text - array to buffer -. The item_offset - is the -position of the first character from text - that will be appended, and -item_length - is the number of character. When shaping part of a larger text -(e.g. a run of text from a paragraph), instead of passing just the substring -corresponding to the run, it is preferable to pass the whole -paragraph and specify the run start and length as item_offset - and -item_length -, respectively, to give HarfBuzz the full context to be able, -for example, to do cross-run Arabic shaping or properly handle combining -marks at stat of run.

-

This function does not check the validity of text -, it is up to the caller -to ensure it contains a valid Unicode code points.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

buffer

a hb_buffer_t to append characters to.

 

text

an array of Unicode code points to append.

[array length=text_length]

text_length

the length of the text -, or -1 if it is NULL terminated.

 

item_offset

the offset of the first code point to add to the buffer -.

 

item_length

the number of code points to add to the buffer -, or -1 for the -end of text -(assuming it is NULL terminated).

 
-
-

Since: 0.9.31

-
-
-
-

hb_buffer_add_utf32 ()

-
void
-hb_buffer_add_utf32 (hb_buffer_t *buffer,
-                     const uint32_t *text,
-                     int text_length,
-                     unsigned int item_offset,
-                     int item_length);
-

See hb_buffer_add_codepoints().

-

Replaces invalid UTF-32 characters with the buffer - replacement code point, -see hb_buffer_set_replacement_codepoint().

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

text

an array of UTF-32 characters to append.

[array length=text_length]

text_length

the length of the text -, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer -.

 

item_length

the number of characters to add to the buffer -, or -1 for the -end of text -(assuming it is NULL terminated).

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_add_utf16 ()

-
void
-hb_buffer_add_utf16 (hb_buffer_t *buffer,
-                     const uint16_t *text,
-                     int text_length,
-                     unsigned int item_offset,
-                     int item_length);
-

See hb_buffer_add_codepoints().

-

Replaces invalid UTF-16 characters with the buffer - replacement code point, -see hb_buffer_set_replacement_codepoint().

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

text

an array of UTF-16 characters to append.

[array length=text_length]

text_length

the length of the text -, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer -.

 

item_length

the number of characters to add to the buffer -, or -1 for the -end of text -(assuming it is NULL terminated).

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_add_utf8 ()

-
void
-hb_buffer_add_utf8 (hb_buffer_t *buffer,
-                    const char *text,
-                    int text_length,
-                    unsigned int item_offset,
-                    int item_length);
-

See hb_buffer_add_codepoints().

-

Replaces invalid UTF-8 characters with the buffer - replacement code point, -see hb_buffer_set_replacement_codepoint().

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

text

an array of UTF-8 -characters to append.

[array length=text_length][element-type uint8_t]

text_length

the length of the text -, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer -.

 

item_length

the number of characters to add to the buffer -, or -1 for the -end of text -(assuming it is NULL terminated).

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_add_latin1 ()

-
void
-hb_buffer_add_latin1 (hb_buffer_t *buffer,
-                      const uint8_t *text,
-                      int text_length,
-                      unsigned int item_offset,
-                      int item_length);
-

Similar to hb_buffer_add_codepoints(), but allows only access to first 256 -Unicode code points that can fit in 8-bit strings.

-
Has nothing to do with non-Unicode Latin-1 encoding.
-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

text

an array of UTF-8 -characters to append.

[array length=text_length][element-type uint8_t]

text_length

the length of the text -, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer -.

 

item_length

the number of characters to add to the buffer -, or -1 for the -end of text -(assuming it is NULL terminated).

 
-
-

Since: 0.9.39

-
-
-
-

hb_buffer_append ()

-
void
-hb_buffer_append (hb_buffer_t *buffer,
-                  hb_buffer_t *source,
-                  unsigned int start,
-                  unsigned int end);
-

Append (part of) contents of another buffer to this buffer.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

source

source hb_buffer_t.

 

start

start index into source buffer to copy. Use 0 to copy from start of buffer.

 

end

end index into source buffer to copy. Use (unsigned int) -1 to copy to end of buffer.

 
-
-

Since: 1.5.0

-
-
-
-

hb_buffer_set_content_type ()

-
void
-hb_buffer_set_content_type (hb_buffer_t *buffer,
-                            hb_buffer_content_type_t content_type);
-

Sets the type of buffer - contents, buffers are either empty, contain -characters (before shaping) or glyphs (the result of shaping).

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

content_type

the type of buffer contents to set

 
-
-

Since: 0.9.5

-
-
-
-

hb_buffer_get_content_type ()

-
hb_buffer_content_type_t
-hb_buffer_get_content_type (hb_buffer_t *buffer);
-

see hb_buffer_set_content_type().

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The type of buffer -contents.

-
-

Since: 0.9.5

-
-
-
-

hb_buffer_set_direction ()

-
void
-hb_buffer_set_direction (hb_buffer_t *buffer,
-                         hb_direction_t direction);
-

Set the text flow direction of the buffer. No shaping can happen without -setting buffer - direction, and it controls the visual direction for the -output glyphs; for RTL direction the glyphs will be reversed. Many layout -features depend on the proper setting of the direction, for example, -reversing RTL text before shaping, then shaping with LTR direction is not -the same as keeping the text in logical order and shaping with RTL -direction.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

direction

the hb_direction_t of the buffer -

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_direction ()

-
hb_direction_t
-hb_buffer_get_direction (hb_buffer_t *buffer);
-

See hb_buffer_set_direction()

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The direction of the buffer -.

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_set_script ()

-
void
-hb_buffer_set_script (hb_buffer_t *buffer,
-                      hb_script_t script);
-

Sets the script of buffer - to script -.

-

Script is crucial for choosing the proper shaping behaviour for scripts that -require it (e.g. Arabic) and the which OpenType features defined in the font -to be applied.

-

You can pass one of the predefined hb_script_t values, or use -hb_script_from_string() or hb_script_from_iso15924_tag() to get the -corresponding script from an ISO 15924 script tag.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

script

an hb_script_t to set.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_script ()

-
hb_script_t
-hb_buffer_get_script (hb_buffer_t *buffer);
-

See hb_buffer_set_script().

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The hb_script_t of the buffer -.

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_set_language ()

-
void
-hb_buffer_set_language (hb_buffer_t *buffer,
-                        hb_language_t language);
-

Sets the language of buffer - to language -.

-

Languages are crucial for selecting which OpenType feature to apply to the -buffer which can result in applying language-specific behaviour. Languages -are orthogonal to the scripts, and though they are related, they are -different concepts and should not be confused with each other.

-

Use hb_language_from_string() to convert from ISO 639 language codes to -hb_language_t.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

language

an hb_language_t to set.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_language ()

-
hb_language_t
-hb_buffer_get_language (hb_buffer_t *buffer);
-

See hb_buffer_set_language().

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The hb_language_t of the buffer. Must not be freed by the caller.

-

[transfer none]

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_set_flags ()

-
void
-hb_buffer_set_flags (hb_buffer_t *buffer,
-                     hb_buffer_flags_t flags);
-

Sets buffer - flags to flags -. See hb_buffer_flags_t.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

flags

the buffer flags to set.

 
-
-

Since: 0.9.7

-
-
-
-

hb_buffer_get_flags ()

-
hb_buffer_flags_t
-hb_buffer_get_flags (hb_buffer_t *buffer);
-

See hb_buffer_set_flags().

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The buffer -flags.

-
-

Since: 0.9.7

-
-
-
-

hb_buffer_set_cluster_level ()

-
void
-hb_buffer_set_cluster_level (hb_buffer_t *buffer,
-                             hb_buffer_cluster_level_t cluster_level);
-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.42

-
-
-
-

hb_buffer_get_cluster_level ()

-
hb_buffer_cluster_level_t
-hb_buffer_get_cluster_level (hb_buffer_t *buffer);
-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.42

-
-
-
-

hb_buffer_set_length ()

-
hb_bool_t
-hb_buffer_set_length (hb_buffer_t *buffer,
-                      unsigned int length);
-

Similar to hb_buffer_pre_allocate(), but clears any new items added at the -end.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

length

the new length of buffer -.

 
-
-
-

Returns

-

true if buffer -memory allocation succeeded, false otherwise.

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_length ()

-
unsigned int
-hb_buffer_get_length (hb_buffer_t *buffer);
-

Returns the number of items in the buffer.

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The buffer -length. -The value valid as long as buffer has not been modified.

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_set_segment_properties ()

-
void
-hb_buffer_set_segment_properties (hb_buffer_t *buffer,
-                                  const hb_segment_properties_t *props);
-

Sets the segment properties of the buffer, a shortcut for calling -hb_buffer_set_direction(), hb_buffer_set_script() and -hb_buffer_set_language() individually.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

props

an hb_segment_properties_t to use.

 
-
-

Since: 0.9.7

-
-
-
-

hb_buffer_get_segment_properties ()

-
void
-hb_buffer_get_segment_properties (hb_buffer_t *buffer,
-                                  hb_segment_properties_t *props);
-

Sets props - to the hb_segment_properties_t of buffer -.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

props

the output hb_segment_properties_t.

[out]
-
-

Since: 0.9.7

-
-
-
-

hb_buffer_guess_segment_properties ()

-
void
-hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
-

Sets unset buffer segment properties based on buffer Unicode -contents. If buffer is not empty, it must have content type -HB_BUFFER_CONTENT_TYPE_UNICODE.

-

If buffer script is not set (ie. is HB_SCRIPT_INVALID), it -will be set to the Unicode script of the first character in -the buffer that has a script other than HB_SCRIPT_COMMON, -HB_SCRIPT_INHERITED, and HB_SCRIPT_UNKNOWN.

-

Next, if buffer direction is not set (ie. is HB_DIRECTION_INVALID), -it will be set to the natural horizontal direction of the -buffer script as returned by hb_script_get_horizontal_direction(). -If hb_script_get_horizontal_direction() returns HB_DIRECTION_INVALID, -then HB_DIRECTION_LTR is used.

-

Finally, if buffer language is not set (ie. is HB_LANGUAGE_INVALID), -it will be set to the process's default language as returned by -hb_language_get_default(). This may change in the future by -taking buffer script into consideration when choosing a language.

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.7

-
-
-
-

hb_buffer_set_unicode_funcs ()

-
void
-hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
-                             hb_unicode_funcs_t *unicode_funcs);
-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_unicode_funcs ()

-
hb_unicode_funcs_t *
-hb_buffer_get_unicode_funcs (hb_buffer_t *buffer);
-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_set_user_data ()

-
hb_bool_t
-hb_buffer_set_user_data (hb_buffer_t *buffer,
-                         hb_user_data_key_t *key,
-                         void *data,
-                         hb_destroy_func_t destroy,
-                         hb_bool_t replace);
-

[skip]

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_user_data ()

-
void *
-hb_buffer_get_user_data (hb_buffer_t *buffer,
-                         hb_user_data_key_t *key);
-

[skip]

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_glyph_infos ()

-
hb_glyph_info_t *
-hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
-                           unsigned int *length);
-

Returns buffer - glyph information array. Returned pointer -is valid as long as buffer - contents are not modified.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

length

output array length.

[out]
-
-
-

Returns

-

The buffer -glyph information array. -The value valid as long as buffer has not been modified.

-

[transfer none][array length=length]

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_get_glyph_positions ()

-
hb_glyph_position_t *
-hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
-                               unsigned int *length);
-

Returns buffer - glyph position array. Returned pointer -is valid as long as buffer - contents are not modified.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

length

output length.

[out]
-
-
-

Returns

-

The buffer -glyph position array. -The value valid as long as buffer has not been modified.

-

[transfer none][array length=length]

-
-

Since: 0.9.2

-
-
-
-

hb_buffer_set_replacement_codepoint ()

-
void
-hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
-                                     hb_codepoint_t replacement);
-

Sets the hb_codepoint_t that replaces invalid entries for a given encoding -when adding text to buffer -.

-

Default is HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.

-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

replacement

the replacement hb_codepoint_t

 
-
-

Since: 0.9.31

-
-
-
-

hb_buffer_get_replacement_codepoint ()

-
hb_codepoint_t
-hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer);
-

See hb_buffer_set_replacement_codepoint().

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-
-

Returns

-

The buffer -replacement hb_codepoint_t.

-
-

Since: 0.9.31

-
-
-
-

hb_buffer_normalize_glyphs ()

-
void
-hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
-

Reorders a glyph buffer to have canonical in-cluster glyph order / position. -The resulting clusters should behave identical to pre-reordering clusters.

-
This has nothing to do with Unicode normalization.
-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_reverse ()

-
void
-hb_buffer_reverse (hb_buffer_t *buffer);
-

Reverses buffer contents.

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_reverse_range ()

-
void
-hb_buffer_reverse_range (hb_buffer_t *buffer,
-                         unsigned int start,
-                         unsigned int end);
-

Reverses buffer contents between start to end.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

start

start index.

 

end

end index.

 
-
-

Since: 0.9.41

-
-
-
-

hb_buffer_reverse_clusters ()

-
void
-hb_buffer_reverse_clusters (hb_buffer_t *buffer);
-

Reverses buffer clusters. That is, the buffer contents are -reversed, then each cluster (consecutive items having the -same cluster number) are reversed again.

-
-

Parameters

-
----- - - - - - -

buffer

an hb_buffer_t.

 
-
-

Since: 0.9.2

-
-
-
-

hb_buffer_serialize_glyphs ()

-
unsigned int
-hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
-                            unsigned int start,
-                            unsigned int end,
-                            char *buf,
-                            unsigned int buf_size,
-                            unsigned int *buf_consumed,
-                            hb_font_t *font,
-                            hb_buffer_serialize_format_t format,
-                            hb_buffer_serialize_flags_t flags);
-

Serializes buffer - into a textual representation of its glyph content, -useful for showing the contents of the buffer, for example during debugging. -There are currently two supported serialization formats:

-
-

text

-

A human-readable, plain text format. -The serialized glyphs will look something like:

-

-[uni0651=0@518,0+0|uni0628=0+1897] -

-
-
-
-

json

-

TODO.

-
-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t buffer.

 

start

the first item in buffer -to serialize.

 

end

the last item in buffer -to serialize.

 

buf

output string to -write serialized buffer into.

[out][array length=buf_size][element-type uint8_t]

buf_size

the size of buf -.

 

buf_consumed

if not NULL, will be set to the number of byes written into buf -.

[out][allow-none]

font

the hb_font_t used to shape this buffer, needed to -read glyph names and extents. If NULL, and empty font will be used.

[allow-none]

format

the hb_buffer_serialize_format_t to use for formatting the output.

 

flags

the hb_buffer_serialize_flags_t that control what glyph properties -to serialize.

 
-
-
-

Returns

-

The number of serialized items.

-
-

Since: 0.9.7

-
-
-
-

hb_buffer_deserialize_glyphs ()

-
hb_bool_t
-hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
-                              const char *buf,
-                              int buf_len,
-                              const char **end_ptr,
-                              hb_font_t *font,
-                              hb_buffer_serialize_format_t format);
-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - -

buffer

an hb_buffer_t buffer.

 

buf

.

[array length=buf_len]

end_ptr

.

[out]
-
-

Since: 0.9.7

-
-
-
-

hb_buffer_serialize_format_from_string ()

-
hb_buffer_serialize_format_t
-hb_buffer_serialize_format_from_string
-                               (const char *str,
-                                int len);
-

Parses a string into an hb_buffer_serialize_format_t. Does not check if -str - is a valid buffer serialization format, use -hb_buffer_serialize_list_formats() to get the list of supported formats.

-
-

Parameters

-
----- - - - - - - - - - - - - -

str

a string to parse.

[array length=len][element-type uint8_t]

len

length of str -, or -1 if string is NULL terminated

 
-
-
-

Returns

-

The parsed hb_buffer_serialize_format_t.

-
-

Since: 0.9.7

-
-
-
-

hb_buffer_serialize_format_to_string ()

-
const char *
-hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
-

Converts format - to the string corresponding it, or NULL if it is not a valid -hb_buffer_serialize_format_t.

-
-

Parameters

-
----- - - - - - -

format

an hb_buffer_serialize_format_t to convert.

 
-
-
-

Returns

-

A NULL terminated string corresponding to format -. Should not be freed.

-

[transfer none]

-
-

Since: 0.9.7

-
-
-
-

hb_buffer_serialize_list_formats ()

-
const char **
-hb_buffer_serialize_list_formats (void);
-

Returns a list of supported buffer serialization formats.

-
-

Returns

-

A string array of buffer serialization formats. Should not be freed.

-

[transfer none]

-
-

Since: 0.9.7

-
-
-
-

hb_segment_properties_equal ()

-
hb_bool_t
-hb_segment_properties_equal (const hb_segment_properties_t *a,
-                             const hb_segment_properties_t *b);
-

Checks the equality of two hb_segment_properties_t's.

-
-

Parameters

-
----- - - - - - - - - - - - - -

a

first hb_segment_properties_t to compare.

 

b

second hb_segment_properties_t to compare.

 
-
-
-

Returns

-

true if all properties of a -equal those of b -, false otherwise.

-
-

Since: 0.9.7

-
-
-
-

hb_segment_properties_hash ()

-
unsigned int
-hb_segment_properties_hash (const hb_segment_properties_t *p);
-

Creates a hash representing p -.

-
-

Parameters

-
----- - - - - - -

p

hb_segment_properties_t to hash.

 
-
-
-

Returns

-

A hash of p -.

-
-

Since: 0.9.7

-
-
-
-

hb_buffer_diff ()

-
hb_buffer_diff_flags_t
-hb_buffer_diff (hb_buffer_t *buffer,
-                hb_buffer_t *reference,
-                hb_codepoint_t dottedcircle_glyph,
-                unsigned int position_fuzz);
-

If dottedcircle_glyph is (hb_codepoint_t) -1 then HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT -and HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned. This should be used by most -callers if just comparing two buffers is needed.

-

Since: 1.5.0

-
-
-
-

hb_buffer_set_message_func ()

-
void
-hb_buffer_set_message_func (hb_buffer_t *buffer,
-                            hb_buffer_message_func_t func,
-                            void *user_data,
-                            hb_destroy_func_t destroy);
-
-

Parameters

-
----- - - - - - - - - - - - - -

buffer

an hb_buffer_t.

 

func

.

[closure user_data][destroy destroy][scope notified]
-
-

Since: 1.1.3

-
-
-
-

hb_glyph_info_get_glyph_flags ()

-
hb_glyph_flags_t
-hb_glyph_info_get_glyph_flags (const hb_glyph_info_t *info);
-

Returns glyph flags encoded within a hb_glyph_info_t.

-
-

Parameters

-
----- - - - - - -

info

a hb_glyph_info_t.

 
-
-
-

Returns

-

The hb_glyph_flags_t encoded within info -.

-
-

Since: 1.5.0

-
-
-
-

hb_buffer_message_func_t ()

-
hb_bool_t
-(*hb_buffer_message_func_t) (hb_buffer_t *buffer,
-                             hb_font_t *font,
-                             const char *message,
-                             void *user_data);
-
-
-
-

Types and Values

-
-

HB_SEGMENT_PROPERTIES_DEFAULT

-
#define             HB_SEGMENT_PROPERTIES_DEFAULT
-
-
-
-

HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT

-
#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
-
-

The default code point for replacing invalid characters in a given encoding. -Set to U+FFFD REPLACEMENT CHARACTER.

-

Since: 0.9.31

-
-
-
-

hb_buffer_t

-
typedef struct hb_buffer_t hb_buffer_t;
-
-

The main structure holding the input text and its properties before shaping, -and output glyphs and their information after shaping.

-
-
-
-

hb_glyph_info_t

-
typedef struct {
-  hb_codepoint_t codepoint;
-  hb_mask_t      mask; /* Holds hb_glyph_flags_t after hb_shape(), plus other things. */
-  uint32_t       cluster;
-} hb_glyph_info_t;
-
-

The hb_glyph_info_t is the structure that holds information about the -glyphs and their relation to input text.

-
-

Members

-
----- - - - - - - - - - - - - - - - - - -

hb_codepoint_t codepoint;

either a Unicode code point (before shaping) or a glyph index -(after shaping).

 

hb_mask_t mask;

  

uint32_t cluster;

the index of the character in the original text that corresponds -to this hb_glyph_info_t, or whatever the client passes to -hb_buffer_add(). More than one hb_glyph_info_t can have the same -cluster -value, if they resulted from the same character (e.g. one -to many glyph substitution), and when more than one character gets -merged in the same glyph (e.g. many to one glyph substitution) the -hb_glyph_info_t will have the smallest cluster value of them. -By default some characters are merged into the same cluster -(e.g. combining marks have the same cluster as their bases) -even if they are separate glyphs, hb_buffer_set_cluster_level() -allow selecting more fine-grained cluster handling.

 
-
-
-
-
-

enum hb_glyph_flags_t

-
-

Members

-
----- - - - - - - - - - - - - -

HB_GLYPH_FLAG_UNSAFE_TO_BREAK

-

Indicates that if input text is broken at the - beginning of the cluster this glyph is part of, - then both sides need to be re-shaped, as the - result might be different. On the flip side, - it means that when this flag is not present, - then it's safe to break the glyph-run at the - beginning of this cluster, and the two sides - represent the exact same result one would get - if breaking input text at the beginning of - this cluster and shaping the two sides - separately. This can be used to optimize - paragraph layout, by avoiding re-shaping - of each line after line-breaking, or limiting - the reshaping to a small piece around the - breaking point only.

-
 

HB_GLYPH_FLAG_DEFINED

  
-
-
-
-
-

hb_glyph_position_t

-
typedef struct {
-  hb_position_t  x_advance;
-  hb_position_t  y_advance;
-  hb_position_t  x_offset;
-  hb_position_t  y_offset;
-} hb_glyph_position_t;
-
-

The hb_glyph_position_t is the structure that holds the positions of the -glyph in both horizontal and vertical directions. All positions in -hb_glyph_position_t are relative to the current point.

-
-

Members

-
----- - - - - - - - - - - - - - - - - - - - - - - -

hb_position_t x_advance;

how much the line advances after drawing this glyph when setting -text in horizontal direction.

 

hb_position_t y_advance;

how much the line advances after drawing this glyph when setting -text in vertical direction.

 

hb_position_t x_offset;

how much the glyph moves on the X-axis before drawing it, this -should not affect how much the line advances.

 

hb_position_t y_offset;

how much the glyph moves on the Y-axis before drawing it, this -should not affect how much the line advances.

 
-
-
-
-
-

enum hb_buffer_content_type_t

-
-

Members

-
----- - - - - - - - - - - - - - - - - - -

HB_BUFFER_CONTENT_TYPE_INVALID

-

Initial value for new buffer.

-
 

HB_BUFFER_CONTENT_TYPE_UNICODE

-

The buffer contains input characters (before shaping).

-
 

HB_BUFFER_CONTENT_TYPE_GLYPHS

-

The buffer contains output glyphs (after shaping).

-
 
-
-
-
-
-

enum hb_buffer_flags_t

-
-

Members

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

HB_BUFFER_FLAG_DEFAULT

-

the default buffer flag.

-
 

HB_BUFFER_FLAG_BOT

-

flag indicating that special handling of the beginning - of text paragraph can be applied to this buffer. Should usually - be set, unless you are passing to the buffer only part - 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_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 (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

-
-
-
-

enum hb_buffer_cluster_level_t

-
-

Members

-
----- - - - - - - - - - - - - - - - - - - - - - - -

HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES

  

HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS

  

HB_BUFFER_CLUSTER_LEVEL_CHARACTERS

  

HB_BUFFER_CLUSTER_LEVEL_DEFAULT

  
-
-
-
-
-

hb_segment_properties_t

-
typedef struct {
-  hb_direction_t  direction;
-  hb_script_t     script;
-  hb_language_t   language;
-} hb_segment_properties_t;
-
-

The structure that holds various text properties of an hb_buffer_t. Can be -set and retrieved using hb_buffer_set_segment_properties() and -hb_buffer_get_segment_properties(), respectively.

-
-

Members

-
----- - - - - - - - - - - - - - - - - - -

hb_direction_t direction;

the hb_direction_t of the buffer, see hb_buffer_set_direction().

 

hb_script_t script;

the hb_script_t of the buffer, see hb_buffer_set_script().

 

hb_language_t language;

the hb_language_t of the buffer, see hb_buffer_set_language().

 
-
-
-
-
-

enum hb_buffer_serialize_format_t

-

The buffer serialization and de-serialization format used in -hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().

-
-

Members

-
----- - - - - - - - - - - - - - - - - - -

HB_BUFFER_SERIALIZE_FORMAT_TEXT

-

a human-readable, plain text format.

-
 

HB_BUFFER_SERIALIZE_FORMAT_JSON

-

a machine-readable JSON format.

-
 

HB_BUFFER_SERIALIZE_FORMAT_INVALID

-

invalid format.

-
 
-
-

Since: 0.9.2

-
-
-
-

enum hb_buffer_serialize_flags_t

-

Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().

-
-

Members

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

HB_BUFFER_SERIALIZE_FLAG_DEFAULT

-

serialize glyph names, clusters and positions.

-
 

HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS

-

do not serialize glyph cluster.

-
 

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

-
 
-
-

Since: 0.9.20

-
-
-
-

enum hb_buffer_diff_flags_t

-
-

Members

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

HB_BUFFER_DIFF_FLAG_EQUAL

  

HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH

  

HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH

  

HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT

  

HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT

  

HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH

  

HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH

  

HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH

  

HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH

  
-
-
-
-
- - - \ No newline at end of file diff --git a/docs/html/harfbuzz-Shaping.html b/docs/html/harfbuzz-Shaping.html deleted file mode 100644 index a50c761..0000000 --- a/docs/html/harfbuzz-Shaping.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - -Shaping: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-
-
- - -
-

Shaping

-

Shaping — Conversion of text strings into positioned glyphs

-
-
-

Functions

-
---- - - - - - - - - - - - - - - - - - - - - - - -
-hb_bool_t - -hb_feature_from_string () -
-void - -hb_feature_to_string () -
-void - -hb_shape () -
-hb_bool_t - -hb_shape_full () -
const char ** - -hb_shape_list_shapers () -
-
-
-

Types and Values

-
---- - - - - -
 hb_feature_t
-
-
-

Object Hierarchy

-
    GBoxed
-    ╰── hb_feature_t
-
-
-
-

Includes

-
#include <hb.h>
-
-
-
-

Description

-

Shaping is the central operation of HarfBuzz. Shaping operates on buffers, -which are sequences of Unicode characters that use the same font and have -the same text direction, script and language. After shaping the buffer -contains the output glyphs and their positions.

-
-
-

Functions

-
-

hb_feature_from_string ()

-
hb_bool_t
-hb_feature_from_string (const char *str,
-                        int len,
-                        hb_feature_t *feature);
-

Parses a string into a hb_feature_t.

-

TODO: document the syntax here.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - -

str

a string to parse.

[array length=len][element-type uint8_t]

len

length of str -, or -1 if string is NULL terminated

 

feature

the hb_feature_t to initialize with the parsed values.

[out]
-
-
-

Returns

-

true if str -is successfully parsed, false otherwise.

-
-

Since: 0.9.5

-
-
-
-

hb_feature_to_string ()

-
void
-hb_feature_to_string (hb_feature_t *feature,
-                      char *buf,
-                      unsigned int size);
-

Converts a hb_feature_t into a NULL-terminated string in the format -understood by hb_feature_from_string(). The client in responsible for -allocating big enough size for buf -, 128 bytes is more than enough.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - -

feature

an hb_feature_t to convert

 

buf

output string.

[array length=size][out]

size

the allocated size of buf -

 
-
-

Since: 0.9.5

-
-
-
-

hb_shape ()

-
void
-hb_shape (hb_font_t *font,
-          hb_buffer_t *buffer,
-          const hb_feature_t *features,
-          unsigned int num_features);
-

Shapes buffer - using font - turning its Unicode characters content to -positioned glyphs. If features - is not NULL, it will be used to control the -features applied during shaping.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - -

font

an hb_font_t to use for shaping

 

buffer

an hb_buffer_t to shape

 

features

an array of user -specified hb_feature_t or NULL.

[array length=num_features][allow-none]

num_features

the length of features -array

 
-
-

Since: 0.9.2

-
-
-
-

hb_shape_full ()

-
hb_bool_t
-hb_shape_full (hb_font_t *font,
-               hb_buffer_t *buffer,
-               const hb_feature_t *features,
-               unsigned int num_features,
-               const char * const *shaper_list);
-

See hb_shape() for details. If shaper_list - is not NULL, the specified -shapers will be used in the given order, otherwise the default shapers list -will be used.

-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

font

an hb_font_t to use for shaping

 

buffer

an hb_buffer_t to shape

 

features

an array of user -specified hb_feature_t or NULL.

[array length=num_features][allow-none]

num_features

the length of features -array

 

shaper_list

a NULL-terminated -array of shapers to use or NULL.

[array zero-terminated=1][allow-none]
-
-
-

Returns

-

false if all shapers failed, true otherwise

-
-

Since: 0.9.2

-
-
-
-

hb_shape_list_shapers ()

-
const char **
-hb_shape_list_shapers (void);
-

Retrieves the list of shapers supported by HarfBuzz.

-
-

Returns

-

an array of -constant strings.

-

[transfer none][array zero-terminated=1]

-
-

Since: 0.9.2

-
-
-
-

Types and Values

-
-

hb_feature_t

-
typedef struct {
-  hb_tag_t      tag;
-  uint32_t      value;
-  unsigned int  start;
-  unsigned int  end;
-} hb_feature_t;
-
-
-
-
- - - \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-aat-layout.html b/docs/html/harfbuzz-hb-aat-layout.html new file mode 100644 index 0000000..01fbdfa --- /dev/null +++ b/docs/html/harfbuzz-hb-aat-layout.html @@ -0,0 +1,1755 @@ + + + + +hb-aat-layout: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hb-aat-layout

+

hb-aat-layout — Apple Advanced Typography Layout

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+hb_ot_name_id_t + +hb_aat_layout_feature_type_get_name_id () +
unsigned int + +hb_aat_layout_feature_type_get_selector_infos () +
unsigned int + +hb_aat_layout_get_feature_types () +
+hb_bool_t + +hb_aat_layout_has_positioning () +
+hb_bool_t + +hb_aat_layout_has_substitution () +
+hb_bool_t + +hb_aat_layout_has_tracking () +
+
+
+

Types and Values

+ +
+
+

Object Hierarchy

+
    GEnum
+    ├── hb_aat_layout_feature_selector_t
+    ╰── hb_aat_layout_feature_type_t
+
+
+
+

Includes

+
#include <hb-aat.h>
+
+
+
+

Description

+

Functions for querying OpenType Layout features in the font face.

+
+
+

Functions

+
+

hb_aat_layout_feature_type_get_name_id ()

+
hb_ot_name_id_t
+hb_aat_layout_feature_type_get_name_id
+                               (hb_face_t *face,
+                                hb_aat_layout_feature_type_t feature_type);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

a face object

 

feature_type

feature id

 
+
+
+

Returns

+

Name ID index

+
+

Since: 2.2.0

+
+
+
+

hb_aat_layout_feature_type_get_selector_infos ()

+
unsigned int
+hb_aat_layout_feature_type_get_selector_infos
+                               (hb_face_t *face,
+                                hb_aat_layout_feature_type_t feature_type,
+                                unsigned int start_offset,
+                                unsigned int *selector_count,
+                                hb_aat_layout_feature_selector_info_t *selectors,
+                                unsigned int *default_index);
+
+
+
+

hb_aat_layout_get_feature_types ()

+
unsigned int
+hb_aat_layout_get_feature_types (hb_face_t *face,
+                                 unsigned int start_offset,
+                                 unsigned int *feature_count,
+                                 hb_aat_layout_feature_type_t *features);
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

face

a face object

 

start_offset

iteration's start offset

 

feature_count

buffer size as input, filled size as output.

[inout][allow-none]

features

features buffer.

[out caller-allocates][array length=feature_count]
+
+
+

Returns

+

Number of all available feature types.

+
+

Since: 2.2.0

+
+
+
+

hb_aat_layout_has_positioning ()

+
hb_bool_t
+hb_aat_layout_has_positioning (hb_face_t *face);
+
+
+
+

hb_aat_layout_has_substitution ()

+
hb_bool_t
+hb_aat_layout_has_substitution (hb_face_t *face);
+
+
+
+

hb_aat_layout_has_tracking ()

+
hb_bool_t
+hb_aat_layout_has_tracking (hb_face_t *face);
+
+
+
+

Types and Values

+
+

HB_AAT_LAYOUT_NO_SELECTOR_INDEX

+
#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX		0xFFFFu
+
+
+
+
+

enum hb_aat_layout_feature_type_t

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

HB_AAT_LAYOUT_FEATURE_TYPE_INVALID

  

HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC

  

HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES

  

HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION

  

HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE

  

HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION

  

HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT

  

HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING

  

HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION

  

HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS

  

HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS

  

HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS

  

HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES

  

HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS

  

HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE

  

HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING

  

HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION

  

HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA

  

HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN

  

HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT

  

HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA

  

HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES

  

HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES

  

HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE

  

HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE

  

HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE

  

HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE

  

_HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE

  
+
+

Since: 2.2.0

+
+
+
+

enum hb_aat_layout_feature_selector_t

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN

  

HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN

  

_HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE

  
+
+

Since: 2.2.0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-blob.html b/docs/html/harfbuzz-hb-blob.html index b3d9a76..9fa3967 100644 --- a/docs/html/harfbuzz-hb-blob.html +++ b/docs/html/harfbuzz-hb-blob.html @@ -5,10 +5,10 @@ hb-blob: HarfBuzz Manual - - - - + + + + @@ -19,16 +19,16 @@ Object Hierarchy Home -Up -Prev -Next +Up +Prev +Next

hb-blob

-

hb-blob

+

hb-blob — Binary data containers

@@ -174,14 +174,23 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ╰── hb_blob_t
-    GEnum
+    GEnum
     ╰── hb_memory_mode_t
 
+

Includes

+
#include <hb.h>
+
+
+

Description

+

Blobs wrap a chunk of binary data to handle lifecycle management of data +while it is passed between client and HarfBuzz. Blobs are primarily used +to create font faces, but also to access font face tables, as well as +pass around other binary data.

Functions

@@ -272,7 +281,7 @@ hb_blob_create_from_file (const c

Returns

A hb_blob_t pointer with the content of the file

-

Since: 1.7.7

+

Since: 1.7.7


@@ -354,7 +363,7 @@ hb_blob_copy_writable_or_fail (

Returns

New blob, or nullptr if allocation failed.

-

Since: 1.8.0

+

Since: 1.8.0


@@ -446,7 +455,7 @@ fails.

length

-

output length of the writable data.

+

output length of the writable data.

[out] @@ -454,7 +463,7 @@ fails.

Returns

-

Writable blob data, +

Writable blob data, or NULL if failed.

[transfer none][array length=length]

@@ -469,7 +478,7 @@ hb_blob_get_empty (voidSee TODO:link object types for more information.

Returns

-

the empty blob.

+

the empty blob.

[transfer full]

Since: 0.9.2

@@ -712,6 +721,6 @@ is not needed anymore.

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-buffer.html b/docs/html/harfbuzz-hb-buffer.html new file mode 100644 index 0000000..b9f3695 --- /dev/null +++ b/docs/html/harfbuzz-hb-buffer.html @@ -0,0 +1,3045 @@ + + + + +hb-buffer: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hb-buffer

+

hb-buffer — Input and output buffers

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+hb_buffer_t * + +hb_buffer_create () +
+hb_buffer_t * + +hb_buffer_reference () +
+hb_buffer_t * + +hb_buffer_get_empty () +
+void + +hb_buffer_destroy () +
+void + +hb_buffer_reset () +
+void + +hb_buffer_clear_contents () +
+hb_bool_t + +hb_buffer_pre_allocate () +
+hb_bool_t + +hb_buffer_allocation_successful () +
+void + +hb_buffer_add () +
+void + +hb_buffer_add_codepoints () +
+void + +hb_buffer_add_utf32 () +
+void + +hb_buffer_add_utf16 () +
+void + +hb_buffer_add_utf8 () +
+void + +hb_buffer_add_latin1 () +
+void + +hb_buffer_append () +
+void + +hb_buffer_set_content_type () +
+hb_buffer_content_type_t + +hb_buffer_get_content_type () +
+void + +hb_buffer_set_direction () +
+hb_direction_t + +hb_buffer_get_direction () +
+void + +hb_buffer_set_script () +
+hb_script_t + +hb_buffer_get_script () +
+void + +hb_buffer_set_language () +
+hb_language_t + +hb_buffer_get_language () +
+void + +hb_buffer_set_flags () +
+hb_buffer_flags_t + +hb_buffer_get_flags () +
+void + +hb_buffer_set_cluster_level () +
+hb_buffer_cluster_level_t + +hb_buffer_get_cluster_level () +
+hb_bool_t + +hb_buffer_set_length () +
unsigned int + +hb_buffer_get_length () +
+void + +hb_buffer_set_segment_properties () +
+void + +hb_buffer_get_segment_properties () +
+void + +hb_buffer_guess_segment_properties () +
+void + +hb_buffer_set_unicode_funcs () +
+hb_unicode_funcs_t * + +hb_buffer_get_unicode_funcs () +
+hb_bool_t + +hb_buffer_set_user_data () +
+void * + +hb_buffer_get_user_data () +
+hb_glyph_info_t * + +hb_buffer_get_glyph_infos () +
+hb_glyph_position_t * + +hb_buffer_get_glyph_positions () +
+hb_codepoint_t + +hb_buffer_get_invisible_glyph () +
+void + +hb_buffer_set_invisible_glyph () +
+void + +hb_buffer_set_replacement_codepoint () +
+hb_codepoint_t + +hb_buffer_get_replacement_codepoint () +
+void + +hb_buffer_normalize_glyphs () +
+void + +hb_buffer_reverse () +
+void + +hb_buffer_reverse_range () +
+void + +hb_buffer_reverse_clusters () +
unsigned int + +hb_buffer_serialize_glyphs () +
+hb_bool_t + +hb_buffer_deserialize_glyphs () +
+hb_buffer_serialize_format_t + +hb_buffer_serialize_format_from_string () +
const char * + +hb_buffer_serialize_format_to_string () +
const char ** + +hb_buffer_serialize_list_formats () +
+hb_bool_t + +hb_segment_properties_equal () +
unsigned int + +hb_segment_properties_hash () +
+hb_buffer_diff_flags_t + +hb_buffer_diff () +
+void + +hb_buffer_set_message_func () +
+hb_glyph_flags_t + +hb_glyph_info_get_glyph_flags () +
+hb_bool_t + +(*hb_buffer_message_func_t) () +
+
+
+

Types and Values

+ +
+
+

Object Hierarchy

+
    GBoxed
+    ├── hb_buffer_t
+    ├── hb_glyph_position_t
+    ╰── hb_segment_properties_t
+    GEnum
+    ├── hb_buffer_cluster_level_t
+    ├── hb_buffer_content_type_t
+    ╰── hb_buffer_serialize_format_t
+    GFlags
+    ├── hb_buffer_diff_flags_t
+    ├── hb_buffer_flags_t
+    ├── hb_buffer_serialize_flags_t
+    ╰── hb_glyph_flags_t
+
+
+
+

Includes

+
#include <hb.h>
+
+
+
+

Description

+

Buffers serve dual role in HarfBuzz; they hold the input characters that are +passed to hb_shape(), and after shaping they hold the output glyphs.

+
+
+

Functions

+
+

hb_buffer_create ()

+
hb_buffer_t *
+hb_buffer_create (void);
+

Creates a new hb_buffer_t with all properties to defaults.

+

[Xconstructor]

+
+

Returns

+

A newly allocated hb_buffer_t with a reference count of 1. The initial +reference count should be released with hb_buffer_destroy() when you are done +using the hb_buffer_t. This function never returns NULL. If memory cannot +be allocated, a special hb_buffer_t object will be returned on which +hb_buffer_allocation_successful() returns false.

+

[transfer full]

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_reference ()

+
hb_buffer_t *
+hb_buffer_reference (hb_buffer_t *buffer);
+

Increases the reference count on buffer + by one. This prevents buffer + from +being destroyed until a matching call to hb_buffer_destroy() is made.

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The referenced hb_buffer_t.

+

[transfer full]

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_empty ()

+
hb_buffer_t *
+hb_buffer_get_empty (void);
+
+

Returns

+

.

+

[transfer full]

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_destroy ()

+
void
+hb_buffer_destroy (hb_buffer_t *buffer);
+

Deallocate the buffer +. +Decreases the reference count on buffer + by one. If the result is zero, then +buffer + and all associated resources are freed. See hb_buffer_reference().

+

[skip]

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_reset ()

+
void
+hb_buffer_reset (hb_buffer_t *buffer);
+

Resets the buffer to its initial status, as if it was just newly created +with hb_buffer_create().

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_clear_contents ()

+
void
+hb_buffer_clear_contents (hb_buffer_t *buffer);
+

Similar to hb_buffer_reset(), but does not clear the Unicode functions and +the replacement code point.

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.11

+
+
+
+

hb_buffer_pre_allocate ()

+
hb_bool_t
+hb_buffer_pre_allocate (hb_buffer_t *buffer,
+                        unsigned int size);
+

Pre allocates memory for buffer + to fit at least size + number of items.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

size

number of items to pre allocate.

 
+
+
+

Returns

+

true if buffer +memory allocation succeeded, false otherwise.

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_allocation_successful ()

+
hb_bool_t
+hb_buffer_allocation_successful (hb_buffer_t *buffer);
+

Check if allocating memory for the buffer succeeded.

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

true if buffer +memory allocation succeeded, false otherwise.

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_add ()

+
void
+hb_buffer_add (hb_buffer_t *buffer,
+               hb_codepoint_t codepoint,
+               unsigned int cluster);
+

Appends a character with the Unicode value of codepoint + to buffer +, and +gives it the initial cluster value of cluster +. Clusters can be any thing +the client wants, they are usually used to refer to the index of the +character in the input text stream and are output in +hb_glyph_info_t.cluster field.

+

This function does not check the validity of codepoint +, it is up to the +caller to ensure it is a valid Unicode code point.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

codepoint

a Unicode code point.

 

cluster

the cluster value of codepoint +.

 
+
+

Since: 0.9.7

+
+
+
+

hb_buffer_add_codepoints ()

+
void
+hb_buffer_add_codepoints (hb_buffer_t *buffer,
+                          const hb_codepoint_t *text,
+                          int text_length,
+                          unsigned int item_offset,
+                          int item_length);
+

Appends characters from text + array to buffer +. The item_offset + is the +position of the first character from text + that will be appended, and +item_length + is the number of character. When shaping part of a larger text +(e.g. a run of text from a paragraph), instead of passing just the substring +corresponding to the run, it is preferable to pass the whole +paragraph and specify the run start and length as item_offset + and +item_length +, respectively, to give HarfBuzz the full context to be able, +for example, to do cross-run Arabic shaping or properly handle combining +marks at stat of run.

+

This function does not check the validity of text +, it is up to the caller +to ensure it contains a valid Unicode code points.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

buffer

a hb_buffer_t to append characters to.

 

text

an array of Unicode code points to append.

[array length=text_length]

text_length

the length of the text +, or -1 if it is NULL terminated.

 

item_offset

the offset of the first code point to add to the buffer +.

 

item_length

the number of code points to add to the buffer +, or -1 for the +end of text +(assuming it is NULL terminated).

 
+
+

Since: 0.9.31

+
+
+
+

hb_buffer_add_utf32 ()

+
void
+hb_buffer_add_utf32 (hb_buffer_t *buffer,
+                     const uint32_t *text,
+                     int text_length,
+                     unsigned int item_offset,
+                     int item_length);
+

See hb_buffer_add_codepoints().

+

Replaces invalid UTF-32 characters with the buffer + replacement code point, +see hb_buffer_set_replacement_codepoint().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

text

an array of UTF-32 characters to append.

[array length=text_length]

text_length

the length of the text +, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer +.

 

item_length

the number of characters to add to the buffer +, or -1 for the +end of text +(assuming it is NULL terminated).

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_add_utf16 ()

+
void
+hb_buffer_add_utf16 (hb_buffer_t *buffer,
+                     const uint16_t *text,
+                     int text_length,
+                     unsigned int item_offset,
+                     int item_length);
+

See hb_buffer_add_codepoints().

+

Replaces invalid UTF-16 characters with the buffer + replacement code point, +see hb_buffer_set_replacement_codepoint().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

text

an array of UTF-16 characters to append.

[array length=text_length]

text_length

the length of the text +, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer +.

 

item_length

the number of characters to add to the buffer +, or -1 for the +end of text +(assuming it is NULL terminated).

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_add_utf8 ()

+
void
+hb_buffer_add_utf8 (hb_buffer_t *buffer,
+                    const char *text,
+                    int text_length,
+                    unsigned int item_offset,
+                    int item_length);
+

See hb_buffer_add_codepoints().

+

Replaces invalid UTF-8 characters with the buffer + replacement code point, +see hb_buffer_set_replacement_codepoint().

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

text

an array of UTF-8 +characters to append.

[array length=text_length][element-type uint8_t]

text_length

the length of the text +, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer +.

 

item_length

the number of characters to add to the buffer +, or -1 for the +end of text +(assuming it is NULL terminated).

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_add_latin1 ()

+
void
+hb_buffer_add_latin1 (hb_buffer_t *buffer,
+                      const uint8_t *text,
+                      int text_length,
+                      unsigned int item_offset,
+                      int item_length);
+

Similar to hb_buffer_add_codepoints(), but allows only access to first 256 +Unicode code points that can fit in 8-bit strings.

+
Has nothing to do with non-Unicode Latin-1 encoding.
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

text

an array of UTF-8 +characters to append.

[array length=text_length][element-type uint8_t]

text_length

the length of the text +, or -1 if it is NULL terminated.

 

item_offset

the offset of the first character to add to the buffer +.

 

item_length

the number of characters to add to the buffer +, or -1 for the +end of text +(assuming it is NULL terminated).

 
+
+

Since: 0.9.39

+
+
+
+

hb_buffer_append ()

+
void
+hb_buffer_append (hb_buffer_t *buffer,
+                  hb_buffer_t *source,
+                  unsigned int start,
+                  unsigned int end);
+

Append (part of) contents of another buffer to this buffer.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

source

source hb_buffer_t.

 

start

start index into source buffer to copy. Use 0 to copy from start of buffer.

 

end

end index into source buffer to copy. Use (unsigned int) -1 to copy to end of buffer.

 
+
+

Since: 1.5.0

+
+
+
+

hb_buffer_set_content_type ()

+
void
+hb_buffer_set_content_type (hb_buffer_t *buffer,
+                            hb_buffer_content_type_t content_type);
+

Sets the type of buffer + contents, buffers are either empty, contain +characters (before shaping) or glyphs (the result of shaping).

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

content_type

the type of buffer contents to set

 
+
+

Since: 0.9.5

+
+
+
+

hb_buffer_get_content_type ()

+
hb_buffer_content_type_t
+hb_buffer_get_content_type (hb_buffer_t *buffer);
+

see hb_buffer_set_content_type().

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The type of buffer +contents.

+
+

Since: 0.9.5

+
+
+
+

hb_buffer_set_direction ()

+
void
+hb_buffer_set_direction (hb_buffer_t *buffer,
+                         hb_direction_t direction);
+

Set the text flow direction of the buffer. No shaping can happen without +setting buffer + direction, and it controls the visual direction for the +output glyphs; for RTL direction the glyphs will be reversed. Many layout +features depend on the proper setting of the direction, for example, +reversing RTL text before shaping, then shaping with LTR direction is not +the same as keeping the text in logical order and shaping with RTL +direction.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

direction

the hb_direction_t of the buffer +

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_direction ()

+
hb_direction_t
+hb_buffer_get_direction (hb_buffer_t *buffer);
+

See hb_buffer_set_direction()

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The direction of the buffer +.

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_set_script ()

+
void
+hb_buffer_set_script (hb_buffer_t *buffer,
+                      hb_script_t script);
+

Sets the script of buffer + to script +.

+

Script is crucial for choosing the proper shaping behaviour for scripts that +require it (e.g. Arabic) and the which OpenType features defined in the font +to be applied.

+

You can pass one of the predefined hb_script_t values, or use +hb_script_from_string() or hb_script_from_iso15924_tag() to get the +corresponding script from an ISO 15924 script tag.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

script

an hb_script_t to set.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_script ()

+
hb_script_t
+hb_buffer_get_script (hb_buffer_t *buffer);
+

See hb_buffer_set_script().

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The hb_script_t of the buffer +.

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_set_language ()

+
void
+hb_buffer_set_language (hb_buffer_t *buffer,
+                        hb_language_t language);
+

Sets the language of buffer + to language +.

+

Languages are crucial for selecting which OpenType feature to apply to the +buffer which can result in applying language-specific behaviour. Languages +are orthogonal to the scripts, and though they are related, they are +different concepts and should not be confused with each other.

+

Use hb_language_from_string() to convert from BCP 47 language tags to +hb_language_t.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

language

an hb_language_t to set.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_language ()

+
hb_language_t
+hb_buffer_get_language (hb_buffer_t *buffer);
+

See hb_buffer_set_language().

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The hb_language_t of the buffer. Must not be freed by the caller.

+

[transfer none]

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_set_flags ()

+
void
+hb_buffer_set_flags (hb_buffer_t *buffer,
+                     hb_buffer_flags_t flags);
+

Sets buffer + flags to flags +. See hb_buffer_flags_t.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

flags

the buffer flags to set.

 
+
+

Since: 0.9.7

+
+
+
+

hb_buffer_get_flags ()

+
hb_buffer_flags_t
+hb_buffer_get_flags (hb_buffer_t *buffer);
+

See hb_buffer_set_flags().

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The buffer +flags.

+
+

Since: 0.9.7

+
+
+
+

hb_buffer_set_cluster_level ()

+
void
+hb_buffer_set_cluster_level (hb_buffer_t *buffer,
+                             hb_buffer_cluster_level_t cluster_level);
+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.42

+
+
+
+

hb_buffer_get_cluster_level ()

+
hb_buffer_cluster_level_t
+hb_buffer_get_cluster_level (hb_buffer_t *buffer);
+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.42

+
+
+
+

hb_buffer_set_length ()

+
hb_bool_t
+hb_buffer_set_length (hb_buffer_t *buffer,
+                      unsigned int length);
+

Similar to hb_buffer_pre_allocate(), but clears any new items added at the +end.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

length

the new length of buffer +.

 
+
+
+

Returns

+

true if buffer +memory allocation succeeded, false otherwise.

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_length ()

+
unsigned int
+hb_buffer_get_length (hb_buffer_t *buffer);
+

Returns the number of items in the buffer.

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The buffer +length. +The value valid as long as buffer has not been modified.

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_set_segment_properties ()

+
void
+hb_buffer_set_segment_properties (hb_buffer_t *buffer,
+                                  const hb_segment_properties_t *props);
+

Sets the segment properties of the buffer, a shortcut for calling +hb_buffer_set_direction(), hb_buffer_set_script() and +hb_buffer_set_language() individually.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

props

an hb_segment_properties_t to use.

 
+
+

Since: 0.9.7

+
+
+
+

hb_buffer_get_segment_properties ()

+
void
+hb_buffer_get_segment_properties (hb_buffer_t *buffer,
+                                  hb_segment_properties_t *props);
+

Sets props + to the hb_segment_properties_t of buffer +.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

props

the output hb_segment_properties_t.

[out]
+
+

Since: 0.9.7

+
+
+
+

hb_buffer_guess_segment_properties ()

+
void
+hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
+

Sets unset buffer segment properties based on buffer Unicode +contents. If buffer is not empty, it must have content type +HB_BUFFER_CONTENT_TYPE_UNICODE.

+

If buffer script is not set (ie. is HB_SCRIPT_INVALID), it +will be set to the Unicode script of the first character in +the buffer that has a script other than HB_SCRIPT_COMMON, +HB_SCRIPT_INHERITED, and HB_SCRIPT_UNKNOWN.

+

Next, if buffer direction is not set (ie. is HB_DIRECTION_INVALID), +it will be set to the natural horizontal direction of the +buffer script as returned by hb_script_get_horizontal_direction(). +If hb_script_get_horizontal_direction() returns HB_DIRECTION_INVALID, +then HB_DIRECTION_LTR is used.

+

Finally, if buffer language is not set (ie. is HB_LANGUAGE_INVALID), +it will be set to the process's default language as returned by +hb_language_get_default(). This may change in the future by +taking buffer script into consideration when choosing a language. +Note that hb_language_get_default() is NOT threadsafe the first time +it is called. See documentation for that function for details.

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.7

+
+
+
+

hb_buffer_set_unicode_funcs ()

+
void
+hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
+                             hb_unicode_funcs_t *unicode_funcs);
+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_unicode_funcs ()

+
hb_unicode_funcs_t *
+hb_buffer_get_unicode_funcs (hb_buffer_t *buffer);
+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_set_user_data ()

+
hb_bool_t
+hb_buffer_set_user_data (hb_buffer_t *buffer,
+                         hb_user_data_key_t *key,
+                         void *data,
+                         hb_destroy_func_t destroy,
+                         hb_bool_t replace);
+

[skip]

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_user_data ()

+
void *
+hb_buffer_get_user_data (hb_buffer_t *buffer,
+                         hb_user_data_key_t *key);
+

[skip]

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_glyph_infos ()

+
hb_glyph_info_t *
+hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
+                           unsigned int *length);
+

Returns buffer + glyph information array. Returned pointer +is valid as long as buffer + contents are not modified.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

length

output array length.

[out]
+
+
+

Returns

+

The buffer +glyph information array. +The value valid as long as buffer has not been modified.

+

[transfer none][array length=length]

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_glyph_positions ()

+
hb_glyph_position_t *
+hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
+                               unsigned int *length);
+

Returns buffer + glyph position array. Returned pointer +is valid as long as buffer + contents are not modified.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

length

output length.

[out]
+
+
+

Returns

+

The buffer +glyph position array. +The value valid as long as buffer has not been modified.

+

[transfer none][array length=length]

+
+

Since: 0.9.2

+
+
+
+

hb_buffer_get_invisible_glyph ()

+
hb_codepoint_t
+hb_buffer_get_invisible_glyph (hb_buffer_t *buffer);
+

See hb_buffer_set_invisible_glyph().

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The buffer +invisible hb_codepoint_t.

+
+

Since: 2.0.0

+
+
+
+

hb_buffer_set_invisible_glyph ()

+
void
+hb_buffer_set_invisible_glyph (hb_buffer_t *buffer,
+                               hb_codepoint_t invisible);
+

Sets the hb_codepoint_t that replaces invisible characters in +the shaping result. If set to zero (default), the glyph for the +U+0020 SPACE character is used. Otherwise, this value is used +verbatim.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

invisible

the invisible hb_codepoint_t

 
+
+

Since: 2.0.0

+
+
+
+

hb_buffer_set_replacement_codepoint ()

+
void
+hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
+                                     hb_codepoint_t replacement);
+

Sets the hb_codepoint_t that replaces invalid entries for a given encoding +when adding text to buffer +.

+

Default is HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

replacement

the replacement hb_codepoint_t

 
+
+

Since: 0.9.31

+
+
+
+

hb_buffer_get_replacement_codepoint ()

+
hb_codepoint_t
+hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer);
+

See hb_buffer_set_replacement_codepoint().

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+
+

Returns

+

The buffer +replacement hb_codepoint_t.

+
+

Since: 0.9.31

+
+
+
+

hb_buffer_normalize_glyphs ()

+
void
+hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
+

Reorders a glyph buffer to have canonical in-cluster glyph order / position. +The resulting clusters should behave identical to pre-reordering clusters.

+
This has nothing to do with Unicode normalization.
+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_reverse ()

+
void
+hb_buffer_reverse (hb_buffer_t *buffer);
+

Reverses buffer contents.

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_reverse_range ()

+
void
+hb_buffer_reverse_range (hb_buffer_t *buffer,
+                         unsigned int start,
+                         unsigned int end);
+

Reverses buffer contents between start to end.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

start

start index.

 

end

end index.

 
+
+

Since: 0.9.41

+
+
+
+

hb_buffer_reverse_clusters ()

+
void
+hb_buffer_reverse_clusters (hb_buffer_t *buffer);
+

Reverses buffer clusters. That is, the buffer contents are +reversed, then each cluster (consecutive items having the +same cluster number) are reversed again.

+
+

Parameters

+
+++++ + + + + + +

buffer

an hb_buffer_t.

 
+
+

Since: 0.9.2

+
+
+
+

hb_buffer_serialize_glyphs ()

+
unsigned int
+hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
+                            unsigned int start,
+                            unsigned int end,
+                            char *buf,
+                            unsigned int buf_size,
+                            unsigned int *buf_consumed,
+                            hb_font_t *font,
+                            hb_buffer_serialize_format_t format,
+                            hb_buffer_serialize_flags_t flags);
+

Serializes buffer + into a textual representation of its glyph content, +useful for showing the contents of the buffer, for example during debugging. +There are currently two supported serialization formats:

+
+

text

+

A human-readable, plain text format. +The serialized glyphs will look something like:

+

+[uni0651=0@518,0+0|uni0628=0+1897] +

+
+
+
+

json

+

TODO.

+
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t buffer.

 

start

the first item in buffer +to serialize.

 

end

the last item in buffer +to serialize.

 

buf

output string to +write serialized buffer into.

[out][array length=buf_size][element-type uint8_t]

buf_size

the size of buf +.

 

buf_consumed

if not NULL, will be set to the number of byes written into buf +.

[out][allow-none]

font

the hb_font_t used to shape this buffer, needed to +read glyph names and extents. If NULL, and empty font will be used.

[allow-none]

format

the hb_buffer_serialize_format_t to use for formatting the output.

 

flags

the hb_buffer_serialize_flags_t that control what glyph properties +to serialize.

 
+
+
+

Returns

+

The number of serialized items.

+
+

Since: 0.9.7

+
+
+
+

hb_buffer_deserialize_glyphs ()

+
hb_bool_t
+hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
+                              const char *buf,
+                              int buf_len,
+                              const char **end_ptr,
+                              hb_font_t *font,
+                              hb_buffer_serialize_format_t format);
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

buffer

an hb_buffer_t buffer.

 

buf

.

[array length=buf_len]

end_ptr

.

[out]
+
+

Since: 0.9.7

+
+
+
+

hb_buffer_serialize_format_from_string ()

+
hb_buffer_serialize_format_t
+hb_buffer_serialize_format_from_string
+                               (const char *str,
+                                int len);
+

Parses a string into an hb_buffer_serialize_format_t. Does not check if +str + is a valid buffer serialization format, use +hb_buffer_serialize_list_formats() to get the list of supported formats.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

str

a string to parse.

[array length=len][element-type uint8_t]

len

length of str +, or -1 if string is NULL terminated

 
+
+
+

Returns

+

The parsed hb_buffer_serialize_format_t.

+
+

Since: 0.9.7

+
+
+
+

hb_buffer_serialize_format_to_string ()

+
const char *
+hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
+

Converts format + to the string corresponding it, or NULL if it is not a valid +hb_buffer_serialize_format_t.

+
+

Parameters

+
+++++ + + + + + +

format

an hb_buffer_serialize_format_t to convert.

 
+
+
+

Returns

+

A NULL terminated string corresponding to format +. Should not be freed.

+

[transfer none]

+
+

Since: 0.9.7

+
+
+
+

hb_buffer_serialize_list_formats ()

+
const char **
+hb_buffer_serialize_list_formats (void);
+

Returns a list of supported buffer serialization formats.

+
+

Returns

+

A string array of buffer serialization formats. Should not be freed.

+

[transfer none]

+
+

Since: 0.9.7

+
+
+
+

hb_segment_properties_equal ()

+
hb_bool_t
+hb_segment_properties_equal (const hb_segment_properties_t *a,
+                             const hb_segment_properties_t *b);
+

Checks the equality of two hb_segment_properties_t's.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

a

first hb_segment_properties_t to compare.

 

b

second hb_segment_properties_t to compare.

 
+
+
+

Returns

+

true if all properties of a +equal those of b +, false otherwise.

+
+

Since: 0.9.7

+
+
+
+

hb_segment_properties_hash ()

+
unsigned int
+hb_segment_properties_hash (const hb_segment_properties_t *p);
+

Creates a hash representing p +.

+
+

Parameters

+
+++++ + + + + + +

p

hb_segment_properties_t to hash.

 
+
+
+

Returns

+

A hash of p +.

+
+

Since: 0.9.7

+
+
+
+

hb_buffer_diff ()

+
hb_buffer_diff_flags_t
+hb_buffer_diff (hb_buffer_t *buffer,
+                hb_buffer_t *reference,
+                hb_codepoint_t dottedcircle_glyph,
+                unsigned int position_fuzz);
+

If dottedcircle_glyph is (hb_codepoint_t) -1 then HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT +and HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned. This should be used by most +callers if just comparing two buffers is needed.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

buffer

a buffer.

 

reference

other buffer to compare to.

 

dottedcircle_glyph

glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1.

 

position_fuzz

allowed absolute difference in position values.

 
+
+

Since: 1.5.0

+
+
+
+

hb_buffer_set_message_func ()

+
void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+                            hb_buffer_message_func_t func,
+                            void *user_data,
+                            hb_destroy_func_t destroy);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

buffer

an hb_buffer_t.

 

func

.

[closure user_data][destroy destroy][scope notified]
+
+

Since: 1.1.3

+
+
+
+

hb_glyph_info_get_glyph_flags ()

+
hb_glyph_flags_t
+hb_glyph_info_get_glyph_flags (const hb_glyph_info_t *info);
+

Returns glyph flags encoded within a hb_glyph_info_t.

+
+

Parameters

+
+++++ + + + + + +

info

a hb_glyph_info_t.

 
+
+
+

Returns

+

The hb_glyph_flags_t encoded within info +.

+
+

Since: 1.5.0

+
+
+
+

hb_buffer_message_func_t ()

+
hb_bool_t
+(*hb_buffer_message_func_t) (hb_buffer_t *buffer,
+                             hb_font_t *font,
+                             const char *message,
+                             void *user_data);
+
+
+
+

Types and Values

+
+

HB_SEGMENT_PROPERTIES_DEFAULT

+
#define             HB_SEGMENT_PROPERTIES_DEFAULT
+
+
+
+

HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT

+
#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
+
+

The default code point for replacing invalid characters in a given encoding. +Set to U+FFFD REPLACEMENT CHARACTER.

+

Since: 0.9.31

+
+
+
+

hb_buffer_t

+
typedef struct hb_buffer_t hb_buffer_t;
+
+

The main structure holding the input text and its properties before shaping, +and output glyphs and their information after shaping.

+
+
+
+

enum hb_glyph_flags_t

+
+

Members

+
+++++ + + + + + + + + + + + + +

HB_GLYPH_FLAG_UNSAFE_TO_BREAK

+

Indicates that if input text is broken at the + beginning of the cluster this glyph is part of, + then both sides need to be re-shaped, as the + result might be different. On the flip side, + it means that when this flag is not present, + then it's safe to break the glyph-run at the + beginning of this cluster, and the two sides + represent the exact same result one would get + if breaking input text at the beginning of + this cluster and shaping the two sides + separately. This can be used to optimize + paragraph layout, by avoiding re-shaping + of each line after line-breaking, or limiting + the reshaping to a small piece around the + breaking point only.

+
 

HB_GLYPH_FLAG_DEFINED

+

All the currently defined flags.

+
 
+
+

Since: 1.5.0

+
+
+
+

hb_glyph_position_t

+
typedef struct {
+  hb_position_t  x_advance;
+  hb_position_t  y_advance;
+  hb_position_t  x_offset;
+  hb_position_t  y_offset;
+} hb_glyph_position_t;
+
+

The hb_glyph_position_t is the structure that holds the positions of the +glyph in both horizontal and vertical directions. All positions in +hb_glyph_position_t are relative to the current point.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

hb_position_t x_advance;

how much the line advances after drawing this glyph when setting +text in horizontal direction.

 

hb_position_t y_advance;

how much the line advances after drawing this glyph when setting +text in vertical direction.

 

hb_position_t x_offset;

how much the glyph moves on the X-axis before drawing it, this +should not affect how much the line advances.

 

hb_position_t y_offset;

how much the glyph moves on the Y-axis before drawing it, this +should not affect how much the line advances.

 
+
+
+
+
+

enum hb_buffer_content_type_t

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

HB_BUFFER_CONTENT_TYPE_INVALID

+

Initial value for new buffer.

+
 

HB_BUFFER_CONTENT_TYPE_UNICODE

+

The buffer contains input characters (before shaping).

+
 

HB_BUFFER_CONTENT_TYPE_GLYPHS

+

The buffer contains output glyphs (after shaping).

+
 
+
+
+
+
+

enum hb_buffer_flags_t

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

HB_BUFFER_FLAG_DEFAULT

+

the default buffer flag.

+
 

HB_BUFFER_FLAG_BOT

+

flag indicating that special handling of the beginning + of text paragraph can be applied to this buffer. Should usually + be set, unless you are passing to the buffer only part + 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_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 (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

+
+
+
+

enum hb_buffer_cluster_level_t

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES

+

Return cluster values grouped by graphemes into + monotone order.

+
 

HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS

+

Return cluster values grouped into monotone order.

+
 

HB_BUFFER_CLUSTER_LEVEL_CHARACTERS

+

Don't group cluster values.

+
 

HB_BUFFER_CLUSTER_LEVEL_DEFAULT

+

Default cluster level, + equal to HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES +.

+
 
+
+

Since: 0.9.42

+
+
+
+

hb_segment_properties_t

+
typedef struct {
+  hb_direction_t  direction;
+  hb_script_t     script;
+  hb_language_t   language;
+} hb_segment_properties_t;
+
+

The structure that holds various text properties of an hb_buffer_t. Can be +set and retrieved using hb_buffer_set_segment_properties() and +hb_buffer_get_segment_properties(), respectively.

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

hb_direction_t direction;

the hb_direction_t of the buffer, see hb_buffer_set_direction().

 

hb_script_t script;

the hb_script_t of the buffer, see hb_buffer_set_script().

 

hb_language_t language;

the hb_language_t of the buffer, see hb_buffer_set_language().

 
+
+
+
+
+

enum hb_buffer_serialize_format_t

+

The buffer serialization and de-serialization format used in +hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

HB_BUFFER_SERIALIZE_FORMAT_TEXT

+

a human-readable, plain text format.

+
 

HB_BUFFER_SERIALIZE_FORMAT_JSON

+

a machine-readable JSON format.

+
 

HB_BUFFER_SERIALIZE_FORMAT_INVALID

+

invalid format.

+
 
+
+

Since: 0.9.2

+
+
+
+

enum hb_buffer_serialize_flags_t

+

Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

HB_BUFFER_SERIALIZE_FLAG_DEFAULT

+

serialize glyph names, clusters and positions.

+
 

HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS

+

do not serialize glyph cluster.

+
 

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

+
 
+
+

Since: 0.9.20

+
+
+
+

enum hb_buffer_diff_flags_t

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

HB_BUFFER_DIFF_FLAG_EQUAL

  

HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH

  

HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH

  

HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT

  

HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT

  

HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH

  

HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH

  

HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH

  

HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH

  
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-common.html b/docs/html/harfbuzz-hb-common.html index 7db2c8b..7401836 100644 --- a/docs/html/harfbuzz-hb-common.html +++ b/docs/html/harfbuzz-hb-common.html @@ -5,10 +5,10 @@ hb-common: HarfBuzz Manual - - - - + + + + @@ -19,16 +19,16 @@ Object Hierarchy Home -Up -Prev -Next +Up +Prev +Next

hb-common

-

hb-common

+

hb-common — Common data types

@@ -254,15 +254,21 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ╰── hb_user_data_key_t
-    GEnum
+    GEnum
     ├── hb_direction_t
     ╰── hb_script_t
 
+

Includes

+
#include <hb.h>
+
+
+

Description

+

Common data types used across HarfBuzz are defined here.

Functions

@@ -394,7 +400,7 @@ corresponding

str

-

a string representing an +

a string representing an ISO 15924 tag.

[array length=len][element-type uint8_t] @@ -454,7 +460,7 @@ hb_script_get_horizontal_direction (
const char *str, int len);

Converts str - representing an ISO 639 language code to the corresponding + representing a BCP 47 language tag to the corresponding hb_language_t.

Parameters

@@ -467,8 +473,8 @@ hb_language_from_string (const ch

str

-

a string representing -ISO 639 language code.

+

a string representing +a BCP 47 language tag.

[array length=len][element-type uint8_t] @@ -482,7 +488,7 @@ ISO 639 language code.

Returns

-

The hb_language_t corresponding to the ISO 639 language code.

+

The hb_language_t corresponding to the BCP 47 language tag.

[transfer none]

Since: 0.9.2

@@ -522,6 +528,13 @@ the caller.

hb_language_get_default ()

hb_language_t
 hb_language_get_default (void);
+

Get default language from current locale.

+

Note that the first time this function is called, it calls +"setlocale (LC_CTYPE, nullptr)" to fetch current locale. The underlying +setlocale function is, in many implementations, NOT threadsafe. To avoid +problems, call this function once before multiple threads can call it. +This function is only used from hb_buffer_guess_segment_properties() by +HarfBuzz itself.

Returns

.

@@ -538,13 +551,13 @@ hb_language_get_default (void

HB_TAG()

-
#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint8_t)(c1))<<24)|(((uint8_t)(c2))<<16)|(((uint8_t)(c3))<<8)|((uint8_t)(c4))))
+
#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
 

HB_UNTAG()

-
#define HB_UNTAG(tag)   ((uint8_t)((tag)>>24)), ((uint8_t)((tag)>>16)), ((uint8_t)((tag)>>8)), ((uint8_t)(tag))
+
#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
 

@@ -685,22 +698,747 @@ hb_language_get_default (void -

HB_SCRIPT_BASSA_VAH

+

HB_SCRIPT_COMMON

    -

HB_SCRIPT_ADLAM

+

HB_SCRIPT_INHERITED

    -

HB_SCRIPT_MASARAM_GONDI

+

HB_SCRIPT_UNKNOWN

    -

HB_SCRIPT_DOGRA

+

HB_SCRIPT_ARABIC

+  +  + + +

HB_SCRIPT_ARMENIAN

+  +  + + +

HB_SCRIPT_BENGALI

+  +  + + +

HB_SCRIPT_CYRILLIC

+  +  + + +

HB_SCRIPT_DEVANAGARI

+  +  + + +

HB_SCRIPT_GEORGIAN

+  +  + + +

HB_SCRIPT_GREEK

+  +  + + +

HB_SCRIPT_GUJARATI

+  +  + + +

HB_SCRIPT_GURMUKHI

+  +  + + +

HB_SCRIPT_HANGUL

+  +  + + +

HB_SCRIPT_HAN

+  +  + + +

HB_SCRIPT_HEBREW

+  +  + + +

HB_SCRIPT_HIRAGANA

+  +  + + +

HB_SCRIPT_KANNADA

+  +  + + +

HB_SCRIPT_KATAKANA

+  +  + + +

HB_SCRIPT_LAO

+  +  + + +

HB_SCRIPT_LATIN

+  +  + + +

HB_SCRIPT_MALAYALAM

+  +  + + +

HB_SCRIPT_ORIYA

+  +  + + +

HB_SCRIPT_TAMIL

+  +  + + +

HB_SCRIPT_TELUGU

+  +  + + +

HB_SCRIPT_THAI

+  +  + + +

HB_SCRIPT_TIBETAN

+  +  + + +

HB_SCRIPT_BOPOMOFO

+  +  + + +

HB_SCRIPT_BRAILLE

+  +  + + +

HB_SCRIPT_CANADIAN_SYLLABICS

+  +  + + +

HB_SCRIPT_CHEROKEE

+  +  + + +

HB_SCRIPT_ETHIOPIC

+  +  + + +

HB_SCRIPT_KHMER

+  +  + + +

HB_SCRIPT_MONGOLIAN

+  +  + + +

HB_SCRIPT_MYANMAR

+  +  + + +

HB_SCRIPT_OGHAM

+  +  + + +

HB_SCRIPT_RUNIC

+  +  + + +

HB_SCRIPT_SINHALA

+  +  + + +

HB_SCRIPT_SYRIAC

+  +  + + +

HB_SCRIPT_THAANA

+  +  + + +

HB_SCRIPT_YI

+  +  + + +

HB_SCRIPT_DESERET

+  +  + + +

HB_SCRIPT_GOTHIC

+  +  + + +

HB_SCRIPT_OLD_ITALIC

+  +  + + +

HB_SCRIPT_BUHID

+  +  + + +

HB_SCRIPT_HANUNOO

+  +  + + +

HB_SCRIPT_TAGALOG

+  +  + + +

HB_SCRIPT_TAGBANWA

+  +  + + +

HB_SCRIPT_CYPRIOT

+  +  + + +

HB_SCRIPT_LIMBU

+  +  + + +

HB_SCRIPT_LINEAR_B

+  +  + + +

HB_SCRIPT_OSMANYA

+  +  + + +

HB_SCRIPT_SHAVIAN

+  +  + + +

HB_SCRIPT_TAI_LE

+  +  + + +

HB_SCRIPT_UGARITIC

+  +  + + +

HB_SCRIPT_BUGINESE

+  +  + + +

HB_SCRIPT_COPTIC

+  +  + + +

HB_SCRIPT_GLAGOLITIC

+  +  + + +

HB_SCRIPT_KHAROSHTHI

+  +  + + +

HB_SCRIPT_NEW_TAI_LUE

+  +  + + +

HB_SCRIPT_OLD_PERSIAN

+  +  + + +

HB_SCRIPT_SYLOTI_NAGRI

+  +  + + +

HB_SCRIPT_TIFINAGH

+  +  + + +

HB_SCRIPT_BALINESE

+  +  + + +

HB_SCRIPT_CUNEIFORM

+  +  + + +

HB_SCRIPT_NKO

+  +  + + +

HB_SCRIPT_PHAGS_PA

+  +  + + +

HB_SCRIPT_PHOENICIAN

+  +  + + +

HB_SCRIPT_CARIAN

+  +  + + +

HB_SCRIPT_CHAM

+  +  + + +

HB_SCRIPT_KAYAH_LI

+  +  + + +

HB_SCRIPT_LEPCHA

+  +  + + +

HB_SCRIPT_LYCIAN

+  +  + + +

HB_SCRIPT_LYDIAN

+  +  + + +

HB_SCRIPT_OL_CHIKI

+  +  + + +

HB_SCRIPT_REJANG

+  +  + + +

HB_SCRIPT_SAURASHTRA

+  +  + + +

HB_SCRIPT_SUNDANESE

+  +  + + +

HB_SCRIPT_VAI

+  +  + + +

HB_SCRIPT_AVESTAN

+  +  + + +

HB_SCRIPT_BAMUM

+  +  + + +

HB_SCRIPT_EGYPTIAN_HIEROGLYPHS

+  +  + + +

HB_SCRIPT_IMPERIAL_ARAMAIC

+  +  + + +

HB_SCRIPT_INSCRIPTIONAL_PAHLAVI

+  +  + + +

HB_SCRIPT_INSCRIPTIONAL_PARTHIAN

+  +  + + +

HB_SCRIPT_JAVANESE

+  +  + + +

HB_SCRIPT_KAITHI

+  +  + + +

HB_SCRIPT_LISU

+  +  + + +

HB_SCRIPT_MEETEI_MAYEK

+  +  + + +

HB_SCRIPT_OLD_SOUTH_ARABIAN

+  +  + + +

HB_SCRIPT_OLD_TURKIC

+  +  + + +

HB_SCRIPT_SAMARITAN

+  +  + + +

HB_SCRIPT_TAI_THAM

+  +  + + +

HB_SCRIPT_TAI_VIET

+  +  + + +

HB_SCRIPT_BATAK

+  +  + + +

HB_SCRIPT_BRAHMI

+  +  + + +

HB_SCRIPT_MANDAIC

+  +  + + +

HB_SCRIPT_CHAKMA

+  +  + + +

HB_SCRIPT_MEROITIC_CURSIVE

+  +  + + +

HB_SCRIPT_MEROITIC_HIEROGLYPHS

+  +  + + +

HB_SCRIPT_MIAO

+  +  + + +

HB_SCRIPT_SHARADA

+  +  + + +

HB_SCRIPT_SORA_SOMPENG

+  +  + + +

HB_SCRIPT_TAKRI

+  +  + + +

HB_SCRIPT_BASSA_VAH

+  +  + + +

HB_SCRIPT_CAUCASIAN_ALBANIAN

+  +  + + +

HB_SCRIPT_DUPLOYAN

+  +  + + +

HB_SCRIPT_ELBASAN

+  +  + + +

HB_SCRIPT_GRANTHA

+  +  + + +

HB_SCRIPT_KHOJKI

+  +  + + +

HB_SCRIPT_KHUDAWADI

+  +  + + +

HB_SCRIPT_LINEAR_A

+  +  + + +

HB_SCRIPT_MAHAJANI

+  +  + + +

HB_SCRIPT_MANICHAEAN

+  +  + + +

HB_SCRIPT_MENDE_KIKAKUI

+  +  + + +

HB_SCRIPT_MODI

+  +  + + +

HB_SCRIPT_MRO

+  +  + + +

HB_SCRIPT_NABATAEAN

+  +  + + +

HB_SCRIPT_OLD_NORTH_ARABIAN

+  +  + + +

HB_SCRIPT_OLD_PERMIC

+  +  + + +

HB_SCRIPT_PAHAWH_HMONG

+  +  + + +

HB_SCRIPT_PALMYRENE

+  +  + + +

HB_SCRIPT_PAU_CIN_HAU

+  +  + + +

HB_SCRIPT_PSALTER_PAHLAVI

+  +  + + +

HB_SCRIPT_SIDDHAM

+  +  + + +

HB_SCRIPT_TIRHUTA

+  +  + + +

HB_SCRIPT_WARANG_CITI

+  +  + + +

HB_SCRIPT_AHOM

+  +  + + +

HB_SCRIPT_ANATOLIAN_HIEROGLYPHS

+  +  + + +

HB_SCRIPT_HATRAN

+  +  + + +

HB_SCRIPT_MULTANI

+  +  + + +

HB_SCRIPT_OLD_HUNGARIAN

+  +  + + +

HB_SCRIPT_SIGNWRITING

+  +  + + +

HB_SCRIPT_ADLAM

+  +  + + +

HB_SCRIPT_BHAIKSUKI

+  +  + + +

HB_SCRIPT_MARCHEN

+  +  + + +

HB_SCRIPT_OSAGE

+  +  + + +

HB_SCRIPT_TANGUT

+  +  + + +

HB_SCRIPT_NEWA

+  +  + + +

HB_SCRIPT_MASARAM_GONDI

+  +  + + +

HB_SCRIPT_NUSHU

+  +  + + +

HB_SCRIPT_SOYOMBO

+  +  + + +

HB_SCRIPT_ZANABAZAR_SQUARE

+  +  + + +

HB_SCRIPT_DOGRA

+  +  + + +

HB_SCRIPT_GUNJALA_GONDI

+  +  + + +

HB_SCRIPT_HANIFI_ROHINGYA

+  +  + + +

HB_SCRIPT_MAKASAR

+  +  + + +

HB_SCRIPT_MEDEFAIDRIN

+  +  + + +

HB_SCRIPT_OLD_SOGDIAN

+  +  + + +

HB_SCRIPT_SOGDIAN

    @@ -761,6 +1499,6 @@ hb_language_get_default (void
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-coretext.html b/docs/html/harfbuzz-hb-coretext.html index 24a7e11..fddeb85 100644 --- a/docs/html/harfbuzz-hb-coretext.html +++ b/docs/html/harfbuzz-hb-coretext.html @@ -5,10 +5,10 @@ hb-coretext: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@ Description Home -Up -Prev -Next +Up +Prev +Next

hb-coretext

-

hb-coretext

+

hb-coretext — CoreText integration

@@ -98,7 +98,13 @@
+

Includes

+
#include <hb-coretext.h>
+
+
+

Description

+

Functions for using HarfBuzz with the CoreText fonts.

Functions

@@ -148,6 +154,6 @@ hb_coretext_font_get_ct_font ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-deprecated.html b/docs/html/harfbuzz-hb-deprecated.html index 60935e1..96ed0a1 100644 --- a/docs/html/harfbuzz-hb-deprecated.html +++ b/docs/html/harfbuzz-hb-deprecated.html @@ -5,10 +5,10 @@ hb-deprecated: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@
Description Home -Up -Prev -Next +Up +Prev +Next

hb-deprecated

-

hb-deprecated

+

hb-deprecated — Deprecated API

@@ -41,10 +41,10 @@ -void +hb_bool_t -hb_font_funcs_set_glyph_func () +(*hb_font_get_glyph_func_t) () @@ -52,7 +52,31 @@ hb_bool_t -(*hb_font_get_glyph_func_t) () +hb_ot_layout_table_find_script () + + + + +void + + +hb_font_funcs_set_glyph_h_kerning_func () + + + + +void + + +hb_font_funcs_set_glyph_v_kerning_func () + + + + +hb_position_t + + +hb_font_get_glyph_h_kerning () @@ -60,7 +84,23 @@ void -hb_set_invert () +hb_font_get_glyph_kerning_for_direction () + + + + +hb_position_t + + +(*hb_font_get_glyph_kerning_func_t) () + + + + +hb_position_t + + +hb_font_get_glyph_v_kerning () @@ -86,26 +126,69 @@ #define HB_SCRIPT_CANADIAN_ABORIGINAL + +#define +HB_OT_VAR_NO_AXIS_INDEX + + +#define +HB_UNICODE_MAX_DECOMPOSITION_LEN + + +typedef +hb_font_get_glyph_h_kerning_func_t + + +typedef +hb_font_get_glyph_v_kerning_func_t +
+

Includes

+
#include <hb.h>
+
+
+

Description

+

These API have been deprecated in favor of newer API, or because they +were deemed unnecessary.

Functions

-

hb_font_funcs_set_glyph_func ()

+

hb_font_get_glyph_func_t ()

+
hb_bool_t
+(*hb_font_get_glyph_func_t) (hb_font_t *font,
+                             void *font_data,
+                             hb_codepoint_t unicode,
+                             hb_codepoint_t variation_selector,
+                             hb_codepoint_t *glyph,
+                             void *user_data);
+

hb_font_get_glyph_func_t is deprecated and should not be used in newly-written code.

+
+
+
+

hb_ot_layout_table_find_script ()

+
hb_bool_t
+hb_ot_layout_table_find_script (hb_face_t *face,
+                                hb_tag_t table_tag,
+                                hb_tag_t script_tag,
+                                unsigned int *script_index);
+
+
+
+

hb_font_funcs_set_glyph_h_kerning_func ()

void
-hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
-                              hb_font_get_glyph_func_t func,
-                              void *user_data,
-                              hb_destroy_func_t destroy);
-

hb_font_funcs_set_glyph_func has been deprecated since version 1.2.3 and should not be used in newly-written code.

-

Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and -hb_font_funcs_set_variation_glyph_func() instead.

+hb_font_funcs_set_glyph_h_kerning_func + (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_h_kerning_func_t func, + void *user_data, + hb_destroy_func_t destroy); +

hb_font_funcs_set_glyph_h_kerning_func has been deprecated since version 2.0.0 and should not be used in newly-written code.

-

Parameters

+

Parameters

@@ -130,24 +213,125 @@ hb_font_funcs_set_glyph_func ( -

hb_font_get_glyph_func_t ()

-
hb_bool_t
-(*hb_font_get_glyph_func_t) (hb_font_t *font,
-                             void *font_data,
-                             hb_codepoint_t unicode,
-                             hb_codepoint_t variation_selector,
-                             hb_codepoint_t *glyph,
-                             void *user_data);
-

hb_font_get_glyph_func_t is deprecated and should not be used in newly-written code.

+

hb_font_funcs_set_glyph_v_kerning_func ()

+
void
+hb_font_funcs_set_glyph_v_kerning_func
+                               (hb_font_funcs_t *ffuncs,
+                                hb_font_get_glyph_v_kerning_func_t func,
+                                void *user_data,
+                                hb_destroy_func_t destroy);
+

hb_font_funcs_set_glyph_v_kerning_func has been deprecated since version 2.0.0 and should not be used in newly-written code.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

ffuncs

font functions.

 

func

.

[closure user_data][destroy destroy][scope notified]
+
+

Since: 0.9.2


-

hb_set_invert ()

+

hb_font_get_glyph_h_kerning ()

+
hb_position_t
+hb_font_get_glyph_h_kerning (hb_font_t *font,
+                             hb_codepoint_t left_glyph,
+                             hb_codepoint_t right_glyph);
+

hb_font_get_glyph_h_kerning has been deprecated since version 2.0.0 and should not be used in newly-written code.

+
+

Parameters

+
+++++ + + + + + +

font

a font.

 
+
+

Since: 0.9.2

+
+
+
+

hb_font_get_glyph_kerning_for_direction ()

void
-hb_set_invert (hb_set_t *set);
-

hb_set_invert has been deprecated since version 1.6.1 and should not be used in newly-written code.

+hb_font_get_glyph_kerning_for_direction + (hb_font_t *font, + hb_codepoint_t first_glyph, + hb_codepoint_t second_glyph, + hb_direction_t direction, + hb_position_t *x, + hb_position_t *y); +

hb_font_get_glyph_kerning_for_direction has been deprecated since version 2.0.0 and should not be used in newly-written code.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

font

a font.

 

x

.

[out]

y

.

[out]
+
+

Since: 0.9.2

+
+
+
+

hb_font_get_glyph_kerning_func_t ()

+
hb_position_t
+(*hb_font_get_glyph_kerning_func_t) (hb_font_t *font,
+                                     void *font_data,
+                                     hb_codepoint_t first_glyph,
+                                     hb_codepoint_t second_glyph,
+                                     void *user_data);
+

hb_font_get_glyph_kerning_func_t is deprecated and should not be used in newly-written code.

+
+
+
+

hb_font_get_glyph_v_kerning ()

+
hb_position_t
+hb_font_get_glyph_v_kerning (hb_font_t *font,
+                             hb_codepoint_t top_glyph,
+                             hb_codepoint_t bottom_glyph);
+

hb_font_get_glyph_v_kerning has been deprecated since version 2.0.0 and should not be used in newly-written code.

-

Parameters

+

Parameters

@@ -155,13 +339,13 @@ hb_set_invert ( - - + +

set

a set.

font

a font.

 
-

Since: 0.9.10

+

Since: 0.9.2

+
+
+

HB_OT_VAR_NO_AXIS_INDEX

+
#define HB_OT_VAR_NO_AXIS_INDEX		0xFFFFFFFFu
+
+

HB_OT_VAR_NO_AXIS_INDEX has been deprecated since version 2.2.0 and should not be used in newly-written code.

+

Since: 1.4.2

+
+
+
+

HB_UNICODE_MAX_DECOMPOSITION_LEN

+
#define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */
+
+

HB_UNICODE_MAX_DECOMPOSITION_LEN has been deprecated since version 2.0.0 and should not be used in newly-written code.

+

See Unicode 6.1 for details on the maximum decomposition length.

+
+
+
+

hb_font_get_glyph_h_kerning_func_t

+
typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
+
+

hb_font_get_glyph_h_kerning_func_t is deprecated and should not be used in newly-written code.

+
+
+
+

hb_font_get_glyph_v_kerning_func_t

+
typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
+
+

hb_font_get_glyph_v_kerning_func_t is deprecated and should not be used in newly-written code.

+
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-face.html b/docs/html/harfbuzz-hb-face.html index 7192ddc..25c817e 100644 --- a/docs/html/harfbuzz-hb-face.html +++ b/docs/html/harfbuzz-hb-face.html @@ -5,10 +5,10 @@ hb-face: HarfBuzz Manual - - + + - + @@ -19,8 +19,8 @@ Object Hierarchy Home -Up -Prev +Up +Prev Next
@@ -28,7 +28,7 @@

hb-face

-

hb-face

+

hb-face — Font face objects

@@ -187,6 +187,46 @@ hb_face_set_user_data () + + +void + + +hb_face_collect_unicodes () + + + + +void + + +hb_face_collect_variation_selectors () + + + + +void + + +hb_face_collect_variation_unicodes () + + + + +hb_face_t * + + +hb_face_builder_create () + + + + +hb_bool_t + + +hb_face_builder_add_table () + +
@@ -205,12 +245,21 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ╰── hb_face_t
 
+

Includes

+
#include <hb.h>
+
+
+

Description

+

Font face is objects represent a single face in a font family. +More exactly, a font face represents a single face in a binary font file. +Font faces are typically built from a binary blob and a face index. +Font faces are used to create fonts.

Functions

@@ -218,6 +267,28 @@

hb_face_count ()

unsigned int
 hb_face_count (hb_blob_t *blob);
+

Get number of faces in a blob.

+
+

Parameters

+
+++++ + + + + + +

blob

a blob.

 
+
+
+

Returns

+

Number of faces in blob +

+
+

Since: 1.7.7


@@ -299,7 +370,7 @@ hb_face_get_empty (void

hb_face_get_table_tags ()

unsigned int
-hb_face_get_table_tags (hb_face_t *face,
+hb_face_get_table_tags (const hb_face_t *face,
                         unsigned int start_offset,
                         unsigned int *table_count,
                         hb_tag_t *table_tags);
@@ -312,11 +383,29 @@ hb_face_get_table_tags ( - + +

face

a face.

  - + + +

start_offset

+

index of first tag to return.

+  + + +

table_count

+

input length of table_tags +array, output number of items written.

+  + + +

table_tags

+

array to write tags into.

+  + +
@@ -329,7 +418,7 @@ hb_face_get_table_tags (

hb_face_get_glyph_count ()

unsigned int
-hb_face_get_glyph_count (hb_face_t *face);
+hb_face_get_glyph_count (const hb_face_t *face);

Parameters

@@ -351,7 +440,7 @@ hb_face_get_glyph_count (

hb_face_get_index ()

unsigned int
-hb_face_get_index (hb_face_t *face);
+hb_face_get_index (const hb_face_t *face);

Parameters

@@ -373,7 +462,7 @@ hb_face_get_index (

hb_face_get_upem ()

unsigned int
-hb_face_get_upem (hb_face_t *face);
+hb_face_get_upem (const hb_face_t *face);

Parameters

@@ -395,7 +484,7 @@ hb_face_get_upem (

hb_face_get_user_data ()

void *
-hb_face_get_user_data (hb_face_t *face,
+hb_face_get_user_data (const hb_face_t *face,
                        hb_user_data_key_t *key);

[skip]

@@ -424,7 +513,7 @@ hb_face_get_user_data (

hb_face_is_immutable ()

hb_bool_t
-hb_face_is_immutable (hb_face_t *face);
+hb_face_is_immutable (const hb_face_t *face);

Parameters

@@ -518,7 +607,7 @@ hb_face_reference_blob (

hb_face_reference_table ()

hb_blob_t *
-hb_face_reference_table (hb_face_t *face,
+hb_face_reference_table (const hb_face_t *face,
                          hb_tag_t tag);

Parameters

@@ -638,6 +727,130 @@ hb_face_set_user_data (Since: 0.9.2

+
+
+

hb_face_collect_unicodes ()

+
void
+hb_face_collect_unicodes (hb_face_t *face,
+                          hb_set_t *out);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

font face.

 

out

set to add Unicode characters covered by face +to.

 
+
+

Since: 1.9.0

+
+
+
+

hb_face_collect_variation_selectors ()

+
void
+hb_face_collect_variation_selectors (hb_face_t *face,
+                                     hb_set_t *out);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

font face.

 

out

set to add Variation Selector characters covered by face +to.

 
+
+

Since: 1.9.0

+
+
+
+

hb_face_collect_variation_unicodes ()

+
void
+hb_face_collect_variation_unicodes (hb_face_t *face,
+                                    hb_codepoint_t variation_selector,
+                                    hb_set_t *out);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

font face.

 

out

set to add Unicode characters for variation_selector +covered by face +to.

 
+
+

Since: 1.9.0

+
+
+
+

hb_face_builder_create ()

+
hb_face_t *
+hb_face_builder_create (void);
+

Creates a hb_face_t that can be used with hb_face_builder_add_table(). +After tables are added to the face, it can be compiled to a binary +font file by calling hb_face_reference_blob().

+
+

Returns

+

New face.

+

[transfer full]

+
+

Since: 1.9.0

+
+
+
+

hb_face_builder_add_table ()

+
hb_bool_t
+hb_face_builder_add_table (hb_face_t *face,
+                           hb_tag_t tag,
+                           hb_blob_t *blob);
+

Add table for tag + with data provided by blob + to the face. face + must +be created using hb_face_builder_create().

+

Since: 1.9.0

+

Types and Values

@@ -649,6 +862,6 @@ hb_face_set_user_data ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-font.html b/docs/html/harfbuzz-hb-font.html index 21e08e2..10c7d9e 100644 --- a/docs/html/harfbuzz-hb-font.html +++ b/docs/html/harfbuzz-hb-font.html @@ -5,10 +5,10 @@ hb-font: HarfBuzz Manual - + - - + + @@ -19,16 +19,16 @@
Object Hierarchy Home -Up +Up Prev -Next +Next

hb-font

-

hb-font

+

hb-font — Font objects

@@ -165,7 +165,7 @@ void -hb_font_funcs_set_glyph_h_kerning_func () +hb_font_funcs_set_glyph_h_advances_func () @@ -197,7 +197,7 @@ void -hb_font_funcs_set_glyph_v_kerning_func () +hb_font_funcs_set_glyph_v_advances_func () @@ -218,6 +218,14 @@ +void + + +hb_font_funcs_set_nominal_glyphs_func () + + + + hb_bool_t @@ -274,6 +282,22 @@ +void + + +hb_font_get_glyph_advances_for_direction () + + + + +void + + +(*hb_font_get_glyph_advances_func_t) () + + + + hb_bool_t @@ -346,10 +370,10 @@ -hb_position_t +void -hb_font_get_glyph_h_kerning () +hb_font_get_glyph_h_advances () @@ -362,22 +386,6 @@ -void - - -hb_font_get_glyph_kerning_for_direction () - - - - -hb_position_t - - -(*hb_font_get_glyph_kerning_func_t) () - - - - hb_bool_t @@ -418,10 +426,10 @@ -hb_position_t +void -hb_font_get_glyph_v_kerning () +hb_font_get_glyph_v_advances () @@ -740,7 +748,7 @@ typedef -hb_font_get_glyph_h_kerning_func_t +hb_font_get_glyph_h_advances_func_t typedef @@ -752,7 +760,7 @@ typedef -hb_font_get_glyph_v_kerning_func_t +hb_font_get_glyph_v_advances_func_t typedef @@ -779,13 +787,22 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ├── hb_font_funcs_t
     ╰── hb_font_t
 
+

Includes

+
#include <hb.h>
+
+
+

Description

+

Font objects represent a font face at a certain size and other +parameters (pixels per EM, points per EM, variation settings.) +Fonts are created from font faces, and are used as input to +hb_shape() among other things.

Functions

@@ -1182,15 +1199,15 @@ hb_font_funcs_set_glyph_h_advance_func

-

hb_font_funcs_set_glyph_h_kerning_func ()

+

hb_font_funcs_set_glyph_h_advances_func ()

void
-hb_font_funcs_set_glyph_h_kerning_func
+hb_font_funcs_set_glyph_h_advances_func
                                (hb_font_funcs_t *ffuncs,
-                                hb_font_get_glyph_h_kerning_func_t func,
+                                hb_font_get_glyph_h_advances_func_t func,
                                 void *user_data,
                                 hb_destroy_func_t destroy);
-

Parameters

+

Parameters

@@ -1211,7 +1228,7 @@ hb_font_funcs_set_glyph_h_kerning_func
-

Since: 0.9.2

+

Since: 1.8.6


@@ -1312,15 +1329,15 @@ hb_font_funcs_set_glyph_v_advance_func

-

hb_font_funcs_set_glyph_v_kerning_func ()

+

hb_font_funcs_set_glyph_v_advances_func ()

void
-hb_font_funcs_set_glyph_v_kerning_func
+hb_font_funcs_set_glyph_v_advances_func
                                (hb_font_funcs_t *ffuncs,
-                                hb_font_get_glyph_v_kerning_func_t func,
+                                hb_font_get_glyph_v_advances_func_t func,
                                 void *user_data,
                                 hb_destroy_func_t destroy);
-

Parameters

+

Parameters

@@ -1341,7 +1358,7 @@ hb_font_funcs_set_glyph_v_kerning_func
-

Since: 0.9.2

+

Since: 1.8.6


@@ -1409,6 +1426,38 @@ hb_font_funcs_set_nominal_glyph_func ( +

hb_font_funcs_set_nominal_glyphs_func ()

+
void
+hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs,
+                                       hb_font_get_nominal_glyphs_func_t func,
+                                       void *user_data,
+                                       hb_destroy_func_t destroy);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

ffuncs

font functions.

 

func

.

[closure user_data][destroy destroy][scope notified]
+
+

Since: 2.0.0

+
+
+

hb_font_funcs_set_user_data ()

hb_bool_t
 hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs,
@@ -1587,6 +1636,48 @@ hb_font_get_glyph_advance_for_direction
 

+

hb_font_get_glyph_advances_for_direction ()

+
void
+hb_font_get_glyph_advances_for_direction
+                               (hb_font_t *font,
+                                hb_direction_t direction,
+                                unsigned int count,
+                                const hb_codepoint_t *first_glyph,
+                                unsigned  glyph_stride,
+                                hb_position_t *first_advance,
+                                unsigned  advance_stride);
+
+

Parameters

+
+++++ + + + + + +

font

a font.

 
+
+

Since: 1.8.6

+
+
+
+

hb_font_get_glyph_advances_func_t ()

+
void
+(*hb_font_get_glyph_advances_func_t) (hb_font_t *font,
+                                      void *font_data,
+                                      unsigned int count,
+                                      const hb_codepoint_t *first_glyph,
+                                      unsigned  glyph_stride,
+                                      hb_position_t *first_advance,
+                                      unsigned  advance_stride,
+                                      void *user_data);
+
+
+

hb_font_get_glyph_contour_point ()

hb_bool_t
 hb_font_get_glyph_contour_point (hb_font_t *font,
@@ -1820,13 +1911,16 @@ hb_font_get_glyph_h_advance (
-

hb_font_get_glyph_h_kerning ()

-
hb_position_t
-hb_font_get_glyph_h_kerning (hb_font_t *font,
-                             hb_codepoint_t left_glyph,
-                             hb_codepoint_t right_glyph);
+

hb_font_get_glyph_h_advances ()

+
void
+hb_font_get_glyph_h_advances (hb_font_t *font,
+                              unsigned int count,
+                              const hb_codepoint_t *first_glyph,
+                              unsigned  glyph_stride,
+                              hb_position_t *first_advance,
+                              unsigned  advance_stride);
-

Parameters

+

Parameters

@@ -1840,7 +1934,7 @@ hb_font_get_glyph_h_kerning (Since: 0.9.2

+

Since: 1.8.6


@@ -1881,56 +1975,6 @@ hb_font_get_glyph_h_origin ( -

hb_font_get_glyph_kerning_for_direction ()

-
void
-hb_font_get_glyph_kerning_for_direction
-                               (hb_font_t *font,
-                                hb_codepoint_t first_glyph,
-                                hb_codepoint_t second_glyph,
-                                hb_direction_t direction,
-                                hb_position_t *x,
-                                hb_position_t *y);
-
-

Parameters

-
----- - - - - - - - - - - - - - - - - - -

font

a font.

 

x

.

[out]

y

.

[out]
-
-

Since: 0.9.2

-
-
-
-

hb_font_get_glyph_kerning_func_t ()

-
hb_position_t
-(*hb_font_get_glyph_kerning_func_t) (hb_font_t *font,
-                                     void *font_data,
-                                     hb_codepoint_t first_glyph,
-                                     hb_codepoint_t second_glyph,
-                                     void *user_data);
-
-
-

hb_font_get_glyph_name ()

hb_bool_t
 hb_font_get_glyph_name (hb_font_t *font,
@@ -2047,13 +2091,16 @@ hb_font_get_glyph_v_advance (
-

hb_font_get_glyph_v_kerning ()

-
hb_position_t
-hb_font_get_glyph_v_kerning (hb_font_t *font,
-                             hb_codepoint_t top_glyph,
-                             hb_codepoint_t bottom_glyph);
+

hb_font_get_glyph_v_advances ()

+
void
+hb_font_get_glyph_v_advances (hb_font_t *font,
+                              unsigned int count,
+                              const hb_codepoint_t *first_glyph,
+                              unsigned  glyph_stride,
+                              hb_position_t *first_advance,
+                              unsigned  advance_stride);
-

Parameters

+

Parameters

@@ -2067,7 +2114,7 @@ hb_font_get_glyph_v_kerning (Since: 0.9.2

+

Since: 1.8.6


@@ -2653,7 +2700,8 @@ hb_font_set_ppem (void hb_font_set_ptem (hb_font_t *font, float ptem); -

Sets "point size" of the font.

+

Sets "point size" of the font. Set to 0 to unset.

+

There are 72 points in an inch.

Parameters

@@ -2662,11 +2710,18 @@ hb_font_set_ptem ( - + + - + + + + + + +

font

a font.

 

ptem

font size in points.

 

Since: 1.6.0

@@ -2893,11 +2948,18 @@ hb_font_get_extents_for_direction ( - + +

font

a font.

  - + + +

extents

+

.

+[out] + +

Since: 1.1.3

@@ -2908,7 +2970,7 @@ hb_font_get_extents_for_direction (hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data, - hb_font_extents_t *metrics, + hb_font_extents_t *extents, void *user_data);
@@ -2987,8 +3049,8 @@ hb_font_get_v_extents ( -

hb_font_get_glyph_h_kerning_func_t

-
typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
+

hb_font_get_glyph_h_advances_func_t

+
typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
 

@@ -3005,8 +3067,8 @@ hb_font_get_v_extents ( -

hb_font_get_glyph_v_kerning_func_t

-
typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
+

hb_font_get_glyph_v_advances_func_t

+
typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
 

@@ -3046,6 +3108,6 @@ hb_font_get_v_extents ( -
Generated by GTK-Doc V1.27.1 +
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ft.html b/docs/html/harfbuzz-hb-ft.html index c2ad492..79f3331 100644 --- a/docs/html/harfbuzz-hb-ft.html +++ b/docs/html/harfbuzz-hb-ft.html @@ -5,10 +5,10 @@ hb-ft: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@
Description Home -Up -Prev -Next +Up +Prev +Next

hb-ft

-

hb-ft

+

hb-ft — FreeType integration

@@ -123,7 +123,14 @@
+

Includes

+
#include <hb-ft.h>
+
+
+

Description

+

Functions for using HarfBuzz with the FreeType library to provide face and +font data.

Functions

@@ -257,6 +264,6 @@ hb_ft_font_set_funcs ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-glib.html b/docs/html/harfbuzz-hb-glib.html index 5db6131..b4f56a4 100644 --- a/docs/html/harfbuzz-hb-glib.html +++ b/docs/html/harfbuzz-hb-glib.html @@ -5,10 +5,10 @@ hb-glib: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@
Description Home -Up -Prev -Next +Up +Prev +Next

hb-glib

-

hb-glib

+

hb-glib — GLib integration

@@ -75,7 +75,13 @@
+

Includes

+
#include <hb-glib.h>
+
+
+

Description

+

Functions for using HarfBuzz with the GLib library to provide Unicode data.

Functions

@@ -109,6 +115,6 @@ hb_glib_blob_create (GBytes
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-gobject.html b/docs/html/harfbuzz-hb-gobject.html index e42ad96..9e1a2a1 100644 --- a/docs/html/harfbuzz-hb-gobject.html +++ b/docs/html/harfbuzz-hb-gobject.html @@ -5,10 +5,10 @@ hb-gobject: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@ Description Home -Up -Prev -Next +Up +Prev +Next

hb-gobject

-

hb-gobject

+

hb-gobject — GObject integration

@@ -140,6 +140,14 @@ GType +hb_gobject_map_get_type () + + + + +GType + + hb_gobject_memory_mode_get_type () @@ -148,6 +156,14 @@ GType +hb_gobject_ot_color_palette_flags_get_type () + + + + +GType + + hb_gobject_ot_layout_glyph_class_get_type () @@ -348,10 +364,18 @@ #define +HB_GOBJECT_TYPE_MAP + + +#define HB_GOBJECT_TYPE_MEMORY_MODE #define +HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS + + +#define HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS @@ -426,7 +450,14 @@
+

Includes

+
#include <hb-gobject.h>
+
+
+

Description

+

Functions for using HarfBuzz with the GObject library to provide +type data.

Functions

@@ -441,19 +472,19 @@ hb_gobject_blob_get_type (void

hb_gobject_buffer_content_type_get_type ()

GType
 hb_gobject_buffer_content_type_get_type
-                               (void);
+ ();

hb_gobject_buffer_diff_flags_get_type ()

GType
-hb_gobject_buffer_diff_flags_get_type (void);
+hb_gobject_buffer_diff_flags_get_type ();

hb_gobject_buffer_flags_get_type ()

GType
-hb_gobject_buffer_flags_get_type (void);
+hb_gobject_buffer_flags_get_type ();

@@ -467,20 +498,20 @@ hb_gobject_buffer_get_type (void<

hb_gobject_buffer_serialize_flags_get_type ()

GType
 hb_gobject_buffer_serialize_flags_get_type
-                               (void);
+ ();

hb_gobject_buffer_serialize_format_get_type ()

GType
 hb_gobject_buffer_serialize_format_get_type
-                               (void);
+ ();

hb_gobject_direction_get_type ()

GType
-hb_gobject_direction_get_type (void);
+hb_gobject_direction_get_type ();

@@ -507,26 +538,39 @@ hb_gobject_font_get_type (void

hb_gobject_glyph_flags_get_type ()

GType
-hb_gobject_glyph_flags_get_type (void);
+hb_gobject_glyph_flags_get_type (); +
+
+
+

hb_gobject_map_get_type ()

+
GType
+hb_gobject_map_get_type (void);

hb_gobject_memory_mode_get_type ()

GType
-hb_gobject_memory_mode_get_type (void);
+hb_gobject_memory_mode_get_type (); +
+
+
+

hb_gobject_ot_color_palette_flags_get_type ()

+
GType
+hb_gobject_ot_color_palette_flags_get_type
+                               ();

hb_gobject_ot_layout_glyph_class_get_type ()

GType
 hb_gobject_ot_layout_glyph_class_get_type
-                               (void);
+ ();

hb_gobject_ot_math_constant_get_type ()

GType
-hb_gobject_ot_math_constant_get_type (void);
+hb_gobject_ot_math_constant_get_type ();

@@ -540,7 +584,7 @@ hb_gobject_ot_math_glyph_part_get_type

hb_gobject_ot_math_glyph_part_flags_get_type ()

GType
 hb_gobject_ot_math_glyph_part_flags_get_type
-                               (void);
+ ();

@@ -553,13 +597,13 @@ hb_gobject_ot_math_glyph_variant_get_type

hb_gobject_ot_math_kern_get_type ()

GType
-hb_gobject_ot_math_kern_get_type (void);
+hb_gobject_ot_math_kern_get_type ();

hb_gobject_script_get_type ()

GType
-hb_gobject_script_get_type (void);
+hb_gobject_script_get_type ();

@@ -572,7 +616,7 @@ hb_gobject_shape_plan_get_type (v

hb_gobject_unicode_combining_class_get_type ()

GType
 hb_gobject_unicode_combining_class_get_type
-                               (void);
+ ();

@@ -586,14 +630,14 @@ hb_gobject_unicode_funcs_get_type (

hb_gobject_unicode_general_category_get_type ()

GType
 hb_gobject_unicode_general_category_get_type
-                               (void);
+ ();

hb_gobject_buffer_cluster_level_get_type ()

GType
 hb_gobject_buffer_cluster_level_get_type
-                               (void);
+ ();

@@ -708,12 +752,24 @@ hb_gobject_user_data_key_get_type ( +

HB_GOBJECT_TYPE_MAP

+
#define HB_GOBJECT_TYPE_MAP (hb_gobject_map_get_type ())
+
+
+
+

HB_GOBJECT_TYPE_MEMORY_MODE

#define HB_GOBJECT_TYPE_MEMORY_MODE (hb_gobject_memory_mode_get_type ())
 

+

HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS

+
#define HB_GOBJECT_TYPE_OT_COLOR_PALETTE_FLAGS (hb_gobject_ot_color_palette_flags_get_type ())
+
+
+
+

HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS

#define HB_GOBJECT_TYPE_OT_LAYOUT_GLYPH_CLASS (hb_gobject_ot_layout_glyph_class_get_type ())
 
@@ -823,6 +879,6 @@ hb_gobject_user_data_key_get_type ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-graphite2.html b/docs/html/harfbuzz-hb-graphite2.html index 88904e5..2fdd621 100644 --- a/docs/html/harfbuzz-hb-graphite2.html +++ b/docs/html/harfbuzz-hb-graphite2.html @@ -5,10 +5,10 @@ hb-graphite2: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@ Description Home -Up -Prev -Next +Up +Prev +Next

hb-graphite2

-

hb-graphite2

+

hb-graphite2 — Graphite2 integration

@@ -38,24 +38,14 @@ - - + gr_face * hb_graphite2_face_get_gr_face () - - - -gr_font * - - -hb_graphite2_font_get_gr_font () - - - +
@@ -72,7 +62,13 @@
+

Includes

+
#include <hb-graphite2.h>
+
+
+

Description

+

Functions for using HarfBuzz with the Graphite2 fonts.

Functions

@@ -81,13 +77,6 @@
gr_face *
 hb_graphite2_face_get_gr_face (hb_face_t *face);
-
-
-

hb_graphite2_font_get_gr_font ()

-
gr_font *
-hb_graphite2_font_get_gr_font (hb_font_t *font);
-

hb_graphite2_font_get_gr_font is deprecated and should not be used in newly-written code.

-

Types and Values

@@ -99,6 +88,6 @@ hb_graphite2_font_get_gr_font (
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-icu.html b/docs/html/harfbuzz-hb-icu.html index 25a5cd6..68fa6aa 100644 --- a/docs/html/harfbuzz-hb-icu.html +++ b/docs/html/harfbuzz-hb-icu.html @@ -5,10 +5,10 @@ hb-icu: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@
Description Home -Up -Prev -Next +Up +Prev +Next

hb-icu

-

hb-icu

+

hb-icu — ICU integration

@@ -67,7 +67,13 @@
+

Includes

+
#include <hb-icu.h>
+
+
+

Description

+

Functions for using HarfBuzz with the ICU library to provide Unicode data.

Functions

@@ -94,6 +100,6 @@ hb_icu_script_to_script (UScriptC
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-map.html b/docs/html/harfbuzz-hb-map.html new file mode 100644 index 0000000..d5f0e4b --- /dev/null +++ b/docs/html/harfbuzz-hb-map.html @@ -0,0 +1,526 @@ + + + + +hb-map: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hb-map

+

hb-map — Object representing integer to integer mapping

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+hb_bool_t + +hb_map_allocation_successful () +
+void + +hb_map_clear () +
+hb_map_t * + +hb_map_create () +
+void + +hb_map_del () +
+void + +hb_map_destroy () +
+hb_codepoint_t + +hb_map_get () +
+hb_map_t * + +hb_map_get_empty () +
unsigned int + +hb_map_get_population () +
+void * + +hb_map_get_user_data () +
+hb_bool_t + +hb_map_has () +
+hb_bool_t + +hb_map_is_empty () +
+hb_map_t * + +hb_map_reference () +
+void + +hb_map_set () +
+hb_bool_t + +hb_map_set_user_data () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
#defineHB_MAP_VALUE_INVALID
typedefhb_map_t
+
+
+

Object Hierarchy

+
    GBoxed
+    ╰── hb_map_t
+
+
+
+

Includes

+
#include <hb.h>
+
+
+
+

Description

+

Map objects are integer-to-integer hash-maps. Currently they are +not used in the HarfBuzz public API, but are provided for client's +use if desired.

+
+
+

Functions

+
+

hb_map_allocation_successful ()

+
hb_bool_t
+hb_map_allocation_successful (const hb_map_t *map);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_clear ()

+
void
+hb_map_clear (hb_map_t *map);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_create ()

+
hb_map_t *
+hb_map_create (void);
+

[Xconstructor]

+
+

Returns

+

.

+

[transfer full]

+
+

Since: 1.7.7

+
+
+
+

hb_map_del ()

+
void
+hb_map_del (hb_map_t *map,
+            hb_codepoint_t key);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_destroy ()

+
void
+hb_map_destroy (hb_map_t *map);
+

[skip]

+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_get ()

+
hb_codepoint_t
+hb_map_get (const hb_map_t *map,
+            hb_codepoint_t key);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_get_empty ()

+
hb_map_t *
+hb_map_get_empty (void);
+
+

Returns

+

.

+

[transfer full]

+
+

Since: 1.7.7

+
+
+
+

hb_map_get_population ()

+
unsigned int
+hb_map_get_population (const hb_map_t *map);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_get_user_data ()

+
void *
+hb_map_get_user_data (hb_map_t *map,
+                      hb_user_data_key_t *key);
+

[skip]

+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+
+

Returns

+

.

+

[transfer none]

+
+

Since: 1.7.7

+
+
+
+

hb_map_has ()

+
hb_bool_t
+hb_map_has (const hb_map_t *map,
+            hb_codepoint_t key);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_is_empty ()

+
hb_bool_t
+hb_map_is_empty (const hb_map_t *map);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_reference ()

+
hb_map_t *
+hb_map_reference (hb_map_t *map);
+

[skip]

+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+
+

Returns

+

.

+

[transfer full]

+
+

Since: 1.7.7

+
+
+
+

hb_map_set ()

+
void
+hb_map_set (hb_map_t *map,
+            hb_codepoint_t key,
+            hb_codepoint_t value);
+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

hb_map_set_user_data ()

+
hb_bool_t
+hb_map_set_user_data (hb_map_t *map,
+                      hb_user_data_key_t *key,
+                      void *data,
+                      hb_destroy_func_t destroy,
+                      hb_bool_t replace);
+

[skip]

+
+

Parameters

+
+++++ + + + + + +

map

a map.

 
+
+

Since: 1.7.7

+
+
+
+

Types and Values

+
+

HB_MAP_VALUE_INVALID

+
#define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)
+
+
+
+
+

hb_map_t

+
typedef struct hb_map_t hb_map_t;
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-color.html b/docs/html/harfbuzz-hb-ot-color.html new file mode 100644 index 0000000..c7bc734 --- /dev/null +++ b/docs/html/harfbuzz-hb-ot-color.html @@ -0,0 +1,723 @@ + + + + +hb-ot-color: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hb-ot-color

+

hb-ot-color — OpenType Color Fonts

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define +HB_COLOR() +
#define +hb_color_get_alpha() +
#define +hb_color_get_blue() +
#define +hb_color_get_green() +
#define +hb_color_get_red() +
unsigned int + +hb_ot_color_glyph_get_layers () +
+hb_blob_t * + +hb_ot_color_glyph_reference_png () +
+hb_blob_t * + +hb_ot_color_glyph_reference_svg () +
+hb_bool_t + +hb_ot_color_has_layers () +
+hb_bool_t + +hb_ot_color_has_palettes () +
+hb_bool_t + +hb_ot_color_has_png () +
+hb_bool_t + +hb_ot_color_has_svg () +
+hb_ot_name_id_t + +hb_ot_color_palette_color_get_name_id () +
unsigned int + +hb_ot_color_palette_get_colors () +
unsigned int + +hb_ot_color_palette_get_count () +
+hb_ot_color_palette_flags_t + +hb_ot_color_palette_get_flags () +
+hb_ot_name_id_t + +hb_ot_color_palette_get_name_id () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + +
typedefhb_color_t
enumhb_ot_color_palette_flags_t
+
+
+

Object Hierarchy

+
    GFlags
+    ╰── hb_ot_color_palette_flags_t
+
+
+
+

Includes

+
#include <hb-ot.h>
+
+
+
+

Description

+

Functions for fetching color-font information from OpenType font faces.

+
+
+

Functions

+
+

HB_COLOR()

+
#define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
+
+
+
+
+

hb_color_get_alpha()

+
#define hb_color_get_alpha(color) ((color) & 0xFF)
+
+

Since: 2.1.0

+
+
+
+

hb_color_get_blue()

+
#define hb_color_get_blue(color) (((color) >> 24) & 0xFF)
+
+

Since: 2.1.0

+
+
+
+

hb_color_get_green()

+
#define hb_color_get_green(color) (((color) >> 16) & 0xFF)
+
+

Since: 2.1.0

+
+
+
+

hb_color_get_red()

+
#define hb_color_get_red(color)		(((color) >> 8) & 0xFF)
+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_glyph_get_layers ()

+
unsigned int
+hb_ot_color_glyph_get_layers (hb_face_t *face,
+                              hb_codepoint_t glyph,
+                              unsigned int start_offset,
+                              unsigned int *count,
+                              hb_ot_color_layer_t *layers);
+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

face

a font face.

 

glyph

a layered color glyph id.

 

start_offset

starting offset of layers.

 

count

gets number of layers available to be written on buffer +and returns number of written layers.

[inout][optional]

layers

layers buffer to buffer.

[array length=count][out][optional]
+
+
+

Returns

+

Total number of layers a layered color glyph have.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_glyph_reference_png ()

+
hb_blob_t *
+hb_ot_color_glyph_reference_png (hb_font_t *font,
+                                 hb_codepoint_t glyph);
+

Get PNG image for a glyph.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

font

a font object, not face. upem should be set on +that font object if one wants to get optimal png blob, otherwise +return the biggest one

 

glyph

a glyph index.

 
+
+
+

Returns

+

respective PNG blob of the glyph, if available.

+

[transfer full]

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_glyph_reference_svg ()

+
hb_blob_t *
+hb_ot_color_glyph_reference_svg (hb_face_t *face,
+                                 hb_codepoint_t glyph);
+

Get SVG document for a glyph. The blob may be either plain text or gzip-encoded.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

a font face.

 

glyph

a svg glyph index.

 
+
+
+

Returns

+

respective svg blob of the glyph, if available.

+

[transfer full]

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_has_layers ()

+
hb_bool_t
+hb_ot_color_has_layers (hb_face_t *face);
+
+

Parameters

+
+++++ + + + + + +

face

a font face.

 
+
+
+

Returns

+

whether COLR table is available.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_has_palettes ()

+
hb_bool_t
+hb_ot_color_has_palettes (hb_face_t *face);
+
+

Parameters

+
+++++ + + + + + +

face

a font face.

 
+
+
+

Returns

+

whether CPAL table is available.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_has_png ()

+
hb_bool_t
+hb_ot_color_has_png (hb_face_t *face);
+

Check whether face + has PNG glyph images (either CBDT or sbix tables).

+

Returns true if available, false otherwise.

+
+

Parameters

+
+++++ + + + + + +

face

a font face.

 
+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_has_svg ()

+
hb_bool_t
+hb_ot_color_has_svg (hb_face_t *face);
+

Check whether face + has SVG glyph images.

+

Returns true if available, false otherwise.

+
+

Parameters

+
+++++ + + + + + +

face

a font face.

 
+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_palette_color_get_name_id ()

+
hb_ot_name_id_t
+hb_ot_color_palette_color_get_name_id (hb_face_t *face,
+                                       unsigned int color_index);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

a font face.

 

color_index

palette entry index.

 
+
+
+

Returns

+

Name ID associated with a palette entry, e.g. eye color

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_palette_get_colors ()

+
unsigned int
+hb_ot_color_palette_get_colors (hb_face_t *face,
+                                unsigned int palette_index,
+                                unsigned int start_offset,
+                                unsigned int *color_count,
+                                hb_color_t *colors);
+

Retrieves the colors in a color palette.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

face

a font face.

 

palette_index

the index of the color palette whose colors +are being requested.

 

start_offset

the index of the first color being requested.

 

color_count

on input, how many colors +can be maximally stored into the colors +array; +on output, how many colors were actually stored.

[inout][optional]

colors

an array of hb_color_t records. After calling +this function, colors +will be filled with +the palette colors. If colors +is NULL, the function +will just return the number of total colors +without storing any actual colors; this can be used +for allocating a buffer of suitable size before calling +hb_ot_color_palette_get_colors() a second time.

[array length=color_count][out][optional]
+
+
+

Returns

+

the total number of colors in the palette.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_palette_get_count ()

+
unsigned int
+hb_ot_color_palette_get_count (hb_face_t *face);
+
+

Parameters

+
+++++ + + + + + +

face

a font face.

 
+
+
+

Returns

+

the number of color palettes in face +, or zero if face +has +no colors.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_palette_get_flags ()

+
hb_ot_color_palette_flags_t
+hb_ot_color_palette_get_flags (hb_face_t *face,
+                               unsigned int palette_index);
+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

a font face

 

palette_index

the index of the color palette whose flags are being requested

 
+
+
+

Returns

+

the flags for the requested color palette.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_color_palette_get_name_id ()

+
hb_ot_name_id_t
+hb_ot_color_palette_get_name_id (hb_face_t *face,
+                                 unsigned int palette_index);
+

Retrieves the name id of a color palette. For example, a color font can +have themed palettes like "Spring", "Summer", "Fall", and "Winter".

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

a font face.

 

palette_index

the index of the color palette whose name is being requested.

 
+
+
+

Returns

+

an identifier within face +'s name table. +If the requested palette has no name the result is HB_OT_NAME_ID_INVALID.

+
+

Since: 2.1.0

+
+
+
+

Types and Values

+
+

hb_color_t

+
typedef uint32_t hb_color_t;
+
+

Data type for holding color values.

+

Since: 2.1.0

+
+
+
+

enum hb_ot_color_palette_flags_t

+
+

Members

+
+++++ + + + + + + + + + + + + + + + + + +

HB_OT_COLOR_PALETTE_FLAG_DEFAULT

+

default indicating that there is nothing special + to note about a color palette.

+
 

HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND

+

flag indicating that the color + palette is appropriate to use when displaying the font on a light background such as white.

+
 

HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND

+

flag indicating that the color + palette is appropriate to use when displaying the font on a dark background such as black.

+
 
+
+

Since: 2.1.0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-font.html b/docs/html/harfbuzz-hb-ot-font.html index f1254f5..02c7686 100644 --- a/docs/html/harfbuzz-hb-ot-font.html +++ b/docs/html/harfbuzz-hb-ot-font.html @@ -5,10 +5,10 @@ hb-ot-font: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@ Description Home -Up -Prev -Next +Up +Prev +Next

hb-ot-font

-

hb-ot-font

+

hb-ot-font — OpenType font implementation

@@ -49,7 +49,15 @@
+

Includes

+
#include <hb-ot.h>
+
+
+

Description

+

Functions for using OpenType fonts with hb_shape(). Not that fonts returned +by hb_font_create() default to using these functions, so most clients would +never need to call these functions directly.

Functions

@@ -65,6 +73,6 @@ hb_ot_font_set_funcs ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-layout.html b/docs/html/harfbuzz-hb-ot-layout.html index 4bab397..ce6c420 100644 --- a/docs/html/harfbuzz-hb-ot-layout.html +++ b/docs/html/harfbuzz-hb-ot-layout.html @@ -5,10 +5,10 @@ hb-ot-layout: HarfBuzz Manual - - - - + + + + @@ -19,16 +19,16 @@
Object Hierarchy Home -Up -Prev -Next +Up +Prev +Next

hb-ot-layout

-

hb-ot-layout

+

hb-ot-layout — OpenType Layout

@@ -42,6 +42,38 @@ +hb_language_t + + +hb_ot_tag_to_language () + + + + +hb_script_t + + +hb_ot_tag_to_script () + + + + +void + + +hb_ot_tags_from_script_and_language () + + + + +void + + +hb_ot_tags_to_script_and_language () + + + + void @@ -49,6 +81,21 @@ + +void + + +hb_ot_layout_collect_features () + + + +unsigned int + + +hb_ot_layout_feature_get_characters () + + + unsigned int @@ -56,6 +103,14 @@ + +hb_bool_t + + +hb_ot_layout_feature_get_name_ids () + + + unsigned int @@ -195,14 +250,6 @@ - -hb_bool_t - - -hb_ot_layout_script_find_language () - - - unsigned int @@ -214,7 +261,7 @@ hb_bool_t -hb_ot_layout_table_choose_script () +hb_ot_layout_script_select_language () @@ -226,32 +273,32 @@ - -hb_bool_t +unsigned int -hb_ot_layout_table_find_script () +hb_ot_layout_table_get_feature_tags () unsigned int -hb_ot_layout_table_get_feature_tags () +hb_ot_layout_table_get_script_tags () unsigned int -hb_ot_layout_table_get_script_tags () +hb_ot_layout_table_get_lookup_count () -unsigned int + +hb_bool_t -hb_ot_layout_table_get_lookup_count () +hb_ot_layout_table_select_script () @@ -283,6 +330,22 @@ #define +HB_OT_MAX_TAGS_PER_LANGUAGE + + +#define +HB_OT_MAX_TAGS_PER_SCRIPT + + +#define +HB_OT_TAG_DEFAULT_LANGUAGE + + +#define +HB_OT_TAG_DEFAULT_SCRIPT + + +#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX @@ -299,6 +362,10 @@ #define +HB_OT_TAG_BASE + + +#define HB_OT_TAG_GDEF @@ -322,16 +389,149 @@

Object Hierarchy

-
    GEnum
+
    GEnum
     ╰── hb_ot_layout_glyph_class_t
 
+

Includes

+
#include <hb-ot.h>
+
+
+

Description

+

Functions for querying OpenType Layout features in the font face.

Functions

+

hb_ot_tag_to_language ()

+
hb_language_t
+hb_ot_tag_to_language (hb_tag_t tag);
+
+

Returns

+

.

+

[transfer none]

+
+

Since: 0.9.2

+
+
+
+

hb_ot_tag_to_script ()

+
hb_script_t
+hb_ot_tag_to_script (hb_tag_t tag);
+
+
+
+

hb_ot_tags_from_script_and_language ()

+
void
+hb_ot_tags_from_script_and_language (hb_script_t script,
+                                     hb_language_t language,
+                                     unsigned int *script_count,
+                                     hb_tag_t *script_tags,
+                                     unsigned int *language_count,
+                                     hb_tag_t *language_tags);
+

Converts an hb_script_t and an hb_language_t to script and language tags.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

script

an hb_script_t to convert.

 

language

an hb_language_t to convert.

 

script_count

maximum number of script tags to retrieve (IN) +and actual number of script tags retrieved (OUT).

[allow-none]

script_tags

array of size at least script_count +to store the +script tag results.

[out][allow-none]

language_count

maximum number of language tags to retrieve +(IN) and actual number of language tags retrieved (OUT).

[allow-none]

language_tags

array of size at least language_count +to store +the language tag results.

[out][allow-none]
+
+

Since: 2.0.0

+
+
+
+

hb_ot_tags_to_script_and_language ()

+
void
+hb_ot_tags_to_script_and_language (hb_tag_t script_tag,
+                                   hb_tag_t language_tag,
+                                   hb_script_t *script,
+                                   hb_language_t *language);
+

Converts a script tag and a language tag to an hb_script_t and an +hb_language_t.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

script_tag

a script tag

 

language_tag

a language tag

 

script

the hb_script_t corresponding to script_tag +(OUT).

[allow-none]

language

the hb_language_t corresponding to script_tag +and +language_tag +(OUT).

[allow-none]
+
+

Since: 2.0.0

+
+
+

hb_ot_layout_collect_lookups ()

void
 hb_ot_layout_collect_lookups (hb_face_t *face,
@@ -344,6 +544,84 @@ hb_ot_layout_collect_lookups (
+

hb_ot_layout_collect_features ()

+
void
+hb_ot_layout_collect_features (hb_face_t *face,
+                               hb_tag_t table_tag,
+                               const hb_tag_t *scripts,
+                               const hb_tag_t *languages,
+                               const hb_tag_t *features,
+                               hb_set_t *feature_indexes);
+

Since: 1.8.5

+
+
+
+

hb_ot_layout_feature_get_characters ()

+
unsigned int
+hb_ot_layout_feature_get_characters (hb_face_t *face,
+                                     hb_tag_t table_tag,
+                                     unsigned int feature_index,
+                                     unsigned int start_offset,
+                                     unsigned int *char_count,
+                                     hb_codepoint_t *characters);
+

Fetches characters listed by designer under feature parameters for "Character +Variant" ("cvXX") features.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

face

hb_face_t to work upon

 

table_tag

table tag to query, "GSUB" or "GPOS".

 

feature_index

index of feature to query.

 

start_offset

In case the resulting char_count was equal to its input value, there +is a chance there were more characters on the tag so this API can be +called with an offset till resulting char_count gets to a number +lower than input buffer (or consider using just a bigger buffer for +one shot copying).

 

char_count

The count of characters for which this feature +provides glyph variants. (May be zero.).

[inout][allow-none]

characters

A buffer pointer. The Unicode codepoints +of the characters for which this feature provides glyph variants.

[out caller-allocates][array length=char_count]
+
+
+

Returns

+

Number of total sample characters in the cvXX feature.

+
+

Since: 2.0.0

+
+
+

hb_ot_layout_feature_get_lookups ()

unsigned int
 hb_ot_layout_feature_get_lookups (hb_face_t *face,
@@ -356,6 +634,84 @@ hb_ot_layout_feature_get_lookups (
 
+

hb_ot_layout_feature_get_name_ids ()

+
hb_bool_t
+hb_ot_layout_feature_get_name_ids (hb_face_t *face,
+                                   hb_tag_t table_tag,
+                                   unsigned int feature_index,
+                                   hb_ot_name_id_t *label_id,
+                                   hb_ot_name_id_t *tooltip_id,
+                                   hb_ot_name_id_t *sample_id,
+                                   unsigned int *num_named_parameters,
+                                   hb_ot_name_id_t *first_param_id);
+

Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or +"Character Variant" ('cvXX') features.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

face

hb_face_t to work upon

 

table_tag

table tag to query, "GSUB" or "GPOS".

 

feature_index

index of feature to query.

 

label_id

The ‘name’ table name ID that specifies a string +for a user-interface label for this feature. (May be NULL.).

[out][allow-none]

tooltip_id

The ‘name’ table name ID that specifies a string +that an application can use for tooltip text for this +feature. (May be NULL.).

[out][allow-none]

sample_id

The ‘name’ table name ID that specifies sample text +that illustrates the effect of this feature. (May be NULL.).

[out][allow-none]

num_named_parameters

Number of named parameters. (May be zero.).

[out][allow-none]

first_param_id

The first ‘name’ table name ID used to specify +strings for user-interface labels for the feature +parameters. (Must be zero if numParameters is zero.).

[out][allow-none]
+
+
+

Returns

+

true if data found, false otherwise

+
+

Since: 2.0.0

+
+
+

hb_ot_layout_feature_with_variations_get_lookups ()

unsigned int
 hb_ot_layout_feature_with_variations_get_lookups
@@ -412,7 +768,7 @@ hb_ot_layout_get_ligature_carets (hb_face_t *face,
                               unsigned int *design_size,
                               unsigned int *subfamily_id,
-                              unsigned int *subfamily_name_id,
+                              hb_ot_name_id_t *subfamily_name_id,
                               unsigned int *range_start,
                               unsigned int *range_end);

Since: 0.9.10

@@ -528,7 +884,7 @@ hb_ot_layout_lookups_substitute_closure hb_set_t *glyphs);

Compute the transitive closure of glyphs needed for all of the provided lookups.

-

Since: 1.8.1

+

Since: 1.8.1


@@ -543,16 +899,6 @@ hb_ot_layout_lookup_would_substitute ( -

hb_ot_layout_script_find_language ()

-
hb_bool_t
-hb_ot_layout_script_find_language (hb_face_t *face,
-                                   hb_tag_t table_tag,
-                                   unsigned int script_index,
-                                   hb_tag_t language_tag,
-                                   unsigned int *language_index);
-
-
-

hb_ot_layout_script_get_language_tags ()

unsigned int
 hb_ot_layout_script_get_language_tags (hb_face_t *face,
@@ -564,13 +910,15 @@ hb_ot_layout_script_get_language_tags (
-

hb_ot_layout_table_choose_script ()

+

hb_ot_layout_script_select_language ()

hb_bool_t
-hb_ot_layout_table_choose_script (hb_face_t *face,
-                                  hb_tag_t table_tag,
-                                  const hb_tag_t *script_tags,
-                                  unsigned int *script_index,
-                                  hb_tag_t *chosen_script);
+hb_ot_layout_script_select_language (hb_face_t *face, + hb_tag_t table_tag, + unsigned int script_index, + unsigned int language_count, + const hb_tag_t *language_tags, + unsigned int *language_index);
+

Since: 2.0.0


@@ -585,15 +933,6 @@ hb_ot_layout_table_find_feature_variations

-

hb_ot_layout_table_find_script ()

-
hb_bool_t
-hb_ot_layout_table_find_script (hb_face_t *face,
-                                hb_tag_t table_tag,
-                                hb_tag_t script_tag,
-                                unsigned int *script_index);
-
-
-

hb_ot_layout_table_get_feature_tags ()

unsigned int
 hb_ot_layout_table_get_feature_tags (hb_face_t *face,
@@ -622,6 +961,18 @@ hb_ot_layout_table_get_lookup_count (
 
+

hb_ot_layout_table_select_script ()

+
hb_bool_t
+hb_ot_layout_table_select_script (hb_face_t *face,
+                                  hb_tag_t table_tag,
+                                  unsigned int script_count,
+                                  const hb_tag_t *script_tags,
+                                  unsigned int *script_index,
+                                  hb_tag_t *chosen_script);
+

Since: 2.0.0

+
+
+

hb_ot_shape_plan_collect_lookups ()

void
 hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
@@ -644,6 +995,32 @@ hb_ot_layout_language_get_required_feature_index
 

Types and Values

+

HB_OT_MAX_TAGS_PER_LANGUAGE

+
#define HB_OT_MAX_TAGS_PER_LANGUAGE 3u
+
+

Since: 2.0.0

+
+
+
+

HB_OT_MAX_TAGS_PER_SCRIPT

+
#define HB_OT_MAX_TAGS_PER_SCRIPT 3u
+
+

Since: 2.0.0

+
+
+
+

HB_OT_TAG_DEFAULT_LANGUAGE

+
#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
+
+
+
+
+

HB_OT_TAG_DEFAULT_SCRIPT

+
#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
+
+
+
+

HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX

#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu
 
@@ -668,6 +1045,12 @@ hb_ot_layout_language_get_required_feature_index

+

HB_OT_TAG_BASE

+
#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
+
+
+
+

HB_OT_TAG_GDEF

#define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
 
@@ -734,6 +1117,6 @@ hb_ot_layout_language_get_required_feature_index
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-math.html b/docs/html/harfbuzz-hb-ot-math.html index 0c85bdd..b803cef 100644 --- a/docs/html/harfbuzz-hb-ot-math.html +++ b/docs/html/harfbuzz-hb-ot-math.html @@ -5,10 +5,10 @@ hb-ot-math: HarfBuzz Manual - - - - + + + + @@ -19,16 +19,16 @@ Object Hierarchy Home -Up -Prev -Next +Up +Prev +Next

hb-ot-math

-

hb-ot-math

+

hb-ot-math — OpenType Math information

@@ -154,18 +154,24 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ├── hb_ot_math_glyph_part_t
     ╰── hb_ot_math_glyph_variant_t
-    GEnum
+    GEnum
     ├── hb_ot_math_constant_t
     ╰── hb_ot_math_kern_t
-    GFlags
+    GFlags
     ╰── hb_ot_math_glyph_part_flags_t
 
+

Includes

+
#include <hb-ot.h>
+
+
+

Description

+

Functions for fetching mathematics layout data from OpenType fonts.

Functions

@@ -956,6 +962,6 @@ to store the result

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-name.html b/docs/html/harfbuzz-hb-ot-name.html new file mode 100644 index 0000000..68e3a97 --- /dev/null +++ b/docs/html/harfbuzz-hb-ot-name.html @@ -0,0 +1,327 @@ + + + + +hb-ot-name: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hb-ot-name

+

hb-ot-name — OpenType font name information

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + +
const hb_ot_name_entry_t * + +hb_ot_name_list_names () +
unsigned int + +hb_ot_name_get_utf16 () +
unsigned int + +hb_ot_name_get_utf32 () +
unsigned int + +hb_ot_name_get_utf8 () +
+
+
+

Types and Values

+
++++ + + + + +
typedefhb_ot_name_id_t
+
+
+

Includes

+
#include <hb-ot.h>
+
+
+
+

Description

+

Functions for fetching name strings from OpenType fonts.

+
+
+

Functions

+
+

hb_ot_name_list_names ()

+
const hb_ot_name_entry_t *
+hb_ot_name_list_names (hb_face_t *face,
+                       unsigned int *num_entries);
+

Enumerates all available name IDs and language combinations. Returned +array is owned by the face + and should not be modified. It can be +used as long as face + is alive.

+
+

Parameters

+
+++++ + + + + + + + + + + + + +

face

font face.

 

num_entries

number of returned entries.

[out][allow-none]
+
+
+

Returns

+

Array of available name entries.

+

[out][transfer none][array length=num_entries]

+
+

Since: 2.1.0

+
+
+
+

hb_ot_name_get_utf16 ()

+
unsigned int
+hb_ot_name_get_utf16 (hb_face_t *face,
+                      hb_ot_name_id_t name_id,
+                      hb_language_t language,
+                      unsigned int *text_size,
+                      uint16_t *text);
+

Fetches a font name from the OpenType 'name' table. +If language + is HB_LANGUAGE_INVALID, English ("en") is assumed. +Returns string in UTF-16 encoding.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

face

font face.

 

name_id

OpenType name identifier to fetch.

 

language

language to fetch the name for.

 

text_size

input size of text +buffer, and output size of +text written to buffer.

[inout][allow-none]

text

buffer to write fetched name into.

[out caller-allocates][array length=text_size]
+
+
+

Returns

+

full length of the requested string, or 0 if not found.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_name_get_utf32 ()

+
unsigned int
+hb_ot_name_get_utf32 (hb_face_t *face,
+                      hb_ot_name_id_t name_id,
+                      hb_language_t language,
+                      unsigned int *text_size,
+                      uint32_t *text);
+

Fetches a font name from the OpenType 'name' table. +If language + is HB_LANGUAGE_INVALID, English ("en") is assumed. +Returns string in UTF-32 encoding.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

face

font face.

 

name_id

OpenType name identifier to fetch.

 

language

language to fetch the name for.

 

text_size

input size of text +buffer, and output size of +text written to buffer.

[inout][allow-none]

text

buffer to write fetched name into.

[out caller-allocates][array length=text_size]
+
+
+

Returns

+

full length of the requested string, or 0 if not found.

+
+

Since: 2.1.0

+
+
+
+

hb_ot_name_get_utf8 ()

+
unsigned int
+hb_ot_name_get_utf8 (hb_face_t *face,
+                     hb_ot_name_id_t name_id,
+                     hb_language_t language,
+                     unsigned int *text_size,
+                     char *text);
+

Fetches a font name from the OpenType 'name' table. +If language + is HB_LANGUAGE_INVALID, English ("en") is assumed. +Returns string in UTF-8 encoding.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

face

font face.

 

name_id

OpenType name identifier to fetch.

 

language

language to fetch the name for.

 

text_size

input size of text +buffer, and output size of +text written to buffer.

[inout][allow-none]

text

buffer to write fetched name into.

[out caller-allocates][array length=text_size]
+
+
+

Returns

+

full length of the requested string, or 0 if not found.

+
+

Since: 2.1.0

+
+
+
+

Types and Values

+
+

hb_ot_name_id_t

+
typedef unsigned int hb_ot_name_id_t;
+
+

An integral type representing an OpenType 'name' table name identifier. +There are predefined name IDs, as well as name IDs return from other +API. These can be used to fetch name strings from a font face.

+

Since: 2.0.0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-shape.html b/docs/html/harfbuzz-hb-ot-shape.html index f33f2a4..30ed441 100644 --- a/docs/html/harfbuzz-hb-ot-shape.html +++ b/docs/html/harfbuzz-hb-ot-shape.html @@ -5,10 +5,10 @@ hb-ot-shape: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@ Description Home -Up -Prev -Next +Up +Prev +Next

hb-ot-shape

-

hb-ot-shape

+

hb-ot-shape — OpenType shaping support

@@ -49,7 +49,13 @@
+

Includes

+
#include <hb-ot.h>
+
+
+

Description

+

Support functions for OpenType shaping related queries.

Functions

@@ -57,8 +63,8 @@

hb_ot_shape_glyphs_closure ()

void
 hb_ot_shape_glyphs_closure (hb_font_t *font,
-                            hb_buffer_t *buffer,
-                            const hb_feature_t *features,
+                            hb_buffer_t *buffer,
+                            const hb_feature_t *features,
                             unsigned int num_features,
                             hb_set_t *glyphs);

Since: 0.9.2

@@ -69,6 +75,6 @@ hb_ot_shape_glyphs_closure ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-tag.html b/docs/html/harfbuzz-hb-ot-tag.html deleted file mode 100644 index 2ebf67d..0000000 --- a/docs/html/harfbuzz-hb-ot-tag.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - -hb-ot-tag: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-
-
- - -
-

hb-ot-tag

-

hb-ot-tag

-
-
-

Functions

-
---- - - - - - - - - - - - - - - - - - - -
-hb_tag_t - -hb_ot_tag_from_language () -
-hb_language_t - -hb_ot_tag_to_language () -
-hb_script_t - -hb_ot_tag_to_script () -
-void - -hb_ot_tags_from_script () -
-
-
-

Types and Values

-
---- - - - - - - - - - - -
#defineHB_OT_TAG_DEFAULT_LANGUAGE
#defineHB_OT_TAG_DEFAULT_SCRIPT
-
-
-

Description

-
-
-

Functions

-
-

hb_ot_tag_from_language ()

-
hb_tag_t
-hb_ot_tag_from_language (hb_language_t language);
-
-
-
-

hb_ot_tag_to_language ()

-
hb_language_t
-hb_ot_tag_to_language (hb_tag_t tag);
-
-

Returns

-

.

-

[transfer none]

-
-

Since: 0.9.2

-
-
-
-

hb_ot_tag_to_script ()

-
hb_script_t
-hb_ot_tag_to_script (hb_tag_t tag);
-
-
-
-

hb_ot_tags_from_script ()

-
void
-hb_ot_tags_from_script (hb_script_t script,
-                        hb_tag_t *script_tag_1,
-                        hb_tag_t *script_tag_2);
-
-
-
-

Types and Values

-
-

HB_OT_TAG_DEFAULT_LANGUAGE

-
#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
-
-
-
-
-

HB_OT_TAG_DEFAULT_SCRIPT

-
#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
-
-
-
-
- - - \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot-var.html b/docs/html/harfbuzz-hb-ot-var.html new file mode 100644 index 0000000..b8e3fd3 --- /dev/null +++ b/docs/html/harfbuzz-hb-ot-var.html @@ -0,0 +1,345 @@ + + + + +hb-ot-var: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hb-ot-var

+

hb-ot-var — OpenType Font Variations

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+hb_bool_t + +hb_ot_var_has_data () +
+hb_bool_t + +hb_ot_var_find_axis_info () +
unsigned int + +hb_ot_var_get_axis_count () +
unsigned int + +hb_ot_var_get_axis_infos () +
unsigned int + +hb_ot_var_get_named_instance_count () +
+hb_ot_name_id_t + +hb_ot_var_named_instance_get_subfamily_name_id () +
+hb_ot_name_id_t + +hb_ot_var_named_instance_get_postscript_name_id () +
unsigned int + +hb_ot_var_named_instance_get_design_coords () +
+void + +hb_ot_var_normalize_variations () +
+void + +hb_ot_var_normalize_coords () +
+
+
+

Types and Values

+ +
+
+

Object Hierarchy

+
    GFlags
+    ╰── hb_ot_var_axis_flags_t
+
+
+
+

Includes

+
#include <hb-ot.h>
+
+
+
+

Description

+

Functions for fetching information about OpenType Variable Fonts.

+
+
+

Functions

+
+

hb_ot_var_has_data ()

+
hb_bool_t
+hb_ot_var_has_data (hb_face_t *face);
+

This function allows to verify the presence of OpenType variation data on the face.

+
+

Parameters

+
+++++ + + + + + +

face

hb_face_t to test

 
+
+
+

Returns

+

true if face has a `fvar' table and false otherwise

+
+

Since: 1.4.2

+
+
+
+

hb_ot_var_find_axis_info ()

+
hb_bool_t
+hb_ot_var_find_axis_info (hb_face_t *face,
+                          hb_tag_t axis_tag,
+                          hb_ot_var_axis_info_t *axis_info);
+

Since: 2.2.0

+
+
+
+

hb_ot_var_get_axis_count ()

+
unsigned int
+hb_ot_var_get_axis_count (hb_face_t *face);
+

Since: 1.4.2

+
+
+
+

hb_ot_var_get_axis_infos ()

+
unsigned int
+hb_ot_var_get_axis_infos (hb_face_t *face,
+                          unsigned int start_offset,
+                          unsigned int *axes_count,
+                          hb_ot_var_axis_info_t *axes_array);
+

Since: 2.2.0

+
+
+
+

hb_ot_var_get_named_instance_count ()

+
unsigned int
+hb_ot_var_get_named_instance_count (hb_face_t *face);
+
+
+
+

hb_ot_var_named_instance_get_subfamily_name_id ()

+
hb_ot_name_id_t
+hb_ot_var_named_instance_get_subfamily_name_id
+                               (hb_face_t *face,
+                                unsigned int instance_index);
+
+
+
+

hb_ot_var_named_instance_get_postscript_name_id ()

+
hb_ot_name_id_t
+hb_ot_var_named_instance_get_postscript_name_id
+                               (hb_face_t *face,
+                                unsigned int instance_index);
+
+
+
+

hb_ot_var_named_instance_get_design_coords ()

+
unsigned int
+hb_ot_var_named_instance_get_design_coords
+                               (hb_face_t *face,
+                                unsigned int instance_index,
+                                unsigned int *coords_length,
+                                float *coords);
+
+
+
+

hb_ot_var_normalize_variations ()

+
void
+hb_ot_var_normalize_variations (hb_face_t *face,
+                                const hb_variation_t *variations,
+                                unsigned int variations_length,
+                                int *coords,
+                                unsigned int coords_length);
+

Since: 1.4.2

+
+
+
+

hb_ot_var_normalize_coords ()

+
void
+hb_ot_var_normalize_coords (hb_face_t *face,
+                            unsigned int coords_length,
+                            const float *design_coords,
+                            int *normalized_coords);
+

Since: 1.4.2

+
+
+
+

Types and Values

+
+

HB_OT_TAG_VAR_AXIS_ITALIC

+
#define HB_OT_TAG_VAR_AXIS_ITALIC HB_TAG('i','t','a','l')
+
+
+
+
+

HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE

+
#define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE HB_TAG('o','p','s','z')
+
+
+
+
+

HB_OT_TAG_VAR_AXIS_SLANT

+
#define HB_OT_TAG_VAR_AXIS_SLANT HB_TAG('s','l','n','t')
+
+
+
+
+

HB_OT_TAG_VAR_AXIS_WEIGHT

+
#define HB_OT_TAG_VAR_AXIS_WEIGHT HB_TAG('w','g','h','t')
+
+
+
+
+

HB_OT_TAG_VAR_AXIS_WIDTH

+
#define HB_OT_TAG_VAR_AXIS_WIDTH HB_TAG('w','d','t','h')
+
+
+
+
+

enum hb_ot_var_axis_flags_t

+
+

Members

+
+++++ + + + + + + + + + + + + +

HB_OT_VAR_AXIS_FLAG_HIDDEN

+

The axis should not be exposed directly in user interfaces.

+
 

_HB_OT_VAR_AXIS_FLAG_MAX_VALUE

  
+
+

Since: 2.2.0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-ot.html b/docs/html/harfbuzz-hb-ot.html deleted file mode 100644 index 4af82e6..0000000 --- a/docs/html/harfbuzz-hb-ot.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - -hb-ot: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-
-
- - -
-

hb-ot

-

hb-ot

-
-
-

Description

-
-
-

Functions

-

-
-
-

Types and Values

-
-
- - - \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-set.html b/docs/html/harfbuzz-hb-set.html index d05e57d..b07920d 100644 --- a/docs/html/harfbuzz-hb-set.html +++ b/docs/html/harfbuzz-hb-set.html @@ -5,10 +5,10 @@ hb-set: HarfBuzz Manual - - - - + + + + @@ -19,16 +19,16 @@ Object Hierarchy Home -Up -Prev -Next +Up +Prev +Next

hb-set

-

hb-set

+

hb-set — Object representing a set of integers

@@ -287,12 +287,20 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ╰── hb_set_t
 
+

Includes

+
#include <hb.h>
+
+
+

Description

+

Set objects represent a mathematical set of integer values. They are +used in non-shaping API to query certain set of characters or glyphs, +or other integer values.

Functions

@@ -727,7 +735,7 @@ hb_set_is_subset (const larger_set , FALSE otherwise.

-

Since: 1.8.1

+

Since: 1.8.1


@@ -797,12 +805,12 @@ are greater than current value of last

first

-

output first codepoint in the range.

+

output first codepoint in the range.

[out]

last

-

input current last and output last codepoint in the range.

+

input current last and output last codepoint in the range.

[inout] @@ -851,7 +859,7 @@ hb_set_previous (const

Returns

whether there was a previous value.

-

Since: 1.8.0

+

Since: 1.8.0


@@ -882,12 +890,12 @@ are greater than current value of last

first

-

input current first and output first codepoint in the range.

+

input current first and output first codepoint in the range.

[inout]

last

-

output last codepoint in the range.

+

output last codepoint in the range.

[out] @@ -897,7 +905,7 @@ are greater than current value of last

Returns

whether there was a previous range.

-

Since: 1.8.0

+

Since: 1.8.0


@@ -1063,6 +1071,6 @@ hb_set_union ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-shape-plan.html b/docs/html/harfbuzz-hb-shape-plan.html index 13f235f..3986cab 100644 --- a/docs/html/harfbuzz-hb-shape-plan.html +++ b/docs/html/harfbuzz-hb-shape-plan.html @@ -5,10 +5,10 @@ hb-shape-plan: HarfBuzz Manual - - - - + + + + @@ -19,16 +19,16 @@
Object Hierarchy Home -Up -Prev -Next +Up +Prev +Next

hb-shape-plan

-

hb-shape-plan

+

hb-shape-plan — Object representing a shaping plan

@@ -145,12 +145,21 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ╰── hb_shape_plan_t
 
+

Includes

+
#include <hb.h>
+
+
+

Description

+

Shape plans are not used for shaping directly, but can be access to query +certain information about how shaping will perform given a set of input +parameters (script, language, direction, features, etc.) +Most client would not need to deal with shape plans directly.

Functions

@@ -158,8 +167,8 @@

hb_shape_plan_create ()

hb_shape_plan_t *
 hb_shape_plan_create (hb_face_t *face,
-                      const hb_segment_properties_t *props,
-                      const hb_feature_t *user_features,
+                      const hb_segment_properties_t *props,
+                      const hb_feature_t *user_features,
                       unsigned int num_user_features,
                       const char * const *shaper_list);

[Xconstructor]

@@ -197,8 +206,8 @@ hb_shape_plan_create (

hb_shape_plan_create_cached ()

hb_shape_plan_t *
 hb_shape_plan_create_cached (hb_face_t *face,
-                             const hb_segment_properties_t *props,
-                             const hb_feature_t *user_features,
+                             const hb_segment_properties_t *props,
+                             const hb_feature_t *user_features,
                              unsigned int num_user_features,
                              const char * const *shaper_list);
@@ -235,8 +244,8 @@ hb_shape_plan_create_cached (

hb_shape_plan_create2 ()

hb_shape_plan_t *
 hb_shape_plan_create2 (hb_face_t *face,
-                       const hb_segment_properties_t *props,
-                       const hb_feature_t *user_features,
+                       const hb_segment_properties_t *props,
+                       const hb_feature_t *user_features,
                        unsigned int num_user_features,
                        const int *coords,
                        unsigned int num_coords,
@@ -247,8 +256,8 @@ hb_shape_plan_create2 (

hb_shape_plan_create_cached2 ()

hb_shape_plan_t *
 hb_shape_plan_create_cached2 (hb_face_t *face,
-                              const hb_segment_properties_t *props,
-                              const hb_feature_t *user_features,
+                              const hb_segment_properties_t *props,
+                              const hb_feature_t *user_features,
                               unsigned int num_user_features,
                               const int *coords,
                               unsigned int num_coords,
@@ -283,8 +292,8 @@ hb_shape_plan_destroy (hb_bool_t
 hb_shape_plan_execute (hb_shape_plan_t *shape_plan,
                        hb_font_t *font,
-                       hb_buffer_t *buffer,
-                       const hb_feature_t *features,
+                       hb_buffer_t *buffer,
+                       const hb_feature_t *features,
                        unsigned int num_features);

Parameters

@@ -454,6 +463,6 @@ hb_shape_plan_set_user_data ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-shape.html b/docs/html/harfbuzz-hb-shape.html new file mode 100644 index 0000000..b26887c --- /dev/null +++ b/docs/html/harfbuzz-hb-shape.html @@ -0,0 +1,367 @@ + + + + +hb-shape: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+
+
+ + +
+

hb-shape

+

hb-shape — Conversion of text strings into positioned glyphs

+
+
+

Functions

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
+hb_bool_t + +hb_feature_from_string () +
+void + +hb_feature_to_string () +
+void + +hb_shape () +
+hb_bool_t + +hb_shape_full () +
const char ** + +hb_shape_list_shapers () +
+
+
+

Types and Values

+
++++ + + + + + + + + + + + + + + +
#defineHB_FEATURE_GLOBAL_END
#defineHB_FEATURE_GLOBAL_START
 hb_feature_t
+
+
+

Object Hierarchy

+
    GBoxed
+    ╰── hb_feature_t
+
+
+
+

Includes

+
#include <hb.h>
+
+
+
+

Description

+

Shaping is the central operation of HarfBuzz. Shaping operates on buffers, +which are sequences of Unicode characters that use the same font and have +the same text direction, script, and language. After shaping the buffer +contains the output glyphs and their positions.

+
+
+

Functions

+
+

hb_feature_from_string ()

+
hb_bool_t
+hb_feature_from_string (const char *str,
+                        int len,
+                        hb_feature_t *feature);
+

Parses a string into a hb_feature_t.

+

TODO: document the syntax here.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

str

a string to parse.

[array length=len][element-type uint8_t]

len

length of str +, or -1 if string is NULL terminated

 

feature

the hb_feature_t to initialize with the parsed values.

[out]
+
+
+

Returns

+

true if str +is successfully parsed, false otherwise.

+
+

Since: 0.9.5

+
+
+
+

hb_feature_to_string ()

+
void
+hb_feature_to_string (hb_feature_t *feature,
+                      char *buf,
+                      unsigned int size);
+

Converts a hb_feature_t into a NULL-terminated string in the format +understood by hb_feature_from_string(). The client in responsible for +allocating big enough size for buf +, 128 bytes is more than enough.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + +

feature

an hb_feature_t to convert

 

buf

output string.

[array length=size][out]

size

the allocated size of buf +

 
+
+

Since: 0.9.5

+
+
+
+

hb_shape ()

+
void
+hb_shape (hb_font_t *font,
+          hb_buffer_t *buffer,
+          const hb_feature_t *features,
+          unsigned int num_features);
+

Shapes buffer + using font + turning its Unicode characters content to +positioned glyphs. If features + is not NULL, it will be used to control the +features applied during shaping.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + +

font

an hb_font_t to use for shaping

 

buffer

an hb_buffer_t to shape

 

features

an array of user +specified hb_feature_t or NULL.

[array length=num_features][allow-none]

num_features

the length of features +array

 
+
+

Since: 0.9.2

+
+
+
+

hb_shape_full ()

+
hb_bool_t
+hb_shape_full (hb_font_t *font,
+               hb_buffer_t *buffer,
+               const hb_feature_t *features,
+               unsigned int num_features,
+               const char * const *shaper_list);
+

See hb_shape() for details. If shaper_list + is not NULL, the specified +shapers will be used in the given order, otherwise the default shapers list +will be used.

+
+

Parameters

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

font

an hb_font_t to use for shaping

 

buffer

an hb_buffer_t to shape

 

features

an array of user +specified hb_feature_t or NULL.

[array length=num_features][allow-none]

num_features

the length of features +array

 

shaper_list

a NULL-terminated +array of shapers to use or NULL.

[array zero-terminated=1][allow-none]
+
+
+

Returns

+

false if all shapers failed, true otherwise

+
+

Since: 0.9.2

+
+
+
+

hb_shape_list_shapers ()

+
const char **
+hb_shape_list_shapers (void);
+

Retrieves the list of shapers supported by HarfBuzz.

+
+

Returns

+

an array of +constant strings.

+

[transfer none][array zero-terminated=1]

+
+

Since: 0.9.2

+
+
+
+

Types and Values

+
+

HB_FEATURE_GLOBAL_END

+
#define HB_FEATURE_GLOBAL_END ((unsigned int) -1)
+
+

Since: 2.0.0

+
+
+
+

HB_FEATURE_GLOBAL_START

+
#define HB_FEATURE_GLOBAL_START 0
+
+

Since: 2.0.0

+
+
+
+

hb_feature_t

+
typedef struct {
+  hb_tag_t      tag;
+  uint32_t      value;
+  unsigned int  start;
+  unsigned int  end;
+} hb_feature_t;
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/html/harfbuzz-hb-unicode.html b/docs/html/harfbuzz-hb-unicode.html index e2bc935..97f93ab 100644 --- a/docs/html/harfbuzz-hb-unicode.html +++ b/docs/html/harfbuzz-hb-unicode.html @@ -5,10 +5,10 @@ hb-unicode: HarfBuzz Manual - - - - + + + + @@ -19,16 +19,16 @@ Object Hierarchy Home -Up -Prev -Next +Up +Prev +Next

hb-unicode

-

hb-unicode

+

hb-unicode — Unicode character property access

@@ -81,13 +81,6 @@ -unsigned int - - -hb_unicode_decompose_compatibility () - - - hb_bool_t @@ -96,13 +89,6 @@ -unsigned int - - -hb_unicode_eastasian_width () - - - hb_unicode_funcs_t * @@ -195,14 +181,6 @@ void -hb_unicode_funcs_set_decompose_compatibility_func () - - - - -void - - hb_unicode_funcs_set_decompose_func () @@ -211,14 +189,6 @@ void -hb_unicode_funcs_set_eastasian_width_func () - - - - -void - - hb_unicode_funcs_set_general_category_func () @@ -307,7 +277,7 @@ #define -HB_UNICODE_MAX_DECOMPOSITION_LEN +HB_UNICODE_MAX enum @@ -326,15 +296,25 @@

Object Hierarchy

-
    GBoxed
+
    GBoxed
     ╰── hb_unicode_funcs_t
-    GEnum
+    GEnum
     ├── hb_unicode_combining_class_t
     ╰── hb_unicode_general_category_t
 
+

Includes

+
#include <hb.h>
+
+
+

Description

+

Unicode functions are used to access Unicode character properties. +Client can pass its own Unicode functions to HarfBuzz, or access +the built-in Unicode functions that come with HarfBuzz.

+

With the Unicode functions, one can query variour Unicode character +properties, such as General Category, Script, Combining Class, etc.

Functions

@@ -434,37 +414,6 @@ hb_unicode_decompose ( -

hb_unicode_decompose_compatibility ()

-
unsigned int
-hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
-                                    hb_codepoint_t u,
-                                    hb_codepoint_t *decomposed);
-
-

Parameters

-
----- - - - - - - - - - - - - -

ufuncs

Unicode functions.

 

decomposed

.

[out]
-
-

Since: 0.9.2

-
-
-

hb_unicode_decompose_func_t ()

hb_bool_t
 (*hb_unicode_decompose_func_t) (hb_unicode_funcs_t *ufuncs,
@@ -475,14 +424,6 @@ hb_unicode_decompose_compatibility (
 
-

hb_unicode_eastasian_width ()

-
unsigned int
-hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
-                            hb_codepoint_t unicode);
-

Since: 0.9.2

-
-
-

hb_unicode_funcs_create ()

hb_unicode_funcs_t *
 hb_unicode_funcs_create (hb_unicode_funcs_t *parent);
@@ -740,39 +681,6 @@ hb_unicode_funcs_set_compose_func (
-

hb_unicode_funcs_set_decompose_compatibility_func ()

-
void
-hb_unicode_funcs_set_decompose_compatibility_func
-                               (hb_unicode_funcs_t *ufuncs,
-                                hb_unicode_decompose_compatibility_func_t func,
-                                void *user_data,
-                                hb_destroy_func_t destroy);
-
-

Parameters

-
----- - - - - - - - - - - - - -

ufuncs

a Unicode function structure

 

func

.

[closure user_data][destroy destroy][scope notified]
-
-

Since: 0.9.2

-
-
-

hb_unicode_funcs_set_decompose_func ()

void
 hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
@@ -805,39 +713,6 @@ hb_unicode_funcs_set_decompose_func (
 
-

hb_unicode_funcs_set_eastasian_width_func ()

-
void
-hb_unicode_funcs_set_eastasian_width_func
-                               (hb_unicode_funcs_t *ufuncs,
-                                hb_unicode_eastasian_width_func_t func,
-                                void *user_data,
-                                hb_destroy_func_t destroy);
-
-

Parameters

-
----- - - - - - - - - - - - - -

ufuncs

a Unicode function structure

 

func

.

[closure user_data][destroy destroy][scope notified]
-
-

Since: 0.9.2

-
-
-

hb_unicode_funcs_set_general_category_func ()

void
 hb_unicode_funcs_set_general_category_func
@@ -1012,9 +887,10 @@ hb_unicode_script (
 

Types and Values

-

HB_UNICODE_MAX_DECOMPOSITION_LEN

-
#define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */
+

HB_UNICODE_MAX

+
#define HB_UNICODE_MAX 0x10FFFFu
 
+

Since: 1.9.0


@@ -1492,6 +1368,6 @@ hb_unicode_script ( -
Generated by GTK-Doc V1.27.1
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-uniscribe.html b/docs/html/harfbuzz-hb-uniscribe.html index 3d1d4d0..425ef7e 100644 --- a/docs/html/harfbuzz-hb-uniscribe.html +++ b/docs/html/harfbuzz-hb-uniscribe.html @@ -5,10 +5,10 @@ hb-uniscribe: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@ Description Home -Up -Prev -Next +Up +Prev +Next

hb-uniscribe

-

hb-uniscribe

+

hb-uniscribe — Windows integration

@@ -59,7 +59,13 @@
+

Includes

+
#include <hb-uniscribe.h>
+
+
+

Description

+

Functions for using HarfBuzz with the Windows fonts.

Functions

@@ -80,6 +86,6 @@ hb_uniscribe_font_get_logfontw (
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/harfbuzz-hb-version.html b/docs/html/harfbuzz-hb-version.html index 3180c50..00569c9 100644 --- a/docs/html/harfbuzz-hb-version.html +++ b/docs/html/harfbuzz-hb-version.html @@ -5,10 +5,10 @@ hb-version: HarfBuzz Manual - - - - + + + + @@ -18,16 +18,16 @@ Description Home -Up -Prev -Next +Up +Prev +Next

hb-version

-

hb-version

+

hb-version — Information about the version of HarfBuzz in use

@@ -99,7 +99,15 @@
+

Includes

+
#include <hb.h>
+
+
+

Description

+

These functions and macros allow accessing version of the HarfBuzz +library used at compile- as well as run-time, and to direct code +conditionally based on those versions, again, at compile- or run-time.

Functions

@@ -126,17 +134,17 @@ hb_version (unsigned int *

major

-

Library major version component.

+

Library major version component.

[out]

minor

-

Library minor version component.

+

Library minor version component.

[out]

micro

-

Library micro version component.

+

Library micro version component.

[out] @@ -170,7 +178,7 @@ hb_version_string (void

Types and Values

HB_VERSION_MAJOR

-
#define HB_VERSION_MAJOR 1
+
#define HB_VERSION_MAJOR 2
 

@@ -182,18 +190,18 @@ hb_version_string (void

HB_VERSION_MINOR

-
#define HB_VERSION_MINOR 8
+
#define HB_VERSION_MINOR 3
 

HB_VERSION_STRING

-
#define HB_VERSION_STRING "1.8.1"
+
#define HB_VERSION_STRING "2.3.1"
 
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/harfbuzz-hb.html b/docs/html/harfbuzz-hb.html deleted file mode 100644 index 6089a9e..0000000 --- a/docs/html/harfbuzz-hb.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - -hb: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-
-
- - -
-

hb

-

hb

-
-
-

Description

-
-
-

Functions

-

-
-
-

Types and Values

-
-
- - - \ No newline at end of file diff --git a/docs/html/harfbuzz.devhelp2 b/docs/html/harfbuzz.devhelp2 index c4ed6ff..ccfc846 100644 --- a/docs/html/harfbuzz.devhelp2 +++ b/docs/html/harfbuzz.devhelp2 @@ -3,15 +3,35 @@ - + + + + - - - + + + + + + + + - - + + + + + + + + + + + + + + @@ -25,12 +45,17 @@ - - + + + - + + + + + @@ -39,64 +64,166 @@ - - - - - + + + + - - - + - - - + + + + + + + - + - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -131,127 +258,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -270,6 +292,11 @@ + + + + + @@ -286,13 +313,14 @@ - + - + + @@ -300,6 +328,8 @@ + + @@ -309,16 +339,14 @@ - + - - - + @@ -358,35 +386,31 @@ - + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -417,8 +441,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -437,33 +548,29 @@ - - + - + + + + + + - - - - - - - - @@ -480,25 +587,44 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -509,18 +635,10 @@ - - - - - - - - - - - - + + + + @@ -533,7 +651,9 @@ + + @@ -564,7 +684,9 @@ + + @@ -583,15 +705,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -682,43 +993,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -785,15 +1062,307 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/hello-harfbuzz.html b/docs/html/hello-harfbuzz.html deleted file mode 100644 index edc8985..0000000 --- a/docs/html/hello-harfbuzz.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - -Hello, HarfBuzz: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-

-Hello, HarfBuzz

- -

- Here's the simplest HarfBuzz that can possibly work. We will improve - it later. -

-
  1. - Create a buffer and put your text in it. -

-
-  #include <hb.h>
-  hb_buffer_t *buf;
-  buf = hb_buffer_create();
-  hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text));
-
-
  1. - Guess the script, language and direction of the buffer. -

-
-  hb_buffer_guess_segment_properties(buf);
-
-
  1. - Create a face and a font, using FreeType for now. -

-
-  #include <hb-ft.h>
-  FT_New_Face(ft_library, font_path, index, &face)
-  hb_font_t *font = hb_ft_font_create(face);
-
-
  1. - Shape! -

-
-  hb_shape(font, buf, NULL, 0);
-
-
  1. - Get the glyph and position information. -

-
-  hb_glyph_info_t *glyph_info    = hb_buffer_get_glyph_infos(buf, &glyph_count);
-  hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count);
-
-
  1. - Iterate over each glyph. -

-
-  for (i = 0; i < glyph_count; ++i) {
-    glyphid = glyph_info[i].codepoint;
-    x_offset = glyph_pos[i].x_offset / 64.0;
-    y_offset = glyph_pos[i].y_offset / 64.0;
-    x_advance = glyph_pos[i].x_advance / 64.0;
-    y_advance = glyph_pos[i].y_advance / 64.0;
-    draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset);
-    cursor_x += x_advance;
-    cursor_y += y_advance;
-  }
-
-
  1. - Tidy up. -

-
-  hb_buffer_destroy(buf);
-  hb_font_destroy(hb_ft_font);
-
-
-

-What HarfBuzz doesn't do

-

- The code above will take a UTF8 string, shape it, and give you the - information required to lay it out correctly on a single - horizontal (or vertical) line using the font provided. That is the - extent of HarfBuzz's responsibility. -

-

- If you are implementing a text layout engine you may have other - responsibilities, that HarfBuzz will not help you with: -

-
    -
  • -

    - HarfBuzz won't help you with bidirectionality. If you want to - lay out text with mixed Hebrew and English, you will need to - ensure that the buffer provided to HarfBuzz has those - characters in the correct layout order. This will be different - from the logical order in which the Unicode text is stored. In - other words, the user will hit the keys in the following - sequence: -

    -
    -A B C [space] ג ב א [space] D E F
    -        
    -

    - but will expect to see in the output: -

    -
    -ABC אבג DEF
    -        
    -

    - This reordering is called bidi processing - ("bidi" is short for bidirectional), and there's an - algorithm as an annex to the Unicode Standard which tells you how - to reorder a string from logical order into presentation order. - Before sending your string to HarfBuzz, you may need to apply the - bidi algorithm to it. Libraries such as ICU and fribidi can do - this for you. -

    -
  • -
  • - HarfBuzz won't help you with text that contains different font - properties. For instance, if you have the string "a - huge breakfast", and you expect - "huge" to be italic, you will need to send three - strings to HarfBuzz: a, in your Roman font; - huge using your italic font; and - breakfast using your Roman font again. - Similarly if you change font, font size, script, language or - direction within your string, you will need to shape each run - independently and then output them independently. HarfBuzz - expects to shape a run of characters sharing the same - properties. -

  • -
  • -

    - HarfBuzz won't help you with line breaking, hyphenation or - justification. As mentioned above, it lays out the string - along a single line of, notionally, - infinite length. If you want to find out where the potential - word, sentence and line break points are in your text, you - could use the ICU library's break iterator functions. -

    -

    - HarfBuzz can tell you how wide a shaped piece of text is, which is - useful input to a justification algorithm, but it knows nothing - about paragraphs, lines or line lengths. Nor will it adjust the - space between words to fit them proportionally into a line. If you - want to layout text in paragraphs, you will probably want to send - each word of your text to HarfBuzz to determine its shaped width - after glyph substitutions, then work out how many words will fit - on a line, and then finally output each word of the line separated - by a space of the correct size to fully justify the paragraph. -

    -
  • -
-

- As a layout engine implementor, HarfBuzz will help you with the - interface between your text and your font, and that's something - that you'll need - what you then do with the glyphs that your font - returns is up to you. The example we saw above enough to get us - started using HarfBuzz. Now we are going to use the remainder of - HarfBuzz's API to refine that example and improve our text shaping - capabilities. -

-
-
- - - \ No newline at end of file diff --git a/docs/html/home.png b/docs/html/home.png index 9346b33..c989d46 100644 Binary files a/docs/html/home.png and b/docs/html/home.png differ diff --git a/docs/html/index.html b/docs/html/index.html index 8f72dcb..7d9e404 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -4,10 +4,10 @@ HarfBuzz Manual: HarfBuzz Manual - + - + @@ -20,28 +20,18 @@

HarfBuzz is an OpenType - text shaping engine. + text shaping engine. Using the HarfBuzz library allows + programs to convert a sequence of Unicode input into + properly formatted and positioned glyph output—for any writing + system and language.

- The current HarfBuzz codebase, formerly known as harfbuzz-ng, is - versioned 1.x.x and is stable and under active maintenance. This is - what is used in latest versions of Firefox, GNOME, ChromeOS, Chrome, - LibreOffice, XeTeX, Android, and KDE, among other places. The canonical - source tree is available - here. - Also available on - github. - See Download for release tarballs. -

-

- The old HarfBuzz codebase, these days known as harfbuzz-old, was - derived from FreeType, - Pango, and - Qt and is available - here. - It is not actively developed or maintained, and is extremely buggy. All - users are encouraged to switch over to the new HarfBuzz as soon as - possible. There are no release tarballs of old HarfBuzz whatsoever. + The canonical source-code tree is available at + github.com/harfbuzz/harfbuzz + and is also available at + cgit.freedesktop.org/harfbuzz. + See Downloading HarfBuzz for + release tarballs.

@@ -52,16 +42,40 @@
What is HarfBuzz?
-
Why do I need it?
+
What is text shaping?
+
Why do I need a shaping engine?
+
What does HarfBuzz do?
+
What HarfBuzz doesn't do
Why is it called HarfBuzz?
-
Install HarfBuzz
+
Installing HarfBuzz
+
+
Downloading HarfBuzz
+
Building HarfBuzz
+
+
Building on Linux
+
Building on Windows
+
Building on macOS
+
Configuration options
+
+
+
Getting started with HarfBuzz
+
+
An overview of the HarfBuzz shaping API
+
Terminology
+
A simple shaping example
+
+
Shaping concepts
-
Download
-
Building
+
Text shaping
+
Complex scripts
+
Shaping operations
+
Unicode character categories
+
Text runs
+
OpenType shaping models
+
Graphite shaping
+
AAT shaping
-
Hello, HarfBuzz
-
What HarfBuzz doesn't do
Buffers, language, script and direction
Creating and destroying buffers
@@ -76,16 +90,18 @@
Using HarfBuzz's native OpenType implementation
Using your own font functions
-
+
Clusters
-
Clusters
-
A clustering example for levels 0 and 1
-
Reordering in levels 0 and 1
-
The distinction between levels 0 and 1
-
Level 2
+
Clusters and shaping
+
Working with HarfBuzz clusters
+
A clustering example for levels 0 and 1
+
Reordering in levels 0 and 1
+
The distinction between levels 0 and 1
+
Level 2
-
Ligatures with combining marks
-
Reordering
+
Ligatures with combining marks in level 2
+
Reordering in level 2
+
Other considerations in level 2
Shaping and shape plans
@@ -96,116 +112,138 @@
II. Reference manual
-
HarfBuzz API
+
Core API
-hb +hb-blob — Binary data containers
-hb-common +hb-buffer — Input and output buffers
-hb-unicode +hb-common — Common data types
-Buffers — Input and output buffers +hb-deprecated — Deprecated API
-hb-blob +hb-face — Font face objects
-hb-face +hb-font — Font objects
-hb-font +hb-map — Object representing integer to integer mapping
-Shaping — Conversion of text strings into positioned glyphs +hb-set — Object representing a set of integers
-hb-version +hb-shape-plan — Object representing a shaping plan
-hb-deprecated +hb-shape — Conversion of text strings into positioned glyphs
-hb-set +hb-unicode — Unicode character property access
-hb-ot +hb-version — Information about the version of HarfBuzz in use +
+
+
OpenType API
+
+
+hb-ot-color — OpenType Color Fonts
-hb-ot-layout +hb-ot-font — OpenType font implementation
-hb-ot-tag +hb-ot-layout — OpenType Layout
-hb-ot-font +hb-ot-math — OpenType Math information
-hb-ot-shape +hb-ot-name — OpenType font name information
-hb-ot-math +hb-ot-shape — OpenType shaping support
-hb-shape-plan +hb-ot-var — OpenType Font Variations
+
+
Apple Advanced Typography API
+
+hb-aat-layout — Apple Advanced Typography Layout +
+
Integration API
+
-hb-glib +hb-coretext — CoreText integration
-hb-icu +hb-ft — FreeType integration
-hb-ft +hb-glib — GLib integration
-hb-graphite2 +hb-gobject — GObject integration
-hb-uniscribe +hb-graphite2 — Graphite2 integration
-hb-coretext +hb-icu — ICU integration
-hb-gobject +hb-uniscribe — Windows integration
-
Object Hierarchy
API Index
-
Index of new symbols in 0.9.2
-
Index of new symbols in 0.9.5
-
Index of new symbols in 0.9.7
-
Index of new symbols in 0.9.8
-
Index of new symbols in 0.9.10
-
Index of new symbols in 0.9.11
-
Index of new symbols in 0.9.20
-
Index of new symbols in 0.9.22
-
Index of new symbols in 0.9.28
-
Index of new symbols in 0.9.30
-
Index of new symbols in 0.9.31
-
Index of new symbols in 0.9.38
-
Index of new symbols in 0.9.39
-
Index of new symbols in 0.9.41
-
Index of new symbols in 0.9.42
-
Index of new symbols in 1.0.5
-
Index of new symbols in 1.1.2
-
Index of new symbols in 1.1.3
-
Index of new symbols in 1.2.3
-
Index of new symbols in 1.3.3
-
Index of new symbols in 1.4.2
-
Index of new symbols in 1.4.3
-
Index of new symbols in 1.5.0
-
Index of new symbols in 1.6.0
Index of deprecated API
+
Index of new symbols in 2.1.0
+
Index of new symbols in 2.0.0
+
Index of new symbols in 1.9.0
+
Index of new symbols in 1.8.6
+
Index of new symbols in 1.8.5
+
Index of new symbols in 1.8.1
+
Index of new symbols in 1.8.0
+
Index of new symbols in 1.7.7
+
Index of new symbols in 1.7.5
+
Index of new symbols in 1.6.0
+
Index of new symbols in 1.5.0
+
Index of new symbols in 1.4.3
+
Index of new symbols in 1.4.2
+
Index of new symbols in 1.4.0
+
Index of new symbols in 1.3.3
+
Index of new symbols in 1.2.3
+
Index of new symbols in 1.1.3
+
Index of new symbols in 1.1.2
+
Index of new symbols in 1.0.5
+
Index of new symbols in 0.9.42
+
Index of new symbols in 0.9.41
+
Index of new symbols in 0.9.39
+
Index of new symbols in 0.9.38
+
Index of new symbols in 0.9.31
+
Index of new symbols in 0.9.30
+
Index of new symbols in 0.9.28
+
Index of new symbols in 0.9.22
+
Index of new symbols in 0.9.20
+
Index of new symbols in 0.9.11
+
Index of new symbols in 0.9.10
+
Index of new symbols in 0.9.8
+
Index of new symbols in 0.9.7
+
Index of new symbols in 0.9.5
+
Index of new symbols in 0.9.2
Annotation Glossary
+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/install-harfbuzz.html b/docs/html/install-harfbuzz.html index 019915b..940cf1a 100644 --- a/docs/html/install-harfbuzz.html +++ b/docs/html/install-harfbuzz.html @@ -2,13 +2,13 @@ -Install HarfBuzz: HarfBuzz Manual +Installing HarfBuzz: HarfBuzz Manual - - + + @@ -21,39 +21,50 @@

-Install HarfBuzz

+Installing HarfBuzz

-Download

+Downloading HarfBuzz

- For tarball releases of HarfBuzz, look - here. - At the same place you will - also find Win32 binary bundles that include libharfbuzz DLL, hb-view.exe, - hb-shape.exe, and all dependencies. + The HarfBuzz source code is hosted at github.com/harfbuzz/harfbuzz. The + same source tree is also available at the + Freedesktop.org + site.

- The canonical source tree is available - here. - Also available on github. + Tarball releases and Win32 binary bundles (which include the + libharfbuzz DLL, hb-view.exe, hb-shape.exe, and all + dependencies) of HarfBuzz can be downloaded from github.com/harfbuzz/harfbuzz/releases + or from + Freedesktop.org.

- The API that comes with hb.h will - not change incompatibly. Other, peripheral, headers are more likely to go - through minor modifications, but again, will do our best to never change - API in an incompatible way. We will never break the ABI. + Release notes are posted with each new release to provide an + overview of the changes. The project tracks bug + reports and other issues on GitHub. Discussion and + questions are welcome on the HarfBuzz + mailing list.

- If you are not sure whether Pango or HarfBuzz is right for you, read - this. + The API included in the hb.h file will not change in a + compatibility-breaking way in any release. However, other, + peripheral headers are more likely to go through minor + modifications. We will do our best to never change APIs in an + incompatible way. We will never break the ABI.

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/left-insensitive.png b/docs/html/left-insensitive.png index 3269393..b1148fb 100644 Binary files a/docs/html/left-insensitive.png and b/docs/html/left-insensitive.png differ diff --git a/docs/html/left.png b/docs/html/left.png index 2abde03..c164913 100644 Binary files a/docs/html/left.png and b/docs/html/left.png differ diff --git a/docs/html/level-2.html b/docs/html/level-2.html index 23410dc..3e67349 100644 --- a/docs/html/level-2.html +++ b/docs/html/level-2.html @@ -5,10 +5,10 @@ Level 2: HarfBuzz Manual - + - + @@ -19,112 +19,167 @@ Prev Next -
+

Level 2

- Level 2 is a different beast from levels 0 and 1. It is simple to - describe, but hard to make sense of. It simply doesn't do any - cluster merging whatsoever. When things ligate or otherwise multiple - glyphs turn into one, the cluster value of the first glyph is - retained. -

-

- Here are a few examples of why processing cluster values produced at - this level might be tricky: -

-
-

-Ligatures with combining marks

+ HarfBuzz's level 2 cluster behavior uses a significantly + different model than that of level 0 and level 1. +

- Imagine capital letters are bases and lower case letters are - combining marks. With an input sequence like this: + The level 2 behavior is easy to describe, but it may be + difficult to understand in practical terms. In brief, level 2 + performs no merging of clusters whatsoever.

-
-  A,a,B,b,C,c
-  0,1,2,3,4,5
-

- if A,B,C ligate, then here are the cluster - values one would get under the various levels: + This means that there is no initial base-and-mark merging step + (as is done in level 0), and it means that reordering moves and + ligature substitutions do not trigger a cluster merge.

- level 0: + Only one shaping operation directly affects clusters when using + level 2:

-
-  ABC,a,b,c
-  0  ,0,0,0
-
+
  • + When a cluster decomposes, all of the + resulting child clusters inherit as their cluster value the + cluster value of the parent cluster. +

- level 1: + When glyphs do form a ligature (or when some other feature + substitutes multiple glyphs with one glyph) the cluster value + of the first glyph is retained as the cluster value for the + resulting ligature.

-
-  ABC,a,b,c
-  0  ,0,0,5
-

- level 2: + This occurrence sounds similar to a cluster merge, but it is + different. In particular, no subsequent characters — + including marks and modifiers — are affected. They retain + their previous cluster values.

-
-  ABC,a,b,c
-  0  ,1,3,5
-
-

- Making sense of the last example is the hardest for a client, - because there is nothing in the cluster values to suggest that - B and C ligated with - A. +

+ Level 2 cluster behavior is ultimately less complex than level 0 + or level 1, but there are several cases for which processing + cluster values produced at level 2 may be tricky.

+
+

+Ligatures with combining marks in level 2

+

+ The first example of how HarfBuzz's level 2 cluster behavior + can be tricky is when the text to be shaped includes combining + marks attached to ligatures. +

+

+ Let us start with an input sequence with the following + characters (top row) and initial cluster values (bottom row): +

+
+	A,acute,B,breve,C,circumflex
+	0,1    ,2,3    ,4,5
+      
+

+ If the sequence A,B,C forms a ligature, + then these are the cluster values HarfBuzz will return under + the various cluster levels: +

+

+ Level 0: +

+
+	ABC,acute,breve,circumflex
+	0  ,0    ,0    ,0
+      
+

+ Level 1: +

+
+	ABC,acute,breve,circumflex
+	0  ,0    ,0    ,5
+      
+

+ Level 2: +

+
+	ABC,acute,breve,circumflex
+	0  ,1    ,3    ,5
+      
+

+ Making sense of the level 2 result is the hardest for a client + program, because there is nothing in the cluster values that + indicates that B and C + formed a ligature with A. +

+

+ In contrast, the "merged" cluster values of the mark glyphs + that are seen in the level 0 and level 1 output are evidence + that a ligature substitution took place. +

-
+

-Reordering

+Reordering in level 2

- Another tricky case is when things reorder. Under level 2: -

+ Another example of how HarfBuzz's level 2 cluster behavior + can be tricky is when glyphs reorder. Consider an input sequence + with the following characters (top row) and initial cluster + values (bottom row): +

-  A,B,C,D,E
-  0,1,2,3,4
-
+ A,B,C,D,E + 0,1,2,3,4 +

- Now imagine D moves before - B: -

+ Now imagine D moves before + B in a reordering operation. The cluster + values will then be: +

-  A,D,B,C,E
-  0,3,1,2,4
-
+ A,D,B,C,E + 0,3,1,2,4 +

- Now, if D ligates with B, we - get: -

+ Next, if D forms a ligature with + B, the output is: +

-  A,DB,C,E
-  0,3 ,2,4
-
-

- In a different scenario, A and - B could have ligated - before D reordered; that - would have resulted in: -

+ A,DB,C,E + 0,3 ,2,4 + +

+ However, in a different scenario, in which the shaping rules + of the script instead caused A and + B to form a ligature + before the D reordered, the + result would be: +

-  AB,D,C,E
-  0 ,3,2,4   
-
+ AB,D,C,E + 0 ,3,2,4 +

- There's no way to differentiate between these two scenarios based - on the cluster numbers alone. -

+ There is no way for a client program to differentiate between + these two scenarios based on the cluster values + alone. Consequently, client programs that use level 2 might + need to undertake additional work in order to manage cursor + positioning, text attributes, or other desired features. +

+
+
+

+Other considerations in level 2

- Another problem happens with ligatures under level 2 if the - direction of the text is forced to opposite of its natural - direction (e.g. left-to-right Arabic). But that's too much of a - corner case to worry about. -

+ There may be other problems encountered with ligatures under + level 2, such as if the direction of the text is forced to + opposite of its natural direction (for example, Arabic text + that is forced into left-to-right directionality). But, + generally speaking, these other scenarios are minor corner + cases that are too obscure for most client programs to need to + worry about. +

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/object-tree.html b/docs/html/object-tree.html deleted file mode 100644 index 80d35bc..0000000 --- a/docs/html/object-tree.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - -Object Hierarchy: HarfBuzz Manual - - - - - - - - - - - - - - - - -
-

-Object Hierarchy

-
-    GBoxed
-    ├── hb_blob_t
-    ├── hb_buffer_t
-    ├── hb_face_t
-    ├── hb_feature_t
-    ├── hb_font_funcs_t
-    ├── hb_font_t
-    ├── hb_glyph_info_t
-    ├── hb_glyph_position_t
-    ├── hb_ot_math_glyph_part_t
-    ├── hb_ot_math_glyph_variant_t
-    ├── hb_segment_properties_t
-    ├── hb_set_t
-    ├── hb_shape_plan_t
-    ├── hb_unicode_funcs_t
-    ╰── hb_user_data_key_t
-    GEnum
-    ├── hb_buffer_cluster_level_t
-    ├── hb_buffer_content_type_t
-    ├── hb_buffer_serialize_format_t
-    ├── hb_direction_t
-    ├── hb_memory_mode_t
-    ├── hb_ot_layout_glyph_class_t
-    ├── hb_ot_math_constant_t
-    ├── hb_ot_math_kern_t
-    ├── hb_script_t
-    ├── hb_unicode_combining_class_t
-    ╰── hb_unicode_general_category_t
-    GFlags
-    ├── hb_buffer_diff_flags_t
-    ├── hb_buffer_flags_t
-    ├── hb_buffer_serialize_flags_t
-    ├── hb_glyph_flags_t
-    ╰── hb_ot_math_glyph_part_flags_t
-
-
- - - \ No newline at end of file diff --git a/docs/html/opentype-shaping-models.html b/docs/html/opentype-shaping-models.html new file mode 100644 index 0000000..46b9e2b --- /dev/null +++ b/docs/html/opentype-shaping-models.html @@ -0,0 +1,100 @@ + + + + +OpenType shaping models: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+OpenType shaping models

+

+ OpenType provides shaping models for the following scripts: +

+
    +
  • + The default shaping model handles all + non-complex scripts, and may also be used as a fallback for + handling unrecognized scripts. +

  • +
  • +

    + The Indic shaping model handles the Indic + scripts Bengali, Devanagari, Gujarati, Gurmukhi, Kannada, + Malayalam, Oriya, Tamil, Telugu, and Sinhala. +

    +

    + The Indic shaping model was revised significantly in + 2005. To denote the change, a new set of script + tags was assigned for Bengali, Devanagari, + Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, and + Telugu. For the sake of clarity, the term "Indic2" is + sometimes used to refer to the current, revised shaping + model. +

    +
  • +
  • + The Arabic shaping model supports + Arabic, Mongolian, N'Ko, Syriac, and several other connected + or cursive scripts. +

  • +
  • + The Thai/Lao shaping model supports + the Thai and Lao scripts. +

  • +
  • + The Khmer shaping model supports the + Khmer script. +

  • +
  • + The Myanmar shaping model supports the + Myanmar (or Burmese) script. +

  • +
  • + The Tibetan shaping model supports the + Tibetan script. +

  • +
  • + The Hangul shaping model supports the + Hangul script. +

  • +
  • + The Hebrew shaping model supports the + Hebrew script. +

  • +
  • + The Universal Shaping Engine (USE) + shaping model supports complex scripts not covered by one of + the above, script-specific shaping models, including + Javanese, Balinese, Buginese, Batak, Chakma, Lepcha, Modi, + Phags-pa, Tagalog, Siddham, Sundanese, Tai Le, Tai Tham, Tai + Viet, and many others. +

  • +
  • + Text runs that do not fall under one of the above shaping + models may still require processing by a shaping engine. Of + particular note is Emoji shaping, which + may involve variation-selector sequences and glyph + substitution. Emoji shaping is handled by the default + shaping model. +

  • +
+
+ + + \ No newline at end of file diff --git a/docs/html/plans-and-caching.html b/docs/html/plans-and-caching.html index 89a9f35..5d81872 100644 --- a/docs/html/plans-and-caching.html +++ b/docs/html/plans-and-caching.html @@ -8,7 +8,7 @@ - + @@ -26,6 +26,6 @@

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/pt01.html b/docs/html/pt01.html index 5cc9f2c..2aee80e 100644 --- a/docs/html/pt01.html +++ b/docs/html/pt01.html @@ -8,7 +8,7 @@ - + @@ -27,16 +27,40 @@
What is HarfBuzz?
-
Why do I need it?
+
What is text shaping?
+
Why do I need a shaping engine?
+
What does HarfBuzz do?
+
What HarfBuzz doesn't do
Why is it called HarfBuzz?
-
Install HarfBuzz
+
Installing HarfBuzz
-
Download
-
Building
+
Downloading HarfBuzz
+
Building HarfBuzz
+
+
Building on Linux
+
Building on Windows
+
Building on macOS
+
Configuration options
+
+
+
Getting started with HarfBuzz
+
+
An overview of the HarfBuzz shaping API
+
Terminology
+
A simple shaping example
+
+
Shaping concepts
+
+
Text shaping
+
Complex scripts
+
Shaping operations
+
Unicode character categories
+
Text runs
+
OpenType shaping models
+
Graphite shaping
+
AAT shaping
-
Hello, HarfBuzz
-
What HarfBuzz doesn't do
Buffers, language, script and direction
Creating and destroying buffers
@@ -51,16 +75,18 @@
Using HarfBuzz's native OpenType implementation
Using your own font functions
-
+
Clusters
-
Clusters
-
A clustering example for levels 0 and 1
-
Reordering in levels 0 and 1
-
The distinction between levels 0 and 1
-
Level 2
+
Clusters and shaping
+
Working with HarfBuzz clusters
+
A clustering example for levels 0 and 1
+
Reordering in levels 0 and 1
+
The distinction between levels 0 and 1
+
Level 2
-
Ligatures with combining marks
-
Reordering
+
Ligatures with combining marks in level 2
+
Reordering in level 2
+
Other considerations in level 2
Shaping and shape plans
@@ -82,6 +108,6 @@ +
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/pt02.html b/docs/html/pt02.html index ac7201f..2dd2ac9 100644 --- a/docs/html/pt02.html +++ b/docs/html/pt02.html @@ -7,8 +7,8 @@ - - + + @@ -17,14 +17,14 @@ Home Prev -Next +Next

Part II. Reference manual

- This document is for HarfBuzz 1.8.1 + This document is for HarfBuzz 2.3.1 .

@@ -32,116 +32,165 @@

Table of Contents

-
HarfBuzz API
+
Core API
-hb +hb-blob — Binary data containers
-hb-common +hb-buffer — Input and output buffers
-hb-unicode +hb-common — Common data types
-Buffers — Input and output buffers +hb-deprecated — Deprecated API
-hb-blob +hb-face — Font face objects
-hb-face +hb-font — Font objects
-hb-font +hb-map — Object representing integer to integer mapping
-Shaping — Conversion of text strings into positioned glyphs +hb-set — Object representing a set of integers
-hb-version +hb-shape-plan — Object representing a shaping plan
-hb-deprecated +hb-shape — Conversion of text strings into positioned glyphs
-hb-set +hb-unicode — Unicode character property access
-hb-ot +hb-version — Information about the version of HarfBuzz in use
+
+
OpenType API
+
-hb-ot-layout +hb-ot-color — OpenType Color Fonts
-hb-ot-tag +hb-ot-font — OpenType font implementation
-hb-ot-font +hb-ot-layout — OpenType Layout
-hb-ot-shape +hb-ot-math — OpenType Math information
-hb-ot-math +hb-ot-name — OpenType font name information
-hb-shape-plan +hb-ot-shape — OpenType shaping support
-hb-glib +hb-ot-var — OpenType Font Variations
+
+
Apple Advanced Typography API
+
+hb-aat-layout — Apple Advanced Typography Layout +
+
Integration API
+
-hb-icu +hb-coretext — CoreText integration
-hb-ft +hb-ft — FreeType integration
-hb-graphite2 +hb-glib — GLib integration
-hb-uniscribe +hb-gobject — GObject integration
-hb-coretext +hb-graphite2 — Graphite2 integration
-hb-gobject +hb-icu — ICU integration +
+
+hb-uniscribe — Windows integration
-
Object Hierarchy
API Index
-
Index of new symbols in 0.9.2
-
Index of new symbols in 0.9.5
-
Index of new symbols in 0.9.7
-
Index of new symbols in 0.9.8
-
Index of new symbols in 0.9.10
-
Index of new symbols in 0.9.11
-
Index of new symbols in 0.9.20
-
Index of new symbols in 0.9.22
-
Index of new symbols in 0.9.28
-
Index of new symbols in 0.9.30
-
Index of new symbols in 0.9.31
-
Index of new symbols in 0.9.38
-
Index of new symbols in 0.9.39
-
Index of new symbols in 0.9.41
-
Index of new symbols in 0.9.42
-
Index of new symbols in 1.0.5
-
Index of new symbols in 1.1.2
-
Index of new symbols in 1.1.3
-
Index of new symbols in 1.2.3
-
Index of new symbols in 1.3.3
-
Index of new symbols in 1.4.2
-
Index of new symbols in 1.4.3
-
Index of new symbols in 1.5.0
-
Index of new symbols in 1.6.0
Index of deprecated API
+
Index of new symbols in 2.1.0
+
Index of new symbols in 2.0.0
+
Index of new symbols in 1.9.0
+
Index of new symbols in 1.8.6
+
Index of new symbols in 1.8.5
+
Index of new symbols in 1.8.1
+
Index of new symbols in 1.8.0
+
Index of new symbols in 1.7.7
+
Index of new symbols in 1.7.5
+
Index of new symbols in 1.6.0
+
Index of new symbols in 1.5.0
+
Index of new symbols in 1.4.3
+
Index of new symbols in 1.4.2
+
Index of new symbols in 1.4.0
+
Index of new symbols in 1.3.3
+
Index of new symbols in 1.2.3
+
Index of new symbols in 1.1.3
+
Index of new symbols in 1.1.2
+
Index of new symbols in 1.0.5
+
Index of new symbols in 0.9.42
+
Index of new symbols in 0.9.41
+
Index of new symbols in 0.9.39
+
Index of new symbols in 0.9.38
+
Index of new symbols in 0.9.31
+
Index of new symbols in 0.9.30
+
Index of new symbols in 0.9.28
+
Index of new symbols in 0.9.22
+
Index of new symbols in 0.9.20
+
Index of new symbols in 0.9.11
+
Index of new symbols in 0.9.10
+
Index of new symbols in 0.9.8
+
Index of new symbols in 0.9.7
+
Index of new symbols in 0.9.5
+
Index of new symbols in 0.9.2
Annotation Glossary
+
+

+ The current HarfBuzz codebase is versioned 2.x.x and is stable + and under active maintenance. This is what is used in latest + versions of Firefox, GNOME, ChromeOS, Chrome, LibreOffice, + XeTeX, Android, and KDE, among other places. +

+

+ Prior to 2012, the original HarfBuzz codebase (which, these + days, is referred to as harfbuzz-old) was + derived from code in FreeType, Pango, and + Qt. + It is not actively developed or + maintained, and is extremely buggy. All users of harfbuzz-old + are encouraged to switch over to the new HarfBuzz as soon as possible. +

+

+ To make this distinction clearer in discussions, the current + HarfBuzz codebase is sometimes referred to as + harfbuzz-ng. +

+

+ For reference purposes, the harfbuzz-old source tree is archived + here. There + are no release tarballs of harfbuzz-old whatsoever. +

+
+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/reordering-in-levels-0-and-1.html b/docs/html/reordering-in-levels-0-and-1.html index 9b0a47e..2a390b7 100644 --- a/docs/html/reordering-in-levels-0-and-1.html +++ b/docs/html/reordering-in-levels-0-and-1.html @@ -5,10 +5,10 @@ Reordering in levels 0 and 1: HarfBuzz Manual - + - + @@ -19,35 +19,46 @@ Prev Next -
+

Reordering in levels 0 and 1

- Another common operation in the more complex shapers is when things - reorder. In those cases, to maintain monotone clusters, HB merges - the clusters of everything in the reordering sequence. For example, - let's again start with the character sequence: -

+ Another common operation in the more complex shapers is glyph + reordering. In order to maintain a monotonic cluster sequence + when glyph reordering takes place, HarfBuzz merges the clusters + of everything in the reordering sequence. +

+

+ For example, let us again start with the character sequence (top + row) and initial cluster values (bottom row): +

-   A,B,C,D,E
-   0,1,2,3,4
-
+ A,B,C,D,E + 0,1,2,3,4 +

- If D is reordered before B, - then the B, C, and - D clusters merge, and we get: -

+ If D is reordered to the position immediately + before B, then HarfBuzz merges the + B, C, and + D clusters — all the clusters between + the final position of the reordered glyph and its original + position. This means that we get: +

-   A,D,B,C,E
-   0,1,1,1,4
-
+ A,D,B,C,E + 0,1,1,1,4 + +

+ as the final cluster sequence. +

- This is clearly not ideal, but it is the only sensible way to - maintain monotone indices and retain the true relationship between - glyphs and characters. -

+ Merging this many clusters is not ideal, but it is the only + sensible way for HarfBuzz to maintain the guarantee that the + sequence of cluster values remains monotonic and to retain the + true relationship between glyphs and characters. +

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/right-insensitive.png b/docs/html/right-insensitive.png index 4c95785..c1efa27 100644 Binary files a/docs/html/right-insensitive.png and b/docs/html/right-insensitive.png differ diff --git a/docs/html/right.png b/docs/html/right.png index 76260ec..83361a6 100644 Binary files a/docs/html/right.png and b/docs/html/right.png differ diff --git a/docs/html/setting-buffer-properties.html b/docs/html/setting-buffer-properties.html index ecc07ee..266dfd7 100644 --- a/docs/html/setting-buffer-properties.html +++ b/docs/html/setting-buffer-properties.html @@ -8,7 +8,7 @@ - + @@ -26,6 +26,6 @@

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/shaping-and-shape-plans.html b/docs/html/shaping-and-shape-plans.html index c3e2029..4aacb0f 100644 --- a/docs/html/shaping-and-shape-plans.html +++ b/docs/html/shaping-and-shape-plans.html @@ -8,7 +8,7 @@ - + @@ -34,6 +34,6 @@ +
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/shaping-concepts.html b/docs/html/shaping-concepts.html new file mode 100644 index 0000000..bfa6a41 --- /dev/null +++ b/docs/html/shaping-concepts.html @@ -0,0 +1,69 @@ + + + + +Shaping concepts: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Shaping concepts

+ +
+

+Text shaping

+

+ Text shaping is the process of transforming a sequence of Unicode + codepoints that represent individual characters (letters, + diacritics, tone marks, numbers, symbols, etc.) into the + orthographically and linguistically correct two-dimensional layout + of glyph shapes taken from a specified font. +

+

+ For some writing systems (or scripts) and + languages, the process is simple, requiring the shaper to do + little more than advance the horizontal position forward by the + correct amount for each successive glyph. +

+

+ But, for complex scripts, any combination of + several shaping operations may be required, and the rules for how + and when they are applied vary from script to script. HarfBuzz and + other shaping engines implement these rules. +

+

+ The exact rules and necessary operations for a particular script + constitute a shaping model. OpenType + specifies a set of shaping models that covers all of + Unicode. Other shaping models are available, however, including + Graphite and Apple Advanced Typography (AAT). +

+
+
+ + + \ No newline at end of file diff --git a/docs/html/shaping-operations.html b/docs/html/shaping-operations.html new file mode 100644 index 0000000..9e6ff5e --- /dev/null +++ b/docs/html/shaping-operations.html @@ -0,0 +1,98 @@ + + + + +Shaping operations: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Shaping operations

+

+ Shaping a complex-script text run involves transforming the + input sequence of Unicode codepoints with some combination of + operations that is specified in the shaping model for the + script. +

+

+ The specific conditions that trigger a given operation for a + text run varies from script to script, as do the order that the + operations are performed in and which codepoints are + affected. However, the same general set of shaping operations is + common to all of the complex-script shaping models. +

+
    +
  • +

    + A reordering operation moves a glyph + from its original ("logical") position in the sequence to + some other ("visual") position. +

    +

    + The shaping model for a given complex script might involve + more than one reordering step. +

    +
  • +
  • + A joining operation replaces a glyph + with an alternate form that is designed to connect with one + or more of the adjacent glyphs in the sequence. +

  • +
  • +

    + A contextual substitution operation + replaces either a single glyph or a subsequence of several + glyphs with an alternate glyph. This substitution is + performed when the original glyph or subsequence of glyphs + occurs in a specified position with respect to the + surrounding sequence. For example, one substitution might be + performed only when the target glyph is the first glyph in + the sequence, while another substitution is performed only + when a different target glyph occurs immediately after a + particular string pattern. +

    +

    + The shaping model for a given complex script might involve + multiple contextual-substitution operations, each applying + to different target glyphs and patterns, and which are + performed in separate steps. +

    +
  • +
  • +

    + A contextual positioning operation + moves the horizontal and/or vertical position of a + glyph. This positioning move is performed when the glyph + occurs in a specified position with respect to the + surrounding sequence. +

    +

    + Many contextual positioning operations are used to place + mark glyphs (such as diacritics, vowel + signs, and tone markers) with respect to + base glyphs. However, some complex + scripts may use contextual positioning operations to + correctly place base glyphs as well, such as + when the script uses stacking characters. +

    +
  • +
+
+ + + \ No newline at end of file diff --git a/docs/html/style.css b/docs/html/style.css index 4be4ede..3675420 100644 --- a/docs/html/style.css +++ b/docs/html/style.css @@ -30,10 +30,6 @@ body vertical-align: top; } -span.nowrap { - white-space: nowrap; -} - div.gallery-float { float: left; diff --git a/docs/html/text-runs.html b/docs/html/text-runs.html new file mode 100644 index 0000000..26804d3 --- /dev/null +++ b/docs/html/text-runs.html @@ -0,0 +1,47 @@ + + + + +Text runs: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Text runs

+

+ Real-world text usually contains codepoints from a mixture of + different Unicode scripts (including punctuation, numbers, symbols, + white-space characters, and other codepoints that do not belong + to any script). Real-world text may also be marked up with + formatting that changes font properties (including the font, + font style, and font size). +

+

+ For shaping purposes, all real-world text streams must be first + segmented into runs that have a uniform set of properties. +

+

+ In particular, shaping models always assume that every codepoint + in a text run has the same direction, + script tag, and + language tag. +

+
+ + + \ No newline at end of file diff --git a/docs/html/the-distinction-between-levels-0-and-1.html b/docs/html/the-distinction-between-levels-0-and-1.html index 0365f01..cbb7afe 100644 --- a/docs/html/the-distinction-between-levels-0-and-1.html +++ b/docs/html/the-distinction-between-levels-0-and-1.html @@ -5,10 +5,10 @@ The distinction between levels 0 and 1: HarfBuzz Manual - + - + @@ -19,63 +19,88 @@ Prev Next -
+

The distinction between levels 0 and 1

- So, the above is pretty much what cluster levels 0 and 1 do. The - only difference between the two is this: in level 0, at the very - beginning of the shaping process, we also merge clusters between - base characters and all Unicode marks (combining or not) following - them. E.g.: -

+ The preceding examples demonstrate the main effects of using + cluster levels 0 and 1. The only difference between the two + levels is this: in level 0, at the very beginning of the shaping + process, HarfBuzz merges the cluster of each base character + with the clusters of all Unicode marks (combining or not) and + modifiers that follow it. +

+

+ For example, let us start with the following character sequence + (top row) and accompanying initial cluster values (bottom row): +

-  A,acute,B
-  0,1    ,2
-
+ A,acute,B + 0,1 ,2 +

- will become: -

+ The acute is a Unicode mark. If HarfBuzz is + using cluster level 0 on this sequence, then the + A and acute clusters will + merge, and the result will become: +

-  A,acute,B
-  0,0    ,2
-
+ A,acute,B + 0,0 ,2 + +

+ This merger is performed before any other script-shaping + steps. +

+

+ This initial cluster merging is the default behavior of the + Windows shaping engine, and the old HarfBuzz codebase copied + that behavior to maintain compatibility. Consequently, it has + remained the default behavior in the new HarfBuzz codebase. +

+

+ But this initial cluster-merging behavior makes it impossible + client programs to implement some features (such as to + color diacritic marks differently from their base + characters). That is why, in level 1, HarfBuzz does not perform + the initial merging step. +

- This is the default behavior. We do it because Windows did it and - old HarfBuzz did it, so this remained the default. But this behavior - makes it impossible to color diacritic marks differently from their - base characters. That's why in level 1 we do not perform this - initial merging step. -

+ For client programs that rely on HarfBuzz cluster values to + perform cursor positioning, level 0 is more convenient. But + relying on cluster boundaries for cursor positioning is wrong: cursor + positions should be determined based on Unicode grapheme + boundaries, not on shaping-cluster boundaries. As such, using + level 1 clustering behavior is recommended. +

- For clients, level 0 is more convenient if they rely on HarfBuzz - clusters for cursor positioning. But that's wrong anyway: cursor - positions should be determined based on Unicode grapheme boundaries, - NOT shaping clusters. As such, level 1 clusters are preferred. -

+ One final facet of levels 0 and 1 is worth noting. HarfBuzz + currently does not allow any + multiple-substitution GSUB lookups to + replace a glyph with zero glyphs (in other words, to delete a + glyph). +

- One last note about levels 0 and 1. We currently don't allow a - MultipleSubst lookup to replace a glyph with zero - glyphs (i.e., to delete a glyph). But in some other situations, - glyphs can be deleted. In those cases, if the glyph being deleted is - the last glyph of its cluster, we make sure to merge the cluster - with a neighboring cluster. -

+ But, in some other situations, glyphs can be deleted. In + those cases, if the glyph being deleted is the last glyph of its + cluster, HarfBuzz makes sure to merge the deleted glyph's + cluster with a neighboring cluster. +

- This is, primarily, to make sure that the starting cluster of the - text always has the cluster index pointing to the start of the text - for the run; more than one client currently relies on this - guarantee. -

+ This is done primarily to make sure that the starting cluster of the + text always has the cluster index pointing to the start of the text + for the run; more than one client program currently relies on this + guarantee. +

- Incidentally, Apple's CoreText does something else to maintain the - same promise: it inserts a glyph with id 65535 at the beginning of - the glyph string if the glyph corresponding to the first character - in the run was deleted. HarfBuzz might do something similar in the - future. -

+ Incidentally, Apple's CoreText does something different to + maintain the same promise: it inserts a glyph with id 65535 at + the beginning of the glyph string if the glyph corresponding to + the first character in the run was deleted. HarfBuzz might do + something similar in the future. +

+
Generated by GTK-Doc V1.25
\ No newline at end of file diff --git a/docs/html/unicode-character-categories.html b/docs/html/unicode-character-categories.html new file mode 100644 index 0000000..2b97961 --- /dev/null +++ b/docs/html/unicode-character-categories.html @@ -0,0 +1,79 @@ + + + + +Unicode character categories: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Unicode character categories

+

+ Shaping models are typically specified with respect to how + scripts are defined in the Unicode standard. +

+

+ Every codepoint in the Unicode Character Database (UCD) is + assigned a Unicode General Category (UGC), + which provides the most fundamental information about the + codepoint: whether the codepoint represents a + Letter, a Mark, a + Number, Punctuation, a + Symbol, a Separator, + or something else (Other). +

+

+ These UGC properties are "Major" categories. Each codepoint is + further assigned to a "minor" category within its Major + category, such as "Letter, uppercase" (Lu) or + "Letter, modifier" (Lm). +

+

+ Shaping models are concerned primarily with Letter and Mark + codepoints. The minor categories of Mark codepoints are + particularly important for shaping. Marks can be nonspacing + (Mn), spacing combining + (Mc), or enclosing (Me). +

+

+ In addition to the UGC property, codepoints in the Indic and + Southeast Asian scripts are also assigned + Unicode Indic Syllabic Category (UISC) and + Unicode Indic Positional Category (UIPC) + properties that provide more detailed information needed for + shaping. +

+

+ The UISC property sub-categorizes Letters and Marks according to + common script-shaping behaviors. For example, UISC distinguishes + between consonant letters, vowel letters, and vowel marks. The + UIPC property sub-categorizes Mark codepoints by the relative visual + position that they occupy (above, below, right, left, or in + multiple positions). +

+

+ Some complex scripts require that the text run be split into + syllables. What constitutes a valid syllable in these + scripts is specified in regular expressions, formed from the + Letter and Mark codepoints, that take the UISC and UIPC + properties into account. +

+
+ + + \ No newline at end of file diff --git a/docs/html/up-insensitive.png b/docs/html/up-insensitive.png index f404986..13e1a4f 100644 Binary files a/docs/html/up-insensitive.png and b/docs/html/up-insensitive.png differ diff --git a/docs/html/up.png b/docs/html/up.png index 80b4b37..67a9054 100644 Binary files a/docs/html/up.png and b/docs/html/up.png differ diff --git a/docs/html/using-harfbuzzs-native-opentype-implementation.html b/docs/html/using-harfbuzzs-native-opentype-implementation.html index 497e2e6..71cda2c 100644 --- a/docs/html/using-harfbuzzs-native-opentype-implementation.html +++ b/docs/html/using-harfbuzzs-native-opentype-implementation.html @@ -8,7 +8,7 @@ - + @@ -26,6 +26,6 @@

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/using-your-own-font-functions.html b/docs/html/using-your-own-font-functions.html index 043956c..400e3e0 100644 --- a/docs/html/using-your-own-font-functions.html +++ b/docs/html/using-your-own-font-functions.html @@ -7,8 +7,8 @@ - - + + @@ -26,6 +26,6 @@

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/what-about-the-other-scripts.html b/docs/html/what-about-the-other-scripts.html index 0f265ce..5b0ebed 100644 --- a/docs/html/what-about-the-other-scripts.html +++ b/docs/html/what-about-the-other-scripts.html @@ -8,7 +8,7 @@ - + @@ -26,6 +26,6 @@

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/what-harfbuzz-doesnt-do.html b/docs/html/what-harfbuzz-doesnt-do.html new file mode 100644 index 0000000..33309a1 --- /dev/null +++ b/docs/html/what-harfbuzz-doesnt-do.html @@ -0,0 +1,111 @@ + + + + +What HarfBuzz doesn't do: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+What HarfBuzz doesn't do

+

+ HarfBuzz will take a Unicode string, shape it, and give you the + information required to lay it out correctly on a single + horizontal (or vertical) line using the font provided. That is the + extent of HarfBuzz's responsibility. +

+

+ It is important to note that if you are implementing a complete + text-layout engine you may have other responsibilities that + HarfBuzz will not help you with. For example: +

+
    +
  • +

    + HarfBuzz won't help you with bidirectionality. If you want to + lay out text that includes a mix of Hebrew and English, you + will need to ensure that each buffer provided to HarfBuzz + has all of its characters in the same order and that the + directionality of the buffer is set correctly. This may mean + segmenting the text before it is placed into HarfBuzz buffers. In + other words, the user will hit the keys in the following + sequence: +

    +
    +	  A B C [space] ג ב א [space] D E F
    +        
    +

    + but will expect to see in the output: +

    +
    +	  ABC אבג DEF
    +        
    +

    + This reordering is called bidi processing + ("bidi" is short for bidirectional), and there's an + algorithm as an annex to the Unicode Standard which tells you how + to process a string of mixed directionality. + Before sending your string to HarfBuzz, you may need to apply the + bidi algorithm to it. Libraries such as ICU and fribidi can do this for you. +

    +
  • +
  • +

    + HarfBuzz won't help you with text that contains different font + properties. For instance, if you have the string "a + huge breakfast", and you expect + "huge" to be italic, then you will need to send three + strings to HarfBuzz: a, in your Roman font; + huge using your italic font; and + breakfast using your Roman font again. +

    +

    + Similarly, if you change the font, font size, script, + language, or direction within your string, then you will + need to shape each run independently and output them + independently. HarfBuzz expects to shape a run of characters + that all share the same properties. +

    +
  • +
  • +

    + HarfBuzz won't help you with line breaking, hyphenation, or + justification. As mentioned above, HarfBuzz lays out the string + along a single line of, notionally, + infinite length. If you want to find out where the potential + word, sentence and line break points are in your text, you + could use the ICU library's break iterator functions. +

    +

    + HarfBuzz can tell you how wide a shaped piece of text is, which is + useful input to a justification algorithm, but it knows nothing + about paragraphs, lines or line lengths. Nor will it adjust the + space between words to fit them proportionally into a line. +

    +
  • +
+

+ As a layout-engine implementor, HarfBuzz will help you with the + interface between your text and your font, and that's something + that you'll need—what you then do with the glyphs that your font + returns is up to you. +

+
+ + + \ No newline at end of file diff --git a/docs/html/what-is-harfbuzz.html b/docs/html/what-is-harfbuzz.html index aff2f7d..a3eb0a2 100644 --- a/docs/html/what-is-harfbuzz.html +++ b/docs/html/what-is-harfbuzz.html @@ -7,8 +7,8 @@ - - + + @@ -17,108 +17,84 @@ Home Up Prev -Next +Next

What is HarfBuzz?

- HarfBuzz is a text shaping engine. It solves - the problem of selecting and positioning glyphs from a font given a - Unicode string. + HarfBuzz is a text-shaping engine. If you + give HarfBuzz a font and a string containing a sequence of Unicode + codepoints, HarfBuzz selects and positions the corresponding + glyphs from the font, applying all of the necessary layout rules + and font features. HarfBuzz then returns the string to you in the + form that is correctly arranged for the language and writing + system. +

+

+ HarfBuzz can properly shape all of the world's major writing + systems. It runs on all major operating systems and software + platforms and it supports the major font formats in use + today.

-Why do I need it?

+What is text shaping?
+

+ Text shaping is the process of translating a string of character + codes (such as Unicode codepoints) into a properly arranged + sequence of glyphs that can be rendered onto a screen or into + final output form for inclusion in a document. +

+

+ The shaping process is dependent on the input string, the active + font, the script (or writing system) that the string is in, and + the language that the string is in. +

+

+ Modern software systems generally only deal with strings in the + Unicode encoding scheme (although legacy systems and documents may + involve other encodings). +

+

+ There are several font formats that a program might + encounter, each of which has a set of standard text-shaping + rules. +

+

The dominant format is OpenType. The + OpenType specification defines a series of shaping models for + various scripts from around the world. These shaping models depend on + the font incorporating certain features as + lookups in its GSUB + and GPOS tables. +

- Text shaping is an integral part of preparing text for display. It - is a fairly low level operation; HarfBuzz is used directly by - graphic rendering libraries such as Pango, and the layout engines - in Firefox, LibreOffice and Chromium. Unless you are - writing one of these layout engines yourself, - you will probably not need to use HarfBuzz - normally higher level - libraries will turn text into glyphs for you. + Alternatively, OpenType fonts can include shaping features for + the Graphite shaping model.

- However, if you are writing a layout engine - or graphics library yourself, you will need to perform text - shaping, and this is where HarfBuzz can help you. Here are some - reasons why you need it: + TrueType fonts can also include OpenType shaping + features. Alternatively, TrueType fonts can also include Apple + Advanced Typography (AAT) tables to implement shaping + support. AAT fonts are generally only found on macOS and iOS systems.

-
    -
  • - OpenType fonts contain a set of glyphs, indexed by glyph ID. - The glyph ID within the font does not necessarily relate to a - Unicode codepoint. For instance, some fonts have the letter - "a" as glyph ID 1. To pull the right glyph out of - the font in order to display it, you need to consult a table - within the font (the "cmap" table) which maps - Unicode codepoints to glyph IDs. Text shaping turns codepoints - into glyph IDs. -

  • -
  • - Many OpenType fonts contain ligatures: combinations of - characters which are rendered together. For instance, it's - common for the fi combination to appear in - print as the single ligature "fi". Whether you should - render text as fi or "fi" does not - depend on the input text, but on the capabilities of the font - and the level of ligature application you wish to perform. - Text shaping involves querying the font's ligature tables and - determining what substitutions should be made. -

  • -
  • - While ligatures like "fi" are typographic - refinements, some languages require such - substitutions to be made in order to display text correctly. - In Tamil, when the letter "TTA" (ட) letter is - followed by "U" (உ), the combination should appear - as the single glyph "டு". The sequence of Unicode - characters "டஉ" needs to be rendered as a single - glyph from the font - text shaping chooses the correct glyph - from the sequence of characters provided. -

  • -
  • - Similarly, each Arabic character has four different variants: - within a font, there will be glyphs for the initial, medial, - final, and isolated forms of each letter. Unicode only encodes - one codepoint per character, and so a Unicode string will not - tell you which glyph to use. Text shaping chooses the correct - form of the letter and returns the correct glyph from the font - that you need to render. -

  • -
  • - Other languages have marks and accents which need to be - rendered in certain positions around a base character. For - instance, the Moldovan language has the Cyrillic letter - "zhe" (ж) with a breve accent, like so: ӂ. Some - fonts will contain this character as an individual glyph, - whereas other fonts will not contain a zhe-with-breve glyph - but expect the rendering engine to form the character by - overlaying the two glyphs ж and ˘. Where you should draw the - combining breve depends on the height of the preceding glyph. - Again, for Arabic, the correct positioning of vowel marks - depends on the height of the character on which you are - placing the mark. Text shaping tells you whether you have a - precomposed glyph within your font or if you need to compose a - glyph yourself out of combining marks, and if so, where to - position those marks. -

  • -

- If this is something that you need to do, then you need a text - shaping engine: you could use Uniscribe if you are using Windows; - you could use CoreText on OS X; or you could use HarfBuzz. In the - rest of this manual, we are going to assume that you are the - implementor of a text layout engine. + Text strings will usually be tagged with a script and language + tag that provide the context needed to perform text shaping + correctly. The necessary script + and language + tags are defined by OpenType.

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/why-do-i-need-a-shaping-engine.html b/docs/html/why-do-i-need-a-shaping-engine.html new file mode 100644 index 0000000..1c2350b --- /dev/null +++ b/docs/html/why-do-i-need-a-shaping-engine.html @@ -0,0 +1,174 @@ + + + + +Why do I need a shaping engine?: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Why do I need a shaping engine?

+

+ Text shaping is an integral part of preparing text for + display. Before a Unicode sequence can be rendered, the + codepoints in the sequence must be mapped to the corresponding + glyphs provided in the font, and those glyphs must be positioned + correctly relative to each other. For many of the scripts + supported in Unicode, these steps involve script-specific layout + rules, including complex joining, reordering, and positioning + behavior. Implementing these rules is the job of the shaping engine. +

+

+ Text shaping is a fairly low-level operation. HarfBuzz is + used directly by text-handling libraries like Pango, as well as by the layout + engines in Firefox, LibreOffice, and Chromium. Unless you are + writing one of these layout engines + yourself, you will probably not need to use HarfBuzz: normally, + a layout engine, toolkit, or other library will turn text into + glyphs for you. +

+

+ However, if you are writing a layout engine + or graphics library yourself, then you will need to perform text + shaping, and this is where HarfBuzz can help you. +

+

+ Here are some specific scenarios where a text-shaping engine + like HarfBuzz helps you: +

+
    +
  • +

    + OpenType fonts contain a set of glyphs (that is, shapes + to represent the letters, numbers, punctuation marks, and + all other symbols), which are indexed by a glyph ID. +

    +

    + A particular glyph ID within the font does not necessarily + correlate to a predictable Unicode codepoint. For instance, + some fonts have the letter "a" as glyph ID 1, but + many others do not. In order to retrieve the right glyph + from the font to display "a", you need to consult + the table inside the font (the cmap + table) that maps Unicode codepoints to glyph IDs. In other + words, text shaping turns codepoints into glyph + IDs. +

    +
  • +
  • +

    + Many OpenType fonts contain ligatures: combinations of + characters that are rendered as a single unit. For instance, + it is common for the "f, i" letter + sequence to appear in print as the single ligature glyph + "fi". +

    +

    + Whether you should render an "f, i" sequence + as fi or as "fi" does not + depend on the input text. Instead, it depends on the whether + or not the font includes an "fi" glyph and on the + level of ligature application you wish to perform. The font + and the amount of ligature application used are under your + control. In other words, text shaping involves + querying the font's ligature tables and determining what + substitutions should be made. +

    +
  • +
  • +

    + While ligatures like "fi" are optional typographic + refinements, some languages require certain + substitutions to be made in order to display text correctly. +

    +

    + For example, in Tamil, when the letter "TTA" (ட) + letter is followed by "U" (உ), the pair + must be replaced by the single glyph "டு". The + sequence of Unicode characters "டஉ" needs to be + substituted with a single "டு" glyph from the + font. +

    +

    + But "டு" does not have a Unicode codepoint. To + find this glyph, you need to consult the table inside + the font (the GSUB table) that contains + substitution information. In other words, text shaping + chooses the correct glyph for a sequence of characters + provided. +

    +
  • +
  • +

    + Similarly, each Arabic character has four different variants + corresponding to the different positions it might appear in + within a sequence. Inside a font, there will be separate + glyphs for the initial, medial, final, and isolated forms of + each letter, each at a different glyph ID. +

    +

    + Unicode only assigns one codepoint per character, so a + Unicode string will not tell you which glyph variant to use + for each character. To decide, you need to analyze the whole + string and determine the appropriate glyph for each character + based on its position. In other words, text + shaping chooses the correct form of the letter by its + position and returns the correct glyph from the font. +

    +
  • +
  • +

    + Other languages involve marks and accents that need to be + rendered in specific positions relative a base character. For + instance, the Moldovan language includes the Cyrillic letter + "zhe" (ж) with a breve accent, like so: "ӂ". +

    +

    + Some fonts will provide this character as a single + zhe-with-breve glyph, but other fonts will not and, instead, + will expect the rendering engine to form the character by + superimposing the separate "ж" and "˘" + glyphs. +

    +

    + But exactly where you should draw the breve depends on the + height and width of the preceding zhe glyph. To find the + right position, you need to consult the table inside + the font (the GPOS table) that contains + positioning information. + In other words, text shaping tells you whether you + have a precomposed glyph within your font or if you need to + compose a glyph yourself out of combining marks—and, + if so, where to position those marks. +

    +
  • +
+

+ If tasks like these are something that you need to do, then you + need a text shaping engine. You could use Uniscribe if you are + writing Windows software; you could use CoreText on macOS; or + you could use HarfBuzz. +

+

+ In the rest of this manual, the text will assume that the reader + is that implementor of a text-layout engine. +

+
+ + + \ No newline at end of file diff --git a/docs/html/why-is-it-called-harfbuzz.html b/docs/html/why-is-it-called-harfbuzz.html index 960d835..dbc62c1 100644 --- a/docs/html/why-is-it-called-harfbuzz.html +++ b/docs/html/why-is-it-called-harfbuzz.html @@ -6,9 +6,9 @@ - - - + + + @@ -16,23 +16,23 @@ Home Up -Prev +Prev Next

Why is it called HarfBuzz?

- HarfBuzz began its life as text shaping code within the FreeType - project, (and you will see references to the FreeType authors - within the source code copyright declarations) but was then - abstracted out to its own project. This project is maintained by - Behdad Esfahbod, and named HarfBuzz. Originally, it was a shaping - engine for OpenType fonts - "HarfBuzz" is the Persian - for "open type". + HarfBuzz began its life as text-shaping code within the FreeType + project (and you will see references to the FreeType authors + within the source code copyright declarations), but was then + extracted out to its own project. This project is maintained by + Behdad Esfahbod, who named it HarfBuzz. Originally, it was a + shaping engine for OpenType fonts—"HarfBuzz" is + the Persian for "open type".

+
Generated by GTK-Doc V1.25 \ No newline at end of file diff --git a/docs/html/working-with-harfbuzz-clusters.html b/docs/html/working-with-harfbuzz-clusters.html new file mode 100644 index 0000000..8d40cd0 --- /dev/null +++ b/docs/html/working-with-harfbuzz-clusters.html @@ -0,0 +1,227 @@ + + + + +Working with HarfBuzz clusters: HarfBuzz Manual + + + + + + + + + + + + + + + + +
+

+Working with HarfBuzz clusters

+

+ When you add text to a HarfBuzz buffer, each code point must be + assigned a cluster value. +

+

+ This cluster value is an arbitrary number; HarfBuzz uses it only + to distinguish between clusters. Many client programs will use + the index of each code point in the input text stream as the + cluster value. This is for the sake of convenience; the actual + value does not matter. +

+

+ Some of the shaping operations performed by HarfBuzz — + such as reordering, composition, decomposition, and substitution + — may alter the cluster values of some characters. The + final cluster values in the buffer at the end of the shaping + process will indicate to client programs which subsequences of + glyphs represent a cluster and, therefore, must not be + separated. +

+

+ In addition, client programs can query the final cluster values + to discern other potentially important information about the + glyphs in the output buffer (such as whether or not a ligature + was formed). +

+

+ For example, if the initial sequence of cluster values was: +

+
+      0,1,2,3,4
+    
+

+ and the final sequence of cluster values is: +

+
+      0,0,3,3
+    
+

+ then there are two clusters in the output buffer: the first + cluster includes the first two glyphs, and the second cluster + includes the third and fourth glyphs. It is also evident that a + ligature or conjunct has been formed, because there are fewer + glyphs in the output buffer (four) than there were code points + in the input buffer (five). +

+

+ Although client programs using HarfBuzz are free to assign + initial cluster values in any manner they choose to, HarfBuzz + does offer some useful guarantees if the cluster values are + assigned in a monotonic (either non-decreasing or non-increasing) + order. +

+

+ For left-to-right scripts (LTR) and top-to-bottom scripts (TTB), + HarfBuzz will preserve the monotonic property: client programs + are guaranteed that monotonically increasing initial clulster + values will be returned as monotonically increasing final + cluster values. +

+

+ For right-to-left scripts (RTL) and bottom-to-top scripts (BTT), + the directionality of the buffer itself is reversed for final + output as a matter of design. Therefore, HarfBuzz inverts the + monotonic property: client programs are guaranteed that + monotonically increasing initial clulster values will be + returned as monotonically decreasing final + cluster values. +

+

+ Client programs can adjust how HarfBuzz handles clusters during + shaping by setting the + cluster_level of the + buffer. HarfBuzz offers three levels of + clustering support for this property: +

+
    +
  • +

    Level 0 is the default and + reproduces the behavior of the old HarfBuzz library. +

    +

    + The distinguishing feature of level 0 behavior is that, at + the beginning of processing the buffer, all code points that + are categorized as marks, + modifier symbols, or + Emoji extended pictographic modifiers, + as well as the Zero Width Joiner and + Zero Width Non-Joiner code points, are + assigned the cluster value of the closest preceding code + point from different category. +

    +

    + In essence, whenever a base character is followed by a mark + character or a sequence of mark characters, those marks are + reassigned to the same initial cluster value as the base + character. This reassignment is referred to as + "merging" the affected clusters. This behavior is based on + the Grapheme Cluster Boundary specification in Unicode + Technical Report 29. +

    +

    + Client programs can specify level 0 behavior for a buffer by + setting its cluster_level to + HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES. +

    +
  • +
  • +

    + Level 1 tweaks the old behavior + slightly to produce better results. Therefore, level 1 + clustering is recommended for code that is not required to + implement backward compatibility with the old HarfBuzz. +

    +

    + Level 1 differs from level 0 by not merging the + clusters of marks and other modifier code points with the + preceding "base" code point's cluster. By preserving the + separate cluster values of these marks and modifier code + points, script shapers can perform additional operations + that might lead to improved results (for example, reordering + a sequence of marks). +

    +

    + Client programs can specify level 1 behavior for a buffer by + setting its cluster_level to + HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS. +

    +
  • +
  • +

    + Level 2 differs significantly in how it + treats cluster values. In level 2, HarfBuzz never merges + clusters. +

    +

    + This difference can be seen most clearly when HarfBuzz processes + ligature substitutions and glyph decompositions. In level 0 + and level 1, ligatures and glyph decomposition both involve + merging clusters; in level 2, neither of these operations + triggers a merge. +

    +

    + Client programs can specify level 2 behavior for a buffer by + setting its cluster_level to + HB_BUFFER_CLUSTER_LEVEL_CHARACTERS. +

    +
  • +
+

+ As mentioned earlier, client programs using HarfBuzz often + assign initial cluster values in a buffer by reusing the indices + of the code points in the input text. This gives a sequence of + cluster values that is monotonically increasing (for example, + 0,1,2,3,4). +

+

+ It is not required that the cluster values + in a buffer be monotonically increasing. However, if the initial + cluster values in a buffer are monotonic and the buffer is + configured to use cluster level 0 or 1, then HarfBuzz + guarantees that the final cluster values in the shaped buffer + will also be monotonic. No such guarantee is made for cluster + level 2. +

+

+ In levels 0 and 1, HarfBuzz implements the following conceptual + model for cluster values: +

+
    +
  • + If the sequence of input cluster values is monotonic, the + sequence of cluster values will remain monotonic. +

  • +
  • + Each cluster value represents a single cluster. +

  • +
  • + Each cluster contains one or more glyphs and one or more + characters. +

  • +
+

+ In practice, this model offers several benefits. Assuming that + the initial cluster values were monotonically increasing + and distinct before shaping began, then, in the final output: +

+
    +
  • + All adjacent glyphs having the same final cluster + value belong to the same cluster. +

  • +
  • + Each character belongs to the cluster that has the highest + cluster value not larger than its + initial cluster value. +

  • +
+
+ + + \ No newline at end of file diff --git a/docs/usermanual-buffers-language-script-and-direction.xml b/docs/usermanual-buffers-language-script-and-direction.xml index 9eddb71..1c6b5da 100644 --- a/docs/usermanual-buffers-language-script-and-direction.xml +++ b/docs/usermanual-buffers-language-script-and-direction.xml @@ -1,3 +1,9 @@ + + + +]> Buffers, language, script and direction @@ -9,14 +15,15 @@
Creating and destroying buffers - As we saw in our initial example, a buffer is created and + As we saw in our Getting Started example, a + buffer is created and initialized with hb_buffer_create(). This produces a new, empty buffer object, instantiated with some default values and ready to accept your Unicode strings. - HarfBuzz manages the memory of objects that it creates (such as - buffers), so you don't have to. When you have finished working on + HarfBuzz manages the memory of objects (such as buffers) that it + creates, so you don't have to. When you have finished working on a buffer, you can call hb_buffer_destroy(): @@ -74,4 +81,4 @@ void somefunc(hb_buffer_t *buffer) {
-
\ No newline at end of file + diff --git a/docs/usermanual-clusters.xml b/docs/usermanual-clusters.xml index 608371b..228cc56 100644 --- a/docs/usermanual-clusters.xml +++ b/docs/usermanual-clusters.xml @@ -1,304 +1,695 @@ + + + +]> - Clusters - - In shaping text, a cluster is a sequence of - code points that needs to be treated as a single, indivisible unit. - - - When you add text to a HB buffer, each character is associated with - a cluster value. This is an arbitrary number as - far as HB is concerned. - - - Most clients will use UTF-8, UTF-16, or UTF-32 indices, but the - actual number does not matter. Moreover, it is not required for the - cluster values to be monotonically increasing, but pretty much all - of HB's tests are performed on monotonically increasing cluster - numbers. Nevertheless, there is no such assumption in the code - itself. With that in mind, let's examine what happens with cluster - values during shaping under each cluster-level. - - - HarfBuzz provides three levels of clustering - support. Level 0 is the default behavior and reproduces the behavior - of the old HarfBuzz library. Level 1 tweaks this behavior slightly - to produce better results, so level 1 clustering is recommended for - code that is not required to implement backward compatibility with - the old HarfBuzz. - - - Level 2 differs significantly in how it treats cluster values. - Levels 0 and 1 both process ligatures and glyph decomposition by - merging clusters; level 2 does not. - - - The conceptual model for what the cluster values mean, in levels 0 - and 1, is this: - - - - - the sequence of cluster values will always remain monotone - - - - - each value represents a single cluster - - - - - each cluster contains one or more glyphs and one or more - characters - - - - - Assuming that initial cluster numbers were monotonically increasing - and distinct, then all adjacent glyphs having the same cluster - number belong to the same cluster, and all characters belong to the - cluster that has the highest number not larger than their initial - cluster number. This will become clearer with an example. - - - - A clustering example for levels 0 and 1 - - Let's say we start with the following character sequence and cluster - values: - - - A,B,C,D,E - 0,1,2,3,4 - - - We then map the characters to glyphs. For simplicity, let's assume - that each character maps to the corresponding, identical-looking - glyph: - - - A,B,C,D,E - 0,1,2,3,4 - - - Now if, for example, B and C - ligate, then the clusters to which they belong "merge". - This merged cluster takes for its cluster number the minimum of all - the cluster numbers of the clusters that went in. In this case, we - get: - - - A,BC,D,E - 0,1 ,3,4 - - - Now let's assume that the BC glyph decomposes - into three components, and D also decomposes into - two. The components each inherit the cluster value of their parent: - - - A,BC0,BC1,BC2,D0,D1,E - 0,1 ,1 ,1 ,3 ,3 ,4 - - - Now if BC2 and D0 ligate, then - their clusters (numbers 1 and 3) merge into - min(1,3) = 1: - - - A,BC0,BC1,BC2D0,D1,E - 0,1 ,1 ,1 ,1 ,4 - - - At this point, cluster 1 means: the character sequence - BCD is represented by glyphs - BC0,BC1,BC2D0,D1 and cannot be broken down any - further. - - - - Reordering in levels 0 and 1 - - Another common operation in the more complex shapers is when things - reorder. In those cases, to maintain monotone clusters, HB merges - the clusters of everything in the reordering sequence. For example, - let's again start with the character sequence: - - - A,B,C,D,E - 0,1,2,3,4 - - - If D is reordered before B, - then the B, C, and - D clusters merge, and we get: - - - A,D,B,C,E - 0,1,1,1,4 - - - This is clearly not ideal, but it is the only sensible way to - maintain monotone indices and retain the true relationship between - glyphs and characters. - - - - The distinction between levels 0 and 1 - - So, the above is pretty much what cluster levels 0 and 1 do. The - only difference between the two is this: in level 0, at the very - beginning of the shaping process, we also merge clusters between - base characters and all Unicode marks (combining or not) following - them. E.g.: - - - A,acute,B - 0,1 ,2 - - - will become: - - - A,acute,B - 0,0 ,2 - - - This is the default behavior. We do it because Windows did it and - old HarfBuzz did it, so this remained the default. But this behavior - makes it impossible to color diacritic marks differently from their - base characters. That's why in level 1 we do not perform this - initial merging step. - - - For clients, level 0 is more convenient if they rely on HarfBuzz - clusters for cursor positioning. But that's wrong anyway: cursor - positions should be determined based on Unicode grapheme boundaries, - NOT shaping clusters. As such, level 1 clusters are preferred. - - - One last note about levels 0 and 1. We currently don't allow a - MultipleSubst lookup to replace a glyph with zero - glyphs (i.e., to delete a glyph). But in some other situations, - glyphs can be deleted. In those cases, if the glyph being deleted is - the last glyph of its cluster, we make sure to merge the cluster - with a neighboring cluster. - - - This is, primarily, to make sure that the starting cluster of the - text always has the cluster index pointing to the start of the text - for the run; more than one client currently relies on this - guarantee. - - - Incidentally, Apple's CoreText does something else to maintain the - same promise: it inserts a glyph with id 65535 at the beginning of - the glyph string if the glyph corresponding to the first character - in the run was deleted. HarfBuzz might do something similar in the - future. - - - - Level 2 - - Level 2 is a different beast from levels 0 and 1. It is simple to - describe, but hard to make sense of. It simply doesn't do any - cluster merging whatsoever. When things ligate or otherwise multiple - glyphs turn into one, the cluster value of the first glyph is - retained. - - - Here are a few examples of why processing cluster values produced at - this level might be tricky: - - - Ligatures with combining marks - - Imagine capital letters are bases and lower case letters are - combining marks. With an input sequence like this: +
+ Clusters and shaping + + In text shaping, a cluster is a sequence of + characters that needs to be treated as a single, indivisible + unit. A single letter or symbol can be a cluster of its + own. Other clusters correspond to longer subsequences of the + input code points — such as a ligature or conjunct form + — and require the shaper to ensure that the cluster is not + broken during the shaping process. + + + A cluster is distinct from a grapheme, + which is the smallest unit of meaning in a writing system or + script. + + + The definitions of the two terms are similar. However, clusters + are only relevant for script shaping and glyph layout. In + contrast, graphemes are a property of the underlying script, and + are of interest when client programs implement orthographic + or linguistic functionality. + + + For example, two individual letters are often two separate + graphemes. When two letters form a ligature, however, they + combine into a single glyph. They are then part of the same + cluster and are treated as a unit by the shaping engine — + even though the two original, underlying letters remain separate + graphemes. + + + HarfBuzz is concerned with clusters, not + with graphemes — although client programs using HarfBuzz + may still care about graphemes for other reasons from time to time. + + + During the shaping process, there are several shaping operations + that may merge adjacent characters (for example, when two code + points form a ligature or a conjunct form and are replaced by a + single glyph) or split one character into several (for example, + when decomposing a code point through the + ccmp feature). Operations like these alter + clusters; HarfBuzz tracks the changes to ensure that no clusters + get lost or broken during shaping. + + + HarfBuzz records cluster information independently from how + shaping operations affect the individual glyphs returned in an + output buffer. Consequently, a client program using HarfBuzz can + utilize the cluster information to implement features such as: + + + + + Correctly positioning the cursor within a shaped text run, + even when characters have formed ligatures, composed or + decomposed, reordered, or undergone other shaping operations. + + + + + Correctly highlighting a text selection that includes some, + but not all, of the characters in a word. + + + + + Applying text attributes (such as color or underlining) to + part, but not all, of a word. + + + + + Generating output document formats (such as PDF) with + embedded text that can be fully extracted. + + + + + Determining the mapping between input characters and output + glyphs, such as which glyphs are ligatures. + + + + + Performing line-breaking, justification, and other + line-level or paragraph-level operations that must be done + after shaping is complete, but which require examining + character-level properties. + + + +
+
+ Working with HarfBuzz clusters + + When you add text to a HarfBuzz buffer, each code point must be + assigned a cluster value. + + + This cluster value is an arbitrary number; HarfBuzz uses it only + to distinguish between clusters. Many client programs will use + the index of each code point in the input text stream as the + cluster value. This is for the sake of convenience; the actual + value does not matter. + + + Some of the shaping operations performed by HarfBuzz — + such as reordering, composition, decomposition, and substitution + — may alter the cluster values of some characters. The + final cluster values in the buffer at the end of the shaping + process will indicate to client programs which subsequences of + glyphs represent a cluster and, therefore, must not be + separated. + + + In addition, client programs can query the final cluster values + to discern other potentially important information about the + glyphs in the output buffer (such as whether or not a ligature + was formed). + + + For example, if the initial sequence of cluster values was: + + + 0,1,2,3,4 + + + and the final sequence of cluster values is: - A,a,B,b,C,c - 0,1,2,3,4,5 - + 0,0,3,3 + - if A,B,C ligate, then here are the cluster - values one would get under the various levels: + then there are two clusters in the output buffer: the first + cluster includes the first two glyphs, and the second cluster + includes the third and fourth glyphs. It is also evident that a + ligature or conjunct has been formed, because there are fewer + glyphs in the output buffer (four) than there were code points + in the input buffer (five). - level 0: + Although client programs using HarfBuzz are free to assign + initial cluster values in any manner they choose to, HarfBuzz + does offer some useful guarantees if the cluster values are + assigned in a monotonic (either non-decreasing or non-increasing) + order. + + + For left-to-right scripts (LTR) and top-to-bottom scripts (TTB), + HarfBuzz will preserve the monotonic property: client programs + are guaranteed that monotonically increasing initial clulster + values will be returned as monotonically increasing final + cluster values. + + + For right-to-left scripts (RTL) and bottom-to-top scripts (BTT), + the directionality of the buffer itself is reversed for final + output as a matter of design. Therefore, HarfBuzz inverts the + monotonic property: client programs are guaranteed that + monotonically increasing initial clulster values will be + returned as monotonically decreasing final + cluster values. + + + Client programs can adjust how HarfBuzz handles clusters during + shaping by setting the + cluster_level of the + buffer. HarfBuzz offers three levels of + clustering support for this property: + + + + Level 0 is the default and + reproduces the behavior of the old HarfBuzz library. + + + The distinguishing feature of level 0 behavior is that, at + the beginning of processing the buffer, all code points that + are categorized as marks, + modifier symbols, or + Emoji extended pictographic modifiers, + as well as the Zero Width Joiner and + Zero Width Non-Joiner code points, are + assigned the cluster value of the closest preceding code + point from different category. + + + In essence, whenever a base character is followed by a mark + character or a sequence of mark characters, those marks are + reassigned to the same initial cluster value as the base + character. This reassignment is referred to as + "merging" the affected clusters. This behavior is based on + the Grapheme Cluster Boundary specification in Unicode + Technical Report 29. + + + Client programs can specify level 0 behavior for a buffer by + setting its cluster_level to + HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES. + + + + + Level 1 tweaks the old behavior + slightly to produce better results. Therefore, level 1 + clustering is recommended for code that is not required to + implement backward compatibility with the old HarfBuzz. + + + Level 1 differs from level 0 by not merging the + clusters of marks and other modifier code points with the + preceding "base" code point's cluster. By preserving the + separate cluster values of these marks and modifier code + points, script shapers can perform additional operations + that might lead to improved results (for example, reordering + a sequence of marks). + + + Client programs can specify level 1 behavior for a buffer by + setting its cluster_level to + HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS. + + + + + Level 2 differs significantly in how it + treats cluster values. In level 2, HarfBuzz never merges + clusters. + + + This difference can be seen most clearly when HarfBuzz processes + ligature substitutions and glyph decompositions. In level 0 + and level 1, ligatures and glyph decomposition both involve + merging clusters; in level 2, neither of these operations + triggers a merge. + + + Client programs can specify level 2 behavior for a buffer by + setting its cluster_level to + HB_BUFFER_CLUSTER_LEVEL_CHARACTERS. + + + + + As mentioned earlier, client programs using HarfBuzz often + assign initial cluster values in a buffer by reusing the indices + of the code points in the input text. This gives a sequence of + cluster values that is monotonically increasing (for example, + 0,1,2,3,4). + + + It is not required that the cluster values + in a buffer be monotonically increasing. However, if the initial + cluster values in a buffer are monotonic and the buffer is + configured to use cluster level 0 or 1, then HarfBuzz + guarantees that the final cluster values in the shaped buffer + will also be monotonic. No such guarantee is made for cluster + level 2. + + + In levels 0 and 1, HarfBuzz implements the following conceptual + model for cluster values: + + + + + If the sequence of input cluster values is monotonic, the + sequence of cluster values will remain monotonic. + + + + + Each cluster value represents a single cluster. + + + + + Each cluster contains one or more glyphs and one or more + characters. + + + + + In practice, this model offers several benefits. Assuming that + the initial cluster values were monotonically increasing + and distinct before shaping began, then, in the final output: + + + + + All adjacent glyphs having the same final cluster + value belong to the same cluster. + + + + + Each character belongs to the cluster that has the highest + cluster value not larger than its + initial cluster value. + + + +
+ +
+ A clustering example for levels 0 and 1 + + The basic shaping operations affect clusters in a predictable + manner when using level 0 or level 1: + + + + + When two or more clusters merge, the + resulting merged cluster takes as its cluster value the + minimum of the incoming cluster values. + + + + + When a cluster decomposes, all of the + resulting child clusters inherit as their cluster value the + cluster value of the parent cluster. + + + + + When a character is reordered, the + reordered character and all clusters that the character + moves past as part of the reordering are merged into one cluster. + + + + + The functionality, guarantees, and benefits of level 0 and level + 1 behavior can be seen with some examples. First, let us examine + what happens with cluster values when shaping involves cluster + merging with ligatures and decomposition. + + + + Let's say we start with the following character sequence (top row) and + initial cluster values (bottom row): - ABC,a,b,c - 0 ,0,0,0 - + A,B,C,D,E + 0,1,2,3,4 + - level 1: + During shaping, HarfBuzz maps these characters to glyphs from + the font. For simplicity, let us assume that each character maps + to the corresponding, identical-looking glyph: - ABC,a,b,c - 0 ,0,0,5 - + A,B,C,D,E + 0,1,2,3,4 + - level 2: + Now if, for example, B and C + form a ligature, then the clusters to which they belong + "merge". This merged cluster takes for its cluster + value the minimum of all the cluster values of the clusters that + went in to the ligature. In this case, we get: - ABC,a,b,c - 0 ,1,3,5 - + A,BC,D,E + 0,1 ,3,4 + + + because 1 is the minimum of the set {1,2}, which were the + cluster values of B and + C. + + + Next, let us say that the BC ligature glyph + decomposes into three components, and D also + decomposes into two components. Whenever a cluster decomposes, + its components each inherit the cluster value of their parent: + + + A,BC0,BC1,BC2,D0,D1,E + 0,1 ,1 ,1 ,3 ,3 ,4 + + + Next, if BC2 and D0 form a + ligature, then their clusters (cluster values 1 and 3) merge into + min(1,3) = 1: + + + A,BC0,BC1,BC2D0,D1,E + 0,1 ,1 ,1 ,1 ,4 + + + Note that the entirety of cluster 3 merges into cluster 1, not + just the D0 glyph. This reflects the fact + that the cluster must be treated as an + indivisible unit. + - Making sense of the last example is the hardest for a client, - because there is nothing in the cluster values to suggest that - B and C ligated with - A. + At this point, cluster 1 means: the character sequence + BCD is represented by glyphs + BC0,BC1,BC2D0,D1 and cannot be broken down any + further. - - - Reordering +
+
+ Reordering in levels 0 and 1 - Another tricky case is when things reorder. Under level 2: + Another common operation in the more complex shapers is glyph + reordering. In order to maintain a monotonic cluster sequence + when glyph reordering takes place, HarfBuzz merges the clusters + of everything in the reordering sequence. + + + For example, let us again start with the character sequence (top + row) and initial cluster values (bottom row): - A,B,C,D,E - 0,1,2,3,4 - + A,B,C,D,E + 0,1,2,3,4 + - Now imagine D moves before - B: + If D is reordered to the position immediately + before B, then HarfBuzz merges the + B, C, and + D clusters — all the clusters between + the final position of the reordered glyph and its original + position. This means that we get: - A,D,B,C,E - 0,3,1,2,4 - + A,D,B,C,E + 0,1,1,1,4 + + + as the final cluster sequence. + + + Merging this many clusters is not ideal, but it is the only + sensible way for HarfBuzz to maintain the guarantee that the + sequence of cluster values remains monotonic and to retain the + true relationship between glyphs and characters. + +
+
+ The distinction between levels 0 and 1 + + The preceding examples demonstrate the main effects of using + cluster levels 0 and 1. The only difference between the two + levels is this: in level 0, at the very beginning of the shaping + process, HarfBuzz merges the cluster of each base character + with the clusters of all Unicode marks (combining or not) and + modifiers that follow it. + - Now, if D ligates with B, we - get: + For example, let us start with the following character sequence + (top row) and accompanying initial cluster values (bottom row): - A,DB,C,E - 0,3 ,2,4 - + A,acute,B + 0,1 ,2 + - In a different scenario, A and - B could have ligated - before D reordered; that - would have resulted in: + The acute is a Unicode mark. If HarfBuzz is + using cluster level 0 on this sequence, then the + A and acute clusters will + merge, and the result will become: - AB,D,C,E - 0 ,3,2,4 - + A,acute,B + 0,0 ,2 + + + This merger is performed before any other script-shaping + steps. + + + This initial cluster merging is the default behavior of the + Windows shaping engine, and the old HarfBuzz codebase copied + that behavior to maintain compatibility. Consequently, it has + remained the default behavior in the new HarfBuzz codebase. + + + But this initial cluster-merging behavior makes it impossible + client programs to implement some features (such as to + color diacritic marks differently from their base + characters). That is why, in level 1, HarfBuzz does not perform + the initial merging step. + + + For client programs that rely on HarfBuzz cluster values to + perform cursor positioning, level 0 is more convenient. But + relying on cluster boundaries for cursor positioning is wrong: cursor + positions should be determined based on Unicode grapheme + boundaries, not on shaping-cluster boundaries. As such, using + level 1 clustering behavior is recommended. + - There's no way to differentiate between these two scenarios based - on the cluster numbers alone. + One final facet of levels 0 and 1 is worth noting. HarfBuzz + currently does not allow any + multiple-substitution GSUB lookups to + replace a glyph with zero glyphs (in other words, to delete a + glyph). - Another problem happens with ligatures under level 2 if the - direction of the text is forced to opposite of its natural - direction (e.g. left-to-right Arabic). But that's too much of a - corner case to worry about. + But, in some other situations, glyphs can be deleted. In + those cases, if the glyph being deleted is the last glyph of its + cluster, HarfBuzz makes sure to merge the deleted glyph's + cluster with a neighboring cluster. - - + + This is done primarily to make sure that the starting cluster of the + text always has the cluster index pointing to the start of the text + for the run; more than one client program currently relies on this + guarantee. + + + Incidentally, Apple's CoreText does something different to + maintain the same promise: it inserts a glyph with id 65535 at + the beginning of the glyph string if the glyph corresponding to + the first character in the run was deleted. HarfBuzz might do + something similar in the future. + +
+
+ Level 2 + + HarfBuzz's level 2 cluster behavior uses a significantly + different model than that of level 0 and level 1. + + + The level 2 behavior is easy to describe, but it may be + difficult to understand in practical terms. In brief, level 2 + performs no merging of clusters whatsoever. + + + This means that there is no initial base-and-mark merging step + (as is done in level 0), and it means that reordering moves and + ligature substitutions do not trigger a cluster merge. + + + Only one shaping operation directly affects clusters when using + level 2: + + + + + When a cluster decomposes, all of the + resulting child clusters inherit as their cluster value the + cluster value of the parent cluster. + + + + + When glyphs do form a ligature (or when some other feature + substitutes multiple glyphs with one glyph) the cluster value + of the first glyph is retained as the cluster value for the + resulting ligature. + + + This occurrence sounds similar to a cluster merge, but it is + different. In particular, no subsequent characters — + including marks and modifiers — are affected. They retain + their previous cluster values. + + + Level 2 cluster behavior is ultimately less complex than level 0 + or level 1, but there are several cases for which processing + cluster values produced at level 2 may be tricky. + +
+ Ligatures with combining marks in level 2 + + The first example of how HarfBuzz's level 2 cluster behavior + can be tricky is when the text to be shaped includes combining + marks attached to ligatures. + + + Let us start with an input sequence with the following + characters (top row) and initial cluster values (bottom row): + + + A,acute,B,breve,C,circumflex + 0,1 ,2,3 ,4,5 + + + If the sequence A,B,C forms a ligature, + then these are the cluster values HarfBuzz will return under + the various cluster levels: + + + Level 0: + + + ABC,acute,breve,circumflex + 0 ,0 ,0 ,0 + + + Level 1: + + + ABC,acute,breve,circumflex + 0 ,0 ,0 ,5 + + + Level 2: + + + ABC,acute,breve,circumflex + 0 ,1 ,3 ,5 + + + Making sense of the level 2 result is the hardest for a client + program, because there is nothing in the cluster values that + indicates that B and C + formed a ligature with A. + + + In contrast, the "merged" cluster values of the mark glyphs + that are seen in the level 0 and level 1 output are evidence + that a ligature substitution took place. + +
+
+ Reordering in level 2 + + Another example of how HarfBuzz's level 2 cluster behavior + can be tricky is when glyphs reorder. Consider an input sequence + with the following characters (top row) and initial cluster + values (bottom row): + + + A,B,C,D,E + 0,1,2,3,4 + + + Now imagine D moves before + B in a reordering operation. The cluster + values will then be: + + + A,D,B,C,E + 0,3,1,2,4 + + + Next, if D forms a ligature with + B, the output is: + + + A,DB,C,E + 0,3 ,2,4 + + + However, in a different scenario, in which the shaping rules + of the script instead caused A and + B to form a ligature + before the D reordered, the + result would be: + + + AB,D,C,E + 0 ,3,2,4 + + + There is no way for a client program to differentiate between + these two scenarios based on the cluster values + alone. Consequently, client programs that use level 2 might + need to undertake additional work in order to manage cursor + positioning, text attributes, or other desired features. + +
+
+ Other considerations in level 2 + + There may be other problems encountered with ligatures under + level 2, such as if the direction of the text is forced to + opposite of its natural direction (for example, Arabic text + that is forced into left-to-right directionality). But, + generally speaking, these other scenarios are minor corner + cases that are too obscure for most client programs to need to + worry about. + +
+
diff --git a/docs/usermanual-fonts-and-faces.xml b/docs/usermanual-fonts-and-faces.xml index 7de0f05..5536004 100644 --- a/docs/usermanual-fonts-and-faces.xml +++ b/docs/usermanual-fonts-and-faces.xml @@ -1,3 +1,9 @@ + + + +]> Fonts and faces
@@ -15,4 +21,4 @@
-
\ No newline at end of file + diff --git a/docs/usermanual-getting-started.xml b/docs/usermanual-getting-started.xml new file mode 100644 index 0000000..cc867e0 --- /dev/null +++ b/docs/usermanual-getting-started.xml @@ -0,0 +1,307 @@ + + + +]> + + Getting started with HarfBuzz +
+ An overview of the HarfBuzz shaping API + + The core of the HarfBuzz shaping API is the function + hb_shape(). This function takes a font, a + buffer containing a string of Unicode codepoints and + (optionally) a list of font features as its input. It replaces + the codepoints in the buffer with the corresponding glyphs from + the font, correctly ordered and positioned, and with any of the + optional font features applied. + + + In addition to holding the pre-shaping input (the Unicode + codepoints that comprise the input string) and the post-shaping + output (the glyphs and positions), a HarfBuzz buffer has several + properties that affect shaping. The most important are the + text-flow direction (e.g., left-to-right, right-to-left, + top-to-bottom, or bottom-to-top), the script tag, and the + language tag. + + + + For input string buffers, flags are available to denote when the + buffer represents the beginning or end of a paragraph, to + indicate whether or not to visibly render Unicode Default + Ignorable codepoints, and to modify the cluster-merging + behavior for the buffer. For shaped output buffers, the + individual X and Y offsets and advances + (the logical dimensions) of each glyph are + accessible. HarfBuzz also flags glyphs as + UNSAFE_TO_BREAK if breaking the string at + that glyph (e.g., in a line-breaking or hyphenation process) + would require re-shaping the text. + + + + HarfBuzz also provides methods to compare the contents of + buffers, join buffers, normalize buffer contents, and handle + invalid codepoints, as well as to determine the state of a + buffer (e.g., input codepoints or output glyphs). Buffer + lifecycles are managed and all buffers are reference-counted. + + + + Although the default hb_shape() function is + sufficient for most use cases, a variant is also provide that + lets you specify which of HarfBuzz's shapers to use on a buffer. + + + + HarfBuzz can read TrueType fonts, TrueType collections, OpenType + fonts, and OpenType collections. Functions are provided to query + font objects about metrics, Unicode coverage, available tables and + features, and variation selectors. Individual glyphs can also be + queried for metrics, variations, and glyph names. OpenType + variable fonts are supported, and HarfBuzz allows you to set + variation-axis coordinates on font objects. + + + + HarfBuzz provides glue code to integrate with various other + libraries, including FreeType, GObject, and CoreText. Support + for integrating with Uniscribe and DirectWrite is experimental + at present. + +
+ +
+ Terminology + + + + + + + script + + + In text shaping, a script is a + writing system: a set of symbols, rules, and conventions + that is used to represent a language or multiple + languages. + + + In general computing lingo, the word "script" can also + be used to mean an executable program (usually one + written in a human-readable programming language). For + the sake of clarity, HarfBuzz documents will always use + more specific terminology when referring to this + meaning, such as "Python script" or "shell script." In + all other instances, "script" refers to a writing system. + + + For developers using HarfBuzz, it is important to note + the distinction between a script and a language. Most + scripts are used to write a variety of different + languages, and many languages may be written in more + than one script. + + + + + + shaper + + + In HarfBuzz, a shaper is a + handler for a specific script-shaping model. HarfBuzz + implements separate shapers for Indic, Arabic, Thai and + Lao, Khmer, Myanmar, Tibetan, Hangul, Hebrew, the + Universal Shaping Engine (USE), and a default shaper for + non-complex scripts. + + + + + + cluster + + + In text shaping, a cluster is a + sequence of codepoints that must be treated as an + indivisible unit. Clusters can include code-point + sequences that form a ligature or base-and-mark + sequences. Tracking and preserving clusters is important + when shaping operations might separate or reorder + code points. + + + HarfBuzz provides three cluster + levels that implement different + approaches to the problem of preserving clusters during + shaping operations. + + + + + + grapheme + + + In linguistics, a grapheme is one + of the indivisible units that make up a writing system or + script. Often, graphemes are individual symbols (letters, + numbers, punctuation marks, logograms, etc.) but, + depending on the writing system, a particular grapheme + might correspond to a sequence of several Unicode code + points. + + + In practice, HarfBuzz and other text-shaping engines + are not generally concerned with graphemes. However, it + is important for developers using HarfBuzz to recognize + that there is a difference between graphemes and shaping + clusters (see above). The two concepts may overlap + frequently, but there is no guarantee that they will be + identical. + + + + + + syllable + + + In linguistics, a syllable is an + a sequence of sounds that makes up a building block of a + particular language. Every language has its own set of + rules describing what constitutes a valid syllable. + + + For text-shaping purposes, the various definitions of + "syllable" are important because script-specific shaping + operations may be applied at the syllable level. For + example, a reordering rule might specify that a vowel + mark be reordered to the beginning of the syllable. + + + Syllables will consist of one or more Unicode code + points. The definition of a syllable for a particular + writing system might correspond to how HarfBuzz + identifies clusters (see above) for the same writing + system. However, it is important for developers using + HarfBuzz to recognize that there is a difference between + syllables and shaping clusters. The two concepts may + overlap frequently, but there is no guarantee that they + will be identical. + + + + + +
+ + +
+ A simple shaping example + + + Below is the simplest HarfBuzz shaping example possible. + + + + + Create a buffer and put your text in it. + + + + + #include <hb.h> + hb_buffer_t *buf; + buf = hb_buffer_create(); + hb_buffer_add_utf8(buf, text, -1, 0, -1); + + + + + Guess the script, language and direction of the buffer. + + + + + hb_buffer_set_direction(buf, HB_DIRECTION_LTR); + hb_buffer_set_script(buf, HB_SCRIPT_LATIN); + hb_buffer_set_language(buf, hb_language_from_string("en", -1)); + + + + + Create a face and a font, using FreeType for now. + + + + + #include <hb-ft.h> + FT_New_Face(ft_library, font_path, index, &face); + FT_Set_Char_Size(face, 0, 1000, 0, 0); + hb_font_t *font = hb_ft_font_create(face); + + + + + Shape! + + + + + hb_shape(font, buf, NULL, 0); + + + + + Get the glyph and position information. + + + + + hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(buf, &glyph_count); + hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count); + + + + + Iterate over each glyph. + + + + + for (i = 0; i < glyph_count; ++i) { + glyphid = glyph_info[i].codepoint; + x_offset = glyph_pos[i].x_offset / 64.0; + y_offset = glyph_pos[i].y_offset / 64.0; + x_advance = glyph_pos[i].x_advance / 64.0; + y_advance = glyph_pos[i].y_advance / 64.0; + draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset); + cursor_x += x_advance; + cursor_y += y_advance; + } + + + + + Tidy up. + + + + + hb_buffer_destroy(buf); + hb_font_destroy(hb_ft_font); + + + + This example shows enough to get us started using HarfBuzz. In + the sections that follow, we will use the remainder of + HarfBuzz's API to refine and extend the example and improve its + text-shaping capabilities. + +
+
diff --git a/docs/usermanual-glyph-information.xml b/docs/usermanual-glyph-information.xml index ca674c0..78f06c7 100644 --- a/docs/usermanual-glyph-information.xml +++ b/docs/usermanual-glyph-information.xml @@ -1,3 +1,9 @@ + + + +]> Glyph information @@ -5,4 +11,4 @@ - \ No newline at end of file + diff --git a/docs/usermanual-hello-harfbuzz.xml b/docs/usermanual-hello-harfbuzz.xml deleted file mode 100644 index 716b2f2..0000000 --- a/docs/usermanual-hello-harfbuzz.xml +++ /dev/null @@ -1,183 +0,0 @@ - - Hello, HarfBuzz - - Here's the simplest HarfBuzz that can possibly work. We will improve - it later. - - - - - Create a buffer and put your text in it. - - - - - #include <hb.h> - hb_buffer_t *buf; - buf = hb_buffer_create(); - hb_buffer_add_utf8(buf, text, strlen(text), 0, strlen(text)); - - - - - Guess the script, language and direction of the buffer. - - - - - hb_buffer_guess_segment_properties(buf); - - - - - Create a face and a font, using FreeType for now. - - - - - #include <hb-ft.h> - FT_New_Face(ft_library, font_path, index, &face) - hb_font_t *font = hb_ft_font_create(face); - - - - - Shape! - - - - - hb_shape(font, buf, NULL, 0); - - - - - Get the glyph and position information. - - - - - hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(buf, &glyph_count); - hb_glyph_position_t *glyph_pos = hb_buffer_get_glyph_positions(buf, &glyph_count); - - - - - Iterate over each glyph. - - - - - for (i = 0; i < glyph_count; ++i) { - glyphid = glyph_info[i].codepoint; - x_offset = glyph_pos[i].x_offset / 64.0; - y_offset = glyph_pos[i].y_offset / 64.0; - x_advance = glyph_pos[i].x_advance / 64.0; - y_advance = glyph_pos[i].y_advance / 64.0; - draw_glyph(glyphid, cursor_x + x_offset, cursor_y + y_offset); - cursor_x += x_advance; - cursor_y += y_advance; - } - - - - - Tidy up. - - - - - hb_buffer_destroy(buf); - hb_font_destroy(hb_ft_font); - -
- What HarfBuzz doesn't do - - The code above will take a UTF8 string, shape it, and give you the - information required to lay it out correctly on a single - horizontal (or vertical) line using the font provided. That is the - extent of HarfBuzz's responsibility. - - - If you are implementing a text layout engine you may have other - responsibilities, that HarfBuzz will not help you with: - - - - - HarfBuzz won't help you with bidirectionality. If you want to - lay out text with mixed Hebrew and English, you will need to - ensure that the buffer provided to HarfBuzz has those - characters in the correct layout order. This will be different - from the logical order in which the Unicode text is stored. In - other words, the user will hit the keys in the following - sequence: - - -A B C [space] ג ב א [space] D E F - - - but will expect to see in the output: - - -ABC אבג DEF - - - This reordering is called bidi processing - ("bidi" is short for bidirectional), and there's an - algorithm as an annex to the Unicode Standard which tells you how - to reorder a string from logical order into presentation order. - Before sending your string to HarfBuzz, you may need to apply the - bidi algorithm to it. Libraries such as ICU and fribidi can do - this for you. - - - - - HarfBuzz won't help you with text that contains different font - properties. For instance, if you have the string "a - huge breakfast", and you expect - "huge" to be italic, you will need to send three - strings to HarfBuzz: a, in your Roman font; - huge using your italic font; and - breakfast using your Roman font again. - Similarly if you change font, font size, script, language or - direction within your string, you will need to shape each run - independently and then output them independently. HarfBuzz - expects to shape a run of characters sharing the same - properties. - - - - - HarfBuzz won't help you with line breaking, hyphenation or - justification. As mentioned above, it lays out the string - along a single line of, notionally, - infinite length. If you want to find out where the potential - word, sentence and line break points are in your text, you - could use the ICU library's break iterator functions. - - - HarfBuzz can tell you how wide a shaped piece of text is, which is - useful input to a justification algorithm, but it knows nothing - about paragraphs, lines or line lengths. Nor will it adjust the - space between words to fit them proportionally into a line. If you - want to layout text in paragraphs, you will probably want to send - each word of your text to HarfBuzz to determine its shaped width - after glyph substitutions, then work out how many words will fit - on a line, and then finally output each word of the line separated - by a space of the correct size to fully justify the paragraph. - - - - - As a layout engine implementor, HarfBuzz will help you with the - interface between your text and your font, and that's something - that you'll need - what you then do with the glyphs that your font - returns is up to you. The example we saw above enough to get us - started using HarfBuzz. Now we are going to use the remainder of - HarfBuzz's API to refine that example and improve our text shaping - capabilities. - -
-
\ No newline at end of file diff --git a/docs/usermanual-install-harfbuzz.xml b/docs/usermanual-install-harfbuzz.xml index 899cc5b..a885d00 100644 --- a/docs/usermanual-install-harfbuzz.xml +++ b/docs/usermanual-install-harfbuzz.xml @@ -1,70 +1,430 @@ + + + +]> - Install HarfBuzz + Installing HarfBuzz +
- Download + Downloading HarfBuzz - For tarball releases of HarfBuzz, look - here. - At the same place you will - also find Win32 binary bundles that include libharfbuzz DLL, hb-view.exe, - hb-shape.exe, and all dependencies. + The HarfBuzz source code is hosted at github.com/harfbuzz/harfbuzz. The + same source tree is also available at the + Freedesktop.org + site. - The canonical source tree is available - here. - Also available on github. + Tarball releases and Win32 binary bundles (which include the + libharfbuzz DLL, hb-view.exe, hb-shape.exe, and all + dependencies) of HarfBuzz can be downloaded from github.com/harfbuzz/harfbuzz/releases + or from + Freedesktop.org. - The API that comes with hb.h will - not change incompatibly. Other, peripheral, headers are more likely to go - through minor modifications, but again, will do our best to never change - API in an incompatible way. We will never break the ABI. + Release notes are posted with each new release to provide an + overview of the changes. The project tracks bug + reports and other issues on GitHub. Discussion and + questions are welcome on the HarfBuzz + mailing list. - If you are not sure whether Pango or HarfBuzz is right for you, read - this. + The API included in the hb.h file will not change in a + compatibility-breaking way in any release. However, other, + peripheral headers are more likely to go through minor + modifications. We will do our best to never change APIs in an + incompatible way. We will never break the ABI.
+
- Building + Building HarfBuzz + +
+ Building on Linux - 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 - - whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do: + (1) To build HarfBuzz on Linux, you must first install the + development packages for FreeType, Cairo, and GLib. The exact + commands required for this step will vary depending on + the Linux distribution you use. + + + For example, on an Ubuntu or Debian system, you would run: -sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel + sudo apt install gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev - or using MacPorts: + On Fedora, RHEL, CentOS, or other Red-Hat–based systems, you would run: -sudo port install freetype glib2 cairo + sudo yum install gcc gcc-c++ freetype-devel glib2-devel cairo-devel + + + + + (2) The next step depends on whether you + are building from the source in a downloaded release tarball or + from the source directly from the git repository. + + + (2)(a) If you downloaded the HarfBuzz + source code in a tarball, you can now extract the source. + + + From a shell in the top-level directory of the extracted source + code, you can run ./configure followed by + make as with any other standard package. + + + This should leave you with a shared + library in the src/ directory, and a few + utility programs including hb-view and + hb-shape under the util/ + directory. - 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/. + (2)(b) If you are building from the source in the HarfBuzz git + repository, rather than installing from a downloaded tarball + release, then you must install two more auxiliary tools before you + can build for the first time: pkg-config and + ragel. - If you are bootstrapping 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: + On Ubuntu or Debian, run: -sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools + sudo apt-get install autoconf automake libtool pkg-config ragel gtk-doc-tools - and on Fedora, RHEL, CentOS: + On Fedora, RHEL, CentOS, run: -sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc + sudo yum install autoconf automake libtool pkgconfig ragel gtk-doc - or using MacPorts: + + + + With pkg-config and ragel + installed, you can now run ./autogen.sh, + followed by ./configure and + make to build HarfBuzz. + +
+ + +
+ Building on Windows + + + On Windows, consider using Microsoft's free vcpkg utility + to build HarfBuzz, its dependencies, and other open-source + libraries. + + + If you need to build HarfBuzz from source, first put the + ragel binary on your + PATH, then follow the appveyor CI cmake + build + instructions. + +
+ + +
+ Building on macOS + + + There are two ways to build HarfBuzz on Mac systems: MacPorts + and Homebrew. The process is similar to the process used on a + Linux system. + + + (1) You must first install the + development packages for FreeType, Cairo, and GLib. If you are + using MacPorts, you should run: -sudo port install autoconf automake libtool pkgconfig ragel gtk-doc + sudo port install freetype glib2 cairo - + + + If you are using Homebrew, you should run: + + brew install freetype glib cairo + + + + (2) The next step depends on whether you are building from the + source in a downloaded release tarball or from the source directly + from the git repository. + + + (2)(a) If you are installing HarfBuzz + from a downloaded tarball release, extract the tarball and + open a Terminal in the extracted source-code directory. Run: + + ./configure + + followed by: + + make + + to build HarfBuzz. + + + (2)(b) Alternatively, if you are building + HarfBuzz from the source in the HarfBuzz git repository, then + you must install several built-time dependencies before + proceeding. + + If you are + using MacPorts, you should run: + + sudo port install autoconf automake libtool pkgconfig ragel gtk-doc + + to install the build dependencies. + + If you are using Homebrew, you should run: + + brew install autoconf automake libtool pkgconfig ragel gtk-doc + + Finally, you can run: + + ./autogen.sh + + + + (3) You can now build HarfBuzz (on either + a MacPorts or a Homebrew system) by running: + + ./configure + + followed by: + + make + + + + This should leave you with a shared + library in the src/ directory, and a few + utility programs including hb-view and + hb-shape under the util/ + directory. + + +
+ +
+ Configuration options + + + The instructions in the "Building HarfBuzz" section will build + the source code under its default configuration. If needed, + the following additional configuration options are available. + + + + + + --with-libstdc++ + + + Allow linking with libstdc++. (Default = no) + + + This option enables or disables linking HarfBuzz to the + system's libstdc++ library. + + + + + + --with-glib + + + Use GLib. (Default = auto) + + + This option enables or disables usage of the GLib + library. The default setting is to check for the + presence of GLib and, if it is found, build with + GLib support. GLib is native to GNU/Linux systems but is + available on other operating system as well. + + + + + + --with-gobject + + + Use GObject. (Default = no) + + + This option enables or disables usage of the GObject + library. The default setting is to check for the + presence of GObject and, if it is found, build with + GObject support. GObject is native to GNU/Linux systems but is + available on other operating system as well. + + + + + + --with-cairo + + + Use Cairo. (Default = auto) + + + This option enables or disables usage of the Cairo + graphics-rendering library. The default setting is to + check for the presence of Cairo and, if it is found, + build with Cairo support. + + + Note: Cairo is used only by the HarfBuzz + command-line utilities, and not by the HarfBuzz library. + + + + + + --with-fontconfig + + + Use Fontconfig. (Default = auto) + + + This option enables or disables usage of the Fontconfig + library, which provides font-matching functions and + provides access to font properties. The default setting + is to check for the presence of Fontconfig and, if it is + found, build with Fontconfig support. + + + Note: Fontconfig is used only by the HarfBuzz + command-line utilities, and not by the HarfBuzz library. + + + + + + --with-icu + + + Use the ICU library. (Default = auto) + + + This option enables or disables usage of the + International Components for + Unicode (ICU) library, which provides access + to Unicode Character Database (UCD) properties as well + as normalization and conversion functions. The default + setting is to check for the presence of ICU and, if it + is found, build with ICU support. + + + + + + --with-ucdn + + + Use HarfBuzz's built-in UCDN library. (Default = auto) + + + The HarfBuzz source tree includes a Unicode + Database and Normalization (UCDN) library + that provides access to basic character properties in + the Unicode Character Database (UCD) as well as low-level + normalization functions. HarfBuzz can be built without + this UCDN support if the usage of a different UCDN + library is desired. + + + + + + --with-graphite2 + + + Use the Graphite2 library. (Default = no) + + + This option enables or disables usage of the Graphite2 + library, which provides support for the Graphite shaping + model. + + + + + + --with-freetype + + + Use the FreeType library. (Default = auto) + + + This option enables or disables usage of the FreeType + font-rendering library. The default setting is to check for the + presence of FreeType and, if it is found, build with + FreeType support. + + + + + + --with-uniscribe + + + Use the Uniscribe + library (experimental). (Default = no) + + + This option enables or disables usage of the Uniscribe + font-rendering library. Uniscribe is available on + Windows systems. Uniscribe support is used only for + testing purposes and does not need to be enabled for + HarfBuzz to run on Windows systems. + + + + + + --with-directwrite + + + Use the DirectWrite library (experimental). (Default = no) + + + This option enables or disables usage of the DirectWrite + font-rendering library. DirectWrite is available on + Windows systems. DirectWrite support is used only for + testing purposes and does not need to be enabled for + HarfBuzz to run on Windows systems. + + + + + + --with-coretext + + + Use the CoreText library. (Default = no) + + + This option enables or disables usage of the CoreText + library. CoreText is available on macOS and iOS systems. + + + + +
+
diff --git a/docs/usermanual-opentype-features.xml b/docs/usermanual-opentype-features.xml index 470bab8..51ff55a 100644 --- a/docs/usermanual-opentype-features.xml +++ b/docs/usermanual-opentype-features.xml @@ -1,3 +1,9 @@ + + + +]> Shaping and shape plans
@@ -10,4 +16,4 @@
-
\ No newline at end of file + diff --git a/docs/usermanual-shaping-concepts.xml b/docs/usermanual-shaping-concepts.xml new file mode 100644 index 0000000..db4e309 --- /dev/null +++ b/docs/usermanual-shaping-concepts.xml @@ -0,0 +1,375 @@ + + + +]> + + Shaping concepts +
+ Text shaping + + Text shaping is the process of transforming a sequence of Unicode + codepoints that represent individual characters (letters, + diacritics, tone marks, numbers, symbols, etc.) into the + orthographically and linguistically correct two-dimensional layout + of glyph shapes taken from a specified font. + + + For some writing systems (or scripts) and + languages, the process is simple, requiring the shaper to do + little more than advance the horizontal position forward by the + correct amount for each successive glyph. + + + But, for complex scripts, any combination of + several shaping operations may be required, and the rules for how + and when they are applied vary from script to script. HarfBuzz and + other shaping engines implement these rules. + + + The exact rules and necessary operations for a particular script + constitute a shaping model. OpenType + specifies a set of shaping models that covers all of + Unicode. Other shaping models are available, however, including + Graphite and Apple Advanced Typography (AAT). + +
+ +
+ Complex scripts + + In text-shaping terminology, scripts are generally classified as + either complex or non-complex. + + + Complex scripts are those for which transforming the input + sequence into the final layout requires some combination of + operations—such as context-dependent substitutions, + context-dependent mark positioning, glyph-to-glyph joining, + glyph reordering, or glyph stacking. + + + In some complex scripts, the shaping rules require that a text + run be divided into syllables before the operations can be + applied. Other complex scripts may apply shaping operations over + entire words or over the entire text run, with no subdivision + required. + + + Non-complex scripts, by definition, do not require these + operations. However, correctly shaping a text run in a + non-complex script may still involve Unicode normalization, + ligature substitutions, mark positioning, kerning, and applying + other font features. The key difference is that a text run in a + non-complex script can be processed sequentially and in the same + order as the input sequence of Unicode codepoints, without + requiring an analysis stage. + +
+ +
+ Shaping operations + + Shaping a complex-script text run involves transforming the + input sequence of Unicode codepoints with some combination of + operations that is specified in the shaping model for the + script. + + + The specific conditions that trigger a given operation for a + text run varies from script to script, as do the order that the + operations are performed in and which codepoints are + affected. However, the same general set of shaping operations is + common to all of the complex-script shaping models. + + + + + + A reordering operation moves a glyph + from its original ("logical") position in the sequence to + some other ("visual") position. + + + The shaping model for a given complex script might involve + more than one reordering step. + + + + + + A joining operation replaces a glyph + with an alternate form that is designed to connect with one + or more of the adjacent glyphs in the sequence. + + + + + + A contextual substitution operation + replaces either a single glyph or a subsequence of several + glyphs with an alternate glyph. This substitution is + performed when the original glyph or subsequence of glyphs + occurs in a specified position with respect to the + surrounding sequence. For example, one substitution might be + performed only when the target glyph is the first glyph in + the sequence, while another substitution is performed only + when a different target glyph occurs immediately after a + particular string pattern. + + + The shaping model for a given complex script might involve + multiple contextual-substitution operations, each applying + to different target glyphs and patterns, and which are + performed in separate steps. + + + + + + A contextual positioning operation + moves the horizontal and/or vertical position of a + glyph. This positioning move is performed when the glyph + occurs in a specified position with respect to the + surrounding sequence. + + + Many contextual positioning operations are used to place + mark glyphs (such as diacritics, vowel + signs, and tone markers) with respect to + base glyphs. However, some complex + scripts may use contextual positioning operations to + correctly place base glyphs as well, such as + when the script uses stacking characters. + + + + +
+ +
+ Unicode character categories + + Shaping models are typically specified with respect to how + scripts are defined in the Unicode standard. + + + Every codepoint in the Unicode Character Database (UCD) is + assigned a Unicode General Category (UGC), + which provides the most fundamental information about the + codepoint: whether the codepoint represents a + Letter, a Mark, a + Number, Punctuation, a + Symbol, a Separator, + or something else (Other). + + + These UGC properties are "Major" categories. Each codepoint is + further assigned to a "minor" category within its Major + category, such as "Letter, uppercase" (Lu) or + "Letter, modifier" (Lm). + + + Shaping models are concerned primarily with Letter and Mark + codepoints. The minor categories of Mark codepoints are + particularly important for shaping. Marks can be nonspacing + (Mn), spacing combining + (Mc), or enclosing (Me). + + + In addition to the UGC property, codepoints in the Indic and + Southeast Asian scripts are also assigned + Unicode Indic Syllabic Category (UISC) and + Unicode Indic Positional Category (UIPC) + properties that provide more detailed information needed for + shaping. + + + The UISC property sub-categorizes Letters and Marks according to + common script-shaping behaviors. For example, UISC distinguishes + between consonant letters, vowel letters, and vowel marks. The + UIPC property sub-categorizes Mark codepoints by the relative visual + position that they occupy (above, below, right, left, or in + multiple positions). + + + Some complex scripts require that the text run be split into + syllables. What constitutes a valid syllable in these + scripts is specified in regular expressions, formed from the + Letter and Mark codepoints, that take the UISC and UIPC + properties into account. + + +
+ +
+ Text runs + + Real-world text usually contains codepoints from a mixture of + different Unicode scripts (including punctuation, numbers, symbols, + white-space characters, and other codepoints that do not belong + to any script). Real-world text may also be marked up with + formatting that changes font properties (including the font, + font style, and font size). + + + For shaping purposes, all real-world text streams must be first + segmented into runs that have a uniform set of properties. + + + In particular, shaping models always assume that every codepoint + in a text run has the same direction, + script tag, and + language tag. + +
+ +
+ OpenType shaping models + + OpenType provides shaping models for the following scripts: + + + + + + The default shaping model handles all + non-complex scripts, and may also be used as a fallback for + handling unrecognized scripts. + + + + + + The Indic shaping model handles the Indic + scripts Bengali, Devanagari, Gujarati, Gurmukhi, Kannada, + Malayalam, Oriya, Tamil, Telugu, and Sinhala. + + + The Indic shaping model was revised significantly in + 2005. To denote the change, a new set of script + tags was assigned for Bengali, Devanagari, + Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Tamil, and + Telugu. For the sake of clarity, the term "Indic2" is + sometimes used to refer to the current, revised shaping + model. + + + + + + The Arabic shaping model supports + Arabic, Mongolian, N'Ko, Syriac, and several other connected + or cursive scripts. + + + + + + The Thai/Lao shaping model supports + the Thai and Lao scripts. + + + + + + The Khmer shaping model supports the + Khmer script. + + + + + + The Myanmar shaping model supports the + Myanmar (or Burmese) script. + + + + + + The Tibetan shaping model supports the + Tibetan script. + + + + + + The Hangul shaping model supports the + Hangul script. + + + + + + The Hebrew shaping model supports the + Hebrew script. + + + + + + The Universal Shaping Engine (USE) + shaping model supports complex scripts not covered by one of + the above, script-specific shaping models, including + Javanese, Balinese, Buginese, Batak, Chakma, Lepcha, Modi, + Phags-pa, Tagalog, Siddham, Sundanese, Tai Le, Tai Tham, Tai + Viet, and many others. + + + + + + Text runs that do not fall under one of the above shaping + models may still require processing by a shaping engine. Of + particular note is Emoji shaping, which + may involve variation-selector sequences and glyph + substitution. Emoji shaping is handled by the default + shaping model. + + + + + +
+ +
+ Graphite shaping + + In contrast to OpenType shaping, Graphite shaping does not + specify a predefined set of shaping models or a set of supported + scripts. + + + Instead, each Graphite font contains a complete set of rules that + implement the required shaping model for the intended + script. These rules include finite-state machines to match + sequences of codepoints to the shaping operations to perform. + + + Graphite shaping can perform the same shaping operations used in + OpenType shaping, as well as other functions that have not been + defined for OpenType shaping. + +
+ +
+ AAT shaping + + In contrast to OpenType shaping, AAT shaping does not specify a + predefined set of shaping models or a set of supported scripts. + + + Instead, each AAT font includes a complete set of rules that + implement the desired shaping model for the intended + script. These rules include finite-state machines to match glyph + sequences and the shaping operations to perform. + + + Notably, AAT shaping rules are expressed for glyphs in the font, + not for Unicode codepoints. AAT shaping can perform the same + shaping operations used in OpenType shaping, as well as other + functions that have not been defined for OpenType shaping. + +
+
diff --git a/docs/usermanual-what-is-harfbuzz.xml b/docs/usermanual-what-is-harfbuzz.xml index 38f40cf..ed053f9 100644 --- a/docs/usermanual-what-is-harfbuzz.xml +++ b/docs/usermanual-what-is-harfbuzz.xml @@ -1,115 +1,442 @@ + + + +]> What is HarfBuzz? - HarfBuzz is a text shaping engine. It solves - the problem of selecting and positioning glyphs from a font given a - Unicode string. + HarfBuzz is a text-shaping engine. If you + give HarfBuzz a font and a string containing a sequence of Unicode + codepoints, HarfBuzz selects and positions the corresponding + glyphs from the font, applying all of the necessary layout rules + and font features. HarfBuzz then returns the string to you in the + form that is correctly arranged for the language and writing + system. -
- Why do I need it? + + HarfBuzz can properly shape all of the world's major writing + systems. It runs on all major operating systems and software + platforms and it supports the major font formats in use + today. + +
+ What is text shaping? + + Text shaping is the process of translating a string of character + codes (such as Unicode codepoints) into a properly arranged + sequence of glyphs that can be rendered onto a screen or into + final output form for inclusion in a document. + + + The shaping process is dependent on the input string, the active + font, the script (or writing system) that the string is in, and + the language that the string is in. + + + Modern software systems generally only deal with strings in the + Unicode encoding scheme (although legacy systems and documents may + involve other encodings). + + + There are several font formats that a program might + encounter, each of which has a set of standard text-shaping + rules. + + The dominant format is OpenType. The + OpenType specification defines a series of shaping models for + various scripts from around the world. These shaping models depend on + the font incorporating certain features as + lookups in its GSUB + and GPOS tables. + - Text shaping is an integral part of preparing text for display. It - is a fairly low level operation; HarfBuzz is used directly by - graphic rendering libraries such as Pango, and the layout engines - in Firefox, LibreOffice and Chromium. Unless you are - writing one of these layout engines yourself, - you will probably not need to use HarfBuzz - normally higher level - libraries will turn text into glyphs for you. + Alternatively, OpenType fonts can include shaping features for + the Graphite shaping model. + + + TrueType fonts can also include OpenType shaping + features. Alternatively, TrueType fonts can also include Apple + Advanced Typography (AAT) tables to implement shaping + support. AAT fonts are generally only found on macOS and iOS systems. + + + Text strings will usually be tagged with a script and language + tag that provide the context needed to perform text shaping + correctly. The necessary script + and language + tags are defined by OpenType. + +
+ +
+ Why do I need a shaping engine? + + Text shaping is an integral part of preparing text for + display. Before a Unicode sequence can be rendered, the + codepoints in the sequence must be mapped to the corresponding + glyphs provided in the font, and those glyphs must be positioned + correctly relative to each other. For many of the scripts + supported in Unicode, these steps involve script-specific layout + rules, including complex joining, reordering, and positioning + behavior. Implementing these rules is the job of the shaping engine. + + + Text shaping is a fairly low-level operation. HarfBuzz is + used directly by text-handling libraries like Pango, as well as by the layout + engines in Firefox, LibreOffice, and Chromium. Unless you are + writing one of these layout engines + yourself, you will probably not need to use HarfBuzz: normally, + a layout engine, toolkit, or other library will turn text into + glyphs for you. However, if you are writing a layout engine - or graphics library yourself, you will need to perform text - shaping, and this is where HarfBuzz can help you. Here are some - reasons why you need it: + or graphics library yourself, then you will need to perform text + shaping, and this is where HarfBuzz can help you. + + + Here are some specific scenarios where a text-shaping engine + like HarfBuzz helps you: - OpenType fonts contain a set of glyphs, indexed by glyph ID. - The glyph ID within the font does not necessarily relate to a - Unicode codepoint. For instance, some fonts have the letter - "a" as glyph ID 1. To pull the right glyph out of - the font in order to display it, you need to consult a table - within the font (the "cmap" table) which maps - Unicode codepoints to glyph IDs. Text shaping turns codepoints - into glyph IDs. + OpenType fonts contain a set of glyphs (that is, shapes + to represent the letters, numbers, punctuation marks, and + all other symbols), which are indexed by a glyph ID. + + + A particular glyph ID within the font does not necessarily + correlate to a predictable Unicode codepoint. For instance, + some fonts have the letter "a" as glyph ID 1, but + many others do not. In order to retrieve the right glyph + from the font to display "a", you need to consult + the table inside the font (the cmap + table) that maps Unicode codepoints to glyph IDs. In other + words, text shaping turns codepoints into glyph + IDs. Many OpenType fonts contain ligatures: combinations of - characters which are rendered together. For instance, it's - common for the fi combination to appear in - print as the single ligature "fi". Whether you should - render text as fi or "fi" does not - depend on the input text, but on the capabilities of the font - and the level of ligature application you wish to perform. - Text shaping involves querying the font's ligature tables and - determining what substitutions should be made. + characters that are rendered as a single unit. For instance, + it is common for the "f, i" letter + sequence to appear in print as the single ligature glyph + "fi". + + + Whether you should render an "f, i" sequence + as fi or as "fi" does not + depend on the input text. Instead, it depends on the whether + or not the font includes an "fi" glyph and on the + level of ligature application you wish to perform. The font + and the amount of ligature application used are under your + control. In other words, text shaping involves + querying the font's ligature tables and determining what + substitutions should be made. - While ligatures like "fi" are typographic - refinements, some languages require such + While ligatures like "fi" are optional typographic + refinements, some languages require certain substitutions to be made in order to display text correctly. - In Tamil, when the letter "TTA" (ட) letter is - followed by "U" (உ), the combination should appear - as the single glyph "டு". The sequence of Unicode - characters "டஉ" needs to be rendered as a single - glyph from the font - text shaping chooses the correct glyph - from the sequence of characters provided. + + + For example, in Tamil, when the letter "TTA" (ட) + letter is followed by "U" (உ), the pair + must be replaced by the single glyph "டு". The + sequence of Unicode characters "டஉ" needs to be + substituted with a single "டு" glyph from the + font. + + + But "டு" does not have a Unicode codepoint. To + find this glyph, you need to consult the table inside + the font (the GSUB table) that contains + substitution information. In other words, text shaping + chooses the correct glyph for a sequence of characters + provided. - Similarly, each Arabic character has four different variants: - within a font, there will be glyphs for the initial, medial, - final, and isolated forms of each letter. Unicode only encodes - one codepoint per character, and so a Unicode string will not - tell you which glyph to use. Text shaping chooses the correct - form of the letter and returns the correct glyph from the font - that you need to render. + Similarly, each Arabic character has four different variants + corresponding to the different positions it might appear in + within a sequence. Inside a font, there will be separate + glyphs for the initial, medial, final, and isolated forms of + each letter, each at a different glyph ID. + + + Unicode only assigns one codepoint per character, so a + Unicode string will not tell you which glyph variant to use + for each character. To decide, you need to analyze the whole + string and determine the appropriate glyph for each character + based on its position. In other words, text + shaping chooses the correct form of the letter by its + position and returns the correct glyph from the font. - Other languages have marks and accents which need to be - rendered in certain positions around a base character. For - instance, the Moldovan language has the Cyrillic letter - "zhe" (ж) with a breve accent, like so: ӂ. Some - fonts will contain this character as an individual glyph, - whereas other fonts will not contain a zhe-with-breve glyph - but expect the rendering engine to form the character by - overlaying the two glyphs ж and ˘. Where you should draw the - combining breve depends on the height of the preceding glyph. - Again, for Arabic, the correct positioning of vowel marks - depends on the height of the character on which you are - placing the mark. Text shaping tells you whether you have a - precomposed glyph within your font or if you need to compose a - glyph yourself out of combining marks, and if so, where to - position those marks. + Other languages involve marks and accents that need to be + rendered in specific positions relative a base character. For + instance, the Moldovan language includes the Cyrillic letter + "zhe" (ж) with a breve accent, like so: "ӂ". + + + Some fonts will provide this character as a single + zhe-with-breve glyph, but other fonts will not and, instead, + will expect the rendering engine to form the character by + superimposing the separate "ж" and "˘" + glyphs. + + + But exactly where you should draw the breve depends on the + height and width of the preceding zhe glyph. To find the + right position, you need to consult the table inside + the font (the GPOS table) that contains + positioning information. + In other words, text shaping tells you whether you + have a precomposed glyph within your font or if you need to + compose a glyph yourself out of combining marks—and, + if so, where to position those marks. + + + + + If tasks like these are something that you need to do, then you + need a text shaping engine. You could use Uniscribe if you are + writing Windows software; you could use CoreText on macOS; or + you could use HarfBuzz. + + + + In the rest of this manual, the text will assume that the reader + is that implementor of a text-layout engine. + + +
+ + +
+ What does HarfBuzz do? + + HarfBuzz provides text shaping through a cross-platform + C API that accepts sequences of Unicode codepoints as input. Currently, + the following OpenType shaping models are supported: + + + + + Indic (covering Devanagari, Bengali, Gujarati, + Gurmukhi, Kannada, Malayalam, Oriya, Tamil, Telugu, and + Sinhala) + + + + + Arabic (covering Arabic, N'Ko, Syriac, and Mongolian) + + + + + Thai and Lao + + + + + Khmer + + + + + Myanmar + + + + + + Tibetan + + + + + + Hangul + + + + + + Hebrew + + + + + The Universal Shaping Engine or USE + (covering complex scripts not covered by the above shaping + models) + + + + + A default shaping model for non-complex scripts + (covering Latin, Cyrillic, Greek, Armenian, Georgian, Tifinagh, + and many others) + + + + + Emoji (including emoji modifier sequences, flag sequences, + and ZWJ sequences) + + + + + + In addition to OpenType shaping, HarfBuzz supports the latest + version of Graphite shaping (the "Graphite 2" model) and AAT + shaping. + + + + HarfBuzz can read and understand TrueType fonts (.ttf), TrueType + collections (.ttc), and OpenType fonts (.otf, including those + fonts that contain TrueType-style outlines and those that + contain PostScript CFF or CFF2 outlines). + + + + HarfBuzz is designed and tested to run on top of the FreeType + font renderer. It can run on Linux, Android, Windows, macOS, and + iOS systems. + + + + In addition to its core shaping functionality, HarfBuzz provides + functions for accessing other font features, including optional + GSUB and GPOS OpenType features, as well as + all color-font formats (CBDT, + sbix, COLR/CPAL, and + SVG-OT) and OpenType variable fonts. HarfBuzz + also includes a font-subsetting feature. HarfBuzz can perform + some low-level math-shaping operations, although it does not + currently perform full shaping for mathematical typesetting. + + + + A suite of command-line utilities is also provided in the + source-code tree, designed to help users test and debug + HarfBuzz's features on real-world fonts and input. + +
+ +
+ What HarfBuzz doesn't do + + HarfBuzz will take a Unicode string, shape it, and give you the + information required to lay it out correctly on a single + horizontal (or vertical) line using the font provided. That is the + extent of HarfBuzz's responsibility. + + + It is important to note that if you are implementing a complete + text-layout engine you may have other responsibilities that + HarfBuzz will not help you with. For example: + + + + + HarfBuzz won't help you with bidirectionality. If you want to + lay out text that includes a mix of Hebrew and English, you + will need to ensure that each buffer provided to HarfBuzz + has all of its characters in the same order and that the + directionality of the buffer is set correctly. This may mean + segmenting the text before it is placed into HarfBuzz buffers. In + other words, the user will hit the keys in the following + sequence: + + + A B C [space] ג ב א [space] D E F + + + but will expect to see in the output: + + + ABC אבג DEF + + + This reordering is called bidi processing + ("bidi" is short for bidirectional), and there's an + algorithm as an annex to the Unicode Standard which tells you how + to process a string of mixed directionality. + Before sending your string to HarfBuzz, you may need to apply the + bidi algorithm to it. Libraries such as ICU and fribidi can do this for you. + + + + + HarfBuzz won't help you with text that contains different font + properties. For instance, if you have the string "a + huge breakfast", and you expect + "huge" to be italic, then you will need to send three + strings to HarfBuzz: a, in your Roman font; + huge using your italic font; and + breakfast using your Roman font again. + + + Similarly, if you change the font, font size, script, + language, or direction within your string, then you will + need to shape each run independently and output them + independently. HarfBuzz expects to shape a run of characters + that all share the same properties. + + + + + HarfBuzz won't help you with line breaking, hyphenation, or + justification. As mentioned above, HarfBuzz lays out the string + along a single line of, notionally, + infinite length. If you want to find out where the potential + word, sentence and line break points are in your text, you + could use the ICU library's break iterator functions. + + + HarfBuzz can tell you how wide a shaped piece of text is, which is + useful input to a justification algorithm, but it knows nothing + about paragraphs, lines or line lengths. Nor will it adjust the + space between words to fit them proportionally into a line. - If this is something that you need to do, then you need a text - shaping engine: you could use Uniscribe if you are using Windows; - you could use CoreText on OS X; or you could use HarfBuzz. In the - rest of this manual, we are going to assume that you are the - implementor of a text layout engine. + As a layout-engine implementor, HarfBuzz will help you with the + interface between your text and your font, and that's something + that you'll need—what you then do with the glyphs that your font + returns is up to you.
+
Why is it called HarfBuzz? - HarfBuzz began its life as text shaping code within the FreeType - project, (and you will see references to the FreeType authors - within the source code copyright declarations) but was then - abstracted out to its own project. This project is maintained by - Behdad Esfahbod, and named HarfBuzz. Originally, it was a shaping - engine for OpenType fonts - "HarfBuzz" is the Persian - for "open type". + HarfBuzz began its life as text-shaping code within the FreeType + project (and you will see references to the FreeType authors + within the source code copyright declarations), but was then + extracted out to its own project. This project is maintained by + Behdad Esfahbod, who named it HarfBuzz. Originally, it was a + shaping engine for OpenType fonts—"HarfBuzz" is + the Persian for "open type".
- \ No newline at end of file + diff --git a/docs/version.xml b/docs/version.xml index a8fdfda..2bf1c1c 100644 --- a/docs/version.xml +++ b/docs/version.xml @@ -1 +1 @@ -1.8.1 +2.3.1 diff --git a/gtk-doc.make b/gtk-doc.make index e4a12a5..2454c28 100644 --- a/gtk-doc.make +++ b/gtk-doc.make @@ -196,6 +196,7 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_con if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ + test -f $$file && cp $$file $(abs_builddir)/html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp diff --git a/m4/pkg.m4 b/m4/pkg.m4 deleted file mode 100644 index 0048a3f..0000000 --- a/m4/pkg.m4 +++ /dev/null @@ -1,157 +0,0 @@ -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi - -fi[]dnl -])# PKG_PROG_PKG_CONFIG - -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# -# Similar to PKG_CHECK_MODULES, make sure that the first instance of -# this or PKG_CHECK_MODULES is called, or make sure to call -# PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_ifval([$2], [$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - - -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- -m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried -fi[]dnl -])# _PKG_CONFIG - -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED - - -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - ifelse([$4], , [AC_MSG_ERROR(dnl -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT -])], - [AC_MSG_RESULT([no]) - $4]) -elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see .])], - [$4]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) -fi[]dnl -])# PKG_CHECK_MODULES diff --git a/src/Makefile.am b/src/Makefile.am index 9d5662e..4a130e1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,8 +13,8 @@ TESTS = check_PROGRAMS = # Convenience targets: -lib: $(BUILT_SOURCES) libharfbuzz.la libharfbuzz-subset.la -fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la libharfbuzz-subset-fuzzing.la +lib: $(BUILT_SOURCES) libharfbuzz.la +libs: $(BUILT_SOURCES) $(lib_LTLIBRARIES) lib_LTLIBRARIES = libharfbuzz.la @@ -28,12 +28,6 @@ HBSOURCES = $(HB_BASE_sources) HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources) HBHEADERS = $(HB_BASE_headers) -if HAVE_OT -HBSOURCES += $(HB_OT_sources) -HBSOURCES += $(HB_OT_RAGEL_GENERATED_sources) -HBHEADERS += $(HB_OT_headers) -endif - if HAVE_FALLBACK HBSOURCES += $(HB_FALLBACK_sources) endif @@ -170,37 +164,6 @@ pkginclude_HEADERS += $(HB_SUBSET_headers) pkgconfig_DATA += harfbuzz-subset.pc EXTRA_DIST += harfbuzz-subset.pc.in -FUZZING_CPPFLAGS = \ - -DHB_NDEBUG \ - -DHB_MAX_NESTING_LEVEL=3 \ - -DHB_SANITIZE_MAX_EDITS=3 \ - -DHB_SANITIZE_MAX_OPS_FACTOR=3 \ - -DHB_SANITIZE_MAX_OPS_MIN=128 \ - -DHB_BUFFER_MAX_LEN_FACTOR=3 \ - -DHB_BUFFER_MAX_LEN_MIN=8 \ - -DHB_BUFFER_MAX_LEN_DEFAULT=128 \ - -DHB_BUFFER_MAX_OPS_FACTOR=8 \ - -DHB_BUFFER_MAX_OPS_MIN=64 \ - -DHB_BUFFER_MAX_OPS_DEFAULT=1024 \ - $(NULL) -EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la libharfbuzz-subset-fuzzing.la - -libharfbuzz_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_fuzzing_la_LDFLAGS) -libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES) -libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS) -libharfbuzz_fuzzing_la_LDFLAGS = $(AM_LDFLAGS) -libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD) -EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES) -CLEANFILES += libharfbuzz-fuzzing.la - -libharfbuzz_subset_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_subset_fuzzing_la_LDFLAGS) -libharfbuzz_subset_fuzzing_la_SOURCES = $(libharfbuzz_subset_la_SOURCES) -libharfbuzz_subset_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS) -libharfbuzz_subset_fuzzing_la_LDFLAGS = $(AM_LDFLAGS) -libharfbuzz_subset_fuzzing_la_LIBADD = $(libharfbuzz_subset_la_LIBADD) -EXTRA_libharfbuzz_subset_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_subset_la_DEPENDENCIES) -CLEANFILES += libharfbuzz-subset-fuzzing.la - if HAVE_ICU if HAVE_ICU_BUILTIN HBCFLAGS += $(ICU_CFLAGS) @@ -270,31 +233,37 @@ EXTRA_DIST += \ CLEANFILES += $(pkgconfig_DATA) -DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def +DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def harfbuzz-deprecated-symbols.txt if HAVE_GOBJECT DEF_FILES += harfbuzz-gobject.def endif check: $(DEF_FILES) # For check-symbols.sh CLEANFILES += $(DEF_FILES) harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ harfbuzz-subset.def: $(HB_SUBSET_headers) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ harfbuzz-icu.def: $(HB_ICU_headers) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ harfbuzz-gobject.def: $(HB_GOBJECT_headers) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ +harfbuzz-deprecated-symbols.txt: $(srcdir)/hb-deprecated.h + $(AM_V_GEN) PLAIN_LIST=1 $(srcdir)/gen-def.py "$@" $^ GENERATORS = \ gen-arabic-table.py \ + gen-def.py \ + gen-emoji-table.py \ gen-indic-table.py \ + gen-os2-unicode-ranges.py \ + gen-tag-table.py \ gen-use-table.py \ - gen-def.py \ + gen-vowel-constraints.py \ $(NULL) EXTRA_DIST += $(GENERATORS) -unicode-tables: arabic-table indic-table use-table +unicode-tables: arabic-table indic-table tag-table use-table emoji-table arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \ @@ -304,22 +273,32 @@ indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategor $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-indic-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-indic-table.cc; false) +tag-table: gen-tag-table.py languagetags language-subtag-registry + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-tag-table.hh \ + || ($(RM) $(srcdir)/hb-ot-tag-table.hh; false) + use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false) +vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \ + || ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false) + +emoji-table: gen-emoji-table.py emoji-data.txt + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \ + || ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false) + built-sources: $(BUILT_SOURCES) -.PHONY: unicode-tables arabic-table indic-table use-table built-sources +.PHONY: unicode-tables arabic-table indic-table tag-table use-table vowel-constraints emoji-table built-sources RAGEL_GENERATED = \ $(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \ - $(patsubst %,$(srcdir)/%,$(HB_OT_RAGEL_GENERATED_sources)) \ $(NULL) BUILT_SOURCES += $(RAGEL_GENERATED) EXTRA_DIST += \ $(HB_BASE_RAGEL_sources) \ - $(HB_OT_RAGEL_sources) \ $(NULL) # We decided to add ragel-generated files to git... #MAINTAINERCLEANFILES += $(RAGEL_GENERATED) @@ -331,6 +310,7 @@ noinst_PROGRAMS = \ main \ test \ test-buffer-serialize \ + test-name-table \ test-size-params \ test-would-substitute \ $(NULL) @@ -344,17 +324,30 @@ test_SOURCES = test.cc test_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) test_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) -test_would_substitute_SOURCES = test-would-substitute.cc -test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) -test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) +test_buffer_serialize_SOURCES = test-buffer-serialize.cc +test_buffer_serialize_CPPFLAGS = $(HBCFLAGS) +test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS) + +test_name_table_SOURCES = test-name-table.cc +test_name_table_CPPFLAGS = $(HBCFLAGS) +test_name_table_LDADD = libharfbuzz.la $(HBLIBS) test_size_params_SOURCES = test-size-params.cc test_size_params_CPPFLAGS = $(HBCFLAGS) test_size_params_LDADD = libharfbuzz.la $(HBLIBS) -test_buffer_serialize_SOURCES = test-buffer-serialize.cc -test_buffer_serialize_CPPFLAGS = $(HBCFLAGS) -test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS) +test_would_substitute_SOURCES = test-would-substitute.cc +test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) +test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) + +if HAVE_FREETYPE +if HAVE_CAIRO_FT +noinst_PROGRAMS += test-ot-color +test_ot_color_SOURCES = test-ot-color.cc +test_ot_color_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS) +test_ot_color_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS) +endif # HAVE_CAIRO_FT +endif # HAVE_FREETYPE dist_check_SCRIPTS = \ check-c-linkage-decls.sh \ @@ -373,15 +366,11 @@ dist_check_SCRIPTS += \ endif check_PROGRAMS += \ - dump-fon \ dump-indic-data \ dump-khmer-data \ dump-myanmar-data \ dump-use-data \ $(NULL) -dump_fon_SOURCES = dump-fon.cc -dump_fon_CPPFLAGS = $(HBCFLAGS) -dump_fon_LDADD = libharfbuzz.la $(HBLIBS) dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc dump_indic_data_CPPFLAGS = $(HBCFLAGS) dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS) @@ -395,24 +384,23 @@ dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc dump_use_data_CPPFLAGS = $(HBCFLAGS) dump_use_data_LDADD = libharfbuzz.la $(HBLIBS) -if HAVE_FREETYPE -if HAVE_CAIRO_FT -check_PROGRAMS += dump-emoji -dump_emoji_SOURCES = dump-emoji.cc -dump_emoji_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS) -dump_emoji_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS) -endif # HAVE_CAIRO_FT -endif # HAVE_FREETYPE +COMPILED_TESTS = test-iter test-ot-tag test-unicode-ranges +COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG +COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS) +check_PROGRAMS += $(COMPILED_TESTS) +TESTS += $(COMPILED_TESTS) -check_PROGRAMS += test-ot-tag test-unicode-ranges -TESTS += test-ot-tag test-unicode-ranges +test_iter_SOURCES = test-iter.cc hb-static.cc +test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_iter_LDADD = $(COMPILED_TESTS_LDADD) test_ot_tag_SOURCES = hb-ot-tag.cc -test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN -test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS) +test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD) test_unicode_ranges_SOURCES = test-unicode-ranges.cc -test_unicode_ranges_LDADD = libharfbuzz.la $(HBLIBS) +test_unicode_ranges_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_unicode_ranges_LDADD = $(COMPILED_TESTS_LDADD) TESTS_ENVIRONMENT = \ srcdir="$(srcdir)" \ @@ -438,6 +426,8 @@ HarfBuzz_0_0_gir_CFLAGS = \ -DHB_H_IN \ -DHB_OT_H \ -DHB_OT_H_IN \ + -DHB_AAT_H \ + -DHB_AAT_H_IN \ -DHB_GOBJECT_H \ -DHB_GOBJECT_H_IN \ -DHB_EXTERN= \ diff --git a/src/Makefile.in b/src/Makefile.in index e3715e8..beba71c 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -95,86 +95,82 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -TESTS = $(am__EXEEXT_4) test-ot-tag$(EXEEXT) \ - test-unicode-ranges$(EXEEXT) -check_PROGRAMS = dump-fon$(EXEEXT) dump-indic-data$(EXEEXT) \ - dump-khmer-data$(EXEEXT) dump-myanmar-data$(EXEEXT) \ - dump-use-data$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \ - test-ot-tag$(EXEEXT) test-unicode-ranges$(EXEEXT) -@HAVE_OT_TRUE@am__append_1 = $(HB_OT_sources) \ -@HAVE_OT_TRUE@ $(HB_OT_RAGEL_GENERATED_sources) -@HAVE_OT_TRUE@am__append_2 = $(HB_OT_headers) -@HAVE_FALLBACK_TRUE@am__append_3 = $(HB_FALLBACK_sources) -@HAVE_PTHREAD_TRUE@am__append_4 = $(PTHREAD_CFLAGS) -@HAVE_PTHREAD_TRUE@am__append_5 = $(PTHREAD_LIBS) -@HAVE_GLIB_TRUE@am__append_6 = $(GLIB_CFLAGS) -@HAVE_GLIB_TRUE@am__append_7 = $(GLIB_LIBS) -@HAVE_GLIB_TRUE@am__append_8 = $(GLIB_DEPS) -@HAVE_GLIB_TRUE@am__append_9 = $(HB_GLIB_sources) -@HAVE_GLIB_TRUE@am__append_10 = $(HB_GLIB_headers) -@HAVE_FREETYPE_TRUE@am__append_11 = $(FREETYPE_CFLAGS) -@HAVE_FREETYPE_TRUE@am__append_12 = $(FREETYPE_LIBS) +TESTS = $(am__EXEEXT_5) $(am__EXEEXT_2) +check_PROGRAMS = dump-indic-data$(EXEEXT) dump-khmer-data$(EXEEXT) \ + dump-myanmar-data$(EXEEXT) dump-use-data$(EXEEXT) \ + $(am__EXEEXT_1) $(am__EXEEXT_2) +@HAVE_FALLBACK_TRUE@am__append_1 = $(HB_FALLBACK_sources) +@HAVE_PTHREAD_TRUE@am__append_2 = $(PTHREAD_CFLAGS) +@HAVE_PTHREAD_TRUE@am__append_3 = $(PTHREAD_LIBS) +@HAVE_GLIB_TRUE@am__append_4 = $(GLIB_CFLAGS) +@HAVE_GLIB_TRUE@am__append_5 = $(GLIB_LIBS) +@HAVE_GLIB_TRUE@am__append_6 = $(GLIB_DEPS) +@HAVE_GLIB_TRUE@am__append_7 = $(HB_GLIB_sources) +@HAVE_GLIB_TRUE@am__append_8 = $(HB_GLIB_headers) +@HAVE_FREETYPE_TRUE@am__append_9 = $(FREETYPE_CFLAGS) +@HAVE_FREETYPE_TRUE@am__append_10 = $(FREETYPE_LIBS) # XXX # The following creates a recursive dependency on FreeType if FreeType is # built with HarfBuzz support enabled. Newer pkg-config handles that just # fine but pkg-config 0.26 as shipped in Ubuntu 14.04 crashes. Remove # in a year or two, or otherwise work around it... #HBDEPS += $(FREETYPE_DEPS) -@HAVE_FREETYPE_TRUE@am__append_13 = $(HB_FT_sources) -@HAVE_FREETYPE_TRUE@am__append_14 = $(HB_FT_headers) -@HAVE_GRAPHITE2_TRUE@am__append_15 = $(GRAPHITE2_CFLAGS) -@HAVE_GRAPHITE2_TRUE@am__append_16 = $(GRAPHITE2_LIBS) -@HAVE_GRAPHITE2_TRUE@am__append_17 = $(GRAPHITE2_DEPS) -@HAVE_GRAPHITE2_TRUE@am__append_18 = $(HB_GRAPHITE2_sources) -@HAVE_GRAPHITE2_TRUE@am__append_19 = $(HB_GRAPHITE2_headers) -@HAVE_UNISCRIBE_TRUE@am__append_20 = $(UNISCRIBE_CFLAGS) -@HAVE_UNISCRIBE_TRUE@am__append_21 = $(UNISCRIBE_LIBS) -@HAVE_UNISCRIBE_TRUE@am__append_22 = $(HB_UNISCRIBE_sources) -@HAVE_UNISCRIBE_TRUE@am__append_23 = $(HB_UNISCRIBE_headers) -@HAVE_DIRECTWRITE_TRUE@am__append_24 = $(DIRECTWRITE_CXXFLAGS) -@HAVE_DIRECTWRITE_TRUE@am__append_25 = $(DIRECTWRITE_LIBS) -@HAVE_DIRECTWRITE_TRUE@am__append_26 = $(HB_DIRECTWRITE_sources) -@HAVE_DIRECTWRITE_TRUE@am__append_27 = $(HB_DIRECTWRITE_headers) -@HAVE_CORETEXT_TRUE@am__append_28 = $(CORETEXT_CFLAGS) -@HAVE_CORETEXT_TRUE@am__append_29 = $(CORETEXT_LIBS) -@HAVE_CORETEXT_TRUE@am__append_30 = $(HB_CORETEXT_sources) -@HAVE_CORETEXT_TRUE@am__append_31 = $(HB_CORETEXT_headers) -@HAVE_UCDN_TRUE@am__append_32 = hb-ucdn -@HAVE_UCDN_TRUE@am__append_33 = -I$(srcdir)/hb-ucdn -@HAVE_UCDN_TRUE@am__append_34 = hb-ucdn/libhb-ucdn.la -@HAVE_UCDN_TRUE@am__append_35 = $(HB_UCDN_sources) -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_36 = $(ICU_CFLAGS) -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_37 = $(ICU_LIBS) -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_38 = $(HB_ICU_sources) -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_39 = $(HB_ICU_headers) -@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_40 = libharfbuzz-icu.la -@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_41 = $(HB_ICU_headers) -@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_42 = harfbuzz-icu.pc -@HAVE_GOBJECT_TRUE@am__append_43 = libharfbuzz-gobject.la -@HAVE_GOBJECT_TRUE@am__append_44 = $(HB_GOBJECT_DIST_headers) -@HAVE_GOBJECT_TRUE@am__append_45 = $(HB_GOBJECT_NODIST_headers) -@HAVE_GOBJECT_TRUE@am__append_46 = harfbuzz-gobject.pc -@HAVE_GOBJECT_TRUE@am__append_47 = \ +@HAVE_FREETYPE_TRUE@am__append_11 = $(HB_FT_sources) +@HAVE_FREETYPE_TRUE@am__append_12 = $(HB_FT_headers) +@HAVE_GRAPHITE2_TRUE@am__append_13 = $(GRAPHITE2_CFLAGS) +@HAVE_GRAPHITE2_TRUE@am__append_14 = $(GRAPHITE2_LIBS) +@HAVE_GRAPHITE2_TRUE@am__append_15 = $(GRAPHITE2_DEPS) +@HAVE_GRAPHITE2_TRUE@am__append_16 = $(HB_GRAPHITE2_sources) +@HAVE_GRAPHITE2_TRUE@am__append_17 = $(HB_GRAPHITE2_headers) +@HAVE_UNISCRIBE_TRUE@am__append_18 = $(UNISCRIBE_CFLAGS) +@HAVE_UNISCRIBE_TRUE@am__append_19 = $(UNISCRIBE_LIBS) +@HAVE_UNISCRIBE_TRUE@am__append_20 = $(HB_UNISCRIBE_sources) +@HAVE_UNISCRIBE_TRUE@am__append_21 = $(HB_UNISCRIBE_headers) +@HAVE_DIRECTWRITE_TRUE@am__append_22 = $(DIRECTWRITE_CXXFLAGS) +@HAVE_DIRECTWRITE_TRUE@am__append_23 = $(DIRECTWRITE_LIBS) +@HAVE_DIRECTWRITE_TRUE@am__append_24 = $(HB_DIRECTWRITE_sources) +@HAVE_DIRECTWRITE_TRUE@am__append_25 = $(HB_DIRECTWRITE_headers) +@HAVE_CORETEXT_TRUE@am__append_26 = $(CORETEXT_CFLAGS) +@HAVE_CORETEXT_TRUE@am__append_27 = $(CORETEXT_LIBS) +@HAVE_CORETEXT_TRUE@am__append_28 = $(HB_CORETEXT_sources) +@HAVE_CORETEXT_TRUE@am__append_29 = $(HB_CORETEXT_headers) +@HAVE_UCDN_TRUE@am__append_30 = hb-ucdn +@HAVE_UCDN_TRUE@am__append_31 = -I$(srcdir)/hb-ucdn +@HAVE_UCDN_TRUE@am__append_32 = hb-ucdn/libhb-ucdn.la +@HAVE_UCDN_TRUE@am__append_33 = $(HB_UCDN_sources) +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_34 = $(ICU_CFLAGS) +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_35 = $(ICU_LIBS) +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_36 = $(HB_ICU_sources) +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__append_37 = $(HB_ICU_headers) +@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_38 = libharfbuzz-icu.la +@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_39 = $(HB_ICU_headers) +@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am__append_40 = harfbuzz-icu.pc +@HAVE_GOBJECT_TRUE@am__append_41 = libharfbuzz-gobject.la +@HAVE_GOBJECT_TRUE@am__append_42 = $(HB_GOBJECT_DIST_headers) +@HAVE_GOBJECT_TRUE@am__append_43 = $(HB_GOBJECT_NODIST_headers) +@HAVE_GOBJECT_TRUE@am__append_44 = harfbuzz-gobject.pc +@HAVE_GOBJECT_TRUE@am__append_45 = \ @HAVE_GOBJECT_TRUE@ $(HB_GOBJECT_ENUM_sources) \ @HAVE_GOBJECT_TRUE@ $(HB_GOBJECT_ENUM_headers) \ @HAVE_GOBJECT_TRUE@ $(NULL) -@HAVE_GOBJECT_TRUE@am__append_48 = \ +@HAVE_GOBJECT_TRUE@am__append_46 = \ @HAVE_GOBJECT_TRUE@ $(HB_GOBJECT_ENUM_sources) \ @HAVE_GOBJECT_TRUE@ $(HB_GOBJECT_ENUM_headers) \ @HAVE_GOBJECT_TRUE@ $(NULL) -@HAVE_GOBJECT_TRUE@am__append_49 = harfbuzz-gobject.def +@HAVE_GOBJECT_TRUE@am__append_47 = harfbuzz-gobject.def noinst_PROGRAMS = main$(EXEEXT) test$(EXEEXT) \ - test-buffer-serialize$(EXEEXT) test-size-params$(EXEEXT) \ - test-would-substitute$(EXEEXT) $(am__EXEEXT_1) + test-buffer-serialize$(EXEEXT) test-name-table$(EXEEXT) \ + test-size-params$(EXEEXT) test-would-substitute$(EXEEXT) \ + $(am__EXEEXT_1) $(am__EXEEXT_3) bin_PROGRAMS = -@WITH_LIBSTDCXX_FALSE@am__append_50 = \ +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__append_48 = test-ot-color +@WITH_LIBSTDCXX_FALSE@am__append_49 = \ @WITH_LIBSTDCXX_FALSE@ check-libstdc++.sh \ @WITH_LIBSTDCXX_FALSE@ $(NULL) -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__append_51 = dump-emoji -@HAVE_INTROSPECTION_TRUE@am__append_52 = $(gir_DATA) $(typelib_DATA) +@HAVE_INTROSPECTION_TRUE@am__append_50 = $(gir_DATA) $(typelib_DATA) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \ @@ -182,8 +178,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_link_flag.m4 \ $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ - $(top_srcdir)/configure.ac + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_check_SCRIPTS_DIST) \ @@ -225,177 +220,16 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = -@HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) -@HAVE_FREETYPE_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) -@HAVE_GRAPHITE2_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) -@HAVE_PTHREAD_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) -@HAVE_UNISCRIBE_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1) -@HAVE_DIRECTWRITE_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1) -@HAVE_CORETEXT_TRUE@am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1) -am__DEPENDENCIES_9 = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) \ - $(am__DEPENDENCIES_7) $(am__DEPENDENCIES_8) -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__DEPENDENCIES_10 = \ -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__DEPENDENCIES_1) -am__DEPENDENCIES_11 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \ - $(am__DEPENDENCIES_4) $(am__append_34) $(am__DEPENDENCIES_9) \ - $(am__DEPENDENCIES_10) -am__DEPENDENCIES_12 = $(am__DEPENDENCIES_11) -libharfbuzz_fuzzing_la_DEPENDENCIES = $(am__DEPENDENCIES_12) -am__libharfbuzz_fuzzing_la_SOURCES_DIST = hb-atomic-private.hh \ - hb-blob-private.hh hb-blob.cc hb-buffer-private.hh \ - hb-buffer-serialize.cc hb-buffer.cc hb-common.cc hb-debug.hh \ - hb-dsalgs.hh hb-face-private.hh hb-face.cc hb-font-private.hh \ - hb-font.cc hb-map-private.hh hb-map.cc hb-mutex-private.hh \ - hb-object-private.hh hb-open-file-private.hh \ - hb-open-type-private.hh hb-ot-color-cbdt-table.hh \ - hb-ot-cmap-table.hh hb-ot-glyf-table.hh hb-ot-hdmx-table.hh \ - hb-ot-head-table.hh hb-ot-hhea-table.hh hb-ot-hmtx-table.hh \ - hb-ot-kern-table.hh hb-ot-maxp-table.hh hb-ot-name-table.hh \ - hb-ot-os2-table.hh hb-ot-os2-unicode-ranges.hh \ - hb-ot-post-macroman.hh hb-ot-post-table.hh hb-ot-tag.cc \ - hb-private.hh hb-set-digest-private.hh hb-set-private.hh \ - hb-set.cc hb-shape.cc hb-shape-plan-private.hh \ - hb-shape-plan.cc hb-shaper-list.hh hb-shaper-impl-private.hh \ - hb-shaper-private.hh hb-shaper.cc hb-static.cc \ - hb-string-array.hh hb-unicode-private.hh hb-unicode.cc \ - hb-utf-private.hh hb-warning.cc hb-buffer-deserialize-json.hh \ - hb-buffer-deserialize-text.hh hb-aat-layout.cc \ - hb-aat-layout-common-private.hh hb-aat-layout-ankr-table.hh \ - hb-aat-layout-bsln-table.hh hb-aat-layout-feat-table.hh \ - hb-aat-layout-kerx-table.hh hb-aat-layout-morx-table.hh \ - hb-aat-layout-trak-table.hh hb-aat-layout-private.hh \ - hb-aat-fmtx-table.hh hb-aat-gcid-table.hh hb-aat-ltag-table.hh \ - hb-ot-font.cc hb-ot-layout.cc hb-ot-layout-base-table.hh \ - hb-ot-layout-common-private.hh hb-ot-layout-gdef-table.hh \ - hb-ot-layout-gpos-table.hh hb-ot-layout-gsubgpos-private.hh \ - hb-ot-layout-gsub-table.hh hb-ot-layout-jstf-table.hh \ - hb-ot-layout-private.hh hb-ot-color.cc \ - hb-ot-color-colr-table.hh hb-ot-color-cpal-table.hh \ - hb-ot-color-sbix-table.hh hb-ot-color-svg-table.hh \ - hb-ot-map.cc hb-ot-map-private.hh hb-ot-math.cc \ - hb-ot-math-table.hh hb-ot-shape.cc \ - hb-ot-shape-complex-arabic.cc \ - hb-ot-shape-complex-arabic-fallback.hh \ - hb-ot-shape-complex-arabic-private.hh \ - hb-ot-shape-complex-arabic-table.hh \ - hb-ot-shape-complex-arabic-win1256.hh \ - hb-ot-shape-complex-default.cc hb-ot-shape-complex-hangul.cc \ - hb-ot-shape-complex-hebrew.cc hb-ot-shape-complex-indic.cc \ - hb-ot-shape-complex-indic-private.hh \ - hb-ot-shape-complex-indic-table.cc \ - hb-ot-shape-complex-khmer-private.hh \ - hb-ot-shape-complex-khmer.cc \ - hb-ot-shape-complex-myanmar-private.hh \ - hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-thai.cc \ - hb-ot-shape-complex-tibetan.cc hb-ot-shape-complex-use.cc \ - hb-ot-shape-complex-use-private.hh \ - hb-ot-shape-complex-use-table.cc \ - hb-ot-shape-complex-private.hh \ - hb-ot-shape-normalize-private.hh hb-ot-shape-normalize.cc \ - hb-ot-shape-fallback-private.hh hb-ot-shape-fallback.cc \ - hb-ot-shape-private.hh hb-ot-var.cc hb-ot-var-avar-table.hh \ - hb-ot-var-fvar-table.hh hb-ot-var-hvar-table.hh \ - hb-ot-var-mvar-table.hh 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 hb-fallback-shape.cc \ - hb-glib.cc hb-ft.cc hb-graphite2.cc hb-uniscribe.cc \ - hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc hb.h \ - hb-blob.h hb-buffer.h hb-common.h hb-deprecated.h hb-face.h \ - hb-font.h hb-map.h hb-set.h hb-shape.h hb-shape-plan.h \ - hb-unicode.h hb-version.h hb-ot.h hb-ot-font.h hb-ot-layout.h \ - hb-ot-math.h hb-ot-shape.h hb-ot-tag.h hb-ot-var.h hb-glib.h \ - hb-ft.h hb-graphite2.h hb-uniscribe.h hb-directwrite.h \ - hb-coretext.h hb-icu.h -am__objects_1 = -am__objects_2 = libharfbuzz_fuzzing_la-hb-blob.lo \ - libharfbuzz_fuzzing_la-hb-buffer-serialize.lo \ - libharfbuzz_fuzzing_la-hb-buffer.lo \ - libharfbuzz_fuzzing_la-hb-common.lo \ - libharfbuzz_fuzzing_la-hb-face.lo \ - libharfbuzz_fuzzing_la-hb-font.lo \ - libharfbuzz_fuzzing_la-hb-map.lo \ - libharfbuzz_fuzzing_la-hb-ot-tag.lo \ - libharfbuzz_fuzzing_la-hb-set.lo \ - libharfbuzz_fuzzing_la-hb-shape.lo \ - libharfbuzz_fuzzing_la-hb-shape-plan.lo \ - libharfbuzz_fuzzing_la-hb-shaper.lo \ - libharfbuzz_fuzzing_la-hb-static.lo \ - libharfbuzz_fuzzing_la-hb-unicode.lo \ - libharfbuzz_fuzzing_la-hb-warning.lo $(am__objects_1) -am__objects_3 = $(am__objects_1) -am__objects_4 = libharfbuzz_fuzzing_la-hb-aat-layout.lo \ - libharfbuzz_fuzzing_la-hb-ot-font.lo \ - libharfbuzz_fuzzing_la-hb-ot-layout.lo \ - libharfbuzz_fuzzing_la-hb-ot-color.lo \ - libharfbuzz_fuzzing_la-hb-ot-map.lo \ - libharfbuzz_fuzzing_la-hb-ot-math.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-normalize.lo \ - libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo \ - libharfbuzz_fuzzing_la-hb-ot-var.lo $(am__objects_1) -@HAVE_OT_TRUE@am__objects_5 = $(am__objects_4) $(am__objects_3) -am__objects_6 = libharfbuzz_fuzzing_la-hb-fallback-shape.lo \ - $(am__objects_1) -@HAVE_FALLBACK_TRUE@am__objects_7 = $(am__objects_6) -am__objects_8 = libharfbuzz_fuzzing_la-hb-glib.lo -@HAVE_GLIB_TRUE@am__objects_9 = $(am__objects_8) -am__objects_10 = libharfbuzz_fuzzing_la-hb-ft.lo -@HAVE_FREETYPE_TRUE@am__objects_11 = $(am__objects_10) -am__objects_12 = libharfbuzz_fuzzing_la-hb-graphite2.lo -@HAVE_GRAPHITE2_TRUE@am__objects_13 = $(am__objects_12) -am__objects_14 = libharfbuzz_fuzzing_la-hb-uniscribe.lo -@HAVE_UNISCRIBE_TRUE@am__objects_15 = $(am__objects_14) -am__objects_16 = libharfbuzz_fuzzing_la-hb-directwrite.lo -@HAVE_DIRECTWRITE_TRUE@am__objects_17 = $(am__objects_16) -am__objects_18 = libharfbuzz_fuzzing_la-hb-coretext.lo -@HAVE_CORETEXT_TRUE@am__objects_19 = $(am__objects_18) -am__objects_20 = libharfbuzz_fuzzing_la-hb-ucdn.lo -@HAVE_UCDN_TRUE@am__objects_21 = $(am__objects_20) -am__objects_22 = libharfbuzz_fuzzing_la-hb-icu.lo -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_23 = \ -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__objects_22) -am__objects_24 = $(am__objects_2) $(am__objects_3) $(am__objects_5) \ - $(am__objects_7) $(am__objects_9) $(am__objects_11) \ - $(am__objects_13) $(am__objects_15) $(am__objects_17) \ - $(am__objects_19) $(am__objects_21) $(am__objects_23) -@HAVE_OT_TRUE@am__objects_25 = $(am__objects_3) -@HAVE_GLIB_TRUE@am__objects_26 = $(am__objects_1) -@HAVE_FREETYPE_TRUE@am__objects_27 = $(am__objects_1) -@HAVE_GRAPHITE2_TRUE@am__objects_28 = $(am__objects_1) -@HAVE_UNISCRIBE_TRUE@am__objects_29 = $(am__objects_1) -@HAVE_DIRECTWRITE_TRUE@am__objects_30 = $(am__objects_1) -@HAVE_CORETEXT_TRUE@am__objects_31 = $(am__objects_1) -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_32 = \ -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__objects_1) -am__objects_33 = $(am__objects_3) $(am__objects_25) $(am__objects_26) \ - $(am__objects_27) $(am__objects_28) $(am__objects_29) \ - $(am__objects_30) $(am__objects_31) $(am__objects_32) -am__objects_34 = $(am__objects_24) $(am__objects_33) -am_libharfbuzz_fuzzing_la_OBJECTS = $(am__objects_34) -libharfbuzz_fuzzing_la_OBJECTS = $(am_libharfbuzz_fuzzing_la_OBJECTS) @HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_DEPENDENCIES = \ @HAVE_GOBJECT_TRUE@ $(am__DEPENDENCIES_1) libharfbuzz.la am__libharfbuzz_gobject_la_SOURCES_DIST = hb-gobject-structs.cc -am__objects_35 = libharfbuzz_gobject_la-hb-gobject-structs.lo +am__objects_1 = libharfbuzz_gobject_la-hb-gobject-structs.lo @HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_OBJECTS = \ -@HAVE_GOBJECT_TRUE@ $(am__objects_35) -am__objects_36 = libharfbuzz_gobject_la-hb-gobject-enums.lo -am__objects_37 = $(am__objects_36) +@HAVE_GOBJECT_TRUE@ $(am__objects_1) +am__objects_2 = libharfbuzz_gobject_la-hb-gobject-enums.lo +am__objects_3 = $(am__objects_2) @HAVE_GOBJECT_TRUE@nodist_libharfbuzz_gobject_la_OBJECTS = \ -@HAVE_GOBJECT_TRUE@ $(am__objects_37) +@HAVE_GOBJECT_TRUE@ $(am__objects_3) libharfbuzz_gobject_la_OBJECTS = $(am_libharfbuzz_gobject_la_OBJECTS) \ $(nodist_libharfbuzz_gobject_la_OBJECTS) @HAVE_GOBJECT_TRUE@am_libharfbuzz_gobject_la_rpath = -rpath $(libdir) @@ -403,9 +237,9 @@ libharfbuzz_gobject_la_OBJECTS = $(am_libharfbuzz_gobject_la_OBJECTS) \ @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@ $(am__DEPENDENCIES_1) \ @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@ libharfbuzz.la am__libharfbuzz_icu_la_SOURCES_DIST = hb-icu.cc -am__objects_38 = libharfbuzz_icu_la-hb-icu.lo +am__objects_4 = libharfbuzz_icu_la-hb-icu.lo @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_OBJECTS = \ -@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@ $(am__objects_38) +@HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@ $(am__objects_4) libharfbuzz_icu_la_OBJECTS = $(am_libharfbuzz_icu_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -417,167 +251,184 @@ libharfbuzz_icu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(LDFLAGS) -o $@ @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@am_libharfbuzz_icu_la_rpath = \ @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@ -rpath $(libdir) -libharfbuzz_subset_fuzzing_la_DEPENDENCIES = \ - $(libharfbuzz_subset_la_LIBADD) -am__objects_39 = libharfbuzz_subset_fuzzing_la-hb-static.lo \ - libharfbuzz_subset_fuzzing_la-hb-subset.lo \ - libharfbuzz_subset_fuzzing_la-hb-subset-glyf.lo \ - libharfbuzz_subset_fuzzing_la-hb-subset-input.lo \ - libharfbuzz_subset_fuzzing_la-hb-subset-plan.lo \ - $(am__objects_1) -am__objects_40 = $(am__objects_39) -am_libharfbuzz_subset_fuzzing_la_OBJECTS = $(am__objects_40) -libharfbuzz_subset_fuzzing_la_OBJECTS = \ - $(am_libharfbuzz_subset_fuzzing_la_OBJECTS) libharfbuzz_subset_la_DEPENDENCIES = libharfbuzz.la -am__objects_41 = libharfbuzz_subset_la-hb-static.lo \ - libharfbuzz_subset_la-hb-subset.lo \ +am__objects_5 = +am__objects_6 = libharfbuzz_subset_la-hb-ot-cff1-table.lo \ + libharfbuzz_subset_la-hb-ot-cff2-table.lo \ + libharfbuzz_subset_la-hb-static.lo \ + libharfbuzz_subset_la-hb-subset-cff-common.lo \ + libharfbuzz_subset_la-hb-subset-cff1.lo \ + libharfbuzz_subset_la-hb-subset-cff2.lo \ libharfbuzz_subset_la-hb-subset-glyf.lo \ libharfbuzz_subset_la-hb-subset-input.lo \ - libharfbuzz_subset_la-hb-subset-plan.lo $(am__objects_1) -am_libharfbuzz_subset_la_OBJECTS = $(am__objects_41) + libharfbuzz_subset_la-hb-subset-plan.lo \ + libharfbuzz_subset_la-hb-subset.lo $(am__objects_5) +am_libharfbuzz_subset_la_OBJECTS = $(am__objects_6) libharfbuzz_subset_la_OBJECTS = $(am_libharfbuzz_subset_la_OBJECTS) libharfbuzz_subset_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(libharfbuzz_subset_la_LDFLAGS) \ $(LDFLAGS) -o $@ +@HAVE_GLIB_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +@HAVE_FREETYPE_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) +@HAVE_GRAPHITE2_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) +@HAVE_PTHREAD_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) +@HAVE_UNISCRIBE_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1) +@HAVE_DIRECTWRITE_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1) +@HAVE_CORETEXT_TRUE@am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1) +am__DEPENDENCIES_9 = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) \ + $(am__DEPENDENCIES_7) $(am__DEPENDENCIES_8) +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__DEPENDENCIES_10 = \ +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__DEPENDENCIES_1) +am__DEPENDENCIES_11 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_4) $(am__append_32) $(am__DEPENDENCIES_9) \ + $(am__DEPENDENCIES_10) libharfbuzz_la_DEPENDENCIES = $(am__DEPENDENCIES_11) -am__libharfbuzz_la_SOURCES_DIST = hb-atomic-private.hh \ - hb-blob-private.hh hb-blob.cc hb-buffer-private.hh \ - hb-buffer-serialize.cc hb-buffer.cc hb-common.cc hb-debug.hh \ - hb-dsalgs.hh hb-face-private.hh hb-face.cc hb-font-private.hh \ - hb-font.cc hb-map-private.hh hb-map.cc hb-mutex-private.hh \ - hb-object-private.hh hb-open-file-private.hh \ - hb-open-type-private.hh hb-ot-color-cbdt-table.hh \ - hb-ot-cmap-table.hh hb-ot-glyf-table.hh hb-ot-hdmx-table.hh \ - hb-ot-head-table.hh hb-ot-hhea-table.hh hb-ot-hmtx-table.hh \ - hb-ot-kern-table.hh hb-ot-maxp-table.hh hb-ot-name-table.hh \ - hb-ot-os2-table.hh hb-ot-os2-unicode-ranges.hh \ - hb-ot-post-macroman.hh hb-ot-post-table.hh hb-ot-tag.cc \ - hb-private.hh hb-set-digest-private.hh hb-set-private.hh \ - hb-set.cc hb-shape.cc hb-shape-plan-private.hh \ - hb-shape-plan.cc hb-shaper-list.hh hb-shaper-impl-private.hh \ - hb-shaper-private.hh hb-shaper.cc hb-static.cc \ - hb-string-array.hh hb-unicode-private.hh hb-unicode.cc \ - hb-utf-private.hh hb-warning.cc hb-buffer-deserialize-json.hh \ - hb-buffer-deserialize-text.hh hb-aat-layout.cc \ - hb-aat-layout-common-private.hh hb-aat-layout-ankr-table.hh \ - hb-aat-layout-bsln-table.hh hb-aat-layout-feat-table.hh \ - hb-aat-layout-kerx-table.hh hb-aat-layout-morx-table.hh \ - hb-aat-layout-trak-table.hh hb-aat-layout-private.hh \ - hb-aat-fmtx-table.hh hb-aat-gcid-table.hh hb-aat-ltag-table.hh \ - hb-ot-font.cc hb-ot-layout.cc hb-ot-layout-base-table.hh \ - hb-ot-layout-common-private.hh hb-ot-layout-gdef-table.hh \ - hb-ot-layout-gpos-table.hh hb-ot-layout-gsubgpos-private.hh \ - hb-ot-layout-gsub-table.hh hb-ot-layout-jstf-table.hh \ - hb-ot-layout-private.hh hb-ot-color.cc \ +am__libharfbuzz_la_SOURCES_DIST = hb-aat-fdsc-table.hh \ + hb-aat-layout-ankr-table.hh hb-aat-layout-bsln-table.hh \ + hb-aat-layout-common.hh hb-aat-layout-feat-table.hh \ + hb-aat-layout-just-table.hh hb-aat-layout-kerx-table.hh \ + hb-aat-layout-lcar-table.hh hb-aat-layout-morx-table.hh \ + hb-aat-layout-trak-table.hh hb-aat-layout.cc hb-aat-layout.hh \ + hb-aat-ltag-table.hh hb-aat-map.cc hb-aat-map.hh hb-array.hh \ + hb-atomic.hh hb-blob.cc hb-blob.hh hb-buffer-serialize.cc \ + hb-buffer.cc hb-buffer.hh hb-cache.hh hb-cff-interp-common.hh \ + hb-cff-interp-cs-common.hh hb-cff-interp-dict-common.hh \ + hb-cff1-interp-cs.hh hb-cff2-interp-cs.hh hb-common.cc \ + hb-debug.hh hb-dsalgs.hh hb-face.cc hb-face.hh hb-font.cc \ + hb-font.hh hb-iter.hh hb-kern.hh hb-machinery.hh hb-map.cc \ + hb-map.hh hb-mutex.hh hb-null.hh hb-object.hh hb-open-file.hh \ + hb-open-type.hh hb-ot-cff-common.hh hb-ot-cff1-table.cc \ + hb-ot-cff1-table.hh hb-ot-cff2-table.cc hb-ot-cff2-table.hh \ + hb-ot-cmap-table.hh hb-ot-color-cbdt-table.hh \ hb-ot-color-colr-table.hh hb-ot-color-cpal-table.hh \ hb-ot-color-sbix-table.hh hb-ot-color-svg-table.hh \ - hb-ot-map.cc hb-ot-map-private.hh hb-ot-math.cc \ - hb-ot-math-table.hh hb-ot-shape.cc \ - hb-ot-shape-complex-arabic.cc \ - hb-ot-shape-complex-arabic-fallback.hh \ - hb-ot-shape-complex-arabic-private.hh \ + hb-ot-color.cc hb-ot-face.cc hb-ot-face.hh hb-ot-font.cc \ + hb-ot-gasp-table.hh hb-ot-glyf-table.hh hb-ot-hdmx-table.hh \ + hb-ot-head-table.hh hb-ot-hhea-table.hh hb-ot-hmtx-table.hh \ + hb-ot-kern-table.hh hb-ot-layout-base-table.hh \ + hb-ot-layout-common.hh hb-ot-layout-gdef-table.hh \ + hb-ot-layout-gpos-table.hh hb-ot-layout-gsub-table.hh \ + hb-ot-layout-gsubgpos.hh hb-ot-layout-jstf-table.hh \ + hb-ot-layout.cc hb-ot-layout.hh hb-ot-map.cc hb-ot-map.hh \ + hb-ot-math-table.hh hb-ot-math.cc hb-ot-maxp-table.hh \ + hb-ot-name-language.cc hb-ot-name-language.hh \ + hb-ot-name-table.hh hb-ot-name.cc hb-ot-os2-table.hh \ + hb-ot-os2-unicode-ranges.hh hb-ot-post-macroman.hh \ + hb-ot-post-table.hh hb-ot-shape-complex-arabic-fallback.hh \ hb-ot-shape-complex-arabic-table.hh \ hb-ot-shape-complex-arabic-win1256.hh \ + hb-ot-shape-complex-arabic.cc hb-ot-shape-complex-arabic.hh \ hb-ot-shape-complex-default.cc hb-ot-shape-complex-hangul.cc \ - hb-ot-shape-complex-hebrew.cc hb-ot-shape-complex-indic.cc \ - hb-ot-shape-complex-indic-private.hh \ + hb-ot-shape-complex-hebrew.cc \ hb-ot-shape-complex-indic-table.cc \ - hb-ot-shape-complex-khmer-private.hh \ - hb-ot-shape-complex-khmer.cc \ - hb-ot-shape-complex-myanmar-private.hh \ - hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-thai.cc \ - hb-ot-shape-complex-tibetan.cc hb-ot-shape-complex-use.cc \ - hb-ot-shape-complex-use-private.hh \ - hb-ot-shape-complex-use-table.cc \ - hb-ot-shape-complex-private.hh \ - hb-ot-shape-normalize-private.hh hb-ot-shape-normalize.cc \ - hb-ot-shape-fallback-private.hh hb-ot-shape-fallback.cc \ - hb-ot-shape-private.hh hb-ot-var.cc hb-ot-var-avar-table.hh \ - hb-ot-var-fvar-table.hh hb-ot-var-hvar-table.hh \ - hb-ot-var-mvar-table.hh hb-ot-shape-complex-indic-machine.hh \ + hb-ot-shape-complex-indic.cc hb-ot-shape-complex-indic.hh \ + hb-ot-shape-complex-khmer.cc hb-ot-shape-complex-khmer.hh \ + hb-ot-shape-complex-myanmar.cc hb-ot-shape-complex-myanmar.hh \ + hb-ot-shape-complex-thai.cc hb-ot-shape-complex-use-table.cc \ + hb-ot-shape-complex-use.cc hb-ot-shape-complex-use.hh \ + hb-ot-shape-complex-vowel-constraints.cc \ + hb-ot-shape-complex-vowel-constraints.hh \ + hb-ot-shape-complex.hh hb-ot-shape-fallback.cc \ + hb-ot-shape-fallback.hh hb-ot-shape-normalize.cc \ + hb-ot-shape-normalize.hh hb-ot-shape.cc hb-ot-shape.hh \ + hb-ot-stat-table.hh hb-ot-tag-table.hh hb-ot-tag.cc \ + hb-ot-var-avar-table.hh hb-ot-var-fvar-table.hh \ + hb-ot-var-hvar-table.hh hb-ot-var-mvar-table.hh hb-ot-var.cc \ + hb-ot-vorg-table.hh hb-set-digest.hh hb-set.cc hb-set.hh \ + hb-shape-plan.cc hb-shape-plan.hh hb-shape.cc \ + hb-shaper-impl.hh hb-shaper-list.hh hb-shaper.cc hb-shaper.hh \ + hb-static.cc hb-string-array.hh hb-unicode-emoji-table.hh \ + hb-unicode.cc hb-unicode.hh hb-utf.hh hb-vector.hh \ + hb-warning.cc hb.hh hb-buffer-deserialize-json.hh \ + hb-buffer-deserialize-text.hh \ + 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 hb-fallback-shape.cc \ hb-glib.cc hb-ft.cc hb-graphite2.cc hb-uniscribe.cc \ - hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc hb.h \ - hb-blob.h hb-buffer.h hb-common.h hb-deprecated.h hb-face.h \ - hb-font.h hb-map.h hb-set.h hb-shape.h hb-shape-plan.h \ - hb-unicode.h hb-version.h hb-ot.h hb-ot-font.h hb-ot-layout.h \ - hb-ot-math.h hb-ot-shape.h hb-ot-tag.h hb-ot-var.h hb-glib.h \ - hb-ft.h hb-graphite2.h hb-uniscribe.h hb-directwrite.h \ - hb-coretext.h hb-icu.h -am__objects_42 = libharfbuzz_la-hb-blob.lo \ + hb-directwrite.cc hb-coretext.cc hb-ucdn.cc hb-icu.cc \ + hb-aat-layout.h hb-aat.h hb-blob.h hb-buffer.h hb-common.h \ + hb-deprecated.h hb-face.h hb-font.h hb-map.h hb-ot-color.h \ + hb-ot-deprecated.h hb-ot-font.h hb-ot-layout.h hb-ot-math.h \ + hb-ot-name.h hb-ot-shape.h hb-ot-var.h hb-ot.h hb-set.h \ + hb-shape-plan.h hb-shape.h hb-unicode.h hb-version.h hb.h \ + hb-glib.h hb-ft.h hb-graphite2.h hb-uniscribe.h \ + hb-directwrite.h hb-coretext.h hb-icu.h +am__objects_7 = libharfbuzz_la-hb-aat-layout.lo \ + libharfbuzz_la-hb-aat-map.lo libharfbuzz_la-hb-blob.lo \ libharfbuzz_la-hb-buffer-serialize.lo \ libharfbuzz_la-hb-buffer.lo libharfbuzz_la-hb-common.lo \ libharfbuzz_la-hb-face.lo libharfbuzz_la-hb-font.lo \ - libharfbuzz_la-hb-map.lo libharfbuzz_la-hb-ot-tag.lo \ - libharfbuzz_la-hb-set.lo libharfbuzz_la-hb-shape.lo \ - libharfbuzz_la-hb-shape-plan.lo libharfbuzz_la-hb-shaper.lo \ - libharfbuzz_la-hb-static.lo libharfbuzz_la-hb-unicode.lo \ - libharfbuzz_la-hb-warning.lo $(am__objects_1) -am__objects_43 = libharfbuzz_la-hb-aat-layout.lo \ + libharfbuzz_la-hb-map.lo libharfbuzz_la-hb-ot-cff1-table.lo \ + libharfbuzz_la-hb-ot-cff2-table.lo \ + libharfbuzz_la-hb-ot-color.lo libharfbuzz_la-hb-ot-face.lo \ libharfbuzz_la-hb-ot-font.lo libharfbuzz_la-hb-ot-layout.lo \ - libharfbuzz_la-hb-ot-color.lo libharfbuzz_la-hb-ot-map.lo \ - libharfbuzz_la-hb-ot-math.lo libharfbuzz_la-hb-ot-shape.lo \ + libharfbuzz_la-hb-ot-map.lo libharfbuzz_la-hb-ot-math.lo \ + libharfbuzz_la-hb-ot-name-language.lo \ + libharfbuzz_la-hb-ot-name.lo \ libharfbuzz_la-hb-ot-shape-complex-arabic.lo \ libharfbuzz_la-hb-ot-shape-complex-default.lo \ libharfbuzz_la-hb-ot-shape-complex-hangul.lo \ libharfbuzz_la-hb-ot-shape-complex-hebrew.lo \ - libharfbuzz_la-hb-ot-shape-complex-indic.lo \ libharfbuzz_la-hb-ot-shape-complex-indic-table.lo \ + libharfbuzz_la-hb-ot-shape-complex-indic.lo \ libharfbuzz_la-hb-ot-shape-complex-khmer.lo \ libharfbuzz_la-hb-ot-shape-complex-myanmar.lo \ libharfbuzz_la-hb-ot-shape-complex-thai.lo \ - libharfbuzz_la-hb-ot-shape-complex-tibetan.lo \ - libharfbuzz_la-hb-ot-shape-complex-use.lo \ libharfbuzz_la-hb-ot-shape-complex-use-table.lo \ - libharfbuzz_la-hb-ot-shape-normalize.lo \ + libharfbuzz_la-hb-ot-shape-complex-use.lo \ + libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo \ libharfbuzz_la-hb-ot-shape-fallback.lo \ - libharfbuzz_la-hb-ot-var.lo $(am__objects_1) -@HAVE_OT_TRUE@am__objects_44 = $(am__objects_43) $(am__objects_3) -am__objects_45 = libharfbuzz_la-hb-fallback-shape.lo $(am__objects_1) -@HAVE_FALLBACK_TRUE@am__objects_46 = $(am__objects_45) -am__objects_47 = libharfbuzz_la-hb-glib.lo -@HAVE_GLIB_TRUE@am__objects_48 = $(am__objects_47) -am__objects_49 = libharfbuzz_la-hb-ft.lo -@HAVE_FREETYPE_TRUE@am__objects_50 = $(am__objects_49) -am__objects_51 = libharfbuzz_la-hb-graphite2.lo -@HAVE_GRAPHITE2_TRUE@am__objects_52 = $(am__objects_51) -am__objects_53 = libharfbuzz_la-hb-uniscribe.lo -@HAVE_UNISCRIBE_TRUE@am__objects_54 = $(am__objects_53) -am__objects_55 = libharfbuzz_la-hb-directwrite.lo -@HAVE_DIRECTWRITE_TRUE@am__objects_56 = $(am__objects_55) -am__objects_57 = libharfbuzz_la-hb-coretext.lo -@HAVE_CORETEXT_TRUE@am__objects_58 = $(am__objects_57) -am__objects_59 = libharfbuzz_la-hb-ucdn.lo -@HAVE_UCDN_TRUE@am__objects_60 = $(am__objects_59) -am__objects_61 = libharfbuzz_la-hb-icu.lo -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_62 = \ -@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__objects_61) -am__objects_63 = $(am__objects_42) $(am__objects_3) $(am__objects_44) \ - $(am__objects_46) $(am__objects_48) $(am__objects_50) \ - $(am__objects_52) $(am__objects_54) $(am__objects_56) \ - $(am__objects_58) $(am__objects_60) $(am__objects_62) -am_libharfbuzz_la_OBJECTS = $(am__objects_63) $(am__objects_33) + libharfbuzz_la-hb-ot-shape-normalize.lo \ + libharfbuzz_la-hb-ot-shape.lo libharfbuzz_la-hb-ot-tag.lo \ + libharfbuzz_la-hb-ot-var.lo libharfbuzz_la-hb-set.lo \ + libharfbuzz_la-hb-shape-plan.lo libharfbuzz_la-hb-shape.lo \ + libharfbuzz_la-hb-shaper.lo libharfbuzz_la-hb-static.lo \ + libharfbuzz_la-hb-unicode.lo libharfbuzz_la-hb-warning.lo \ + $(am__objects_5) +am__objects_8 = $(am__objects_5) +am__objects_9 = libharfbuzz_la-hb-fallback-shape.lo $(am__objects_5) +@HAVE_FALLBACK_TRUE@am__objects_10 = $(am__objects_9) +am__objects_11 = libharfbuzz_la-hb-glib.lo +@HAVE_GLIB_TRUE@am__objects_12 = $(am__objects_11) +am__objects_13 = libharfbuzz_la-hb-ft.lo +@HAVE_FREETYPE_TRUE@am__objects_14 = $(am__objects_13) +am__objects_15 = libharfbuzz_la-hb-graphite2.lo +@HAVE_GRAPHITE2_TRUE@am__objects_16 = $(am__objects_15) +am__objects_17 = libharfbuzz_la-hb-uniscribe.lo +@HAVE_UNISCRIBE_TRUE@am__objects_18 = $(am__objects_17) +am__objects_19 = libharfbuzz_la-hb-directwrite.lo +@HAVE_DIRECTWRITE_TRUE@am__objects_20 = $(am__objects_19) +am__objects_21 = libharfbuzz_la-hb-coretext.lo +@HAVE_CORETEXT_TRUE@am__objects_22 = $(am__objects_21) +am__objects_23 = libharfbuzz_la-hb-ucdn.lo +@HAVE_UCDN_TRUE@am__objects_24 = $(am__objects_23) +am__objects_25 = libharfbuzz_la-hb-icu.lo +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_26 = \ +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__objects_25) +am__objects_27 = $(am__objects_7) $(am__objects_8) $(am__objects_10) \ + $(am__objects_12) $(am__objects_14) $(am__objects_16) \ + $(am__objects_18) $(am__objects_20) $(am__objects_22) \ + $(am__objects_24) $(am__objects_26) +@HAVE_GLIB_TRUE@am__objects_28 = $(am__objects_5) +@HAVE_FREETYPE_TRUE@am__objects_29 = $(am__objects_5) +@HAVE_GRAPHITE2_TRUE@am__objects_30 = $(am__objects_5) +@HAVE_UNISCRIBE_TRUE@am__objects_31 = $(am__objects_5) +@HAVE_DIRECTWRITE_TRUE@am__objects_32 = $(am__objects_5) +@HAVE_CORETEXT_TRUE@am__objects_33 = $(am__objects_5) +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@am__objects_34 = \ +@HAVE_ICU_BUILTIN_TRUE@@HAVE_ICU_TRUE@ $(am__objects_5) +am__objects_35 = $(am__objects_8) $(am__objects_28) $(am__objects_29) \ + $(am__objects_30) $(am__objects_31) $(am__objects_32) \ + $(am__objects_33) $(am__objects_34) +am_libharfbuzz_la_OBJECTS = $(am__objects_27) $(am__objects_35) libharfbuzz_la_OBJECTS = $(am_libharfbuzz_la_OBJECTS) am__EXEEXT_1 = -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__EXEEXT_2 = \ -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ dump-emoji$(EXEEXT) +am__EXEEXT_2 = test-iter$(EXEEXT) test-ot-tag$(EXEEXT) \ + test-unicode-ranges$(EXEEXT) +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am__EXEEXT_3 = test-ot-color$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) -am__dump_emoji_SOURCES_DIST = dump-emoji.cc -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am_dump_emoji_OBJECTS = dump_emoji-dump-emoji.$(OBJEXT) -dump_emoji_OBJECTS = $(am_dump_emoji_OBJECTS) -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@dump_emoji_DEPENDENCIES = \ -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ libharfbuzz.la \ -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_11) \ -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_1) \ -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_1) \ -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_1) -am_dump_fon_OBJECTS = dump_fon-dump-fon.$(OBJEXT) -dump_fon_OBJECTS = $(am_dump_fon_OBJECTS) -dump_fon_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11) am_dump_indic_data_OBJECTS = \ dump_indic_data-dump-indic-data.$(OBJEXT) \ dump_indic_data-hb-ot-shape-complex-indic-table.$(OBJEXT) @@ -609,17 +460,35 @@ am_test_buffer_serialize_OBJECTS = \ test_buffer_serialize_OBJECTS = $(am_test_buffer_serialize_OBJECTS) test_buffer_serialize_DEPENDENCIES = libharfbuzz.la \ $(am__DEPENDENCIES_11) +am_test_iter_OBJECTS = test_iter-test-iter.$(OBJEXT) \ + test_iter-hb-static.$(OBJEXT) +test_iter_OBJECTS = $(am_test_iter_OBJECTS) +am__DEPENDENCIES_12 = libharfbuzz.la $(am__DEPENDENCIES_11) +test_iter_DEPENDENCIES = $(am__DEPENDENCIES_12) +am_test_name_table_OBJECTS = \ + test_name_table-test-name-table.$(OBJEXT) +test_name_table_OBJECTS = $(am_test_name_table_OBJECTS) +test_name_table_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11) +am__test_ot_color_SOURCES_DIST = test-ot-color.cc +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@am_test_ot_color_OBJECTS = test_ot_color-test-ot-color.$(OBJEXT) +test_ot_color_OBJECTS = $(am_test_ot_color_OBJECTS) +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_DEPENDENCIES = \ +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ libharfbuzz.la \ +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_11) \ +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_1) \ +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_1) \ +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@ $(am__DEPENDENCIES_1) am_test_ot_tag_OBJECTS = test_ot_tag-hb-ot-tag.$(OBJEXT) test_ot_tag_OBJECTS = $(am_test_ot_tag_OBJECTS) -test_ot_tag_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11) +test_ot_tag_DEPENDENCIES = $(am__DEPENDENCIES_12) am_test_size_params_OBJECTS = \ test_size_params-test-size-params.$(OBJEXT) test_size_params_OBJECTS = $(am_test_size_params_OBJECTS) test_size_params_DEPENDENCIES = libharfbuzz.la $(am__DEPENDENCIES_11) -am_test_unicode_ranges_OBJECTS = test-unicode-ranges.$(OBJEXT) +am_test_unicode_ranges_OBJECTS = \ + test_unicode_ranges-test-unicode-ranges.$(OBJEXT) test_unicode_ranges_OBJECTS = $(am_test_unicode_ranges_OBJECTS) -test_unicode_ranges_DEPENDENCIES = libharfbuzz.la \ - $(am__DEPENDENCIES_11) +test_unicode_ranges_DEPENDENCIES = $(am__DEPENDENCIES_12) am_test_would_substitute_OBJECTS = \ test_would_substitute-test-would-substitute.$(OBJEXT) test_would_substitute_OBJECTS = $(am_test_would_substitute_OBJECTS) @@ -680,31 +549,27 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(libharfbuzz_fuzzing_la_SOURCES) \ - $(libharfbuzz_gobject_la_SOURCES) \ +SOURCES = $(libharfbuzz_gobject_la_SOURCES) \ $(nodist_libharfbuzz_gobject_la_SOURCES) \ - $(libharfbuzz_icu_la_SOURCES) \ - $(libharfbuzz_subset_fuzzing_la_SOURCES) \ - $(libharfbuzz_subset_la_SOURCES) $(libharfbuzz_la_SOURCES) \ - $(dump_emoji_SOURCES) $(dump_fon_SOURCES) \ - $(dump_indic_data_SOURCES) $(dump_khmer_data_SOURCES) \ - $(dump_myanmar_data_SOURCES) $(dump_use_data_SOURCES) \ - $(main_SOURCES) $(test_SOURCES) \ - $(test_buffer_serialize_SOURCES) $(test_ot_tag_SOURCES) \ - $(test_size_params_SOURCES) $(test_unicode_ranges_SOURCES) \ + $(libharfbuzz_icu_la_SOURCES) $(libharfbuzz_subset_la_SOURCES) \ + $(libharfbuzz_la_SOURCES) $(dump_indic_data_SOURCES) \ + $(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \ + $(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \ + $(test_buffer_serialize_SOURCES) $(test_iter_SOURCES) \ + $(test_name_table_SOURCES) $(test_ot_color_SOURCES) \ + $(test_ot_tag_SOURCES) $(test_size_params_SOURCES) \ + $(test_unicode_ranges_SOURCES) \ $(test_would_substitute_SOURCES) -DIST_SOURCES = $(am__libharfbuzz_fuzzing_la_SOURCES_DIST) \ - $(am__libharfbuzz_gobject_la_SOURCES_DIST) \ +DIST_SOURCES = $(am__libharfbuzz_gobject_la_SOURCES_DIST) \ $(am__libharfbuzz_icu_la_SOURCES_DIST) \ - $(libharfbuzz_subset_fuzzing_la_SOURCES) \ $(libharfbuzz_subset_la_SOURCES) \ - $(am__libharfbuzz_la_SOURCES_DIST) \ - $(am__dump_emoji_SOURCES_DIST) $(dump_fon_SOURCES) \ - $(dump_indic_data_SOURCES) $(dump_khmer_data_SOURCES) \ - $(dump_myanmar_data_SOURCES) $(dump_use_data_SOURCES) \ - $(main_SOURCES) $(test_SOURCES) \ - $(test_buffer_serialize_SOURCES) $(test_ot_tag_SOURCES) \ - $(test_size_params_SOURCES) $(test_unicode_ranges_SOURCES) \ + $(am__libharfbuzz_la_SOURCES_DIST) $(dump_indic_data_SOURCES) \ + $(dump_khmer_data_SOURCES) $(dump_myanmar_data_SOURCES) \ + $(dump_use_data_SOURCES) $(main_SOURCES) $(test_SOURCES) \ + $(test_buffer_serialize_SOURCES) $(test_iter_SOURCES) \ + $(test_name_table_SOURCES) $(am__test_ot_color_SOURCES_DIST) \ + $(test_ot_tag_SOURCES) $(test_size_params_SOURCES) \ + $(test_unicode_ranges_SOURCES) \ $(test_would_substitute_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ @@ -720,14 +585,14 @@ am__can_run_installinfo = \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(cmake_DATA) $(gir_DATA) $(pkgconfig_DATA) $(typelib_DATA) -am__pkginclude_HEADERS_DIST = hb.h hb-blob.h hb-buffer.h hb-common.h \ - hb-deprecated.h hb-face.h hb-font.h hb-map.h hb-set.h \ - hb-shape.h hb-shape-plan.h hb-unicode.h hb-version.h hb-ot.h \ - hb-ot-font.h hb-ot-layout.h hb-ot-math.h hb-ot-shape.h \ - hb-ot-tag.h hb-ot-var.h hb-glib.h hb-ft.h hb-graphite2.h \ - hb-uniscribe.h hb-directwrite.h hb-coretext.h hb-icu.h \ - hb-subset.h hb-subset-glyf.hh hb-subset-plan.hh \ - hb-subset-private.hh hb-gobject.h hb-gobject-structs.h +am__pkginclude_HEADERS_DIST = hb-aat-layout.h hb-aat.h hb-blob.h \ + hb-buffer.h hb-common.h hb-deprecated.h hb-face.h hb-font.h \ + hb-map.h hb-ot-color.h hb-ot-deprecated.h hb-ot-font.h \ + hb-ot-layout.h hb-ot-math.h hb-ot-name.h hb-ot-shape.h \ + hb-ot-var.h hb-ot.h hb-set.h hb-shape-plan.h hb-shape.h \ + hb-unicode.h hb-version.h hb.h hb-glib.h hb-ft.h \ + hb-graphite2.h hb-uniscribe.h hb-directwrite.h hb-coretext.h \ + hb-icu.h hb-subset.h hb-gobject.h hb-gobject-structs.h HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive @@ -912,11 +777,11 @@ am__set_TESTS_bases = \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) -@WITH_LIBSTDCXX_FALSE@am__EXEEXT_3 = check-libstdc++.sh \ +@WITH_LIBSTDCXX_FALSE@am__EXEEXT_4 = check-libstdc++.sh \ @WITH_LIBSTDCXX_FALSE@ $(am__EXEEXT_1) -am__EXEEXT_4 = check-c-linkage-decls.sh check-externs.sh \ +am__EXEEXT_5 = check-c-linkage-decls.sh check-externs.sh \ check-header-guards.sh check-includes.sh check-static-inits.sh \ - check-symbols.sh $(am__EXEEXT_1) $(am__EXEEXT_3) + check-symbols.sh $(am__EXEEXT_1) $(am__EXEEXT_4) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver @@ -1083,6 +948,8 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ @@ -1152,87 +1019,189 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ NULL = -SUBDIRS = $(am__append_32) +SUBDIRS = $(am__append_30) DIST_SUBDIRS = hb-ucdn -BUILT_SOURCES = hb-version.h $(am__append_47) $(RAGEL_GENERATED) +BUILT_SOURCES = hb-version.h $(am__append_45) $(RAGEL_GENERATED) EXTRA_DIST = hb-version.h.in harfbuzz.pc.in harfbuzz-config.cmake.in \ harfbuzz-subset.pc.in harfbuzz-icu.pc.in \ harfbuzz-gobject.pc.in hb-gobject-enums.cc.tmpl \ hb-gobject-enums.h.tmpl $(NULL) $(GENERATORS) \ - $(HB_BASE_RAGEL_sources) $(HB_OT_RAGEL_sources) $(NULL) -CLEANFILES = libharfbuzz-fuzzing.la libharfbuzz-subset-fuzzing.la \ - $(pkgconfig_DATA) $(DEF_FILES) $(am__append_52) -DISTCLEANFILES = $(am__append_48) + $(HB_BASE_RAGEL_sources) $(NULL) +CLEANFILES = $(pkgconfig_DATA) $(DEF_FILES) $(am__append_50) +DISTCLEANFILES = $(am__append_46) MAINTAINERCLEANFILES = DISTCHECK_CONFIGURE_FLAGS = --enable-introspection lib_LTLIBRARIES = libharfbuzz.la libharfbuzz-subset.la \ - $(am__append_40) $(am__append_43) + $(am__append_38) $(am__append_41) HB_BASE_sources = \ - hb-atomic-private.hh \ - hb-blob-private.hh \ + hb-aat-fdsc-table.hh \ + hb-aat-layout-ankr-table.hh \ + hb-aat-layout-bsln-table.hh \ + hb-aat-layout-common.hh \ + hb-aat-layout-feat-table.hh \ + hb-aat-layout-just-table.hh \ + hb-aat-layout-kerx-table.hh \ + hb-aat-layout-lcar-table.hh \ + hb-aat-layout-morx-table.hh \ + hb-aat-layout-trak-table.hh \ + hb-aat-layout.cc \ + hb-aat-layout.hh \ + hb-aat-ltag-table.hh \ + hb-aat-map.cc \ + hb-aat-map.hh \ + hb-array.hh \ + hb-atomic.hh \ hb-blob.cc \ - hb-buffer-private.hh \ + hb-blob.hh \ hb-buffer-serialize.cc \ hb-buffer.cc \ + hb-buffer.hh \ + hb-cache.hh \ + hb-cff-interp-common.hh \ + hb-cff-interp-cs-common.hh \ + hb-cff-interp-dict-common.hh \ + hb-cff1-interp-cs.hh \ + hb-cff2-interp-cs.hh \ hb-common.cc \ hb-debug.hh \ hb-dsalgs.hh \ - hb-face-private.hh \ hb-face.cc \ - hb-font-private.hh \ + hb-face.hh \ hb-font.cc \ - hb-map-private.hh \ + hb-font.hh \ + hb-iter.hh \ + hb-kern.hh \ + hb-machinery.hh \ hb-map.cc \ - hb-mutex-private.hh \ - hb-object-private.hh \ - hb-open-file-private.hh \ - hb-open-type-private.hh \ - hb-ot-color-cbdt-table.hh \ + hb-map.hh \ + hb-mutex.hh \ + hb-null.hh \ + hb-object.hh \ + hb-open-file.hh \ + hb-open-type.hh \ + hb-ot-cff-common.hh \ + hb-ot-cff1-table.cc \ + hb-ot-cff1-table.hh \ + hb-ot-cff2-table.cc \ + hb-ot-cff2-table.hh \ hb-ot-cmap-table.hh \ + hb-ot-color-cbdt-table.hh \ + hb-ot-color-colr-table.hh \ + hb-ot-color-cpal-table.hh \ + hb-ot-color-sbix-table.hh \ + hb-ot-color-svg-table.hh \ + hb-ot-color.cc \ + hb-ot-face.cc \ + hb-ot-face.hh \ + hb-ot-font.cc \ + hb-ot-gasp-table.hh \ hb-ot-glyf-table.hh \ hb-ot-hdmx-table.hh \ hb-ot-head-table.hh \ hb-ot-hhea-table.hh \ hb-ot-hmtx-table.hh \ hb-ot-kern-table.hh \ + hb-ot-layout-base-table.hh \ + hb-ot-layout-common.hh \ + hb-ot-layout-gdef-table.hh \ + hb-ot-layout-gpos-table.hh \ + hb-ot-layout-gsub-table.hh \ + hb-ot-layout-gsubgpos.hh \ + hb-ot-layout-jstf-table.hh \ + hb-ot-layout.cc \ + hb-ot-layout.hh \ + hb-ot-map.cc \ + hb-ot-map.hh \ + hb-ot-math-table.hh \ + hb-ot-math.cc \ hb-ot-maxp-table.hh \ + hb-ot-name-language.cc \ + hb-ot-name-language.hh \ hb-ot-name-table.hh \ + hb-ot-name.cc \ hb-ot-os2-table.hh \ hb-ot-os2-unicode-ranges.hh \ hb-ot-post-macroman.hh \ hb-ot-post-table.hh \ + hb-ot-shape-complex-arabic-fallback.hh \ + hb-ot-shape-complex-arabic-table.hh \ + hb-ot-shape-complex-arabic-win1256.hh \ + hb-ot-shape-complex-arabic.cc \ + hb-ot-shape-complex-arabic.hh \ + hb-ot-shape-complex-default.cc \ + hb-ot-shape-complex-hangul.cc \ + hb-ot-shape-complex-hebrew.cc \ + hb-ot-shape-complex-indic-table.cc \ + hb-ot-shape-complex-indic.cc \ + hb-ot-shape-complex-indic.hh \ + hb-ot-shape-complex-khmer.cc \ + hb-ot-shape-complex-khmer.hh \ + hb-ot-shape-complex-myanmar.cc \ + hb-ot-shape-complex-myanmar.hh \ + hb-ot-shape-complex-thai.cc \ + hb-ot-shape-complex-use-table.cc \ + hb-ot-shape-complex-use.cc \ + hb-ot-shape-complex-use.hh \ + hb-ot-shape-complex-vowel-constraints.cc \ + hb-ot-shape-complex-vowel-constraints.hh \ + hb-ot-shape-complex.hh \ + hb-ot-shape-fallback.cc \ + hb-ot-shape-fallback.hh \ + hb-ot-shape-normalize.cc \ + hb-ot-shape-normalize.hh \ + hb-ot-shape.cc \ + hb-ot-shape.hh \ + hb-ot-stat-table.hh \ + hb-ot-tag-table.hh \ hb-ot-tag.cc \ - hb-private.hh \ - hb-set-digest-private.hh \ - hb-set-private.hh \ + hb-ot-var-avar-table.hh \ + hb-ot-var-fvar-table.hh \ + hb-ot-var-hvar-table.hh \ + hb-ot-var-mvar-table.hh \ + hb-ot-var.cc \ + hb-ot-vorg-table.hh \ + hb-set-digest.hh \ hb-set.cc \ - hb-shape.cc \ - hb-shape-plan-private.hh \ + hb-set.hh \ hb-shape-plan.cc \ + hb-shape-plan.hh \ + hb-shape.cc \ + hb-shaper-impl.hh \ hb-shaper-list.hh \ - hb-shaper-impl-private.hh \ - hb-shaper-private.hh \ hb-shaper.cc \ + hb-shaper.hh \ hb-static.cc \ hb-string-array.hh \ - hb-unicode-private.hh \ + hb-unicode-emoji-table.hh \ hb-unicode.cc \ - hb-utf-private.hh \ + hb-unicode.hh \ + hb-utf.hh \ + hb-vector.hh \ hb-warning.cc \ + hb.hh \ $(NULL) HB_BASE_RAGEL_GENERATED_sources = \ hb-buffer-deserialize-json.hh \ hb-buffer-deserialize-text.hh \ + 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_BASE_RAGEL_sources = \ hb-buffer-deserialize-json.rl \ hb-buffer-deserialize-text.rl \ + 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) HB_BASE_headers = \ - hb.h \ + hb-aat-layout.h \ + hb-aat.h \ hb-blob.h \ hb-buffer.h \ hb-common.h \ @@ -1240,107 +1209,27 @@ HB_BASE_headers = \ hb-face.h \ hb-font.h \ hb-map.h \ + hb-ot-color.h \ + hb-ot-deprecated.h \ + hb-ot-font.h \ + hb-ot-layout.h \ + hb-ot-math.h \ + hb-ot-name.h \ + hb-ot-shape.h \ + hb-ot-var.h \ + hb-ot.h \ hb-set.h \ - hb-shape.h \ hb-shape-plan.h \ + hb-shape.h \ hb-unicode.h \ hb-version.h \ + hb.h \ $(NULL) HB_FALLBACK_sources = \ hb-fallback-shape.cc \ $(NULL) -HB_OT_sources = \ - hb-aat-layout.cc \ - hb-aat-layout-common-private.hh \ - hb-aat-layout-ankr-table.hh \ - hb-aat-layout-bsln-table.hh \ - hb-aat-layout-feat-table.hh \ - hb-aat-layout-kerx-table.hh \ - hb-aat-layout-morx-table.hh \ - hb-aat-layout-trak-table.hh \ - hb-aat-layout-private.hh \ - hb-aat-fmtx-table.hh \ - hb-aat-gcid-table.hh \ - hb-aat-ltag-table.hh \ - hb-ot-font.cc \ - hb-ot-layout.cc \ - hb-ot-layout-base-table.hh \ - hb-ot-layout-common-private.hh \ - hb-ot-layout-gdef-table.hh \ - hb-ot-layout-gpos-table.hh \ - hb-ot-layout-gsubgpos-private.hh \ - hb-ot-layout-gsub-table.hh \ - hb-ot-layout-jstf-table.hh \ - hb-ot-layout-private.hh \ - hb-ot-color.cc \ - hb-ot-color-colr-table.hh \ - hb-ot-color-cpal-table.hh \ - hb-ot-color-sbix-table.hh \ - hb-ot-color-svg-table.hh \ - hb-ot-map.cc \ - hb-ot-map-private.hh \ - hb-ot-math.cc \ - hb-ot-math-table.hh \ - hb-ot-shape.cc \ - hb-ot-shape-complex-arabic.cc \ - hb-ot-shape-complex-arabic-fallback.hh \ - hb-ot-shape-complex-arabic-private.hh \ - hb-ot-shape-complex-arabic-table.hh \ - hb-ot-shape-complex-arabic-win1256.hh \ - hb-ot-shape-complex-default.cc \ - hb-ot-shape-complex-hangul.cc \ - hb-ot-shape-complex-hebrew.cc \ - hb-ot-shape-complex-indic.cc \ - hb-ot-shape-complex-indic-private.hh \ - hb-ot-shape-complex-indic-table.cc \ - hb-ot-shape-complex-khmer-private.hh \ - hb-ot-shape-complex-khmer.cc \ - hb-ot-shape-complex-myanmar-private.hh \ - hb-ot-shape-complex-myanmar.cc \ - hb-ot-shape-complex-thai.cc \ - hb-ot-shape-complex-tibetan.cc \ - hb-ot-shape-complex-use.cc \ - hb-ot-shape-complex-use-private.hh \ - hb-ot-shape-complex-use-table.cc \ - hb-ot-shape-complex-private.hh \ - hb-ot-shape-normalize-private.hh \ - hb-ot-shape-normalize.cc \ - hb-ot-shape-fallback-private.hh \ - hb-ot-shape-fallback.cc \ - hb-ot-shape-private.hh \ - hb-ot-var.cc \ - hb-ot-var-avar-table.hh \ - hb-ot-var-fvar-table.hh \ - hb-ot-var-hvar-table.hh \ - hb-ot-var-mvar-table.hh \ - $(NULL) - -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) - -HB_OT_headers = \ - hb-ot.h \ - hb-ot-font.h \ - hb-ot-layout.h \ - hb-ot-math.h \ - hb-ot-shape.h \ - hb-ot-tag.h \ - hb-ot-var.h \ - $(NULL) - # Optional Sources and Headers with external deps HB_FT_sources = hb-ft.cc @@ -1367,18 +1256,30 @@ HB_ICU_headers = hb-icu.h # Sources for libharfbuzz-subset HB_SUBSET_sources = \ + hb-ot-cff1-table.cc \ + hb-ot-cff2-table.cc \ hb-static.cc \ - hb-subset.cc \ + hb-subset-cff-common.cc \ + hb-subset-cff-common.hh \ + hb-subset-cff1.cc \ + hb-subset-cff1.hh \ + hb-subset-cff2.cc \ + hb-subset-cff2.hh \ hb-subset-glyf.cc \ + hb-subset-glyf.hh \ + hb-subset-glyf.hh \ hb-subset-input.cc \ + hb-subset-input.hh \ hb-subset-plan.cc \ + hb-subset-plan.hh \ + hb-subset-plan.hh \ + hb-subset.cc \ + hb-subset.hh \ + hb-subset.hh \ $(NULL) HB_SUBSET_headers = \ hb-subset.h \ - hb-subset-glyf.hh \ - hb-subset-plan.hh \ - hb-subset-private.hh \ $(NULL) HB_GOBJECT_DIST_sources = hb-gobject-structs.cc @@ -1389,24 +1290,23 @@ HB_GOBJECT_NODIST_sources = $(HB_GOBJECT_ENUM_sources) HB_GOBJECT_NODIST_headers = $(HB_GOBJECT_ENUM_headers) HB_GOBJECT_sources = $(HB_GOBJECT_DIST_sources) $(HB_GOBJECT_NODIST_sources) HB_GOBJECT_headers = $(HB_GOBJECT_DIST_headers) $(HB_GOBJECT_NODIST_headers) -HBCFLAGS = $(am__append_4) $(am__append_6) $(am__append_11) \ - $(am__append_15) $(am__append_20) $(am__append_24) \ - $(am__append_28) $(am__append_33) $(am__append_36) +HBCFLAGS = $(am__append_2) $(am__append_4) $(am__append_9) \ + $(am__append_13) $(am__append_18) $(am__append_22) \ + $(am__append_26) $(am__append_31) $(am__append_34) # Put the library together -HBLIBS = $(am__append_7) $(am__append_12) $(am__append_16) \ - $(am__append_34) $(HBNONPCLIBS) $(am__append_37) -HBNONPCLIBS = $(am__append_5) $(am__append_21) $(am__append_25) \ - $(am__append_29) -HBDEPS = $(am__append_8) $(am__append_17) +HBLIBS = $(am__append_5) $(am__append_10) $(am__append_14) \ + $(am__append_32) $(HBNONPCLIBS) $(am__append_35) +HBNONPCLIBS = $(am__append_3) $(am__append_19) $(am__append_23) \ + $(am__append_27) +HBDEPS = $(am__append_6) $(am__append_15) HBSOURCES = $(HB_BASE_sources) $(HB_BASE_RAGEL_GENERATED_sources) \ - $(am__append_1) $(am__append_3) $(am__append_9) \ - $(am__append_13) $(am__append_18) $(am__append_22) \ - $(am__append_26) $(am__append_30) $(am__append_35) \ - $(am__append_38) -HBHEADERS = $(HB_BASE_headers) $(am__append_2) $(am__append_10) \ - $(am__append_14) $(am__append_19) $(am__append_23) \ - $(am__append_27) $(am__append_31) $(am__append_39) + $(am__append_1) $(am__append_7) $(am__append_11) \ + $(am__append_16) $(am__append_20) $(am__append_24) \ + $(am__append_28) $(am__append_33) $(am__append_36) +HBHEADERS = $(HB_BASE_headers) $(am__append_8) $(am__append_12) \ + $(am__append_17) $(am__append_21) $(am__append_25) \ + $(am__append_29) $(am__append_37) @OS_WIN32_TRUE@export_symbols = -export-symbols harfbuzz.def @OS_WIN32_TRUE@harfbuzz_def_dependency = harfbuzz.def @OS_WIN32_TRUE@export_symbols_subset = -export-symbols harfbuzz-subset.def @@ -1428,11 +1328,11 @@ libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols) $(CODE_COVERAGE_LD libharfbuzz_la_LIBADD = $(HBLIBS) EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency) pkginclude_HEADERS = $(HBHEADERS) $(HB_SUBSET_headers) \ - $(am__append_41) $(am__append_44) -nodist_pkginclude_HEADERS = $(am__append_45) + $(am__append_39) $(am__append_42) +nodist_pkginclude_HEADERS = $(am__append_43) pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = harfbuzz.pc harfbuzz-subset.pc $(am__append_42) \ - $(am__append_46) +pkgconfig_DATA = harfbuzz.pc harfbuzz-subset.pc $(am__append_40) \ + $(am__append_44) cmakedir = $(libdir)/cmake/harfbuzz cmake_DATA = harfbuzz-config.cmake libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources) @@ -1440,33 +1340,6 @@ libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS) $(CODE_COVERAGE_CFLAGS) libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset) $(CODE_COVERAGE_LDFLAGS) libharfbuzz_subset_la_LIBADD = libharfbuzz.la EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency) -FUZZING_CPPFLAGS = \ - -DHB_NDEBUG \ - -DHB_MAX_NESTING_LEVEL=3 \ - -DHB_SANITIZE_MAX_EDITS=3 \ - -DHB_SANITIZE_MAX_OPS_FACTOR=3 \ - -DHB_SANITIZE_MAX_OPS_MIN=128 \ - -DHB_BUFFER_MAX_LEN_FACTOR=3 \ - -DHB_BUFFER_MAX_LEN_MIN=8 \ - -DHB_BUFFER_MAX_LEN_DEFAULT=128 \ - -DHB_BUFFER_MAX_OPS_FACTOR=8 \ - -DHB_BUFFER_MAX_OPS_MIN=64 \ - -DHB_BUFFER_MAX_OPS_DEFAULT=1024 \ - $(NULL) - -EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la libharfbuzz-subset-fuzzing.la -libharfbuzz_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_fuzzing_la_LDFLAGS) -libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES) -libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS) -libharfbuzz_fuzzing_la_LDFLAGS = $(AM_LDFLAGS) -libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD) -EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES) -libharfbuzz_subset_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_subset_fuzzing_la_LDFLAGS) -libharfbuzz_subset_fuzzing_la_SOURCES = $(libharfbuzz_subset_la_SOURCES) -libharfbuzz_subset_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS) -libharfbuzz_subset_fuzzing_la_LDFLAGS = $(AM_LDFLAGS) -libharfbuzz_subset_fuzzing_la_LIBADD = $(libharfbuzz_subset_la_LIBADD) -EXTRA_libharfbuzz_subset_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_subset_la_DEPENDENCIES) @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources) @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS) $(CODE_COVERAGE_CFLAGS) @HAVE_ICU_BUILTIN_FALSE@@HAVE_ICU_TRUE@libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu) $(CODE_COVERAGE_LDFLAGS) @@ -1480,17 +1353,20 @@ EXTRA_libharfbuzz_subset_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_subset_la @HAVE_GOBJECT_TRUE@libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la @HAVE_GOBJECT_TRUE@EXTRA_libharfbuzz_gobject_la_DEPENDENCIES = $(harfbuzz_gobject_def_dependency) DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def \ - $(am__append_49) + harfbuzz-deprecated-symbols.txt $(am__append_47) GENERATORS = \ gen-arabic-table.py \ + gen-def.py \ + gen-emoji-table.py \ gen-indic-table.py \ + gen-os2-unicode-ranges.py \ + gen-tag-table.py \ gen-use-table.py \ - gen-def.py \ + gen-vowel-constraints.py \ $(NULL) RAGEL_GENERATED = \ $(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \ - $(patsubst %,$(srcdir)/%,$(HB_OT_RAGEL_GENERATED_sources)) \ $(NULL) main_SOURCES = main.cc @@ -1499,21 +1375,24 @@ main_LDADD = libharfbuzz.la $(HBLIBS) test_SOURCES = test.cc test_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) test_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) -test_would_substitute_SOURCES = test-would-substitute.cc -test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) -test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) -test_size_params_SOURCES = test-size-params.cc -test_size_params_CPPFLAGS = $(HBCFLAGS) -test_size_params_LDADD = libharfbuzz.la $(HBLIBS) test_buffer_serialize_SOURCES = test-buffer-serialize.cc test_buffer_serialize_CPPFLAGS = $(HBCFLAGS) test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS) +test_name_table_SOURCES = test-name-table.cc +test_name_table_CPPFLAGS = $(HBCFLAGS) +test_name_table_LDADD = libharfbuzz.la $(HBLIBS) +test_size_params_SOURCES = test-size-params.cc +test_size_params_CPPFLAGS = $(HBCFLAGS) +test_size_params_LDADD = libharfbuzz.la $(HBLIBS) +test_would_substitute_SOURCES = test-would-substitute.cc +test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) +test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_SOURCES = test-ot-color.cc +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS) +@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@test_ot_color_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS) dist_check_SCRIPTS = check-c-linkage-decls.sh check-externs.sh \ check-header-guards.sh check-includes.sh check-static-inits.sh \ - check-symbols.sh $(NULL) $(am__append_50) -dump_fon_SOURCES = dump-fon.cc -dump_fon_CPPFLAGS = $(HBCFLAGS) -dump_fon_LDADD = libharfbuzz.la $(HBLIBS) + check-symbols.sh $(NULL) $(am__append_49) dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc dump_indic_data_CPPFLAGS = $(HBCFLAGS) dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS) @@ -1526,14 +1405,18 @@ dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS) dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc dump_use_data_CPPFLAGS = $(HBCFLAGS) dump_use_data_LDADD = libharfbuzz.la $(HBLIBS) -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@dump_emoji_SOURCES = dump-emoji.cc -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@dump_emoji_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS) -@HAVE_CAIRO_FT_TRUE@@HAVE_FREETYPE_TRUE@dump_emoji_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS) +COMPILED_TESTS = test-iter test-ot-tag test-unicode-ranges +COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG +COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS) +test_iter_SOURCES = test-iter.cc hb-static.cc +test_iter_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_iter_LDADD = $(COMPILED_TESTS_LDADD) test_ot_tag_SOURCES = hb-ot-tag.cc -test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN -test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS) +test_ot_tag_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_ot_tag_LDADD = $(COMPILED_TESTS_LDADD) test_unicode_ranges_SOURCES = test-unicode-ranges.cc -test_unicode_ranges_LDADD = libharfbuzz.la $(HBLIBS) +test_unicode_ranges_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_unicode_ranges_LDADD = $(COMPILED_TESTS_LDADD) TESTS_ENVIRONMENT = \ srcdir="$(srcdir)" \ MAKE="$(MAKE) $(AM_MAKEFLAGS)" \ @@ -1553,6 +1436,8 @@ TESTS_ENVIRONMENT = \ @HAVE_INTROSPECTION_TRUE@ -DHB_H_IN \ @HAVE_INTROSPECTION_TRUE@ -DHB_OT_H \ @HAVE_INTROSPECTION_TRUE@ -DHB_OT_H_IN \ +@HAVE_INTROSPECTION_TRUE@ -DHB_AAT_H \ +@HAVE_INTROSPECTION_TRUE@ -DHB_AAT_H_IN \ @HAVE_INTROSPECTION_TRUE@ -DHB_GOBJECT_H \ @HAVE_INTROSPECTION_TRUE@ -DHB_GOBJECT_H_IN \ @HAVE_INTROSPECTION_TRUE@ -DHB_EXTERN= \ @@ -1647,18 +1532,12 @@ clean-libLTLIBRARIES: rm -f $${locs}; \ } -libharfbuzz-fuzzing.la: $(libharfbuzz_fuzzing_la_OBJECTS) $(libharfbuzz_fuzzing_la_DEPENDENCIES) $(EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES) - $(AM_V_GEN)$(libharfbuzz_fuzzing_la_LINK) $(libharfbuzz_fuzzing_la_OBJECTS) $(libharfbuzz_fuzzing_la_LIBADD) $(LIBS) - libharfbuzz-gobject.la: $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_DEPENDENCIES) $(EXTRA_libharfbuzz_gobject_la_DEPENDENCIES) $(AM_V_GEN)$(libharfbuzz_gobject_la_LINK) $(am_libharfbuzz_gobject_la_rpath) $(libharfbuzz_gobject_la_OBJECTS) $(libharfbuzz_gobject_la_LIBADD) $(LIBS) libharfbuzz-icu.la: $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_DEPENDENCIES) $(EXTRA_libharfbuzz_icu_la_DEPENDENCIES) $(AM_V_CXXLD)$(libharfbuzz_icu_la_LINK) $(am_libharfbuzz_icu_la_rpath) $(libharfbuzz_icu_la_OBJECTS) $(libharfbuzz_icu_la_LIBADD) $(LIBS) -libharfbuzz-subset-fuzzing.la: $(libharfbuzz_subset_fuzzing_la_OBJECTS) $(libharfbuzz_subset_fuzzing_la_DEPENDENCIES) $(EXTRA_libharfbuzz_subset_fuzzing_la_DEPENDENCIES) - $(AM_V_GEN)$(libharfbuzz_subset_fuzzing_la_LINK) $(libharfbuzz_subset_fuzzing_la_OBJECTS) $(libharfbuzz_subset_fuzzing_la_LIBADD) $(LIBS) - libharfbuzz-subset.la: $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_DEPENDENCIES) $(EXTRA_libharfbuzz_subset_la_DEPENDENCIES) $(AM_V_CXXLD)$(libharfbuzz_subset_la_LINK) -rpath $(libdir) $(libharfbuzz_subset_la_OBJECTS) $(libharfbuzz_subset_la_LIBADD) $(LIBS) @@ -1748,14 +1627,6 @@ clean-noinstPROGRAMS: echo " rm -f" $$list; \ rm -f $$list -dump-emoji$(EXEEXT): $(dump_emoji_OBJECTS) $(dump_emoji_DEPENDENCIES) $(EXTRA_dump_emoji_DEPENDENCIES) - @rm -f dump-emoji$(EXEEXT) - $(AM_V_CXXLD)$(CXXLINK) $(dump_emoji_OBJECTS) $(dump_emoji_LDADD) $(LIBS) - -dump-fon$(EXEEXT): $(dump_fon_OBJECTS) $(dump_fon_DEPENDENCIES) $(EXTRA_dump_fon_DEPENDENCIES) - @rm -f dump-fon$(EXEEXT) - $(AM_V_CXXLD)$(CXXLINK) $(dump_fon_OBJECTS) $(dump_fon_LDADD) $(LIBS) - dump-indic-data$(EXEEXT): $(dump_indic_data_OBJECTS) $(dump_indic_data_DEPENDENCIES) $(EXTRA_dump_indic_data_DEPENDENCIES) @rm -f dump-indic-data$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dump_indic_data_OBJECTS) $(dump_indic_data_LDADD) $(LIBS) @@ -1784,6 +1655,18 @@ test-buffer-serialize$(EXEEXT): $(test_buffer_serialize_OBJECTS) $(test_buffer_s @rm -f test-buffer-serialize$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(test_buffer_serialize_OBJECTS) $(test_buffer_serialize_LDADD) $(LIBS) +test-iter$(EXEEXT): $(test_iter_OBJECTS) $(test_iter_DEPENDENCIES) $(EXTRA_test_iter_DEPENDENCIES) + @rm -f test-iter$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(test_iter_OBJECTS) $(test_iter_LDADD) $(LIBS) + +test-name-table$(EXEEXT): $(test_name_table_OBJECTS) $(test_name_table_DEPENDENCIES) $(EXTRA_test_name_table_DEPENDENCIES) + @rm -f test-name-table$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(test_name_table_OBJECTS) $(test_name_table_LDADD) $(LIBS) + +test-ot-color$(EXEEXT): $(test_ot_color_OBJECTS) $(test_ot_color_DEPENDENCIES) $(EXTRA_test_ot_color_DEPENDENCIES) + @rm -f test-ot-color$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(test_ot_color_OBJECTS) $(test_ot_color_LDADD) $(LIBS) + test-ot-tag$(EXEEXT): $(test_ot_tag_OBJECTS) $(test_ot_tag_DEPENDENCIES) $(EXTRA_test_ot_tag_DEPENDENCIES) @rm -f test-ot-tag$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(test_ot_tag_OBJECTS) $(test_ot_tag_LDADD) $(LIBS) @@ -1806,8 +1689,6 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_emoji-dump-emoji.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_fon-dump-fon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-dump-indic-data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_indic_data-hb-ot-shape-complex-indic-table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_khmer_data-dump-khmer-data.Po@am__quote@ @@ -1816,56 +1697,11 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_myanmar_data-hb-ot-shape-complex-indic-table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-dump-use-data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump_use_data-hb-ot-shape-complex-use-table.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-blob.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer-serialize.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-coretext.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-directwrite.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-face.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-fallback-shape.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-font.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ft.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-glib.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-graphite2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-icu.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-map.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-layout.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-math.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-fallback.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-normalize.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-tag.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-var.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-set.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape-plan.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-shaper.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-static.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-ucdn.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-unicode.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-uniscribe.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_fuzzing_la-hb-warning.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-blob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer-serialize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-buffer.Plo@am__quote@ @@ -1880,11 +1716,16 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-graphite2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-icu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-map.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-color.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-face.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-font.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-layout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-math.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-name.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-arabic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-default.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-hangul.Plo@am__quote@ @@ -1894,9 +1735,9 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-myanmar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-thai.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-tibetan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape-normalize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-ot-shape.Plo@am__quote@ @@ -1911,22 +1752,26 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-unicode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-uniscribe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_la-hb-warning.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-static.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-glyf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-input.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-plan.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-static.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-input.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset-plan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libharfbuzz_subset_la-hb-subset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-unicode-ranges.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_buffer_serialize-test-buffer-serialize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_iter-hb-static.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_iter-test-iter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_name_table-test-name-table.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_color-test-ot-color.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ot_tag-hb-ot-tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_size_params-test-size-params.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_would_substitute-test-would-substitute.Po@am__quote@ .cc.o: @@ -1950,383 +1795,40 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< -libharfbuzz_fuzzing_la-hb-blob.lo: hb-blob.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-blob.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-blob.Tpo -c -o libharfbuzz_fuzzing_la-hb-blob.lo `test -f 'hb-blob.cc' || echo '$(srcdir)/'`hb-blob.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-blob.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-blob.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-blob.cc' object='libharfbuzz_fuzzing_la-hb-blob.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-blob.lo `test -f 'hb-blob.cc' || echo '$(srcdir)/'`hb-blob.cc - -libharfbuzz_fuzzing_la-hb-buffer-serialize.lo: hb-buffer-serialize.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-buffer-serialize.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer-serialize.Tpo -c -o libharfbuzz_fuzzing_la-hb-buffer-serialize.lo `test -f 'hb-buffer-serialize.cc' || echo '$(srcdir)/'`hb-buffer-serialize.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer-serialize.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer-serialize.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-buffer-serialize.cc' object='libharfbuzz_fuzzing_la-hb-buffer-serialize.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_gobject_la-hb-gobject-structs.lo: hb-gobject-structs.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_gobject_la-hb-gobject-structs.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Tpo -c -o libharfbuzz_gobject_la-hb-gobject-structs.lo `test -f 'hb-gobject-structs.cc' || echo '$(srcdir)/'`hb-gobject-structs.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Tpo $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-gobject-structs.cc' object='libharfbuzz_gobject_la-hb-gobject-structs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-buffer-serialize.lo `test -f 'hb-buffer-serialize.cc' || echo '$(srcdir)/'`hb-buffer-serialize.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_gobject_la-hb-gobject-structs.lo `test -f 'hb-gobject-structs.cc' || echo '$(srcdir)/'`hb-gobject-structs.cc -libharfbuzz_fuzzing_la-hb-buffer.lo: hb-buffer.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-buffer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer.Tpo -c -o libharfbuzz_fuzzing_la-hb-buffer.lo `test -f 'hb-buffer.cc' || echo '$(srcdir)/'`hb-buffer.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-buffer.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-buffer.cc' object='libharfbuzz_fuzzing_la-hb-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_gobject_la-hb-gobject-enums.lo: hb-gobject-enums.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_gobject_la-hb-gobject-enums.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Tpo -c -o libharfbuzz_gobject_la-hb-gobject-enums.lo `test -f 'hb-gobject-enums.cc' || echo '$(srcdir)/'`hb-gobject-enums.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Tpo $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-gobject-enums.cc' object='libharfbuzz_gobject_la-hb-gobject-enums.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-buffer.lo `test -f 'hb-buffer.cc' || echo '$(srcdir)/'`hb-buffer.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_gobject_la-hb-gobject-enums.lo `test -f 'hb-gobject-enums.cc' || echo '$(srcdir)/'`hb-gobject-enums.cc -libharfbuzz_fuzzing_la-hb-common.lo: hb-common.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-common.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-common.Tpo -c -o libharfbuzz_fuzzing_la-hb-common.lo `test -f 'hb-common.cc' || echo '$(srcdir)/'`hb-common.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-common.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-common.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-common.cc' object='libharfbuzz_fuzzing_la-hb-common.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_icu_la-hb-icu.lo: hb-icu.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_icu_la-hb-icu.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Tpo -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Tpo $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-icu.cc' object='libharfbuzz_icu_la-hb-icu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-common.lo `test -f 'hb-common.cc' || echo '$(srcdir)/'`hb-common.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc -libharfbuzz_fuzzing_la-hb-face.lo: hb-face.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-face.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-face.Tpo -c -o libharfbuzz_fuzzing_la-hb-face.lo `test -f 'hb-face.cc' || echo '$(srcdir)/'`hb-face.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-face.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-face.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-face.cc' object='libharfbuzz_fuzzing_la-hb-face.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_subset_la-hb-ot-cff1-table.lo: hb-ot-cff1-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-ot-cff1-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Tpo -c -o libharfbuzz_subset_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff1-table.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-cff1-table.cc' object='libharfbuzz_subset_la-hb-ot-cff1-table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-face.lo `test -f 'hb-face.cc' || echo '$(srcdir)/'`hb-face.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc -libharfbuzz_fuzzing_la-hb-font.lo: hb-font.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-font.Tpo -c -o libharfbuzz_fuzzing_la-hb-font.lo `test -f 'hb-font.cc' || echo '$(srcdir)/'`hb-font.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-font.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-font.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-font.cc' object='libharfbuzz_fuzzing_la-hb-font.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_subset_la-hb-ot-cff2-table.lo: hb-ot-cff2-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-ot-cff2-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Tpo -c -o libharfbuzz_subset_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-ot-cff2-table.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-cff2-table.cc' object='libharfbuzz_subset_la-hb-ot-cff2-table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-font.lo `test -f 'hb-font.cc' || echo '$(srcdir)/'`hb-font.cc - -libharfbuzz_fuzzing_la-hb-map.lo: hb-map.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-map.Tpo -c -o libharfbuzz_fuzzing_la-hb-map.lo `test -f 'hb-map.cc' || echo '$(srcdir)/'`hb-map.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-map.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-map.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-map.cc' object='libharfbuzz_fuzzing_la-hb-map.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-map.lo `test -f 'hb-map.cc' || echo '$(srcdir)/'`hb-map.cc - -libharfbuzz_fuzzing_la-hb-ot-tag.lo: hb-ot-tag.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-tag.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-tag.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-tag.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-tag.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-tag.cc' object='libharfbuzz_fuzzing_la-hb-ot-tag.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc - -libharfbuzz_fuzzing_la-hb-set.lo: hb-set.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-set.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-set.Tpo -c -o libharfbuzz_fuzzing_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-set.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-set.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-set.cc' object='libharfbuzz_fuzzing_la-hb-set.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc - -libharfbuzz_fuzzing_la-hb-shape.lo: hb-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape.Tpo -c -o libharfbuzz_fuzzing_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shape.cc' object='libharfbuzz_fuzzing_la-hb-shape.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc - -libharfbuzz_fuzzing_la-hb-shape-plan.lo: hb-shape-plan.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-shape-plan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape-plan.Tpo -c -o libharfbuzz_fuzzing_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape-plan.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shape-plan.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shape-plan.cc' object='libharfbuzz_fuzzing_la-hb-shape-plan.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc - -libharfbuzz_fuzzing_la-hb-shaper.lo: hb-shaper.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-shaper.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shaper.Tpo -c -o libharfbuzz_fuzzing_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shaper.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-shaper.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shaper.cc' object='libharfbuzz_fuzzing_la-hb-shaper.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc - -libharfbuzz_fuzzing_la-hb-static.lo: hb-static.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-static.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-static.Tpo -c -o libharfbuzz_fuzzing_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-static.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-static.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-static.cc' object='libharfbuzz_fuzzing_la-hb-static.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc - -libharfbuzz_fuzzing_la-hb-unicode.lo: hb-unicode.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-unicode.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-unicode.Tpo -c -o libharfbuzz_fuzzing_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-unicode.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-unicode.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-unicode.cc' object='libharfbuzz_fuzzing_la-hb-unicode.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc - -libharfbuzz_fuzzing_la-hb-warning.lo: hb-warning.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-warning.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-warning.Tpo -c -o libharfbuzz_fuzzing_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-warning.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-warning.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-warning.cc' object='libharfbuzz_fuzzing_la-hb-warning.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc - -libharfbuzz_fuzzing_la-hb-aat-layout.lo: hb-aat-layout.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-aat-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Tpo -c -o libharfbuzz_fuzzing_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-aat-layout.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-aat-layout.cc' object='libharfbuzz_fuzzing_la-hb-aat-layout.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc - -libharfbuzz_fuzzing_la-hb-ot-font.lo: hb-ot-font.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-font.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-font.cc' object='libharfbuzz_fuzzing_la-hb-ot-font.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc - -libharfbuzz_fuzzing_la-hb-ot-layout.lo: hb-ot-layout.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-layout.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-layout.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-layout.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-layout.cc' object='libharfbuzz_fuzzing_la-hb-ot-layout.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc - -libharfbuzz_fuzzing_la-hb-ot-color.lo: hb-ot-color.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-color.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-color.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-color.cc' object='libharfbuzz_fuzzing_la-hb-ot-color.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc - -libharfbuzz_fuzzing_la-hb-ot-map.lo: hb-ot-map.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-map.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-map.cc' object='libharfbuzz_fuzzing_la-hb-ot-map.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc - -libharfbuzz_fuzzing_la-hb-ot-math.lo: hb-ot-math.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-math.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-math.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-math.lo `test -f 'hb-ot-math.cc' || echo '$(srcdir)/'`hb-ot-math.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-math.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-math.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-math.cc' object='libharfbuzz_fuzzing_la-hb-ot-math.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-math.lo `test -f 'hb-ot-math.cc' || echo '$(srcdir)/'`hb-ot-math.cc - -libharfbuzz_fuzzing_la-hb-ot-shape.lo: hb-ot-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.lo: hb-ot-shape-complex-arabic.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.lo `test -f 'hb-ot-shape-complex-arabic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-arabic.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-arabic.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-arabic.lo `test -f 'hb-ot-shape-complex-arabic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-arabic.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.lo: hb-ot-shape-complex-default.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.lo `test -f 'hb-ot-shape-complex-default.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-default.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-default.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-default.lo `test -f 'hb-ot-shape-complex-default.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-default.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.lo: hb-ot-shape-complex-hangul.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.lo `test -f 'hb-ot-shape-complex-hangul.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hangul.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-hangul.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-hangul.lo `test -f 'hb-ot-shape-complex-hangul.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hangul.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo: hb-ot-shape-complex-hebrew.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo `test -f 'hb-ot-shape-complex-hebrew.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hebrew.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-hebrew.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-hebrew.lo `test -f 'hb-ot-shape-complex-hebrew.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hebrew.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo: hb-ot-shape-complex-indic.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-indic.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo: hb-ot-shape-complex-indic-table.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-indic-table.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo: hb-ot-shape-complex-khmer.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-khmer.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo: hb-ot-shape-complex-myanmar.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-myanmar.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-myanmar.lo `test -f 'hb-ot-shape-complex-myanmar.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-myanmar.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo: hb-ot-shape-complex-thai.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo `test -f 'hb-ot-shape-complex-thai.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-thai.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-thai.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-thai.lo `test -f 'hb-ot-shape-complex-thai.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-thai.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo: hb-ot-shape-complex-tibetan.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo `test -f 'hb-ot-shape-complex-tibetan.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-tibetan.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-tibetan.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-tibetan.lo `test -f 'hb-ot-shape-complex-tibetan.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-tibetan.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.lo: hb-ot-shape-complex-use.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.lo `test -f 'hb-ot-shape-complex-use.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-use.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-use.lo `test -f 'hb-ot-shape-complex-use.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.lo: hb-ot-shape-complex-use-table.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-normalize.lo: hb-ot-shape-normalize.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-normalize.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-normalize.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-normalize.lo `test -f 'hb-ot-shape-normalize.cc' || echo '$(srcdir)/'`hb-ot-shape-normalize.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-normalize.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-normalize.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-normalize.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-normalize.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-normalize.lo `test -f 'hb-ot-shape-normalize.cc' || echo '$(srcdir)/'`hb-ot-shape-normalize.cc - -libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo: hb-ot-shape-fallback.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-fallback.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-fallback.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-shape-fallback.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-fallback.cc' object='libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc - -libharfbuzz_fuzzing_la-hb-ot-var.lo: hb-ot-var.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ot-var.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-var.Tpo -c -o libharfbuzz_fuzzing_la-hb-ot-var.lo `test -f 'hb-ot-var.cc' || echo '$(srcdir)/'`hb-ot-var.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-var.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ot-var.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-var.cc' object='libharfbuzz_fuzzing_la-hb-ot-var.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ot-var.lo `test -f 'hb-ot-var.cc' || echo '$(srcdir)/'`hb-ot-var.cc - -libharfbuzz_fuzzing_la-hb-fallback-shape.lo: hb-fallback-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-fallback-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-fallback-shape.Tpo -c -o libharfbuzz_fuzzing_la-hb-fallback-shape.lo `test -f 'hb-fallback-shape.cc' || echo '$(srcdir)/'`hb-fallback-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-fallback-shape.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-fallback-shape.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-fallback-shape.cc' object='libharfbuzz_fuzzing_la-hb-fallback-shape.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-fallback-shape.lo `test -f 'hb-fallback-shape.cc' || echo '$(srcdir)/'`hb-fallback-shape.cc - -libharfbuzz_fuzzing_la-hb-glib.lo: hb-glib.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-glib.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-glib.Tpo -c -o libharfbuzz_fuzzing_la-hb-glib.lo `test -f 'hb-glib.cc' || echo '$(srcdir)/'`hb-glib.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-glib.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-glib.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-glib.cc' object='libharfbuzz_fuzzing_la-hb-glib.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-glib.lo `test -f 'hb-glib.cc' || echo '$(srcdir)/'`hb-glib.cc - -libharfbuzz_fuzzing_la-hb-ft.lo: hb-ft.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ft.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ft.Tpo -c -o libharfbuzz_fuzzing_la-hb-ft.lo `test -f 'hb-ft.cc' || echo '$(srcdir)/'`hb-ft.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ft.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ft.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ft.cc' object='libharfbuzz_fuzzing_la-hb-ft.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ft.lo `test -f 'hb-ft.cc' || echo '$(srcdir)/'`hb-ft.cc - -libharfbuzz_fuzzing_la-hb-graphite2.lo: hb-graphite2.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-graphite2.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-graphite2.Tpo -c -o libharfbuzz_fuzzing_la-hb-graphite2.lo `test -f 'hb-graphite2.cc' || echo '$(srcdir)/'`hb-graphite2.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-graphite2.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-graphite2.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-graphite2.cc' object='libharfbuzz_fuzzing_la-hb-graphite2.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-graphite2.lo `test -f 'hb-graphite2.cc' || echo '$(srcdir)/'`hb-graphite2.cc - -libharfbuzz_fuzzing_la-hb-uniscribe.lo: hb-uniscribe.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-uniscribe.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-uniscribe.Tpo -c -o libharfbuzz_fuzzing_la-hb-uniscribe.lo `test -f 'hb-uniscribe.cc' || echo '$(srcdir)/'`hb-uniscribe.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-uniscribe.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-uniscribe.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-uniscribe.cc' object='libharfbuzz_fuzzing_la-hb-uniscribe.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-uniscribe.lo `test -f 'hb-uniscribe.cc' || echo '$(srcdir)/'`hb-uniscribe.cc - -libharfbuzz_fuzzing_la-hb-directwrite.lo: hb-directwrite.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-directwrite.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-directwrite.Tpo -c -o libharfbuzz_fuzzing_la-hb-directwrite.lo `test -f 'hb-directwrite.cc' || echo '$(srcdir)/'`hb-directwrite.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-directwrite.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-directwrite.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-directwrite.cc' object='libharfbuzz_fuzzing_la-hb-directwrite.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-directwrite.lo `test -f 'hb-directwrite.cc' || echo '$(srcdir)/'`hb-directwrite.cc - -libharfbuzz_fuzzing_la-hb-coretext.lo: hb-coretext.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-coretext.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-coretext.Tpo -c -o libharfbuzz_fuzzing_la-hb-coretext.lo `test -f 'hb-coretext.cc' || echo '$(srcdir)/'`hb-coretext.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-coretext.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-coretext.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-coretext.cc' object='libharfbuzz_fuzzing_la-hb-coretext.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-coretext.lo `test -f 'hb-coretext.cc' || echo '$(srcdir)/'`hb-coretext.cc - -libharfbuzz_fuzzing_la-hb-ucdn.lo: hb-ucdn.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-ucdn.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ucdn.Tpo -c -o libharfbuzz_fuzzing_la-hb-ucdn.lo `test -f 'hb-ucdn.cc' || echo '$(srcdir)/'`hb-ucdn.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ucdn.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-ucdn.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ucdn.cc' object='libharfbuzz_fuzzing_la-hb-ucdn.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-ucdn.lo `test -f 'hb-ucdn.cc' || echo '$(srcdir)/'`hb-ucdn.cc - -libharfbuzz_fuzzing_la-hb-icu.lo: hb-icu.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_fuzzing_la-hb-icu.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_fuzzing_la-hb-icu.Tpo -c -o libharfbuzz_fuzzing_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_fuzzing_la-hb-icu.Tpo $(DEPDIR)/libharfbuzz_fuzzing_la-hb-icu.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-icu.cc' object='libharfbuzz_fuzzing_la-hb-icu.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_fuzzing_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc - -libharfbuzz_gobject_la-hb-gobject-structs.lo: hb-gobject-structs.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_gobject_la-hb-gobject-structs.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Tpo -c -o libharfbuzz_gobject_la-hb-gobject-structs.lo `test -f 'hb-gobject-structs.cc' || echo '$(srcdir)/'`hb-gobject-structs.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Tpo $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-structs.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-gobject-structs.cc' object='libharfbuzz_gobject_la-hb-gobject-structs.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_gobject_la-hb-gobject-structs.lo `test -f 'hb-gobject-structs.cc' || echo '$(srcdir)/'`hb-gobject-structs.cc - -libharfbuzz_gobject_la-hb-gobject-enums.lo: hb-gobject-enums.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_gobject_la-hb-gobject-enums.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Tpo -c -o libharfbuzz_gobject_la-hb-gobject-enums.lo `test -f 'hb-gobject-enums.cc' || echo '$(srcdir)/'`hb-gobject-enums.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Tpo $(DEPDIR)/libharfbuzz_gobject_la-hb-gobject-enums.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-gobject-enums.cc' object='libharfbuzz_gobject_la-hb-gobject-enums.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_gobject_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_gobject_la-hb-gobject-enums.lo `test -f 'hb-gobject-enums.cc' || echo '$(srcdir)/'`hb-gobject-enums.cc - -libharfbuzz_icu_la-hb-icu.lo: hb-icu.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_icu_la-hb-icu.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Tpo -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Tpo $(DEPDIR)/libharfbuzz_icu_la-hb-icu.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-icu.cc' object='libharfbuzz_icu_la-hb-icu.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_icu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_icu_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc - -libharfbuzz_subset_fuzzing_la-hb-static.lo: hb-static.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_fuzzing_la-hb-static.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-static.Tpo -c -o libharfbuzz_subset_fuzzing_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-static.Tpo $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-static.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-static.cc' object='libharfbuzz_subset_fuzzing_la-hb-static.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_fuzzing_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc - -libharfbuzz_subset_fuzzing_la-hb-subset.lo: hb-subset.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_fuzzing_la-hb-subset.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset.Tpo -c -o libharfbuzz_subset_fuzzing_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset.Tpo $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset.cc' object='libharfbuzz_subset_fuzzing_la-hb-subset.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_fuzzing_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc - -libharfbuzz_subset_fuzzing_la-hb-subset-glyf.lo: hb-subset-glyf.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_fuzzing_la-hb-subset-glyf.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-glyf.Tpo -c -o libharfbuzz_subset_fuzzing_la-hb-subset-glyf.lo `test -f 'hb-subset-glyf.cc' || echo '$(srcdir)/'`hb-subset-glyf.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-glyf.Tpo $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-glyf.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-glyf.cc' object='libharfbuzz_subset_fuzzing_la-hb-subset-glyf.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_fuzzing_la-hb-subset-glyf.lo `test -f 'hb-subset-glyf.cc' || echo '$(srcdir)/'`hb-subset-glyf.cc - -libharfbuzz_subset_fuzzing_la-hb-subset-input.lo: hb-subset-input.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_fuzzing_la-hb-subset-input.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-input.Tpo -c -o libharfbuzz_subset_fuzzing_la-hb-subset-input.lo `test -f 'hb-subset-input.cc' || echo '$(srcdir)/'`hb-subset-input.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-input.Tpo $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-input.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-input.cc' object='libharfbuzz_subset_fuzzing_la-hb-subset-input.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_fuzzing_la-hb-subset-input.lo `test -f 'hb-subset-input.cc' || echo '$(srcdir)/'`hb-subset-input.cc - -libharfbuzz_subset_fuzzing_la-hb-subset-plan.lo: hb-subset-plan.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_fuzzing_la-hb-subset-plan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-plan.Tpo -c -o libharfbuzz_subset_fuzzing_la-hb-subset-plan.lo `test -f 'hb-subset-plan.cc' || echo '$(srcdir)/'`hb-subset-plan.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-plan.Tpo $(DEPDIR)/libharfbuzz_subset_fuzzing_la-hb-subset-plan.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-plan.cc' object='libharfbuzz_subset_fuzzing_la-hb-subset-plan.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_fuzzing_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_fuzzing_la-hb-subset-plan.lo `test -f 'hb-subset-plan.cc' || echo '$(srcdir)/'`hb-subset-plan.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc libharfbuzz_subset_la-hb-static.lo: hb-static.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-static.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-static.Tpo -c -o libharfbuzz_subset_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc @@ -2335,12 +1837,26 @@ libharfbuzz_subset_la-hb-static.lo: hb-static.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc -libharfbuzz_subset_la-hb-subset.lo: hb-subset.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset.cc' object='libharfbuzz_subset_la-hb-subset.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_subset_la-hb-subset-cff-common.lo: hb-subset-cff-common.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-cff-common.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Tpo -c -o libharfbuzz_subset_la-hb-subset-cff-common.lo `test -f 'hb-subset-cff-common.cc' || echo '$(srcdir)/'`hb-subset-cff-common.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff-common.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-cff-common.cc' object='libharfbuzz_subset_la-hb-subset-cff-common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-cff-common.lo `test -f 'hb-subset-cff-common.cc' || echo '$(srcdir)/'`hb-subset-cff-common.cc + +libharfbuzz_subset_la-hb-subset-cff1.lo: hb-subset-cff1.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-cff1.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Tpo -c -o libharfbuzz_subset_la-hb-subset-cff1.lo `test -f 'hb-subset-cff1.cc' || echo '$(srcdir)/'`hb-subset-cff1.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff1.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-cff1.cc' object='libharfbuzz_subset_la-hb-subset-cff1.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-cff1.lo `test -f 'hb-subset-cff1.cc' || echo '$(srcdir)/'`hb-subset-cff1.cc + +libharfbuzz_subset_la-hb-subset-cff2.lo: hb-subset-cff2.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-cff2.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Tpo -c -o libharfbuzz_subset_la-hb-subset-cff2.lo `test -f 'hb-subset-cff2.cc' || echo '$(srcdir)/'`hb-subset-cff2.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset-cff2.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset-cff2.cc' object='libharfbuzz_subset_la-hb-subset-cff2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-cff2.lo `test -f 'hb-subset-cff2.cc' || echo '$(srcdir)/'`hb-subset-cff2.cc libharfbuzz_subset_la-hb-subset-glyf.lo: hb-subset-glyf.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset-glyf.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset-glyf.Tpo -c -o libharfbuzz_subset_la-hb-subset-glyf.lo `test -f 'hb-subset-glyf.cc' || echo '$(srcdir)/'`hb-subset-glyf.cc @@ -2363,6 +1879,27 @@ libharfbuzz_subset_la-hb-subset-plan.lo: hb-subset-plan.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset-plan.lo `test -f 'hb-subset-plan.cc' || echo '$(srcdir)/'`hb-subset-plan.cc +libharfbuzz_subset_la-hb-subset.lo: hb-subset.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_subset_la-hb-subset.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Tpo $(DEPDIR)/libharfbuzz_subset_la-hb-subset.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-subset.cc' object='libharfbuzz_subset_la-hb-subset.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_subset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_subset_la-hb-subset.lo `test -f 'hb-subset.cc' || echo '$(srcdir)/'`hb-subset.cc + +libharfbuzz_la-hb-aat-layout.lo: hb-aat-layout.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-aat-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo -c -o libharfbuzz_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-aat-layout.cc' object='libharfbuzz_la-hb-aat-layout.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc + +libharfbuzz_la-hb-aat-map.lo: hb-aat-map.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-aat-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-aat-map.Tpo -c -o libharfbuzz_la-hb-aat-map.lo `test -f 'hb-aat-map.cc' || echo '$(srcdir)/'`hb-aat-map.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-aat-map.Tpo $(DEPDIR)/libharfbuzz_la-hb-aat-map.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-aat-map.cc' object='libharfbuzz_la-hb-aat-map.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-aat-map.lo `test -f 'hb-aat-map.cc' || echo '$(srcdir)/'`hb-aat-map.cc + libharfbuzz_la-hb-blob.lo: hb-blob.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-blob.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo -c -o libharfbuzz_la-hb-blob.lo `test -f 'hb-blob.cc' || echo '$(srcdir)/'`hb-blob.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-blob.Tpo $(DEPDIR)/libharfbuzz_la-hb-blob.Plo @@ -2412,68 +1949,33 @@ libharfbuzz_la-hb-map.lo: hb-map.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-map.lo `test -f 'hb-map.cc' || echo '$(srcdir)/'`hb-map.cc -libharfbuzz_la-hb-ot-tag.lo: hb-ot-tag.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-tag.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Tpo -c -o libharfbuzz_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-tag.cc' object='libharfbuzz_la-hb-ot-tag.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc - -libharfbuzz_la-hb-set.lo: hb-set.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-set.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-set.Tpo -c -o libharfbuzz_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-set.Tpo $(DEPDIR)/libharfbuzz_la-hb-set.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-set.cc' object='libharfbuzz_la-hb-set.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc - -libharfbuzz_la-hb-shape.lo: hb-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shape.Tpo -c -o libharfbuzz_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-shape.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shape.cc' object='libharfbuzz_la-hb-shape.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc - -libharfbuzz_la-hb-shape-plan.lo: hb-shape-plan.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shape-plan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Tpo -c -o libharfbuzz_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Tpo $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shape-plan.cc' object='libharfbuzz_la-hb-shape-plan.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-cff1-table.lo: hb-ot-cff1-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-cff1-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Tpo -c -o libharfbuzz_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-cff1-table.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-cff1-table.cc' object='libharfbuzz_la-hb-ot-cff1-table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-cff1-table.lo `test -f 'hb-ot-cff1-table.cc' || echo '$(srcdir)/'`hb-ot-cff1-table.cc -libharfbuzz_la-hb-shaper.lo: hb-shaper.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shaper.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shaper.Tpo -c -o libharfbuzz_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shaper.Tpo $(DEPDIR)/libharfbuzz_la-hb-shaper.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shaper.cc' object='libharfbuzz_la-hb-shaper.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-cff2-table.lo: hb-ot-cff2-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-cff2-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Tpo -c -o libharfbuzz_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-cff2-table.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-cff2-table.cc' object='libharfbuzz_la-hb-ot-cff2-table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-cff2-table.lo `test -f 'hb-ot-cff2-table.cc' || echo '$(srcdir)/'`hb-ot-cff2-table.cc -libharfbuzz_la-hb-static.lo: hb-static.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-static.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-static.Tpo -c -o libharfbuzz_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-static.Tpo $(DEPDIR)/libharfbuzz_la-hb-static.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-static.cc' object='libharfbuzz_la-hb-static.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc - -libharfbuzz_la-hb-unicode.lo: hb-unicode.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-unicode.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-unicode.Tpo -c -o libharfbuzz_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-unicode.Tpo $(DEPDIR)/libharfbuzz_la-hb-unicode.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-unicode.cc' object='libharfbuzz_la-hb-unicode.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-color.lo: hb-ot-color.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-color.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-color.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-color.cc' object='libharfbuzz_la-hb-ot-color.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc -libharfbuzz_la-hb-warning.lo: hb-warning.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-warning.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-warning.Tpo -c -o libharfbuzz_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-warning.Tpo $(DEPDIR)/libharfbuzz_la-hb-warning.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-warning.cc' object='libharfbuzz_la-hb-warning.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-face.lo: hb-ot-face.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-face.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-face.Tpo -c -o libharfbuzz_la-hb-ot-face.lo `test -f 'hb-ot-face.cc' || echo '$(srcdir)/'`hb-ot-face.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-face.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-face.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-face.cc' object='libharfbuzz_la-hb-ot-face.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc - -libharfbuzz_la-hb-aat-layout.lo: hb-aat-layout.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-aat-layout.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo -c -o libharfbuzz_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Tpo $(DEPDIR)/libharfbuzz_la-hb-aat-layout.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-aat-layout.cc' object='libharfbuzz_la-hb-aat-layout.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-aat-layout.lo `test -f 'hb-aat-layout.cc' || echo '$(srcdir)/'`hb-aat-layout.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-face.lo `test -f 'hb-ot-face.cc' || echo '$(srcdir)/'`hb-ot-face.cc libharfbuzz_la-hb-ot-font.lo: hb-ot-font.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-font.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-font.Tpo -c -o libharfbuzz_la-hb-ot-font.lo `test -f 'hb-ot-font.cc' || echo '$(srcdir)/'`hb-ot-font.cc @@ -2489,13 +1991,6 @@ libharfbuzz_la-hb-ot-layout.lo: hb-ot-layout.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-layout.lo `test -f 'hb-ot-layout.cc' || echo '$(srcdir)/'`hb-ot-layout.cc -libharfbuzz_la-hb-ot-color.lo: hb-ot-color.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-color.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-color.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-color.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-color.cc' object='libharfbuzz_la-hb-ot-color.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-color.lo `test -f 'hb-ot-color.cc' || echo '$(srcdir)/'`hb-ot-color.cc - libharfbuzz_la-hb-ot-map.lo: hb-ot-map.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-map.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo -c -o libharfbuzz_la-hb-ot-map.lo `test -f 'hb-ot-map.cc' || echo '$(srcdir)/'`hb-ot-map.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-map.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-map.Plo @@ -2510,12 +2005,19 @@ libharfbuzz_la-hb-ot-math.lo: hb-ot-math.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-math.lo `test -f 'hb-ot-math.cc' || echo '$(srcdir)/'`hb-ot-math.cc -libharfbuzz_la-hb-ot-shape.lo: hb-ot-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Tpo -c -o libharfbuzz_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape.cc' object='libharfbuzz_la-hb-ot-shape.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-name-language.lo: hb-ot-name-language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-name-language.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Tpo -c -o libharfbuzz_la-hb-ot-name-language.lo `test -f 'hb-ot-name-language.cc' || echo '$(srcdir)/'`hb-ot-name-language.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-name-language.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-name-language.cc' object='libharfbuzz_la-hb-ot-name-language.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-name-language.lo `test -f 'hb-ot-name-language.cc' || echo '$(srcdir)/'`hb-ot-name-language.cc + +libharfbuzz_la-hb-ot-name.lo: hb-ot-name.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-name.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-name.Tpo -c -o libharfbuzz_la-hb-ot-name.lo `test -f 'hb-ot-name.cc' || echo '$(srcdir)/'`hb-ot-name.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-name.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-name.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-name.cc' object='libharfbuzz_la-hb-ot-name.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-name.lo `test -f 'hb-ot-name.cc' || echo '$(srcdir)/'`hb-ot-name.cc libharfbuzz_la-hb-ot-shape-complex-arabic.lo: hb-ot-shape-complex-arabic.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-arabic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-arabic.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-arabic.lo `test -f 'hb-ot-shape-complex-arabic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-arabic.cc @@ -2545,13 +2047,6 @@ libharfbuzz_la-hb-ot-shape-complex-hebrew.lo: hb-ot-shape-complex-hebrew.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-hebrew.lo `test -f 'hb-ot-shape-complex-hebrew.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-hebrew.cc -libharfbuzz_la-hb-ot-shape-complex-indic.lo: hb-ot-shape-complex-indic.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-indic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-indic.cc' object='libharfbuzz_la-hb-ot-shape-complex-indic.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc - libharfbuzz_la-hb-ot-shape-complex-indic-table.lo: hb-ot-shape-complex-indic-table.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-indic-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic-table.Plo @@ -2559,6 +2054,13 @@ libharfbuzz_la-hb-ot-shape-complex-indic-table.lo: hb-ot-shape-complex-indic-tab @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-indic-table.lo `test -f 'hb-ot-shape-complex-indic-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic-table.cc +libharfbuzz_la-hb-ot-shape-complex-indic.lo: hb-ot-shape-complex-indic.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-indic.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-indic.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-indic.cc' object='libharfbuzz_la-hb-ot-shape-complex-indic.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-indic.lo `test -f 'hb-ot-shape-complex-indic.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-indic.cc + libharfbuzz_la-hb-ot-shape-complex-khmer.lo: hb-ot-shape-complex-khmer.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-khmer.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-khmer.lo `test -f 'hb-ot-shape-complex-khmer.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-khmer.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-khmer.Plo @@ -2580,12 +2082,12 @@ libharfbuzz_la-hb-ot-shape-complex-thai.lo: hb-ot-shape-complex-thai.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-thai.lo `test -f 'hb-ot-shape-complex-thai.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-thai.cc -libharfbuzz_la-hb-ot-shape-complex-tibetan.lo: hb-ot-shape-complex-tibetan.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-tibetan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-tibetan.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-tibetan.lo `test -f 'hb-ot-shape-complex-tibetan.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-tibetan.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-tibetan.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-tibetan.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-tibetan.cc' object='libharfbuzz_la-hb-ot-shape-complex-tibetan.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-shape-complex-use-table.lo: hb-ot-shape-complex-use-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-use-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='libharfbuzz_la-hb-ot-shape-complex-use-table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-tibetan.lo `test -f 'hb-ot-shape-complex-tibetan.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-tibetan.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc libharfbuzz_la-hb-ot-shape-complex-use.lo: hb-ot-shape-complex-use.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-use.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-use.lo `test -f 'hb-ot-shape-complex-use.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use.cc @@ -2594,12 +2096,19 @@ libharfbuzz_la-hb-ot-shape-complex-use.lo: hb-ot-shape-complex-use.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-use.lo `test -f 'hb-ot-shape-complex-use.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use.cc -libharfbuzz_la-hb-ot-shape-complex-use-table.lo: hb-ot-shape-complex-use-table.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-use-table.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-use-table.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-use-table.cc' object='libharfbuzz_la-hb-ot-shape-complex-use-table.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo: hb-ot-shape-complex-vowel-constraints.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Tpo -c -o libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo `test -f 'hb-ot-shape-complex-vowel-constraints.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-vowel-constraints.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-complex-vowel-constraints.cc' object='libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-use-table.lo `test -f 'hb-ot-shape-complex-use-table.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-use-table.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-complex-vowel-constraints.lo `test -f 'hb-ot-shape-complex-vowel-constraints.cc' || echo '$(srcdir)/'`hb-ot-shape-complex-vowel-constraints.cc + +libharfbuzz_la-hb-ot-shape-fallback.lo: hb-ot-shape-fallback.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-fallback.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Tpo -c -o libharfbuzz_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-fallback.cc' object='libharfbuzz_la-hb-ot-shape-fallback.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc libharfbuzz_la-hb-ot-shape-normalize.lo: hb-ot-shape-normalize.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-normalize.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-normalize.Tpo -c -o libharfbuzz_la-hb-ot-shape-normalize.lo `test -f 'hb-ot-shape-normalize.cc' || echo '$(srcdir)/'`hb-ot-shape-normalize.cc @@ -2608,12 +2117,19 @@ libharfbuzz_la-hb-ot-shape-normalize.lo: hb-ot-shape-normalize.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-normalize.lo `test -f 'hb-ot-shape-normalize.cc' || echo '$(srcdir)/'`hb-ot-shape-normalize.cc -libharfbuzz_la-hb-ot-shape-fallback.lo: hb-ot-shape-fallback.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape-fallback.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Tpo -c -o libharfbuzz_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape-fallback.Plo -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape-fallback.cc' object='libharfbuzz_la-hb-ot-shape-fallback.lo' libtool=yes @AMDEPBACKSLASH@ +libharfbuzz_la-hb-ot-shape.lo: hb-ot-shape.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Tpo -c -o libharfbuzz_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-shape.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-shape.cc' object='libharfbuzz_la-hb-ot-shape.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape-fallback.lo `test -f 'hb-ot-shape-fallback.cc' || echo '$(srcdir)/'`hb-ot-shape-fallback.cc +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-shape.lo `test -f 'hb-ot-shape.cc' || echo '$(srcdir)/'`hb-ot-shape.cc + +libharfbuzz_la-hb-ot-tag.lo: hb-ot-tag.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-tag.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Tpo -c -o libharfbuzz_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Tpo $(DEPDIR)/libharfbuzz_la-hb-ot-tag.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-ot-tag.cc' object='libharfbuzz_la-hb-ot-tag.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-tag.lo `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc libharfbuzz_la-hb-ot-var.lo: hb-ot-var.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-ot-var.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-ot-var.Tpo -c -o libharfbuzz_la-hb-ot-var.lo `test -f 'hb-ot-var.cc' || echo '$(srcdir)/'`hb-ot-var.cc @@ -2622,6 +2138,55 @@ libharfbuzz_la-hb-ot-var.lo: hb-ot-var.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-ot-var.lo `test -f 'hb-ot-var.cc' || echo '$(srcdir)/'`hb-ot-var.cc +libharfbuzz_la-hb-set.lo: hb-set.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-set.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-set.Tpo -c -o libharfbuzz_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-set.Tpo $(DEPDIR)/libharfbuzz_la-hb-set.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-set.cc' object='libharfbuzz_la-hb-set.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-set.lo `test -f 'hb-set.cc' || echo '$(srcdir)/'`hb-set.cc + +libharfbuzz_la-hb-shape-plan.lo: hb-shape-plan.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shape-plan.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Tpo -c -o libharfbuzz_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Tpo $(DEPDIR)/libharfbuzz_la-hb-shape-plan.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shape-plan.cc' object='libharfbuzz_la-hb-shape-plan.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shape-plan.lo `test -f 'hb-shape-plan.cc' || echo '$(srcdir)/'`hb-shape-plan.cc + +libharfbuzz_la-hb-shape.lo: hb-shape.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shape.Tpo -c -o libharfbuzz_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-shape.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shape.cc' object='libharfbuzz_la-hb-shape.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shape.lo `test -f 'hb-shape.cc' || echo '$(srcdir)/'`hb-shape.cc + +libharfbuzz_la-hb-shaper.lo: hb-shaper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-shaper.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-shaper.Tpo -c -o libharfbuzz_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-shaper.Tpo $(DEPDIR)/libharfbuzz_la-hb-shaper.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-shaper.cc' object='libharfbuzz_la-hb-shaper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-shaper.lo `test -f 'hb-shaper.cc' || echo '$(srcdir)/'`hb-shaper.cc + +libharfbuzz_la-hb-static.lo: hb-static.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-static.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-static.Tpo -c -o libharfbuzz_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-static.Tpo $(DEPDIR)/libharfbuzz_la-hb-static.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-static.cc' object='libharfbuzz_la-hb-static.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-static.lo `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc + +libharfbuzz_la-hb-unicode.lo: hb-unicode.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-unicode.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-unicode.Tpo -c -o libharfbuzz_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-unicode.Tpo $(DEPDIR)/libharfbuzz_la-hb-unicode.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-unicode.cc' object='libharfbuzz_la-hb-unicode.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-unicode.lo `test -f 'hb-unicode.cc' || echo '$(srcdir)/'`hb-unicode.cc + +libharfbuzz_la-hb-warning.lo: hb-warning.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-warning.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-warning.Tpo -c -o libharfbuzz_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-warning.Tpo $(DEPDIR)/libharfbuzz_la-hb-warning.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-warning.cc' object='libharfbuzz_la-hb-warning.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-warning.lo `test -f 'hb-warning.cc' || echo '$(srcdir)/'`hb-warning.cc + libharfbuzz_la-hb-fallback-shape.lo: hb-fallback-shape.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libharfbuzz_la-hb-fallback-shape.lo -MD -MP -MF $(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Tpo -c -o libharfbuzz_la-hb-fallback-shape.lo `test -f 'hb-fallback-shape.cc' || echo '$(srcdir)/'`hb-fallback-shape.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Tpo $(DEPDIR)/libharfbuzz_la-hb-fallback-shape.Plo @@ -2685,34 +2250,6 @@ libharfbuzz_la-hb-icu.lo: hb-icu.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libharfbuzz_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libharfbuzz_la-hb-icu.lo `test -f 'hb-icu.cc' || echo '$(srcdir)/'`hb-icu.cc -dump_emoji-dump-emoji.o: dump-emoji.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_emoji_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_emoji-dump-emoji.o -MD -MP -MF $(DEPDIR)/dump_emoji-dump-emoji.Tpo -c -o dump_emoji-dump-emoji.o `test -f 'dump-emoji.cc' || echo '$(srcdir)/'`dump-emoji.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dump_emoji-dump-emoji.Tpo $(DEPDIR)/dump_emoji-dump-emoji.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dump-emoji.cc' object='dump_emoji-dump-emoji.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_emoji_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_emoji-dump-emoji.o `test -f 'dump-emoji.cc' || echo '$(srcdir)/'`dump-emoji.cc - -dump_emoji-dump-emoji.obj: dump-emoji.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_emoji_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_emoji-dump-emoji.obj -MD -MP -MF $(DEPDIR)/dump_emoji-dump-emoji.Tpo -c -o dump_emoji-dump-emoji.obj `if test -f 'dump-emoji.cc'; then $(CYGPATH_W) 'dump-emoji.cc'; else $(CYGPATH_W) '$(srcdir)/dump-emoji.cc'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dump_emoji-dump-emoji.Tpo $(DEPDIR)/dump_emoji-dump-emoji.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dump-emoji.cc' object='dump_emoji-dump-emoji.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_emoji_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_emoji-dump-emoji.obj `if test -f 'dump-emoji.cc'; then $(CYGPATH_W) 'dump-emoji.cc'; else $(CYGPATH_W) '$(srcdir)/dump-emoji.cc'; fi` - -dump_fon-dump-fon.o: dump-fon.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_fon_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_fon-dump-fon.o -MD -MP -MF $(DEPDIR)/dump_fon-dump-fon.Tpo -c -o dump_fon-dump-fon.o `test -f 'dump-fon.cc' || echo '$(srcdir)/'`dump-fon.cc -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dump_fon-dump-fon.Tpo $(DEPDIR)/dump_fon-dump-fon.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dump-fon.cc' object='dump_fon-dump-fon.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_fon_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_fon-dump-fon.o `test -f 'dump-fon.cc' || echo '$(srcdir)/'`dump-fon.cc - -dump_fon-dump-fon.obj: dump-fon.cc -@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_fon_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_fon-dump-fon.obj -MD -MP -MF $(DEPDIR)/dump_fon-dump-fon.Tpo -c -o dump_fon-dump-fon.obj `if test -f 'dump-fon.cc'; then $(CYGPATH_W) 'dump-fon.cc'; else $(CYGPATH_W) '$(srcdir)/dump-fon.cc'; fi` -@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dump_fon-dump-fon.Tpo $(DEPDIR)/dump_fon-dump-fon.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dump-fon.cc' object='dump_fon-dump-fon.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_fon_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o dump_fon-dump-fon.obj `if test -f 'dump-fon.cc'; then $(CYGPATH_W) 'dump-fon.cc'; else $(CYGPATH_W) '$(srcdir)/dump-fon.cc'; fi` - dump_indic_data-dump-indic-data.o: dump-indic-data.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dump_indic_data_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT dump_indic_data-dump-indic-data.o -MD -MP -MF $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo -c -o dump_indic_data-dump-indic-data.o `test -f 'dump-indic-data.cc' || echo '$(srcdir)/'`dump-indic-data.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dump_indic_data-dump-indic-data.Tpo $(DEPDIR)/dump_indic_data-dump-indic-data.Po @@ -2867,6 +2404,62 @@ test_buffer_serialize-test-buffer-serialize.obj: test-buffer-serialize.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_buffer_serialize_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_buffer_serialize-test-buffer-serialize.obj `if test -f 'test-buffer-serialize.cc'; then $(CYGPATH_W) 'test-buffer-serialize.cc'; else $(CYGPATH_W) '$(srcdir)/test-buffer-serialize.cc'; fi` +test_iter-test-iter.o: test-iter.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-test-iter.o -MD -MP -MF $(DEPDIR)/test_iter-test-iter.Tpo -c -o test_iter-test-iter.o `test -f 'test-iter.cc' || echo '$(srcdir)/'`test-iter.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-test-iter.Tpo $(DEPDIR)/test_iter-test-iter.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-iter.cc' object='test_iter-test-iter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-test-iter.o `test -f 'test-iter.cc' || echo '$(srcdir)/'`test-iter.cc + +test_iter-test-iter.obj: test-iter.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-test-iter.obj -MD -MP -MF $(DEPDIR)/test_iter-test-iter.Tpo -c -o test_iter-test-iter.obj `if test -f 'test-iter.cc'; then $(CYGPATH_W) 'test-iter.cc'; else $(CYGPATH_W) '$(srcdir)/test-iter.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-test-iter.Tpo $(DEPDIR)/test_iter-test-iter.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-iter.cc' object='test_iter-test-iter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-test-iter.obj `if test -f 'test-iter.cc'; then $(CYGPATH_W) 'test-iter.cc'; else $(CYGPATH_W) '$(srcdir)/test-iter.cc'; fi` + +test_iter-hb-static.o: hb-static.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-hb-static.o -MD -MP -MF $(DEPDIR)/test_iter-hb-static.Tpo -c -o test_iter-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-hb-static.Tpo $(DEPDIR)/test_iter-hb-static.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-static.cc' object='test_iter-hb-static.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-hb-static.o `test -f 'hb-static.cc' || echo '$(srcdir)/'`hb-static.cc + +test_iter-hb-static.obj: hb-static.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_iter-hb-static.obj -MD -MP -MF $(DEPDIR)/test_iter-hb-static.Tpo -c -o test_iter-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_iter-hb-static.Tpo $(DEPDIR)/test_iter-hb-static.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hb-static.cc' object='test_iter-hb-static.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_iter_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_iter-hb-static.obj `if test -f 'hb-static.cc'; then $(CYGPATH_W) 'hb-static.cc'; else $(CYGPATH_W) '$(srcdir)/hb-static.cc'; fi` + +test_name_table-test-name-table.o: test-name-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_name_table-test-name-table.o -MD -MP -MF $(DEPDIR)/test_name_table-test-name-table.Tpo -c -o test_name_table-test-name-table.o `test -f 'test-name-table.cc' || echo '$(srcdir)/'`test-name-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_name_table-test-name-table.Tpo $(DEPDIR)/test_name_table-test-name-table.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-name-table.cc' object='test_name_table-test-name-table.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_name_table-test-name-table.o `test -f 'test-name-table.cc' || echo '$(srcdir)/'`test-name-table.cc + +test_name_table-test-name-table.obj: test-name-table.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_name_table-test-name-table.obj -MD -MP -MF $(DEPDIR)/test_name_table-test-name-table.Tpo -c -o test_name_table-test-name-table.obj `if test -f 'test-name-table.cc'; then $(CYGPATH_W) 'test-name-table.cc'; else $(CYGPATH_W) '$(srcdir)/test-name-table.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_name_table-test-name-table.Tpo $(DEPDIR)/test_name_table-test-name-table.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-name-table.cc' object='test_name_table-test-name-table.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_table_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_name_table-test-name-table.obj `if test -f 'test-name-table.cc'; then $(CYGPATH_W) 'test-name-table.cc'; else $(CYGPATH_W) '$(srcdir)/test-name-table.cc'; fi` + +test_ot_color-test-ot-color.o: test-ot-color.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_color-test-ot-color.o -MD -MP -MF $(DEPDIR)/test_ot_color-test-ot-color.Tpo -c -o test_ot_color-test-ot-color.o `test -f 'test-ot-color.cc' || echo '$(srcdir)/'`test-ot-color.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_color-test-ot-color.Tpo $(DEPDIR)/test_ot_color-test-ot-color.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-ot-color.cc' object='test_ot_color-test-ot-color.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_color-test-ot-color.o `test -f 'test-ot-color.cc' || echo '$(srcdir)/'`test-ot-color.cc + +test_ot_color-test-ot-color.obj: test-ot-color.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_color-test-ot-color.obj -MD -MP -MF $(DEPDIR)/test_ot_color-test-ot-color.Tpo -c -o test_ot_color-test-ot-color.obj `if test -f 'test-ot-color.cc'; then $(CYGPATH_W) 'test-ot-color.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-color.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_color-test-ot-color.Tpo $(DEPDIR)/test_ot_color-test-ot-color.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-ot-color.cc' object='test_ot_color-test-ot-color.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_color_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_ot_color-test-ot-color.obj `if test -f 'test-ot-color.cc'; then $(CYGPATH_W) 'test-ot-color.cc'; else $(CYGPATH_W) '$(srcdir)/test-ot-color.cc'; fi` + test_ot_tag-hb-ot-tag.o: hb-ot-tag.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_ot_tag_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_ot_tag-hb-ot-tag.o -MD -MP -MF $(DEPDIR)/test_ot_tag-hb-ot-tag.Tpo -c -o test_ot_tag-hb-ot-tag.o `test -f 'hb-ot-tag.cc' || echo '$(srcdir)/'`hb-ot-tag.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_ot_tag-hb-ot-tag.Tpo $(DEPDIR)/test_ot_tag-hb-ot-tag.Po @@ -2895,6 +2488,20 @@ test_size_params-test-size-params.obj: test-size-params.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_size_params_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_size_params-test-size-params.obj `if test -f 'test-size-params.cc'; then $(CYGPATH_W) 'test-size-params.cc'; else $(CYGPATH_W) '$(srcdir)/test-size-params.cc'; fi` +test_unicode_ranges-test-unicode-ranges.o: test-unicode-ranges.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_unicode_ranges-test-unicode-ranges.o -MD -MP -MF $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo -c -o test_unicode_ranges-test-unicode-ranges.o `test -f 'test-unicode-ranges.cc' || echo '$(srcdir)/'`test-unicode-ranges.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-unicode-ranges.cc' object='test_unicode_ranges-test-unicode-ranges.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_unicode_ranges-test-unicode-ranges.o `test -f 'test-unicode-ranges.cc' || echo '$(srcdir)/'`test-unicode-ranges.cc + +test_unicode_ranges-test-unicode-ranges.obj: test-unicode-ranges.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_unicode_ranges-test-unicode-ranges.obj -MD -MP -MF $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo -c -o test_unicode_ranges-test-unicode-ranges.obj `if test -f 'test-unicode-ranges.cc'; then $(CYGPATH_W) 'test-unicode-ranges.cc'; else $(CYGPATH_W) '$(srcdir)/test-unicode-ranges.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Tpo $(DEPDIR)/test_unicode_ranges-test-unicode-ranges.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='test-unicode-ranges.cc' object='test_unicode_ranges-test-unicode-ranges.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_unicode_ranges_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o test_unicode_ranges-test-unicode-ranges.obj `if test -f 'test-unicode-ranges.cc'; then $(CYGPATH_W) 'test-unicode-ranges.cc'; else $(CYGPATH_W) '$(srcdir)/test-unicode-ranges.cc'; fi` + test_would_substitute-test-would-substitute.o: test-would-substitute.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_would_substitute_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT test_would_substitute-test-would-substitute.o -MD -MP -MF $(DEPDIR)/test_would_substitute-test-would-substitute.Tpo -c -o test_would_substitute-test-would-substitute.o `test -f 'test-would-substitute.cc' || echo '$(srcdir)/'`test-would-substitute.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_would_substitute-test-would-substitute.Tpo $(DEPDIR)/test_would_substitute-test-would-substitute.Po @@ -3330,6 +2937,13 @@ check-libstdc++.sh.log: check-libstdc++.sh --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +test-iter.log: test-iter$(EXEEXT) + @p='test-iter$(EXEEXT)'; \ + b='test-iter'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) test-ot-tag.log: test-ot-tag$(EXEEXT) @p='test-ot-tag$(EXEEXT)'; \ b='test-ot-tag'; \ @@ -3573,8 +3187,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-cmakeDATA \ # Convenience targets: -lib: $(BUILT_SOURCES) libharfbuzz.la libharfbuzz-subset.la -fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la libharfbuzz-subset-fuzzing.la +lib: $(BUILT_SOURCES) libharfbuzz.la +libs: $(BUILT_SOURCES) $(lib_LTLIBRARIES) @HAVE_UCDN_TRUE@hb-ucdn/libhb-ucdn.la: ucdn @HAVE_UCDN_TRUE@ucdn: @HAVE_UCDN_TRUE@ @$(MAKE) $(AM_MAKEFLAGS) -C hb-ucdn @@ -3608,15 +3222,17 @@ $(srcdir)/hb-version.h: hb-version.h.in $(top_srcdir)/configure.ac || ($(RM) "$@"; false) check: $(DEF_FILES) # For check-symbols.sh harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ harfbuzz-subset.def: $(HB_SUBSET_headers) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ harfbuzz-icu.def: $(HB_ICU_headers) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ harfbuzz-gobject.def: $(HB_GOBJECT_headers) - $(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py "$@" + $(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^ +harfbuzz-deprecated-symbols.txt: $(srcdir)/hb-deprecated.h + $(AM_V_GEN) PLAIN_LIST=1 $(srcdir)/gen-def.py "$@" $^ -unicode-tables: arabic-table indic-table use-table +unicode-tables: arabic-table indic-table tag-table use-table emoji-table arabic-table: gen-arabic-table.py ArabicShaping.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-arabic-table.hh \ @@ -3626,13 +3242,25 @@ indic-table: gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategor $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-indic-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-indic-table.cc; false) +tag-table: gen-tag-table.py languagetags language-subtag-registry + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-tag-table.hh \ + || ($(RM) $(srcdir)/hb-ot-tag-table.hh; false) + use-table: gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \ || ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false) +vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \ + || ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false) + +emoji-table: gen-emoji-table.py emoji-data.txt + $(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \ + || ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false) + built-sources: $(BUILT_SOURCES) -.PHONY: unicode-tables arabic-table indic-table use-table built-sources +.PHONY: unicode-tables arabic-table indic-table tag-table use-table vowel-constraints emoji-table built-sources # We decided to add ragel-generated files to git... #MAINTAINERCLEANFILES += $(RAGEL_GENERATED) $(srcdir)/%.hh: $(srcdir)/%.rl diff --git a/src/Makefile.sources b/src/Makefile.sources index 0bc9e58..0da4abe 100644 --- a/src/Makefile.sources +++ b/src/Makefile.sources @@ -1,70 +1,173 @@ # Base and default-included sources and headers HB_BASE_sources = \ - hb-atomic-private.hh \ - hb-blob-private.hh \ + hb-aat-fdsc-table.hh \ + hb-aat-layout-ankr-table.hh \ + hb-aat-layout-bsln-table.hh \ + hb-aat-layout-common.hh \ + hb-aat-layout-feat-table.hh \ + hb-aat-layout-just-table.hh \ + hb-aat-layout-kerx-table.hh \ + hb-aat-layout-lcar-table.hh \ + hb-aat-layout-morx-table.hh \ + hb-aat-layout-trak-table.hh \ + hb-aat-layout.cc \ + hb-aat-layout.hh \ + hb-aat-ltag-table.hh \ + hb-aat-map.cc \ + hb-aat-map.hh \ + hb-array.hh \ + hb-atomic.hh \ hb-blob.cc \ - hb-buffer-private.hh \ + hb-blob.hh \ hb-buffer-serialize.cc \ hb-buffer.cc \ + hb-buffer.hh \ + hb-cache.hh \ + hb-cff-interp-common.hh \ + hb-cff-interp-cs-common.hh \ + hb-cff-interp-dict-common.hh \ + hb-cff1-interp-cs.hh \ + hb-cff2-interp-cs.hh \ hb-common.cc \ hb-debug.hh \ hb-dsalgs.hh \ - hb-face-private.hh \ hb-face.cc \ - hb-font-private.hh \ + hb-face.hh \ hb-font.cc \ - hb-map-private.hh \ + hb-font.hh \ + hb-iter.hh \ + hb-kern.hh \ + hb-machinery.hh \ hb-map.cc \ - hb-mutex-private.hh \ - hb-object-private.hh \ - hb-open-file-private.hh \ - hb-open-type-private.hh \ - hb-ot-color-cbdt-table.hh \ + hb-map.hh \ + hb-mutex.hh \ + hb-null.hh \ + hb-object.hh \ + hb-open-file.hh \ + hb-open-type.hh \ + hb-ot-cff-common.hh \ + hb-ot-cff1-table.cc \ + hb-ot-cff1-table.hh \ + hb-ot-cff2-table.cc \ + hb-ot-cff2-table.hh \ hb-ot-cmap-table.hh \ + hb-ot-color-cbdt-table.hh \ + hb-ot-color-colr-table.hh \ + hb-ot-color-cpal-table.hh \ + hb-ot-color-sbix-table.hh \ + hb-ot-color-svg-table.hh \ + hb-ot-color.cc \ + hb-ot-face.cc \ + hb-ot-face.hh \ + hb-ot-font.cc \ + hb-ot-gasp-table.hh \ hb-ot-glyf-table.hh \ hb-ot-hdmx-table.hh \ hb-ot-head-table.hh \ hb-ot-hhea-table.hh \ hb-ot-hmtx-table.hh \ hb-ot-kern-table.hh \ + hb-ot-layout-base-table.hh \ + hb-ot-layout-common.hh \ + hb-ot-layout-gdef-table.hh \ + hb-ot-layout-gpos-table.hh \ + hb-ot-layout-gsub-table.hh \ + hb-ot-layout-gsubgpos.hh \ + hb-ot-layout-jstf-table.hh \ + hb-ot-layout.cc \ + hb-ot-layout.hh \ + hb-ot-map.cc \ + hb-ot-map.hh \ + hb-ot-math-table.hh \ + hb-ot-math.cc \ hb-ot-maxp-table.hh \ + hb-ot-name-language.cc \ + hb-ot-name-language.hh \ hb-ot-name-table.hh \ + hb-ot-name.cc \ hb-ot-os2-table.hh \ hb-ot-os2-unicode-ranges.hh \ hb-ot-post-macroman.hh \ hb-ot-post-table.hh \ + hb-ot-shape-complex-arabic-fallback.hh \ + hb-ot-shape-complex-arabic-table.hh \ + hb-ot-shape-complex-arabic-win1256.hh \ + hb-ot-shape-complex-arabic.cc \ + hb-ot-shape-complex-arabic.hh \ + hb-ot-shape-complex-default.cc \ + hb-ot-shape-complex-hangul.cc \ + hb-ot-shape-complex-hebrew.cc \ + hb-ot-shape-complex-indic-table.cc \ + hb-ot-shape-complex-indic.cc \ + hb-ot-shape-complex-indic.hh \ + hb-ot-shape-complex-khmer.cc \ + hb-ot-shape-complex-khmer.hh \ + hb-ot-shape-complex-myanmar.cc \ + hb-ot-shape-complex-myanmar.hh \ + hb-ot-shape-complex-thai.cc \ + hb-ot-shape-complex-use-table.cc \ + hb-ot-shape-complex-use.cc \ + hb-ot-shape-complex-use.hh \ + hb-ot-shape-complex-vowel-constraints.cc \ + hb-ot-shape-complex-vowel-constraints.hh \ + hb-ot-shape-complex.hh \ + hb-ot-shape-fallback.cc \ + hb-ot-shape-fallback.hh \ + hb-ot-shape-normalize.cc \ + hb-ot-shape-normalize.hh \ + hb-ot-shape.cc \ + hb-ot-shape.hh \ + hb-ot-stat-table.hh \ + hb-ot-tag-table.hh \ hb-ot-tag.cc \ - hb-private.hh \ - hb-set-digest-private.hh \ - hb-set-private.hh \ + hb-ot-var-avar-table.hh \ + hb-ot-var-fvar-table.hh \ + hb-ot-var-hvar-table.hh \ + hb-ot-var-mvar-table.hh \ + hb-ot-var.cc \ + hb-ot-vorg-table.hh \ + hb-set-digest.hh \ hb-set.cc \ - hb-shape.cc \ - hb-shape-plan-private.hh \ + hb-set.hh \ hb-shape-plan.cc \ + hb-shape-plan.hh \ + hb-shape.cc \ + hb-shaper-impl.hh \ hb-shaper-list.hh \ - hb-shaper-impl-private.hh \ - hb-shaper-private.hh \ hb-shaper.cc \ + hb-shaper.hh \ hb-static.cc \ hb-string-array.hh \ - hb-unicode-private.hh \ + hb-unicode-emoji-table.hh \ hb-unicode.cc \ - hb-utf-private.hh \ + hb-unicode.hh \ + hb-utf.hh \ + hb-vector.hh \ hb-warning.cc \ + hb.hh \ $(NULL) HB_BASE_RAGEL_GENERATED_sources = \ hb-buffer-deserialize-json.hh \ hb-buffer-deserialize-text.hh \ + 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_BASE_RAGEL_sources = \ hb-buffer-deserialize-json.rl \ hb-buffer-deserialize-text.rl \ + 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) HB_BASE_headers = \ - hb.h \ + hb-aat-layout.h \ + hb-aat.h \ hb-blob.h \ hb-buffer.h \ hb-common.h \ @@ -72,106 +175,27 @@ HB_BASE_headers = \ hb-face.h \ hb-font.h \ hb-map.h \ + hb-ot-color.h \ + hb-ot-deprecated.h \ + hb-ot-font.h \ + hb-ot-layout.h \ + hb-ot-math.h \ + hb-ot-name.h \ + hb-ot-shape.h \ + hb-ot-var.h \ + hb-ot.h \ hb-set.h \ - hb-shape.h \ hb-shape-plan.h \ + hb-shape.h \ hb-unicode.h \ hb-version.h \ + hb.h \ $(NULL) HB_FALLBACK_sources = \ hb-fallback-shape.cc \ $(NULL) -HB_OT_sources = \ - hb-aat-layout.cc \ - hb-aat-layout-common-private.hh \ - hb-aat-layout-ankr-table.hh \ - hb-aat-layout-bsln-table.hh \ - hb-aat-layout-feat-table.hh \ - hb-aat-layout-kerx-table.hh \ - hb-aat-layout-morx-table.hh \ - hb-aat-layout-trak-table.hh \ - hb-aat-layout-private.hh \ - hb-aat-fmtx-table.hh \ - hb-aat-gcid-table.hh \ - hb-aat-ltag-table.hh \ - hb-ot-font.cc \ - hb-ot-layout.cc \ - hb-ot-layout-base-table.hh \ - hb-ot-layout-common-private.hh \ - hb-ot-layout-gdef-table.hh \ - hb-ot-layout-gpos-table.hh \ - hb-ot-layout-gsubgpos-private.hh \ - hb-ot-layout-gsub-table.hh \ - hb-ot-layout-jstf-table.hh \ - hb-ot-layout-private.hh \ - hb-ot-color.cc \ - hb-ot-color-colr-table.hh \ - hb-ot-color-cpal-table.hh \ - hb-ot-color-sbix-table.hh \ - hb-ot-color-svg-table.hh \ - hb-ot-map.cc \ - hb-ot-map-private.hh \ - hb-ot-math.cc \ - hb-ot-math-table.hh \ - hb-ot-shape.cc \ - hb-ot-shape-complex-arabic.cc \ - hb-ot-shape-complex-arabic-fallback.hh \ - hb-ot-shape-complex-arabic-private.hh \ - hb-ot-shape-complex-arabic-table.hh \ - hb-ot-shape-complex-arabic-win1256.hh \ - hb-ot-shape-complex-default.cc \ - hb-ot-shape-complex-hangul.cc \ - hb-ot-shape-complex-hebrew.cc \ - hb-ot-shape-complex-indic.cc \ - hb-ot-shape-complex-indic-private.hh \ - hb-ot-shape-complex-indic-table.cc \ - hb-ot-shape-complex-khmer-private.hh \ - hb-ot-shape-complex-khmer.cc \ - hb-ot-shape-complex-myanmar-private.hh \ - hb-ot-shape-complex-myanmar.cc \ - hb-ot-shape-complex-thai.cc \ - hb-ot-shape-complex-tibetan.cc \ - hb-ot-shape-complex-use.cc \ - hb-ot-shape-complex-use-private.hh \ - hb-ot-shape-complex-use-table.cc \ - hb-ot-shape-complex-private.hh \ - hb-ot-shape-normalize-private.hh \ - hb-ot-shape-normalize.cc \ - hb-ot-shape-fallback-private.hh \ - hb-ot-shape-fallback.cc \ - hb-ot-shape-private.hh \ - hb-ot-var.cc \ - hb-ot-var-avar-table.hh \ - hb-ot-var-fvar-table.hh \ - hb-ot-var-hvar-table.hh \ - hb-ot-var-mvar-table.hh \ - $(NULL) - -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) - -HB_OT_headers = \ - hb-ot.h \ - hb-ot-font.h \ - hb-ot-layout.h \ - hb-ot-math.h \ - hb-ot-shape.h \ - hb-ot-tag.h \ - hb-ot-var.h \ - $(NULL) - # Optional Sources and Headers with external deps HB_FT_sources = hb-ft.cc @@ -203,18 +227,30 @@ HB_ICU_headers = hb-icu.h # Sources for libharfbuzz-subset HB_SUBSET_sources = \ + hb-ot-cff1-table.cc \ + hb-ot-cff2-table.cc \ hb-static.cc \ - hb-subset.cc \ + hb-subset-cff-common.cc \ + hb-subset-cff-common.hh \ + hb-subset-cff1.cc \ + hb-subset-cff1.hh \ + hb-subset-cff2.cc \ + hb-subset-cff2.hh \ hb-subset-glyf.cc \ + hb-subset-glyf.hh \ + hb-subset-glyf.hh \ hb-subset-input.cc \ + hb-subset-input.hh \ hb-subset-plan.cc \ + hb-subset-plan.hh \ + hb-subset-plan.hh \ + hb-subset.cc \ + hb-subset.hh \ + hb-subset.hh \ $(NULL) HB_SUBSET_headers = \ hb-subset.h \ - hb-subset-glyf.hh \ - hb-subset-plan.hh \ - hb-subset-private.hh \ $(NULL) HB_GOBJECT_DIST_sources = hb-gobject-structs.cc diff --git a/src/check-includes.sh b/src/check-includes.sh index fd565da..f938f70 100755 --- a/src/check-includes.sh +++ b/src/check-includes.sh @@ -23,14 +23,14 @@ grep -v 'hb[.]h:' | grep . >&2 && stat=1 -echo 'Checking that source files #include "hb-*private.hh" first (or none)' +echo 'Checking that source files #include a private header first (or none)' for x in $HBSOURCES; do test -f "$srcdir/$x" -a ! -f "$x" && x="$srcdir/$x" - grep '#.*\' "$x" /dev/null | grep -v 'include _' | head -n 1 + grep '#.*\' "$x" /dev/null | head -n 1 done | -grep -v '"hb-.*private[.]hh"' | -grep -v 'hb-private[.]hh:' | +grep -v '"hb-.*[.]hh"' | +grep -v 'hb[.]hh' | grep . >&2 && stat=1 diff --git a/src/check-static-inits.sh b/src/check-static-inits.sh index 71551cb..def25c7 100755 --- a/src/check-static-inits.sh +++ b/src/check-static-inits.sh @@ -7,7 +7,6 @@ test -z "$srcdir" && srcdir=. test -z "$libs" && libs=.libs stat=0 - if which objdump 2>/dev/null >/dev/null; then : else @@ -31,7 +30,8 @@ done echo "Checking that no object file has lazy static C++ constructors/destructors or other such stuff" for obj in $OBJS; do - if objdump -t "$obj" | grep '__cxa_'; then + if objdump -t "$obj" | grep -q '__cxa_' && ! objdump -t "$obj" | grep -q __ubsan_handle; then + objdump -t "$obj" | grep '__cxa_' echo "Ouch, $obj has lazy static C++ constructors/destructors or other such stuff" stat=1 fi diff --git a/src/check-symbols.sh b/src/check-symbols.sh index d4eca50..cea8684 100755 --- a/src/check-symbols.sh +++ b/src/check-symbols.sh @@ -26,7 +26,7 @@ for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do symprefix= if test $suffix = dylib; then symprefix=_; fi - EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`" + EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRST] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`" prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'` diff --git a/src/dump-emoji.cc b/src/dump-emoji.cc deleted file mode 100644 index 99e8ef9..0000000 --- a/src/dump-emoji.cc +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright © 2018 Ebrahim Byagowi - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "hb-static.cc" -#include "hb-ot-color-cbdt-table.hh" -#include "hb-ot-color-colr-table.hh" -#include "hb-ot-color-cpal-table.hh" -#include "hb-ot-color-sbix-table.hh" -#include "hb-ot-color-svg-table.hh" - -#include "hb-ft.h" - -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H - -#include -#include -#include - -#ifdef HAVE_GLIB -#include -#endif -#include -#include - -void cbdt_callback (const uint8_t* data, unsigned int length, - unsigned int group, unsigned int gid) -{ - char output_path[255]; - sprintf (output_path, "out/cbdt-%d-%d.png", group, gid); - FILE *f = fopen (output_path, "wb"); - fwrite (data, 1, length, f); - fclose (f); -} - -void sbix_callback (const uint8_t* data, unsigned int length, - unsigned int group, unsigned int gid) -{ - char output_path[255]; - sprintf (output_path, "out/sbix-%d-%d.png", group, gid); - FILE *f = fopen (output_path, "wb"); - fwrite (data, 1, length, f); - fclose (f); -} - -void svg_callback (const uint8_t* data, unsigned int length, - unsigned int start_glyph, unsigned int end_glyph) -{ - char output_path[255]; - if (start_glyph == end_glyph) - sprintf (output_path, "out/svg-%d.svg", start_glyph); - else - sprintf (output_path, "out/svg-%d-%d.svg", start_glyph, end_glyph); - - // append "z" if the content is gzipped - if ((data[0] == 0x1F) && (data[1] == 0x8B)) - strcat (output_path, "z"); - - FILE *f = fopen (output_path, "wb"); - fwrite (data, 1, length, f); - fclose (f); -} - -void colr_cpal_rendering (cairo_font_face_t *cairo_face, unsigned int upem, unsigned int num_glyphs, - const OT::COLR *colr, const OT::CPAL *cpal) -{ - for (unsigned int i = 0; i < num_glyphs; ++i) - { - unsigned int first_layer_index, num_layers; - if (colr->get_base_glyph_record (i, &first_layer_index, &num_layers)) - { - // Measure - cairo_text_extents_t extents; - { - cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); - cairo_t *cr = cairo_create (surface); - cairo_set_font_face (cr, cairo_face); - cairo_set_font_size (cr, upem); - - cairo_glyph_t *glyphs = (cairo_glyph_t *) calloc (num_layers, sizeof (cairo_glyph_t)); - for (unsigned int j = 0; j < num_layers; ++j) - { - hb_codepoint_t glyph_id; - unsigned int color_index; - colr->get_layer_record (first_layer_index + j, &glyph_id, &color_index); - glyphs[j].index = glyph_id; - } - cairo_glyph_extents (cr, glyphs, num_layers, &extents); - free (glyphs); - cairo_surface_destroy (surface); - cairo_destroy (cr); - } - - // Add a slight margin - extents.width += extents.width / 10; - extents.height += extents.height / 10; - extents.x_bearing -= extents.width / 20; - extents.y_bearing -= extents.height / 20; - - // Render - unsigned int pallet_count = cpal->get_palette_count (); - for (unsigned int pallet = 0; pallet < pallet_count; ++pallet) { - char output_path[255]; - - // If we have more than one pallet, use a better namin - if (pallet_count == 1) - sprintf (output_path, "out/colr-%d.svg", i); - else - sprintf (output_path, "out/colr-%d-%d.svg", i, pallet); - - cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height); - cairo_t *cr = cairo_create (surface); - cairo_set_font_face (cr, cairo_face); - cairo_set_font_size (cr, upem); - - for (unsigned int j = 0; j < num_layers; ++j) - { - hb_codepoint_t glyph_id; - unsigned int color_index; - colr->get_layer_record (first_layer_index + j, &glyph_id, &color_index); - - uint32_t color = cpal->get_color_record_argb (color_index, pallet); - int alpha = color & 0xFF; - int r = (color >> 8) & 0xFF; - int g = (color >> 16) & 0xFF; - int b = (color >> 24) & 0xFF; - cairo_set_source_rgba (cr, r / 255.f, g / 255.f, b / 255.f, alpha); - - cairo_glyph_t glyph; - glyph.index = glyph_id; - glyph.x = -extents.x_bearing; - glyph.y = -extents.y_bearing; - cairo_show_glyphs (cr, &glyph, 1); - } - - cairo_surface_destroy (surface); - cairo_destroy (cr); - } - } - } -} - -void dump_glyphs (cairo_font_face_t *cairo_face, unsigned int upem, unsigned int num_glyphs) -{ - // Dump every glyph available on the font - return; // disabled for now - for (unsigned int i = 0; i < num_glyphs; ++i) - { - cairo_text_extents_t extents; - cairo_glyph_t glyph = {0}; - glyph.index = i; - - // Measure - { - cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); - cairo_t *cr = cairo_create (surface); - cairo_set_font_face (cr, cairo_face); - cairo_set_font_size (cr, upem); - - cairo_glyph_extents (cr, &glyph, 1, &extents); - cairo_surface_destroy (surface); - cairo_destroy (cr); - } - - // Add a slight margin - extents.width += extents.width / 10; - extents.height += extents.height / 10; - extents.x_bearing -= extents.width / 20; - extents.y_bearing -= extents.height / 20; - - // Render - { - char output_path[255]; - sprintf (output_path, "out/%d.svg", i); - cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height); - cairo_t *cr = cairo_create (surface); - cairo_set_font_face (cr, cairo_face); - cairo_set_font_size (cr, upem); - glyph.x = -extents.x_bearing; - glyph.y = -extents.y_bearing; - cairo_show_glyphs (cr, &glyph, 1); - cairo_surface_destroy (surface); - cairo_destroy (cr); - } - } -} - -int main (int argc, char **argv) -{ - if (argc != 2) { - fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]); - exit (1); - } - - hb_blob_t *blob = hb_blob_create_from_file (argv[1]); - hb_face_t *face = hb_face_create (blob, 0); - hb_font_t *font = hb_font_create (face); - - OT::CBDT::accelerator_t cbdt; - cbdt.init (face); - cbdt.dump (cbdt_callback); - cbdt.fini (); - - OT::sbix::accelerator_t sbix; - sbix.init (face); - sbix.dump (sbix_callback); - sbix.fini (); - - OT::SVG::accelerator_t svg; - svg.init (face); - svg.dump (svg_callback); - svg.fini (); - - OT::Sanitizer sanitizerCOLR; - hb_blob_t* colr_blob = sanitizerCOLR.sanitize (face->reference_table (HB_OT_TAG_COLR)); - const OT::COLR *colr = colr_blob->as (); - - OT::Sanitizer sanitizerCPAL; - hb_blob_t* cpal_blob = sanitizerCPAL.sanitize (face->reference_table (HB_OT_TAG_CPAL)); - const OT::CPAL *cpal = cpal_blob->as (); - - cairo_font_face_t *cairo_face; - { - FT_Library library; - FT_Init_FreeType (&library); - FT_Face ftface; - FT_New_Face (library, argv[1], 0, &ftface); - cairo_face = cairo_ft_font_face_create_for_ft_face (ftface, 0); - } - unsigned int num_glyphs = hb_face_get_glyph_count (face); - unsigned int upem = hb_face_get_upem (face); - colr_cpal_rendering (cairo_face, upem, num_glyphs, colr, cpal); - dump_glyphs (cairo_face, upem, num_glyphs); - - - hb_font_destroy (font); - hb_face_destroy (face); - hb_blob_destroy (blob); - - return 0; -} diff --git a/src/dump-fon.cc b/src/dump-fon.cc deleted file mode 100644 index 4015409..0000000 --- a/src/dump-fon.cc +++ /dev/null @@ -1,555 +0,0 @@ -/* - * Copyright © 2018 Ebrahim Byagowi - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "hb-static.cc" -#include -#include -#include "hb-open-type-private.hh" - -template struct LEInt; - -template -struct LEInt -{ - public: - inline void set (Type V) - { - v = V; - } - inline operator Type (void) const - { - return v; - } - private: uint8_t v; -}; -template -struct LEInt -{ - public: - inline void set (Type V) - { - v[1] = (V >> 8) & 0xFF; - v[0] = (V ) & 0xFF; - } - inline operator Type (void) const - { - return (v[1] << 8) - + (v[0] ); - } - private: uint8_t v[2]; -}; -template -struct LEInt -{ - public: - inline void set (Type V) - { - v[2] = (V >> 16) & 0xFF; - v[1] = (V >> 8) & 0xFF; - v[0] = (V ) & 0xFF; - } - inline operator Type (void) const - { - return (v[2] << 16) - + (v[1] << 8) - + (v[0] ); - } - private: uint8_t v[3]; -}; -template -struct LEInt -{ - public: - inline void set (Type V) - { - v[3] = (V >> 24) & 0xFF; - v[2] = (V >> 16) & 0xFF; - v[1] = (V >> 8) & 0xFF; - v[0] = (V ) & 0xFF; - } - inline operator Type (void) const - { - return (v[3] << 24) - + (v[2] << 16) - + (v[1] << 8) - + (v[0] ); - } - private: uint8_t v[4]; -}; - -template -struct LEIntType -{ - inline void set (Type i) { v.set (i); } - inline operator Type(void) const { return v; } - inline bool sanitize (OT::hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); - } - protected: - LEInt v; - public: - DEFINE_SIZE_STATIC (Size); -}; - -typedef LEIntType LEUINT8; /* 8-bit unsigned integer. */ -typedef LEIntType LEINT8; /* 8-bit signed integer. */ -typedef LEIntType LEUINT16; /* 16-bit unsigned integer. */ -typedef LEIntType LEINT16; /* 16-bit signed integer. */ -typedef LEIntType LEUINT32; /* 32-bit unsigned integer. */ -typedef LEIntType LEINT32; /* 32-bit signed integer. */ -typedef LEIntType LEUINT24; /* 24-bit unsigned integer. */ - - -struct LE_FONTINFO16 -{ - inline bool sanitize (OT::hb_sanitize_context_t *c, unsigned int length) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && c->check_range (this, length))); - } - - // https://msdn.microsoft.com/en-us/library/cc194829.aspx - enum charset_t - { - // dfCharSet possible values and the codepage they are indicating to - ANSI = 0x00, // 1252 - DEFAULT = 0x01, // - SYMBOL = 0x02, // - SHIFTJIS = 0x80, // 932 - HANGUL = 0x81, // 949 - GB2312 = 0x86, // 936 - CHINESEBIG5 = 0x88, // 950 - GREEK = 0xA1, // 1253 - TURKISH = 0xA2, // 1254 - HEBREW = 0xB1, // 1255 - ARABIC = 0xB2, // 1256 - BALTIC = 0xBA, // 1257 - RUSSIAN = 0xCC, // 1251 - THAI = 0xDE, // 874 - EE = 0xEE, // 1250 - OEM = 0xFF // - }; - - inline const char* get_charset() const - { - switch (dfCharSet) { - case ANSI: return "ISO8859"; - case DEFAULT: return "WinDefault"; - case SYMBOL: return "Symbol"; - case SHIFTJIS: return "JISX0208.1983"; - case HANGUL: return "MSHangul"; - case GB2312: return "GB2312.1980"; - case CHINESEBIG5: return "Big5"; - case GREEK: return "CP1253"; - case TURKISH: return "CP1254"; - case HEBREW: return "CP1255"; - case ARABIC: return "CP1256"; - case BALTIC: return "CP1257"; - case RUSSIAN: return "CP1251"; - case THAI: return "CP874"; - case EE: return "CP1250"; - case OEM: return "OEM"; - default: return "Unknown"; - } - } - - inline unsigned int get_version () const - { - return dfVersion; - } - - inline unsigned int get_weight () const - { - return dfWeight; - } - - enum weight_t { - DONTCARE = 0, - THIN = 100, - EXTRALIGHT = 200, - ULTRALIGHT = 200, - LIGHT = 300, - NORMAL = 400, - REGULAR = 400, - MEDIUM = 500, - SEMIBOLD = 600, - DEMIBOLD = 600, - BOLD = 700, - EXTRABOLD = 800, - ULTRABOLD = 800, - HEAVY = 900, - BLACK = 900 - }; - - inline void dump () const - { - // With https://github.com/juanitogan/mkwinfont/blob/master/python/dewinfont.py help - // Should be implemented differently eventually, but for now - unsigned int ctstart; - unsigned int ctsize; - if (dfVersion == 0x200) - { - ctstart = 0x76; - ctsize = 4; - } - else - { - return; // must of ".fon"s are version 2 and even dewinfont V1 implmentation doesn't seem correct - ctstart = 0x94; - ctsize = 6; - } - // unsigned int maxwidth = 0; - for (unsigned int i = dfFirstChar; i < dfLastChar; ++i) - { - unsigned int entry = ctstart + ctsize * (i-dfFirstChar); - unsigned int w = (uint16_t) OT::StructAtOffset (this, entry); - - unsigned int off; - if (ctsize == 4) - off = (uint16_t) OT::StructAtOffset (this, entry+2); - else - off = (uint32_t) OT::StructAtOffset (this, entry+2); - - unsigned int widthbytes = (w + 7) / 8; - for (unsigned int j = 0; j < dfPixHeight; ++j) - { - for (unsigned int k = 0; k < widthbytes; ++k) - { - unsigned int bytepos = off + k * dfPixHeight + j; - const uint8_t b = (uint8_t) OT::StructAtOffset (this, bytepos); - for (unsigned int a = 128; a > 0; a >>= 1) - printf (b & a ? "x" : "."); - } - printf ("\n"); - } - printf ("\n\n"); - } - } - - protected: - LEUINT16 dfVersion; - LEUINT32 dfSize; - LEUINT8 dfCopyright[60]; - LEUINT16 dfType; - LEUINT16 dfPoints; - LEUINT16 dfVertRes; - LEUINT16 dfHorizRes; - LEUINT16 dfAscent; - LEUINT16 dfInternalLeading; - LEUINT16 dfExternalLeading; - LEUINT8 dfItalic; - LEUINT8 dfUnderline; - LEUINT8 dfStrikeOut; - LEUINT16 dfWeight; // see weight_t - LEUINT8 dfCharSet; // see charset_t - LEUINT16 dfPixWidth; - LEUINT16 dfPixHeight; - LEUINT8 dfPitchAndFamily; - LEUINT16 dfAvgWidth; - LEUINT16 dfMaxWidth; - LEUINT8 dfFirstChar; - LEUINT8 dfLastChar; - LEUINT8 dfDefaultChar; - LEUINT8 dfBreakChar; - LEUINT16 dfWidthBytes; - LEUINT32 dfDevice; - LEUINT32 dfFace; - LEUINT32 dfBitsPointer; - LEUINT32 dfBitsOffset; - LEUINT8 dfReserved; -// LEUINT32 dfFlags; -// LEUINT16 dfAspace; -// LEUINT16 dfBspace; -// LEUINT16 dfCspace; -// LEUINT32 dfColorPointer; -// LEUINT32 dfReserved1[4]; - OT::UnsizedArrayOf - dataZ; - public: - DEFINE_SIZE_ARRAY (118, dataZ); -}; - -struct NE_NAMEINFO -{ - friend struct NE_TYPEINFO; - - inline bool sanitize (OT::hb_sanitize_context_t *c, const void *base, unsigned int shift) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - get_font (base, shift).sanitize (c, length << shift))); - } - - inline const LE_FONTINFO16& get_font (const void *base, int shift) const - { - return OT::StructAtOffset (base, offset << shift); - } - - enum resource_type_flag_t { - NONE = 0x0000, - MOVEABLE = 0x0010, - PURE = 0x0020, - PRELOAD = 0x0040 - }; - - protected: - LEUINT16 offset; // Should be shifted with alignmentShiftCount before use - LEUINT16 length; // Should be shifted with alignmentShiftCount before use - LEUINT16 flags; // resource_type_flag_t - LEUINT16 id; - LEUINT16 handle; - LEUINT16 usage; - public: - DEFINE_SIZE_STATIC (12); -}; - -struct NE_TYPEINFO -{ - inline bool sanitize (OT::hb_sanitize_context_t *c, const void *base, unsigned int shift) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && resources.sanitize (c, count, base, shift)); - } - - inline unsigned int get_size (void) const - { return 8 + count * NE_NAMEINFO::static_size; } - - inline const NE_TYPEINFO& next () const - { - const NE_TYPEINFO& next = OT::StructAfter (*this); - if (type_id == 0) - return Null(NE_TYPEINFO); - return next; - } - - inline const LE_FONTINFO16& get_font (unsigned int idx, const void *base, int shift) const - { - if (idx < count) - return resources[idx].get_font (base, shift); - return Null(LE_FONTINFO16); - } - - inline unsigned int get_count () const - { - return count; - } - - inline unsigned int get_type_id () const - { - return type_id; - } - - enum type_id_t { - CURSOR = 0x8001, - BITMAP = 0x8002, - ICON = 0x8003, - MENU = 0x8004, - DIALOG = 0x8005, - STRING = 0x8006, - FONT_DIRECTORY = 0x8007, - FONT = 0x8008, - ACCELERATOR_TABLE = 0x8009, - RESOURCE_DATA = 0x800a, - GROUP_CURSOR = 0x800c, - GROUP_ICON = 0x800e, - VERSION = 0x8010 - }; - - protected: - LEUINT16 type_id; // see type_id_t - LEUINT16 count; - LEUINT32 resloader; - OT::UnsizedArrayOf - resources; - public: - DEFINE_SIZE_ARRAY (8, resources); -}; - -struct NE_RESOURCE_TABLE -{ - inline bool sanitize (OT::hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - - if (!c->check_struct (this)) - return_trace (false); - - const NE_TYPEINFO* n = &chain; - while (n != &Null(NE_TYPEINFO) && c->check_struct (n) && n->get_type_id () != 0) - { - if (n->get_type_id () == NE_TYPEINFO::FONT) - return_trace (n->sanitize (c, base, alignmentShiftCount)); - n = &n->next(); - } - return_trace (false); - } - - inline unsigned int get_shift_value () const - { - return alignmentShiftCount; - } - - inline const NE_TYPEINFO& get_fonts_entry () const - { - const NE_TYPEINFO* n = &chain; - while (n != &Null(NE_TYPEINFO) && n->get_type_id () != 0) - { - if (n->get_type_id () == NE_TYPEINFO::FONT) - return *n; - n = &n->next(); - } - return Null(NE_TYPEINFO); - } - - protected: - LEUINT16 alignmentShiftCount; - NE_TYPEINFO chain; - // It is followed by an array of OT::ArrayOf chars; - public: - DEFINE_SIZE_MIN (2); -}; - -// https://github.com/wine-mirror/wine/blob/master/include/winnt.h#L2467 -struct LE_IMAGE_OS2_HEADER -{ - inline bool sanitize (OT::hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && (this+rsrctab).sanitize (c, base))); - } - - inline const NE_RESOURCE_TABLE& get_resource_table () const - { - if (magic != 0x454E) // Only NE containers are support for now, NE == 0x454E - return Null(NE_RESOURCE_TABLE); - return this+rsrctab; - } - - protected: - LEUINT16 magic; /* 00 NE signature 'NE' */ - LEUINT8 ver; /* 02 Linker version number */ - LEUINT8 rev; /* 03 Linker revision number */ - LEUINT16 enttab; /* 04 Offset to entry table relative to NE */ - LEUINT16 cbenttab; /* 06 Length of entry table in bytes */ - LEUINT32 crc; /* 08 Checksum */ - LEUINT16 flags; /* 0c Flags about segments in this file */ - LEUINT16 autodata; /* 0e Automatic data segment number */ - LEUINT16 heap; /* 10 Initial size of local heap */ - LEUINT16 stack; /* 12 Initial size of stack */ - LEUINT32 csip; /* 14 Initial CS:IP */ - LEUINT32 sssp; /* 18 Initial SS:SP */ - LEUINT16 cseg; /* 1c # of entries in segment table */ - LEUINT16 cmod; /* 1e # of entries in module reference tab. */ - LEUINT16 cbnrestab; /* 20 Length of nonresident-name table */ - LEUINT16 segtab; /* 22 Offset to segment table */ - OT::OffsetTo - rsrctab; /* 24 Offset to resource table */ - LEUINT16 restab; /* 26 Offset to resident-name table */ - LEUINT16 modtab; /* 28 Offset to module reference table */ - LEUINT16 imptab; /* 2a Offset to imported name table */ - LEUINT32 nrestab; /* 2c Offset to nonresident-name table */ - LEUINT16 cmovent; /* 30 # of movable entry points */ - LEUINT16 align; /* 32 Logical sector alignment shift count */ - LEUINT16 cres; /* 34 # of resource segments */ - LEUINT8 exetyp; /* 36 Flags indicating target OS */ - LEUINT8 flagsothers; /* 37 Additional information flags */ - LEUINT16 pretthunks; /* 38 Offset to return thunks */ - LEUINT16 psegrefbytes; /* 3a Offset to segment ref. bytes */ - LEUINT16 swaparea; /* 3c Reserved by Microsoft */ - LEUINT16 expver; /* 3e Expected Windows version number */ - public: - DEFINE_SIZE_STATIC (64); -}; - -struct LE_IMAGE_DOS_HEADER { - inline bool sanitize (OT::hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - get_os2_header ().sanitize (c, this))); - } - - inline const LE_IMAGE_OS2_HEADER& get_os2_header () const - { - return this+e_lfanew; - } - - protected: - LEUINT16 e_magic; // Magic number - LEUINT16 e_cblp; // Bytes on last page of file - LEUINT16 e_cp; // Pages in file - LEUINT16 e_crlc; // Relocations - LEUINT16 e_cparhdr; // Size of header in paragraphs - LEUINT16 e_minalloc; // Minimum extra paragraphs needed - LEUINT16 e_maxalloc; // Maximum extra paragraphs needed - LEUINT16 e_ss; // Initial (relative) SS value - LEUINT16 e_sp; // Initial SP value - LEUINT16 e_csum; // Checksum - LEUINT16 e_ip; // Initial IP value - LEUINT16 e_cs; // Initial (relative) CS value - LEUINT16 e_lfarlc; // File address of relocation table - LEUINT16 e_ovno; // Overlay number - LEUINT16 e_res_0; // Reserved words - LEUINT16 e_res_1; // Reserved words - LEUINT16 e_res_2; // Reserved words - LEUINT16 e_res_3; // Reserved words - LEUINT16 e_oemid; // OEM identifier (for e_oeminfo) - LEUINT16 e_oeminfo; // OEM information; e_oemid specific - LEUINT16 e_res2_0; // Reserved words - LEUINT16 e_res2_1; // Reserved words - LEUINT16 e_res2_2; // Reserved words - LEUINT16 e_res2_3; // Reserved words - LEUINT16 e_res2_4; // Reserved words - LEUINT16 e_res2_5; // Reserved words - LEUINT16 e_res2_6; // Reserved words - LEUINT16 e_res2_7; // Reserved words - LEUINT16 e_res2_8; // Reserved words - LEUINT16 e_res2_9; // Reserved words - OT::OffsetTo - e_lfanew; // File address of new exe header - public: - DEFINE_SIZE_STATIC (64); -}; - -int main (int argc, char** argv) { - hb_blob_t *blob = hb_blob_create_from_file (argv[1]); - - OT::Sanitizer sanitizer; - hb_blob_t *font_blob = sanitizer.sanitize (blob); - const LE_IMAGE_DOS_HEADER* dos_header = font_blob->as (); - - const NE_RESOURCE_TABLE &rtable = dos_header->get_os2_header ().get_resource_table (); - int shift = rtable.get_shift_value (); - const NE_TYPEINFO& entry = rtable.get_fonts_entry (); - for (unsigned int i = 0; i < entry.get_count (); ++i) - { - const LE_FONTINFO16& font = entry.get_font (i, dos_header, shift); - printf ("version: %x, weight: %d, charset: %s\n", font.get_version (), - font.get_weight (), font.get_charset ()); - // font.dump (); - } - return 0; -} diff --git a/src/dump-indic-data.cc b/src/dump-indic-data.cc index d574138..8ddc9d5 100644 --- a/src/dump-indic-data.cc +++ b/src/dump-indic-data.cc @@ -24,10 +24,10 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-ot-shape-complex-indic-private.hh" +#include "hb-ot-shape-complex-indic.hh" int -main (void) +main () { for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) { diff --git a/src/dump-khmer-data.cc b/src/dump-khmer-data.cc index 7dd09b2..cffbb92 100644 --- a/src/dump-khmer-data.cc +++ b/src/dump-khmer-data.cc @@ -24,20 +24,18 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-ot-shape-complex-khmer-private.hh" +#include "hb-ot-shape-complex-khmer.hh" int -main (void) +main () { for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) { hb_glyph_info_t info; info.codepoint = u; set_khmer_properties (info); - if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER || - info.khmer_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE) - printf("U+%04X %u %u\n", u, - info.khmer_category(), - info.khmer_position()); + if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER) + printf("U+%04X %u\n", u, + info.khmer_category()); } } diff --git a/src/dump-myanmar-data.cc b/src/dump-myanmar-data.cc index 2df9cd9..c1a303f 100644 --- a/src/dump-myanmar-data.cc +++ b/src/dump-myanmar-data.cc @@ -24,10 +24,10 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-ot-shape-complex-myanmar-private.hh" +#include "hb-ot-shape-complex-myanmar.hh" int -main (void) +main () { for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) { diff --git a/src/dump-use-data.cc b/src/dump-use-data.cc index 0e64688..d639426 100644 --- a/src/dump-use-data.cc +++ b/src/dump-use-data.cc @@ -24,10 +24,10 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-ot-shape-complex-use-private.hh" +#include "hb-ot-shape-complex-use.hh" int -main (void) +main () { for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++) { diff --git a/src/gen-def.py b/src/gen-def.py index 9a997d6..9111c69 100755 --- a/src/gen-def.py +++ b/src/gen-def.py @@ -4,16 +4,21 @@ from __future__ import print_function, division, absolute_import import io, os, re, sys +if len (sys.argv) < 3: + sys.exit("usage: gen-def.py harfbuzz.def hb.h [hb-blob.h hb-buffer.h ...]") + +output_file = sys.argv[1] +header_paths = sys.argv[2:] + headers_content = [] -for h in os.environ["headers"].split (' '): +for h in header_paths: if h.endswith (".h"): with io.open (h, encoding='utf-8') as f: headers_content.append (f.read ()) -result = """EXPORTS +symbols = "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))) + +result = symbols if os.environ.get('PLAIN_LIST', '') else """EXPORTS %s -LIBRARY lib%s-0.dll""" % ( - "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))), - sys.argv[1].replace ('.def', '') -) +LIBRARY lib%s-0.dll""" % (symbols, output_file.replace ('.def', '')) -with open (sys.argv[1], "w") as f: f.write (result) +with open (output_file, "w") as f: f.write (result) diff --git a/src/gen-emoji-table.py b/src/gen-emoji-table.py new file mode 100755 index 0000000..9afe747 --- /dev/null +++ b/src/gen-emoji-table.py @@ -0,0 +1,67 @@ +#!/usr/bin/python + +from __future__ import print_function, division, absolute_import +import sys +import os.path +from collections import OrderedDict + +if len (sys.argv) != 2: + print("usage: ./gen-emoji-table.py emoji-data.txt", file=sys.stderr) + sys.exit (1) + +f = open(sys.argv[1]) +header = [f.readline () for _ in range(10)] + +ranges = OrderedDict() +for line in f.readlines(): + line = line.strip() + if not line or line[0] == '#': + continue + rang, typ = [s.strip() for s in line.split('#')[0].split(';')[:2]] + + rang = [int(s, 16) for s in rang.split('..')] + if len(rang) > 1: + start, end = rang + else: + start = end = rang[0] + + if typ not in ranges: + ranges[typ] = [] + if ranges[typ] and ranges[typ][-1][1] == start - 1: + ranges[typ][-1] = (ranges[typ][-1][0], end) + else: + ranges[typ].append((start, end)) + + + +print ("/* == Start of generated table == */") +print ("/*") +print (" * The following tables are generated by running:") +print (" *") +print (" * ./gen-emoji-table.py emoji-data.txt") +print (" *") +print (" * on file with this header:") +print (" *") +for l in header: + print (" * %s" % (l.strip())) +print (" */") +print () +print ("#ifndef HB_UNICODE_EMOJI_TABLE_HH") +print ("#define HB_UNICODE_EMOJI_TABLE_HH") +print () +print ('#include "hb-unicode.hh"') +print () + +for typ,s in ranges.items(): + if typ != "Extended_Pictographic": continue + print() + print("static const struct hb_unicode_range_t _hb_unicode_emoji_%s_table[] =" % typ) + print("{") + for pair in sorted(s): + print(" {0x%04X, 0x%04X}," % pair) + print("};") + +print () +print ("#endif /* HB_UNICODE_EMOJI_TABLE_HH */") +print () +print ("/* == End of generated table == */") diff --git a/src/gen-indic-table.py b/src/gen-indic-table.py index 6252664..6532ee7 100755 --- a/src/gen-indic-table.py +++ b/src/gen-indic-table.py @@ -102,7 +102,7 @@ for h in headers: print (" * %s" % (l.strip())) print (" */") print () -print ('#include "hb-ot-shape-complex-indic-private.hh"') +print ('#include "hb-ot-shape-complex-indic.hh"') print () # Shorten values @@ -131,6 +131,8 @@ for i in range (2): what = ["INDIC_SYLLABIC_CATEGORY", "INDIC_MATRA_CATEGORY"] what_short = ["ISC", "IMC"] +print ('#pragma GCC diagnostic push') +print ('#pragma GCC diagnostic ignored "-Wunused-macros"') for i in range (2): print () vv = sorted (values[i].keys ()) @@ -148,6 +150,7 @@ for i in range (2): (what_short[i], s, what[i], v.upper (), ' '* ((48-1 - len (what[i]) - 1 - len (v)) // 8), values[i][v], v)) +print ('#pragma GCC diagnostic pop') print () print ("#define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)") print () diff --git a/src/gen-os2-unicode-ranges.py b/src/gen-os2-unicode-ranges.py new file mode 100644 index 0000000..8cf5985 --- /dev/null +++ b/src/gen-os2-unicode-ranges.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +# Generates the code for a sorted unicode range array as used in hb-ot-os2-unicode-ranges.hh +# Input is a tab seperated list of unicode ranges from the otspec +# (https://docs.microsoft.com/en-us/typography/opentype/spec/os2#ulunicoderange1). + +from __future__ import print_function, division, absolute_import + +import io +import re +import sys + +try: + reload(sys) + sys.setdefaultencoding('utf-8') +except NameError: + pass # Python 3 + +print ("""static OS2Range _hb_os2_unicode_ranges[] = +{""") + +args = sys.argv[1:] +input_file = args[0] + +with io.open(input_file, mode="r", encoding="utf-8") as f: + + all_ranges = []; + current_bit = 0 + while True: + line = f.readline().strip() + if not line: + break + fields = re.split(r'\t+', line) + if len(fields) == 3: + current_bit = fields[0] + fields = fields[1:] + elif len(fields) > 3: + raise Exception("bad input :(.") + + name = fields[0] + ranges = re.split("-", fields[1]) + if len(ranges) != 2: + raise Exception("bad input :(.") + + v = tuple((int(ranges[0], 16), int(ranges[1], 16), int(current_bit), name)) + all_ranges.append(v) + +all_ranges = sorted(all_ranges, key=lambda t: t[0]) + +for ranges in all_ranges: + start = ("0x%X" % ranges[0]).rjust(8) + end = ("0x%X" % ranges[1]).rjust(8) + bit = ("%s" % ranges[2]).rjust(3) + + print (" {%s, %s, %s}, // %s" % (start, end, bit, ranges[3])) + +print ("""};""") diff --git a/src/gen-tag-table.py b/src/gen-tag-table.py new file mode 100755 index 0000000..1300462 --- /dev/null +++ b/src/gen-tag-table.py @@ -0,0 +1,1126 @@ +#!/usr/bin/python + +"""Generator of the mapping from OpenType tags to BCP 47 tags and vice +versa. + +It creates a ``const LangTag[]``, matching the tags from the OpenType +languages system tag list to the language subtags of the BCP 47 language +subtag registry, with some manual adjustments. The mappings are +supplemented with macrolanguages' sublanguages and retired codes' +replacements, according to BCP 47 and some manual additions where BCP 47 +omits a retired code entirely. + +Also generated is a function, ``hb_ot_ambiguous_tag_to_language``, +intended for use by ``hb_ot_tag_to_language``. It maps OpenType tags +back to BCP 47 tags. Ambiguous OpenType tags (those that correspond to +multiple BCP 47 tags) are listed here, except when the alphabetically +first BCP 47 tag happens to be the chosen disambiguated tag. In that +case, the fallback behavior will choose the right tag anyway. +""" + +from __future__ import absolute_import, division, print_function, unicode_literals + +import collections +try: + from HTMLParser import HTMLParser + def write (s): + print (s.encode ('utf-8'), end='') +except ImportError: + from html.parser import HTMLParser + def write (s): + sys.stdout.flush () + sys.stdout.buffer.write (s.encode ('utf-8')) +import io +import itertools +import re +import sys +import unicodedata + +if len (sys.argv) != 3: + print ('usage: ./gen-tag-table.py languagetags language-subtag-registry', file=sys.stderr) + sys.exit (1) + +try: + from html import unescape + def html_unescape (parser, entity): + return unescape (entity) +except ImportError: + def html_unescape (parser, entity): + return parser.unescape (entity) + +def expect (condition, message=None): + if not condition: + if message is None: + raise AssertionError + raise AssertionError (message) + +# from http://www-01.sil.org/iso639-3/iso-639-3.tab +ISO_639_3_TO_1 = { + 'aar': 'aa', + 'abk': 'ab', + 'afr': 'af', + 'aka': 'ak', + 'amh': 'am', + 'ara': 'ar', + 'arg': 'an', + 'asm': 'as', + 'ava': 'av', + 'ave': 'ae', + 'aym': 'ay', + 'aze': 'az', + 'bak': 'ba', + 'bam': 'bm', + 'bel': 'be', + 'ben': 'bn', + 'bis': 'bi', + 'bod': 'bo', + 'bos': 'bs', + 'bre': 'br', + 'bul': 'bg', + 'cat': 'ca', + 'ces': 'cs', + 'cha': 'ch', + 'che': 'ce', + 'chu': 'cu', + 'chv': 'cv', + 'cor': 'kw', + 'cos': 'co', + 'cre': 'cr', + 'cym': 'cy', + 'dan': 'da', + 'deu': 'de', + 'div': 'dv', + 'dzo': 'dz', + 'ell': 'el', + 'eng': 'en', + 'epo': 'eo', + 'est': 'et', + 'eus': 'eu', + 'ewe': 'ee', + 'fao': 'fo', + 'fas': 'fa', + 'fij': 'fj', + 'fin': 'fi', + 'fra': 'fr', + 'fry': 'fy', + 'ful': 'ff', + 'gla': 'gd', + 'gle': 'ga', + 'glg': 'gl', + 'glv': 'gv', + 'grn': 'gn', + 'guj': 'gu', + 'hat': 'ht', + 'hau': 'ha', + 'hbs': 'sh', + 'heb': 'he', + 'her': 'hz', + 'hin': 'hi', + 'hmo': 'ho', + 'hrv': 'hr', + 'hun': 'hu', + 'hye': 'hy', + 'ibo': 'ig', + 'ido': 'io', + 'iii': 'ii', + 'iku': 'iu', + 'ile': 'ie', + 'ina': 'ia', + 'ind': 'id', + 'ipk': 'ik', + 'isl': 'is', + 'ita': 'it', + 'jav': 'jv', + 'jpn': 'ja', + 'kal': 'kl', + 'kan': 'kn', + 'kas': 'ks', + 'kat': 'ka', + 'kau': 'kr', + 'kaz': 'kk', + 'khm': 'km', + 'kik': 'ki', + 'kin': 'rw', + 'kir': 'ky', + 'kom': 'kv', + 'kon': 'kg', + 'kor': 'ko', + 'kua': 'kj', + 'kur': 'ku', + 'lao': 'lo', + 'lat': 'la', + 'lav': 'lv', + 'lim': 'li', + 'lin': 'ln', + 'lit': 'lt', + 'ltz': 'lb', + 'lub': 'lu', + 'lug': 'lg', + 'mah': 'mh', + 'mal': 'ml', + 'mar': 'mr', + 'mkd': 'mk', + 'mlg': 'mg', + 'mlt': 'mt', + 'mol': 'mo', + 'mon': 'mn', + 'mri': 'mi', + 'msa': 'ms', + 'mya': 'my', + 'nau': 'na', + 'nav': 'nv', + 'nbl': 'nr', + 'nde': 'nd', + 'ndo': 'ng', + 'nep': 'ne', + 'nld': 'nl', + 'nno': 'nn', + 'nob': 'nb', + 'nor': 'no', + 'nya': 'ny', + 'oci': 'oc', + 'oji': 'oj', + 'ori': 'or', + 'orm': 'om', + 'oss': 'os', + 'pan': 'pa', + 'pli': 'pi', + 'pol': 'pl', + 'por': 'pt', + 'pus': 'ps', + 'que': 'qu', + 'roh': 'rm', + 'ron': 'ro', + 'run': 'rn', + 'rus': 'ru', + 'sag': 'sg', + 'san': 'sa', + 'sin': 'si', + 'slk': 'sk', + 'slv': 'sl', + 'sme': 'se', + 'smo': 'sm', + 'sna': 'sn', + 'snd': 'sd', + 'som': 'so', + 'sot': 'st', + 'spa': 'es', + 'sqi': 'sq', + 'srd': 'sc', + 'srp': 'sr', + 'ssw': 'ss', + 'sun': 'su', + 'swa': 'sw', + 'swe': 'sv', + 'tah': 'ty', + 'tam': 'ta', + 'tat': 'tt', + 'tel': 'te', + 'tgk': 'tg', + 'tgl': 'tl', + 'tha': 'th', + 'tir': 'ti', + 'ton': 'to', + 'tsn': 'tn', + 'tso': 'ts', + 'tuk': 'tk', + 'tur': 'tr', + 'twi': 'tw', + 'uig': 'ug', + 'ukr': 'uk', + 'urd': 'ur', + 'uzb': 'uz', + 'ven': 've', + 'vie': 'vi', + 'vol': 'vo', + 'wln': 'wa', + 'wol': 'wo', + 'xho': 'xh', + 'yid': 'yi', + 'yor': 'yo', + 'zha': 'za', + 'zho': 'zh', + 'zul': 'zu', +} + +class LanguageTag (object): + """A BCP 47 language tag. + + Attributes: + subtags (List[str]): The list of subtags in this tag. + grandfathered (bool): Whether this tag is grandfathered. If + ``true``, the entire lowercased tag is the ``language`` + and the other subtag fields are empty. + language (str): The language subtag. + script (str): The script subtag. + region (str): The region subtag. + variant (str): The variant subtag. + + Args: + tag (str): A BCP 47 language tag. + + """ + def __init__ (self, tag): + global bcp_47 + self.subtags = tag.lower ().split ('-') + self.grandfathered = tag.lower () in bcp_47.grandfathered + if self.grandfathered: + self.language = tag.lower () + self.script = '' + self.region = '' + self.variant = '' + else: + self.language = self.subtags[0] + self.script = self._find_first (lambda s: len (s) == 4 and s[0] > '9', self.subtags) + self.region = self._find_first (lambda s: len (s) == 2 and s[0] > '9' or len (s) == 3 and s[0] <= '9', self.subtags[1:]) + self.variant = self._find_first (lambda s: len (s) > 4 or len (s) == 4 and s[0] <= '9', self.subtags) + + def __str__(self): + return '-'.join(self.subtags) + + def __repr__ (self): + return 'LanguageTag(%r)' % str(self) + + @staticmethod + def _find_first (function, sequence): + try: + return next (iter (filter (function, sequence))) + except StopIteration: + return None + + def is_complex (self): + """Return whether this tag is too complex to represent as a + ``LangTag`` in the generated code. + + Complex tags need to be handled in + ``hb_ot_tags_from_complex_language``. + + Returns: + Whether this tag is complex. + """ + return not (len (self.subtags) == 1 + or self.grandfathered + and len (self.subtags[1]) != 3 + and ot.from_bcp_47[self.subtags[0]] == ot.from_bcp_47[self.language]) + + def get_group (self): + """Return the group into which this tag should be categorized in + ``hb_ot_tags_from_complex_language``. + + The group is the first letter of the tag, or ``'und'`` if this tag + should not be matched in a ``switch`` statement in the generated + code. + + Returns: + This tag's group. + """ + return ('und' + if (self.language == 'und' + or self.variant in bcp_47.prefixes and len (bcp_47.prefixes[self.variant]) == 1) + else self.language[0]) + +class OpenTypeRegistryParser (HTMLParser): + """A parser for the OpenType language system tag registry. + + Attributes: + header (str): The "last updated" line of the registry. + names (Mapping[str, str]): A map of language system tags to the + names they are given in the registry. + ranks (DefaultDict[str, int]): A map of language system tags to + numbers. If a single BCP 47 tag corresponds to multiple + OpenType tags, the tags are ordered in increasing order by + rank. The rank is based on the number of BCP 47 tags + associated with a tag, though it may be manually modified. + to_bcp_47 (DefaultDict[str, AbstractSet[str]]): A map of + OpenType language system tags to sets of BCP 47 tags. + from_bcp_47 (DefaultDict[str, AbstractSet[str]]): ``to_bcp_47`` + inverted. Its values start as unsorted sets; + ``sort_languages`` converts them to sorted lists. + + """ + def __init__ (self): + HTMLParser.__init__ (self) + self.header = '' + self.names = {} + self.ranks = collections.defaultdict (int) + self.to_bcp_47 = collections.defaultdict (set) + self.from_bcp_47 = collections.defaultdict (set) + # Whether the parser is in a element + self._td = False + # The text of the elements of the current element. + self._current_tr = [] + + def handle_starttag (self, tag, attrs): + if tag == 'meta': + for attr, value in attrs: + if attr == 'name' and value == 'updated_at': + self.header = self.get_starttag_text () + break + elif tag == 'td': + self._td = True + self._current_tr.append ('') + elif tag == 'tr': + self._current_tr = [] + + def handle_endtag (self, tag): + if tag == 'td': + self._td = False + elif tag == 'tr' and self._current_tr: + expect (2 <= len (self._current_tr) <= 3) + name = self._current_tr[0].strip () + tag = self._current_tr[1].strip ("\t\n\v\f\r '") + rank = 0 + if len (tag) > 4: + expect (tag.endswith (' (deprecated)'), 'ill-formed OpenType tag: %s' % tag) + name += ' (deprecated)' + tag = tag.split (' ')[0] + rank = 1 + self.names[tag] = re.sub (' languages$', '', name) + if not self._current_tr[2]: + return + iso_codes = self._current_tr[2].strip () + self.to_bcp_47[tag].update (ISO_639_3_TO_1.get (code, code) for code in iso_codes.replace (' ', '').split (',')) + rank += 2 * len (self.to_bcp_47[tag]) + self.ranks[tag] = rank + + def handle_data (self, data): + if self._td: + self._current_tr[-1] += data + + def handle_charref (self, name): + self.handle_data (html_unescape (self, '&#%s;' % name)) + + def handle_entityref (self, name): + self.handle_data (html_unescape (self, '&%s;' % name)) + + def parse (self, filename): + """Parse the OpenType language system tag registry. + + Args: + filename (str): The file name of the registry. + """ + with io.open (filename, encoding='utf-8') as f: + self.feed (f.read ()) + expect (self.header) + for tag, iso_codes in self.to_bcp_47.items (): + for iso_code in iso_codes: + self.from_bcp_47[iso_code].add (tag) + + def add_language (self, bcp_47_tag, ot_tag): + """Add a language as if it were in the registry. + + Args: + bcp_47_tag (str): A BCP 47 tag. If the tag is more than just + a language subtag, and if the language subtag is a + macrolanguage, then new languages are added corresponding + to the macrolanguages' individual languages with the + remainder of the tag appended. + ot_tag (str): An OpenType language system tag. + """ + global bcp_47 + self.to_bcp_47[ot_tag].add (bcp_47_tag) + self.from_bcp_47[bcp_47_tag].add (ot_tag) + if bcp_47_tag.lower () not in bcp_47.grandfathered: + try: + [macrolanguage, suffix] = bcp_47_tag.split ('-', 1) + if macrolanguage in bcp_47.macrolanguages: + s = set () + for language in bcp_47.macrolanguages[macrolanguage]: + if language.lower () not in bcp_47.grandfathered: + s.add ('%s-%s' % (language, suffix)) + bcp_47.macrolanguages['%s-%s' % (macrolanguage, suffix)] = s + except ValueError: + pass + + @staticmethod + def _remove_language (tag_1, dict_1, dict_2): + for tag_2 in dict_1.pop (tag_1): + dict_2[tag_2].remove (tag_1) + if not dict_2[tag_2]: + del dict_2[tag_2] + + def remove_language_ot (self, ot_tag): + """Remove an OpenType tag from the registry. + + Args: + ot_tag (str): An OpenType tag. + """ + self._remove_language (ot_tag, self.to_bcp_47, self.from_bcp_47) + + def remove_language_bcp_47 (self, bcp_47_tag): + """Remove a BCP 47 tag from the registry. + + Args: + bcp_47_tag (str): A BCP 47 tag. + """ + self._remove_language (bcp_47_tag, self.from_bcp_47, self.to_bcp_47) + + def inherit_from_macrolanguages (self): + """Copy mappings from macrolanguages to individual languages. + + If a BCP 47 tag for an individual mapping has no OpenType + mapping but its macrolanguage does, the mapping is copied to + the individual language. For example, als (Tosk Albanian) has no + explicit mapping, so it inherits from sq (Albanian) the mapping + to SQI. + + If a BCP 47 tag for a macrolanguage has no OpenType mapping but + all of its individual languages do and they all map to the same + tags, the mapping is copied to the macrolanguage. + """ + global bcp_47 + original_ot_from_bcp_47 = dict (self.from_bcp_47) + for macrolanguage, languages in dict (bcp_47.macrolanguages).items (): + ot_macrolanguages = set (original_ot_from_bcp_47.get (macrolanguage, set ())) + if ot_macrolanguages: + for ot_macrolanguage in ot_macrolanguages: + for language in languages: + # Remove the following condition if e.g. nn should map to NYN,NOR + # instead of just NYN. + if language not in original_ot_from_bcp_47: + self.add_language (language, ot_macrolanguage) + self.ranks[ot_macrolanguage] += 1 + else: + for language in languages: + if language in original_ot_from_bcp_47: + if ot_macrolanguages: + ml = original_ot_from_bcp_47[language] + if ml: + ot_macrolanguages &= ml + else: + pass + else: + ot_macrolanguages |= original_ot_from_bcp_47[language] + else: + ot_macrolanguages.clear () + if not ot_macrolanguages: + break + for ot_macrolanguage in ot_macrolanguages: + self.add_language (macrolanguage, ot_macrolanguage) + + def sort_languages (self): + """Sort the values of ``from_bcp_47`` in ascending rank order.""" + for language, tags in self.from_bcp_47.items (): + self.from_bcp_47[language] = sorted (tags, + key=lambda t: (self.ranks[t] + rank_delta (language, t), t)) + +ot = OpenTypeRegistryParser () + +class BCP47Parser (object): + """A parser for the BCP 47 subtag registry. + + Attributes: + header (str): The "File-Date" line of the registry. + names (Mapping[str, str]): A map of subtags to the names they + are given in the registry. Each value is a + ``'\\n'``-separated list of names. + scopes (Mapping[str, str]): A map of language subtags to strings + suffixed to language names, including suffixes to explain + language scopes. + macrolanguages (DefaultDict[str, AbstractSet[str]]): A map of + language subtags to the sets of language subtags which + inherit from them. See + ``OpenTypeRegistryParser.inherit_from_macrolanguages``. + prefixes (DefaultDict[str, AbstractSet[str]]): A map of variant + subtags to their prefixes. + grandfathered (AbstractSet[str]): The set of grandfathered tags, + normalized to lowercase. + + """ + def __init__ (self): + self.header = '' + self.names = {} + self.scopes = {} + self.macrolanguages = collections.defaultdict (set) + self.prefixes = collections.defaultdict (set) + self.grandfathered = set () + + def parse (self, filename): + """Parse the BCP 47 subtag registry. + + Args: + filename (str): The file name of the registry. + """ + with io.open (filename, encoding='utf-8') as f: + subtag_type = None + subtag = None + deprecated = False + has_preferred_value = False + line_buffer = '' + for line in itertools.chain (f, ['']): + line = line.rstrip () + if line.startswith (' '): + line_buffer += line[1:] + continue + line, line_buffer = line_buffer, line + if line.startswith ('Type: '): + subtag_type = line.split (' ')[1] + deprecated = False + has_preferred_value = False + elif line.startswith ('Subtag: ') or line.startswith ('Tag: '): + subtag = line.split (' ')[1] + if subtag_type == 'grandfathered': + self.grandfathered.add (subtag.lower ()) + elif line.startswith ('Description: '): + description = line.split (' ', 1)[1].replace (' (individual language)', '') + description = re.sub (' (\((individual |macro)language\)|languages)$', '', + description) + if subtag in self.names: + self.names[subtag] += '\n' + description + else: + self.names[subtag] = description + elif subtag_type == 'language' or subtag_type == 'grandfathered': + if line.startswith ('Scope: '): + scope = line.split (' ')[1] + if scope == 'macrolanguage': + scope = ' [macrolanguage]' + elif scope == 'collection': + scope = ' [family]' + else: + continue + self.scopes[subtag] = scope + elif line.startswith ('Deprecated: '): + self.scopes[subtag] = ' (retired code)' + self.scopes.get (subtag, '') + deprecated = True + elif deprecated and line.startswith ('Comments: see '): + # If a subtag is split into multiple replacement subtags, + # it essentially represents a macrolanguage. + for language in line.replace (',', '').split (' ')[2:]: + self._add_macrolanguage (subtag, language) + elif line.startswith ('Preferred-Value: '): + # If a subtag is deprecated in favor of a single replacement subtag, + # it is either a dialect or synonym of the preferred subtag. Either + # way, it is close enough to the truth to consider the replacement + # the macrolanguage of the deprecated language. + has_preferred_value = True + macrolanguage = line.split (' ')[1] + self._add_macrolanguage (macrolanguage, subtag) + elif not has_preferred_value and line.startswith ('Macrolanguage: '): + self._add_macrolanguage (line.split (' ')[1], subtag) + elif subtag_type == 'variant': + if line.startswith ('Prefix: '): + self.prefixes[subtag].add (line.split (' ')[1]) + elif line.startswith ('File-Date: '): + self.header = line + expect (self.header) + + def _add_macrolanguage (self, macrolanguage, language): + global ot + if language not in ot.from_bcp_47: + for l in self.macrolanguages.get (language, set ()): + self._add_macrolanguage (macrolanguage, l) + if macrolanguage not in ot.from_bcp_47: + for ls in list (self.macrolanguages.values ()): + if macrolanguage in ls: + ls.add (language) + return + self.macrolanguages[macrolanguage].add (language) + + def remove_extra_macrolanguages (self): + """Make every language have at most one macrolanguage.""" + inverted = collections.defaultdict (list) + for macrolanguage, languages in self.macrolanguages.items (): + for language in languages: + inverted[language].append (macrolanguage) + for language, macrolanguages in inverted.items (): + if len (macrolanguages) > 1: + macrolanguages.sort (key=lambda ml: len (self.macrolanguages[ml])) + biggest_macrolanguage = macrolanguages.pop () + for macrolanguage in macrolanguages: + self._add_macrolanguage (biggest_macrolanguage, macrolanguage) + + def get_name (self, lt): + """Return the names of the subtags in a language tag. + + Args: + lt (LanguageTag): A BCP 47 language tag. + + Returns: + The name form of ``lt``. + """ + name = self.names[lt.language].split ('\n')[0] + if lt.script: + name += '; ' + self.names[lt.script.title ()].split ('\n')[0] + if lt.region: + name += '; ' + self.names[lt.region.upper ()].split ('\n')[0] + if lt.variant: + name += '; ' + self.names[lt.variant].split ('\n')[0] + return name + +bcp_47 = BCP47Parser () + +ot.parse (sys.argv[1]) +bcp_47.parse (sys.argv[2]) + +ot.add_language ('ary', 'MOR') + +ot.add_language ('ath', 'ATH') + +ot.add_language ('bai', 'BML') + +ot.ranks['BAL'] = ot.ranks['KAR'] + 1 + +ot.add_language ('ber', 'BBR') + +ot.remove_language_ot ('PGR') +ot.add_language ('el-polyton', 'PGR') + +bcp_47.macrolanguages['et'] = {'ekk'} + +bcp_47.names['flm'] = 'Falam Chin' +bcp_47.scopes['flm'] = ' (retired code)' +bcp_47.macrolanguages['flm'] = {'cfm'} + +ot.ranks['FNE'] = ot.ranks['TNE'] + 1 + +ot.add_language ('und-fonipa', 'IPPH') + +ot.add_language ('und-fonnapa', 'APPH') + +ot.remove_language_ot ('IRT') +ot.add_language ('ga-Latg', 'IRT') + +ot.remove_language_ot ('KGE') +ot.add_language ('und-Geok', 'KGE') + +ot.add_language ('guk', 'GUK') +ot.names['GUK'] = 'Gumuz (SIL fonts)' +ot.ranks['GUK'] = ot.ranks['GMZ'] + 1 + +bcp_47.macrolanguages['id'] = {'in'} + +bcp_47.macrolanguages['ijo'] = {'ijc'} + +ot.add_language ('kht', 'KHN') +ot.names['KHN'] = ot.names['KHT'] + ' (Microsoft fonts)' +ot.names['KHT'] = ot.names['KHT'] + ' (OpenType spec and SIL fonts)' +ot.ranks['KHN'] = ot.ranks['KHT'] +ot.ranks['KHT'] += 1 + +ot.ranks['LCR'] = ot.ranks['MCR'] + 1 + +ot.names['MAL'] = 'Malayalam Traditional' +ot.ranks['MLR'] += 1 + +bcp_47.names['mhv'] = 'Arakanese' +bcp_47.scopes['mhv'] = ' (retired code)' + +ot.add_language ('no', 'NOR') + +ot.add_language ('oc-provenc', 'PRO') + +ot.add_language ('qu', 'QUZ') +ot.add_language ('qub', 'QWH') +ot.add_language ('qud', 'QVI') +ot.add_language ('qug', 'QVI') +ot.add_language ('qup', 'QVI') +ot.add_language ('qur', 'QWH') +ot.add_language ('qus', 'QUH') +ot.add_language ('quw', 'QVI') +ot.add_language ('qux', 'QWH') +ot.add_language ('qva', 'QWH') +ot.add_language ('qvh', 'QWH') +ot.add_language ('qvj', 'QVI') +ot.add_language ('qvl', 'QWH') +ot.add_language ('qvm', 'QWH') +ot.add_language ('qvn', 'QWH') +ot.add_language ('qvo', 'QVI') +ot.add_language ('qvp', 'QWH') +ot.add_language ('qvw', 'QWH') +ot.add_language ('qvz', 'QVI') +ot.add_language ('qwa', 'QWH') +ot.add_language ('qws', 'QWH') +ot.add_language ('qxa', 'QWH') +ot.add_language ('qxc', 'QWH') +ot.add_language ('qxh', 'QWH') +ot.add_language ('qxl', 'QVI') +ot.add_language ('qxn', 'QWH') +ot.add_language ('qxo', 'QWH') +ot.add_language ('qxr', 'QVI') +ot.add_language ('qxt', 'QWH') +ot.add_language ('qxw', 'QWH') + +bcp_47.macrolanguages['ro'].remove ('mo') +bcp_47.macrolanguages['ro-MD'].add ('mo') + +ot.add_language ('sgw', 'SGW') +ot.names['SGW'] = ot.names['CHG'] + ' (SIL fonts)' +ot.ranks['SGW'] = ot.ranks['CHG'] + 1 + +ot.remove_language_ot ('SYRE') +ot.remove_language_ot ('SYRJ') +ot.remove_language_ot ('SYRN') +ot.add_language ('und-Syre', 'SYRE') +ot.add_language ('und-Syrj', 'SYRJ') +ot.add_language ('und-Syrn', 'SYRN') + +bcp_47.names['xst'] = u"Silt'e" +bcp_47.scopes['xst'] = ' (retired code)' +bcp_47.macrolanguages['xst'] = {'stv', 'wle'} + +ot.add_language ('xwo', 'TOD') + +ot.remove_language_ot ('ZHH') +ot.remove_language_ot ('ZHP') +ot.remove_language_ot ('ZHT') +bcp_47.macrolanguages['zh'].remove ('lzh') +bcp_47.macrolanguages['zh'].remove ('yue') +ot.add_language ('zh-Hant-MO', 'ZHH') +ot.add_language ('zh-Hant-HK', 'ZHH') +ot.add_language ('zh-Hans', 'ZHS') +ot.add_language ('zh-Hant', 'ZHT') +ot.add_language ('zh-HK', 'ZHH') +ot.add_language ('zh-MO', 'ZHH') +ot.add_language ('zh-TW', 'ZHT') +ot.add_language ('lzh', 'ZHT') +ot.add_language ('lzh-Hans', 'ZHS') +ot.add_language ('yue', 'ZHH') +ot.add_language ('yue-Hans', 'ZHS') + +bcp_47.macrolanguages['zom'] = {'yos'} + +def rank_delta (bcp_47, ot): + """Return a delta to apply to a BCP 47 tag's rank. + + Most OpenType tags have a constant rank, but a few have ranks that + depend on the BCP 47 tag. + + Args: + bcp_47 (str): A BCP 47 tag. + ot (str): An OpenType tag to. + + Returns: + A number to add to ``ot``'s rank when sorting ``bcp_47``'s + OpenType equivalents. + """ + if bcp_47 == 'ak' and ot == 'AKA': + return -1 + if bcp_47 == 'tw' and ot == 'TWI': + return -1 + return 0 + +disambiguation = { + 'ALT': 'alt', + 'ARK': 'rki', + 'BHI': 'bhb', + 'BLN': 'bjt', + 'BTI': 'beb', + 'CCHN': 'cco', + 'CMR': 'swb', + 'CPP': 'crp', + 'CRR': 'crx', + 'DUJ': 'dwu', + 'ECR': 'crj', + 'HAL': 'cfm', + 'HND': 'hnd', + 'KIS': 'kqs', + 'LRC': 'bqi', + 'NDB': 'nd', + 'NIS': 'njz', + 'PLG': 'pce', + 'PRO': 'pro', + 'QIN': 'bgr', + 'QUH': 'quh', + 'QVI': 'qvi', + 'QWH': 'qwh', + 'SIG': 'stv', + 'TNE': 'yrk', + 'ZHH': 'zh-HK', + 'ZHS': 'zh-Hans', + 'ZHT': 'zh-Hant', +} + +ot.inherit_from_macrolanguages () +bcp_47.remove_extra_macrolanguages () +ot.inherit_from_macrolanguages () +ot.sort_languages () + +print ('/* == Start of generated table == */') +print ('/*') +print (' * The following table is generated by running:') +print (' *') +print (' * %s languagetags language-subtag-registry' % sys.argv[0]) +print (' *') +print (' * on files with these headers:') +print (' *') +print (' * %s' % ot.header.strip ()) +print (' * %s' % bcp_47.header) +print (' */') +print () +print ('#ifndef HB_OT_TAG_TABLE_HH') +print ('#define HB_OT_TAG_TABLE_HH') +print () +print ('static const LangTag ot_languages[] = {') + +def hb_tag (tag): + """Convert a tag to ``HB_TAG`` form. + + Args: + tag (str): An OpenType tag. + + Returns: + A snippet of C++ representing ``tag``. + """ + return u"HB_TAG('%s','%s','%s','%s')" % tuple (('%-4s' % tag)[:4]) + +def get_variant_set (name): + """Return a set of variant language names from a name. + + Args: + name (str): A list of language names from the BCP 47 registry, + joined on ``'\\n'``. + + Returns: + A set of normalized language names. + """ + return set (unicodedata.normalize ('NFD', n.replace ('\u2019', u"'")) + .encode ('ASCII', 'ignore') + .strip () + for n in re.split ('[\n(),]', name) if n) + +def language_name_intersection (a, b): + """Return the names in common between two language names. + + Args: + a (str): A list of language names from the BCP 47 registry, + joined on ``'\\n'``. + b (str): A list of language names from the BCP 47 registry, + joined on ``'\\n'``. + + Returns: + The normalized language names shared by ``a`` and ``b``. + """ + return get_variant_set (a).intersection (get_variant_set (b)) + +def get_matching_language_name (intersection, candidates): + return next (iter (c for c in candidates if not intersection.isdisjoint (get_variant_set (c)))) + +maximum_tags = 0 +for language, tags in sorted (ot.from_bcp_47.items ()): + if language == '' or '-' in language: + continue + print (' {\"%s\",\t{' % language, end='') + maximum_tags = max (maximum_tags, len (tags)) + tag_count = len (tags) + for i, tag in enumerate (tags, start=1): + if i > 1: + print ('\t\t ', end='') + print (hb_tag (tag), end='') + if i == tag_count: + print ('}}', end='') + print (',\t/* ', end='') + bcp_47_name = bcp_47.names.get (language, '') + bcp_47_name_candidates = bcp_47_name.split ('\n') + intersection = language_name_intersection (bcp_47_name, ot.names[tag]) + scope = bcp_47.scopes.get (language, '') + if not intersection: + write ('%s%s -> %s' % (bcp_47_name_candidates[0], scope, ot.names[tag])) + else: + name = get_matching_language_name (intersection, bcp_47_name_candidates) + bcp_47.names[language] = name + write ('%s%s' % (name if len (name) > len (ot.names[tag]) else ot.names[tag], scope)) + print (' */') + +print ('};') +print () +print ('static_assert (HB_OT_MAX_TAGS_PER_LANGUAGE == %iu, "");' % maximum_tags) +print () + +print ('/**') +print (' * hb_ot_tags_from_complex_language:') +print (' * @lang_str: a BCP 47 language tag to convert.') +print (' * @limit: a pointer to the end of the substring of @lang_str to consider for') +print (' * conversion.') +print (' * @count: maximum number of language tags to retrieve (IN) and actual number of') +print (' * language tags retrieved (OUT). If no tags are retrieved, it is not modified.') +print (' * @tags: array of size at least @language_count to store the language tag') +print (' * results') +print (' *') +print (' * Converts a multi-subtag BCP 47 language tag to language tags.') +print (' *') +print (' * Return value: Whether any language systems were retrieved.') +print (' **/') +print ('static bool') +print ('hb_ot_tags_from_complex_language (const char *lang_str,') +print ('\t\t\t\t const char *limit,') +print ('\t\t\t\t unsigned int *count /* IN/OUT */,') +print ('\t\t\t\t hb_tag_t *tags /* OUT */)') +print ('{') + +def print_subtag_matches (subtag, new_line): + if subtag: + if new_line: + print () + print ('\t&& ', end='') + print ('subtag_matches (lang_str, limit, "-%s")' % subtag, end='') + +complex_tags = collections.defaultdict (list) +for initial, group in itertools.groupby ((lt_tags for lt_tags in [ + (LanguageTag (language), tags) + for language, tags in sorted (ot.from_bcp_47.items (), + key=lambda i: (-len (i[0]), i[0])) + ] if lt_tags[0].is_complex ()), + key=lambda lt_tags: lt_tags[0].get_group ()): + complex_tags[initial] += group + +for initial, items in sorted (complex_tags.items ()): + if initial != 'und': + continue + for lt, tags in items: + if lt.variant in bcp_47.prefixes: + expect (next (iter (bcp_47.prefixes[lt.variant])) == lt.language, + '%s is not a valid prefix of %s' % (lt.language, lt.variant)) + print (' if (', end='') + print_subtag_matches (lt.script, False) + print_subtag_matches (lt.region, False) + print_subtag_matches (lt.variant, False) + print (')') + print (' {') + write (' /* %s */' % bcp_47.get_name (lt)) + print () + if len (tags) == 1: + write (' tags[0] = %s; /* %s */' % (hb_tag (tags[0]), ot.names[tags[0]])) + print () + print (' *count = 1;') + else: + print (' hb_tag_t possible_tags[] = {') + for tag in tags: + write (' %s, /* %s */' % (hb_tag (tag), ot.names[tag])) + print () + print (' };') + print (' for (i = 0; i < %s && i < *count; i++)' % len (tags)) + print (' tags[i] = possible_tags[i];') + print (' *count = i;') + print (' return true;') + print (' }') + +print (' switch (lang_str[0])') +print (' {') +for initial, items in sorted (complex_tags.items ()): + if initial == 'und': + continue + print (" case '%s':" % initial) + for lt, tags in items: + print (' if (', end='') + if lt.grandfathered: + print ('0 == strcmp (&lang_str[1], "%s")' % lt.language[1:], end='') + else: + string_literal = lt.language[1:] + '-' + if lt.script: + string_literal += lt.script + lt.script = None + if lt.region: + string_literal += '-' + lt.region + lt.region = None + if string_literal[-1] == '-': + print ('0 == strncmp (&lang_str[1], "%s", %i)' % (string_literal, len (string_literal)), end='') + else: + print ('lang_matches (&lang_str[1], "%s")' % string_literal, end='') + print_subtag_matches (lt.script, True) + print_subtag_matches (lt.region, True) + print_subtag_matches (lt.variant, True) + print (')') + print (' {') + write (' /* %s */' % bcp_47.get_name (lt)) + print () + if len (tags) == 1: + write (' tags[0] = %s; /* %s */' % (hb_tag (tags[0]), ot.names[tags[0]])) + print () + print (' *count = 1;') + else: + print (' unsigned int i;') + print (' hb_tag_t possible_tags[] = {') + for tag in tags: + write ('\t%s, /* %s */' % (hb_tag (tag), ot.names[tag])) + print () + print (' };') + print (' for (i = 0; i < %s && i < *count; i++)' % len (tags)) + print ('\ttags[i] = possible_tags[i];') + print (' *count = i;') + print (' return true;') + print (' }') + print (' break;') + +print (' }') +print (' return false;') +print ('}') +print () +print ('/**') +print (' * hb_ot_ambiguous_tag_to_language') +print (' * @tag: A language tag.') +print (' *') +print (' * Converts @tag to a BCP 47 language tag if it is ambiguous (it corresponds to') +print (' * many language tags) and the best tag is not the alphabetically first, or if') +print (' * the best tag consists of multiple subtags.') +print (' *') +print (' * Return value: The #hb_language_t corresponding to the BCP 47 language tag,') +print (' * or #HB_LANGUAGE_INVALID if @tag is not ambiguous.') +print (' **/') +print ('static hb_language_t') +print ('hb_ot_ambiguous_tag_to_language (hb_tag_t tag)') +print ('{') +print (' switch (tag)') +print (' {') + +def verify_disambiguation_dict (): + """Verify and normalize ``disambiguation``. + + ``disambiguation`` is a map of ambiguous OpenType language system + tags to the particular BCP 47 tags they correspond to. This function + checks that all its keys really are ambiguous and that each key's + value is valid for that key. It checks that no ambiguous tag is + missing, except when it can figure out which BCP 47 tag is the best + by itself. + + It modifies ``disambiguation`` to remove keys whose values are the + same as those that the fallback would return anyway, and to add + ambiguous keys whose disambiguations it determined automatically. + + Raises: + AssertionError: Verification failed. + """ + global bcp_47 + global disambiguation + global ot + for ot_tag, bcp_47_tags in ot.to_bcp_47.items (): + primary_tags = list (t for t in bcp_47_tags if t not in bcp_47.grandfathered and ot.from_bcp_47.get (t)[0] == ot_tag) + if len (primary_tags) == 1: + expect (ot_tag not in disambiguation, 'unnecessary disambiguation for OT tag: %s' % ot_tag) + if '-' in primary_tags[0]: + disambiguation[ot_tag] = primary_tags[0] + elif len (primary_tags) == 0: + expect (ot_tag not in disambiguation, 'There is no possible valid disambiguation for %s' % ot_tag) + else: + macrolanguages = list (t for t in primary_tags if bcp_47.scopes.get (t) == ' [macrolanguage]') + if len (macrolanguages) != 1: + macrolanguages = list (t for t in primary_tags if bcp_47.scopes.get (t) == ' [family]') + if len (macrolanguages) != 1: + macrolanguages = list (t for t in primary_tags if 'retired code' not in bcp_47.scopes.get (t, '')) + if len (macrolanguages) != 1: + expect (ot_tag in disambiguation, 'ambiguous OT tag: %s %s' % (ot_tag, str (macrolanguages))) + expect (disambiguation[ot_tag] in bcp_47_tags, + '%s is not a valid disambiguation for %s' % (disambiguation[ot_tag], ot_tag)) + elif ot_tag not in disambiguation: + disambiguation[ot_tag] = macrolanguages[0] + if disambiguation[ot_tag] == sorted (primary_tags)[0] and '-' not in disambiguation[ot_tag]: + del disambiguation[ot_tag] + for ot_tag in disambiguation.keys (): + expect (ot_tag in ot.to_bcp_47, 'unknown OT tag: %s' % ot_tag) + +verify_disambiguation_dict () +for ot_tag, bcp_47_tag in sorted (disambiguation.items ()): + write (' case %s: /* %s */' % (hb_tag (ot_tag), ot.names[ot_tag])) + print () + write (' return hb_language_from_string (\"%s\", -1); /* %s */' % (bcp_47_tag, bcp_47.get_name (LanguageTag (bcp_47_tag)))) + print () + +print (' default:') +print (' return HB_LANGUAGE_INVALID;') +print (' }') +print ('}') + +print () +print ('#endif /* HB_OT_TAG_TABLE_HH */') +print () +print ('/* == End of generated table == */') + diff --git a/src/gen-use-table.py b/src/gen-use-table.py index 6aa5f88..be204b6 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -1,14 +1,16 @@ #!/usr/bin/env python +# flake8: noqa from __future__ import print_function, division, absolute_import -import io, sys +import io +import sys if len (sys.argv) != 5: print ("usage: ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt Blocks.txt", file=sys.stderr) sys.exit (1) -BLACKLISTED_BLOCKS = ["Thai", "Lao", "Tibetan"] +BLACKLISTED_BLOCKS = ["Thai", "Lao"] files = [io.open (x, encoding='utf-8') for x in sys.argv[1:]] @@ -47,6 +49,11 @@ defaults = ('Other', 'Not_Applicable', 'Cn', 'No_Block') data[0][0x034F] = defaults[0] data[0][0x2060] = defaults[0] data[0][0x20F0] = defaults[0] +# TODO https://github.com/roozbehp/unicode-data/issues/9 +data[0][0x11C44] = 'Consonant_Placeholder' +data[0][0x11C45] = 'Consonant_Placeholder' +# TODO https://github.com/harfbuzz/harfbuzz/pull/1399 +data[0][0x111C8] = 'Consonant_Placeholder' for u in range (0xFE00, 0xFE0F + 1): data[0][u] = defaults[0] @@ -165,7 +172,7 @@ def is_BASE(U, UISC, UGC): def is_BASE_IND(U, UISC, UGC): #SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po) return (UISC in [Consonant_Dead, Modifying_Letter] or - (UGC == Po and not U in [0x104B, 0x104E, 0x2022, 0x11A3F, 0x11A45]) or + (UGC == Po and not U in [0x104B, 0x104E, 0x2022, 0x111C8, 0x11A3F, 0x11A45, 0x11C44, 0x11C45]) or False # SPEC-DRAFT-OUTDATED! U == 0x002D ) def is_BASE_NUM(U, UISC, UGC): @@ -194,7 +201,11 @@ def is_CONS_SUB(U, UISC, UGC): def is_CONS_WITH_STACKER(U, UISC, UGC): return UISC == Consonant_With_Stacker def is_HALANT(U, UISC, UGC): - return UISC in [Virama, Invisible_Stacker] + return UISC in [Virama, Invisible_Stacker] and not is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC) +def is_HALANT_OR_VOWEL_MODIFIER(U, UISC, UGC): + # https://github.com/harfbuzz/harfbuzz/issues/1102 + # https://github.com/harfbuzz/harfbuzz/issues/1379 + return U in [0x11046, 0x1134D] def is_HALANT_NUM(U, UISC, UGC): return UISC == Number_Joiner def is_ZWNJ(U, UISC, UGC): @@ -245,6 +256,7 @@ use_mapping = { 'SUB': is_CONS_SUB, 'CS': is_CONS_WITH_STACKER, 'H': is_HALANT, + 'HVM': is_HALANT_OR_VOWEL_MODIFIER, 'HN': is_HALANT_NUM, 'ZWNJ': is_ZWNJ, 'ZWJ': is_ZWJ, @@ -278,8 +290,8 @@ use_positions = { 'V': { 'Abv': [Top, Top_And_Bottom, Top_And_Bottom_And_Right, Top_And_Right], 'Blw': [Bottom, Overstruck, Bottom_And_Right], - 'Pst': [Right], - 'Pre': [Left, Top_And_Left, Top_And_Left_And_Right, Left_And_Right], + 'Pst': [Right, Top_And_Left, Top_And_Left_And_Right, Left_And_Right], + 'Pre': [Left], }, 'VM': { 'Abv': [Top], @@ -292,6 +304,7 @@ use_positions = { 'Blw': [Bottom], }, 'H': None, + 'HVM': None, 'B': None, 'FM': None, 'SUB': None, @@ -304,11 +317,28 @@ def map_to_use(data): # Resolve Indic_Syllabic_Category - # TODO: These don't have UISC assigned in Unicode 8.0, but - # have UIPC + # TODO: These don't have UISC assigned in Unicode 8.0, but have UIPC if U == 0x17DD: UISC = Vowel_Dependent if 0x1CE2 <= U <= 0x1CE8: UISC = Cantillation_Mark + # Tibetan: + # TODO: These don't have UISC assigned in Unicode 11.0, but have UIPC + if 0x0F18 <= U <= 0x0F19 or 0x0F3E <= U <= 0x0F3F: UISC = Vowel_Dependent + if 0x0F86 <= U <= 0x0F87: UISC = Tone_Mark + # Overrides to allow NFC order matching syllable + # https://github.com/harfbuzz/harfbuzz/issues/1012 + if UBlock == 'Tibetan' and is_VOWEL (U, UISC, UGC): + if UIPC == Top: + UIPC = Bottom + + # TODO: https://github.com/harfbuzz/harfbuzz/pull/982 + # also https://github.com/harfbuzz/harfbuzz/issues/1012 + if UBlock == 'Chakma' and is_VOWEL (U, UISC, UGC): + if UIPC == Top: + UIPC = Bottom + elif UIPC == Bottom: + UIPC = Top + # TODO: https://github.com/harfbuzz/harfbuzz/pull/627 if 0x1BF2 <= U <= 0x1BF3: UISC = Nukta; UIPC = Bottom @@ -325,6 +355,12 @@ def map_to_use(data): # TODO: https://github.com/harfbuzz/harfbuzz/pull/626 if U == 0xA8B4: UISC = Consonant_Medial + # TODO: https://github.com/harfbuzz/harfbuzz/issues/1105 + if U == 0x11134: UISC = Gemination_Mark + + # TODO: https://github.com/harfbuzz/harfbuzz/pull/1399 + if U == 0x111C9: UISC = Consonant_Final + values = [k for k,v in items if v(U,UISC,UGC)] assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values) USE = values[0] @@ -344,6 +380,9 @@ def map_to_use(data): if 0xA926 <= U <= 0xA92A: UIPC = Top if U == 0x111CA: UIPC = Bottom if U == 0x11300: UIPC = Top + # TODO: https://github.com/harfbuzz/harfbuzz/pull/1037 + if U == 0x11302: UIPC = Top + if U == 0x1133C: UIPC = Bottom if U == 0x1171E: UIPC = Left # Correct?! if 0x1CF2 <= U <= 0x1CF3: UIPC = Right if 0x1CF8 <= U <= 0x1CF9: UIPC = Top @@ -378,7 +417,7 @@ for h in headers: print (" * %s" % (l.strip())) print (" */") print () -print ('#include "hb-ot-shape-complex-use-private.hh"') +print ('#include "hb-ot-shape-complex-use.hh"') print () total = 0 @@ -416,6 +455,8 @@ num = 0 offset = 0 starts = [] ends = [] +print ('#pragma GCC diagnostic push') +print ('#pragma GCC diagnostic ignored "-Wunused-macros"') for k,v in sorted(use_mapping.items()): if k in use_positions and use_positions[k]: continue print ("#define %s USE_%s /* %s */" % (k, k, v.__name__[3:])) @@ -424,6 +465,7 @@ for k,v in sorted(use_positions.items()): for suf in v.keys(): tag = k + suf print ("#define %s USE_%s" % (tag, tag)) +print ('#pragma GCC diagnostic pop') print ("") print ("static const USE_TABLE_ELEMENT_TYPE use_table[] = {") for u in uu: diff --git a/src/gen-vowel-constraints.py b/src/gen-vowel-constraints.py new file mode 100755 index 0000000..b7f6be2 --- /dev/null +++ b/src/gen-vowel-constraints.py @@ -0,0 +1,219 @@ +#!/usr/bin/python + +"""Generator of the function to prohibit certain vowel sequences. + +It creates ``_hb_preprocess_text_vowel_constraints``, which inserts dotted +circles into sequences prohibited by the USE script development spec. +This function should be used as the ``preprocess_text`` of an +``hb_ot_complex_shaper_t``. +""" + +from __future__ import absolute_import, division, print_function, unicode_literals + +import collections +try: + from HTMLParser import HTMLParser + def write (s): + print (s.encode ('utf-8'), end='') +except ImportError: + from html.parser import HTMLParser + def write (s): + sys.stdout.flush () + sys.stdout.buffer.write (s.encode ('utf-8')) +import itertools +import io +import sys + +if len (sys.argv) != 3: + print ('usage: ./gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt', file=sys.stderr) + sys.exit (1) + +with io.open (sys.argv[2], encoding='utf-8') as f: + scripts_header = [f.readline () for i in range (2)] + scripts = {} + script_order = {} + for line in f: + j = line.find ('#') + if j >= 0: + line = line[:j] + fields = [x.strip () for x in line.split (';')] + if len (fields) == 1: + continue + uu = fields[0].split ('..') + start = int (uu[0], 16) + if len (uu) == 1: + end = start + else: + end = int (uu[1], 16) + script = fields[1] + for u in range (start, end + 1): + scripts[u] = script + if script not in script_order: + script_order[script] = start + +class ConstraintSet (object): + """A set of prohibited code point sequences. + + Args: + constraint (List[int]): A prohibited code point sequence. + + """ + def __init__ (self, constraint): + # Either a list or a dictionary. As a list of code points, it + # represents a prohibited code point sequence. As a dictionary, + # it represents a set of prohibited sequences, where each item + # represents the set of prohibited sequences starting with the + # key (a code point) concatenated with any of the values + # (ConstraintSets). + self._c = constraint + + def add (self, constraint): + """Add a constraint to this set.""" + if not constraint: + return + first = constraint[0] + rest = constraint[1:] + if isinstance (self._c, list): + if constraint == self._c[:len (constraint)]: + self._c = constraint + elif self._c != constraint[:len (self._c)]: + self._c = {self._c[0]: ConstraintSet (self._c[1:])} + if isinstance (self._c, dict): + if first in self._c: + self._c[first].add (rest) + else: + self._c[first] = ConstraintSet (rest) + + def _indent (self, depth): + return (' ' * depth).replace (' ', '\t') + + def __str__ (self, index=0, depth=4): + s = [] + indent = self._indent (depth) + if isinstance (self._c, list): + if len (self._c) == 0: + s.append ('{}matched = true;\n'.format (indent)) + elif len (self._c) == 1: + s.append ('{}matched = 0x{:04X}u == buffer->cur ({}).codepoint;\n'.format (indent, next (iter (self._c)), index or '')) + else: + s.append ('{}if (0x{:04X}u == buffer->cur ({}).codepoint &&\n'.format (indent, self._c[0], index)) + s.append ('{}buffer->idx + {} < count &&\n'.format (self._indent (depth + 2), len (self._c))) + for i, cp in enumerate (self._c[1:], start=1): + s.append ('{}0x{:04X}u == buffer->cur ({}).codepoint{}\n'.format ( + self._indent (depth + 2), cp, index + i, ')' if i == len (self._c) - 1 else ' &&')) + s.append ('{}{{\n'.format (indent)) + for i in range (len (self._c)): + s.append ('{}buffer->next_glyph ();\n'.format (self._indent (depth + 1))) + s.append ('{}_output_dotted_circle (buffer);\n'.format (self._indent (depth + 1))) + s.append ('{}}}\n'.format (indent)) + else: + s.append ('{}switch (buffer->cur ({}).codepoint)\n'.format(indent, index or '')) + s.append ('{}{{\n'.format (indent)) + cases = collections.defaultdict (set) + for first, rest in sorted (self._c.items ()): + cases[rest.__str__ (index + 1, depth + 2)].add (first) + for body, labels in sorted (cases.items (), key=lambda b_ls: sorted (b_ls[1])[0]): + for i, cp in enumerate (sorted (labels)): + if i % 4 == 0: + s.append (self._indent (depth + 1)) + else: + s.append (' ') + s.append ('case 0x{:04X}u:{}'.format (cp, '\n' if i % 4 == 3 else '')) + if len (labels) % 4 != 0: + s.append ('\n') + s.append (body) + s.append ('{}break;\n'.format (self._indent (depth + 2))) + s.append ('{}}}\n'.format (indent)) + return ''.join (s) + +constraints = {} +with io.open (sys.argv[1], encoding='utf-8') as f: + constraints_header = [f.readline ().strip () for i in range (2)] + for line in f: + j = line.find ('#') + if j >= 0: + line = line[:j] + constraint = [int (cp, 16) for cp in line.split (';')[0].split ()] + if not constraint: continue + assert 2 <= len (constraint), 'Prohibited sequence is too short: {}'.format (constraint) + script = scripts[constraint[0]] + if script in constraints: + constraints[script].add (constraint) + else: + constraints[script] = ConstraintSet (constraint) + assert constraints, 'No constraints found' + +print ('/* == Start of generated functions == */') +print ('/*') +print (' * The following functions are generated by running:') +print (' *') +print (' * %s use Scripts.txt' % sys.argv[0]) +print (' *') +print (' * on files with these headers:') +print (' *') +for line in constraints_header: + print (' * %s' % line.strip ()) +print (' *') +for line in scripts_header: + print (' * %s' % line.strip ()) +print (' */') +print () +print ('#include "hb-ot-shape-complex-vowel-constraints.hh"') +print () +print ('static void') +print ('_output_dotted_circle (hb_buffer_t *buffer)') +print ('{') +print (' hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);') +print (' _hb_glyph_info_reset_continuation (&dottedcircle);') +print ('}') +print () +print ('static void') +print ('_output_with_dotted_circle (hb_buffer_t *buffer)') +print ('{') +print (' _output_dotted_circle (buffer);') +print (' buffer->next_glyph ();') +print ('}') +print () + +print ('void') +print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,') +print ('\t\t\t\t hb_buffer_t *buffer,') +print ('\t\t\t\t hb_font_t *font HB_UNUSED)') +print ('{') +print (' /* UGLY UGLY UGLY business of adding dotted-circle in the middle of') +print (' * vowel-sequences that look like another vowel. Data for each script') +print (' * collected from the USE script development spec.') +print (' *') +print (' * https://github.com/harfbuzz/harfbuzz/issues/1019') +print (' */') +print (' bool processed = false;') +print (' buffer->clear_output ();') +print (' unsigned int count = buffer->len;') +print (' switch ((unsigned) buffer->props.script)') +print (' {') + +for script, constraints in sorted (constraints.items (), key=lambda s_c: script_order[s_c[0]]): + print (' case HB_SCRIPT_{}:'.format (script.upper ())) + print (' for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)') + print (' {') + print ('\tbool matched = false;') + write (str (constraints)) + print ('\tbuffer->next_glyph ();') + print ('\tif (matched) _output_with_dotted_circle (buffer);') + print (' }') + print (' processed = true;') + print (' break;') + print () + +print (' default:') +print (' break;') +print (' }') +print (' if (processed)') +print (' {') +print (' if (buffer->idx < count)') +print (' buffer->next_glyph ();') +print (' }') +print ('}') + +print () +print ('/* == End of generated functions == */') diff --git a/src/harfbuzz-config.cmake.in b/src/harfbuzz-config.cmake.in index 87b1572..304410d 100644 --- a/src/harfbuzz-config.cmake.in +++ b/src/harfbuzz-config.cmake.in @@ -12,7 +12,11 @@ set(_harfbuzz_libdir "@libdir@") string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}") set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}") while (_harfbuzz_libdir_iter) + set(_harfbuzz_libdir_prev_iter "${_harfbuzz_libdir_iter}") get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY) + if (_harfbuzz_libdir_prev_iter STREQUAL _harfbuzz_libdir_iter) + break() + endif () get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY) endwhile () unset(_harfbuzz_libdir_iter) diff --git a/src/hb-aat-fdsc-table.hh b/src/hb-aat-fdsc-table.hh new file mode 100644 index 0000000..1188e35 --- /dev/null +++ b/src/hb-aat-fdsc-table.hh @@ -0,0 +1,126 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_AAT_FDSC_TABLE_HH +#define HB_AAT_FDSC_TABLE_HH + +#include "hb-aat-layout-common.hh" +#include "hb-open-type.hh" + +/* + * fdsc -- Font descriptors + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fdsc.html + */ +#define HB_AAT_TAG_fdsc HB_TAG('f','d','s','c') + + +namespace AAT { + + +struct FontDescriptor +{ + bool has_data () const { return tag; } + + int cmp (hb_tag_t a) const { return tag.cmp (a); } + + float get_value () const { return u.value.to_float (); } + + enum non_alphabetic_value_t { + Alphabetic = 0, + Dingbats = 1, + PiCharacters = 2, + Fleurons = 3, + DecorativeBorders = 4, + InternationalSymbols= 5, + MathSymbols = 6 + }; + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + Tag tag; /* The 4-byte table tag name. */ + union { + Fixed value; /* The value for the descriptor tag. */ + HBUINT32 nalfType; /* If the tag is `nalf`, see non_alphabetic_value_t */ + } u; + public: + DEFINE_SIZE_STATIC (8); +}; + +struct fdsc +{ + static constexpr hb_tag_t tableTag = HB_AAT_TAG_fdsc; + + enum { + Weight = HB_TAG ('w','g','h','t'), + /* Percent weight relative to regular weight. + * (defaul value: 1.0) */ + Width = HB_TAG ('w','d','t','h'), + /* Percent width relative to regular width. + * (default value: 1.0) */ + Slant = HB_TAG ('s','l','n','t'), + /* Angle of slant in degrees, where positive + * is clockwise from straight up. + * (default value: 0.0) */ + OpticalSize = HB_TAG ('o','p','s','z'), + /* Point size the font was designed for. + * (default value: 12.0) */ + NonAlphabetic= HB_TAG ('n','a','l','f') + /* These values are treated as integers, + * not fixed32s. 0 means alphabetic, and greater + * integers mean the font is non-alphabetic (e.g. symbols). + * (default value: 0) */ + }; + + const FontDescriptor &get_descriptor (hb_tag_t style) const + { return descriptors.lsearch (style); } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + descriptors.sanitize (c)); + } + + protected: + Fixed version; /* Version number of the font descriptors + * table (0x00010000 for the current version). */ + LArrayOf + descriptors; /* List of tagged-coordinate pairs style descriptors + * that will be included to characterize this font. + * Each descriptor consists of a pair. + * These pairs are located in the gxFontDescriptor + * array that follows. */ + public: + DEFINE_SIZE_ARRAY (8, descriptors); +}; + +} /* namespace AAT */ + + +#endif /* HB_AAT_FDSC_TABLE_HH */ diff --git a/src/hb-aat-fmtx-table.hh b/src/hb-aat-fmtx-table.hh deleted file mode 100644 index aa82c88..0000000 --- a/src/hb-aat-fmtx-table.hh +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright © 2018 Ebrahim Byagowi - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HB_AAT_FMTX_TABLE_HH -#define HB_AAT_FMTX_TABLE_HH - -#include "hb-aat-layout-common-private.hh" - -/* - * fmtx -- Font Metrics - * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fmtx.html - */ -#define HB_AAT_TAG_fmtx HB_TAG('f','m','t','x') - - -namespace AAT { - - -struct fmtx -{ - static const hb_tag_t tableTag = HB_AAT_TAG_fmtx; - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); - } - - FixedVersion<>version; /* Version (set to 0x00020000). */ - HBUINT32 glyphIndex; /* The glyph whose points represent the metrics. */ - HBUINT8 horizontalBefore; /* Point number for the horizontal ascent. */ - HBUINT8 horizontalAfter; /* Point number for the horizontal descent. */ - HBUINT8 horizontalCaretHead; /* Point number for the horizontal caret head. */ - HBUINT8 horizontalCaretBase; /* Point number for the horizontal caret base. */ - HBUINT8 verticalBefore; /* Point number for the vertical ascent. */ - HBUINT8 verticalAfter; /* Point number for the vertical descent. */ - HBUINT8 verticalCaretHead; /* Point number for the vertical caret head. */ - HBUINT8 verticalCaretBase; /* Point number for the vertical caret base. */ - public: - DEFINE_SIZE_STATIC (16); -}; - -} /* namespace AAT */ - - -#endif /* HB_AAT_FMTX_TABLE_HH */ diff --git a/src/hb-aat-gcid-table.hh b/src/hb-aat-gcid-table.hh deleted file mode 100644 index b48a279..0000000 --- a/src/hb-aat-gcid-table.hh +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright © 2018 Ebrahim Byagowi - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HB_AAT_GCID_TABLE_HH -#define HB_AAT_GCID_TABLE_HH - -#include "hb-aat-layout-common-private.hh" - -/* - * gcid -- Glyphs CIDs - * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6gcid.html - */ -#define HB_AAT_TAG_gcid HB_TAG('g','c','i','d') - - -namespace AAT { - - -struct gcid -{ - static const hb_tag_t tableTag = HB_AAT_TAG_gcid; - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && CIDs.sanitize (c))); - } - - protected: - HBUINT16 version; /* Version number (set to 0) */ - HBUINT16 format; /* Data format (set to 0) */ - HBUINT32 size; /* Size of the table, including header */ - HBUINT16 registry; /* The registry ID */ - HBUINT8 registryName[64]; - /* The registry name in ASCII */ - HBUINT16 order; /* The order ID */ - HBUINT8 orderName[64]; /* The order name in ASCII */ - HBUINT16 supplementVersion; - /* The supplement version */ - ArrayOf - CIDs; /* The CIDs for the glyphs in the font, - * starting with glyph 0. If a glyph does not correspond - * to a CID in the identified collection, 0xFFFF is used. - * This should not exceed the number of glyphs in the font. */ - public: - DEFINE_SIZE_ARRAY (144, CIDs); -}; - -} /* namespace AAT */ - - -#endif /* HB_AAT_GCID_TABLE_HH */ diff --git a/src/hb-aat-layout-ankr-table.hh b/src/hb-aat-layout-ankr-table.hh index 3b7912b..236e4aa 100644 --- a/src/hb-aat-layout-ankr-table.hh +++ b/src/hb-aat-layout-ankr-table.hh @@ -25,7 +25,7 @@ #ifndef HB_AAT_LAYOUT_ANKR_TABLE_HH #define HB_AAT_LAYOUT_ANKR_TABLE_HH -#include "hb-aat-layout-common-private.hh" +#include "hb-aat-layout-common.hh" /* * ankr -- Anchor Point @@ -36,41 +36,56 @@ namespace AAT { +using namespace OT; + struct Anchor { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); } + public: FWORD xCoordinate; FWORD yCoordinate; public: DEFINE_SIZE_STATIC (4); }; +typedef LArrayOf GlyphAnchors; + struct ankr { - static const hb_tag_t tableTag = HB_AAT_TAG_ankr; + static constexpr hb_tag_t tableTag = HB_AAT_TAG_ankr; + + const Anchor &get_anchor (hb_codepoint_t glyph_id, + unsigned int i, + unsigned int num_glyphs) const + { + const NNOffsetTo *offset = (this+lookupTable).get_value (glyph_id, num_glyphs); + if (!offset) + return Null(Anchor); + const GlyphAnchors &anchors = &(this+anchorData) + *offset; + return anchors[i]; + } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && version == 0 && - lookupTable.sanitize (c, this) && - anchors.sanitize (c, this))); + lookupTable.sanitize (c, this, &(this+anchorData)))); } protected: HBUINT16 version; /* Version number (set to zero) */ HBUINT16 flags; /* Flags (currently unused; set to zero) */ - LOffsetTo > + LOffsetTo > > lookupTable; /* Offset to the table's lookup table */ - LOffsetTo > - anchors; /* Offset to the glyph data table */ + LNNOffsetTo + anchorData; /* Offset to the glyph data table */ public: DEFINE_SIZE_STATIC (12); diff --git a/src/hb-aat-layout-bsln-table.hh b/src/hb-aat-layout-bsln-table.hh index df2bf5b..9139d28 100644 --- a/src/hb-aat-layout-bsln-table.hh +++ b/src/hb-aat-layout-bsln-table.hh @@ -25,7 +25,7 @@ #ifndef HB_AAT_LAYOUT_BSLN_TABLE_HH #define HB_AAT_LAYOUT_BSLN_TABLE_HH -#include "hb-aat-layout-common-private.hh" +#include "hb-aat-layout-common.hh" /* * bsln -- Baseline @@ -39,7 +39,7 @@ namespace AAT { struct BaselineTableFormat0Part { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); @@ -57,7 +57,7 @@ struct BaselineTableFormat0Part struct BaselineTableFormat1Part { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && @@ -75,7 +75,7 @@ struct BaselineTableFormat1Part struct BaselineTableFormat2Part { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); @@ -98,7 +98,7 @@ struct BaselineTableFormat2Part struct BaselineTableFormat3Part { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && lookupTable.sanitize (c)); @@ -116,15 +116,16 @@ struct BaselineTableFormat3Part struct bsln { - static const hb_tag_t tableTag = HB_AAT_TAG_bsln; + static constexpr hb_tag_t tableTag = HB_AAT_TAG_bsln; - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); if (unlikely (!(c->check_struct (this) && defaultBaseline < 32))) return_trace (false); - switch (format) { + switch (format) + { case 0: return_trace (parts.format0.sanitize (c)); case 1: return_trace (parts.format1.sanitize (c)); case 2: return_trace (parts.format2.sanitize (c)); diff --git a/src/hb-aat-layout-common-private.hh b/src/hb-aat-layout-common-private.hh deleted file mode 100644 index 2825b18..0000000 --- a/src/hb-aat-layout-common-private.hh +++ /dev/null @@ -1,644 +0,0 @@ -/* - * 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 -struct BinSearchArrayOf -{ - inline const Type& operator [] (unsigned int i) const - { - if (unlikely (i >= header.nUnits)) return Null(Type); - return StructAtOffset (bytesZ, i * header.unitSize); - } - inline Type& operator [] (unsigned int i) - { - return StructAtOffset (bytesZ, 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 (bytesZ, 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 - 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 *) bytesZ) + (mid * size)); - int c = p->cmp (key); - if (c < 0) - max = mid - 1; - else if (c > 0) - min = mid + 1; - else - return p; - } - return nullptr; - } - - 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 (bytesZ, header.unitSize, header.nUnits)); - } - - protected: - BinSearchHeader header; - HBUINT8 bytesZ[VAR]; - public: - DEFINE_SIZE_ARRAY (10, bytesZ); -}; - - -/* - * Lookup Table - */ - -template struct Lookup; - -template -struct LookupFormat0 -{ - friend struct Lookup; - - 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 - arrayZ; /* Array of lookup values, indexed by glyph index. */ - public: - DEFINE_SIZE_ARRAY (2, arrayZ); -}; - - -template -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 -struct LookupFormat2 -{ - friend struct Lookup; - - private: - inline const T* get_value (hb_codepoint_t glyph_id) const - { - const LookupSegmentSingle *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 > - 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 -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 > - valuesZ; /* A 16-bit offset from the start of - * the table to the data. */ - public: - DEFINE_SIZE_STATIC (6); -}; - -template -struct LookupFormat4 -{ - friend struct Lookup; - - private: - inline const T* get_value (hb_codepoint_t glyph_id) const - { - const LookupSegmentArray *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 > - 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 -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 -struct LookupFormat6 -{ - friend struct Lookup; - - private: - inline const T* get_value (hb_codepoint_t glyph_id) const - { - const LookupSingle *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 > - entries; /* The actual entries, sorted by glyph index. */ - public: - DEFINE_SIZE_ARRAY (8, entries); -}; - -template -struct LookupFormat8 -{ - friend struct Lookup; - - 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 - valueArrayZ; /* The lookup values (indexed by the glyph index - * minus the value of firstGlyph). */ - public: - DEFINE_SIZE_ARRAY (6, valueArrayZ); -}; - -template -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 format0; - LookupFormat2 format2; - LookupFormat4 format4; - LookupFormat6 format6; - LookupFormat8 format8; - } u; - public: - DEFINE_SIZE_UNION (2, format); -}; - - -/* - * Extended State Table - */ - -template -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 -{ - 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 -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 *get_entries () const - { - return (this+entryTable).arrayZ; - } - - inline const Entry *get_entryZ (unsigned int state, unsigned int klass) const - { - if (unlikely (klass >= nClasses)) return nullptr; - - const HBUINT16 *states = (this+stateArrayTable).arrayZ; - const Entry *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 *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, - states[0].static_size * nClasses, - num_states))) - 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 (num_entries, *p + 1); - state = num_states; - } - - if (unlikely (!c->check_array (entries, - entries[0].static_size, - num_entries))) - return_trace (false); - { /* Sweep new entries. */ - const Entry *stop = &entries[num_entries]; - for (const Entry *p = &entries[entry]; p < stop; p++) - num_states = MAX (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. */ - LOffsetTo > - classTable; /* Offset to the class table. */ - LOffsetTo > - stateArrayTable;/* Offset to the state array. */ - LOffsetTo > > - entryTable; /* Offset to the entry array. */ - - public: - DEFINE_SIZE_STATIC (16); -}; - -template -struct StateTableDriver -{ - inline StateTableDriver (const StateTable &machine_, - hb_buffer_t *buffer_, - hb_face_t *face_) : - machine (machine_), - buffer (buffer_), - num_glyphs (face_->get_num_glyphs ()) {} - - template - 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;;) - { - unsigned int klass = buffer->idx < buffer->len ? - machine.get_class (info[buffer->idx].codepoint, num_glyphs) : - 0 /* End of text */; - const Entry *entry = machine.get_entryZ (state, klass); - if (unlikely (!entry)) - break; - - /* Unsafe-to-break before this if not in state 0, as things might - * go differently if we start from state 0 here. */ - if (state && buffer->idx) - { - /* If there's no action and we're just epsilon-transitioning to state 0, - * safe to break. */ - if (c->is_actionable (this, entry) || - !(entry->newState == 0 && entry->flags == context_t::DontAdvance)) - buffer->unsafe_to_break (buffer->idx - 1, buffer->idx + 1); - } - - /* Unsafe-to-break if end-of-text would kick in here. */ - if (buffer->idx + 2 <= buffer->len) - { - const Entry *end_entry = machine.get_entryZ (state, 0); - if (c->is_actionable (this, end_entry)) - buffer->unsafe_to_break (buffer->idx, buffer->idx + 2); - } - - if (unlikely (!c->transition (this, entry))) - break; - - last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops-- > 0; - - 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 &machine; - hb_buffer_t *buffer; - unsigned int num_glyphs; -}; - - - -struct hb_aat_apply_context_t : - hb_dispatch_context_t -{ - inline const char *get_name (void) { return "APPLY"; } - template - 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; - - /* Unused. For debug tracing only. */ - unsigned int lookup_index; - unsigned int debug_depth; - - inline hb_aat_apply_context_t (hb_font_t *font_, - hb_buffer_t *buffer_, - hb_blob_t *table) : - font (font_), face (font->face), buffer (buffer_), - sanitizer (), lookup_index (0), debug_depth (0) - { - sanitizer.init (table); - sanitizer.num_glyphs = face->get_num_glyphs (); - sanitizer.start_processing (); - } - - inline void set_lookup_index (unsigned int i) { lookup_index = i; } - - inline ~hb_aat_apply_context_t (void) - { - sanitizer.end_processing (); - } -}; - - -} /* namespace AAT */ - - -#endif /* HB_AAT_LAYOUT_COMMON_PRIVATE_HH */ diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh new file mode 100644 index 0000000..27ade28 --- /dev/null +++ b/src/hb-aat-layout-common.hh @@ -0,0 +1,845 @@ +/* + * 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_HH +#define HB_AAT_LAYOUT_COMMON_HH + +#include "hb-aat-layout.hh" +#include "hb-open-type.hh" + + +namespace AAT { + +using namespace OT; + + +/* + * Lookup Table + */ + +template struct Lookup; + +template +struct LookupFormat0 +{ + friend struct Lookup; + + private: + 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]; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (arrayZ.sanitize (c, c->get_num_glyphs ())); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (arrayZ.sanitize (c, c->get_num_glyphs (), base)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 0 */ + UnsizedArrayOf + arrayZ; /* Array of lookup values, indexed by glyph index. */ + public: + DEFINE_SIZE_UNBOUNDED (2); +}; + + +template +struct LookupSegmentSingle +{ + static constexpr unsigned TerminationWordCount = 2u; + + int cmp (hb_codepoint_t g) const + { return g < first ? -1 : g <= last ? 0 : +1 ; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && value.sanitize (c)); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && value.sanitize (c, base)); + } + + 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 +struct LookupFormat2 +{ + friend struct Lookup; + + private: + const T* get_value (hb_codepoint_t glyph_id) const + { + const LookupSegmentSingle *v = segments.bsearch (glyph_id); + return v ? &v->value : nullptr; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (segments.sanitize (c)); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (segments.sanitize (c, base)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 2 */ + VarSizedBinSearchArrayOf > + 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 +struct LookupSegmentArray +{ + static constexpr unsigned TerminationWordCount = 2u; + + 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; + } + + int cmp (hb_codepoint_t g) const + { return g < first ? -1 : g <= last ? 0 : +1; } + + 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)); + } + template + bool sanitize (hb_sanitize_context_t *c, const void *base, T2 user_data) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + first <= last && + valuesZ.sanitize (c, base, last - first + 1, user_data)); + } + + GlyphID last; /* Last GlyphID in this segment */ + GlyphID first; /* First GlyphID in this segment */ + NNOffsetTo > + valuesZ; /* A 16-bit offset from the start of + * the table to the data. */ + public: + DEFINE_SIZE_STATIC (6); +}; + +template +struct LookupFormat4 +{ + friend struct Lookup; + + private: + const T* get_value (hb_codepoint_t glyph_id) const + { + const LookupSegmentArray *v = segments.bsearch (glyph_id); + return v ? v->get_value (glyph_id, this) : nullptr; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (segments.sanitize (c, this)); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (segments.sanitize (c, this, base)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 4 */ + VarSizedBinSearchArrayOf > + 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 +struct LookupSingle +{ + static constexpr unsigned TerminationWordCount = 1u; + + int cmp (hb_codepoint_t g) const { return glyph.cmp (g); } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && value.sanitize (c)); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && value.sanitize (c, base)); + } + + GlyphID glyph; /* Last GlyphID */ + T value; /* The lookup value (only one) */ + public: + DEFINE_SIZE_STATIC (2 + T::static_size); +}; + +template +struct LookupFormat6 +{ + friend struct Lookup; + + private: + const T* get_value (hb_codepoint_t glyph_id) const + { + const LookupSingle *v = entries.bsearch (glyph_id); + return v ? &v->value : nullptr; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (entries.sanitize (c)); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (entries.sanitize (c, base)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 6 */ + VarSizedBinSearchArrayOf > + entries; /* The actual entries, sorted by glyph index. */ + public: + DEFINE_SIZE_ARRAY (8, entries); +}; + +template +struct LookupFormat8 +{ + friend struct Lookup; + + private: + const T* get_value (hb_codepoint_t glyph_id) const + { + return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ? + &valueArrayZ[glyph_id - firstGlyph] : nullptr; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount)); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && valueArrayZ.sanitize (c, glyphCount, base)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 8 */ + 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 + valueArrayZ; /* The lookup values (indexed by the glyph index + * minus the value of firstGlyph). */ + public: + DEFINE_SIZE_ARRAY (6, valueArrayZ); +}; + +template +struct LookupFormat10 +{ + friend struct Lookup; + + private: + const typename T::type get_value_or_null (hb_codepoint_t glyph_id) const + { + if (!(firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount)) + return Null(T); + + const HBUINT8 *p = &valueArrayZ[(glyph_id - firstGlyph) * valueSize]; + + unsigned int v = 0; + unsigned int count = valueSize; + for (unsigned int i = 0; i < count; i++) + v = (v << 8) | *p++; + + return v; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + valueSize <= 4 && + valueArrayZ.sanitize (c, glyphCount * valueSize)); + } + + protected: + HBUINT16 format; /* Format identifier--format = 8 */ + HBUINT16 valueSize; /* Byte size of each value. */ + 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 + valueArrayZ; /* The lookup values (indexed by the glyph index + * minus the value of firstGlyph). */ + public: + DEFINE_SIZE_ARRAY (8, valueArrayZ); +}; + +template +struct Lookup +{ + 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; + } + } + + const typename T::type get_value_or_null (hb_codepoint_t glyph_id, unsigned int num_glyphs) const + { + switch (u.format) { + /* Format 10 cannot return a pointer. */ + case 10: return u.format10.get_value_or_null (glyph_id); + default: + const T *v = get_value (glyph_id, num_glyphs); + return v ? *v : Null(T); + } + } + + typename T::type get_class (hb_codepoint_t glyph_id, + unsigned int num_glyphs, + unsigned int outOfRange) const + { + const T *v = get_value (glyph_id, num_glyphs); + return v ? *v : outOfRange; + } + + 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)); + case 10: return_trace (u.format10.sanitize (c)); + default:return_trace (true); + } + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + if (!u.format.sanitize (c)) return_trace (false); + switch (u.format) { + case 0: return_trace (u.format0.sanitize (c, base)); + case 2: return_trace (u.format2.sanitize (c, base)); + case 4: return_trace (u.format4.sanitize (c, base)); + case 6: return_trace (u.format6.sanitize (c, base)); + case 8: return_trace (u.format8.sanitize (c, base)); + case 10: return_trace (false); /* We don't support format10 here currently. */ + default:return_trace (true); + } + } + + protected: + union { + HBUINT16 format; /* Format identifier */ + LookupFormat0 format0; + LookupFormat2 format2; + LookupFormat4 format4; + LookupFormat6 format6; + LookupFormat8 format8; + LookupFormat10 format10; + } u; + public: + DEFINE_SIZE_UNION (2, format); +}; +/* Lookup 0 has unbounded size (dependant on num_glyphs). So we need to defined + * special NULL objects for Lookup<> objects, but since it's template our macros + * don't work. So we have to hand-code them here. UGLY. */ +} /* Close namespace. */ +/* Ugly hand-coded null objects for template Lookup<> :(. */ +extern HB_INTERNAL const unsigned char _hb_Null_AAT_Lookup[2]; +template <> +/*static*/ inline const AAT::Lookup& Null > () +{ return *reinterpret_cast *> (_hb_Null_AAT_Lookup); } +template <> +/*static*/ inline const AAT::Lookup& Null > () +{ return *reinterpret_cast *> (_hb_Null_AAT_Lookup); } +template <> +/*static*/ inline const AAT::Lookup >& Null > > () +{ return *reinterpret_cast > *> (_hb_Null_AAT_Lookup); } +namespace AAT { + +enum { DELETED_GLYPH = 0xFFFF }; + +/* + * (Extended) State Table + */ + +template +struct Entry +{ + 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. + * + * HOWEVER! Because we are a template, our DEFINE_SIZE_STATIC + * assertion wouldn't be checked, hence the line below. */ + static_assert (T::static_size, ""); + + 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 +{ + bool sanitize (hb_sanitize_context_t *c, unsigned int count /*XXX Unused?*/) 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 +struct StateTable +{ + typedef typename Types::HBUINT HBUINT; + typedef typename Types::HBUSHORT HBUSHORT; + typedef typename Types::ClassTypeNarrow ClassType; + + enum State + { + STATE_START_OF_TEXT = 0, + STATE_START_OF_LINE = 1, + }; + enum Class + { + CLASS_END_OF_TEXT = 0, + CLASS_OUT_OF_BOUNDS = 1, + CLASS_DELETED_GLYPH = 2, + CLASS_END_OF_LINE = 3, + }; + + int new_state (unsigned int newState) const + { return Types::extended ? newState : ((int) newState - (int) stateArrayTable) / (int) nClasses; } + + unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const + { + if (unlikely (glyph_id == DELETED_GLYPH)) return CLASS_DELETED_GLYPH; + return (this+classTable).get_class (glyph_id, num_glyphs, 1); + } + + const Entry *get_entries () const + { return (this+entryTable).arrayZ; } + + const Entry &get_entry (int state, unsigned int klass) const + { + if (unlikely (klass >= nClasses)) + klass = StateTable >::CLASS_OUT_OF_BOUNDS; + + const HBUSHORT *states = (this+stateArrayTable).arrayZ; + const Entry *entries = (this+entryTable).arrayZ; + + unsigned int entry = states[state * nClasses + klass]; + DEBUG_MSG (APPLY, nullptr, "e%u", entry); + + return entries[entry]; + } + + bool sanitize (hb_sanitize_context_t *c, + unsigned int *num_entries_out = nullptr) const + { + TRACE_SANITIZE (this); + if (unlikely (!(c->check_struct (this) && + nClasses >= 4 /* Ensure pre-defined classes fit. */ && + classTable.sanitize (c, this)))) return_trace (false); + + const HBUSHORT *states = (this+stateArrayTable).arrayZ; + const Entry *entries = (this+entryTable).arrayZ; + + unsigned int num_classes = nClasses; + if (unlikely (hb_unsigned_mul_overflows (num_classes, states[0].static_size))) + return_trace (false); + unsigned int row_stride = num_classes * states[0].static_size; + + /* Apple 'kern' table has this peculiarity: + * + * "Because the stateTableOffset in the state table header is (strictly + * speaking) redundant, some 'kern' tables use it to record an initial + * state where that should not be StartOfText. To determine if this is + * done, calculate what the stateTableOffset should be. If it's different + * from the actual stateTableOffset, use it as the initial state." + * + * We implement this by calling the initial state zero, but allow *negative* + * states if the start state indeed was not the first state. Since the code + * is shared, this will also apply to 'mort' table. The 'kerx' / 'morx' + * tables are not affected since those address states by index, not offset. + */ + + int min_state = 0; + int max_state = 0; + unsigned int num_entries = 0; + + int state_pos = 0; + int state_neg = 0; + unsigned int entry = 0; + while (min_state < state_neg || state_pos <= max_state) + { + if (min_state < state_neg) + { + /* Negative states. */ + if (unlikely (hb_unsigned_mul_overflows (min_state, num_classes))) + return_trace (false); + if (unlikely (!c->check_range (&states[min_state * num_classes], + -min_state, + row_stride))) + return_trace (false); + if ((c->max_ops -= state_neg - min_state) <= 0) + return_trace (false); + { /* Sweep new states. */ + const HBUSHORT *stop = &states[min_state * num_classes]; + if (unlikely (stop > states)) + return_trace (false); + for (const HBUSHORT *p = states; stop < p; p--) + num_entries = MAX (num_entries, *(p - 1) + 1); + state_neg = min_state; + } + } + + if (state_pos <= max_state) + { + /* Positive states. */ + if (unlikely (!c->check_range (states, + max_state + 1, + row_stride))) + return_trace (false); + if ((c->max_ops -= max_state - state_pos + 1) <= 0) + return_trace (false); + { /* Sweep new states. */ + if (unlikely (hb_unsigned_mul_overflows ((max_state + 1), num_classes))) + return_trace (false); + const HBUSHORT *stop = &states[(max_state + 1) * num_classes]; + if (unlikely (stop < states)) + return_trace (false); + for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++) + num_entries = MAX (num_entries, *p + 1); + state_pos = max_state + 1; + } + } + + if (unlikely (!c->check_array (entries, num_entries))) + return_trace (false); + if ((c->max_ops -= num_entries - entry) <= 0) + return_trace (false); + { /* Sweep new entries. */ + const Entry *stop = &entries[num_entries]; + for (const Entry *p = &entries[entry]; p < stop; p++) + { + int newState = new_state (p->newState); + min_state = MIN (min_state, newState); + max_state = MAX (max_state, newState); + } + entry = num_entries; + } + } + + if (num_entries_out) + *num_entries_out = num_entries; + + return_trace (true); + } + + protected: + HBUINT nClasses; /* Number of classes, which is the number of indices + * in a single line in the state array. */ + NNOffsetTo + classTable; /* Offset to the class table. */ + NNOffsetTo, HBUINT> + stateArrayTable;/* Offset to the state array. */ + NNOffsetTo >, HBUINT> + entryTable; /* Offset to the entry array. */ + + public: + DEFINE_SIZE_STATIC (4 * sizeof (HBUINT)); +}; + +template +struct ClassTable +{ + unsigned int get_class (hb_codepoint_t glyph_id, unsigned int outOfRange) const + { + unsigned int i = glyph_id - firstGlyph; + return i >= classArray.len ? outOfRange : classArray.arrayZ[i]; + } + unsigned int get_class (hb_codepoint_t glyph_id, + unsigned int num_glyphs HB_UNUSED, + unsigned int outOfRange) const + { + return get_class (glyph_id, outOfRange); + } + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && classArray.sanitize (c)); + } + protected: + GlyphID firstGlyph; /* First glyph index included in the trimmed array. */ + ArrayOf classArray; /* The class codes (indexed by glyph index minus + * firstGlyph). */ + public: + DEFINE_SIZE_ARRAY (4, classArray); +}; + +struct ObsoleteTypes +{ + static constexpr bool extended = false; + typedef HBUINT16 HBUINT; + typedef HBUINT8 HBUSHORT; + typedef ClassTable ClassTypeNarrow; + typedef ClassTable ClassTypeWide; + + template + static unsigned int offsetToIndex (unsigned int offset, + const void *base, + const T *array) + { + return (offset - ((const char *) array - (const char *) base)) / sizeof (T); + } + template + static unsigned int byteOffsetToIndex (unsigned int offset, + const void *base, + const T *array) + { + return offsetToIndex (offset, base, array); + } + template + static unsigned int wordOffsetToIndex (unsigned int offset, + const void *base, + const T *array) + { + return offsetToIndex (2 * offset, base, array); + } +}; +struct ExtendedTypes +{ + static constexpr bool extended = true; + typedef HBUINT32 HBUINT; + typedef HBUINT16 HBUSHORT; + typedef Lookup ClassTypeNarrow; + typedef Lookup ClassTypeWide; + + template + static unsigned int offsetToIndex (unsigned int offset, + const void *base HB_UNUSED, + const T *array HB_UNUSED) + { + return offset; + } + template + static unsigned int byteOffsetToIndex (unsigned int offset, + const void *base HB_UNUSED, + const T *array HB_UNUSED) + { + return offset / 2; + } + template + static unsigned int wordOffsetToIndex (unsigned int offset, + const void *base HB_UNUSED, + const T *array HB_UNUSED) + { + return offset; + } +}; + +template +struct StateTableDriver +{ + StateTableDriver (const StateTable &machine_, + hb_buffer_t *buffer_, + hb_face_t *face_) : + machine (machine_), + buffer (buffer_), + num_glyphs (face_->get_num_glyphs ()) {} + + template + void drive (context_t *c) + { + if (!c->in_place) + buffer->clear_output (); + + int state = StateTable::STATE_START_OF_TEXT; + for (buffer->idx = 0; buffer->successful;) + { + unsigned int klass = buffer->idx < buffer->len ? + machine.get_class (buffer->info[buffer->idx].codepoint, num_glyphs) : + (unsigned) StateTable::CLASS_END_OF_TEXT; + DEBUG_MSG (APPLY, nullptr, "c%u at %u", klass, buffer->idx); + const Entry &entry = machine.get_entry (state, klass); + + /* Unsafe-to-break before this if not in state 0, as things might + * go differently if we start from state 0 here. + * + * Ugh. The indexing here is ugly... */ + if (state && buffer->backtrack_len () && buffer->idx < buffer->len) + { + /* If there's no action and we're just epsilon-transitioning to state 0, + * safe to break. */ + if (c->is_actionable (this, entry) || + !(entry.newState == StateTable::STATE_START_OF_TEXT && + entry.flags == context_t::DontAdvance)) + buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1); + } + + /* Unsafe-to-break if end-of-text would kick in here. */ + if (buffer->idx + 2 <= buffer->len) + { + const Entry &end_entry = machine.get_entry (state, StateTable::CLASS_END_OF_TEXT); + if (c->is_actionable (this, end_entry)) + buffer->unsafe_to_break (buffer->idx, buffer->idx + 2); + } + + c->transition (this, entry); + + state = machine.new_state (entry.newState); + DEBUG_MSG (APPLY, nullptr, "s%d", state); + + if (buffer->idx == buffer->len) + break; + + if (!(entry.flags & context_t::DontAdvance) || buffer->max_ops-- <= 0) + buffer->next_glyph (); + } + + if (!c->in_place) + { + for (; buffer->successful && buffer->idx < buffer->len;) + buffer->next_glyph (); + buffer->swap_buffers (); + } + } + + public: + const StateTable &machine; + hb_buffer_t *buffer; + unsigned int num_glyphs; +}; + + +struct ankr; + +struct hb_aat_apply_context_t : + hb_dispatch_context_t +{ + const char *get_name () { return "APPLY"; } + template + return_t dispatch (const T &obj) { return obj.apply (this); } + static return_t default_return_value () { return false; } + bool stop_sublookup_iteration (return_t r) const { return r; } + + const hb_ot_shape_plan_t *plan; + hb_font_t *font; + hb_face_t *face; + hb_buffer_t *buffer; + hb_sanitize_context_t sanitizer; + const ankr *ankr_table; + + /* Unused. For debug tracing only. */ + unsigned int lookup_index; + unsigned int debug_depth; + + HB_INTERNAL hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, + hb_font_t *font_, + hb_buffer_t *buffer_, + hb_blob_t *blob = const_cast (&Null(hb_blob_t))); + + HB_INTERNAL ~hb_aat_apply_context_t (); + + HB_INTERNAL void set_ankr_table (const AAT::ankr *ankr_table_); + + void set_lookup_index (unsigned int i) { lookup_index = i; } +}; + + +} /* namespace AAT */ + + +#endif /* HB_AAT_LAYOUT_COMMON_HH */ diff --git a/src/hb-aat-layout-feat-table.hh b/src/hb-aat-layout-feat-table.hh index 3e070d7..ab23ee0 100644 --- a/src/hb-aat-layout-feat-table.hh +++ b/src/hb-aat-layout-feat-table.hh @@ -25,7 +25,7 @@ #ifndef HB_AAT_LAYOUT_FEAT_TABLE_HH #define HB_AAT_LAYOUT_FEAT_TABLE_HH -#include "hb-aat-layout-common-private.hh" +#include "hb-aat-layout-common.hh" /* * feat -- Feature Name @@ -39,7 +39,28 @@ namespace AAT { struct SettingName { - inline bool sanitize (hb_sanitize_context_t *c) const + friend struct FeatureName; + + int cmp (hb_aat_layout_feature_selector_t key) const + { return (int) key - (int) setting; } + + hb_aat_layout_feature_selector_t get_selector () const + { return (hb_aat_layout_feature_selector_t) (unsigned) setting; } + + void get_info (hb_aat_layout_feature_selector_info_t *s, + hb_aat_layout_feature_selector_t default_selector) const + { + s->name_id = nameIndex; + + s->enable = (hb_aat_layout_feature_selector_t) (unsigned int) setting; + s->disable = default_selector == HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID ? + (hb_aat_layout_feature_selector_t) (s->enable + 1) : + default_selector; + + s->reserved = 0; + } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); @@ -51,35 +72,75 @@ struct SettingName public: DEFINE_SIZE_STATIC (4); }; +DECLARE_NULL_NAMESPACE_BYTES (AAT, SettingName); + +struct feat; struct FeatureName { - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - (base+settingTable).sanitize (c, nSettings))); - } + int cmp (hb_aat_layout_feature_type_t key) const + { return (int) key - (int) feature; } enum { - Exclusive = 0x8000, /* If set, the feature settings are mutually exclusive. */ - NotDefault = 0x4000, /* If clear, then the setting with an index of 0 in + Exclusive = 0x8000, /* If set, the feature settings are mutually exclusive. */ + NotDefault = 0x4000, /* If clear, then the setting with an index of 0 in * the setting name array for this feature should * be taken as the default for the feature * (if one is required). If set, then bits 0-15 of this * featureFlags field contain the index of the setting * which is to be taken as the default. */ - IndexMask = 0x00FF /* If bits 30 and 31 are set, then these sixteen bits + IndexMask = 0x00FF /* If bits 30 and 31 are set, then these sixteen bits * indicate the index of the setting in the setting name * array for this feature which should be taken * as the default. */ }; + unsigned int get_selector_infos (unsigned int start_offset, + unsigned int *selectors_count, /* IN/OUT. May be NULL. */ + hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ + unsigned int *pdefault_index, /* OUT. May be NULL. */ + const void *base) const + { + hb_array_t< const SettingName> settings_table = (base+settingTableZ).as_array (nSettings); + + static_assert (Index::NOT_FOUND_INDEX == HB_AAT_LAYOUT_NO_SELECTOR_INDEX, ""); + + hb_aat_layout_feature_selector_t default_selector = HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID; + unsigned int default_index = Index::NOT_FOUND_INDEX; + if (featureFlags & Exclusive) + { + default_index = (featureFlags & NotDefault) ? featureFlags & IndexMask : 0; + default_selector = settings_table[default_index].get_selector (); + } + if (pdefault_index) + *pdefault_index = default_index; + + if (selectors_count) + { + hb_array_t arr = settings_table.sub_array (start_offset, selectors_count); + for (unsigned int i = 0; i < arr.length; i++) + settings_table[start_offset + i].get_info (&selectors[i], default_selector); + } + return settings_table.length; + } + + hb_aat_layout_feature_type_t get_feature_type () const + { return (hb_aat_layout_feature_type_t) (unsigned int) feature; } + + hb_ot_name_id_t get_feature_name_id () const { return nameIndex; } + + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + (base+settingTableZ).sanitize (c, nSettings))); + } + protected: HBUINT16 feature; /* Feature type. */ HBUINT16 nSettings; /* The number of records in the setting name array. */ - LOffsetTo > - settingTable; /* Offset in bytes from the beginning of this table to + LOffsetTo, false> + settingTableZ; /* Offset in bytes from the beginning of this table to * this feature's setting name array. The actual type of * record this offset refers to will depend on the * exclusivity value, as described below. */ @@ -93,13 +154,49 @@ struct FeatureName struct feat { - static const hb_tag_t tableTag = HB_AAT_TAG_feat; + static constexpr hb_tag_t tableTag = HB_AAT_TAG_feat; + + bool has_data () const { return version.to_int (); } + + unsigned int get_feature_types (unsigned int start_offset, + unsigned int *count, + hb_aat_layout_feature_type_t *features) const + { + unsigned int feature_count = featureNameCount; + if (count && *count) + { + unsigned int len = MIN (feature_count - start_offset, *count); + for (unsigned int i = 0; i < len; i++) + features[i] = namesZ[i + start_offset].get_feature_type (); + *count = len; + } + return featureNameCount; + } + + const FeatureName& get_feature (hb_aat_layout_feature_type_t feature_type) const + { + return namesZ.bsearch (featureNameCount, feature_type); + } + + hb_ot_name_id_t get_feature_name_id (hb_aat_layout_feature_type_t feature) const + { return get_feature (feature).get_feature_name_id (); } + + unsigned int get_selector_infos (hb_aat_layout_feature_type_t feature_type, + unsigned int start_offset, + unsigned int *selectors_count, /* IN/OUT. May be NULL. */ + hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ + unsigned int *default_index /* OUT. May be NULL. */) const + { + return get_feature (feature_type).get_selector_infos (start_offset, selectors_count, selectors, + default_index, this); + } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - names.sanitize (c, featureNameCount, this))); + version.major == 1 && + namesZ.sanitize (c, featureNameCount, this))); } protected: @@ -109,8 +206,8 @@ struct feat /* The number of entries in the feature name array. */ HBUINT16 reserved1; /* Reserved (set to zero). */ HBUINT32 reserved2; /* Reserved (set to zero). */ - UnsizedArrayOf - names; /* The feature name array. */ + SortedUnsizedArrayOf + namesZ; /* The feature name array. */ public: DEFINE_SIZE_STATIC (24); }; diff --git a/src/hb-aat-layout-just-table.hh b/src/hb-aat-layout-just-table.hh new file mode 100644 index 0000000..d53f8f1 --- /dev/null +++ b/src/hb-aat-layout-just-table.hh @@ -0,0 +1,417 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_AAT_LAYOUT_JUST_TABLE_HH +#define HB_AAT_LAYOUT_JUST_TABLE_HH + +#include "hb-aat-layout-common.hh" +#include "hb-ot-layout.hh" +#include "hb-open-type.hh" + +#include "hb-aat-layout-morx-table.hh" + +/* + * just -- Justification + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6just.html + */ +#define HB_AAT_TAG_just HB_TAG('j','u','s','t') + + +namespace AAT { + +using namespace OT; + + +struct ActionSubrecordHeader +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + HBUINT16 actionClass; /* The JustClass value associated with this + * ActionSubrecord. */ + HBUINT16 actionType; /* The type of postcompensation action. */ + HBUINT16 actionLength; /* Length of this ActionSubrecord record, which + * must be a multiple of 4. */ + public: + DEFINE_SIZE_STATIC (6); +}; + +struct DecompositionAction +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + ActionSubrecordHeader + header; + Fixed lowerLimit; /* If the distance factor is less than this value, + * then the ligature is decomposed. */ + Fixed upperLimit; /* If the distance factor is greater than this value, + * then the ligature is decomposed. */ + HBUINT16 order; /* Numerical order in which this ligature will + * be decomposed; you may want infrequent ligatures + * to decompose before more frequent ones. The ligatures + * on the line of text will decompose in increasing + * value of this field. */ + ArrayOf + decomposedglyphs; + /* Number of 16-bit glyph indexes that follow; + * the ligature will be decomposed into these glyphs. + * + * Array of decomposed glyphs. */ + public: + DEFINE_SIZE_ARRAY (18, decomposedglyphs); +}; + +struct UnconditionalAddGlyphAction +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + protected: + ActionSubrecordHeader + header; + GlyphID addGlyph; /* Glyph that should be added if the distance factor + * is growing. */ + + public: + DEFINE_SIZE_STATIC (8); +}; + +struct ConditionalAddGlyphAction +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + protected: + ActionSubrecordHeader + header; + Fixed substThreshold; /* Distance growth factor (in ems) at which + * this glyph is replaced and the growth factor + * recalculated. */ + GlyphID addGlyph; /* Glyph to be added as kashida. If this value is + * 0xFFFF, no extra glyph will be added. Note that + * generally when a glyph is added, justification + * will need to be redone. */ + GlyphID substGlyph; /* Glyph to be substituted for this glyph if the + * growth factor equals or exceeds the value of + * substThreshold. */ + public: + DEFINE_SIZE_STATIC (14); +}; + +struct DuctileGlyphAction +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + protected: + ActionSubrecordHeader + header; + HBUINT32 variationAxis; /* The 4-byte tag identifying the ductile axis. + * This would normally be 0x64756374 ('duct'), + * but you may use any axis the font contains. */ + Fixed minimumLimit; /* The lowest value for the ductility axis tha + * still yields an acceptable appearance. Normally + * this will be 1.0. */ + Fixed noStretchValue; /* This is the default value that corresponds to + * no change in appearance. Normally, this will + * be 1.0. */ + Fixed maximumLimit; /* The highest value for the ductility axis that + * still yields an acceptable appearance. */ + public: + DEFINE_SIZE_STATIC (22); +}; + +struct RepeatedAddGlyphAction +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + protected: + ActionSubrecordHeader + header; + HBUINT16 flags; /* Currently unused; set to 0. */ + GlyphID glyph; /* Glyph that should be added if the distance factor + * is growing. */ + public: + DEFINE_SIZE_STATIC (10); +}; + +struct ActionSubrecord +{ + unsigned int get_length () const { return u.header.actionLength; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) + return_trace (false); + + switch (u.header.actionType) + { + case 0: return_trace (u.decompositionAction.sanitize (c)); + case 1: return_trace (u.unconditionalAddGlyphAction.sanitize (c)); + case 2: return_trace (u.conditionalAddGlyphAction.sanitize (c)); + // case 3: return_trace (u.stretchGlyphAction.sanitize (c)); + case 4: return_trace (u.decompositionAction.sanitize (c)); + case 5: return_trace (u.decompositionAction.sanitize (c)); + default: return_trace (true); + } + } + + protected: + union { + ActionSubrecordHeader header; + DecompositionAction decompositionAction; + UnconditionalAddGlyphAction unconditionalAddGlyphAction; + ConditionalAddGlyphAction conditionalAddGlyphAction; + /* StretchGlyphAction stretchGlyphAction; -- Not supported by CoreText */ + DuctileGlyphAction ductileGlyphAction; + RepeatedAddGlyphAction repeatedAddGlyphAction; + } u; /* Data. The format of this data depends on + * the value of the actionType field. */ + public: + DEFINE_SIZE_UNION (6, header); +}; + +struct PostcompensationActionChain +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) + return_trace (false); + + unsigned int offset = min_size; + for (unsigned int i = 0; i < count; i++) + { + const ActionSubrecord& subrecord = StructAtOffset (this, offset); + if (unlikely (!subrecord.sanitize (c))) return_trace (false); + offset += subrecord.get_length (); + } + + return_trace (true); + } + + protected: + HBUINT32 count; + + public: + DEFINE_SIZE_STATIC (4); +}; + +struct JustWidthDeltaEntry +{ + enum Flags + { + Reserved1 =0xE000,/* Reserved. You should set these bits to zero. */ + UnlimiteGap =0x1000,/* The glyph can take unlimited gap. When this + * glyph participates in the justification process, + * it and any other glyphs on the line having this + * bit set absorb all the remaining gap. */ + Reserved2 =0x0FF0,/* Reserved. You should set these bits to zero. */ + Priority =0x000F /* The justification priority of the glyph. */ + }; + + enum Priority + { + Kashida = 0, /* Kashida priority. This is the highest priority + * during justification. */ + Whitespace = 1, /* Whitespace priority. Any whitespace glyphs (as + * identified in the glyph properties table) will + * get this priority. */ + InterCharacter = 2, /* Inter-character priority. Give this to any + * remaining glyphs. */ + NullPriority = 3 /* Null priority. You should set this priority for + * glyphs that only participate in justification + * after the above priorities. Normally all glyphs + * have one of the previous three values. If you + * don't want a glyph to participate in justification, + * and you don't want to set its factors to zero, + * you may instead assign it to the null priority. */ + }; + + protected: + Fixed beforeGrowLimit;/* The ratio by which the advance width of the + * glyph is permitted to grow on the left or top side. */ + Fixed beforeShrinkLimit; + /* The ratio by which the advance width of the + * glyph is permitted to shrink on the left or top side. */ + Fixed afterGrowLimit; /* The ratio by which the advance width of the glyph + * is permitted to shrink on the left or top side. */ + Fixed afterShrinkLimit; + /* The ratio by which the advance width of the glyph + * is at most permitted to shrink on the right or + * bottom side. */ + HBUINT16 growFlags; /* Flags controlling the grow case. */ + HBUINT16 shrinkFlags; /* Flags controlling the shrink case. */ + + public: + DEFINE_SIZE_STATIC (20); +}; + +struct WidthDeltaPair +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + protected: + HBUINT32 justClass; /* The justification category associated + * with the wdRecord field. Only 7 bits of + * this field are used. (The other bits are + * used as padding to guarantee longword + * alignment of the following record). */ + JustWidthDeltaEntry + wdRecord; /* The actual width delta record. */ + + public: + DEFINE_SIZE_STATIC (24); +}; + +typedef OT::LArrayOf WidthDeltaCluster; + +struct JustificationCategory +{ + typedef void EntryData; + + 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. */ + MarkCategory =0x3F80,/* The justification category for the marked + * glyph if nonzero. */ + CurrentCategory =0x007F /* The justification category for the current + * glyph if nonzero. */ + }; + + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + morphHeader.sanitize (c) && + stHeader.sanitize (c))); + } + + protected: + ChainSubtable + morphHeader; /* Metamorphosis-style subtable header. */ + StateTable + stHeader; /* The justification insertion state table header */ + public: + DEFINE_SIZE_STATIC (30); +}; + +struct JustificationHeader +{ + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + justClassTable.sanitize (c, base, base) && + wdcTable.sanitize (c, base) && + pcTable.sanitize (c, base) && + lookupTable.sanitize (c, base))); + } + + protected: + OffsetTo + justClassTable; /* Offset to the justification category state table. */ + OffsetTo + wdcTable; /* Offset from start of justification table to start + * of the subtable containing the width delta factors + * for the glyphs in your font. + * + * The width delta clusters table. */ + OffsetTo + pcTable; /* Offset from start of justification table to start + * of postcompensation subtable (set to zero if none). + * + * The postcompensation subtable, if present in the font. */ + Lookup > + lookupTable; /* Lookup table associating glyphs with width delta + * clusters. See the description of Width Delta Clusters + * table for details on how to interpret the lookup values. */ + + public: + DEFINE_SIZE_MIN (8); +}; + +struct just +{ + static constexpr hb_tag_t tableTag = HB_AAT_TAG_just; + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + + return_trace (likely (c->check_struct (this) && + version.major == 1 && + horizData.sanitize (c, this, this) && + vertData.sanitize (c, this, this))); + } + + protected: + FixedVersion<>version; /* Version of the justification table + * (0x00010000u for version 1.0). */ + HBUINT16 format; /* Format of the justification table (set to 0). */ + OffsetTo + horizData; /* Byte offset from the start of the justification table + * to the header for tables that contain justification + * information for horizontal text. + * If you are not including this information, + * store 0. */ + OffsetTo + vertData; /* ditto, vertical */ + + public: + DEFINE_SIZE_STATIC (10); +}; + +} /* namespace AAT */ + + +#endif /* HB_AAT_LAYOUT_JUST_TABLE_HH */ diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index cc03d62..a64c807 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -28,8 +28,7 @@ #ifndef HB_AAT_LAYOUT_KERX_TABLE_HH #define HB_AAT_LAYOUT_KERX_TABLE_HH -#include "hb-open-type-private.hh" -#include "hb-aat-layout-common-private.hh" +#include "hb-kern.hh" #include "hb-aat-layout-ankr-table.hh" /* @@ -44,12 +43,42 @@ namespace AAT { using namespace OT; -struct KerxFormat0Records +static inline int +kerxTupleKern (int value, + unsigned int tupleCount, + const void *base, + hb_aat_apply_context_t *c) { - inline bool sanitize (hb_sanitize_context_t *c) const + if (likely (!tupleCount || !c)) return value; + + unsigned int offset = value; + const FWORD *pv = &StructAtOffset (base, offset); + if (unlikely (!c->sanitizer.check_array (pv, tupleCount))) return 0; + return *pv; +} + + +struct hb_glyph_pair_t +{ + hb_codepoint_t left; + hb_codepoint_t right; +}; + +struct KernPair +{ + int get_kerning () const { return value; } + + int cmp (const hb_glyph_pair_t &o) const + { + int ret = left.cmp (o.left); + if (ret) return ret; + return right.cmp (o.right); + } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + return_trace (c->check_struct (this)); } protected: @@ -60,286 +89,912 @@ struct KerxFormat0Records DEFINE_SIZE_STATIC (6); }; +template struct KerxSubTableFormat0 { - // TODO(ebraminio) Enable when we got suitable BinSearchArrayOf - // inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const - // { - // hb_glyph_pair_t pair = {left, right}; - // int i = pairs.bsearch (pair); - // if (i == -1) - // return 0; - // return pairs[i].get_kerning (); - // } - - inline bool sanitize (hb_sanitize_context_t *c) const + int get_kerning (hb_codepoint_t left, hb_codepoint_t right, + hb_aat_apply_context_t *c = nullptr) const + { + hb_glyph_pair_t pair = {left, right}; + int v = pairs.bsearch (pair).get_kerning (); + return kerxTupleKern (v, header.tuple_count (), this, c); + } + + bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + if (!c->plan->requested_kerning) + return false; + + if (header.coverage & header.Backwards) + return false; + + accelerator_t accel (*this, c); + hb_kern_machine_t machine (accel, header.coverage & header.CrossStream); + machine.kern (c->font, c->buffer, c->plan->kern_mask); + + return_trace (true); + } + + struct accelerator_t + { + const KerxSubTableFormat0 &table; + hb_aat_apply_context_t *c; + + accelerator_t (const KerxSubTableFormat0 &table_, + hb_aat_apply_context_t *c_) : + table (table_), c (c_) {} + + int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const + { return table.get_kerning (left, right, c); } + }; + + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - recordsZ.sanitize (c, nPairs))); + return_trace (likely (pairs.sanitize (c))); } protected: - // TODO(ebraminio): A custom version of "BinSearchArrayOf pairs;" is - // needed here to use HBUINT32 instead - HBUINT32 nPairs; /* The number of kerning pairs in this subtable */ - HBUINT32 searchRange; /* The largest power of two less than or equal to the value of nPairs, - * multiplied by the size in bytes of an entry in the subtable. */ - HBUINT32 entrySelector; /* This is calculated as log2 of the largest power of two less - * than or equal to the value of nPairs. */ - HBUINT32 rangeShift; /* The value of nPairs minus the largest power of two less than or equal to nPairs. */ - UnsizedArrayOf - recordsZ; /* VAR=nPairs */ + KernSubTableHeader header; + BinSearchArrayOf + pairs; /* Sorted kern records. */ public: - DEFINE_SIZE_ARRAY (16, recordsZ); + DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 16, pairs); }; -struct KerxSubTableFormat1 + +template +struct Format1Entry; + +template <> +struct Format1Entry { - inline bool sanitize (hb_sanitize_context_t *c) const + enum Flags { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - stateHeader.sanitize (c))); - } + Push = 0x8000, /* If set, push this glyph on the kerning stack. */ + DontAdvance = 0x4000, /* If set, don't advance to the next glyph + * before going to the new state. */ + Reset = 0x2000, /* If set, reset the kerning data (clear the stack) */ + Reserved = 0x1FFF, /* Not used; set to 0. */ + }; + + struct EntryData + { + HBUINT16 kernActionIndex;/* Index into the kerning value array. If + * this index is 0xFFFF, then no kerning + * is to be performed. */ + public: + DEFINE_SIZE_STATIC (2); + }; + + static bool performAction (const Entry &entry) + { return entry.data.kernActionIndex != 0xFFFF; } + + static unsigned int kernActionIndex (const Entry &entry) + { return entry.data.kernActionIndex; } +}; +template <> +struct Format1Entry +{ + enum Flags + { + Push = 0x8000, /* If set, push this glyph on the kerning stack. */ + DontAdvance = 0x4000, /* If set, don't advance to the next glyph + * before going to the new state. */ + Offset = 0x3FFF, /* Byte offset from beginning of subtable to the + * value table for the glyphs on the kerning stack. */ - protected: - StateTable stateHeader; - LOffsetTo > valueTable; - public: - DEFINE_SIZE_STATIC (20); + Reset = 0x0000, /* Not supported? */ + }; + + typedef void EntryData; + + static bool performAction (const Entry &entry) + { return entry.flags & Offset; } + + static unsigned int kernActionIndex (const Entry &entry) + { return entry.flags & Offset; } }; -// TODO(ebraminio): Maybe this can be replaced with Lookup? -struct KerxClassTable +template +struct KerxSubTableFormat1 { - inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; } + typedef typename KernSubTableHeader::Types Types; + typedef typename Types::HBUINT HBUINT; + + typedef Format1Entry Format1EntryT; + typedef typename Format1EntryT::EntryData EntryData; - inline bool sanitize (hb_sanitize_context_t *c) const + struct driver_context_t + { + static constexpr bool in_place = true; + enum + { + DontAdvance = Format1EntryT::DontAdvance, + }; + + driver_context_t (const KerxSubTableFormat1 *table_, + hb_aat_apply_context_t *c_) : + c (c_), + table (table_), + /* Apparently the offset kernAction is from the beginning of the state-machine, + * similar to offsets in morx table, NOT from beginning of this table, like + * other subtables in kerx. Discovered via testing. */ + kernAction (&table->machine + table->kernAction), + depth (0), + crossStream (table->header.coverage & table->header.CrossStream) {} + + bool is_actionable (StateTableDriver *driver HB_UNUSED, + const Entry &entry) + { + return Format1EntryT::performAction (entry); + } + void transition (StateTableDriver *driver, + const Entry &entry) + { + hb_buffer_t *buffer = driver->buffer; + unsigned int flags = entry.flags; + + if (flags & Format1EntryT::Reset) + depth = 0; + + if (flags & Format1EntryT::Push) + { + if (likely (depth < ARRAY_LENGTH (stack))) + stack[depth++] = buffer->idx; + else + depth = 0; /* Probably not what CoreText does, but better? */ + } + + if (Format1EntryT::performAction (entry) && depth) + { + unsigned int tuple_count = MAX (1u, table->header.tuple_count ()); + + unsigned int kern_idx = Format1EntryT::kernActionIndex (entry); + kern_idx = Types::byteOffsetToIndex (kern_idx, &table->machine, kernAction.arrayZ); + const FWORD *actions = &kernAction[kern_idx]; + if (!c->sanitizer.check_array (actions, depth, tuple_count)) + { + depth = 0; + return; + } + + hb_mask_t kern_mask = c->plan->kern_mask; + + /* From Apple 'kern' spec: + * "Each pops one glyph from the kerning stack and applies the kerning value to it. + * The end of the list is marked by an odd value... */ + bool last = false; + while (!last && depth) + { + unsigned int idx = stack[--depth]; + int v = *actions; + actions += tuple_count; + if (idx >= buffer->len) continue; + + /* "The end of the list is marked by an odd value..." */ + last = v & 1; + v &= ~1; + + hb_glyph_position_t &o = buffer->pos[idx]; + + /* Testing shows that CoreText only applies kern (cross-stream or not) + * if none has been applied by previous subtables. That is, it does + * NOT seem to accumulate as otherwise implied by specs. */ + + /* The following flag is undocumented in the spec, but described + * in the 'kern' table example. */ + if (v == -0x8000) + { + o.attach_type() = ATTACH_TYPE_NONE; + o.attach_chain() = 0; + o.x_offset = o.y_offset = 0; + } + else if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction)) + { + if (crossStream) + { + if (buffer->pos[idx].attach_type() && !buffer->pos[idx].y_offset) + { + o.y_offset = c->font->em_scale_y (v); + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; + } + } + else if (buffer->info[idx].mask & kern_mask) + { + if (!buffer->pos[idx].x_offset) + { + buffer->pos[idx].x_advance += c->font->em_scale_x (v); + buffer->pos[idx].x_offset += c->font->em_scale_x (v); + } + } + } + else + { + if (crossStream) + { + /* CoreText doesn't do crossStream kerning in vertical. We do. */ + if (buffer->pos[idx].attach_type() && !buffer->pos[idx].x_offset) + { + o.x_offset = c->font->em_scale_x (v); + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; + } + } + else if (buffer->info[idx].mask & kern_mask) + { + if (!buffer->pos[idx].y_offset) + { + buffer->pos[idx].y_advance += c->font->em_scale_y (v); + buffer->pos[idx].y_offset += c->font->em_scale_y (v); + } + } + } + } + } + } + + private: + hb_aat_apply_context_t *c; + const KerxSubTableFormat1 *table; + const UnsizedArrayOf &kernAction; + unsigned int stack[8]; + unsigned int depth; + bool crossStream; + }; + + bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + if (!c->plan->requested_kerning && + !(header.coverage & header.CrossStream)) + return false; + + driver_context_t dc (this, c); + + StateTableDriver driver (machine, c->buffer, c->font->face); + driver.drive (&dc); + + return_trace (true); + } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (firstGlyph.sanitize (c) && - classes.sanitize (c))); + /* The rest of array sanitizations are done at run-time. */ + return_trace (likely (c->check_struct (this) && + machine.sanitize (c))); } protected: - HBUINT16 firstGlyph; /* First glyph in class range. */ - ArrayOf classes; /* Glyph classes. */ + KernSubTableHeader header; + StateTable machine; + NNOffsetTo, HBUINT> kernAction; public: - DEFINE_SIZE_ARRAY (4, classes); + DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 5 * sizeof (HBUINT)); }; +template struct KerxSubTableFormat2 { - inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const - { - unsigned int l = (this+leftClassTable).get_class (left); - unsigned int r = (this+leftClassTable).get_class (left); - unsigned int offset = l * rowWidth + r * sizeof (FWORD); - const FWORD *arr = &(this+array); - if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end)) - return 0; - const FWORD *v = &StructAtOffset (arr, offset); - if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end)) - return 0; - return *v; + typedef typename KernSubTableHeader::Types Types; + typedef typename Types::HBUINT HBUINT; + + int get_kerning (hb_codepoint_t left, hb_codepoint_t right, + hb_aat_apply_context_t *c) const + { + unsigned int num_glyphs = c->sanitizer.get_num_glyphs (); + unsigned int l = (this+leftClassTable).get_class (left, num_glyphs, 0); + unsigned int r = (this+rightClassTable).get_class (right, num_glyphs, 0); + + const UnsizedArrayOf &arrayZ = this+array; + unsigned int kern_idx = l + r; + kern_idx = Types::offsetToIndex (kern_idx, this, &arrayZ); + const FWORD *v = &arrayZ[kern_idx]; + if (unlikely (!v->sanitize (&c->sanitizer))) return 0; + + return kerxTupleKern (*v, header.tuple_count (), this, c); + } + + bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + if (!c->plan->requested_kerning) + return false; + + if (header.coverage & header.Backwards) + return false; + + accelerator_t accel (*this, c); + hb_kern_machine_t machine (accel, header.coverage & header.CrossStream); + machine.kern (c->font, c->buffer, c->plan->kern_mask); + + return_trace (true); } - inline bool sanitize (hb_sanitize_context_t *c) const + struct accelerator_t + { + const KerxSubTableFormat2 &table; + hb_aat_apply_context_t *c; + + accelerator_t (const KerxSubTableFormat2 &table_, + hb_aat_apply_context_t *c_) : + table (table_), c (c_) {} + + int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const + { return table.get_kerning (left, right, c); } + }; + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - rowWidth.sanitize (c) && leftClassTable.sanitize (c, this) && rightClassTable.sanitize (c, this) && - array.sanitize (c, this))); + c->check_range (this, array))); } protected: - HBUINT32 rowWidth; /* The width, in bytes, of a row in the table. */ - LOffsetTo - leftClassTable; /* Offset from beginning of this subtable to - * left-hand class table. */ - LOffsetTo - rightClassTable;/* Offset from beginning of this subtable to - * right-hand class table. */ - LOffsetTo - array; /* Offset from beginning of this subtable to - * the start of the kerning array. */ + KernSubTableHeader header; + HBUINT rowWidth; /* The width, in bytes, of a row in the table. */ + NNOffsetTo + leftClassTable; /* Offset from beginning of this subtable to + * left-hand class table. */ + NNOffsetTo + rightClassTable;/* Offset from beginning of this subtable to + * right-hand class table. */ + NNOffsetTo, HBUINT> + array; /* Offset from beginning of this subtable to + * the start of the kerning array. */ public: - DEFINE_SIZE_STATIC (16); + DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 4 * sizeof (HBUINT)); }; +template struct KerxSubTableFormat4 { - inline bool sanitize (hb_sanitize_context_t *c) const + typedef ExtendedTypes Types; + + struct EntryData + { + HBUINT16 ankrActionIndex;/* Either 0xFFFF (for no action) or the index of + * the action to perform. */ + public: + DEFINE_SIZE_STATIC (2); + }; + + struct driver_context_t + { + static constexpr bool in_place = true; + enum Flags + { + Mark = 0x8000, /* If set, remember this glyph as the marked glyph. */ + DontAdvance = 0x4000, /* If set, don't advance to the next glyph before + * going to the new state. */ + Reserved = 0x3FFF, /* Not used; set to 0. */ + }; + + enum SubTableFlags + { + ActionType = 0xC0000000, /* A two-bit field containing the action type. */ + Unused = 0x3F000000, /* Unused - must be zero. */ + Offset = 0x00FFFFFF, /* Masks the offset in bytes from the beginning + * of the subtable to the beginning of the control + * point table. */ + }; + + driver_context_t (const KerxSubTableFormat4 *table, + hb_aat_apply_context_t *c_) : + c (c_), + action_type ((table->flags & ActionType) >> 30), + ankrData ((HBUINT16 *) ((const char *) &table->machine + (table->flags & Offset))), + mark_set (false), + mark (0) {} + + bool is_actionable (StateTableDriver *driver HB_UNUSED, + const Entry &entry) + { + return entry.data.ankrActionIndex != 0xFFFF; + } + void transition (StateTableDriver *driver, + const Entry &entry) + { + hb_buffer_t *buffer = driver->buffer; + + if (mark_set && entry.data.ankrActionIndex != 0xFFFF && buffer->idx < buffer->len) + { + hb_glyph_position_t &o = buffer->cur_pos(); + switch (action_type) + { + case 0: /* Control Point Actions.*/ + { + /* indexed into glyph outline. */ + const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex]; + if (!c->sanitizer.check_array (data, 2)) return; + HB_UNUSED unsigned int markControlPoint = *data++; + HB_UNUSED unsigned int currControlPoint = *data++; + hb_position_t markX = 0; + hb_position_t markY = 0; + hb_position_t currX = 0; + hb_position_t currY = 0; + if (!c->font->get_glyph_contour_point_for_origin (c->buffer->info[mark].codepoint, + markControlPoint, + HB_DIRECTION_LTR /*XXX*/, + &markX, &markY) || + !c->font->get_glyph_contour_point_for_origin (c->buffer->cur ().codepoint, + currControlPoint, + HB_DIRECTION_LTR /*XXX*/, + &currX, &currY)) + return; + + o.x_offset = markX - currX; + o.y_offset = markY - currY; + } + break; + + case 1: /* Anchor Point Actions. */ + { + /* Indexed into 'ankr' table. */ + const HBUINT16 *data = &ankrData[entry.data.ankrActionIndex]; + if (!c->sanitizer.check_array (data, 2)) return; + unsigned int markAnchorPoint = *data++; + unsigned int currAnchorPoint = *data++; + const Anchor &markAnchor = c->ankr_table->get_anchor (c->buffer->info[mark].codepoint, + markAnchorPoint, + c->sanitizer.get_num_glyphs ()); + const Anchor &currAnchor = c->ankr_table->get_anchor (c->buffer->cur ().codepoint, + currAnchorPoint, + c->sanitizer.get_num_glyphs ()); + + o.x_offset = c->font->em_scale_x (markAnchor.xCoordinate) - c->font->em_scale_x (currAnchor.xCoordinate); + o.y_offset = c->font->em_scale_y (markAnchor.yCoordinate) - c->font->em_scale_y (currAnchor.yCoordinate); + } + break; + + case 2: /* Control Point Coordinate Actions. */ + { + const FWORD *data = (const FWORD *) &ankrData[entry.data.ankrActionIndex]; + if (!c->sanitizer.check_array (data, 4)) return; + int markX = *data++; + int markY = *data++; + int currX = *data++; + int currY = *data++; + + o.x_offset = c->font->em_scale_x (markX) - c->font->em_scale_x (currX); + o.y_offset = c->font->em_scale_y (markY) - c->font->em_scale_y (currY); + } + break; + } + o.attach_type() = ATTACH_TYPE_MARK; + o.attach_chain() = (int) mark - (int) buffer->idx; + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; + } + + if (entry.flags & Mark) + { + mark_set = true; + mark = buffer->idx; + } + } + + private: + hb_aat_apply_context_t *c; + unsigned int action_type; + const HBUINT16 *ankrData; + bool mark_set; + unsigned int mark; + }; + + bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + driver_context_t dc (this, c); + + StateTableDriver driver (machine, c->buffer, c->font->face); + driver.drive (&dc); + + return_trace (true); + } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); + /* The rest of array sanitizations are done at run-time. */ return_trace (likely (c->check_struct (this) && - rowWidth.sanitize (c) && - leftClassTable.sanitize (c, this) && - rightClassTable.sanitize (c, this) && - array.sanitize (c, this))); + machine.sanitize (c))); } protected: - HBUINT32 rowWidth; /* The width, in bytes, of a row in the table. */ - LOffsetTo - leftClassTable; /* Offset from beginning of this subtable to - * left-hand class table. */ - LOffsetTo - rightClassTable;/* Offset from beginning of this subtable to - * right-hand class table. */ - LOffsetTo - array; /* Offset from beginning of this subtable to - * the start of the kerning array. */ + KernSubTableHeader header; + StateTable machine; + HBUINT32 flags; public: - DEFINE_SIZE_STATIC (16); + DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 20); }; +template struct KerxSubTableFormat6 { - inline bool sanitize (hb_sanitize_context_t *c) const + enum Flags + { + ValuesAreLong = 0x00000001, + }; + + bool is_long () const { return flags & ValuesAreLong; } + + int get_kerning (hb_codepoint_t left, hb_codepoint_t right, + hb_aat_apply_context_t *c) const + { + unsigned int num_glyphs = c->sanitizer.get_num_glyphs (); + if (is_long ()) + { + const typename U::Long &t = u.l; + unsigned int l = (this+t.rowIndexTable).get_value_or_null (left, num_glyphs); + unsigned int r = (this+t.columnIndexTable).get_value_or_null (right, num_glyphs); + unsigned int offset = l + r; + if (unlikely (offset < l)) return 0; /* Addition overflow. */ + if (unlikely (hb_unsigned_mul_overflows (offset, sizeof (FWORD32)))) return 0; + const FWORD32 *v = &StructAtOffset (&(this+t.array), offset * sizeof (FWORD32)); + if (unlikely (!v->sanitize (&c->sanitizer))) return 0; + return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c); + } + else + { + const typename U::Short &t = u.s; + unsigned int l = (this+t.rowIndexTable).get_value_or_null (left, num_glyphs); + unsigned int r = (this+t.columnIndexTable).get_value_or_null (right, num_glyphs); + unsigned int offset = l + r; + const FWORD *v = &StructAtOffset (&(this+t.array), offset * sizeof (FWORD)); + if (unlikely (!v->sanitize (&c->sanitizer))) return 0; + return kerxTupleKern (*v, header.tuple_count (), &(this+vector), c); + } + } + + bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + + if (!c->plan->requested_kerning) + return false; + + if (header.coverage & header.Backwards) + return false; + + accelerator_t accel (*this, c); + hb_kern_machine_t machine (accel, header.coverage & header.CrossStream); + machine.kern (c->font, c->buffer, c->plan->kern_mask); + + return_trace (true); + } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - rowIndexTable.sanitize (c, this) && - columnIndexTable.sanitize (c, this) && - kerningArray.sanitize (c, this) && - kerningVector.sanitize (c, this))); + (is_long () ? + ( + u.l.rowIndexTable.sanitize (c, this) && + u.l.columnIndexTable.sanitize (c, this) && + c->check_range (this, u.l.array) + ) : ( + u.s.rowIndexTable.sanitize (c, this) && + u.s.columnIndexTable.sanitize (c, this) && + c->check_range (this, u.s.array) + )) && + (header.tuple_count () == 0 || + c->check_range (this, vector)))); } + struct accelerator_t + { + const KerxSubTableFormat6 &table; + hb_aat_apply_context_t *c; + + accelerator_t (const KerxSubTableFormat6 &table_, + hb_aat_apply_context_t *c_) : + table (table_), c (c_) {} + + int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const + { return table.get_kerning (left, right, c); } + }; + protected: - HBUINT32 flags; - HBUINT16 rowCount; - HBUINT16 columnCount; - LOffsetTo > rowIndexTable; - LOffsetTo > columnIndexTable; - LOffsetTo > kerningArray; - LOffsetTo > kerningVector; + KernSubTableHeader header; + HBUINT32 flags; + HBUINT16 rowCount; + HBUINT16 columnCount; + union U + { + struct Long + { + LNNOffsetTo > rowIndexTable; + LNNOffsetTo > columnIndexTable; + LNNOffsetTo > array; + } l; + struct Short + { + LNNOffsetTo > rowIndexTable; + LNNOffsetTo > columnIndexTable; + LNNOffsetTo > array; + } s; + } u; + LNNOffsetTo > vector; public: - DEFINE_SIZE_STATIC (24); + DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 24); }; -enum coverage_flags_t + +struct KerxSubTableHeader { - COVERAGE_VERTICAL_FLAG = 0x80u, - COVERAGE_CROSSSTREAM_FLAG = 0x40u, - COVERAGE_VARIATION_FLAG = 0x20u, - COVERAGE_PROCESS_DIRECTION = 0x10u, + typedef ExtendedTypes Types; + + unsigned int tuple_count () const { return tupleCount; } + bool is_horizontal () const { return !(coverage & Vertical); } + + enum Coverage + { + Vertical = 0x80000000u, /* Set if table has vertical kerning values. */ + CrossStream = 0x40000000u, /* Set if table has cross-stream kerning values. */ + Variation = 0x20000000u, /* Set if table has variation kerning values. */ + Backwards = 0x10000000u, /* If clear, process the glyphs forwards, that + * is, from first to last in the glyph stream. + * If we, process them from last to first. + * This flag only applies to state-table based + * 'kerx' subtables (types 1 and 4). */ + Reserved = 0x0FFFFF00u, /* Reserved, set to zero. */ + SubtableType= 0x000000FFu, /* Subtable type. */ + }; + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + public: + HBUINT32 length; + HBUINT32 coverage; + HBUINT32 tupleCount; + public: + DEFINE_SIZE_STATIC (12); }; -struct KerxTable +struct KerxSubTable { - inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const + friend struct kerx; + + unsigned int get_size () const { return u.header.length; } + unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; } + + template + typename context_t::return_t dispatch (context_t *c) const { - TRACE_APPLY (this); - /* TODO */ - return_trace (false); + unsigned int subtable_type = get_type (); + TRACE_DISPATCH (this, subtable_type); + switch (subtable_type) { + case 0: return_trace (c->dispatch (u.format0)); + case 1: return_trace (c->dispatch (u.format1)); + case 2: return_trace (c->dispatch (u.format2)); + case 4: return_trace (c->dispatch (u.format4)); + case 6: return_trace (c->dispatch (u.format6)); + default: return_trace (c->default_return_value ()); + } } - inline unsigned int get_size (void) const { return length; } - - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (unlikely (!c->check_struct (this))) + if (!u.header.sanitize (c) || + u.header.length <= u.header.static_size || + !c->check_range (this, u.header.length)) return_trace (false); - switch (format) { - case 0: return u.format0.sanitize (c); - case 1: return u.format1.sanitize (c); - case 2: return u.format2.sanitize (c); - case 4: return u.format4.sanitize (c); - case 6: return u.format6.sanitize (c); - default:return_trace (false); - } + return_trace (dispatch (c)); } -protected: - HBUINT32 length; - HBUINT8 coverage; - HBUINT16 unused; - HBUINT8 format; - HBUINT32 tupleIndex; + public: union { - KerxSubTableFormat0 format0; - KerxSubTableFormat1 format1; - KerxSubTableFormat2 format2; - KerxSubTableFormat4 format4; - KerxSubTableFormat6 format6; + KerxSubTableHeader header; + KerxSubTableFormat0 format0; + KerxSubTableFormat1 format1; + KerxSubTableFormat2 format2; + KerxSubTableFormat4 format4; + KerxSubTableFormat6 format6; } u; -public: + public: DEFINE_SIZE_MIN (12); }; -struct SubtableGlyphCoverageArray + +/* + * The 'kerx' Table + */ + +template +struct KerxTable { - inline bool sanitize (hb_sanitize_context_t *c) const + /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ + const T* thiz () const { return static_cast (this); } + + bool has_state_machine () const { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); + typedef typename T::SubTable SubTable; + + const SubTable *st = &thiz()->firstSubTable; + unsigned int count = thiz()->tableCount; + for (unsigned int i = 0; i < count; i++) + { + if (st->get_type () == 1) + return true; + st = &StructAfter (*st); + } + return false; } - protected: - HBUINT32 length; - HBUINT32 coverage; - HBUINT32 tupleCount; - public: - DEFINE_SIZE_STATIC (12); -}; + bool has_cross_stream () const + { + typedef typename T::SubTable SubTable; -struct kerx -{ - static const hb_tag_t tableTag = HB_AAT_TAG_kerx; + const SubTable *st = &thiz()->firstSubTable; + unsigned int count = thiz()->tableCount; + for (unsigned int i = 0; i < count; i++) + { + if (st->u.header.coverage & st->u.header.CrossStream) + return true; + st = &StructAfter (*st); + } + return false; + } - inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const + int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - TRACE_APPLY (this); - const KerxTable &table = StructAfter (*this); - return_trace (table.apply (c, ankr)); + typedef typename T::SubTable SubTable; + + int v = 0; + const SubTable *st = &thiz()->firstSubTable; + unsigned int count = thiz()->tableCount; + for (unsigned int i = 0; i < count; i++) + { + if ((st->u.header.coverage & (st->u.header.Variation | st->u.header.CrossStream)) || + !st->u.header.is_horizontal ()) + continue; + v += st->get_kerning (left, right); + st = &StructAfter (*st); + } + return v; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool apply (AAT::hb_aat_apply_context_t *c) const { - TRACE_SANITIZE (this); - if (unlikely (!(c->check_struct (this)))) - return_trace (false); + typedef typename T::SubTable SubTable; + + bool ret = false; + bool seenCrossStream = false; + c->set_lookup_index (0); + const SubTable *st = &thiz()->firstSubTable; + unsigned int count = thiz()->tableCount; + for (unsigned int i = 0; i < count; i++) + { + bool reverse; + + if (!T::Types::extended && (st->u.header.coverage & st->u.header.Variation)) + goto skip; + + if (HB_DIRECTION_IS_HORIZONTAL (c->buffer->props.direction) != st->u.header.is_horizontal ()) + goto skip; + + reverse = bool (st->u.header.coverage & st->u.header.Backwards) != + HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction); + + if (!c->buffer->message (c->font, "start %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index)) + goto skip; + + if (!seenCrossStream && + (st->u.header.coverage & st->u.header.CrossStream)) + { + /* Attach all glyphs into a chain. */ + seenCrossStream = true; + hb_glyph_position_t *pos = c->buffer->pos; + unsigned int count = c->buffer->len; + for (unsigned int i = 0; i < count; i++) + { + pos[i].attach_type() = ATTACH_TYPE_CURSIVE; + pos[i].attach_chain() = HB_DIRECTION_IS_FORWARD (c->buffer->props.direction) ? -1 : +1; + /* We intentionally don't set HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT, + * since there needs to be a non-zero attachment for post-positioning to + * be needed. */ + } + } + + if (reverse) + c->buffer->reverse (); + + { + /* See comment in sanitize() for conditional here. */ + hb_sanitize_with_object_t with (&c->sanitizer, i < count - 1 ? st : (const SubTable *) nullptr); + ret |= st->dispatch (c); + } + + if (reverse) + c->buffer->reverse (); + + (void) c->buffer->message (c->font, "end %c%c%c%c subtable %d", HB_UNTAG (thiz()->tableTag), c->lookup_index); + + skip: + st = &StructAfter (*st); + c->set_lookup_index (c->lookup_index + 1); + } - /* TODO: Something like `morx`s ChainSubtable should be done here instead */ - const KerxTable *table = &StructAfter (*this); - if (unlikely (!(table->sanitize (c)))) + return ret; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!thiz()->version.sanitize (c) || + (unsigned) thiz()->version < (unsigned) T::minVersion || + !thiz()->tableCount.sanitize (c))) return_trace (false); - for (unsigned int i = 0; i < nTables - 1; ++i) + typedef typename T::SubTable SubTable; + + const SubTable *st = &thiz()->firstSubTable; + unsigned int count = thiz()->tableCount; + for (unsigned int i = 0; i < count; i++) { - table = &StructAfter (*table); - if (unlikely (!(table->sanitize (c)))) - return_trace (false); + if (unlikely (!st->u.header.sanitize (c))) + return_trace (false); + /* OpenType kern table has 2-byte subtable lengths. That's limiting. + * MS implementation also only supports one subtable, of format 0, + * anyway. Certain versions of some fonts, like Calibry, contain + * kern subtable that exceeds 64kb. Looks like, the subtable length + * is simply ignored. Which makes sense. It's only needed if you + * have multiple subtables. To handle such fonts, we just ignore + * the length for the last subtable. */ + hb_sanitize_with_object_t with (c, i < count - 1 ? st : (const SubTable *) nullptr); + + if (unlikely (!st->sanitize (c))) + return_trace (false); + + st = &StructAfter (*st); } - // If version is less than 3, we are done here; otherwise better to check footer also - if (version < 3) - return_trace (true); - - // TODO: Investigate why this just work on some fonts no matter of version - // const SubtableGlyphCoverageArray &footer = - // StructAfter (*table); - // return_trace (footer.sanitize (c)); - return_trace (true); } +}; + +struct kerx : KerxTable +{ + friend struct KerxTable; + + static constexpr hb_tag_t tableTag = HB_AAT_TAG_kerx; + static constexpr unsigned minVersion = 2u; + + typedef KerxSubTableHeader SubTableHeader; + typedef SubTableHeader::Types Types; + typedef KerxSubTable SubTable; + + bool has_data () const { return version; } protected: - HBUINT16 version; - HBUINT16 padding; - HBUINT32 nTables; -/*KerxTable tablesZ[VAR]; XXX ArrayOf??? */ -/*SubtableGlyphCoverageArray coverage_array;*/ + HBUINT16 version; /* The version number of the extended kerning table + * (currently 2, 3, or 4). */ + HBUINT16 unused; /* Set to 0. */ + HBUINT32 tableCount; /* The number of subtables included in the extended kerning + * table. */ + SubTable firstSubTable; /* Subtables. */ +/*subtableGlyphCoverageArray*/ /* Only if version >= 3. We don't use. */ + public: - DEFINE_SIZE_STATIC (8); + DEFINE_SIZE_MIN (8); }; + } /* namespace AAT */ diff --git a/src/hb-aat-layout-lcar-table.hh b/src/hb-aat-layout-lcar-table.hh new file mode 100644 index 0000000..4be799f --- /dev/null +++ b/src/hb-aat-layout-lcar-table.hh @@ -0,0 +1,93 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ +#ifndef HB_AAT_LAYOUT_LCAR_TABLE_HH +#define HB_AAT_LAYOUT_LCAR_TABLE_HH + +#include "hb-open-type.hh" +#include "hb-aat-layout-common.hh" + +/* + * lcar -- Ligature caret + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6lcar.html + */ +#define HB_AAT_TAG_lcar HB_TAG('l','c','a','r') + + +namespace AAT { + +typedef ArrayOf LigCaretClassEntry; + +struct lcar +{ + static constexpr hb_tag_t tableTag = HB_AAT_TAG_lcar; + + unsigned int get_lig_carets (hb_font_t *font, + hb_direction_t direction, + hb_codepoint_t glyph, + unsigned int start_offset, + unsigned int *caret_count /* IN/OUT */, + hb_position_t *caret_array /* OUT */) const + { + const OffsetTo* entry_offset = lookup.get_value (glyph, + font->face->get_num_glyphs ()); + const LigCaretClassEntry& array = entry_offset ? this+*entry_offset : Null (LigCaretClassEntry); + if (caret_count) + { + hb_array_t arr = array.sub_array (start_offset, caret_count); + unsigned int count = arr.length; + for (unsigned int i = 0; i < count; ++i) + switch (format) + { + case 0: caret_array[i] = font->em_scale_dir (arr[i], direction); break; + case 1: + hb_position_t x, y; + font->get_glyph_contour_point_for_origin (glyph, arr[i], direction, &x, &y); + caret_array[i] = HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y; + break; + } + } + return array.len; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + version.major == 1 && + lookup.sanitize (c, this))); + } + + protected: + FixedVersion<>version; /* Version number of the ligature caret table */ + HBUINT16 format; /* Format of the ligature caret table. */ + Lookup > + lookup; /* data Lookup table associating glyphs */ + + public: + DEFINE_SIZE_MIN (8); +}; + +} /* namespace AAT */ + +#endif /* HB_AAT_LAYOUT_LCAR_TABLE_HH */ diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index f258424..4a1d959 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -27,30 +27,36 @@ #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" -#include "hb-ot-layout-common-private.hh" +#include "hb-open-type.hh" +#include "hb-aat-layout-common.hh" +#include "hb-ot-layout-common.hh" +#include "hb-aat-map.hh" /* * morx -- Extended Glyph Metamorphosis * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html */ #define HB_AAT_TAG_morx HB_TAG('m','o','r','x') +#define HB_AAT_TAG_mort HB_TAG('m','o','r','t') namespace AAT { using namespace OT; - +template struct RearrangementSubtable { + typedef typename Types::HBUINT HBUINT; + typedef void EntryData; struct driver_context_t { - static const bool in_place = true; - enum Flags { + static constexpr 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 @@ -63,20 +69,20 @@ struct RearrangementSubtable Verb = 0x000F, /* The type of rearrangement specified. */ }; - inline driver_context_t (const RearrangementSubtable *table) : + driver_context_t (const RearrangementSubtable *table HB_UNUSED) : ret (false), start (0), end (0) {} - inline bool is_actionable (StateTableDriver *driver, - const Entry *entry) + bool is_actionable (StateTableDriver *driver HB_UNUSED, + const Entry &entry) { - return (entry->flags & Verb) && start < end; + return (entry.flags & Verb) && start < end; } - inline bool transition (StateTableDriver *driver, - const Entry *entry) + void transition (StateTableDriver *driver, + const Entry &entry) { hb_buffer_t *buffer = driver->buffer; - unsigned int flags = entry->flags; + unsigned int flags = entry.flags; if (flags & MarkFirst) start = buffer->idx; @@ -146,8 +152,6 @@ struct RearrangementSubtable } } } - - return true; } public: @@ -157,32 +161,35 @@ struct RearrangementSubtable unsigned int end; }; - inline bool apply (hb_aat_apply_context_t *c) const + bool apply (hb_aat_apply_context_t *c) const { TRACE_APPLY (this); driver_context_t dc (this); - StateTableDriver driver (machine, c->buffer, c->face); + StateTableDriver driver (machine, c->buffer, c->face); driver.drive (&dc); return_trace (dc.ret); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (machine.sanitize (c)); } protected: - StateTable machine; + StateTable machine; public: DEFINE_SIZE_STATIC (16); }; +template struct ContextualSubtable { + typedef typename Types::HBUINT HBUINT; + struct EntryData { HBUINT16 markIndex; /* Index of the substitution table for the @@ -195,101 +202,133 @@ struct ContextualSubtable struct driver_context_t { - static const bool in_place = true; - enum Flags { + static constexpr 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) : + driver_context_t (const ContextualSubtable *table_, + hb_aat_apply_context_t *c_) : ret (false), + c (c_), mark_set (false), mark (0), + table (table_), subs (table+table->substitutionTables) {} - inline bool is_actionable (StateTableDriver *driver, - const Entry *entry) + bool is_actionable (StateTableDriver *driver, + const Entry &entry) { hb_buffer_t *buffer = driver->buffer; if (buffer->idx == buffer->len && !mark_set) return false; - return entry->data.markIndex != 0xFFFF || entry->data.currentIndex != 0xFFFF; + return entry.data.markIndex != 0xFFFF || entry.data.currentIndex != 0xFFFF; } - inline bool transition (StateTableDriver *driver, - const Entry *entry) + void transition (StateTableDriver *driver, + const Entry &entry) { hb_buffer_t *buffer = driver->buffer; /* Looks like CoreText applies neither mark nor current substitution for * end-of-text if mark was not explicitly set. */ if (buffer->idx == buffer->len && !mark_set) - return true; + return; + + const GlyphID *replacement; - if (entry->data.markIndex != 0xFFFF) + replacement = nullptr; + if (Types::extended) { - const Lookup &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) + if (entry.data.markIndex != 0xFFFF) { - buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len)); - info[mark].codepoint = *replacement; - ret = true; + const Lookup &lookup = subs[entry.data.markIndex]; + replacement = lookup.get_value (buffer->info[mark].codepoint, driver->num_glyphs); } } - if (entry->data.currentIndex != 0xFFFF) + else + { + unsigned int offset = entry.data.markIndex + buffer->info[mark].codepoint; + const UnsizedArrayOf &subs_old = (const UnsizedArrayOf &) subs; + replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)]; + if (!replacement->sanitize (&c->sanitizer) || !*replacement) + replacement = nullptr; + } + if (replacement) { - unsigned int idx = MIN (buffer->idx, buffer->len - 1); - const Lookup &lookup = subs[entry->data.currentIndex]; - hb_glyph_info_t *info = buffer->info; - const GlyphID *replacement = lookup.get_value (info[idx].codepoint, driver->num_glyphs); - if (replacement) + buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len)); + buffer->info[mark].codepoint = *replacement; + ret = true; + } + + replacement = nullptr; + unsigned int idx = MIN (buffer->idx, buffer->len - 1); + if (Types::extended) + { + if (entry.data.currentIndex != 0xFFFF) { - info[idx].codepoint = *replacement; - ret = true; + const Lookup &lookup = subs[entry.data.currentIndex]; + replacement = lookup.get_value (buffer->info[idx].codepoint, driver->num_glyphs); } } + else + { + unsigned int offset = entry.data.currentIndex + buffer->info[idx].codepoint; + const UnsizedArrayOf &subs_old = (const UnsizedArrayOf &) subs; + replacement = &subs_old[Types::wordOffsetToIndex (offset, table, subs_old.arrayZ)]; + if (!replacement->sanitize (&c->sanitizer) || !*replacement) + replacement = nullptr; + } + if (replacement) + { + buffer->info[idx].codepoint = *replacement; + ret = true; + } - if (entry->flags & SetMark) + if (entry.flags & SetMark) { mark_set = true; mark = buffer->idx; } - - return true; } public: bool ret; private: + hb_aat_apply_context_t *c; bool mark_set; unsigned int mark; - const UnsizedOffsetListOf, HBUINT32> &subs; + const ContextualSubtable *table; + const UnsizedOffsetListOf, HBUINT, false> &subs; }; - inline bool apply (hb_aat_apply_context_t *c) const + bool apply (hb_aat_apply_context_t *c) const { TRACE_APPLY (this); - driver_context_t dc (this); + driver_context_t dc (this, c); - StateTableDriver driver (machine, c->buffer, c->face); + StateTableDriver driver (machine, c->buffer, c->face); driver.drive (&dc); return_trace (dc.ret); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); unsigned int num_entries = 0; if (unlikely (!machine.sanitize (c, &num_entries))) return_trace (false); + if (!Types::extended) + return_trace (substitutionTables.sanitize (c, this, 0)); + unsigned int num_lookups = 0; const Entry *entries = machine.get_entries (); @@ -307,16 +346,32 @@ struct ContextualSubtable } protected: - StateTable + StateTable machine; - LOffsetTo, HBUINT32> > + NNOffsetTo, HBUINT, false>, HBUINT> substitutionTables; public: DEFINE_SIZE_STATIC (20); }; -struct LigatureSubtable + +template +struct LigatureEntry; + +template <> +struct LigatureEntry { + 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. */ + }; + struct EntryData { HBUINT16 ligActionIndex; /* Index to the first ligActionTable entry @@ -326,19 +381,53 @@ struct LigatureSubtable DEFINE_SIZE_STATIC (2); }; - struct driver_context_t + static bool performAction (const Entry &entry) + { return entry.flags & PerformAction; } + + static unsigned int ligActionIndex (const Entry &entry) + { return entry.data.ligActionIndex; } +}; +template <> +struct LigatureEntry +{ + enum Flags { - static const bool in_place = false; - enum Flags { - SetComponent = 0x8000, /* Push this glyph onto the component stack for + SetComponent = 0x8000, /* Push this glyph onto the component stack for * eventual processing. */ - DontAdvance = 0x4000, /* Leave the glyph pointer at this glyph for the + 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. */ + Offset = 0x3FFF, /* Byte offset from beginning of subtable to the + * ligature action list. This value must be a + * multiple of 4. */ + }; + + typedef void EntryData; + + static bool performAction (const Entry &entry) + { return entry.flags & Offset; } + + static unsigned int ligActionIndex (const Entry &entry) + { return entry.flags & Offset; } +}; + + +template +struct LigatureSubtable +{ + typedef typename Types::HBUINT HBUINT; + + typedef LigatureEntry LigatureEntryT; + typedef typename LigatureEntryT::EntryData EntryData; + + struct driver_context_t + { + static constexpr bool in_place = false; + enum + { + DontAdvance = LigatureEntryT::DontAdvance, }; - enum LigActionFlags { + 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 @@ -349,96 +438,120 @@ struct LigatureSubtable * into the component table. */ }; - inline driver_context_t (const LigatureSubtable *table, - hb_aat_apply_context_t *c_) : + driver_context_t (const LigatureSubtable *table_, + hb_aat_apply_context_t *c_) : ret (false), c (c_), + table (table_), ligAction (table+table->ligAction), component (table+table->component), ligature (table+table->ligature), match_length (0) {} - inline bool is_actionable (StateTableDriver *driver, - const Entry *entry) + bool is_actionable (StateTableDriver *driver HB_UNUSED, + const Entry &entry) { - return !!(entry->flags & PerformAction); + return LigatureEntryT::performAction (entry); } - inline bool transition (StateTableDriver *driver, - const Entry *entry) + void transition (StateTableDriver *driver, + const Entry &entry) { hb_buffer_t *buffer = driver->buffer; - unsigned int flags = entry->flags; - if (flags & SetComponent) + DEBUG_MSG (APPLY, nullptr, "Ligature transition at %u", buffer->idx); + if (entry.flags & LigatureEntryT::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) + if (match_length && match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] == buffer->out_len) match_length--; - match_positions[match_length++] = buffer->out_len; + match_positions[match_length++ % ARRAY_LENGTH (match_positions)] = buffer->out_len; + DEBUG_MSG (APPLY, nullptr, "Set component at %u", buffer->out_len); } - if (flags & PerformAction) + if (LigatureEntryT::performAction (entry)) { + DEBUG_MSG (APPLY, nullptr, "Perform action with %u", match_length); unsigned int end = buffer->out_len; - unsigned int action_idx = entry->data.ligActionIndex; - unsigned int action; + + if (unlikely (!match_length)) + return; + + if (buffer->idx >= buffer->len) + return; /* TODO Work on previous instead? */ + + unsigned int cursor = match_length; + + unsigned int action_idx = LigatureEntryT::ligActionIndex (entry); + action_idx = Types::offsetToIndex (action_idx, table, ligAction.arrayZ); + const HBUINT32 *actionData = &ligAction[action_idx]; + unsigned int ligature_idx = 0; + unsigned int action; do { - if (unlikely (!match_length)) - return false; + if (unlikely (!cursor)) + { + /* Stack underflow. Clear the stack. */ + DEBUG_MSG (APPLY, nullptr, "Stack underflow"); + match_length = 0; + break; + } - buffer->move_to (match_positions[--match_length]); + DEBUG_MSG (APPLY, nullptr, "Moving to stack position %u", cursor - 1); + buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]); - const HBUINT32 &actionData = ligAction[action_idx]; - if (unlikely (!actionData.sanitize (&c->sanitizer))) return false; - action = actionData; + if (unlikely (!actionData->sanitize (&c->sanitizer))) break; + action = *actionData; uint32_t uoffset = action & LigActionOffset; if (uoffset & 0x20000000) - uoffset += 0xC0000000; + uoffset |= 0xC0000000; /* Sign-extend. */ int32_t offset = (int32_t) uoffset; unsigned int component_idx = buffer->cur().codepoint + offset; - + component_idx = Types::wordOffsetToIndex (component_idx, table, component.arrayZ); const HBUINT16 &componentData = component[component_idx]; - if (unlikely (!componentData.sanitize (&c->sanitizer))) return false; + if (unlikely (!componentData.sanitize (&c->sanitizer))) break; ligature_idx += componentData; + DEBUG_MSG (APPLY, nullptr, "Action store %u last %u", + bool (action & LigActionStore), + bool (action & LigActionLast)); if (action & (LigActionStore | LigActionLast)) { + ligature_idx = Types::offsetToIndex (ligature_idx, table, ligature.arrayZ); const GlyphID &ligatureData = ligature[ligature_idx]; - if (unlikely (!ligatureData.sanitize (&c->sanitizer))) return false; + if (unlikely (!ligatureData.sanitize (&c->sanitizer))) break; hb_codepoint_t lig = ligatureData; - match_positions[match_length++] = buffer->out_len; + DEBUG_MSG (APPLY, nullptr, "Produced ligature %u", lig); buffer->replace_glyph (lig); - //ligature_idx = 0; // XXX Yes or no? - } - else - { - buffer->skip_glyph (); - end--; + unsigned int lig_end = match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] + 1u; + /* Now go and delete all subsequent components. */ + while (match_length - 1u > cursor) + { + DEBUG_MSG (APPLY, nullptr, "Skipping ligature component"); + buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]); + buffer->replace_glyph (DELETED_GLYPH); + } + + buffer->move_to (lig_end); + buffer->merge_out_clusters (match_positions[cursor % ARRAY_LENGTH (match_positions)], buffer->out_len); } - /* TODO merge_clusters / unsafe_to_break */ - action_idx++; + actionData++; } while (!(action & LigActionLast)); buffer->move_to (end); } - - return true; } public: bool ret; private: hb_aat_apply_context_t *c; + const LigatureSubtable *table; const UnsizedArrayOf &ligAction; const UnsizedArrayOf &component; const UnsizedArrayOf &ligature; @@ -446,19 +559,19 @@ struct LigatureSubtable unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; }; - inline bool apply (hb_aat_apply_context_t *c) const + bool apply (hb_aat_apply_context_t *c) const { TRACE_APPLY (this); driver_context_t dc (this, c); - StateTableDriver driver (machine, c->buffer, c->face); + StateTableDriver driver (machine, c->buffer, c->face); driver.drive (&dc); return_trace (dc.ret); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); /* The rest of array sanitizations are done at run-time. */ @@ -467,21 +580,22 @@ struct LigatureSubtable } protected: - StateTable + StateTable machine; - LOffsetTo > + NNOffsetTo, HBUINT> ligAction; /* Offset to the ligature action table. */ - LOffsetTo > + NNOffsetTo, HBUINT> component; /* Offset to the component table. */ - LOffsetTo > + NNOffsetTo, HBUINT> ligature; /* Offset to the actual ligature lists. */ public: DEFINE_SIZE_STATIC (28); }; +template struct NoncontextualSubtable { - inline bool apply (hb_aat_apply_context_t *c) const + bool apply (hb_aat_apply_context_t *c) const { TRACE_APPLY (this); @@ -503,7 +617,7 @@ struct NoncontextualSubtable return_trace (ret); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (substitute.sanitize (c)); @@ -515,27 +629,207 @@ struct NoncontextualSubtable DEFINE_SIZE_MIN (2); }; +template struct InsertionSubtable { - inline bool apply (hb_aat_apply_context_t *c) const + typedef typename Types::HBUINT HBUINT; + + struct EntryData + { + HBUINT16 currentInsertIndex; /* Zero-based index into the insertion glyph table. + * The number of glyphs to be inserted is contained + * in the currentInsertCount field in the flags. + * A value of 0xFFFF indicates no insertion is to + * be done. */ + HBUINT16 markedInsertIndex; /* Zero-based index into the insertion glyph table. + * The number of glyphs to be inserted is contained + * in the markedInsertCount field in the flags. + * A value of 0xFFFF indicates no insertion is to + * be done. */ + public: + DEFINE_SIZE_STATIC (4); + }; + + struct driver_context_t + { + static constexpr bool in_place = false; + enum Flags + { + SetMark = 0x8000, /* If set, mark the current glyph. */ + DontAdvance = 0x4000, /* If set, don't advance to the next glyph before + * going to the new state. This does not mean + * that the glyph pointed to is the same one as + * before. If you've made insertions immediately + * downstream of the current glyph, the next glyph + * processed would in fact be the first one + * inserted. */ + CurrentIsKashidaLike= 0x2000, /* If set, and the currentInsertList is nonzero, + * then the specified glyph list will be inserted + * as a kashida-like insertion, either before or + * after the current glyph (depending on the state + * of the currentInsertBefore flag). If clear, and + * the currentInsertList is nonzero, then the + * specified glyph list will be inserted as a + * split-vowel-like insertion, either before or + * after the current glyph (depending on the state + * of the currentInsertBefore flag). */ + MarkedIsKashidaLike= 0x1000, /* If set, and the markedInsertList is nonzero, + * then the specified glyph list will be inserted + * as a kashida-like insertion, either before or + * after the marked glyph (depending on the state + * of the markedInsertBefore flag). If clear, and + * the markedInsertList is nonzero, then the + * specified glyph list will be inserted as a + * split-vowel-like insertion, either before or + * after the marked glyph (depending on the state + * of the markedInsertBefore flag). */ + CurrentInsertBefore= 0x0800, /* If set, specifies that insertions are to be made + * to the left of the current glyph. If clear, + * they're made to the right of the current glyph. */ + MarkedInsertBefore= 0x0400, /* If set, specifies that insertions are to be + * made to the left of the marked glyph. If clear, + * they're made to the right of the marked glyph. */ + CurrentInsertCount= 0x3E0, /* This 5-bit field is treated as a count of the + * number of glyphs to insert at the current + * position. Since zero means no insertions, the + * largest number of insertions at any given + * current location is 31 glyphs. */ + MarkedInsertCount= 0x001F, /* This 5-bit field is treated as a count of the + * number of glyphs to insert at the marked + * position. Since zero means no insertions, the + * largest number of insertions at any given + * marked location is 31 glyphs. */ + }; + + driver_context_t (const InsertionSubtable *table, + hb_aat_apply_context_t *c_) : + ret (false), + c (c_), + mark (0), + insertionAction (table+table->insertionAction) {} + + bool is_actionable (StateTableDriver *driver HB_UNUSED, + const Entry &entry) + { + return (entry.flags & (CurrentInsertCount | MarkedInsertCount)) && + (entry.data.currentInsertIndex != 0xFFFF ||entry.data.markedInsertIndex != 0xFFFF); + } + void transition (StateTableDriver *driver, + const Entry &entry) + { + hb_buffer_t *buffer = driver->buffer; + unsigned int flags = entry.flags; + + unsigned mark_loc = buffer->out_len; + + if (entry.data.markedInsertIndex != 0xFFFF) + { + unsigned int count = (flags & MarkedInsertCount); + unsigned int start = entry.data.markedInsertIndex; + const GlyphID *glyphs = &insertionAction[start]; + if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0; + + bool before = flags & MarkedInsertBefore; + + unsigned int end = buffer->out_len; + buffer->move_to (mark); + + if (buffer->idx < buffer->len && !before) + buffer->copy_glyph (); + /* TODO We ignore KashidaLike setting. */ + for (unsigned int i = 0; i < count; i++) + buffer->output_glyph (glyphs[i]); + if (buffer->idx < buffer->len && !before) + buffer->skip_glyph (); + + buffer->move_to (end + count); + + buffer->unsafe_to_break_from_outbuffer (mark, MIN (buffer->idx + 1, buffer->len)); + } + + if (flags & SetMark) + mark = mark_loc; + + if (entry.data.currentInsertIndex != 0xFFFF) + { + unsigned int count = (flags & CurrentInsertCount) >> 5; + unsigned int start = entry.data.currentInsertIndex; + const GlyphID *glyphs = &insertionAction[start]; + if (unlikely (!c->sanitizer.check_array (glyphs, count))) count = 0; + + bool before = flags & CurrentInsertBefore; + + unsigned int end = buffer->out_len; + + if (buffer->idx < buffer->len && !before) + buffer->copy_glyph (); + /* TODO We ignore KashidaLike setting. */ + for (unsigned int i = 0; i < count; i++) + buffer->output_glyph (glyphs[i]); + if (buffer->idx < buffer->len && !before) + buffer->skip_glyph (); + + /* Humm. Not sure where to move to. There's this wording under + * DontAdvance flag: + * + * "If set, don't update the glyph index before going to the new state. + * This does not mean that the glyph pointed to is the same one as + * before. If you've made insertions immediately downstream of the + * current glyph, the next glyph processed would in fact be the first + * one inserted." + * + * This suggests that if DontAdvance is NOT set, we should move to + * end+count. If it *was*, then move to end, such that newly inserted + * glyphs are now visible. + * + * https://github.com/harfbuzz/harfbuzz/issues/1224#issuecomment-427691417 + */ + buffer->move_to ((flags & DontAdvance) ? end : end + count); + } + } + + public: + bool ret; + private: + hb_aat_apply_context_t *c; + unsigned int mark; + const UnsizedArrayOf &insertionAction; + }; + + bool apply (hb_aat_apply_context_t *c) const { TRACE_APPLY (this); - /* TODO */ - return_trace (false); + + driver_context_t dc (this, c); + + StateTableDriver driver (machine, c->buffer, c->face); + driver.drive (&dc); + + return_trace (dc.ret); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - /* TODO */ - return_trace (true); + /* The rest of array sanitizations are done at run-time. */ + return_trace (c->check_struct (this) && machine.sanitize (c) && + insertionAction); } + + protected: + StateTable + machine; + NNOffsetTo, HBUINT> + insertionAction; /* Byte offset from stateHeader to the start of + * the insertion glyph table. */ + public: + DEFINE_SIZE_STATIC (20); }; struct Feature { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); @@ -553,15 +847,35 @@ struct Feature DEFINE_SIZE_STATIC (12); }; - +template struct ChainSubtable { + typedef typename Types::HBUINT HBUINT; + + template friend struct Chain; - inline unsigned int get_size (void) const { return length; } - inline unsigned int get_type (void) const { return coverage & 0xFF; } + unsigned int get_size () const { return length; } + unsigned int get_type () const { return coverage & 0xFF; } + unsigned int get_coverage () const { return coverage >> (sizeof (HBUINT) * 8 - 8); } - enum Type { + enum Coverage + { + Vertical = 0x80, /* If set, this subtable will only be applied + * to vertical text. If clear, this subtable + * will only be applied to horizontal text. */ + Backwards = 0x40, /* If set, this subtable will process glyphs + * in descending order. If clear, it will + * process the glyphs in ascending order. */ + AllDirections = 0x20, /* If set, this subtable will be applied to + * both horizontal and vertical text (i.e. + * the state of bit 0x80000000 is ignored). */ + Logical = 0x10, /* If set, this subtable will process glyphs + * in logical order (or reverse logical order, + * depending on the value of bit 0x80000000). */ + }; + enum Type + { Rearrangement = 0, Contextual = 1, Ligature = 2, @@ -569,13 +883,8 @@ struct ChainSubtable Insertion = 5 }; - inline void apply (hb_aat_apply_context_t *c) const - { - dispatch (c); - } - template - inline typename context_t::return_t dispatch (context_t *c) const + typename context_t::return_t dispatch (context_t *c) const { unsigned int subtable_type = get_type (); TRACE_DISPATCH (this, subtable_type); @@ -589,58 +898,147 @@ struct ChainSubtable } } - inline bool sanitize (hb_sanitize_context_t *c) const + bool apply (hb_aat_apply_context_t *c) const + { + TRACE_APPLY (this); + hb_sanitize_with_object_t with (&c->sanitizer, this); + return_trace (dispatch (c)); + } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); if (!length.sanitize (c) || - length < min_size || + length <= min_size || !c->check_range (this, length)) return_trace (false); + hb_sanitize_with_object_t with (c, this); return_trace (dispatch (c)); } protected: - HBUINT32 length; /* Total subtable length, including this header. */ - HBUINT32 coverage; /* Coverage flags and subtable type. */ + HBUINT length; /* Total subtable length, including this header. */ + HBUINT 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; + RearrangementSubtable rearrangement; + ContextualSubtable contextual; + LigatureSubtable ligature; + NoncontextualSubtable noncontextual; + InsertionSubtable insertion; } u; public: - DEFINE_SIZE_MIN (12); + DEFINE_SIZE_MIN (2 * sizeof (HBUINT) + 4); }; +template struct Chain { - inline void apply (hb_aat_apply_context_t *c) const + typedef typename Types::HBUINT HBUINT; + + hb_mask_t compile_flags (const hb_aat_map_builder_t *map) const { - const ChainSubtable *subtable = &StructAtOffset (featureZ, featureZ[0].static_size * featureCount); + hb_mask_t flags = defaultFlags; + { + unsigned int count = featureCount; + for (unsigned i = 0; i < count; i++) + { + const Feature &feature = featureZ[i]; + hb_aat_layout_feature_type_t type = (hb_aat_layout_feature_type_t) (unsigned int) feature.featureType; + hb_aat_layout_feature_selector_t setting = (hb_aat_layout_feature_selector_t) (unsigned int) feature.featureSetting; + retry: + const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch (type); + if (info && info->setting == setting) + { + flags &= feature.disableFlags; + flags |= feature.enableFlags; + } + else if (type == HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE && setting == HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS) + { + /* Deprecated. https://github.com/harfbuzz/harfbuzz/issues/1342 */ + type = HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE; + setting = HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS; + goto retry; + } + } + } + return flags; + } + + void apply (hb_aat_apply_context_t *c, + hb_mask_t flags) const + { + const ChainSubtable *subtable = &StructAfter > (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { + bool reverse; + + if (!(subtable->subFeatureFlags & flags)) + goto skip; + + if (!(subtable->get_coverage() & ChainSubtable::AllDirections) && + HB_DIRECTION_IS_VERTICAL (c->buffer->props.direction) != + bool (subtable->get_coverage() & ChainSubtable::Vertical)) + goto skip; + + /* Buffer contents is always in logical direction. Determine if + * we need to reverse before applying this subtable. We reverse + * back after if we did reverse indeed. + * + * Quoting the spac: + * """ + * Bits 28 and 30 of the coverage field control the order in which + * glyphs are processed when the subtable is run by the layout engine. + * Bit 28 is used to indicate if the glyph processing direction is + * the same as logical order or layout order. Bit 30 is used to + * indicate whether glyphs are processed forwards or backwards within + * that order. + + Bit 30 Bit 28 Interpretation for Horizontal Text + 0 0 The subtable is processed in layout order + (the same order as the glyphs, which is + always left-to-right). + 1 0 The subtable is processed in reverse layout order + (the order opposite that of the glyphs, which is + always right-to-left). + 0 1 The subtable is processed in logical order + (the same order as the characters, which may be + left-to-right or right-to-left). + 1 1 The subtable is processed in reverse logical order + (the order opposite that of the characters, which + may be right-to-left or left-to-right). + */ + reverse = subtable->get_coverage () & ChainSubtable::Logical ? + bool (subtable->get_coverage () & ChainSubtable::Backwards) : + bool (subtable->get_coverage () & ChainSubtable::Backwards) != + HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction); + if (!c->buffer->message (c->font, "start chain subtable %d", c->lookup_index)) - { - c->set_lookup_index (c->lookup_index + 1); - continue; - } + goto skip; + + if (reverse) + c->buffer->reverse (); subtable->apply (c); - subtable = &StructAfter (*subtable); + + if (reverse) + c->buffer->reverse (); (void) c->buffer->message (c->font, "end chain subtable %d", c->lookup_index); + if (unlikely (!c->buffer->successful)) return; + + skip: + subtable = &StructAfter > (*subtable); c->set_lookup_index (c->lookup_index + 1); } } - inline unsigned int get_size (void) const { return length; } + unsigned int get_size () const { return length; } - inline bool sanitize (hb_sanitize_context_t *c, unsigned int major) const + bool sanitize (hb_sanitize_context_t *c, unsigned int version HB_UNUSED) const { TRACE_SANITIZE (this); if (!length.sanitize (c) || @@ -648,16 +1046,16 @@ struct Chain !c->check_range (this, length)) return_trace (false); - if (!c->check_array (featureZ, featureZ[0].static_size, featureCount)) + if (!c->check_array (featureZ.arrayZ, featureCount)) return_trace (false); - const ChainSubtable *subtable = &StructAtOffset (featureZ, featureZ[0].static_size * featureCount); + const ChainSubtable *subtable = &StructAfter > (featureZ.as_array (featureCount)); unsigned int count = subtableCount; for (unsigned int i = 0; i < count; i++) { if (!subtable->sanitize (c)) return_trace (false); - subtable = &StructAfter (*subtable); + subtable = &StructAfter > (*subtable); } return_trace (true); @@ -666,69 +1064,95 @@ struct Chain 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. */ + HBUINT featureCount; /* Number of feature subtable entries. */ + HBUINT subtableCount; /* The number of subtables in the chain. */ - Feature featureZ[VAR]; /* Features. */ -/*ChainSubtable subtableX[VAR];*//* Subtables. */ -/*subtableGlyphCoverageArray*/ /* Only if major == 3. */ + UnsizedArrayOf featureZ; /* Features. */ +/*ChainSubtable firstSubtable;*//* Subtables. */ +/*subtableGlyphCoverageArray*/ /* Only if version >= 3. We don't use. */ public: - DEFINE_SIZE_MIN (16); + DEFINE_SIZE_MIN (8 + 2 * sizeof (HBUINT)); }; /* - * The 'mort'/'morx' Tables + * The 'mort'/'morx' Table */ -struct morx +template +struct mortmorx { - static const hb_tag_t tableTag = HB_AAT_TAG_morx; + static constexpr hb_tag_t tableTag = HB_AAT_TAG_morx; + + bool has_data () const { return version != 0; } + + void compile_flags (const hb_aat_map_builder_t *mapper, + hb_aat_map_t *map) const + { + const Chain *chain = &firstChain; + unsigned int count = chainCount; + for (unsigned int i = 0; i < count; i++) + { + map->chain_flags.push (chain->compile_flags (mapper)); + chain = &StructAfter > (*chain); + } + } - inline void apply (hb_aat_apply_context_t *c) const + void apply (hb_aat_apply_context_t *c) const { + if (unlikely (!c->buffer->successful)) return; c->set_lookup_index (0); - const Chain *chain = chainsZ; + const Chain *chain = &firstChain; unsigned int count = chainCount; for (unsigned int i = 0; i < count; i++) { - chain->apply (c); - chain = &StructAfter (*chain); + chain->apply (c, c->plan->aat_map.chain_flags[i]); + if (unlikely (!c->buffer->successful)) return; + chain = &StructAfter > (*chain); } } - inline bool sanitize (hb_sanitize_context_t *c) const + 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)) + if (!version.sanitize (c) || !version || !chainCount.sanitize (c)) return_trace (false); - const Chain *chain = chainsZ; + const Chain *chain = &firstChain; unsigned int count = chainCount; for (unsigned int i = 0; i < count; i++) { - if (!chain->sanitize (c, version.major)) + if (!chain->sanitize (c, version)) return_trace (false); - chain = &StructAfter (*chain); + chain = &StructAfter > (*chain); } return_trace (true); } protected: - FixedVersion<>version; /* Version number of the glyph metamorphosis table. - * 1 for mort, 2 or 3 for morx. */ + HBUINT16 version; /* Version number of the glyph metamorphosis table. + * 1, 2, or 3. */ + HBUINT16 unused; /* Set to 0. */ HBUINT32 chainCount; /* Number of metamorphosis chains contained in this * table. */ - Chain chainsZ[VAR]; /* Chains. */ + Chain firstChain; /* Chains. */ public: DEFINE_SIZE_MIN (8); }; +struct morx : mortmorx +{ + static constexpr hb_tag_t tableTag = HB_AAT_TAG_morx; +}; +struct mort : mortmorx +{ + static constexpr hb_tag_t tableTag = HB_AAT_TAG_mort; +}; + + } /* namespace AAT */ diff --git a/src/hb-aat-layout-private.hh b/src/hb-aat-layout-private.hh deleted file mode 100644 index ce75c8e..0000000 --- a/src/hb-aat-layout-private.hh +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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); - -HB_INTERNAL void -hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer); - -#endif /* HB_AAT_LAYOUT_PRIVATE_HH */ diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index 0617e23..0c8e455 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -28,9 +28,9 @@ #ifndef HB_AAT_LAYOUT_TRAK_TABLE_HH #define HB_AAT_LAYOUT_TRAK_TABLE_HH -#include "hb-aat-layout-common-private.hh" -#include "hb-ot-layout-private.hh" -#include "hb-open-type-private.hh" +#include "hb-aat-layout-common.hh" +#include "hb-ot-layout.hh" +#include "hb-open-type.hh" /* * trak -- Tracking @@ -46,29 +46,27 @@ struct TrackTableEntry { friend struct TrackData; - inline bool sanitize (hb_sanitize_context_t *c, const void *base, - unsigned int size) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - (valuesZ.sanitize (c, base, size)))); - } + float get_track_value () const { return track.to_float (); } - private: - inline float get_track_value () const - { - return track.to_float (); - } + int get_value (const void *base, unsigned int index, + unsigned int table_size) const + { return (base+valuesZ).as_array (table_size)[index]; } - inline int get_value (const void *base, unsigned int index) const + public: + bool sanitize (hb_sanitize_context_t *c, const void *base, + unsigned int table_size) const { - return (base+valuesZ)[index]; + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + (valuesZ.sanitize (c, base, table_size)))); } protected: Fixed track; /* Track value for this record. */ - NameID trackNameID; /* The 'name' table index for this track */ - OffsetTo > + NameID trackNameID; /* The 'name' table index for this track. + * (a short word or phrase like "loose" + * or "very tight") */ + NNOffsetTo > valuesZ; /* Offset from start of tracking table to * per-size tracking values for this track. */ @@ -78,15 +76,22 @@ struct TrackTableEntry struct TrackData { - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + float interpolate_at (unsigned int idx, + float target_size, + const TrackTableEntry &trackTableEntry, + const void *base) const { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - sizeTable.sanitize (c, base, nSizes) && - trackTable.sanitize (c, nTracks, base, nSizes)); + unsigned int sizes = nSizes; + hb_array_t size_table ((base+sizeTable).arrayZ, sizes); + + float s0 = size_table[idx].to_float (); + float s1 = size_table[idx + 1].to_float (); + float t = unlikely (s0 == s1) ? 0.f : (target_size - s0) / (s1 - s0); + return t * trackTableEntry.get_value (base, idx + 1, sizes) + + (1.f - t) * trackTableEntry.get_value (base, idx, sizes); } - inline float get_tracking (const void *base, float ptem) const + int get_tracking (const void *base, float ptem) const { /* CoreText points are CSS pixels (96 per inch), * NOT typographic points (72 per inch). @@ -94,48 +99,58 @@ struct TrackData * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html */ float csspx = ptem * 96.f / 72.f; - Fixed fixed_size; - fixed_size.set_float (csspx); - /* XXX Clean this up. Make it work with nSizes==1 and 0. */ + /* + * Choose track. + */ + const TrackTableEntry *trackTableEntry = nullptr; + unsigned int count = nTracks; + for (unsigned int i = 0; i < count; i++) + { + /* Note: Seems like the track entries are sorted by values. But the + * spec doesn't explicitly say that. It just mentions it in the example. */ - unsigned int sizes = nSizes; + /* For now we only seek for track entries with zero tracking value */ - const TrackTableEntry *trackTableEntry = nullptr; - for (unsigned int i = 0; i < sizes; ++i) - // For now we only seek for track entries with zero tracking value if (trackTable[i].get_track_value () == 0.f) - trackTableEntry = &trackTable[0]; - - // We couldn't match any, exit + { + trackTableEntry = &trackTable[i]; + break; + } + } if (!trackTableEntry) return 0.; - /* TODO bfind() */ + /* + * Choose size. + */ + unsigned int sizes = nSizes; + if (!sizes) return 0.; + if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes); + + hb_array_t size_table ((base+sizeTable).arrayZ, sizes); unsigned int size_index; - UnsizedArrayOf size_table = base+sizeTable; - for (size_index = 0; size_index < sizes; ++size_index) - if (size_table[size_index] >= fixed_size) + for (size_index = 0; size_index < sizes - 1; size_index++) + if (size_table[size_index].to_float () >= csspx) break; - // TODO(ebraminio): We don't attempt to extrapolate to larger or - // smaller values for now but we should do, per spec - if (size_index == sizes) - return trackTableEntry->get_value (base, sizes - 1); - if (size_index == 0 || size_table[size_index] == fixed_size) - return trackTableEntry->get_value (base, size_index); - - float s0 = size_table[size_index - 1].to_float (); - float s1 = size_table[size_index].to_float (); - float t = (csspx - s0) / (s1 - s0); - return (float) t * trackTableEntry->get_value (base, size_index) + - ((float) 1.0 - t) * trackTableEntry->get_value (base, size_index - 1); + return round (interpolate_at (size_index ? size_index - 1 : 0, csspx, + *trackTableEntry, base)); + } + + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + sizeTable.sanitize (c, base, nSizes) && + trackTable.sanitize (c, nTracks, base, nSizes))); } protected: HBUINT16 nTracks; /* Number of separate tracks included in this table. */ HBUINT16 nSizes; /* Number of point sizes included in this table. */ - LOffsetTo > - sizeTable; /* Offset to array[nSizes] of size values. */ + LOffsetTo, false> + sizeTable; /* Offset from start of the tracking table to + * Array[nSizes] of size values.. */ UnsizedArrayOf trackTable; /* Array[nTracks] of TrackTableEntry records. */ @@ -145,21 +160,16 @@ struct TrackData struct trak { - static const hb_tag_t tableTag = HB_AAT_TAG_trak; - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); + static constexpr hb_tag_t tableTag = HB_AAT_TAG_trak; - return_trace (unlikely (c->check_struct (this) && - horizData.sanitize (c, this, this) && - vertData.sanitize (c, this, this))); - } + bool has_data () const { return version.to_int (); } - inline bool apply (hb_aat_apply_context_t *c) const + bool apply (hb_aat_apply_context_t *c) const { TRACE_APPLY (this); + hb_mask_t trak_mask = c->plan->trak_mask; + const float ptem = c->font->ptem; if (unlikely (ptem <= 0.f)) return_trace (false); @@ -168,41 +178,57 @@ struct trak if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction)) { const TrackData &trackData = this+horizData; - float tracking = trackData.get_tracking (this, ptem); - hb_position_t advance_to_add = c->font->em_scalef_x (tracking / 2); + int tracking = trackData.get_tracking (this, ptem); + hb_position_t offset_to_add = c->font->em_scalef_x (tracking / 2); + hb_position_t advance_to_add = c->font->em_scalef_x (tracking); foreach_grapheme (buffer, start, end) { - /* TODO This is wrong. */ + if (!(buffer->info[start].mask & trak_mask)) continue; buffer->pos[start].x_advance += advance_to_add; - buffer->pos[end].x_advance += advance_to_add; + buffer->pos[start].x_offset += offset_to_add; } } else { const TrackData &trackData = this+vertData; - float tracking = trackData.get_tracking (this, ptem); - hb_position_t advance_to_add = c->font->em_scalef_y (tracking / 2); + int tracking = trackData.get_tracking (this, ptem); + hb_position_t offset_to_add = c->font->em_scalef_y (tracking / 2); + hb_position_t advance_to_add = c->font->em_scalef_y (tracking); foreach_grapheme (buffer, start, end) { - /* TODO This is wrong. */ + if (!(buffer->info[start].mask & trak_mask)) continue; buffer->pos[start].y_advance += advance_to_add; - buffer->pos[end].y_advance += advance_to_add; + buffer->pos[start].y_offset += offset_to_add; } } return_trace (true); } + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + + return_trace (likely (c->check_struct (this) && + version.major == 1 && + horizData.sanitize (c, this, this) && + vertData.sanitize (c, this, this))); + } + protected: - FixedVersion<> version; /* Version of the tracking table--currently - * 0x00010000u for version 1.0. */ - HBUINT16 format; /* Format of the tracking table */ - OffsetTo horizData; /* TrackData for horizontal text */ - OffsetTo vertData; /* TrackData for vertical text */ - HBUINT16 reserved; /* Reserved. Set to 0. */ + FixedVersion<>version; /* Version of the tracking table + * (0x00010000u for version 1.0). */ + HBUINT16 format; /* Format of the tracking table (set to 0). */ + OffsetTo + horizData; /* Offset from start of tracking table to TrackData + * for horizontal text (or 0 if none). */ + OffsetTo + vertData; /* Offset from start of tracking table to TrackData + * for vertical text (or 0 if none). */ + HBUINT16 reserved; /* Reserved. Set to 0. */ public: - DEFINE_SIZE_MIN (12); + DEFINE_SIZE_STATIC (12); }; } /* namespace AAT */ diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 7784fae..5168a9c 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -1,5 +1,6 @@ /* * Copyright © 2017 Google, Inc. + * Copyright © 2018 Ebrahim Byagowi * * This is part of HarfBuzz, a text shaping library. * @@ -24,131 +25,360 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" -#include "hb-ot-layout-private.hh" -#include "hb-ot-layout-gsubgpos-private.hh" - -#include "hb-aat-layout-private.hh" +#include "hb-ot-face.hh" +#include "hb-aat-layout.hh" +#include "hb-aat-fdsc-table.hh" // Just so we compile it; unused otherwise. #include "hb-aat-layout-ankr-table.hh" #include "hb-aat-layout-bsln-table.hh" // Just so we compile it; unused otherwise. -#include "hb-aat-layout-feat-table.hh" // Just so we compile it; unused otherwise. +#include "hb-aat-layout-feat-table.hh" +#include "hb-aat-layout-just-table.hh" // Just so we compile it; unused otherwise. #include "hb-aat-layout-kerx-table.hh" #include "hb-aat-layout-morx-table.hh" #include "hb-aat-layout-trak-table.hh" -#include "hb-aat-fmtx-table.hh" // Just so we compile it; unused otherwise. -#include "hb-aat-gcid-table.hh" // Just so we compile it; unused otherwise. -#include "hb-aat-ltag-table.hh" // Just so we compile it; unused otherwise. +#include "hb-aat-ltag-table.hh" + + +/** + * SECTION:hb-aat-layout + * @title: hb-aat-layout + * @short_description: Apple Advanced Typography Layout + * @include: hb-aat.h + * + * Functions for querying OpenType Layout features in the font face. + **/ + + +/* Table data courtesy of Apple. Converted from mnemonics to integers + * when moving to this file. */ +static const hb_aat_feature_mapping_t feature_mappings[] = +{ + {HB_TAG ('a','f','r','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS}, + {HB_TAG ('c','2','p','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE}, + {HB_TAG ('c','2','s','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE}, + {HB_TAG ('c','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF}, + {HB_TAG ('c','a','s','e'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF}, + {HB_TAG ('c','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF}, + {HB_TAG ('c','p','s','p'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF}, + {HB_TAG ('c','s','w','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF}, + {HB_TAG ('d','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF}, + {HB_TAG ('e','x','p','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('f','r','a','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS}, + {HB_TAG ('f','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('h','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('h','i','s','t'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF}, + {HB_TAG ('h','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF}, + {HB_TAG ('h','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF}, + {HB_TAG ('h','n','g','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION, HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION}, + {HB_TAG ('h','o','j','o'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('h','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('i','t','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN, HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF}, + {HB_TAG ('j','p','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('j','p','7','8'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('j','p','8','3'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('j','p','9','0'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('l','i','g','a'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF}, + {HB_TAG ('l','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS, (hb_aat_layout_feature_selector_t) 2}, + {HB_TAG ('m','g','r','k'), HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS, HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF}, + {HB_TAG ('n','l','c','k'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('o','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS, (hb_aat_layout_feature_selector_t) 2}, + {HB_TAG ('o','r','d','n'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, + {HB_TAG ('p','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('p','c','a','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE}, + {HB_TAG ('p','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('p','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS, (hb_aat_layout_feature_selector_t) 4}, + {HB_TAG ('p','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('q','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('r','u','b','y'), HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF}, + {HB_TAG ('s','i','n','f'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, + {HB_TAG ('s','m','c','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE}, + {HB_TAG ('s','m','p','l'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('s','s','0','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF}, + {HB_TAG ('s','s','0','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF}, + {HB_TAG ('s','s','0','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF}, + {HB_TAG ('s','s','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF}, + {HB_TAG ('s','s','0','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF}, + {HB_TAG ('s','s','0','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF}, + {HB_TAG ('s','s','0','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF}, + {HB_TAG ('s','s','0','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF}, + {HB_TAG ('s','s','0','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF}, + {HB_TAG ('s','s','1','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF}, + {HB_TAG ('s','s','1','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF}, + {HB_TAG ('s','s','1','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF}, + {HB_TAG ('s','s','1','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF}, + {HB_TAG ('s','s','1','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF}, + {HB_TAG ('s','s','1','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF}, + {HB_TAG ('s','s','1','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF}, + {HB_TAG ('s','s','1','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF}, + {HB_TAG ('s','s','1','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF}, + {HB_TAG ('s','s','1','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF}, + {HB_TAG ('s','s','2','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF}, + {HB_TAG ('s','u','b','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, + {HB_TAG ('s','u','p','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, + {HB_TAG ('s','w','s','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF}, + {HB_TAG ('t','i','t','l'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS}, + {HB_TAG ('t','n','a','m'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('t','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS, (hb_aat_layout_feature_selector_t) 4}, + {HB_TAG ('t','r','a','d'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, + {HB_TAG ('t','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('u','n','i','c'), HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE, (hb_aat_layout_feature_selector_t) 14, (hb_aat_layout_feature_selector_t) 15}, + {HB_TAG ('v','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('v','e','r','t'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF}, + {HB_TAG ('v','h','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('v','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF}, + {HB_TAG ('v','p','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, + {HB_TAG ('v','r','t','2'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF}, + {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS, HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF}, +}; + +const hb_aat_feature_mapping_t * +hb_aat_layout_find_feature_mapping (hb_tag_t tag) +{ + return (const hb_aat_feature_mapping_t *) bsearch (&tag, + feature_mappings, + ARRAY_LENGTH (feature_mappings), + sizeof (feature_mappings[0]), + hb_aat_feature_mapping_t::cmp); +} + /* - * morx/kerx/trak + * hb_aat_apply_context_t */ -#if 0 -static inline const AAT::ankr& -_get_ankr (hb_face_t *face, hb_blob_t **blob = nullptr) +AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, + hb_font_t *font_, + hb_buffer_t *buffer_, + hb_blob_t *blob) : + plan (plan_), + font (font_), + face (font->face), + buffer (buffer_), + sanitizer (), + ankr_table (&Null(AAT::ankr)), + lookup_index (0), + debug_depth (0) { - if (unlikely (!hb_ot_shaper_face_data_ensure (face))) - { - if (blob) - *blob = hb_blob_get_empty (); - return Null(AAT::ankr); - } - hb_ot_layout_t * layout = hb_ot_layout_from_face (face); - const AAT::ankr& ankr = *(layout->ankr.get ()); - if (blob) - *blob = layout->ankr.blob; - return ankr; + sanitizer.init (blob); + sanitizer.set_num_glyphs (face->get_num_glyphs ()); + sanitizer.start_processing (); + sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX); } -static inline const AAT::kerx& -_get_kerx (hb_face_t *face, hb_blob_t **blob = nullptr) +AAT::hb_aat_apply_context_t::~hb_aat_apply_context_t () +{ sanitizer.end_processing (); } + +void +AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_) +{ ankr_table = ankr_table_; } + + +/* + * mort/morx/kerx/trak + */ + + +void +hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, + hb_aat_map_t *map) { - if (unlikely (!hb_ot_shaper_face_data_ensure (face))) + const AAT::morx& morx = *mapper->face->table.morx; + if (morx.has_data ()) { - if (blob) - *blob = hb_blob_get_empty (); - return Null(AAT::kerx); + morx.compile_flags (mapper, map); + return; } - hb_ot_layout_t * layout = hb_ot_layout_from_face (face); - /* XXX this doesn't call set_num_glyphs on sanitizer. */ - const AAT::kerx& kerx = *(layout->kerx.get ()); - if (blob) - *blob = layout->kerx.blob; - return kerx; -} -static inline const AAT::morx& -_get_morx (hb_face_t *face, hb_blob_t **blob = nullptr) -{ - if (unlikely (!hb_ot_shaper_face_data_ensure (face))) + const AAT::mort& mort = *mapper->face->table.mort; + if (mort.has_data ()) { - if (blob) - *blob = hb_blob_get_empty (); - return Null(AAT::morx); + mort.compile_flags (mapper, map); + return; } - 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 const AAT::trak& -_get_trak (hb_face_t *face, hb_blob_t **blob = nullptr) + +/* + * hb_aat_layout_has_substitution: + * @face: + * + * Returns: + * Since: 2.3.0 + */ +hb_bool_t +hb_aat_layout_has_substitution (hb_face_t *face) +{ + return face->table.morx->has_data () || + face->table.mort->has_data (); +} + +void +hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) { - if (unlikely (!hb_ot_shaper_face_data_ensure (face))) + hb_blob_t *morx_blob = font->face->table.morx.get_blob (); + const AAT::morx& morx = *morx_blob->as (); + if (morx.has_data ()) { - if (blob) - *blob = hb_blob_get_empty (); - return Null(AAT::trak); + AAT::hb_aat_apply_context_t c (plan, font, buffer, morx_blob); + morx.apply (&c); + return; } - hb_ot_layout_t * layout = hb_ot_layout_from_face (face); - const AAT::trak& trak = *(layout->trak.get ()); - if (blob) - *blob = layout->trak.blob; - return trak; -} -#endif - -// static inline void -// _hb_aat_layout_create (hb_face_t *face) -// { -// OT::Sanitizer sanitizer; -// sanitizer.set_num_glyphs (face->get_num_glyphs ()); -// hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_morx)); -// morx_blob->as (); - -// if (0) -// { -// morx_blob->as > ()->get_value (1, face->get_num_glyphs ()); -// } -// } + + hb_blob_t *mort_blob = font->face->table.mort.get_blob (); + const AAT::mort& mort = *mort_blob->as (); + if (mort.has_data ()) + { + AAT::hb_aat_apply_context_t c (plan, font, buffer, mort_blob); + mort.apply (&c); + return; + } +} void -hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer) +hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer) { -#if 0 - hb_blob_t *blob; - const AAT::morx& morx = _get_morx (font->face, &blob); + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + hb_glyph_position_t *pos = buffer->pos; + for (unsigned int i = 0; i < count; i++) + if (unlikely (info[i].codepoint == AAT::DELETED_GLYPH)) + pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0; +} - AAT::hb_aat_apply_context_t c (font, buffer, blob); - morx.apply (&c); -#endif +static bool +is_deleted_glyph (const hb_glyph_info_t *info) +{ + return info->codepoint == AAT::DELETED_GLYPH; } void -hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer) +hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) { -#if 0 - hb_blob_t *blob; - const AAT::ankr& ankr = _get_ankr (font->face, &blob); - const AAT::kerx& kerx = _get_kerx (font->face, &blob); - const AAT::trak& trak = _get_trak (font->face, &blob); + hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph); +} - AAT::hb_aat_apply_context_t c (font, buffer, blob); - kerx.apply (&c, &ankr); +/* + * hb_aat_layout_has_positioning: + * @face: + * + * Returns: + * Since: 2.3.0 + */ +hb_bool_t +hb_aat_layout_has_positioning (hb_face_t *face) +{ + return face->table.kerx->has_data (); +} + +void +hb_aat_layout_position (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) +{ + hb_blob_t *kerx_blob = font->face->table.kerx.get_blob (); + const AAT::kerx& kerx = *kerx_blob->as (); + + AAT::hb_aat_apply_context_t c (plan, font, buffer, kerx_blob); + c.set_ankr_table (font->face->table.ankr.get ()); + kerx.apply (&c); +} + + +/* + * hb_aat_layout_has_tracking: + * @face: + * + * Returns: + * Since: 2.3.0 + */ +hb_bool_t +hb_aat_layout_has_tracking (hb_face_t *face) +{ + return face->table.trak->has_data (); +} + +void +hb_aat_layout_track (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) +{ + const AAT::trak& trak = *font->face->table.trak; + + AAT::hb_aat_apply_context_t c (plan, font, buffer); trak.apply (&c); -#endif +} + + +hb_language_t +_hb_aat_language_get (hb_face_t *face, + unsigned int i) +{ + return face->table.ltag->get_language (i); +} + +/** + * hb_aat_layout_get_feature_types: + * @face: a face object + * @start_offset: iteration's start offset + * @feature_count:(inout) (allow-none): buffer size as input, filled size as output + * @features: (out caller-allocates) (array length=feature_count): features buffer + * + * Return value: Number of all available feature types. + * + * Since: 2.2.0 + */ +unsigned int +hb_aat_layout_get_feature_types (hb_face_t *face, + unsigned int start_offset, + unsigned int *feature_count, /* IN/OUT. May be NULL. */ + hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */) +{ + return face->table.feat->get_feature_types (start_offset, feature_count, features); +} + +/** + * hb_aat_layout_feature_type_get_name_id: + * @face: a face object + * @feature_type: feature id + * + * Return value: Name ID index + * + * Since: 2.2.0 + */ +hb_ot_name_id_t +hb_aat_layout_feature_type_get_name_id (hb_face_t *face, + hb_aat_layout_feature_type_t feature_type) +{ + return face->table.feat->get_feature_name_id (feature_type); +} + +/** + * hb_aat_layout_feature_type_get_selectors: + * @face: a face object + * @feature_type: feature id + * @start_offset: iteration's start offset + * @selector_count: (inout) (allow-none): buffer size as input, filled size as output + * @selectors: (out caller-allocates) (array length=selector_count): settings buffer + * @default_index: (out) (allow-none): index of default selector if any + * + * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then + * the feature type is non-exclusive. Otherwise, @default_index is the index of + * the selector that is selected by default. + * + * Return value: Number of all available feature selectors. + * + * Since: 2.2.0 + */ +unsigned int +hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face, + hb_aat_layout_feature_type_t feature_type, + unsigned int start_offset, + unsigned int *selector_count, /* IN/OUT. May be NULL. */ + hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ + unsigned int *default_index /* OUT. May be NULL. */) +{ + return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index); } diff --git a/src/hb-aat-layout.h b/src/hb-aat-layout.h new file mode 100644 index 0000000..760aaae --- /dev/null +++ b/src/hb-aat-layout.h @@ -0,0 +1,486 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_AAT_H_IN +#error "Include instead." +#endif + +#ifndef HB_AAT_LAYOUT_H +#define HB_AAT_LAYOUT_H + +#include "hb.h" + +#include "hb-ot.h" + +HB_BEGIN_DECLS + +/** + * hb_aat_layout_feature_type_t: + * + * + * Since: 2.2.0 + */ +typedef enum +{ + HB_AAT_LAYOUT_FEATURE_TYPE_INVALID = 0xFFFF, + + HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC = 0, + HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES = 1, + HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION = 2, + HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE = 3, + HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION = 4, + HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT = 5, + HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING = 6, + HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE = 8, + HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE = 9, + HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION = 10, + HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS = 11, + HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE = 13, + HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS = 14, + HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS = 15, + HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE = 16, + HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES = 17, + HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE = 18, + HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS = 19, + HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE = 20, + HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE = 21, + HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING = 22, + HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION = 23, + HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE = 24, + HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE = 25, + HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE = 26, + HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE = 27, + HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA = 28, + HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE = 29, + HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE = 30, + HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE = 31, + HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN = 32, + HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT = 33, + HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA = 34, + HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES = 35, + HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES = 36, + HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE = 37, + HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE = 38, + HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE = 39, + HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE = 103, + + _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE= 0x7FFFFFFFu, /*< skip >*/ +} hb_aat_layout_feature_type_t; + +/** + * hb_aat_layout_feature_selector_t: + * + * + * Since: 2.2.0 + */ +typedef enum +{ + HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID = 0xFFFF, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF = 1, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF = 9, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON = 10, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF = 11, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON = 12, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF = 13, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON = 14, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF = 15, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON = 16, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF = 17, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON = 18, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF = 19, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON = 20, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF = 21, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE = 2, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE = 0, /* deprecated */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS = 1, /* deprecated */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE = 2, /* deprecated */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS = 3, /* deprecated */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS = 4, /* deprecated */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS = 5, /* deprecated */ + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF = 1, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF = 1, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS = 3, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF = 9, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS = 2, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS = 4, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS = 2, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF = 1, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF = 9, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON = 10, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF = 11, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF = 9, + HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON = 10, + HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF = 11, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS = 6, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES = 0, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1 = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2 = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3 = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4 = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5 = 4, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS = 5, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE = 9, + HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS = 10, + HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS = 11, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS = 12, + HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS = 13, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS = 14, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS = 1, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT = 6, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE = 9, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION = 9, + HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION= 10, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA = 1, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS = 2, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF = 5, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA = 0, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF instead */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA = 1, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON instead */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF = 3, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE = 5, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE = 5, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE = 1, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN = 0, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF instead */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN = 1, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON instead */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF = 3, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF = 3, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF = 3, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF = 5, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON = 6, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF = 7, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON = 8, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF = 9, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON = 10, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF = 11, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON = 12, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF = 13, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON = 14, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF = 15, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON = 16, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF = 17, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON = 18, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF = 19, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON = 20, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF = 21, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON = 22, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF = 23, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON = 24, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF = 25, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON = 26, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF = 27, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON = 28, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF = 29, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON = 30, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF = 31, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON = 32, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF = 33, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON = 34, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF = 35, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON = 36, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF = 37, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON = 38, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF = 39, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON = 40, + HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF = 41, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF = 3, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON = 4, + HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF= 5, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS = 2, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS = 2, + + /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE */ + HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN = 0, + HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN = 1, + HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN = 2, + HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN = 3, + + _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE= 0x7FFFFFFFu, /*< skip >*/ +} hb_aat_layout_feature_selector_t; + +HB_EXTERN unsigned int +hb_aat_layout_get_feature_types (hb_face_t *face, + unsigned int start_offset, + unsigned int *feature_count, /* IN/OUT. May be NULL. */ + hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */); + +HB_EXTERN hb_ot_name_id_t +hb_aat_layout_feature_type_get_name_id (hb_face_t *face, + hb_aat_layout_feature_type_t feature_type); + +typedef struct hb_aat_layout_feature_selector_info_t +{ + hb_ot_name_id_t name_id; + hb_aat_layout_feature_selector_t enable; + hb_aat_layout_feature_selector_t disable; + /*< private >*/ + unsigned int reserved; +} hb_aat_layout_feature_selector_info_t; + +#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX 0xFFFFu + +HB_EXTERN unsigned int +hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face, + hb_aat_layout_feature_type_t feature_type, + unsigned int start_offset, + unsigned int *selector_count, /* IN/OUT. May be NULL. */ + hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ + unsigned int *default_index /* OUT. May be NULL. */); + + +/* + * morx/mort + */ + +HB_EXTERN hb_bool_t +hb_aat_layout_has_substitution (hb_face_t *face); + + +/* + * kerx + */ + +HB_EXTERN hb_bool_t +hb_aat_layout_has_positioning (hb_face_t *face); + + +/* + * trak + */ + +HB_EXTERN hb_bool_t +hb_aat_layout_has_tracking (hb_face_t *face); + + +HB_END_DECLS + +#endif /* HB_AAT_LAYOUT_H */ diff --git a/src/hb-aat-layout.hh b/src/hb-aat-layout.hh new file mode 100644 index 0000000..8346d9f --- /dev/null +++ b/src/hb-aat-layout.hh @@ -0,0 +1,85 @@ +/* + * 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_HH +#define HB_AAT_LAYOUT_HH + +#include "hb.hh" + +#include "hb-ot-shape.hh" + + +struct hb_aat_feature_mapping_t +{ + hb_tag_t otFeatureTag; + hb_aat_layout_feature_type_t aatFeatureType; + hb_aat_layout_feature_selector_t selectorToEnable; + hb_aat_layout_feature_selector_t selectorToDisable; + + static int cmp (const void *key_, const void *entry_) + { + hb_tag_t key = * (unsigned int *) key_; + const hb_aat_feature_mapping_t * entry = (const hb_aat_feature_mapping_t *) entry_; + return key < entry->otFeatureTag ? -1 : + key > entry->otFeatureTag ? 1 : + 0; + } +}; + +HB_INTERNAL const hb_aat_feature_mapping_t * +hb_aat_layout_find_feature_mapping (hb_tag_t tag); + +HB_INTERNAL void +hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, + hb_aat_map_t *map); + +HB_INTERNAL void +hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); + +HB_INTERNAL void +hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer); + +HB_INTERNAL void +hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer); + +HB_INTERNAL void +hb_aat_layout_position (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); + +HB_INTERNAL void +hb_aat_layout_track (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); + +HB_INTERNAL hb_language_t +_hb_aat_language_get (hb_face_t *face, + unsigned int i); + + +#endif /* HB_AAT_LAYOUT_HH */ diff --git a/src/hb-aat-ltag-table.hh b/src/hb-aat-ltag-table.hh index 15c4e89..6f34a00 100644 --- a/src/hb-aat-ltag-table.hh +++ b/src/hb-aat-ltag-table.hh @@ -25,7 +25,7 @@ #ifndef HB_AAT_LTAG_TABLE_HH #define HB_AAT_LTAG_TABLE_HH -#include "hb-aat-layout-common-private.hh" +#include "hb-open-type.hh" /* * ltag -- Language Tag @@ -36,17 +36,21 @@ namespace AAT { +using namespace OT; + struct FTStringRange { - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + friend struct ltag; + + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && (base+tag).sanitize (c, length)); } protected: - OffsetTo > + NNOffsetTo > tag; /* Offset from the start of the table to * the beginning of the string */ HBUINT16 length; /* String length (in bytes) */ @@ -56,12 +60,21 @@ struct FTStringRange struct ltag { - static const hb_tag_t tableTag = HB_AAT_TAG_ltag; + static constexpr hb_tag_t tableTag = HB_AAT_TAG_ltag; + + hb_language_t get_language (unsigned int i) const + { + const FTStringRange &range = tagRanges[i]; + return hb_language_from_string ((const char *) (this+range.tag).arrayZ, + range.length); + } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && tagRanges.sanitize (c, this))); + return_trace (likely (c->check_struct (this) && + version >= 1 && + tagRanges.sanitize (c, this))); } protected: diff --git a/src/hb-aat-map.cc b/src/hb-aat-map.cc new file mode 100644 index 0000000..98c5d7f --- /dev/null +++ b/src/hb-aat-map.cc @@ -0,0 +1,68 @@ +/* + * Copyright © 2009,2010 Red Hat, Inc. + * Copyright © 2010,2011,2013 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-aat-map.hh" + +#include "hb-aat-layout.hh" + + +void hb_aat_map_builder_t::add_feature (hb_tag_t tag, + unsigned int value) +{ + if (tag == HB_TAG ('a','a','l','t')) + { + feature_info_t *info = features.push(); + info->type = HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES; + info->setting = (hb_aat_layout_feature_selector_t) value; + return; + } + + const hb_aat_feature_mapping_t *mapping = hb_aat_layout_find_feature_mapping (tag); + if (!mapping) return; + + feature_info_t *info = features.push(); + info->type = mapping->aatFeatureType; + info->setting = value ? mapping->selectorToEnable : mapping->selectorToDisable; +} + +void +hb_aat_map_builder_t::compile (hb_aat_map_t &m) +{ + /* Sort features and merge duplicates */ + if (features.length) + { + features.qsort (); + unsigned int j = 0; + for (unsigned int i = 1; i < features.length; i++) + if (features[i].type != features[j].type) + features[++j] = features[i]; + features.shrink (j + 1); + } + + hb_aat_layout_compile_map (this, &m); +} diff --git a/src/hb-aat-map.hh b/src/hb-aat-map.hh new file mode 100644 index 0000000..3d5ad0e --- /dev/null +++ b/src/hb-aat-map.hh @@ -0,0 +1,91 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_AAT_MAP_HH +#define HB_AAT_MAP_HH + +#include "hb.hh" + + +struct hb_aat_map_t +{ + friend struct hb_aat_map_builder_t; + + public: + + void init () + { + memset (this, 0, sizeof (*this)); + chain_flags.init (); + } + void fini () { chain_flags.fini (); } + + public: + hb_vector_t chain_flags; +}; + +struct hb_aat_map_builder_t +{ + public: + + HB_INTERNAL hb_aat_map_builder_t (hb_face_t *face_, + const hb_segment_properties_t *props_ HB_UNUSED) : + face (face_) {} + + HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value=1); + + HB_INTERNAL void compile (hb_aat_map_t &m); + + public: + struct feature_info_t + { + hb_aat_layout_feature_type_t type; + hb_aat_layout_feature_selector_t setting; + unsigned seq; /* For stable sorting only. */ + + static int cmp (const void *pa, const void *pb) + { + const feature_info_t *a = (const feature_info_t *) pa; + const feature_info_t *b = (const feature_info_t *) pb; + return (a->type != b->type) ? (a->type < b->type ? -1 : 1) : + (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0); + } + + int cmp (hb_aat_layout_feature_type_t ty) const + { + return (type != ty) ? (type < ty ? -1 : 1) : 0; + } + }; + + public: + hb_face_t *face; + + public: + hb_vector_t features; +}; + + +#endif /* HB_AAT_MAP_HH */ diff --git a/src/hb-aat.h b/src/hb-aat.h new file mode 100644 index 0000000..c14313d --- /dev/null +++ b/src/hb-aat.h @@ -0,0 +1,38 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_AAT_H +#define HB_AAT_H +#define HB_AAT_H_IN + +#include "hb.h" + +#include "hb-aat-layout.h" + +HB_BEGIN_DECLS + +HB_END_DECLS + +#undef HB_AAT_H_IN +#endif /* HB_AAT_H */ diff --git a/src/hb-array.hh b/src/hb-array.hh new file mode 100644 index 0000000..52b775e --- /dev/null +++ b/src/hb-array.hh @@ -0,0 +1,277 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_ARRAY_HH +#define HB_ARRAY_HH + +#include "hb.hh" +#include "hb-dsalgs.hh" +#include "hb-iter.hh" +#include "hb-null.hh" + + +template +struct hb_sorted_array_t; + +template +struct hb_array_t : + hb_iter_t, Type>, + hb_iter_mixin_t, Type> +{ + /* + * Constructors. + */ + hb_array_t () : arrayZ (nullptr), length (0) {} + hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {} + template hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} + + + /* + * Iterator implementation. + */ + typedef Type __item_type__; + Type& __item_at__ (unsigned i) const + { + if (unlikely (i >= length)) return CrapOrNull (Type); + return arrayZ[i]; + } + void __forward__ (unsigned n) + { + if (unlikely (n > length)) + n = length; + length -= n; + arrayZ += n; + } + void __rewind__ (unsigned n) + { + if (unlikely (n > length)) + n = length; + length -= n; + } + unsigned __len__ () const { return length; } + bool __random_access__ () const { return true; } + + /* Extra operators. + */ + Type * operator & () const { return arrayZ; } + operator hb_array_t () { return hb_array_t (arrayZ, length); } + template operator T * () const { return arrayZ; } + + /* + * Compare, Sort, and Search. + */ + + /* Note: our compare is NOT lexicographic; it also does NOT call Type::cmp. */ + int cmp (const hb_array_t &a) const + { + if (length != a.length) + return (int) a.length - (int) length; + return hb_memcmp (a.arrayZ, arrayZ, get_size ()); + } + static int cmp (const void *pa, const void *pb) + { + hb_array_t *a = (hb_array_t *) pa; + hb_array_t *b = (hb_array_t *) pb; + return b->cmp (*a); + } + + template + Type *lsearch (const T &x, Type *not_found = nullptr) + { + unsigned int count = length; + for (unsigned int i = 0; i < count; i++) + if (!this->arrayZ[i].cmp (x)) + return &this->arrayZ[i]; + return not_found; + } + template + const Type *lsearch (const T &x, const Type *not_found = nullptr) const + { + unsigned int count = length; + for (unsigned int i = 0; i < count; i++) + if (!this->arrayZ[i].cmp (x)) + return &this->arrayZ[i]; + return not_found; + } + + hb_sorted_array_t qsort (int (*cmp_)(const void*, const void*)) + { + if (likely (length)) + ::qsort (arrayZ, length, this->item_size, cmp_); + return hb_sorted_array_t (*this); + } + hb_sorted_array_t qsort () + { + if (likely (length)) + ::qsort (arrayZ, length, this->item_size, Type::cmp); + return hb_sorted_array_t (*this); + } + void qsort (unsigned int start, unsigned int end) + { + end = MIN (end, length); + assert (start <= end); + if (likely (start < end)) + ::qsort (arrayZ + start, end - start, this->item_size, Type::cmp); + } + + /* + * Other methods. + */ + + unsigned int get_size () const { return length * this->item_size; } + + hb_array_t sub_array (unsigned int start_offset = 0, unsigned int *seg_count = nullptr /* IN/OUT */) const + { + if (!start_offset && !seg_count) + return *this; + + unsigned int count = length; + if (unlikely (start_offset > count)) + count = 0; + else + count -= start_offset; + if (seg_count) + count = *seg_count = MIN (count, *seg_count); + return hb_array_t (arrayZ + start_offset, count); + } + hb_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const + { return sub_array (start_offset, &seg_count); } + + /* Only call if you allocated the underlying array using malloc() or similar. */ + void free () + { ::free ((void *) arrayZ); arrayZ = nullptr; length = 0; } + + template + bool sanitize (hb_sanitize_context_t *c) const + { return c->check_array (arrayZ, length); } + + /* + * Members + */ + + public: + Type *arrayZ; + unsigned int length; +}; +template inline hb_array_t +hb_array (T *array, unsigned int length) +{ return hb_array_t (array, length); } +template inline hb_array_t +hb_array (T (&array_)[length_]) +{ return hb_array_t (array_); } + + +enum hb_bfind_not_found_t +{ + HB_BFIND_NOT_FOUND_DONT_STORE, + HB_BFIND_NOT_FOUND_STORE, + HB_BFIND_NOT_FOUND_STORE_CLOSEST, +}; + +template +struct hb_sorted_array_t : + hb_sorted_iter_t, Type>, + hb_array_t, + hb_iter_mixin_t, Type> +{ + hb_sorted_array_t () : hb_array_t () {} + hb_sorted_array_t (const hb_array_t &o) : hb_array_t (o) {} + hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t (array_, length_) {} + template hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t (array_) {} + + hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const + { return hb_sorted_array_t (((const hb_array_t *) (this))->sub_array (start_offset, seg_count)); } + hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const + { return sub_array (start_offset, &seg_count); } + + template + Type *bsearch (const T &x, Type *not_found = nullptr) + { + unsigned int i; + return bfind (x, &i) ? &this->arrayZ[i] : not_found; + } + template + const Type *bsearch (const T &x, const Type *not_found = nullptr) const + { + unsigned int i; + return bfind (x, &i) ? &this->arrayZ[i] : not_found; + } + template + bool bfind (const T &x, unsigned int *i = nullptr, + hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE, + unsigned int to_store = (unsigned int) -1) const + { + int min = 0, max = (int) this->length - 1; + const Type *array = this->arrayZ; + while (min <= max) + { + int mid = ((unsigned int) min + (unsigned int) max) / 2; + int c = array[mid].cmp (x); + if (c < 0) + max = mid - 1; + else if (c > 0) + min = mid + 1; + else + { + if (i) + *i = mid; + return true; + } + } + if (i) + { + switch (not_found) + { + case HB_BFIND_NOT_FOUND_DONT_STORE: + break; + + case HB_BFIND_NOT_FOUND_STORE: + *i = to_store; + break; + + case HB_BFIND_NOT_FOUND_STORE_CLOSEST: + if (max < 0 || (max < (int) this->length && array[max].cmp (x) > 0)) + max++; + *i = max; + break; + } + } + return false; + } +}; +template inline hb_sorted_array_t +hb_sorted_array (T *array, unsigned int length) +{ return hb_sorted_array_t (array, length); } +template inline hb_sorted_array_t +hb_sorted_array (T (&array_)[length_]) +{ return hb_sorted_array_t (array_); } + + +typedef hb_array_t hb_bytes_t; +typedef hb_array_t hb_ubytes_t; + + +#endif /* HB_ARRAY_HH */ diff --git a/src/hb-atomic-private.hh b/src/hb-atomic-private.hh deleted file mode 100644 index 12caaca..0000000 --- a/src/hb-atomic-private.hh +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright © 2007 Chris Wilson - * Copyright © 2009,2010 Red Hat, Inc. - * 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. - * - * Contributor(s): - * Chris Wilson - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_ATOMIC_PRIVATE_HH -#define HB_ATOMIC_PRIVATE_HH - -#include "hb-private.hh" - - -/* atomic_int */ - -/* We need external help for these */ - -#if defined(hb_atomic_int_impl_add) \ - && defined(hb_atomic_ptr_impl_get) \ - && defined(hb_atomic_ptr_impl_cmpexch) - -/* Defined externally, i.e. in config.h; must have typedef'ed hb_atomic_int_impl_t as well. */ - - -#elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__)) - -#include - -/* MinGW has a convoluted history of supporting MemoryBarrier - * properly. As such, define a function to wrap the whole - * thing. */ -static inline void _HBMemoryBarrier (void) { -#if !defined(MemoryBarrier) - long dummy = 0; - InterlockedExchange (&dummy, 1); -#else - MemoryBarrier (); -#endif -} - -typedef LONG hb_atomic_int_impl_t; -#define hb_atomic_int_impl_add(AI, V) InterlockedExchangeAdd (&(AI), (V)) - -#define hb_atomic_ptr_impl_get(P) (_HBMemoryBarrier (), (void *) *(P)) -#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_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 -#include - -typedef unsigned int hb_atomic_int_impl_t; -#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 -#ifdef __MAC_OS_X_MIN_REQUIRED -#include -#elif defined(__IPHONE_OS_MIN_REQUIRED) -#include -#endif - - -typedef int32_t hb_atomic_int_impl_t; -#define hb_atomic_int_impl_add(AI, V) (OSAtomicAdd32Barrier ((V), &(AI)) - (V)) - -#define hb_atomic_ptr_impl_get(P) (OSMemoryBarrier (), (void *) *(P)) -#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100) -#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwapPtrBarrier ((void *) (O), (void *) (N), (void **) (P)) -#else -#if __ppc64__ || __x86_64__ || __aarch64__ -#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap64Barrier ((int64_t) (void *) (O), (int64_t) (void *) (N), (int64_t*) (P)) -#else -#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap32Barrier ((int32_t) (void *) (O), (int32_t) (void *) (N), (int32_t*) (P)) -#endif -#endif - - -#elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__) - -#include - - -static inline int _hb_fetch_and_add(volatile int* AI, unsigned int V) { - __lwsync(); - int result = __fetch_and_add(AI, V); - __isync(); - return result; -} -static inline int _hb_compare_and_swaplp(volatile long* P, long O, long N) { - __sync(); - int result = __compare_and_swaplp (P, &O, N); - __sync(); - return result; -} - -typedef int hb_atomic_int_impl_t; -#define hb_atomic_int_impl_add(AI, V) _hb_fetch_and_add (&(AI), (V)) - -#define hb_atomic_ptr_impl_get(P) (__sync(), (void *) *(P)) -#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_compare_and_swaplp ((long*)(P), (long)(O), (long)(N)) - -#elif !defined(HB_NO_MT) - -#define HB_ATOMIC_INT_NIL 1 /* Warn that fallback implementation is in use. */ - -typedef volatile int hb_atomic_int_impl_t; -#define hb_atomic_int_impl_add(AI, V) (((AI) += (V)) - (V)) - -#define hb_atomic_ptr_impl_get(P) ((void *) *(P)) -#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void * volatile *) (P) == (void *) (O) ? (* (void * volatile *) (P) = (void *) (N), true) : false) - - -#else /* HB_NO_MT */ - -typedef int hb_atomic_int_impl_t; -#define hb_atomic_int_impl_add(AI, V) (((AI) += (V)) - (V)) - -#define hb_atomic_ptr_impl_get(P) ((void *) *(P)) -#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false) - - -#endif - - -#define HB_ATOMIC_INT_INIT(V) {V} - -struct hb_atomic_int_t -{ - hb_atomic_int_impl_t v; - - inline void set_unsafe (int v_) { v = v_; } - inline int get_unsafe (void) const { return v; } - inline int inc (void) { return hb_atomic_int_impl_add (const_cast (v), 1); } - inline int dec (void) { return hb_atomic_int_impl_add (const_cast (v), -1); } -}; - - -#define hb_atomic_ptr_get(P) hb_atomic_ptr_impl_get(P) -#define hb_atomic_ptr_cmpexch(P,O,N) hb_atomic_ptr_impl_cmpexch((P),(O),(N)) - - -#endif /* HB_ATOMIC_PRIVATE_HH */ diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh new file mode 100644 index 0000000..9321932 --- /dev/null +++ b/src/hb-atomic.hh @@ -0,0 +1,300 @@ +/* + * Copyright © 2007 Chris Wilson + * Copyright © 2009,2010 Red Hat, Inc. + * 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. + * + * Contributor(s): + * Chris Wilson + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_ATOMIC_HH +#define HB_ATOMIC_HH + +#include "hb.hh" + + +/* + * Atomic integers and pointers. + */ + + +/* We need external help for these */ + +#if defined(hb_atomic_int_impl_add) \ + && defined(hb_atomic_ptr_impl_get) \ + && defined(hb_atomic_ptr_impl_cmpexch) + +/* Defined externally, i.e. in config.h. */ + + +#elif !defined(HB_NO_MT) && defined(__ATOMIC_ACQUIRE) + +/* C++11-style GCC primitives. */ + +#define _hb_memory_barrier() __sync_synchronize () + +#define hb_atomic_int_impl_add(AI, V) __atomic_fetch_add ((AI), (V), __ATOMIC_ACQ_REL) +#define hb_atomic_int_impl_set_relaxed(AI, V) __atomic_store_n ((AI), (V), __ATOMIC_RELAXED) +#define hb_atomic_int_impl_set(AI, V) __atomic_store_n ((AI), (V), __ATOMIC_RELEASE) +#define hb_atomic_int_impl_get_relaxed(AI) __atomic_load_n ((AI), __ATOMIC_RELAXED) +#define hb_atomic_int_impl_get(AI) __atomic_load_n ((AI), __ATOMIC_ACQUIRE) + +#define hb_atomic_ptr_impl_set_relaxed(P, V) __atomic_store_n ((P), (V), __ATOMIC_RELAXED) +#define hb_atomic_ptr_impl_get_relaxed(P) __atomic_load_n ((P), __ATOMIC_RELAXED) +#define hb_atomic_ptr_impl_get(P) __atomic_load_n ((P), __ATOMIC_ACQUIRE) +static inline bool +_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N) +{ + const void *O = O_; // Need lvalue + return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED); +} +#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N)) + +#elif !defined(HB_NO_MT) && __cplusplus >= 201103L + +/* C++11 atomics. */ + +#include + +#define _hb_memory_barrier() std::atomic_thread_fence(std::memory_order_ack_rel) +#define _hb_memory_r_barrier() std::atomic_thread_fence(std::memory_order_acquire) +#define _hb_memory_w_barrier() std::atomic_thread_fence(std::memory_order_release) + +#define hb_atomic_int_impl_add(AI, V) (reinterpret_cast *> (AI)->fetch_add ((V), std::memory_order_acq_rel)) +#define hb_atomic_int_impl_set_relaxed(AI, V) (reinterpret_cast *> (AI)->store ((V), std::memory_order_relaxed)) +#define hb_atomic_int_impl_set(AI, V) (reinterpret_cast *> (AI)->store ((V), std::memory_order_release)) +#define hb_atomic_int_impl_get_relaxed(AI) (reinterpret_cast *> (AI)->load (std::memory_order_relaxed)) +#define hb_atomic_int_impl_get(AI) (reinterpret_cast *> (AI)->load (std::memory_order_acquire)) + +#define hb_atomic_ptr_impl_set_relaxed(P, V) (reinterpret_cast *> (P)->store ((V), std::memory_order_relaxed)) +#define hb_atomic_ptr_impl_get_relaxed(P) (reinterpret_cast *> (P)->load (std::memory_order_relaxed)) +#define hb_atomic_ptr_impl_get(P) (reinterpret_cast *> (P)->load (std::memory_order_acquire)) +static inline bool +_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N) +{ + const void *O = O_; // Need lvalue + return reinterpret_cast *> (P)->compare_exchange_weak (O, N, std::memory_order_acq_rel, std::memory_order_relaxed); +} +#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N)) + + +#elif !defined(HB_NO_MT) && defined(_WIN32) + +#include + +static inline void _hb_memory_barrier () +{ +#if !defined(MemoryBarrier) + /* MinGW has a convoluted history of supporting MemoryBarrier. */ + LONG dummy = 0; + InterlockedExchange (&dummy, 1); +#else + MemoryBarrier (); +#endif +} +#define _hb_memory_barrier() _hb_memory_barrier () + +#define hb_atomic_int_impl_add(AI, V) InterlockedExchangeAdd ((LONG *) (AI), (V)) +static_assert ((sizeof (LONG) == sizeof (int)), ""); + +#define hb_atomic_ptr_impl_cmpexch(P,O,N) (InterlockedCompareExchangePointer ((P), (N), (O)) == (O)) + + +#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES) + +#define _hb_memory_barrier() __sync_synchronize () + +#define hb_atomic_int_impl_add(AI, V) __sync_fetch_and_add ((AI), (V)) + +#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 +#include + +#define _hb_memory_r_barrier() __machine_r_barrier () +#define _hb_memory_w_barrier() __machine_w_barrier () +#define _hb_memory_barrier() __machine_rw_barrier () + +static inline int _hb_fetch_and_add (int *AI, int V) +{ + _hb_memory_w_barrier (); + int result = atomic_add_int_nv ((uint_t *) AI, V) - V; + _hb_memory_r_barrier (); + return result; +} +static inline bool _hb_compare_and_swap_ptr (void **P, void *O, void *N) +{ + _hb_memory_w_barrier (); + bool result = atomic_cas_ptr (P, O, N) == O; + _hb_memory_r_barrier (); + return result; +} + +#define hb_atomic_int_impl_add(AI, V) _hb_fetch_and_add ((AI), (V)) + +#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_compare_and_swap_ptr ((P), (O), (N)) + + +#elif !defined(HB_NO_MT) && defined(__APPLE__) + +#include +#ifdef __MAC_OS_X_MIN_REQUIRED +#include +#elif defined(__IPHONE_OS_MIN_REQUIRED) +#include +#endif + +#define _hb_memory_barrier() OSMemoryBarrier () + +#define hb_atomic_int_impl_add(AI, V) (OSAtomicAdd32Barrier ((V), (AI)) - (V)) + +#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100) +#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwapPtrBarrier ((O), (N), (P)) +#else +#if __ppc64__ || __x86_64__ || __aarch64__ +#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap64Barrier ((int64_t) (O), (int64_t) (N), (int64_t*) (P)) +#else +#define hb_atomic_ptr_impl_cmpexch(P,O,N) OSAtomicCompareAndSwap32Barrier ((int32_t) (O), (int32_t) (N), (int32_t*) (P)) +#endif +#endif + + +#elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__) + +#include + +#define _hb_memory_barrier() __lwsync () + +static inline int _hb_fetch_and_add (int *AI, int V) +{ + _hb_memory_barrier (); + int result = __fetch_and_add (AI, V); + _hb_memory_barrier (); + return result; +} +static inline bool _hb_compare_and_swaplp (long *P, long O, long N) +{ + _hb_memory_barrier (); + bool result = __compare_and_swaplp (P, &O, N); + _hb_memory_barrier (); + return result; +} + +#define hb_atomic_int_impl_add(AI, V) _hb_fetch_and_add ((AI), (V)) + +#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_compare_and_swaplp ((long *) (P), (long) (O), (long) (N)) +static_assert ((sizeof (long) == sizeof (void *)), ""); + + +#elif !defined(HB_NO_MT) + +#define HB_ATOMIC_INT_NIL 1 /* Warn that fallback implementation is in use. */ + +#define _hb_memory_barrier() + +#define hb_atomic_int_impl_add(AI, V) ((*(AI) += (V)) - (V)) + +#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false) + + +#else /* HB_NO_MT */ + +#define hb_atomic_int_impl_add(AI, V) ((*(AI) += (V)) - (V)) + +#define _hb_memory_barrier() + +#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false) + + +#endif + + +#ifndef _hb_memory_r_barrier +#define _hb_memory_r_barrier() _hb_memory_barrier () +#endif +#ifndef _hb_memory_w_barrier +#define _hb_memory_w_barrier() _hb_memory_barrier () +#endif +#ifndef hb_atomic_int_impl_set_relaxed +#define hb_atomic_int_impl_set_relaxed(AI, V) (*(AI) = (V)) +#endif +#ifndef hb_atomic_int_impl_get_relaxed +#define hb_atomic_int_impl_get_relaxed(AI) (*(AI)) +#endif + +#ifndef hb_atomic_ptr_impl_set_relaxed +#define hb_atomic_ptr_impl_set_relaxed(P, V) (*(P) = (V)) +#endif +#ifndef hb_atomic_ptr_impl_get_relaxed +#define hb_atomic_ptr_impl_get_relaxed(P) (*(P)) +#endif +#ifndef hb_atomic_int_impl_set +inline void hb_atomic_int_impl_set (int *AI, int v) { _hb_memory_w_barrier (); *AI = v; } +#endif +#ifndef hb_atomic_int_impl_get +inline int hb_atomic_int_impl_get (const int *AI) { int v = *AI; _hb_memory_r_barrier (); return v; } +#endif +#ifndef hb_atomic_ptr_impl_get +inline void *hb_atomic_ptr_impl_get (void ** const P) { void *v = *P; _hb_memory_r_barrier (); return v; } +#endif + + +#define HB_ATOMIC_INT_INIT(V) {V} +struct hb_atomic_int_t +{ + void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); } + void set (int v_) { hb_atomic_int_impl_set (&v, v_); } + int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); } + int get () const { return hb_atomic_int_impl_get (&v); } + int inc () { return hb_atomic_int_impl_add (&v, 1); } + int dec () { return hb_atomic_int_impl_add (&v, -1); } + + int v; +}; + + +#define HB_ATOMIC_PTR_INIT(V) {V} +template +struct hb_atomic_ptr_t +{ + typedef typename hb_remove_pointer (P) T; + + void init (T* v_ = nullptr) { set_relaxed (v_); } + void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); } + T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); } + T *get () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); } + bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); } + + T * operator -> () const { return get (); } + template operator C * () const { return get (); } + + T *v; +}; + + +#endif /* HB_ATOMIC_HH */ diff --git a/src/hb-blob-private.hh b/src/hb-blob-private.hh deleted file mode 100644 index b72fa72..0000000 --- a/src/hb-blob-private.hh +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright © 2009 Red Hat, Inc. - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_BLOB_PRIVATE_HH -#define HB_BLOB_PRIVATE_HH - -#include "hb-private.hh" - -#include "hb-object-private.hh" - - -/* - * hb_blob_t - */ - -struct hb_blob_t -{ - inline void fini_shallow (void) - { - destroy_user_data (); - } - - inline void destroy_user_data (void) - { - if (destroy) - { - destroy (user_data); - user_data = nullptr; - destroy = nullptr; - } - } - - HB_INTERNAL bool try_make_writable (void); - HB_INTERNAL bool try_make_writable_inplace (void); - HB_INTERNAL bool try_make_writable_inplace_unix (void); - - inline void lock (void) - { - hb_blob_make_immutable (this); - } - - template - inline const Type* as (void) const - { - return unlikely (!data) ? &Null(Type) : reinterpret_cast (data); - } - - public: - hb_object_header_t header; - ASSERT_POD (); - - bool immutable; - - const char *data; - unsigned int length; - hb_memory_mode_t mode; - - void *user_data; - hb_destroy_func_t destroy; -}; - - -#endif /* HB_BLOB_PRIVATE_HH */ diff --git a/src/hb-blob.cc b/src/hb-blob.cc index c138648..bcf381e 100644 --- a/src/hb-blob.cc +++ b/src/hb-blob.cc @@ -25,14 +25,20 @@ * Red Hat Author(s): Behdad Esfahbod */ -/* http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */ + +/* https://github.com/harfbuzz/harfbuzz/issues/1308 + * http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html + * https://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html + */ #ifndef _POSIX_C_SOURCE +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-macros" #define _POSIX_C_SOURCE 200809L +#pragma GCC diagnostic pop #endif -#include "hb-private.hh" -#include "hb-debug.hh" -#include "hb-blob-private.hh" +#include "hb.hh" +#include "hb-blob.hh" #ifdef HAVE_SYS_MMAN_H #ifdef HAVE_UNISTD_H @@ -47,6 +53,19 @@ /** + * SECTION: hb-blob + * @title: hb-blob + * @short_description: Binary data containers + * @include: hb.h + * + * Blobs wrap a chunk of binary data to handle lifecycle management of data + * while it is passed between client and HarfBuzz. Blobs are primarily used + * to create font faces, but also to access font face tables, as well as + * pass around other binary data. + **/ + + +/** * hb_blob_create: (skip) * @data: Pointer to blob data. * @length: Length of @data in bytes. @@ -130,7 +149,7 @@ hb_blob_create_sub_blob (hb_blob_t *parent, { hb_blob_t *blob; - if (!length || offset >= parent->length) + if (!length || !parent || offset >= parent->length) return hb_blob_get_empty (); hb_blob_make_immutable (parent); @@ -181,22 +200,9 @@ hb_blob_copy_writable_or_fail (hb_blob_t *blob) * Since: 0.9.2 **/ hb_blob_t * -hb_blob_get_empty (void) +hb_blob_get_empty () { - static const hb_blob_t _hb_blob_nil = { - HB_OBJECT_HEADER_STATIC, - - true, /* immutable */ - - nullptr, /* data */ - 0, /* length */ - HB_MEMORY_MODE_READONLY, /* mode */ - - nullptr, /* user_data */ - nullptr /* destroy */ - }; - - return const_cast (&_hb_blob_nil); + return const_cast (&Null(hb_blob_t)); } /** @@ -291,10 +297,10 @@ hb_blob_get_user_data (hb_blob_t *blob, void hb_blob_make_immutable (hb_blob_t *blob) { - if (hb_object_is_inert (blob)) + if (hb_object_is_immutable (blob)) return; - blob->immutable = true; + hb_object_make_immutable (blob); } /** @@ -310,7 +316,7 @@ hb_blob_make_immutable (hb_blob_t *blob) hb_bool_t hb_blob_is_immutable (hb_blob_t *blob) { - return blob->immutable; + return hb_object_is_immutable (blob); } @@ -384,7 +390,7 @@ hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length) bool -hb_blob_t::try_make_writable_inplace_unix (void) +hb_blob_t::try_make_writable_inplace_unix () { #if defined(HAVE_SYS_MMAN_H) && defined(HAVE_MPROTECT) uintptr_t pagesize = -1, mask, length; @@ -427,7 +433,7 @@ hb_blob_t::try_make_writable_inplace_unix (void) } bool -hb_blob_t::try_make_writable_inplace (void) +hb_blob_t::try_make_writable_inplace () { DEBUG_MSG_FUNC (BLOB, this, "making writable inplace\n"); @@ -442,9 +448,9 @@ hb_blob_t::try_make_writable_inplace (void) } bool -hb_blob_t::try_make_writable (void) +hb_blob_t::try_make_writable () { - if (this->immutable) + if (hb_object_is_immutable (this)) return false; if (this->mode == HB_MEMORY_MODE_WRITABLE) @@ -487,12 +493,12 @@ hb_blob_t::try_make_writable (void) # include #endif -#if defined(_WIN32) || defined(__CYGWIN__) +#ifdef _WIN32 # include -#endif - -#ifndef _O_BINARY -# define _O_BINARY 0 +#else +# ifndef O_BINARY +# define O_BINARY 0 +# endif #endif #ifndef MAP_NORESERVE @@ -503,25 +509,28 @@ struct hb_mapped_file_t { char *contents; unsigned long length; -#if defined(_WIN32) || defined(__CYGWIN__) +#ifdef _WIN32 HANDLE mapping; #endif }; +#if (defined(HAVE_MMAP) || defined(_WIN32)) && !defined(HB_NO_MMAP) static void -_hb_mapped_file_destroy (hb_mapped_file_t *file) +_hb_mapped_file_destroy (void *file_) { + hb_mapped_file_t *file = (hb_mapped_file_t *) file_; #ifdef HAVE_MMAP munmap (file->contents, file->length); -#elif defined(_WIN32) || defined(__CYGWIN__) +#elif defined(_WIN32) UnmapViewOfFile (file->contents); CloseHandle (file->mapping); #else - free (file->contents); + assert (0); // If we don't have mmap we shouldn't reach here #endif free (file); } +#endif /** * hb_blob_create_from_file: @@ -534,77 +543,136 @@ _hb_mapped_file_destroy (hb_mapped_file_t *file) hb_blob_t * hb_blob_create_from_file (const char *file_name) { - // Adopted from glib's gmappedfile.c with Matthias Clasen and - // Allison Lortie permission but changed a lot to suit our need. - bool writable = false; - hb_memory_mode_t mm = HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE; + /* Adopted from glib's gmappedfile.c with Matthias Clasen and + Allison Lortie permission but changed a lot to suit our need. */ +#if defined(HAVE_MMAP) && !defined(HB_NO_MMAP) hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t)); if (unlikely (!file)) return hb_blob_get_empty (); -#ifdef HAVE_MMAP - int fd = open (file_name, (writable ? O_RDWR : O_RDONLY) | _O_BINARY, 0); -# define CLOSE close + int fd = open (file_name, O_RDONLY | O_BINARY, 0); if (unlikely (fd == -1)) goto fail_without_close; struct stat st; if (unlikely (fstat (fd, &st) == -1)) goto fail; - // See https://github.com/GNOME/glib/blob/f9faac7/glib/gmappedfile.c#L139-L142 - if (unlikely (st.st_size == 0 && S_ISREG (st.st_mode))) goto fail; - file->length = (unsigned long) st.st_size; - file->contents = (char *) mmap (nullptr, file->length, - writable ? PROT_READ|PROT_WRITE : PROT_READ, + file->contents = (char *) mmap (nullptr, file->length, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, fd, 0); if (unlikely (file->contents == MAP_FAILED)) goto fail; -#elif defined(_WIN32) || defined(__CYGWIN__) - HANDLE fd = CreateFile (file_name, - writable ? GENERIC_READ|GENERIC_WRITE : GENERIC_READ, - FILE_SHARE_READ, nullptr, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, nullptr); -# define CLOSE CloseHandle + close (fd); - if (unlikely (fd == INVALID_HANDLE_VALUE)) goto fail_without_close; + return hb_blob_create (file->contents, file->length, + HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file, + (hb_destroy_func_t) _hb_mapped_file_destroy); - file->length = (unsigned long) GetFileSize (fd, nullptr); - file->mapping = CreateFileMapping (fd, nullptr, - writable ? PAGE_WRITECOPY : PAGE_READONLY, - 0, 0, nullptr); - if (unlikely (file->mapping == nullptr)) goto fail; +fail: + close (fd); +fail_without_close: + free (file); - file->contents = (char *) MapViewOfFile (file->mapping, - writable ? FILE_MAP_COPY : FILE_MAP_READ, - 0, 0, 0); - if (unlikely (file->contents == nullptr)) goto fail; +#elif defined(_WIN32) && !defined(HB_NO_MMAP) + hb_mapped_file_t *file = (hb_mapped_file_t *) calloc (1, sizeof (hb_mapped_file_t)); + if (unlikely (!file)) return hb_blob_get_empty (); + HANDLE fd; + unsigned int size = strlen (file_name) + 1; + wchar_t * wchar_file_name = (wchar_t *) malloc (sizeof (wchar_t) * size); + if (unlikely (wchar_file_name == nullptr)) goto fail_without_close; + mbstowcs (wchar_file_name, file_name, size); +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) + { + CREATEFILE2_EXTENDED_PARAMETERS ceparams = { 0 }; + ceparams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS); + ceparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0xFFFF; + ceparams.dwFileFlags = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0xFFF00000; + ceparams.dwSecurityQosFlags = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED & 0x000F0000; + ceparams.lpSecurityAttributes = nullptr; + ceparams.hTemplateFile = nullptr; + fd = CreateFile2 (wchar_file_name, GENERIC_READ, FILE_SHARE_READ, + OPEN_EXISTING, &ceparams); + } #else - mm = HB_MEMORY_MODE_WRITABLE; - - FILE *fd = fopen (file_name, "rb"); -# define CLOSE fclose - if (unlikely (!fd)) goto fail_without_close; + fd = CreateFileW (wchar_file_name, GENERIC_READ, FILE_SHARE_READ, nullptr, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, + nullptr); +#endif + free (wchar_file_name); - fseek (fd, 0, SEEK_END); - file->length = ftell (fd); - rewind (fd); - file->contents = (char *) malloc (file->length); - if (unlikely (!file->contents)) goto fail; + if (unlikely (fd == INVALID_HANDLE_VALUE)) goto fail_without_close; - if (unlikely (fread (file->contents, 1, file->length, fd) != file->length)) - goto fail; +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) + { + LARGE_INTEGER length; + GetFileSizeEx (fd, &length); + file->length = length.LowPart; + file->mapping = CreateFileMappingFromApp (fd, nullptr, PAGE_READONLY, length.QuadPart, nullptr); + } +#else + file->length = (unsigned long) GetFileSize (fd, nullptr); + file->mapping = CreateFileMapping (fd, nullptr, PAGE_READONLY, 0, 0, nullptr); +#endif + if (unlikely (file->mapping == nullptr)) goto fail; +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) + file->contents = (char *) MapViewOfFileFromApp (file->mapping, FILE_MAP_READ, 0, 0); +#else + file->contents = (char *) MapViewOfFile (file->mapping, FILE_MAP_READ, 0, 0, 0); #endif + if (unlikely (file->contents == nullptr)) goto fail; - CLOSE (fd); - return hb_blob_create (file->contents, file->length, mm, (void *) file, + CloseHandle (fd); + return hb_blob_create (file->contents, file->length, + HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE, (void *) file, (hb_destroy_func_t) _hb_mapped_file_destroy); fail: - CLOSE (fd); -#undef CLOSE + CloseHandle (fd); fail_without_close: free (file); + +#endif + + /* The following tries to read a file without knowing its size beforehand + It's used as a fallback for systems without mmap or to read from pipes */ + unsigned long len = 0, allocated = BUFSIZ * 16; + char *data = (char *) malloc (allocated); + if (unlikely (data == nullptr)) return hb_blob_get_empty (); + + FILE *fp = fopen (file_name, "rb"); + if (unlikely (fp == nullptr)) goto fread_fail_without_close; + + while (!feof (fp)) + { + if (allocated - len < BUFSIZ) + { + allocated *= 2; + /* Don't allocate and go more than ~536MB, our mmap reader still + can cover files like that but lets limit our fallback reader */ + if (unlikely (allocated > (2 << 28))) goto fread_fail; + char *new_data = (char *) realloc (data, allocated); + if (unlikely (new_data == nullptr)) goto fread_fail; + data = new_data; + } + + unsigned long addition = fread (data + len, 1, allocated - len, fp); + + int err = ferror (fp); +#ifdef EINTR // armcc doesn't have it + if (unlikely (err == EINTR)) continue; +#endif + if (unlikely (err)) goto fread_fail; + + len += addition; + } + + return hb_blob_create (data, len, HB_MEMORY_MODE_WRITABLE, data, + (hb_destroy_func_t) free); + +fread_fail: + fclose (fp); +fread_fail_without_close: + free (data); return hb_blob_get_empty (); } diff --git a/src/hb-blob.hh b/src/hb-blob.hh new file mode 100644 index 0000000..4ea13f8 --- /dev/null +++ b/src/hb-blob.hh @@ -0,0 +1,101 @@ +/* + * Copyright © 2009 Red Hat, Inc. + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_BLOB_HH +#define HB_BLOB_HH + +#include "hb.hh" + + +/* + * hb_blob_t + */ + +struct hb_blob_t +{ + void fini_shallow () { destroy_user_data (); } + + void destroy_user_data () + { + if (destroy) + { + destroy (user_data); + user_data = nullptr; + destroy = nullptr; + } + } + + HB_INTERNAL bool try_make_writable (); + HB_INTERNAL bool try_make_writable_inplace (); + HB_INTERNAL bool try_make_writable_inplace_unix (); + + template + const Type* as () const + { + return length < hb_null_size (Type) ? &Null(Type) : reinterpret_cast (data); + } + hb_bytes_t as_bytes () const + { return hb_bytes_t (data, length); } + + public: + hb_object_header_t header; + + const char *data; + unsigned int length; + hb_memory_mode_t mode; + + void *user_data; + hb_destroy_func_t destroy; +}; + + +/* + * hb_blob_ptr_t + */ + +template +struct hb_blob_ptr_t +{ + typedef typename hb_remove_pointer (P) T; + + hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {} + hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; } + const T * operator -> () const { return get (); } + const T & operator * () const { return *get (); } + template operator const C * () const { return get (); } + operator const char * () const { return (const char *) get (); } + const T * get () const { return b->as (); } + hb_blob_t * get_blob () const { return b.get_raw (); } + unsigned int get_length () const { return b.get ()->length; } + void destroy () { hb_blob_destroy (b.get ()); b = nullptr; } + + hb_nonnull_ptr_t b; +}; + + +#endif /* HB_BLOB_HH */ diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh index 380f3c5..1f9e2e9 100644 --- a/src/hb-buffer-deserialize-json.hh +++ b/src/hb-buffer-deserialize-json.hh @@ -29,7 +29,7 @@ #ifndef HB_BUFFER_DESERIALIZE_JSON_HH #define HB_BUFFER_DESERIALIZE_JSON_HH -#include "hb-private.hh" +#include "hb.hh" #line 36 "hb-buffer-deserialize-json.hh" diff --git a/src/hb-buffer-deserialize-json.rl b/src/hb-buffer-deserialize-json.rl index ec9bc7c..f3abb02 100644 --- a/src/hb-buffer-deserialize-json.rl +++ b/src/hb-buffer-deserialize-json.rl @@ -27,7 +27,7 @@ #ifndef HB_BUFFER_DESERIALIZE_JSON_HH #define HB_BUFFER_DESERIALIZE_JSON_HH -#include "hb-private.hh" +#include "hb.hh" %%{ diff --git a/src/hb-buffer-deserialize-text.hh b/src/hb-buffer-deserialize-text.hh index 5bca369..67f0a12 100644 --- a/src/hb-buffer-deserialize-text.hh +++ b/src/hb-buffer-deserialize-text.hh @@ -29,7 +29,7 @@ #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH #define HB_BUFFER_DESERIALIZE_TEXT_HH -#include "hb-private.hh" +#include "hb.hh" #line 36 "hb-buffer-deserialize-text.hh" diff --git a/src/hb-buffer-deserialize-text.rl b/src/hb-buffer-deserialize-text.rl index 1d90979..6268a6c 100644 --- a/src/hb-buffer-deserialize-text.rl +++ b/src/hb-buffer-deserialize-text.rl @@ -27,7 +27,7 @@ #ifndef HB_BUFFER_DESERIALIZE_TEXT_HH #define HB_BUFFER_DESERIALIZE_TEXT_HH -#include "hb-private.hh" +#include "hb.hh" %%{ diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh deleted file mode 100644 index dd6f1dc..0000000 --- a/src/hb-buffer-private.hh +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright © 1998-2004 David Turner and Werner Lemberg - * Copyright © 2004,2007,2009,2010 Red Hat, Inc. - * 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. - * - * Red Hat Author(s): Owen Taylor, Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_BUFFER_PRIVATE_HH -#define HB_BUFFER_PRIVATE_HH - -#include "hb-private.hh" -#include "hb-object-private.hh" -#include "hb-unicode-private.hh" - - -#ifndef HB_BUFFER_MAX_LEN_FACTOR -#define HB_BUFFER_MAX_LEN_FACTOR 32 -#endif -#ifndef HB_BUFFER_MAX_LEN_MIN -#define HB_BUFFER_MAX_LEN_MIN 8192 -#endif -#ifndef HB_BUFFER_MAX_LEN_DEFAULT -#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */ -#endif - -#ifndef HB_BUFFER_MAX_OPS_FACTOR -#define HB_BUFFER_MAX_OPS_FACTOR 64 -#endif -#ifndef HB_BUFFER_MAX_OPS_MIN -#define HB_BUFFER_MAX_OPS_MIN 1024 -#endif -#ifndef HB_BUFFER_MAX_OPS_DEFAULT -#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */ -#endif - -static_assert ((sizeof (hb_glyph_info_t) == 20), ""); -static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), ""); - -HB_MARK_AS_FLAG_T (hb_buffer_flags_t); -HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t); -HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t); - -enum hb_buffer_scratch_flags_t { - HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u, - HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u, - HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u, - 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, - HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u, - HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u, - HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u, -}; -HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t); - - -/* - * hb_buffer_t - */ - -struct hb_buffer_t { - hb_object_header_t header; - ASSERT_POD (); - - /* Information about how the text in the buffer should be treated */ - hb_unicode_funcs_t *unicode; /* Unicode functions */ - hb_buffer_flags_t flags; /* BOT / EOT / etc. */ - hb_buffer_cluster_level_t cluster_level; - hb_codepoint_t replacement; /* U+FFFD or something else. */ - hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */ - unsigned int max_len; /* Maximum allowed len. */ - int max_ops; /* Maximum allowed operations. */ - - /* Buffer contents */ - hb_buffer_content_type_t content_type; - hb_segment_properties_t props; /* Script, language, direction */ - - bool successful; /* Allocations successful */ - bool have_output; /* Whether we have an output buffer going on */ - bool have_positions; /* Whether we have positions */ - - unsigned int idx; /* Cursor into ->info and ->pos arrays */ - unsigned int len; /* Length of ->info and ->pos arrays */ - unsigned int out_len; /* Length of ->out array if have_output */ - - unsigned int allocated; /* Length of allocated arrays */ - hb_glyph_info_t *info; - hb_glyph_info_t *out_info; - hb_glyph_position_t *pos; - - unsigned int serial; - - /* Text before / after the main buffer contents. - * Always in Unicode, and ordered outward. - * Index 0 is for "pre-context", 1 for "post-context". */ - static const unsigned int CONTEXT_LENGTH = 5; - hb_codepoint_t context[2][CONTEXT_LENGTH]; - unsigned int context_len[2]; - - /* Debugging API */ - hb_buffer_message_func_t message_func; - void *message_data; - hb_destroy_func_t message_destroy; - - /* Internal debugging. */ - /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */ -#ifndef HB_NDEBUG - uint8_t allocated_var_bits; -#endif - - - /* Methods */ - - inline void allocate_var (unsigned int start, unsigned int count) - { -#ifndef HB_NDEBUG - unsigned int end = start + count; - assert (end <= 8); - unsigned int bits = (1u< (cluster, infos[i].cluster); - return cluster; - } - inline void - _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 != infos[i].cluster) - { - scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK; - infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; - } - } - - inline void - unsafe_to_break_all (void) - { - unsafe_to_break_impl (0, len); - } - inline void - safe_to_break_all (void) - { - for (unsigned int i = 0; i < len; i++) - info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; - } -}; - - -/* Loop over clusters. Duplicated in foreach_syllable(). */ -#define foreach_cluster(buffer, start, end) \ - for (unsigned int \ - _count = buffer->len, \ - start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \ - start < _count; \ - start = end, end = _next_cluster (buffer, start)) - -static inline unsigned int -_next_cluster (hb_buffer_t *buffer, unsigned int start) -{ - hb_glyph_info_t *info = buffer->info; - unsigned int count = buffer->len; - - unsigned int cluster = info[start].cluster; - while (++start < count && cluster == info[start].cluster) - ; - - return start; -} - - -#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \ - b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \ - sizeof (b->info[0].var)) -#define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ()) -#define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ()) -#define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ()) - - -#endif /* HB_BUFFER_PRIVATE_HH */ diff --git a/src/hb-buffer-serialize.cc b/src/hb-buffer-serialize.cc index 1147194..6e265e8 100644 --- a/src/hb-buffer-serialize.cc +++ b/src/hb-buffer-serialize.cc @@ -24,7 +24,7 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-buffer-private.hh" +#include "hb-buffer.hh" static const char *serialize_formats[] = { @@ -44,7 +44,7 @@ static const char *serialize_formats[] = { * Since: 0.9.7 **/ const char ** -hb_buffer_serialize_list_formats (void) +hb_buffer_serialize_list_formats () { return serialize_formats; } @@ -58,7 +58,7 @@ hb_buffer_serialize_list_formats (void) * @str is a valid buffer serialization format, use * hb_buffer_serialize_list_formats() to get the list of supported formats. * - * Return value: + * Return value: * The parsed #hb_buffer_serialize_format_t. * * Since: 0.9.7 @@ -246,7 +246,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) { - if (info[i].mask &HB_GLYPH_FLAG_DEFINED) + if (info[i].mask & HB_GLYPH_FLAG_DEFINED) p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "#%X", info[i].mask &HB_GLYPH_FLAG_DEFINED)); } @@ -319,7 +319,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, * ## json * TODO. * - * Return value: + * Return value: * The number of serialized items. * * Since: 0.9.7 @@ -425,14 +425,14 @@ parse_int (const char *pp, const char *end, int32_t *pv) * hb_buffer_deserialize_glyphs: * @buffer: an #hb_buffer_t buffer. * @buf: (array length=buf_len): - * @buf_len: + * @buf_len: * @end_ptr: (out): - * @font: - * @format: + * @font: + * @format: + * * - * * - * Return value: + * Return value: * * Since: 0.9.7 **/ @@ -440,8 +440,8 @@ hb_bool_t hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, const char *buf, int buf_len, /* -1 means nul-terminated */ - const char **end_ptr, /* May be nullptr */ - hb_font_t *font, /* May be nullptr */ + const char **end_ptr, /* May be NULL */ + hb_font_t *font, /* May be NULL */ hb_buffer_serialize_format_t format) { const char *end; diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 7b95aea..2dc02e9 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -27,20 +27,21 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-buffer-private.hh" -#include "hb-utf-private.hh" +#include "hb-buffer.hh" +#include "hb-utf.hh" /** * SECTION: hb-buffer - * @title: Buffers + * @title: hb-buffer * @short_description: Input and output buffers * @include: hb.h * * Buffers serve dual role in HarfBuzz; they hold the input characters that are - * passed hb_shape(), and after shaping they hold the output glyphs. + * passed to hb_shape(), and after shaping they hold the output glyphs. **/ + /** * hb_segment_properties_equal: * @a: first #hb_segment_properties_t to compare. @@ -124,14 +125,14 @@ hb_buffer_t::enlarge (unsigned int size) hb_glyph_info_t *new_info = nullptr; bool separate_out = out_info != info; - if (unlikely (_hb_unsigned_int_mul_overflows (size, sizeof (info[0])))) + if (unlikely (hb_unsigned_mul_overflows (size, sizeof (info[0])))) goto done; while (size >= new_allocated) new_allocated += (new_allocated >> 1) + 32; static_assert ((sizeof (info[0]) == sizeof (pos[0])), ""); - if (unlikely (_hb_unsigned_int_mul_overflows (new_allocated, sizeof (info[0])))) + if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0])))) goto done; new_pos = (hb_glyph_position_t *) realloc (pos, new_allocated * sizeof (pos[0])); @@ -182,7 +183,11 @@ hb_buffer_t::shift_forward (unsigned int count) if (idx + count > len) { /* Under memory failure we might expose this area. At least - * clean it up. Oh well... */ + * clean it up. Oh well... + * + * Ideally, we should at least set Default_Ignorable bits on + * these, as well as consistent cluster values. But the former + * is layering violation... */ memset (info + len, 0, (idx + count - len) * sizeof (info[0])); } len += count; @@ -210,23 +215,24 @@ hb_buffer_t::get_scratch_buffer (unsigned int *size) /* HarfBuzz-Internal API */ void -hb_buffer_t::reset (void) +hb_buffer_t::reset () { - if (unlikely (hb_object_is_inert (this))) + if (unlikely (hb_object_is_immutable (this))) return; hb_unicode_funcs_destroy (unicode); - unicode = hb_unicode_funcs_get_default (); + unicode = hb_unicode_funcs_reference (hb_unicode_funcs_get_default ()); flags = HB_BUFFER_FLAG_DEFAULT; replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT; + invisible = 0; clear (); } void -hb_buffer_t::clear (void) +hb_buffer_t::clear () { - if (unlikely (hb_object_is_inert (this))) + if (unlikely (hb_object_is_immutable (this))) return; hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT; @@ -281,9 +287,9 @@ hb_buffer_t::add_info (const hb_glyph_info_t &glyph_info) void -hb_buffer_t::remove_output (void) +hb_buffer_t::remove_output () { - if (unlikely (hb_object_is_inert (this))) + if (unlikely (hb_object_is_immutable (this))) return; have_output = false; @@ -294,9 +300,9 @@ hb_buffer_t::remove_output (void) } void -hb_buffer_t::clear_output (void) +hb_buffer_t::clear_output () { - if (unlikely (hb_object_is_inert (this))) + if (unlikely (hb_object_is_immutable (this))) return; have_output = true; @@ -307,9 +313,9 @@ hb_buffer_t::clear_output (void) } void -hb_buffer_t::clear_positions (void) +hb_buffer_t::clear_positions () { - if (unlikely (hb_object_is_inert (this))) + if (unlikely (hb_object_is_immutable (this))) return; have_output = false; @@ -322,7 +328,7 @@ hb_buffer_t::clear_positions (void) } void -hb_buffer_t::swap_buffers (void) +hb_buffer_t::swap_buffers () { if (unlikely (!successful)) return; @@ -354,6 +360,8 @@ hb_buffer_t::replace_glyphs (unsigned int num_in, { if (unlikely (!make_room_for (num_in, num_out))) return; + assert (idx + num_in <= len); + merge_clusters (idx, idx + num_in); hb_glyph_info_t orig_info = info[idx]; @@ -369,37 +377,6 @@ hb_buffer_t::replace_glyphs (unsigned int num_in, out_len += num_out; } -void -hb_buffer_t::output_glyph (hb_codepoint_t glyph_index) -{ - if (unlikely (!make_room_for (0, 1))) return; - - out_info[out_len] = info[idx]; - out_info[out_len].codepoint = glyph_index; - - out_len++; -} - -void -hb_buffer_t::output_info (const hb_glyph_info_t &glyph_info) -{ - if (unlikely (!make_room_for (0, 1))) return; - - out_info[out_len] = glyph_info; - - out_len++; -} - -void -hb_buffer_t::copy_glyph (void) -{ - if (unlikely (!make_room_for (0, 1))) return; - - out_info[out_len] = info[idx]; - - out_len++; -} - bool hb_buffer_t::move_to (unsigned int i) { @@ -429,8 +406,14 @@ hb_buffer_t::move_to (unsigned int i) unsigned int count = out_len - i; /* This will blow in our face if memory allocation fails later - * in this same lookup... */ - if (unlikely (idx < count && !shift_forward (count + 32))) return false; + * in this same lookup... + * + * We used to shift with extra 32 items, instead of the 0 below. + * But that would leave empty slots in the buffer in case of allocation + * failures. Setting to zero for now to avoid other problems (see + * comments in shift_forward(). This can cause O(N^2) behavior more + * severely than adding 32 empty slots can... */ + if (unlikely (idx < count && !shift_forward (count + 0))) return false; assert (idx >= count); @@ -442,19 +425,6 @@ hb_buffer_t::move_to (unsigned int i) return true; } -void -hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index) -{ - if (unlikely (out_info != info || out_len != idx)) { - if (unlikely (!make_room_for (1, 1))) return; - out_info[out_len] = info[idx]; - } - out_info[out_len].codepoint = glyph_index; - - idx++; - out_len++; -} - void hb_buffer_t::set_masks (hb_mask_t value, @@ -510,7 +480,7 @@ hb_buffer_t::reverse_range (unsigned int start, } void -hb_buffer_t::reverse (void) +hb_buffer_t::reverse () { if (unlikely (!len)) return; @@ -519,7 +489,7 @@ hb_buffer_t::reverse (void) } void -hb_buffer_t::reverse_clusters (void) +hb_buffer_t::reverse_clusters () { unsigned int i, start, count, last_cluster; @@ -666,7 +636,7 @@ hb_buffer_t::unsafe_to_break_from_outbuffer (unsigned int start, unsigned int en } void -hb_buffer_t::guess_segment_properties (void) +hb_buffer_t::guess_segment_properties () { assert (content_type == HB_BUFFER_CONTENT_TYPE_UNICODE || (!len && content_type == HB_BUFFER_CONTENT_TYPE_INVALID)); @@ -701,6 +671,29 @@ hb_buffer_t::guess_segment_properties (void) /* Public API */ +DEFINE_NULL_INSTANCE (hb_buffer_t) = +{ + HB_OBJECT_HEADER_STATIC, + + const_cast (&_hb_Null_hb_unicode_funcs_t), + HB_BUFFER_FLAG_DEFAULT, + HB_BUFFER_CLUSTER_LEVEL_DEFAULT, + HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT, + 0, /* invisible */ + HB_BUFFER_SCRATCH_FLAG_DEFAULT, + HB_BUFFER_MAX_LEN_DEFAULT, + HB_BUFFER_MAX_OPS_DEFAULT, + + HB_BUFFER_CONTENT_TYPE_INVALID, + HB_SEGMENT_PROPERTIES_DEFAULT, + false, /* successful */ + true, /* have_output */ + true /* have_positions */ + + /* Zero is good enough for everything else. */ +}; + + /** * hb_buffer_create: (Xconstructor) * @@ -716,7 +709,7 @@ hb_buffer_t::guess_segment_properties (void) * Since: 0.9.2 **/ hb_buffer_t * -hb_buffer_create (void) +hb_buffer_create () { hb_buffer_t *buffer; @@ -734,36 +727,16 @@ hb_buffer_create (void) /** * hb_buffer_get_empty: * - * + * * * Return value: (transfer full): * * Since: 0.9.2 **/ hb_buffer_t * -hb_buffer_get_empty (void) +hb_buffer_get_empty () { - static const hb_buffer_t _hb_buffer_nil = { - HB_OBJECT_HEADER_STATIC, - - const_cast (&_hb_unicode_funcs_nil), - HB_BUFFER_FLAG_DEFAULT, - HB_BUFFER_CLUSTER_LEVEL_DEFAULT, - HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT, - HB_BUFFER_SCRATCH_FLAG_DEFAULT, - HB_BUFFER_MAX_LEN_DEFAULT, - HB_BUFFER_MAX_OPS_DEFAULT, - - HB_BUFFER_CONTENT_TYPE_INVALID, - HB_SEGMENT_PROPERTIES_DEFAULT, - false, /* successful */ - true, /* have_output */ - true /* have_positions */ - - /* Zero is good enough for everything else. */ - }; - - return const_cast (&_hb_buffer_nil); + return const_cast (&Null(hb_buffer_t)); } /** @@ -812,14 +785,14 @@ hb_buffer_destroy (hb_buffer_t *buffer) /** * hb_buffer_set_user_data: (skip) * @buffer: an #hb_buffer_t. - * @key: - * @data: - * @destroy: - * @replace: + * @key: + * @data: + * @destroy: + * @replace: * - * * - * Return value: + * + * Return value: * * Since: 0.9.2 **/ @@ -836,11 +809,11 @@ hb_buffer_set_user_data (hb_buffer_t *buffer, /** * hb_buffer_get_user_data: (skip) * @buffer: an #hb_buffer_t. - * @key: + * @key: * - * * - * Return value: + * + * Return value: * * Since: 0.9.2 **/ @@ -890,9 +863,9 @@ hb_buffer_get_content_type (hb_buffer_t *buffer) /** * hb_buffer_set_unicode_funcs: * @buffer: an #hb_buffer_t. - * @unicode_funcs: + * @unicode_funcs: + * * - * * * Since: 0.9.2 **/ @@ -900,13 +873,12 @@ void hb_buffer_set_unicode_funcs (hb_buffer_t *buffer, hb_unicode_funcs_t *unicode_funcs) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; if (!unicode_funcs) unicode_funcs = hb_unicode_funcs_get_default (); - hb_unicode_funcs_reference (unicode_funcs); hb_unicode_funcs_destroy (buffer->unicode); buffer->unicode = unicode_funcs; @@ -916,9 +888,9 @@ hb_buffer_set_unicode_funcs (hb_buffer_t *buffer, * hb_buffer_get_unicode_funcs: * @buffer: an #hb_buffer_t. * - * * - * Return value: + * + * Return value: * * Since: 0.9.2 **/ @@ -948,7 +920,7 @@ hb_buffer_set_direction (hb_buffer_t *buffer, hb_direction_t direction) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; buffer->props.direction = direction; @@ -992,7 +964,7 @@ void hb_buffer_set_script (hb_buffer_t *buffer, hb_script_t script) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; buffer->props.script = script; @@ -1027,7 +999,7 @@ hb_buffer_get_script (hb_buffer_t *buffer) * are orthogonal to the scripts, and though they are related, they are * different concepts and should not be confused with each other. * - * Use hb_language_from_string() to convert from ISO 639 language codes to + * Use hb_language_from_string() to convert from BCP 47 language tags to * #hb_language_t. * * Since: 0.9.2 @@ -1036,7 +1008,7 @@ void hb_buffer_set_language (hb_buffer_t *buffer, hb_language_t language) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; buffer->props.language = language; @@ -1074,7 +1046,7 @@ void hb_buffer_set_segment_properties (hb_buffer_t *buffer, const hb_segment_properties_t *props) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; buffer->props = *props; @@ -1110,7 +1082,7 @@ void hb_buffer_set_flags (hb_buffer_t *buffer, hb_buffer_flags_t flags) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; buffer->flags = flags; @@ -1122,7 +1094,7 @@ hb_buffer_set_flags (hb_buffer_t *buffer, * * See hb_buffer_set_flags(). * - * Return value: + * Return value: * The @buffer flags. * * Since: 0.9.7 @@ -1136,9 +1108,9 @@ hb_buffer_get_flags (hb_buffer_t *buffer) /** * hb_buffer_set_cluster_level: * @buffer: an #hb_buffer_t. - * @cluster_level: + * @cluster_level: + * * - * * * Since: 0.9.42 **/ @@ -1146,7 +1118,7 @@ void hb_buffer_set_cluster_level (hb_buffer_t *buffer, hb_buffer_cluster_level_t cluster_level) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; buffer->cluster_level = cluster_level; @@ -1156,9 +1128,9 @@ hb_buffer_set_cluster_level (hb_buffer_t *buffer, * hb_buffer_get_cluster_level: * @buffer: an #hb_buffer_t. * - * * - * Return value: + * + * Return value: * * Since: 0.9.42 **/ @@ -1185,7 +1157,7 @@ void hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer, hb_codepoint_t replacement) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; buffer->replacement = replacement; @@ -1197,7 +1169,7 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer, * * See hb_buffer_set_replacement_codepoint(). * - * Return value: + * Return value: * The @buffer replacement #hb_codepoint_t. * * Since: 0.9.31 @@ -1210,6 +1182,46 @@ hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer) /** + * hb_buffer_set_invisible_glyph: + * @buffer: an #hb_buffer_t. + * @invisible: the invisible #hb_codepoint_t + * + * Sets the #hb_codepoint_t that replaces invisible characters in + * the shaping result. If set to zero (default), the glyph for the + * U+0020 SPACE character is used. Otherwise, this value is used + * verbatim. + * + * Since: 2.0.0 + **/ +void +hb_buffer_set_invisible_glyph (hb_buffer_t *buffer, + hb_codepoint_t invisible) +{ + if (unlikely (hb_object_is_immutable (buffer))) + return; + + buffer->invisible = invisible; +} + +/** + * hb_buffer_get_invisible_glyph: + * @buffer: an #hb_buffer_t. + * + * See hb_buffer_set_invisible_glyph(). + * + * Return value: + * The @buffer invisible #hb_codepoint_t. + * + * Since: 2.0.0 + **/ +hb_codepoint_t +hb_buffer_get_invisible_glyph (hb_buffer_t *buffer) +{ + return buffer->invisible; +} + + +/** * hb_buffer_reset: * @buffer: an #hb_buffer_t. * @@ -1308,7 +1320,7 @@ hb_buffer_add (hb_buffer_t *buffer, * Similar to hb_buffer_pre_allocate(), but clears any new items added at the * end. * - * Return value: + * Return value: * %true if @buffer memory allocation succeeded, %false otherwise. * * Since: 0.9.2 @@ -1317,7 +1329,7 @@ hb_bool_t hb_buffer_set_length (hb_buffer_t *buffer, unsigned int length) { - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return length == 0; if (!buffer->ensure (length)) @@ -1498,6 +1510,8 @@ hb_buffer_reverse_clusters (hb_buffer_t *buffer) * it will be set to the process's default language as returned by * hb_language_get_default(). This may change in the future by * taking buffer script into consideration when choosing a language. + * Note that hb_language_get_default() is NOT threadsafe the first time + * it is called. See documentation for that function for details. * * Since: 0.9.7 **/ @@ -1521,7 +1535,7 @@ hb_buffer_add_utf (hb_buffer_t *buffer, assert (buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE || (!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID)); - if (unlikely (hb_object_is_inert (buffer))) + if (unlikely (hb_object_is_immutable (buffer))) return; if (text_length == -1) @@ -1652,7 +1666,7 @@ hb_buffer_add_utf32 (hb_buffer_t *buffer, unsigned int item_offset, int item_length) { - hb_buffer_add_utf > (buffer, text, text_length, item_offset, item_length); + hb_buffer_add_utf (buffer, text, text_length, item_offset, item_length); } /** @@ -1713,7 +1727,7 @@ hb_buffer_add_codepoints (hb_buffer_t *buffer, unsigned int item_offset, int item_length) { - hb_buffer_add_utf > (buffer, text, text_length, item_offset, item_length); + hb_buffer_add_utf (buffer, text, text_length, item_offset, item_length); } @@ -1886,6 +1900,10 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g /** * hb_buffer_diff: + * @buffer: a buffer. + * @reference: other buffer to compare to. + * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1. + * @position_fuzz: allowed absolute difference in position values. * * If dottedcircle_glyph is (hb_codepoint_t) -1 then %HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT * and %HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned. This should be used by most @@ -1982,7 +2000,7 @@ hb_buffer_diff (hb_buffer_t *buffer, * @user_data: * @destroy: * - * + * * * Since: 1.1.3 **/ diff --git a/src/hb-buffer.h b/src/hb-buffer.h index 8a2d3e8..f989d25 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -44,7 +44,6 @@ HB_BEGIN_DECLS * hb_glyph_info_t: * @codepoint: either a Unicode code point (before shaping) or a glyph index * (after shaping). - * @mask: * @cluster: the index of the character in the original text that corresponds * to this #hb_glyph_info_t, or whatever the client passes to * hb_buffer_add(). More than one #hb_glyph_info_t can have the same @@ -59,11 +58,13 @@ HB_BEGIN_DECLS * * The #hb_glyph_info_t is the structure that holds information about the * glyphs and their relation to input text. - * */ -typedef struct hb_glyph_info_t { +typedef struct hb_glyph_info_t +{ hb_codepoint_t codepoint; - hb_mask_t mask; /* Holds hb_glyph_flags_t after hb_shape(), plus other things. */ + /*< private >*/ + hb_mask_t mask; + /*< public >*/ uint32_t cluster; /*< private >*/ @@ -88,6 +89,9 @@ typedef struct hb_glyph_info_t { * of each line after line-breaking, or limiting * the reshaping to a small piece around the * breaking point only. + * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags. + * + * Since: 1.5.0 */ typedef enum { /*< flags >*/ HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001, @@ -298,7 +302,15 @@ hb_buffer_set_flags (hb_buffer_t *buffer, HB_EXTERN hb_buffer_flags_t hb_buffer_get_flags (hb_buffer_t *buffer); -/* +/** + * hb_buffer_cluster_level_t: + * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES: Return cluster values grouped by graphemes into + * monotone order. + * @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS: Return cluster values grouped into monotone order. + * @HB_BUFFER_CLUSTER_LEVEL_CHARACTERS: Don't group cluster values. + * @HB_BUFFER_CLUSTER_LEVEL_DEFAULT: Default cluster level, + * equal to @HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES. + * * Since: 0.9.42 */ typedef enum { @@ -332,6 +344,13 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer, HB_EXTERN hb_codepoint_t hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer); +HB_EXTERN void +hb_buffer_set_invisible_glyph (hb_buffer_t *buffer, + hb_codepoint_t invisible); + +HB_EXTERN hb_codepoint_t +hb_buffer_get_invisible_glyph (hb_buffer_t *buffer); + HB_EXTERN void hb_buffer_reset (hb_buffer_t *buffer); diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh new file mode 100644 index 0000000..330f88b --- /dev/null +++ b/src/hb-buffer.hh @@ -0,0 +1,439 @@ +/* + * Copyright © 1998-2004 David Turner and Werner Lemberg + * Copyright © 2004,2007,2009,2010 Red Hat, Inc. + * 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. + * + * Red Hat Author(s): Owen Taylor, Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_BUFFER_HH +#define HB_BUFFER_HH + +#include "hb.hh" +#include "hb-unicode.hh" + + +#ifndef HB_BUFFER_MAX_LEN_FACTOR +#define HB_BUFFER_MAX_LEN_FACTOR 32 +#endif +#ifndef HB_BUFFER_MAX_LEN_MIN +#define HB_BUFFER_MAX_LEN_MIN 8192 +#endif +#ifndef HB_BUFFER_MAX_LEN_DEFAULT +#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */ +#endif + +#ifndef HB_BUFFER_MAX_OPS_FACTOR +#define HB_BUFFER_MAX_OPS_FACTOR 64 +#endif +#ifndef HB_BUFFER_MAX_OPS_MIN +#define HB_BUFFER_MAX_OPS_MIN 1024 +#endif +#ifndef HB_BUFFER_MAX_OPS_DEFAULT +#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */ +#endif + +static_assert ((sizeof (hb_glyph_info_t) == 20), ""); +static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), ""); + +HB_MARK_AS_FLAG_T (hb_buffer_flags_t); +HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t); +HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t); + +enum hb_buffer_scratch_flags_t { + HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u, + HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u, + HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u, + 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, + HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u, + HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u, + HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u, +}; +HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t); + + +/* + * hb_buffer_t + */ + +struct hb_buffer_t +{ + hb_object_header_t header; + + /* Information about how the text in the buffer should be treated */ + hb_unicode_funcs_t *unicode; /* Unicode functions */ + hb_buffer_flags_t flags; /* BOT / EOT / etc. */ + hb_buffer_cluster_level_t cluster_level; + hb_codepoint_t replacement; /* U+FFFD or something else. */ + hb_codepoint_t invisible; /* 0 or something else. */ + hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */ + unsigned int max_len; /* Maximum allowed len. */ + int max_ops; /* Maximum allowed operations. */ + + /* Buffer contents */ + hb_buffer_content_type_t content_type; + hb_segment_properties_t props; /* Script, language, direction */ + + bool successful; /* Allocations successful */ + bool have_output; /* Whether we have an output buffer going on */ + bool have_positions; /* Whether we have positions */ + + unsigned int idx; /* Cursor into ->info and ->pos arrays */ + unsigned int len; /* Length of ->info and ->pos arrays */ + unsigned int out_len; /* Length of ->out array if have_output */ + + unsigned int allocated; /* Length of allocated arrays */ + hb_glyph_info_t *info; + hb_glyph_info_t *out_info; + hb_glyph_position_t *pos; + + unsigned int serial; + + /* Text before / after the main buffer contents. + * Always in Unicode, and ordered outward. + * Index 0 is for "pre-context", 1 for "post-context". */ + static constexpr unsigned CONTEXT_LENGTH = 5u; + hb_codepoint_t context[2][CONTEXT_LENGTH]; + unsigned int context_len[2]; + + /* Debugging API */ + hb_buffer_message_func_t message_func; + void *message_data; + hb_destroy_func_t message_destroy; + + /* Internal debugging. */ + /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */ +#ifndef HB_NDEBUG + uint8_t allocated_var_bits; +#endif + + + /* Methods */ + + bool in_error () const { return !successful; } + + void allocate_var (unsigned int start, unsigned int count) + { +#ifndef HB_NDEBUG + unsigned int end = start + count; + assert (end <= 8); + unsigned int bits = (1u< (cluster, infos[i].cluster); + return cluster; + } + void + _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 != infos[i].cluster) + { + scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK; + infos[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + } + } + + void unsafe_to_break_all () + { unsafe_to_break_impl (0, len); } + void safe_to_break_all () + { + for (unsigned int i = 0; i < len; i++) + info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; + } +}; +DECLARE_NULL_INSTANCE (hb_buffer_t); + + +/* Loop over clusters. Duplicated in foreach_syllable(). */ +#define foreach_cluster(buffer, start, end) \ + for (unsigned int \ + _count = buffer->len, \ + start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \ + start < _count; \ + start = end, end = _next_cluster (buffer, start)) + +static inline unsigned int +_next_cluster (hb_buffer_t *buffer, unsigned int start) +{ + hb_glyph_info_t *info = buffer->info; + unsigned int count = buffer->len; + + unsigned int cluster = info[start].cluster; + while (++start < count && cluster == info[start].cluster) + ; + + return start; +} + + +#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \ + b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \ + sizeof (b->info[0].var)) +#define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ()) +#define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ()) +#define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ()) + + +#endif /* HB_BUFFER_HH */ diff --git a/src/hb-cache.hh b/src/hb-cache.hh new file mode 100644 index 0000000..bf26d96 --- /dev/null +++ b/src/hb-cache.hh @@ -0,0 +1,80 @@ +/* + * Copyright © 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_CACHE_HH +#define HB_CACHE_HH + +#include "hb.hh" + + +/* Implements a lock-free cache for int->int functions. */ + +template +struct hb_cache_t +{ + static_assert ((key_bits >= cache_bits), ""); + static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (hb_atomic_int_t)), ""); + static_assert (sizeof (hb_atomic_int_t) == sizeof (unsigned int), ""); + + void init () { clear (); } + void fini () {} + + void clear () + { + for (unsigned i = 0; i < ARRAY_LENGTH (values); i++) + values[i].set_relaxed (-1); + } + + bool get (unsigned int key, unsigned int *value) const + { + unsigned int k = key & ((1u<> value_bits) != (key >> cache_bits)) + return false; + *value = v & ((1u<> key_bits) || (value >> value_bits))) + return false; /* Overflows */ + unsigned int k = key & ((1u<>cache_bits)< hb_cmap_cache_t; +typedef hb_cache_t<16, 24, 8> hb_advance_cache_t; + + +#endif /* HB_CACHE_HH */ diff --git a/src/hb-cff-interp-common.hh b/src/hb-cff-interp-common.hh new file mode 100644 index 0000000..72e9e06 --- /dev/null +++ b/src/hb-cff-interp-common.hh @@ -0,0 +1,725 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ +#ifndef HB_CFF_INTERP_COMMON_HH +#define HB_CFF_INTERP_COMMON_HH + +namespace CFF { + +using namespace OT; + +typedef unsigned int op_code_t; + + +/* === Dict operators === */ + +/* One byte operators (0-31) */ +#define OpCode_version 0 /* CFF Top */ +#define OpCode_Notice 1 /* CFF Top */ +#define OpCode_FullName 2 /* CFF Top */ +#define OpCode_FamilyName 3 /* CFF Top */ +#define OpCode_Weight 4 /* CFF Top */ +#define OpCode_FontBBox 5 /* CFF Top */ +#define OpCode_BlueValues 6 /* CFF Private, CFF2 Private */ +#define OpCode_OtherBlues 7 /* CFF Private, CFF2 Private */ +#define OpCode_FamilyBlues 8 /* CFF Private, CFF2 Private */ +#define OpCode_FamilyOtherBlues 9 /* CFF Private, CFF2 Private */ +#define OpCode_StdHW 10 /* CFF Private, CFF2 Private */ +#define OpCode_StdVW 11 /* CFF Private, CFF2 Private */ +#define OpCode_escape 12 /* All. Shared with CS */ +#define OpCode_UniqueID 13 /* CFF Top */ +#define OpCode_XUID 14 /* CFF Top */ +#define OpCode_charset 15 /* CFF Top (0) */ +#define OpCode_Encoding 16 /* CFF Top (0) */ +#define OpCode_CharStrings 17 /* CFF Top, CFF2 Top */ +#define OpCode_Private 18 /* CFF Top, CFF2 FD */ +#define OpCode_Subrs 19 /* CFF Private, CFF2 Private */ +#define OpCode_defaultWidthX 20 /* CFF Private (0) */ +#define OpCode_nominalWidthX 21 /* CFF Private (0) */ +#define OpCode_vsindexdict 22 /* CFF2 Private/CS */ +#define OpCode_blenddict 23 /* CFF2 Private/CS */ +#define OpCode_vstore 24 /* CFF2 Top */ +#define OpCode_reserved25 25 +#define OpCode_reserved26 26 +#define OpCode_reserved27 27 + +/* Numbers */ +#define OpCode_shortint 28 /* 16-bit integer, All */ +#define OpCode_longintdict 29 /* 32-bit integer, All */ +#define OpCode_BCD 30 /* Real number, CFF2 Top/FD */ +#define OpCode_reserved31 31 + +/* 1-byte integers */ +#define OpCode_OneByteIntFirst 32 /* All. beginning of the range of first byte ints */ +#define OpCode_OneByteIntLast 246 /* All. ending of the range of first byte int */ + +/* 2-byte integers */ +#define OpCode_TwoBytePosInt0 247 /* All. first byte of two byte positive int (+108 to +1131) */ +#define OpCode_TwoBytePosInt1 248 +#define OpCode_TwoBytePosInt2 249 +#define OpCode_TwoBytePosInt3 250 + +#define OpCode_TwoByteNegInt0 251 /* All. first byte of two byte negative int (-1131 to -108) */ +#define OpCode_TwoByteNegInt1 252 +#define OpCode_TwoByteNegInt2 253 +#define OpCode_TwoByteNegInt3 254 + +/* Two byte escape operators 12, (0-41) */ +#define OpCode_ESC_Base 256 +#define Make_OpCode_ESC(byte2) ((op_code_t)(OpCode_ESC_Base + (byte2))) + +inline op_code_t Unmake_OpCode_ESC (op_code_t op) { return (op_code_t)(op - OpCode_ESC_Base); } +inline bool Is_OpCode_ESC (op_code_t op) { return op >= OpCode_ESC_Base; } +inline unsigned int OpCode_Size (op_code_t op) { return Is_OpCode_ESC (op) ? 2: 1; } + +#define OpCode_Copyright Make_OpCode_ESC(0) /* CFF Top */ +#define OpCode_isFixedPitch Make_OpCode_ESC(1) /* CFF Top (false) */ +#define OpCode_ItalicAngle Make_OpCode_ESC(2) /* CFF Top (0) */ +#define OpCode_UnderlinePosition Make_OpCode_ESC(3) /* CFF Top (-100) */ +#define OpCode_UnderlineThickness Make_OpCode_ESC(4) /* CFF Top (50) */ +#define OpCode_PaintType Make_OpCode_ESC(5) /* CFF Top (0) */ +#define OpCode_CharstringType Make_OpCode_ESC(6) /* CFF Top (2) */ +#define OpCode_FontMatrix Make_OpCode_ESC(7) /* CFF Top, CFF2 Top (.001 0 0 .001 0 0)*/ +#define OpCode_StrokeWidth Make_OpCode_ESC(8) /* CFF Top (0) */ +#define OpCode_BlueScale Make_OpCode_ESC(9) /* CFF Private, CFF2 Private (0.039625) */ +#define OpCode_BlueShift Make_OpCode_ESC(10) /* CFF Private, CFF2 Private (7) */ +#define OpCode_BlueFuzz Make_OpCode_ESC(11) /* CFF Private, CFF2 Private (1) */ +#define OpCode_StemSnapH Make_OpCode_ESC(12) /* CFF Private, CFF2 Private */ +#define OpCode_StemSnapV Make_OpCode_ESC(13) /* CFF Private, CFF2 Private */ +#define OpCode_ForceBold Make_OpCode_ESC(14) /* CFF Private (false) */ +#define OpCode_reservedESC15 Make_OpCode_ESC(15) +#define OpCode_reservedESC16 Make_OpCode_ESC(16) +#define OpCode_LanguageGroup Make_OpCode_ESC(17) /* CFF Private, CFF2 Private (0) */ +#define OpCode_ExpansionFactor Make_OpCode_ESC(18) /* CFF Private, CFF2 Private (0.06) */ +#define OpCode_initialRandomSeed Make_OpCode_ESC(19) /* CFF Private (0) */ +#define OpCode_SyntheticBase Make_OpCode_ESC(20) /* CFF Top */ +#define OpCode_PostScript Make_OpCode_ESC(21) /* CFF Top */ +#define OpCode_BaseFontName Make_OpCode_ESC(22) /* CFF Top */ +#define OpCode_BaseFontBlend Make_OpCode_ESC(23) /* CFF Top */ +#define OpCode_reservedESC24 Make_OpCode_ESC(24) +#define OpCode_reservedESC25 Make_OpCode_ESC(25) +#define OpCode_reservedESC26 Make_OpCode_ESC(26) +#define OpCode_reservedESC27 Make_OpCode_ESC(27) +#define OpCode_reservedESC28 Make_OpCode_ESC(28) +#define OpCode_reservedESC29 Make_OpCode_ESC(29) +#define OpCode_ROS Make_OpCode_ESC(30) /* CFF Top_CID */ +#define OpCode_CIDFontVersion Make_OpCode_ESC(31) /* CFF Top_CID (0) */ +#define OpCode_CIDFontRevision Make_OpCode_ESC(32) /* CFF Top_CID (0) */ +#define OpCode_CIDFontType Make_OpCode_ESC(33) /* CFF Top_CID (0) */ +#define OpCode_CIDCount Make_OpCode_ESC(34) /* CFF Top_CID (8720) */ +#define OpCode_UIDBase Make_OpCode_ESC(35) /* CFF Top_CID */ +#define OpCode_FDArray Make_OpCode_ESC(36) /* CFF Top_CID, CFF2 Top */ +#define OpCode_FDSelect Make_OpCode_ESC(37) /* CFF Top_CID, CFF2 Top */ +#define OpCode_FontName Make_OpCode_ESC(38) /* CFF Top_CID */ + + +/* === CharString operators === */ + +#define OpCode_hstem 1 /* CFF, CFF2 */ +#define OpCode_Reserved2 2 +#define OpCode_vstem 3 /* CFF, CFF2 */ +#define OpCode_vmoveto 4 /* CFF, CFF2 */ +#define OpCode_rlineto 5 /* CFF, CFF2 */ +#define OpCode_hlineto 6 /* CFF, CFF2 */ +#define OpCode_vlineto 7 /* CFF, CFF2 */ +#define OpCode_rrcurveto 8 /* CFF, CFF2 */ +#define OpCode_Reserved9 9 +#define OpCode_callsubr 10 /* CFF, CFF2 */ +#define OpCode_return 11 /* CFF */ +//#define OpCode_escape 12 /* CFF, CFF2 */ +#define OpCode_Reserved13 13 +#define OpCode_endchar 14 /* CFF */ +#define OpCode_vsindexcs 15 /* CFF2 */ +#define OpCode_blendcs 16 /* CFF2 */ +#define OpCode_Reserved17 17 +#define OpCode_hstemhm 18 /* CFF, CFF2 */ +#define OpCode_hintmask 19 /* CFF, CFF2 */ +#define OpCode_cntrmask 20 /* CFF, CFF2 */ +#define OpCode_rmoveto 21 /* CFF, CFF2 */ +#define OpCode_hmoveto 22 /* CFF, CFF2 */ +#define OpCode_vstemhm 23 /* CFF, CFF2 */ +#define OpCode_rcurveline 24 /* CFF, CFF2 */ +#define OpCode_rlinecurve 25 /* CFF, CFF2 */ +#define OpCode_vvcurveto 26 /* CFF, CFF2 */ +#define OpCode_hhcurveto 27 /* CFF, CFF2 */ +//#define OpCode_shortint 28 /* CFF, CFF2 */ +#define OpCode_callgsubr 29 /* CFF, CFF2 */ +#define OpCode_vhcurveto 30 /* CFF, CFF2 */ +#define OpCode_hvcurveto 31 /* CFF, CFF2 */ + +#define OpCode_fixedcs 255 /* 32-bit fixed */ + +/* Two byte escape operators 12, (0-41) */ +#define OpCode_dotsection Make_OpCode_ESC(0) /* CFF (obsoleted) */ +#define OpCode_ReservedESC1 Make_OpCode_ESC(1) +#define OpCode_ReservedESC2 Make_OpCode_ESC(2) +#define OpCode_and Make_OpCode_ESC(3) /* CFF */ +#define OpCode_or Make_OpCode_ESC(4) /* CFF */ +#define OpCode_not Make_OpCode_ESC(5) /* CFF */ +#define OpCode_ReservedESC6 Make_OpCode_ESC(6) +#define OpCode_ReservedESC7 Make_OpCode_ESC(7) +#define OpCode_ReservedESC8 Make_OpCode_ESC(8) +#define OpCode_abs Make_OpCode_ESC(9) /* CFF */ +#define OpCode_add Make_OpCode_ESC(10) /* CFF */ +#define OpCode_sub Make_OpCode_ESC(11) /* CFF */ +#define OpCode_div Make_OpCode_ESC(12) /* CFF */ +#define OpCode_ReservedESC13 Make_OpCode_ESC(13) +#define OpCode_neg Make_OpCode_ESC(14) /* CFF */ +#define OpCode_eq Make_OpCode_ESC(15) /* CFF */ +#define OpCode_ReservedESC16 Make_OpCode_ESC(16) +#define OpCode_ReservedESC17 Make_OpCode_ESC(17) +#define OpCode_drop Make_OpCode_ESC(18) /* CFF */ +#define OpCode_ReservedESC19 Make_OpCode_ESC(19) +#define OpCode_put Make_OpCode_ESC(20) /* CFF */ +#define OpCode_get Make_OpCode_ESC(21) /* CFF */ +#define OpCode_ifelse Make_OpCode_ESC(22) /* CFF */ +#define OpCode_random Make_OpCode_ESC(23) /* CFF */ +#define OpCode_mul Make_OpCode_ESC(24) /* CFF */ +//#define OpCode_reservedESC25 Make_OpCode_ESC(25) +#define OpCode_sqrt Make_OpCode_ESC(26) /* CFF */ +#define OpCode_dup Make_OpCode_ESC(27) /* CFF */ +#define OpCode_exch Make_OpCode_ESC(28) /* CFF */ +#define OpCode_index Make_OpCode_ESC(29) /* CFF */ +#define OpCode_roll Make_OpCode_ESC(30) /* CFF */ +#define OpCode_reservedESC31 Make_OpCode_ESC(31) +#define OpCode_reservedESC32 Make_OpCode_ESC(32) +#define OpCode_reservedESC33 Make_OpCode_ESC(33) +#define OpCode_hflex Make_OpCode_ESC(34) /* CFF, CFF2 */ +#define OpCode_flex Make_OpCode_ESC(35) /* CFF, CFF2 */ +#define OpCode_hflex1 Make_OpCode_ESC(36) /* CFF, CFF2 */ +#define OpCode_flex1 Make_OpCode_ESC(37) /* CFF, CFF2 */ + + +#define OpCode_Invalid 0xFFFFu + + +struct number_t +{ + void init () { set_real (0.0); } + void fini () {} + + void set_int (int v) { value = (double) v; } + int to_int () const { return (int) value; } + + void set_fixed (int32_t v) { value = v / 65536.0; } + int32_t to_fixed () const { return (int32_t) (value * 65536.0); } + + void set_real (double v) { value = v; } + double to_real () const { return value; } + + int ceil () const { return (int) ::ceil (value); } + int floor () const { return (int) ::floor (value); } + + bool in_int_range () const + { return ((double) (int16_t) to_int () == value); } + + bool operator > (const number_t &n) const + { return value > n.to_real (); } + + bool operator < (const number_t &n) const + { return n > *this; } + + bool operator >= (const number_t &n) const + { return !(*this < n); } + + bool operator <= (const number_t &n) const + { return !(*this > n); } + + const number_t &operator += (const number_t &n) + { + set_real (to_real () + n.to_real ()); + + return *this; + } + + protected: + double value; +}; + +/* byte string */ +struct UnsizedByteStr : UnsizedArrayOf +{ + // encode 2-byte int (Dict/CharString) or 4-byte int (Dict) + template + static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, int value) + { + TRACE_SERIALIZE (this); + + if (unlikely ((value < minVal || value > maxVal))) + return_trace (false); + + HBUINT8 *p = c->allocate_size (1); + if (unlikely (p == nullptr)) return_trace (false); + p->set (intOp); + + INTTYPE *ip = c->allocate_size (INTTYPE::static_size); + if (unlikely (ip == nullptr)) return_trace (false); + ip->set ((unsigned int)value); + + return_trace (true); + } + + static bool serialize_int4 (hb_serialize_context_t *c, int value) + { return serialize_int (c, OpCode_longintdict, value); } + + static bool serialize_int2 (hb_serialize_context_t *c, int value) + { return serialize_int (c, OpCode_shortint, value); } + + /* Defining null_size allows a Null object may be created. Should be safe because: + * A descendent struct Dict uses a Null pointer to indicate a missing table, + * checked before access. + * byte_str_t, a wrapper struct pairing a byte pointer along with its length, always + * checks the length before access. A Null pointer is used as the initial pointer + * along with zero length by the default ctor. + */ + DEFINE_SIZE_MIN(0); +}; + +/* Holder of a section of byte string within a CFFIndex entry */ +struct byte_str_t : hb_ubytes_t +{ + byte_str_t () + : hb_ubytes_t () {} + byte_str_t (const UnsizedByteStr& s, unsigned int l) + : hb_ubytes_t ((const unsigned char*)&s, l) {} + byte_str_t (const unsigned char *s, unsigned int l) + : hb_ubytes_t (s, l) {} + byte_str_t (const hb_ubytes_t &ub) /* conversion from hb_ubytes_t */ + : hb_ubytes_t (ub) {} + + /* sub-string */ + byte_str_t sub_str (unsigned int offset, unsigned int len_) const + { return byte_str_t (hb_ubytes_t::sub_array (offset, len_)); } + + bool check_limit (unsigned int offset, unsigned int count) const + { return (offset + count <= length); } +}; + +/* A byte string associated with the current offset and an error condition */ +struct byte_str_ref_t +{ + byte_str_ref_t () + { init (); } + + void init () + { + str = byte_str_t (); + offset = 0; + error = false; + } + + void fini () {} + + byte_str_ref_t (const byte_str_t &str_, unsigned int offset_ = 0) + : str (str_), offset (offset_), error (false) {} + + void reset (const byte_str_t &str_, unsigned int offset_ = 0) + { + str = str_; + offset = offset_; + error = false; + } + + const unsigned char& operator [] (int i) { + if (unlikely ((unsigned int)(offset + i) >= str.length)) + { + set_error (); + return Null(unsigned char); + } + else + return str[offset + i]; + } + + /* Conversion to byte_str_t */ + operator byte_str_t () const { return str.sub_str (offset, str.length - offset); } + + byte_str_t sub_str (unsigned int offset_, unsigned int len_) const + { return str.sub_str (offset_, len_); } + + bool avail (unsigned int count=1) const + { + return (!in_error () && str.check_limit (offset, count)); + } + void inc (unsigned int count=1) + { + if (likely (!in_error () && (offset <= str.length) && (offset + count <= str.length))) + { + offset += count; + } + else + { + offset = str.length; + set_error (); + } + } + + void set_error () { error = true; } + bool in_error () const { return error; } + + byte_str_t str; + unsigned int offset; /* beginning of the sub-string within str */ + + protected: + bool error; +}; + +typedef hb_vector_t byte_str_array_t; + +/* stack */ +template +struct stack_t +{ + void init () + { + error = false; + count = 0; + elements.init (); + elements.resize (kSizeLimit); + for (unsigned int i = 0; i < elements.length; i++) + elements[i].init (); + } + + void fini () + { + elements.fini_deep (); + } + + ELEM& operator [] (unsigned int i) + { + if (unlikely (i >= count)) set_error (); + return elements[i]; + } + + void push (const ELEM &v) + { + if (likely (count < elements.length)) + elements[count++] = v; + else + set_error (); + } + + ELEM &push () + { + if (likely (count < elements.length)) + return elements[count++]; + else + { + set_error (); + return Crap(ELEM); + } + } + + ELEM& pop () + { + if (likely (count > 0)) + return elements[--count]; + else + { + set_error (); + return Crap(ELEM); + } + } + + void pop (unsigned int n) + { + if (likely (count >= n)) + count -= n; + else + set_error (); + } + + const ELEM& peek () + { + if (likely (count > 0)) + return elements[count-1]; + else + { + set_error (); + return Null(ELEM); + } + } + + void unpop () + { + if (likely (count < elements.length)) + count++; + else + set_error (); + } + + void clear () { count = 0; } + + bool in_error () const { return (error || elements.in_error ()); } + void set_error () { error = true; } + + unsigned int get_count () const { return count; } + bool is_empty () const { return count == 0; } + + static constexpr unsigned kSizeLimit = LIMIT; + + protected: + bool error; + unsigned int count; + hb_vector_t elements; +}; + +/* argument stack */ +template +struct arg_stack_t : stack_t +{ + void push_int (int v) + { + ARG &n = S::push (); + n.set_int (v); + } + + void push_fixed (int32_t v) + { + ARG &n = S::push (); + n.set_fixed (v); + } + + void push_real (double v) + { + ARG &n = S::push (); + n.set_real (v); + } + + ARG& pop_num () { return this->pop (); } + + int pop_int () { return this->pop ().to_int (); } + + unsigned int pop_uint () + { + int i = pop_int (); + if (unlikely (i < 0)) + { + i = 0; + S::set_error (); + } + return (unsigned)i; + } + + void push_longint_from_substr (byte_str_ref_t& str_ref) + { + push_int ((str_ref[0] << 24) | (str_ref[1] << 16) | (str_ref[2] << 8) | (str_ref[3])); + str_ref.inc (4); + } + + bool push_fixed_from_substr (byte_str_ref_t& str_ref) + { + if (unlikely (!str_ref.avail (4))) + return false; + push_fixed ((int32_t)*(const HBUINT32*)&str_ref[0]); + str_ref.inc (4); + return true; + } + + hb_array_t get_subarray (unsigned int start) const + { + return S::elements.sub_array (start); + } + + private: + typedef stack_t S; +}; + +/* an operator prefixed by its operands in a byte string */ +struct op_str_t +{ + void init () {} + void fini () {} + + op_code_t op; + byte_str_t str; +}; + +/* base of OP_SERIALIZER */ +struct op_serializer_t +{ + protected: + bool copy_opstr (hb_serialize_context_t *c, const op_str_t& opstr) const + { + TRACE_SERIALIZE (this); + + HBUINT8 *d = c->allocate_size (opstr.str.length); + if (unlikely (d == nullptr)) return_trace (false); + memcpy (d, &opstr.str[0], opstr.str.length); + return_trace (true); + } +}; + +template +struct parsed_values_t +{ + void init () + { + opStart = 0; + values.init (); + } + void fini () { values.fini_deep (); } + + void add_op (op_code_t op, const byte_str_ref_t& str_ref = byte_str_ref_t ()) + { + VAL *val = values.push (); + val->op = op; + val->str = str_ref.str.sub_str (opStart, str_ref.offset - opStart); + opStart = str_ref.offset; + } + + void add_op (op_code_t op, const byte_str_ref_t& str_ref, const VAL &v) + { + VAL *val = values.push (v); + val->op = op; + val->str = str_ref.sub_str ( opStart, str_ref.offset - opStart); + opStart = str_ref.offset; + } + + bool has_op (op_code_t op) const + { + for (unsigned int i = 0; i < get_count (); i++) + if (get_value (i).op == op) return true; + return false; + } + + unsigned get_count () const { return values.length; } + const VAL &get_value (unsigned int i) const { return values[i]; } + const VAL &operator [] (unsigned int i) const { return get_value (i); } + + unsigned int opStart; + hb_vector_t values; +}; + +template +struct interp_env_t +{ + void init (const byte_str_t &str_) + { + str_ref.reset (str_); + argStack.init (); + error = false; + } + void fini () { argStack.fini (); } + + bool in_error () const + { return error || str_ref.in_error () || argStack.in_error (); } + + void set_error () { error = true; } + + op_code_t fetch_op () + { + op_code_t op = OpCode_Invalid; + if (unlikely (!str_ref.avail ())) + return OpCode_Invalid; + op = (op_code_t)(unsigned char)str_ref[0]; + if (op == OpCode_escape) { + if (unlikely (!str_ref.avail ())) + return OpCode_Invalid; + op = Make_OpCode_ESC(str_ref[1]); + str_ref.inc (); + } + str_ref.inc (); + return op; + } + + const ARG& eval_arg (unsigned int i) + { + return argStack[i]; + } + + ARG& pop_arg () + { + return argStack.pop (); + } + + void pop_n_args (unsigned int n) + { + argStack.pop (n); + } + + void clear_args () + { + pop_n_args (argStack.get_count ()); + } + + byte_str_ref_t str_ref; + arg_stack_t argStack; + protected: + bool error; +}; + +typedef interp_env_t<> num_interp_env_t; + +template +struct opset_t +{ + static void process_op (op_code_t op, interp_env_t& env) + { + switch (op) { + case OpCode_shortint: + env.argStack.push_int ((int16_t)((env.str_ref[0] << 8) | env.str_ref[1])); + env.str_ref.inc (2); + break; + + case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1: + case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3: + env.argStack.push_int ((int16_t)((op - OpCode_TwoBytePosInt0) * 256 + env.str_ref[0] + 108)); + env.str_ref.inc (); + break; + + case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1: + case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3: + env.argStack.push_int ((int16_t)(-(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108)); + env.str_ref.inc (); + break; + + default: + /* 1-byte integer */ + if (likely ((OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast))) + { + env.argStack.push_int ((int)op - 139); + } else { + /* invalid unknown operator */ + env.clear_args (); + env.set_error (); + } + break; + } + } +}; + +template +struct interpreter_t { + + ~interpreter_t() { fini (); } + + void fini () { env.fini (); } + + ENV env; +}; + +} /* namespace CFF */ + +#endif /* HB_CFF_INTERP_COMMON_HH */ diff --git a/src/hb-cff-interp-cs-common.hh b/src/hb-cff-interp-cs-common.hh new file mode 100644 index 0000000..283bdf1 --- /dev/null +++ b/src/hb-cff-interp-cs-common.hh @@ -0,0 +1,905 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ +#ifndef HB_CFF_INTERP_CS_COMMON_HH +#define HB_CFF_INTERP_CS_COMMON_HH + +#include "hb.hh" +#include "hb-cff-interp-common.hh" + +namespace CFF { + +using namespace OT; + +enum cs_type_t { + CSType_CharString, + CSType_GlobalSubr, + CSType_LocalSubr +}; + +struct call_context_t +{ + void init (const byte_str_ref_t substr_=byte_str_ref_t (), cs_type_t type_=CSType_CharString, unsigned int subr_num_=0) + { + str_ref = substr_; + type = type_; + subr_num = subr_num_; + } + + void fini () {} + + byte_str_ref_t str_ref; + cs_type_t type; + unsigned int subr_num; +}; + +/* call stack */ +const unsigned int kMaxCallLimit = 10; +struct call_stack_t : stack_t {}; + +template +struct biased_subrs_t +{ + void init (const SUBRS &subrs_) + { + subrs = &subrs_; + unsigned int nSubrs = get_count (); + if (nSubrs < 1240) + bias = 107; + else if (nSubrs < 33900) + bias = 1131; + else + bias = 32768; + } + + void fini () {} + + unsigned int get_count () const { return (subrs == nullptr)? 0: subrs->count; } + unsigned int get_bias () const { return bias; } + + byte_str_t operator [] (unsigned int index) const + { + if (unlikely ((subrs == nullptr) || index >= subrs->count)) + return Null(byte_str_t); + else + return (*subrs)[index]; + } + + protected: + unsigned int bias; + const SUBRS *subrs; +}; + +struct point_t +{ + void init () + { + x.init (); + y.init (); + } + + void set_int (int _x, int _y) + { + x.set_int (_x); + y.set_int (_y); + } + + void move_x (const number_t &dx) { x += dx; } + void move_y (const number_t &dy) { y += dy; } + void move (const number_t &dx, const number_t &dy) { move_x (dx); move_y (dy); } + void move (const point_t &d) { move_x (d.x); move_y (d.y); } + + number_t x; + number_t y; +}; + +template +struct cs_interp_env_t : interp_env_t +{ + void init (const byte_str_t &str, const SUBRS &globalSubrs_, const SUBRS &localSubrs_) + { + interp_env_t::init (str); + + context.init (str, CSType_CharString); + seen_moveto = true; + seen_hintmask = false; + hstem_count = 0; + vstem_count = 0; + hintmask_size = 0; + pt.init (); + callStack.init (); + globalSubrs.init (globalSubrs_); + localSubrs.init (localSubrs_); + } + void fini () + { + interp_env_t::fini (); + + callStack.fini (); + globalSubrs.fini (); + localSubrs.fini (); + } + + bool in_error () const + { + return callStack.in_error () || SUPER::in_error (); + } + + bool popSubrNum (const biased_subrs_t& biasedSubrs, unsigned int &subr_num) + { + int n = SUPER::argStack.pop_int (); + n += biasedSubrs.get_bias (); + if (unlikely ((n < 0) || ((unsigned int)n >= biasedSubrs.get_count ()))) + return false; + + subr_num = (unsigned int)n; + return true; + } + + void callSubr (const biased_subrs_t& biasedSubrs, cs_type_t type) + { + unsigned int subr_num; + + if (unlikely (!popSubrNum (biasedSubrs, subr_num) + || callStack.get_count () >= kMaxCallLimit)) + { + SUPER::set_error (); + return; + } + context.str_ref = SUPER::str_ref; + callStack.push (context); + + context.init ( biasedSubrs[subr_num], type, subr_num); + SUPER::str_ref = context.str_ref; + } + + void returnFromSubr () + { + if (unlikely (SUPER::str_ref.in_error ())) + SUPER::set_error (); + context = callStack.pop (); + SUPER::str_ref = context.str_ref; + } + + void determine_hintmask_size () + { + if (!seen_hintmask) + { + vstem_count += SUPER::argStack.get_count() / 2; + hintmask_size = (hstem_count + vstem_count + 7) >> 3; + seen_hintmask = true; + } + } + + void set_endchar (bool endchar_flag_) { endchar_flag = endchar_flag_; } + bool is_endchar () const { return endchar_flag; } + + const number_t &get_x () const { return pt.x; } + const number_t &get_y () const { return pt.y; } + const point_t &get_pt () const { return pt; } + + void moveto (const point_t &pt_ ) { pt = pt_; } + + public: + call_context_t context; + bool endchar_flag; + bool seen_moveto; + bool seen_hintmask; + + unsigned int hstem_count; + unsigned int vstem_count; + unsigned int hintmask_size; + call_stack_t callStack; + biased_subrs_t globalSubrs; + biased_subrs_t localSubrs; + + private: + point_t pt; + + typedef interp_env_t SUPER; +}; + +template +struct path_procs_null_t +{ + static void rmoveto (ENV &env, PARAM& param) {} + static void hmoveto (ENV &env, PARAM& param) {} + static void vmoveto (ENV &env, PARAM& param) {} + static void rlineto (ENV &env, PARAM& param) {} + static void hlineto (ENV &env, PARAM& param) {} + static void vlineto (ENV &env, PARAM& param) {} + static void rrcurveto (ENV &env, PARAM& param) {} + static void rcurveline (ENV &env, PARAM& param) {} + static void rlinecurve (ENV &env, PARAM& param) {} + static void vvcurveto (ENV &env, PARAM& param) {} + static void hhcurveto (ENV &env, PARAM& param) {} + static void vhcurveto (ENV &env, PARAM& param) {} + static void hvcurveto (ENV &env, PARAM& param) {} + static void moveto (ENV &env, PARAM& param, const point_t &pt) {} + static void line (ENV &env, PARAM& param, const point_t &pt1) {} + static void curve (ENV &env, PARAM& param, const point_t &pt1, const point_t &pt2, const point_t &pt3) {} + static void hflex (ENV &env, PARAM& param) {} + static void flex (ENV &env, PARAM& param) {} + static void hflex1 (ENV &env, PARAM& param) {} + static void flex1 (ENV &env, PARAM& param) {} +}; + +template > +struct cs_opset_t : opset_t +{ + static void process_op (op_code_t op, ENV &env, PARAM& param) + { + switch (op) { + + case OpCode_return: + env.returnFromSubr (); + break; + case OpCode_endchar: + OPSET::check_width (op, env, param); + env.set_endchar (true); + OPSET::flush_args_and_op (op, env, param); + break; + + case OpCode_fixedcs: + env.argStack.push_fixed_from_substr (env.str_ref); + break; + + case OpCode_callsubr: + env.callSubr (env.localSubrs, CSType_LocalSubr); + break; + + case OpCode_callgsubr: + env.callSubr (env.globalSubrs, CSType_GlobalSubr); + break; + + case OpCode_hstem: + case OpCode_hstemhm: + OPSET::check_width (op, env, param); + OPSET::process_hstem (op, env, param); + break; + case OpCode_vstem: + case OpCode_vstemhm: + OPSET::check_width (op, env, param); + OPSET::process_vstem (op, env, param); + break; + case OpCode_hintmask: + case OpCode_cntrmask: + OPSET::check_width (op, env, param); + OPSET::process_hintmask (op, env, param); + break; + case OpCode_rmoveto: + OPSET::check_width (op, env, param); + PATH::rmoveto (env, param); + OPSET::process_post_move (op, env, param); + break; + case OpCode_hmoveto: + OPSET::check_width (op, env, param); + PATH::hmoveto (env, param); + OPSET::process_post_move (op, env, param); + break; + case OpCode_vmoveto: + OPSET::check_width (op, env, param); + PATH::vmoveto (env, param); + OPSET::process_post_move (op, env, param); + break; + case OpCode_rlineto: + PATH::rlineto (env, param); + process_post_path (op, env, param); + break; + case OpCode_hlineto: + PATH::hlineto (env, param); + process_post_path (op, env, param); + break; + case OpCode_vlineto: + PATH::vlineto (env, param); + process_post_path (op, env, param); + break; + case OpCode_rrcurveto: + PATH::rrcurveto (env, param); + process_post_path (op, env, param); + break; + case OpCode_rcurveline: + PATH::rcurveline (env, param); + process_post_path (op, env, param); + break; + case OpCode_rlinecurve: + PATH::rlinecurve (env, param); + process_post_path (op, env, param); + break; + case OpCode_vvcurveto: + PATH::vvcurveto (env, param); + process_post_path (op, env, param); + break; + case OpCode_hhcurveto: + PATH::hhcurveto (env, param); + process_post_path (op, env, param); + break; + case OpCode_vhcurveto: + PATH::vhcurveto (env, param); + process_post_path (op, env, param); + break; + case OpCode_hvcurveto: + PATH::hvcurveto (env, param); + process_post_path (op, env, param); + break; + + case OpCode_hflex: + PATH::hflex (env, param); + OPSET::process_post_flex (op, env, param); + break; + + case OpCode_flex: + PATH::flex (env, param); + OPSET::process_post_flex (op, env, param); + break; + + case OpCode_hflex1: + PATH::hflex1 (env, param); + OPSET::process_post_flex (op, env, param); + break; + + case OpCode_flex1: + PATH::flex1 (env, param); + OPSET::process_post_flex (op, env, param); + break; + + default: + SUPER::process_op (op, env); + break; + } + } + + static void process_hstem (op_code_t op, ENV &env, PARAM& param) + { + env.hstem_count += env.argStack.get_count () / 2; + OPSET::flush_args_and_op (op, env, param); + } + + static void process_vstem (op_code_t op, ENV &env, PARAM& param) + { + env.vstem_count += env.argStack.get_count () / 2; + OPSET::flush_args_and_op (op, env, param); + } + + static void process_hintmask (op_code_t op, ENV &env, PARAM& param) + { + env.determine_hintmask_size (); + if (likely (env.str_ref.avail (env.hintmask_size))) + { + OPSET::flush_hintmask (op, env, param); + env.str_ref.inc (env.hintmask_size); + } + } + + static void process_post_flex (op_code_t op, ENV &env, PARAM& param) + { + OPSET::flush_args_and_op (op, env, param); + } + + static void check_width (op_code_t op, ENV &env, PARAM& param) + {} + + static void process_post_move (op_code_t op, ENV &env, PARAM& param) + { + if (!env.seen_moveto) + { + env.determine_hintmask_size (); + env.seen_moveto = true; + } + OPSET::flush_args_and_op (op, env, param); + } + + static void process_post_path (op_code_t op, ENV &env, PARAM& param) + { + OPSET::flush_args_and_op (op, env, param); + } + + static void flush_args_and_op (op_code_t op, ENV &env, PARAM& param) + { + OPSET::flush_args (env, param); + OPSET::flush_op (op, env, param); + } + + static void flush_args (ENV &env, PARAM& param) + { + env.pop_n_args (env.argStack.get_count ()); + } + + static void flush_op (op_code_t op, ENV &env, PARAM& param) + { + } + + static void flush_hintmask (op_code_t op, ENV &env, PARAM& param) + { + OPSET::flush_args_and_op (op, env, param); + } + + static bool is_number_op (op_code_t op) + { + switch (op) + { + case OpCode_shortint: + case OpCode_fixedcs: + case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1: + case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3: + case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1: + case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3: + return true; + + default: + /* 1-byte integer */ + return (OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast); + } + } + + protected: + typedef opset_t SUPER; +}; + +template +struct path_procs_t +{ + static void rmoveto (ENV &env, PARAM& param) + { + point_t pt1 = env.get_pt (); + const number_t &dy = env.pop_arg (); + const number_t &dx = env.pop_arg (); + pt1.move (dx, dy); + PATH::moveto (env, param, pt1); + } + + static void hmoveto (ENV &env, PARAM& param) + { + point_t pt1 = env.get_pt (); + pt1.move_x (env.pop_arg ()); + PATH::moveto (env, param, pt1); + } + + static void vmoveto (ENV &env, PARAM& param) + { + point_t pt1 = env.get_pt (); + pt1.move_y (env.pop_arg ()); + PATH::moveto (env, param, pt1); + } + + static void rlineto (ENV &env, PARAM& param) + { + for (unsigned int i = 0; i + 2 <= env.argStack.get_count (); i += 2) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + PATH::line (env, param, pt1); + } + } + + static void hlineto (ENV &env, PARAM& param) + { + point_t pt1; + unsigned int i = 0; + for (; i + 2 <= env.argStack.get_count (); i += 2) + { + pt1 = env.get_pt (); + pt1.move_x (env.eval_arg (i)); + PATH::line (env, param, pt1); + pt1.move_y (env.eval_arg (i+1)); + PATH::line (env, param, pt1); + } + if (i < env.argStack.get_count ()) + { + pt1 = env.get_pt (); + pt1.move_x (env.eval_arg (i)); + PATH::line (env, param, pt1); + } + } + + static void vlineto (ENV &env, PARAM& param) + { + point_t pt1; + unsigned int i = 0; + for (; i + 2 <= env.argStack.get_count (); i += 2) + { + pt1 = env.get_pt (); + pt1.move_y (env.eval_arg (i)); + PATH::line (env, param, pt1); + pt1.move_x (env.eval_arg (i+1)); + PATH::line (env, param, pt1); + } + if (i < env.argStack.get_count ()) + { + pt1 = env.get_pt (); + pt1.move_y (env.eval_arg (i)); + PATH::line (env, param, pt1); + } + } + + static void rrcurveto (ENV &env, PARAM& param) + { + for (unsigned int i = 0; i + 6 <= env.argStack.get_count (); i += 6) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+2), env.eval_arg (i+3)); + point_t pt3 = pt2; + pt3.move (env.eval_arg (i+4), env.eval_arg (i+5)); + PATH::curve (env, param, pt1, pt2, pt3); + } + } + + static void rcurveline (ENV &env, PARAM& param) + { + unsigned int i = 0; + for (; i + 6 <= env.argStack.get_count (); i += 6) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+2), env.eval_arg (i+3)); + point_t pt3 = pt2; + pt3.move (env.eval_arg (i+4), env.eval_arg (i+5)); + PATH::curve (env, param, pt1, pt2, pt3); + } + for (; i + 2 <= env.argStack.get_count (); i += 2) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + PATH::line (env, param, pt1); + } + } + + static void rlinecurve (ENV &env, PARAM& param) + { + unsigned int i = 0; + unsigned int line_limit = (env.argStack.get_count () % 6); + for (; i + 2 <= line_limit; i += 2) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + PATH::line (env, param, pt1); + } + for (; i + 6 <= env.argStack.get_count (); i += 6) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (i), env.eval_arg (i+1)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+2), env.eval_arg (i+3)); + point_t pt3 = pt2; + pt3.move (env.eval_arg (i+4), env.eval_arg (i+5)); + PATH::curve (env, param, pt1, pt2, pt3); + } + } + + static void vvcurveto (ENV &env, PARAM& param) + { + unsigned int i = 0; + point_t pt1 = env.get_pt (); + if ((env.argStack.get_count () & 1) != 0) + pt1.move_x (env.eval_arg (i++)); + for (; i + 4 <= env.argStack.get_count (); i += 4) + { + pt1.move_y (env.eval_arg (i)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + point_t pt3 = pt2; + pt3.move_y (env.eval_arg (i+3)); + PATH::curve (env, param, pt1, pt2, pt3); + pt1 = env.get_pt (); + } + } + + static void hhcurveto (ENV &env, PARAM& param) + { + unsigned int i = 0; + point_t pt1 = env.get_pt (); + if ((env.argStack.get_count () & 1) != 0) + pt1.move_y (env.eval_arg (i++)); + for (; i + 4 <= env.argStack.get_count (); i += 4) + { + pt1.move_x (env.eval_arg (i)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + point_t pt3 = pt2; + pt3.move_x (env.eval_arg (i+3)); + PATH::curve (env, param, pt1, pt2, pt3); + pt1 = env.get_pt (); + } + } + + static void vhcurveto (ENV &env, PARAM& param) + { + point_t pt1, pt2, pt3; + unsigned int i = 0; + if ((env.argStack.get_count () % 8) >= 4) + { + point_t pt1 = env.get_pt (); + pt1.move_y (env.eval_arg (i)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + point_t pt3 = pt2; + pt3.move_x (env.eval_arg (i+3)); + i += 4; + + for (; i + 8 <= env.argStack.get_count (); i += 8) + { + PATH::curve (env, param, pt1, pt2, pt3); + pt1 = env.get_pt (); + pt1.move_x (env.eval_arg (i)); + pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + pt3 = pt2; + pt3.move_y (env.eval_arg (i+3)); + PATH::curve (env, param, pt1, pt2, pt3); + + pt1 = pt3; + pt1.move_y (env.eval_arg (i+4)); + pt2 = pt1; + pt2.move (env.eval_arg (i+5), env.eval_arg (i+6)); + pt3 = pt2; + pt3.move_x (env.eval_arg (i+7)); + } + if (i < env.argStack.get_count ()) + pt3.move_y (env.eval_arg (i)); + PATH::curve (env, param, pt1, pt2, pt3); + } + else + { + for (; i + 8 <= env.argStack.get_count (); i += 8) + { + pt1 = env.get_pt (); + pt1.move_y (env.eval_arg (i)); + pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + pt3 = pt2; + pt3.move_x (env.eval_arg (i+3)); + PATH::curve (env, param, pt1, pt2, pt3); + + pt1 = pt3; + pt1.move_x (env.eval_arg (i+4)); + pt2 = pt1; + pt2.move (env.eval_arg (i+5), env.eval_arg (i+6)); + pt3 = pt2; + pt3.move_y (env.eval_arg (i+7)); + if ((env.argStack.get_count () - i < 16) && ((env.argStack.get_count () & 1) != 0)) + pt3.move_x (env.eval_arg (i+8)); + PATH::curve (env, param, pt1, pt2, pt3); + } + } + } + + static void hvcurveto (ENV &env, PARAM& param) + { + point_t pt1, pt2, pt3; + unsigned int i = 0; + if ((env.argStack.get_count () % 8) >= 4) + { + point_t pt1 = env.get_pt (); + pt1.move_x (env.eval_arg (i)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + point_t pt3 = pt2; + pt3.move_y (env.eval_arg (i+3)); + i += 4; + + for (; i + 8 <= env.argStack.get_count (); i += 8) + { + PATH::curve (env, param, pt1, pt2, pt3); + pt1 = env.get_pt (); + pt1.move_y (env.eval_arg (i)); + pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + pt3 = pt2; + pt3.move_x (env.eval_arg (i+3)); + PATH::curve (env, param, pt1, pt2, pt3); + + pt1 = pt3; + pt1.move_x (env.eval_arg (i+4)); + pt2 = pt1; + pt2.move (env.eval_arg (i+5), env.eval_arg (i+6)); + pt3 = pt2; + pt3.move_y (env.eval_arg (i+7)); + } + if (i < env.argStack.get_count ()) + pt3.move_x (env.eval_arg (i)); + PATH::curve (env, param, pt1, pt2, pt3); + } + else + { + for (; i + 8 <= env.argStack.get_count (); i += 8) + { + pt1 = env.get_pt (); + pt1.move_x (env.eval_arg (i)); + pt2 = pt1; + pt2.move (env.eval_arg (i+1), env.eval_arg (i+2)); + pt3 = pt2; + pt3.move_y (env.eval_arg (i+3)); + PATH::curve (env, param, pt1, pt2, pt3); + + pt1 = pt3; + pt1.move_y (env.eval_arg (i+4)); + pt2 = pt1; + pt2.move (env.eval_arg (i+5), env.eval_arg (i+6)); + pt3 = pt2; + pt3.move_x (env.eval_arg (i+7)); + if ((env.argStack.get_count () - i < 16) && ((env.argStack.get_count () & 1) != 0)) + pt3.move_y (env.eval_arg (i+8)); + PATH::curve (env, param, pt1, pt2, pt3); + } + } + } + + /* default actions to be overridden */ + static void moveto (ENV &env, PARAM& param, const point_t &pt) + { env.moveto (pt); } + + static void line (ENV &env, PARAM& param, const point_t &pt1) + { PATH::moveto (env, param, pt1); } + + static void curve (ENV &env, PARAM& param, const point_t &pt1, const point_t &pt2, const point_t &pt3) + { PATH::moveto (env, param, pt3); } + + static void hflex (ENV &env, PARAM& param) + { + if (likely (env.argStack.get_count () == 7)) + { + point_t pt1 = env.get_pt (); + pt1.move_x (env.eval_arg (0)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (1), env.eval_arg (2)); + point_t pt3 = pt2; + pt3.move_x (env.eval_arg (3)); + point_t pt4 = pt3; + pt4.move_x (env.eval_arg (4)); + point_t pt5 = pt4; + pt5.move_x (env.eval_arg (5)); + pt5.y = pt1.y; + point_t pt6 = pt5; + pt6.move_x (env.eval_arg (6)); + + curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6); + } + else + env.set_error (); + } + + static void flex (ENV &env, PARAM& param) + { + if (likely (env.argStack.get_count () == 13)) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (0), env.eval_arg (1)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (2), env.eval_arg (3)); + point_t pt3 = pt2; + pt3.move (env.eval_arg (4), env.eval_arg (5)); + point_t pt4 = pt3; + pt4.move (env.eval_arg (6), env.eval_arg (7)); + point_t pt5 = pt4; + pt5.move (env.eval_arg (8), env.eval_arg (9)); + point_t pt6 = pt5; + pt6.move (env.eval_arg (10), env.eval_arg (11)); + + curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6); + } + else + env.set_error (); + } + + static void hflex1 (ENV &env, PARAM& param) + { + if (likely (env.argStack.get_count () == 9)) + { + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (0), env.eval_arg (1)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (2), env.eval_arg (3)); + point_t pt3 = pt2; + pt3.move_x (env.eval_arg (4)); + point_t pt4 = pt3; + pt4.move_x (env.eval_arg (5)); + point_t pt5 = pt4; + pt5.move (env.eval_arg (6), env.eval_arg (7)); + point_t pt6 = pt5; + pt6.move_x (env.eval_arg (8)); + pt6.y = env.get_pt ().y; + + curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6); + } + else + env.set_error (); + } + + static void flex1 (ENV &env, PARAM& param) + { + if (likely (env.argStack.get_count () == 11)) + { + point_t d; + d.init (); + for (unsigned int i = 0; i < 10; i += 2) + d.move (env.eval_arg (i), env.eval_arg (i+1)); + + point_t pt1 = env.get_pt (); + pt1.move (env.eval_arg (0), env.eval_arg (1)); + point_t pt2 = pt1; + pt2.move (env.eval_arg (2), env.eval_arg (3)); + point_t pt3 = pt2; + pt3.move (env.eval_arg (4), env.eval_arg (5)); + point_t pt4 = pt3; + pt4.move (env.eval_arg (6), env.eval_arg (7)); + point_t pt5 = pt4; + pt5.move (env.eval_arg (8), env.eval_arg (9)); + point_t pt6 = pt5; + + if (fabs (d.x.to_real ()) > fabs (d.y.to_real ())) + { + pt6.move_x (env.eval_arg (10)); + pt6.y = env.get_pt ().y; + } + else + { + pt6.x = env.get_pt ().x; + pt6.move_y (env.eval_arg (10)); + } + + curve2 (env, param, pt1, pt2, pt3, pt4, pt5, pt6); + } + else + env.set_error (); + } + + protected: + static void curve2 (ENV &env, PARAM& param, + const point_t &pt1, const point_t &pt2, const point_t &pt3, + const point_t &pt4, const point_t &pt5, const point_t &pt6) + { + PATH::curve (env, param, pt1, pt2, pt3); + PATH::curve (env, param, pt4, pt5, pt6); + } +}; + +template +struct cs_interpreter_t : interpreter_t +{ + bool interpret (PARAM& param) + { + SUPER::env.set_endchar (false); + + for (;;) { + OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param); + if (unlikely (SUPER::env.in_error ())) + return false; + if (SUPER::env.is_endchar ()) + break; + } + + return true; + } + + private: + typedef interpreter_t SUPER; +}; + +} /* namespace CFF */ + +#endif /* HB_CFF_INTERP_CS_COMMON_HH */ diff --git a/src/hb-cff-interp-dict-common.hh b/src/hb-cff-interp-dict-common.hh new file mode 100644 index 0000000..2c54909 --- /dev/null +++ b/src/hb-cff-interp-dict-common.hh @@ -0,0 +1,294 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ +#ifndef HB_CFF_INTERP_DICT_COMMON_HH +#define HB_CFF_INTERP_DICT_COMMON_HH + +#include "hb-cff-interp-common.hh" +#include +#include + +namespace CFF { + +using namespace OT; + +/* an opstr and the parsed out dict value(s) */ +struct dict_val_t : op_str_t +{ + void init () { single_val.set_int (0); } + void fini () {} + + number_t single_val; +}; + +typedef dict_val_t num_dict_val_t; + +template struct dict_values_t : parsed_values_t {}; + +template +struct top_dict_values_t : dict_values_t +{ + void init () + { + dict_values_t::init (); + charStringsOffset = 0; + FDArrayOffset = 0; + } + void fini () { dict_values_t::fini (); } + + unsigned int calculate_serialized_op_size (const OPSTR& opstr) const + { + switch (opstr.op) + { + case OpCode_CharStrings: + case OpCode_FDArray: + return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op); + + default: + return opstr.str.length; + } + } + + unsigned int charStringsOffset; + unsigned int FDArrayOffset; +}; + +struct dict_opset_t : opset_t +{ + static void process_op (op_code_t op, interp_env_t& env) + { + switch (op) { + case OpCode_longintdict: /* 5-byte integer */ + env.argStack.push_longint_from_substr (env.str_ref); + break; + + case OpCode_BCD: /* real number */ + env.argStack.push_real (parse_bcd (env.str_ref)); + break; + + default: + opset_t::process_op (op, env); + break; + } + } + + static double parse_bcd (byte_str_ref_t& str_ref) + { + bool neg = false; + double int_part = 0; + uint64_t frac_part = 0; + uint32_t frac_count = 0; + bool exp_neg = false; + uint32_t exp_part = 0; + bool exp_overflow = false; + enum Part { INT_PART=0, FRAC_PART, EXP_PART } part = INT_PART; + enum Nibble { DECIMAL=10, EXP_POS, EXP_NEG, RESERVED, NEG, END }; + const uint64_t MAX_FRACT = 0xFFFFFFFFFFFFFull; /* 1^52-1 */ + const uint32_t MAX_EXP = 0x7FFu; /* 1^11-1 */ + + double value = 0.0; + unsigned char byte = 0; + for (uint32_t i = 0;; i++) + { + char d; + if ((i & 1) == 0) + { + if (!str_ref.avail ()) + { + str_ref.set_error (); + return 0.0; + } + byte = str_ref[0]; + str_ref.inc (); + d = byte >> 4; + } + else + d = byte & 0x0F; + + switch (d) + { + case RESERVED: + str_ref.set_error (); + return value; + + case END: + value = (double)(neg? -int_part: int_part); + if (frac_count > 0) + { + double frac = (frac_part / pow (10.0, (double)frac_count)); + if (neg) frac = -frac; + value += frac; + } + if (unlikely (exp_overflow)) + { + if (value == 0.0) + return value; + if (exp_neg) + return neg? -DBL_MIN: DBL_MIN; + else + return neg? -DBL_MAX: DBL_MAX; + } + if (exp_part != 0) + { + if (exp_neg) + value /= pow (10.0, (double)exp_part); + else + value *= pow (10.0, (double)exp_part); + } + return value; + + case NEG: + if (i != 0) + { + str_ref.set_error (); + return 0.0; + } + neg = true; + break; + + case DECIMAL: + if (part != INT_PART) + { + str_ref.set_error (); + return value; + } + part = FRAC_PART; + break; + + case EXP_NEG: + exp_neg = true; + HB_FALLTHROUGH; + + case EXP_POS: + if (part == EXP_PART) + { + str_ref.set_error (); + return value; + } + part = EXP_PART; + break; + + default: + switch (part) { + default: + case INT_PART: + int_part = (int_part * 10) + d; + break; + + case FRAC_PART: + if (likely (frac_part <= MAX_FRACT / 10)) + { + frac_part = (frac_part * 10) + (unsigned)d; + frac_count++; + } + break; + + case EXP_PART: + if (likely (exp_part * 10 + d <= MAX_EXP)) + { + exp_part = (exp_part * 10) + d; + } + else + exp_overflow = true; + break; + } + } + } + + return value; + } + + static bool is_hint_op (op_code_t op) + { + switch (op) + { + case OpCode_BlueValues: + case OpCode_OtherBlues: + case OpCode_FamilyBlues: + case OpCode_FamilyOtherBlues: + case OpCode_StemSnapH: + case OpCode_StemSnapV: + case OpCode_StdHW: + case OpCode_StdVW: + case OpCode_BlueScale: + case OpCode_BlueShift: + case OpCode_BlueFuzz: + case OpCode_ForceBold: + case OpCode_LanguageGroup: + case OpCode_ExpansionFactor: + return true; + default: + return false; + } + } +}; + +template +struct top_dict_opset_t : dict_opset_t +{ + static void process_op (op_code_t op, interp_env_t& env, top_dict_values_t & dictval) + { + switch (op) { + case OpCode_CharStrings: + dictval.charStringsOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + case OpCode_FDArray: + dictval.FDArrayOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + case OpCode_FontMatrix: + env.clear_args (); + break; + default: + dict_opset_t::process_op (op, env); + break; + } + } +}; + +template +struct dict_interpreter_t : interpreter_t +{ + bool interpret (PARAM& param) + { + param.init (); + while (SUPER::env.str_ref.avail ()) + { + OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param); + if (unlikely (SUPER::env.in_error ())) + return false; + } + + return true; + } + + private: + typedef interpreter_t SUPER; +}; + +} /* namespace CFF */ + +#endif /* HB_CFF_INTERP_DICT_COMMON_HH */ diff --git a/src/hb-cff1-interp-cs.hh b/src/hb-cff1-interp-cs.hh new file mode 100644 index 0000000..c7209ed --- /dev/null +++ b/src/hb-cff1-interp-cs.hh @@ -0,0 +1,161 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ +#ifndef HB_CFF1_INTERP_CS_HH +#define HB_CFF1_INTERP_CS_HH + +#include "hb.hh" +#include "hb-cff-interp-cs-common.hh" + +namespace CFF { + +using namespace OT; + +typedef biased_subrs_t cff1_biased_subrs_t; + +struct cff1_cs_interp_env_t : cs_interp_env_t +{ + template + void init (const byte_str_t &str, ACC &acc, unsigned int fd) + { + SUPER::init (str, *acc.globalSubrs, *acc.privateDicts[fd].localSubrs); + processed_width = false; + has_width = false; + arg_start = 0; + in_seac = false; + } + + void fini () { SUPER::fini (); } + + void set_width (bool has_width_) + { + if (likely (!processed_width && (SUPER::argStack.get_count () > 0))) + { + if (has_width_) + { + width = SUPER::argStack[0]; + has_width = true; + arg_start = 1; + } + } + processed_width = true; + } + + void clear_args () + { + arg_start = 0; + SUPER::clear_args (); + } + + void set_in_seac (bool _in_seac) { in_seac = _in_seac; } + + bool processed_width; + bool has_width; + unsigned int arg_start; + number_t width; + bool in_seac; + + private: + typedef cs_interp_env_t SUPER; +}; + +template > +struct cff1_cs_opset_t : cs_opset_t +{ + /* PostScript-originated legacy opcodes (OpCode_add etc) are unsupported */ + /* Type 1-originated deprecated opcodes, seac behavior of endchar and dotsection are supported */ + + static void process_op (op_code_t op, cff1_cs_interp_env_t &env, PARAM& param) + { + switch (op) { + case OpCode_dotsection: + SUPER::flush_args_and_op (op, env, param); + break; + + case OpCode_endchar: + OPSET::check_width (op, env, param); + if (env.argStack.get_count () >= 4) + { + OPSET::process_seac (env, param); + } + OPSET::flush_args_and_op (op, env, param); + env.set_endchar (true); + break; + + default: + SUPER::process_op (op, env, param); + } + } + + static void check_width (op_code_t op, cff1_cs_interp_env_t &env, PARAM& param) + { + if (!env.processed_width) + { + bool has_width = false; + switch (op) + { + case OpCode_endchar: + case OpCode_hstem: + case OpCode_hstemhm: + case OpCode_vstem: + case OpCode_vstemhm: + case OpCode_hintmask: + case OpCode_cntrmask: + has_width = ((env.argStack.get_count () & 1) != 0); + break; + case OpCode_hmoveto: + case OpCode_vmoveto: + has_width = (env.argStack.get_count () > 1); + break; + case OpCode_rmoveto: + has_width = (env.argStack.get_count () > 2); + break; + default: + return; + } + env.set_width (has_width); + } + } + + static void process_seac (cff1_cs_interp_env_t &env, PARAM& param) + { + } + + static void flush_args (cff1_cs_interp_env_t &env, PARAM& param) + { + SUPER::flush_args (env, param); + env.clear_args (); /* pop off width */ + } + + private: + typedef cs_opset_t SUPER; +}; + +template +struct cff1_cs_interpreter_t : cs_interpreter_t {}; + +} /* namespace CFF */ + +#endif /* HB_CFF1_INTERP_CS_HH */ diff --git a/src/hb-cff2-interp-cs.hh b/src/hb-cff2-interp-cs.hh new file mode 100644 index 0000000..49e5ee7 --- /dev/null +++ b/src/hb-cff2-interp-cs.hh @@ -0,0 +1,271 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ +#ifndef HB_CFF2_INTERP_CS_HH +#define HB_CFF2_INTERP_CS_HH + +#include "hb.hh" +#include "hb-cff-interp-cs-common.hh" + +namespace CFF { + +using namespace OT; + +struct blend_arg_t : number_t +{ + void init () + { + number_t::init (); + deltas.init (); + } + + void fini () + { + number_t::fini (); + deltas.fini_deep (); + } + + void set_int (int v) { reset_blends (); number_t::set_int (v); } + void set_fixed (int32_t v) { reset_blends (); number_t::set_fixed (v); } + void set_real (double v) { reset_blends (); number_t::set_real (v); } + + void set_blends (unsigned int numValues_, unsigned int valueIndex_, + unsigned int numBlends, hb_array_t blends_) + { + numValues = numValues_; + valueIndex = valueIndex_; + deltas.resize (numBlends); + for (unsigned int i = 0; i < numBlends; i++) + deltas[i] = blends_[i]; + } + + bool blending () const { return deltas.length > 0; } + void reset_blends () + { + numValues = valueIndex = 0; + deltas.resize (0); + } + + unsigned int numValues; + unsigned int valueIndex; + hb_vector_t deltas; +}; + +typedef interp_env_t BlendInterpEnv; +typedef biased_subrs_t cff2_biased_subrs_t; + +struct cff2_cs_interp_env_t : cs_interp_env_t +{ + template + void init (const byte_str_t &str, ACC &acc, unsigned int fd, + const int *coords_=nullptr, unsigned int num_coords_=0) + { + SUPER::init (str, *acc.globalSubrs, *acc.privateDicts[fd].localSubrs); + + coords = coords_; + num_coords = num_coords_; + varStore = acc.varStore; + seen_blend = false; + seen_vsindex_ = false; + scalars.init (); + do_blend = (coords != nullptr) && num_coords && (varStore != &Null(CFF2VariationStore)); + set_ivs (acc.privateDicts[fd].ivs); + } + + void fini () + { + scalars.fini (); + SUPER::fini (); + } + + op_code_t fetch_op () + { + if (this->str_ref.avail ()) + return SUPER::fetch_op (); + + /* make up return or endchar op */ + if (this->callStack.is_empty ()) + return OpCode_endchar; + else + return OpCode_return; + } + + const blend_arg_t& eval_arg (unsigned int i) + { + blend_arg_t &arg = argStack[i]; + blend_arg (arg); + return arg; + } + + const blend_arg_t& pop_arg () + { + blend_arg_t &arg = argStack.pop (); + blend_arg (arg); + return arg; + } + + void process_blend () + { + if (!seen_blend) + { + region_count = varStore->varStore.get_region_index_count (get_ivs ()); + if (do_blend) + { + scalars.resize (region_count); + varStore->varStore.get_scalars (get_ivs (), + (int *)coords, num_coords, + &scalars[0], region_count); + } + seen_blend = true; + } + } + + void process_vsindex () + { + unsigned int index = argStack.pop_uint (); + if (unlikely (seen_vsindex () || seen_blend)) + { + set_error (); + } + else + { + set_ivs (index); + } + seen_vsindex_ = true; + } + + unsigned int get_region_count () const { return region_count; } + void set_region_count (unsigned int region_count_) { region_count = region_count_; } + unsigned int get_ivs () const { return ivs; } + void set_ivs (unsigned int ivs_) { ivs = ivs_; } + bool seen_vsindex () const { return seen_vsindex_; } + + protected: + void blend_arg (blend_arg_t &arg) + { + if (do_blend && arg.blending ()) + { + if (likely (scalars.length == arg.deltas.length)) + { + double v = arg.to_real (); + for (unsigned int i = 0; i < scalars.length; i++) + { + v += (double)scalars[i] * arg.deltas[i].to_real (); + } + arg.set_real (v); + arg.deltas.resize (0); + } + } + } + + protected: + const int *coords; + unsigned int num_coords; + const CFF2VariationStore *varStore; + unsigned int region_count; + unsigned int ivs; + hb_vector_t scalars; + bool do_blend; + bool seen_vsindex_; + bool seen_blend; + + typedef cs_interp_env_t SUPER; +}; +template > +struct cff2_cs_opset_t : cs_opset_t +{ + static void process_op (op_code_t op, cff2_cs_interp_env_t &env, PARAM& param) + { + switch (op) { + case OpCode_callsubr: + case OpCode_callgsubr: + /* a subroutine number shoudln't be a blended value */ + if (unlikely (env.argStack.peek ().blending ())) + { + env.set_error (); + break; + } + SUPER::process_op (op, env, param); + break; + + case OpCode_blendcs: + OPSET::process_blend (env, param); + break; + + case OpCode_vsindexcs: + if (unlikely (env.argStack.peek ().blending ())) + { + env.set_error (); + break; + } + OPSET::process_vsindex (env, param); + break; + + default: + SUPER::process_op (op, env, param); + } + } + + static void process_blend (cff2_cs_interp_env_t &env, PARAM& param) + { + unsigned int n, k; + + env.process_blend (); + k = env.get_region_count (); + n = env.argStack.pop_uint (); + /* copy the blend values into blend array of the default values */ + unsigned int start = env.argStack.get_count () - ((k+1) * n); + /* let an obvious error case fail, but note CFF2 spec doesn't forbid n==0 */ + if (unlikely (start > env.argStack.get_count ())) + { + env.set_error (); + return; + } + for (unsigned int i = 0; i < n; i++) + { + const hb_array_t blends = env.argStack.get_subarray (start + n + (i * k)); + env.argStack[start + i].set_blends (n, i, k, blends); + } + + /* pop off blend values leaving default values now adorned with blend values */ + env.argStack.pop (k * n); + } + + static void process_vsindex (cff2_cs_interp_env_t &env, PARAM& param) + { + env.process_vsindex (); + env.clear_args (); + } + + private: + typedef cs_opset_t SUPER; +}; + +template +struct cff2_cs_interpreter_t : cs_interpreter_t {}; + +} /* namespace CFF */ + +#endif /* HB_CFF2_INTERP_CS_HH */ diff --git a/src/hb-common.cc b/src/hb-common.cc index a67fcf8..93f5b79 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -26,10 +26,9 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" +#include "hb.hh" -#include "hb-mutex-private.hh" -#include "hb-object-private.hh" +#include "hb-machinery.hh" #include #ifdef HAVE_XLOCALE_H @@ -37,22 +36,51 @@ #endif +/** + * SECTION:hb-common + * @title: hb-common + * @short_description: Common data types + * @include: hb.h + * + * Common data types used across HarfBuzz are defined here. + **/ + + /* hb_options_t */ -hb_options_union_t _hb_options; +hb_atomic_int_t _hb_options; void -_hb_options_init (void) +_hb_options_init () { hb_options_union_t u; u.i = 0; - u.opts.initialized = 1; + u.opts.initialized = true; + + const char *c = getenv ("HB_OPTIONS"); + if (c) + { + while (*c) + { + const char *p = strchr (c, ':'); + if (!p) + p = c + strlen (c); + +#define OPTION(name, symbol) \ + if (0 == strncmp (c, name, p - c) && strlen (name) == p - c) u.opts.symbol = true; + + OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible); + OPTION ("aat", aat); + +#undef OPTION - char *c = getenv ("HB_OPTIONS"); - u.opts.uniscribe_bug_compatible = c && strstr (c, "uniscribe-bug-compatible"); + c = *p ? p + 1 : p; + } + + } /* This is idempotent and threadsafe. */ - _hb_options = u; + _hb_options.set_relaxed (u.i); } @@ -176,7 +204,7 @@ static const char canon_map[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0, 0, 0, 0, 0, 0, - '-', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, '-', 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, 0 @@ -219,11 +247,10 @@ struct hb_language_item_t { struct hb_language_item_t *next; hb_language_t lang; - inline bool operator == (const char *s) const { - return lang_equal (lang, s); - } + bool operator == (const char *s) const + { return lang_equal (lang, s); } - inline hb_language_item_t & operator = (const char *s) { + hb_language_item_t & operator = (const char *s) { /* If a custom allocated is used calling strdup() pairs badly with a call to the custom free() in fini() below. Therefore don't call strdup(), implement its behavior. @@ -240,21 +267,21 @@ struct hb_language_item_t { return *this; } - void fini (void) { free ((void *) lang); } + void fini () { free ((void *) lang); } }; /* Thread-safe lock-free language list */ -static hb_language_item_t *langs; +static hb_atomic_ptr_t langs; -#ifdef HB_USE_ATEXIT +#if HB_USE_ATEXIT static void -free_langs (void) +free_langs () { retry: - hb_language_item_t *first_lang = (hb_language_item_t *) hb_atomic_ptr_get (&langs); - if (!hb_atomic_ptr_cmpexch (&langs, first_lang, nullptr)) + hb_language_item_t *first_lang = langs; + if (unlikely (!langs.cmpexch (first_lang, nullptr))) goto retry; while (first_lang) { @@ -270,7 +297,7 @@ static hb_language_item_t * lang_find_or_insert (const char *key) { retry: - hb_language_item_t *first_lang = (hb_language_item_t *) hb_atomic_ptr_get (&langs); + hb_language_item_t *first_lang = langs; for (hb_language_item_t *lang = first_lang; lang; lang = lang->next) if (*lang == key) @@ -288,13 +315,14 @@ retry: return nullptr; } - if (!hb_atomic_ptr_cmpexch (&langs, first_lang, lang)) { + if (unlikely (!langs.cmpexch (first_lang, lang))) + { lang->fini (); free (lang); goto retry; } -#ifdef HB_USE_ATEXIT +#if HB_USE_ATEXIT if (!first_lang) atexit (free_langs); /* First person registers atexit() callback. */ #endif @@ -306,14 +334,14 @@ retry: /** * hb_language_from_string: * @str: (array length=len) (element-type uint8_t): a string representing - * ISO 639 language code + * a BCP 47 language tag * @len: length of the @str, or -1 if it is %NULL-terminated. * - * Converts @str representing an ISO 639 language code to the corresponding + * Converts @str representing a BCP 47 language tag to the corresponding * #hb_language_t. * * Return value: (transfer none): - * The #hb_language_t corresponding to the ISO 639 language code. + * The #hb_language_t corresponding to the BCP 47 language tag. * * Since: 0.9.2 **/ @@ -361,24 +389,32 @@ hb_language_to_string (hb_language_t language) /** * hb_language_get_default: * + * Get default language from current locale. * + * Note that the first time this function is called, it calls + * "setlocale (LC_CTYPE, nullptr)" to fetch current locale. The underlying + * setlocale function is, in many implementations, NOT threadsafe. To avoid + * problems, call this function once before multiple threads can call it. + * This function is only used from hb_buffer_guess_segment_properties() by + * HarfBuzz itself. * * Return value: (transfer none): * * Since: 0.9.2 **/ hb_language_t -hb_language_get_default (void) +hb_language_get_default () { - static hb_language_t default_language = HB_LANGUAGE_INVALID; + static hb_atomic_ptr_t default_language; - hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language); - if (unlikely (language == HB_LANGUAGE_INVALID)) { + hb_language_t language = default_language; + if (unlikely (language == HB_LANGUAGE_INVALID)) + { language = hb_language_from_string (setlocale (LC_CTYPE, nullptr), -1); - (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, language); + (void) default_language.cmpexch (HB_LANGUAGE_INVALID, language); } - return default_language; + return language; } @@ -530,7 +566,6 @@ hb_script_get_horizontal_direction (hb_script_t script) /* Unicode-8.0 additions */ case HB_SCRIPT_HATRAN: - case HB_SCRIPT_OLD_HUNGARIAN: /* Unicode-9.0 additions */ case HB_SCRIPT_ADLAM: @@ -544,7 +579,9 @@ hb_script_get_horizontal_direction (hb_script_t script) /* https://github.com/harfbuzz/harfbuzz/issues/1000 */ + case HB_SCRIPT_OLD_HUNGARIAN: case HB_SCRIPT_OLD_ITALIC: + case HB_SCRIPT_RUNIC: return HB_DIRECTION_INVALID; } @@ -587,6 +624,19 @@ hb_user_data_array_t::get (hb_user_data_key_t *key) /* hb_version */ + +/** + * SECTION:hb-version + * @title: hb-version + * @short_description: Information about the version of HarfBuzz in use + * @include: hb.h + * + * These functions and macros allow accessing version of the HarfBuzz + * library used at compile- as well as run-time, and to direct code + * conditionally based on those versions, again, at compile- or run-time. + **/ + + /** * hb_version: * @major: (out): Library major version component. @@ -617,7 +667,7 @@ hb_version (unsigned int *major, * Since: 0.9.2 **/ const char * -hb_version_string (void) +hb_version_string () { return HB_VERSION_STRING; } @@ -729,48 +779,48 @@ parse_uint32 (const char **pp, const char *end, uint32_t *pv) #ifdef USE_XLOCALE -static HB_LOCALE_T C_locale; - -#ifdef HB_USE_ATEXIT -static void -free_C_locale (void) -{ -retry: - HB_LOCALE_T locale = (HB_LOCALE_T) hb_atomic_ptr_get (&C_locale); - - if (!hb_atomic_ptr_cmpexch (&C_locale, locale, nullptr)) - goto retry; - - if (locale) - HB_FREE_LOCALE (locale); -} +#if HB_USE_ATEXIT +static void free_static_C_locale (); #endif -static HB_LOCALE_T -get_C_locale (void) +static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t { -retry: - HB_LOCALE_T C = (HB_LOCALE_T) hb_atomic_ptr_get (&C_locale); - - if (unlikely (!C)) + static HB_LOCALE_T create () { - C = HB_CREATE_LOCALE ("C"); - - if (!hb_atomic_ptr_cmpexch (&C_locale, nullptr, C)) - { - HB_FREE_LOCALE (C_locale); - goto retry; - } + HB_LOCALE_T C_locale = HB_CREATE_LOCALE ("C"); -#ifdef HB_USE_ATEXIT - atexit (free_C_locale); /* First person registers atexit() callback. */ +#if HB_USE_ATEXIT + atexit (free_static_C_locale); #endif + + return C_locale; + } + static void destroy (HB_LOCALE_T p) + { + HB_FREE_LOCALE (p); } + static HB_LOCALE_T get_null () + { + return nullptr; + } +} static_C_locale; - return C; +#if HB_USE_ATEXIT +static +void free_static_C_locale () +{ + static_C_locale.free_instance (); } #endif +static HB_LOCALE_T +get_C_locale () +{ + return static_C_locale.get_unconst (); +} +#endif /* USE_XLOCALE */ + static bool parse_float (const char **pp, const char *end, float *pv) { @@ -846,7 +896,7 @@ parse_tag (const char **pp, const char *end, hb_tag_t *tag) } const char *p = *pp; - while (*pp < end && ISALNUM(**pp)) + while (*pp < end && (ISALNUM(**pp) || **pp == '_')) (*pp)++; if (p == *pp || *pp - p > 4) @@ -875,15 +925,15 @@ parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature) bool has_start; - feature->start = 0; - feature->end = (unsigned int) -1; + feature->start = HB_FEATURE_GLOBAL_START; + feature->end = HB_FEATURE_GLOBAL_END; if (!parse_char (pp, end, '[')) return true; has_start = parse_uint (pp, end, &feature->start); - if (parse_char (pp, end, ':')) { + if (parse_char (pp, end, ':') || parse_char (pp, end, ';')) { parse_uint (pp, end, &feature->end); } else { if (has_start) @@ -1063,10 +1113,19 @@ hb_variation_to_string (hb_variation_t *variation, while (len && s[len - 1] == ' ') len--; s[len++] = '='; - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", variation->value)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%g", (double) variation->value)); assert (len < ARRAY_LENGTH (s)); len = MIN (len, size - 1); memcpy (buf, s, len); buf[len] = '\0'; } + +/* If there is no visibility control, then hb-static.cc will NOT + * define anything. Instead, we get it to define one set in here + * only, so only libharfbuzz.so defines them, not other libs. */ +#ifdef HB_NO_VISIBILITY +#undef HB_NO_VISIBILITY +#include "hb-static.cc" +#define HB_NO_VISIBILITY 1 +#endif diff --git a/src/hb-common.h b/src/hb-common.h index 5dc1ebc..2b29e44 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -33,6 +33,10 @@ #ifndef HB_COMMON_H #define HB_COMMON_H +#ifndef HB_EXTERN +#define HB_EXTERN extern +#endif + #ifndef HB_BEGIN_DECLS # ifdef __cplusplus # define HB_BEGIN_DECLS extern "C" { @@ -63,6 +67,23 @@ typedef unsigned __int64 uint64_t; # include #endif +#if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define HB_DEPRECATED __attribute__((__deprecated__)) +#elif defined(_MSC_VER) && (_MSC_VER >= 1300) +#define HB_DEPRECATED __declspec(deprecated) +#else +#define HB_DEPRECATED +#endif + +#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define HB_DEPRECATED_FOR(f) __attribute__((__deprecated__("Use '" #f "' instead"))) +#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320) +#define HB_DEPRECATED_FOR(f) __declspec(deprecated("is deprecated. Use '" #f "' instead")) +#else +#define HB_DEPRECATED_FOR(f) HB_DEPRECATED +#endif + + HB_BEGIN_DECLS @@ -86,8 +107,8 @@ typedef union _hb_var_int_t { typedef uint32_t hb_tag_t; -#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint8_t)(c1))<<24)|(((uint8_t)(c2))<<16)|(((uint8_t)(c3))<<8)|((uint8_t)(c4)))) -#define HB_UNTAG(tag) ((uint8_t)((tag)>>24)), ((uint8_t)((tag)>>16)), ((uint8_t)((tag)>>8)), ((uint8_t)(tag)) +#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF))) +#define HB_UNTAG(tag) (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF) #define HB_TAG_NONE HB_TAG(0,0,0,0) #define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff) @@ -340,13 +361,15 @@ typedef enum HB_SCRIPT_INVALID = HB_TAG_NONE, /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t - * without risking undefined behavior. Include both a signed and unsigned max, - * since technically enums are int, and indeed, hb_script_t ends up being signed. + * without risking undefined behavior. We have two, for historical reasons. + * HB_TAG_MAX used to be unsigned, but that was invalid Ansi C, so was changed + * to _HB_SCRIPT_MAX_VALUE to be equal to HB_TAG_MAX_SIGNED as well. + * * See this thread for technicalities: * * https://lists.freedesktop.org/archives/harfbuzz/2014-March/004150.html */ - _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX, /*< skip >*/ + _HB_SCRIPT_MAX_VALUE = HB_TAG_MAX_SIGNED, /*< skip >*/ _HB_SCRIPT_MAX_VALUE_SIGNED = HB_TAG_MAX_SIGNED /*< skip >*/ } hb_script_t; @@ -379,6 +402,19 @@ typedef void (*hb_destroy_func_t) (void *user_data); /* Font features and variations. */ +/** + * HB_FEATURE_GLOBAL_START + * + * Since: 2.0.0 + */ +#define HB_FEATURE_GLOBAL_START 0 +/** + * HB_FEATURE_GLOBAL_END + * + * Since: 2.0.0 + */ +#define HB_FEATURE_GLOBAL_END ((unsigned int) -1) + typedef struct hb_feature_t { hb_tag_t tag; uint32_t value; @@ -412,6 +448,50 @@ HB_EXTERN void hb_variation_to_string (hb_variation_t *variation, char *buf, unsigned int size); +/** + * hb_color_t: + * + * Data type for holding color values. + * + * Since: 2.1.0 + */ +typedef uint32_t hb_color_t; + +#define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a))) + +/** + * hb_color_get_alpha: + * + * + * + * Since: 2.1.0 + */ +#define hb_color_get_alpha(color) ((color) & 0xFF) +/** + * hb_color_get_red: + * + * + * + * Since: 2.1.0 + */ +#define hb_color_get_red(color) (((color) >> 8) & 0xFF) +/** + * hb_color_get_green: + * + * + * + * Since: 2.1.0 + */ +#define hb_color_get_green(color) (((color) >> 16) & 0xFF) +/** + * hb_color_get_blue: + * + * + * + * Since: 2.1.0 + */ +#define hb_color_get_blue(color) (((color) >> 24) & 0xFF) + HB_END_DECLS diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc index 61f9c35..42ea3ea 100644 --- a/src/hb-coretext.cc +++ b/src/hb-coretext.cc @@ -26,15 +26,23 @@ * Google Author(s): Behdad Esfahbod */ -#define HB_SHAPER coretext - -#include "hb-private.hh" -#include "hb-debug.hh" -#include "hb-shaper-impl-private.hh" +#include "hb.hh" +#include "hb-shaper-impl.hh" #include "hb-coretext.h" +#include "hb-aat-layout.hh" #include + +/** + * SECTION:hb-coretext + * @title: hb-coretext + * @short_description: CoreText integration + * @include: hb-coretext.h + * + * Functions for using HarfBuzz with the CoreText fonts. + **/ + /* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */ #define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f @@ -91,13 +99,8 @@ _hb_cg_font_release (void *data) } -HB_SHAPER_DATA_ENSURE_DEFINE(coretext, face) -HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(coretext, font, - fabs (CTFontGetSize((CTFontRef) data) - coretext_font_size_from_ptem (font->ptem)) <= .5 -) - static CTFontDescriptorRef -get_last_resort_font_desc (void) +get_last_resort_font_desc () { // TODO Handle allocation failures? CTFontDescriptorRef last_resort = CTFontDescriptorCreateWithNameAndSize (CFSTR("LastResort"), 0); @@ -211,7 +214,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) } CFURLRef original_url = nullptr; -#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 +#if TARGET_OS_OSX && MAC_OS_X_VERSION_MIN_REQUIRED < 1060 ATSFontRef atsFont; FSRef fsref; OSStatus status; @@ -241,7 +244,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) * process in Blink. This can be detected by the new file URL location * that the newly found font points to. */ CFURLRef new_url = nullptr; -#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 +#if TARGET_OS_OSX && MAC_OS_X_VERSION_MIN_REQUIRED < 1060 atsFont = CTFontGetPlatformFont (new_ct_font, NULL); status = ATSFontGetFileReference (atsFont, &fsref); if (status == noErr) @@ -270,7 +273,7 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) return ct_font; } -hb_coretext_shaper_face_data_t * +hb_coretext_face_data_t * _hb_coretext_shaper_face_data_create (hb_face_t *face) { CGFontRef cg_font = create_cg_font (face); @@ -281,11 +284,11 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face) return nullptr; } - return (hb_coretext_shaper_face_data_t *) cg_font; + return (hb_coretext_face_data_t *) cg_font; } void -_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data) +_hb_coretext_shaper_face_data_destroy (hb_coretext_face_data_t *data) { CFRelease ((CGFontRef) data); } @@ -302,17 +305,17 @@ hb_coretext_face_create (CGFontRef cg_font) CGFontRef hb_coretext_face_get_cg_font (hb_face_t *face) { - if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return nullptr; - return (CGFontRef) HB_SHAPER_DATA_GET (face); + return (CGFontRef) (const void *) face->data.coretext; } -hb_coretext_shaper_font_data_t * +hb_coretext_font_data_t * _hb_coretext_shaper_font_data_create (hb_font_t *font) { hb_face_t *face = font->face; - if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return nullptr; - CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face); + const hb_coretext_face_data_t *face_data = face->data.coretext; + if (unlikely (!face_data)) return nullptr; + CGFontRef cg_font = (CGFontRef) (const void *) face->data.coretext; CTFontRef ct_font = create_ct_font (cg_font, coretext_font_size_from_ptem (font->ptem)); @@ -322,15 +325,47 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font) return nullptr; } - return (hb_coretext_shaper_font_data_t *) ct_font; + return (hb_coretext_font_data_t *) ct_font; } void -_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data) +_hb_coretext_shaper_font_data_destroy (hb_coretext_font_data_t *data) { CFRelease ((CTFontRef) data); } +static const hb_coretext_font_data_t * +hb_coretext_font_data_sync (hb_font_t *font) +{ +retry: + const hb_coretext_font_data_t *data = font->data.coretext; + if (unlikely (!data)) return nullptr; + + if (fabs (CTFontGetSize((CTFontRef) data) - coretext_font_size_from_ptem (font->ptem)) > .5) + { + /* XXX-MT-bug + * Note that evaluating condition above can be dangerous if another thread + * got here first and destructed data. That's, as always, bad use pattern. + * If you modify the font (change font size), other threads must not be + * using it at the same time. However, since this check is delayed to + * when one actually tries to shape something, this is a XXX race condition + * (and the only one we have that I know of) right now. Ie. you modify the + * font size in one thread, then (supposedly safely) try to use it from two + * or more threads and BOOM! I'm not sure how to fix this. We want RCU. + */ + + /* Drop and recreate. */ + /* If someone dropped it in the mean time, throw it away and don't touch it. + * Otherwise, destruct it. */ + if (likely (font->data.coretext.cmpexch (const_cast (data), nullptr))) + _hb_coretext_shaper_font_data_destroy (const_cast (data)); + else + goto retry; + } + return font->data.coretext; +} + + /* * Since: 1.7.2 */ @@ -343,13 +378,13 @@ hb_coretext_font_create (CTFontRef ct_font) hb_font_t *font = hb_font_create (face); hb_face_destroy (face); - if (unlikely (hb_object_is_inert (font))) + if (unlikely (hb_object_is_immutable (font))) return font; hb_font_set_ptem (font, coretext_font_size_to_ptem (CTFontGetSize(ct_font))); /* Let there be dragons here... */ - HB_SHAPER_DATA_GET (font) = (hb_coretext_shaper_font_data_t *) CFRetain (ct_font); + font->data.coretext.cmpexch (nullptr, (hb_coretext_font_data_t *) CFRetain (ct_font)); return font; } @@ -357,31 +392,8 @@ hb_coretext_font_create (CTFontRef ct_font) CTFontRef hb_coretext_font_get_ct_font (hb_font_t *font) { - if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return nullptr; - return (CTFontRef) HB_SHAPER_DATA_GET (font); -} - - - -/* - * shaper shape_plan data - */ - -struct hb_coretext_shaper_shape_plan_data_t {}; - -hb_coretext_shaper_shape_plan_data_t * -_hb_coretext_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, - const hb_feature_t *user_features HB_UNUSED, - unsigned int num_user_features HB_UNUSED, - const int *coords HB_UNUSED, - unsigned int num_coords HB_UNUSED) -{ - return (hb_coretext_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; -} - -void -_hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_t *data HB_UNUSED) -{ + const hb_coretext_font_data_t *data = hb_coretext_font_data_sync (font); + return data ? (CTFontRef) data : nullptr; } @@ -432,183 +444,6 @@ struct range_record_t { }; -/* The following enum members are added in OS X 10.8. */ -#define kAltHalfWidthTextSelector 6 -#define kAltProportionalTextSelector 5 -#define kAlternateHorizKanaOffSelector 1 -#define kAlternateHorizKanaOnSelector 0 -#define kAlternateKanaType 34 -#define kAlternateVertKanaOffSelector 3 -#define kAlternateVertKanaOnSelector 2 -#define kCaseSensitiveLayoutOffSelector 1 -#define kCaseSensitiveLayoutOnSelector 0 -#define kCaseSensitiveLayoutType 33 -#define kCaseSensitiveSpacingOffSelector 3 -#define kCaseSensitiveSpacingOnSelector 2 -#define kContextualAlternatesOffSelector 1 -#define kContextualAlternatesOnSelector 0 -#define kContextualAlternatesType 36 -#define kContextualLigaturesOffSelector 19 -#define kContextualLigaturesOnSelector 18 -#define kContextualSwashAlternatesOffSelector 5 -#define kContextualSwashAlternatesOnSelector 4 -#define kDefaultLowerCaseSelector 0 -#define kDefaultUpperCaseSelector 0 -#define kHistoricalLigaturesOffSelector 21 -#define kHistoricalLigaturesOnSelector 20 -#define kHojoCharactersSelector 12 -#define kJIS2004CharactersSelector 11 -#define kLowerCasePetiteCapsSelector 2 -#define kLowerCaseSmallCapsSelector 1 -#define kLowerCaseType 37 -#define kMathematicalGreekOffSelector 11 -#define kMathematicalGreekOnSelector 10 -#define kNLCCharactersSelector 13 -#define kQuarterWidthTextSelector 4 -#define kScientificInferiorsSelector 4 -#define kStylisticAltEightOffSelector 17 -#define kStylisticAltEightOnSelector 16 -#define kStylisticAltEighteenOffSelector 37 -#define kStylisticAltEighteenOnSelector 36 -#define kStylisticAltElevenOffSelector 23 -#define kStylisticAltElevenOnSelector 22 -#define kStylisticAltFifteenOffSelector 31 -#define kStylisticAltFifteenOnSelector 30 -#define kStylisticAltFiveOffSelector 11 -#define kStylisticAltFiveOnSelector 10 -#define kStylisticAltFourOffSelector 9 -#define kStylisticAltFourOnSelector 8 -#define kStylisticAltFourteenOffSelector 29 -#define kStylisticAltFourteenOnSelector 28 -#define kStylisticAltNineOffSelector 19 -#define kStylisticAltNineOnSelector 18 -#define kStylisticAltNineteenOffSelector 39 -#define kStylisticAltNineteenOnSelector 38 -#define kStylisticAltOneOffSelector 3 -#define kStylisticAltOneOnSelector 2 -#define kStylisticAltSevenOffSelector 15 -#define kStylisticAltSevenOnSelector 14 -#define kStylisticAltSeventeenOffSelector 35 -#define kStylisticAltSeventeenOnSelector 34 -#define kStylisticAltSixOffSelector 13 -#define kStylisticAltSixOnSelector 12 -#define kStylisticAltSixteenOffSelector 33 -#define kStylisticAltSixteenOnSelector 32 -#define kStylisticAltTenOffSelector 21 -#define kStylisticAltTenOnSelector 20 -#define kStylisticAltThirteenOffSelector 27 -#define kStylisticAltThirteenOnSelector 26 -#define kStylisticAltThreeOffSelector 7 -#define kStylisticAltThreeOnSelector 6 -#define kStylisticAltTwelveOffSelector 25 -#define kStylisticAltTwelveOnSelector 24 -#define kStylisticAltTwentyOffSelector 41 -#define kStylisticAltTwentyOnSelector 40 -#define kStylisticAltTwoOffSelector 5 -#define kStylisticAltTwoOnSelector 4 -#define kStylisticAlternativesType 35 -#define kSwashAlternatesOffSelector 3 -#define kSwashAlternatesOnSelector 2 -#define kThirdWidthTextSelector 3 -#define kTraditionalNamesCharactersSelector 14 -#define kUpperCasePetiteCapsSelector 2 -#define kUpperCaseSmallCapsSelector 1 -#define kUpperCaseType 38 - -/* Table data courtesy of Apple. */ -static const struct feature_mapping_t { - FourCharCode otFeatureTag; - uint16_t aatFeatureType; - uint16_t selectorToEnable; - uint16_t selectorToDisable; -} feature_mappings[] = { - { 'c2pc', kUpperCaseType, kUpperCasePetiteCapsSelector, kDefaultUpperCaseSelector }, - { 'c2sc', kUpperCaseType, kUpperCaseSmallCapsSelector, kDefaultUpperCaseSelector }, - { 'calt', kContextualAlternatesType, kContextualAlternatesOnSelector, kContextualAlternatesOffSelector }, - { 'case', kCaseSensitiveLayoutType, kCaseSensitiveLayoutOnSelector, kCaseSensitiveLayoutOffSelector }, - { 'clig', kLigaturesType, kContextualLigaturesOnSelector, kContextualLigaturesOffSelector }, - { 'cpsp', kCaseSensitiveLayoutType, kCaseSensitiveSpacingOnSelector, kCaseSensitiveSpacingOffSelector }, - { 'cswh', kContextualAlternatesType, kContextualSwashAlternatesOnSelector, kContextualSwashAlternatesOffSelector }, - { 'dlig', kLigaturesType, kRareLigaturesOnSelector, kRareLigaturesOffSelector }, - { 'expt', kCharacterShapeType, kExpertCharactersSelector, 16 }, - { 'frac', kFractionsType, kDiagonalFractionsSelector, kNoFractionsSelector }, - { 'fwid', kTextSpacingType, kMonospacedTextSelector, 7 }, - { 'halt', kTextSpacingType, kAltHalfWidthTextSelector, 7 }, - { 'hist', kLigaturesType, kHistoricalLigaturesOnSelector, kHistoricalLigaturesOffSelector }, - { 'hkna', kAlternateKanaType, kAlternateHorizKanaOnSelector, kAlternateHorizKanaOffSelector, }, - { 'hlig', kLigaturesType, kHistoricalLigaturesOnSelector, kHistoricalLigaturesOffSelector }, - { 'hngl', kTransliterationType, kHanjaToHangulSelector, kNoTransliterationSelector }, - { 'hojo', kCharacterShapeType, kHojoCharactersSelector, 16 }, - { 'hwid', kTextSpacingType, kHalfWidthTextSelector, 7 }, - { 'ital', kItalicCJKRomanType, kCJKItalicRomanOnSelector, kCJKItalicRomanOffSelector }, - { 'jp04', kCharacterShapeType, kJIS2004CharactersSelector, 16 }, - { 'jp78', kCharacterShapeType, kJIS1978CharactersSelector, 16 }, - { 'jp83', kCharacterShapeType, kJIS1983CharactersSelector, 16 }, - { 'jp90', kCharacterShapeType, kJIS1990CharactersSelector, 16 }, - { 'liga', kLigaturesType, kCommonLigaturesOnSelector, kCommonLigaturesOffSelector }, - { 'lnum', kNumberCaseType, kUpperCaseNumbersSelector, 2 }, - { 'mgrk', kMathematicalExtrasType, kMathematicalGreekOnSelector, kMathematicalGreekOffSelector }, - { 'nlck', kCharacterShapeType, kNLCCharactersSelector, 16 }, - { 'onum', kNumberCaseType, kLowerCaseNumbersSelector, 2 }, - { 'ordn', kVerticalPositionType, kOrdinalsSelector, kNormalPositionSelector }, - { 'palt', kTextSpacingType, kAltProportionalTextSelector, 7 }, - { 'pcap', kLowerCaseType, kLowerCasePetiteCapsSelector, kDefaultLowerCaseSelector }, - { 'pkna', kTextSpacingType, kProportionalTextSelector, 7 }, - { 'pnum', kNumberSpacingType, kProportionalNumbersSelector, 4 }, - { 'pwid', kTextSpacingType, kProportionalTextSelector, 7 }, - { 'qwid', kTextSpacingType, kQuarterWidthTextSelector, 7 }, - { 'ruby', kRubyKanaType, kRubyKanaOnSelector, kRubyKanaOffSelector }, - { 'sinf', kVerticalPositionType, kScientificInferiorsSelector, kNormalPositionSelector }, - { 'smcp', kLowerCaseType, kLowerCaseSmallCapsSelector, kDefaultLowerCaseSelector }, - { 'smpl', kCharacterShapeType, kSimplifiedCharactersSelector, 16 }, - { 'ss01', kStylisticAlternativesType, kStylisticAltOneOnSelector, kStylisticAltOneOffSelector }, - { 'ss02', kStylisticAlternativesType, kStylisticAltTwoOnSelector, kStylisticAltTwoOffSelector }, - { 'ss03', kStylisticAlternativesType, kStylisticAltThreeOnSelector, kStylisticAltThreeOffSelector }, - { 'ss04', kStylisticAlternativesType, kStylisticAltFourOnSelector, kStylisticAltFourOffSelector }, - { 'ss05', kStylisticAlternativesType, kStylisticAltFiveOnSelector, kStylisticAltFiveOffSelector }, - { 'ss06', kStylisticAlternativesType, kStylisticAltSixOnSelector, kStylisticAltSixOffSelector }, - { 'ss07', kStylisticAlternativesType, kStylisticAltSevenOnSelector, kStylisticAltSevenOffSelector }, - { 'ss08', kStylisticAlternativesType, kStylisticAltEightOnSelector, kStylisticAltEightOffSelector }, - { 'ss09', kStylisticAlternativesType, kStylisticAltNineOnSelector, kStylisticAltNineOffSelector }, - { 'ss10', kStylisticAlternativesType, kStylisticAltTenOnSelector, kStylisticAltTenOffSelector }, - { 'ss11', kStylisticAlternativesType, kStylisticAltElevenOnSelector, kStylisticAltElevenOffSelector }, - { 'ss12', kStylisticAlternativesType, kStylisticAltTwelveOnSelector, kStylisticAltTwelveOffSelector }, - { 'ss13', kStylisticAlternativesType, kStylisticAltThirteenOnSelector, kStylisticAltThirteenOffSelector }, - { 'ss14', kStylisticAlternativesType, kStylisticAltFourteenOnSelector, kStylisticAltFourteenOffSelector }, - { 'ss15', kStylisticAlternativesType, kStylisticAltFifteenOnSelector, kStylisticAltFifteenOffSelector }, - { 'ss16', kStylisticAlternativesType, kStylisticAltSixteenOnSelector, kStylisticAltSixteenOffSelector }, - { 'ss17', kStylisticAlternativesType, kStylisticAltSeventeenOnSelector, kStylisticAltSeventeenOffSelector }, - { 'ss18', kStylisticAlternativesType, kStylisticAltEighteenOnSelector, kStylisticAltEighteenOffSelector }, - { 'ss19', kStylisticAlternativesType, kStylisticAltNineteenOnSelector, kStylisticAltNineteenOffSelector }, - { 'ss20', kStylisticAlternativesType, kStylisticAltTwentyOnSelector, kStylisticAltTwentyOffSelector }, - { 'subs', kVerticalPositionType, kInferiorsSelector, kNormalPositionSelector }, - { 'sups', kVerticalPositionType, kSuperiorsSelector, kNormalPositionSelector }, - { 'swsh', kContextualAlternatesType, kSwashAlternatesOnSelector, kSwashAlternatesOffSelector }, - { 'titl', kStyleOptionsType, kTitlingCapsSelector, kNoStyleOptionsSelector }, - { 'tnam', kCharacterShapeType, kTraditionalNamesCharactersSelector, 16 }, - { 'tnum', kNumberSpacingType, kMonospacedNumbersSelector, 4 }, - { 'trad', kCharacterShapeType, kTraditionalCharactersSelector, 16 }, - { 'twid', kTextSpacingType, kThirdWidthTextSelector, 7 }, - { 'unic', kLetterCaseType, 14, 15 }, - { 'valt', kTextSpacingType, kAltProportionalTextSelector, 7 }, - { 'vert', kVerticalSubstitutionType, kSubstituteVerticalFormsOnSelector, kSubstituteVerticalFormsOffSelector }, - { 'vhal', kTextSpacingType, kAltHalfWidthTextSelector, 7 }, - { 'vkna', kAlternateKanaType, kAlternateVertKanaOnSelector, kAlternateVertKanaOffSelector }, - { 'vpal', kTextSpacingType, kAltProportionalTextSelector, 7 }, - { 'vrt2', kVerticalSubstitutionType, kSubstituteVerticalFormsOnSelector, kSubstituteVerticalFormsOffSelector }, - { 'zero', kTypographicExtrasType, kSlashedZeroOnSelector, kSlashedZeroOffSelector }, -}; - -static int -_hb_feature_mapping_cmp (const void *key_, const void *entry_) -{ - unsigned int key = * (unsigned int *) key_; - const feature_mapping_t * entry = (const feature_mapping_t *) entry_; - return key < entry->otFeatureTag ? -1 : - key > entry->otFeatureTag ? 1 : - 0; -} - hb_bool_t _hb_coretext_shape (hb_shape_plan_t *shape_plan, hb_font_t *font, @@ -617,15 +452,15 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, unsigned int num_features) { hb_face_t *face = font->face; - CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face); - CTFontRef ct_font = (CTFontRef) HB_SHAPER_DATA_GET (font); + CGFontRef cg_font = (CGFontRef) (const void *) face->data.coretext; + CTFontRef ct_font = (CTFontRef) hb_coretext_font_data_sync (font); CGFloat ct_font_size = CTFontGetSize (ct_font); CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size; CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size; /* Attach marks to their bases, to match the 'ot' shaper. - * Adapted from hb-ot-shape:hb_form_clusters(). + * Adapted from a very old version of hb-ot-shape:hb_form_clusters(). * Note that this only makes us be closer to the 'ot' shaper, * but by no means the same. For example, if there's * B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will @@ -641,8 +476,8 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, buffer->merge_clusters (i - 1, i + 1); } - hb_auto_t > feature_records; - hb_auto_t > range_records; + hb_vector_t feature_records; + hb_vector_t range_records; /* * Set up features. @@ -651,14 +486,10 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, if (num_features) { /* Sort features by start/end events. */ - hb_auto_t > feature_events; + hb_vector_t feature_events; for (unsigned int i = 0; i < num_features; i++) { - const feature_mapping_t * mapping = (const feature_mapping_t *) bsearch (&features[i].tag, - feature_mappings, - ARRAY_LENGTH (feature_mappings), - sizeof (feature_mappings[0]), - _hb_feature_mapping_cmp); + const hb_aat_feature_mapping_t * mapping = hb_aat_layout_find_feature_mapping (features[i].tag); if (!mapping) continue; @@ -694,9 +525,9 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } /* Scan events and save features for each range. */ - hb_auto_t > active_features; + hb_vector_t active_features; unsigned int last_index = 0; - for (unsigned int i = 0; i < feature_events.len; i++) + for (unsigned int i = 0; i < feature_events.length; i++) { feature_event_t *event = &feature_events[i]; @@ -705,13 +536,13 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, /* Save a snapshot of active features and the range. */ range_record_t *range = range_records.push (); - if (active_features.len) + if (active_features.length) { CFMutableArrayRef features_array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); /* TODO sort and resolve conflicting features? */ /* active_features.qsort (); */ - for (unsigned int j = 0; j < active_features.len; j++) + for (unsigned int j = 0; j < active_features.length; j++) { CFStringRef keys[] = { kCTFontFeatureTypeIdentifierKey, @@ -767,7 +598,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } else { active_feature_t *feature = active_features.find (&event->feature); if (feature) - active_features.remove (feature - active_features.arrayZ); + active_features.remove (feature - active_features.arrayZ ()); } } } @@ -824,7 +655,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, CFStringRef string_ref = nullptr; CTLineRef line = nullptr; - if (0) + if (false) { resize_and_retry: DEBUG_MSG (CORETEXT, buffer, "Buffer resize"); @@ -899,7 +730,7 @@ resize_and_retry: CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len), kCTFontAttributeName, ct_font); - if (num_features && range_records.len) + if (num_features && range_records.length) { unsigned int start = 0; range_record_t *last_range = &range_records[0]; @@ -1048,7 +879,7 @@ resize_and_retry: * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098 */ bool matched = false; - for (unsigned int i = 0; i < range_records.len; i++) + for (unsigned int i = 0; i < range_records.length; i++) if (range_records[i].font && CFEqual (run_ct_font, range_records[i].font)) { matched = true; @@ -1235,7 +1066,7 @@ resize_and_retry: * * https://crbug.com/419769 */ - if (0) + if (false) { /* Make sure all runs had the expected direction. */ bool backward = HB_DIRECTION_IS_BACKWARD (buffer->props.direction); @@ -1311,7 +1142,7 @@ fail: if (line) CFRelease (line); - for (unsigned int i = 0; i < range_records.len; i++) + for (unsigned int i = 0; i < range_records.length; i++) if (range_records[i].font) CFRelease (range_records[i].font); @@ -1323,36 +1154,21 @@ fail: * AAT shaper */ -HB_SHAPER_DATA_ENSURE_DEFINE(coretext_aat, face) -HB_SHAPER_DATA_ENSURE_DEFINE(coretext_aat, font) - /* * shaper face data */ -struct hb_coretext_aat_shaper_face_data_t {}; +struct hb_coretext_aat_face_data_t {}; -hb_coretext_aat_shaper_face_data_t * +hb_coretext_aat_face_data_t * _hb_coretext_aat_shaper_face_data_create (hb_face_t *face) { - static const hb_tag_t tags[] = {HB_CORETEXT_TAG_MORX, HB_CORETEXT_TAG_MORT, HB_CORETEXT_TAG_KERX}; - - for (unsigned int i = 0; i < ARRAY_LENGTH (tags); i++) - { - hb_blob_t *blob = face->reference_table (tags[i]); - if (hb_blob_get_length (blob)) - { - hb_blob_destroy (blob); - return hb_coretext_shaper_face_data_ensure (face) ? (hb_coretext_aat_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr; - } - hb_blob_destroy (blob); - } - - return nullptr; + return hb_aat_layout_has_substitution (face) || hb_aat_layout_has_positioning (face) ? + (hb_coretext_aat_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr; } void -_hb_coretext_aat_shaper_face_data_destroy (hb_coretext_aat_shaper_face_data_t *data HB_UNUSED) +_hb_coretext_aat_shaper_face_data_destroy (hb_coretext_aat_face_data_t *data HB_UNUSED) { } @@ -1361,38 +1177,16 @@ _hb_coretext_aat_shaper_face_data_destroy (hb_coretext_aat_shaper_face_data_t *d * shaper font data */ -struct hb_coretext_aat_shaper_font_data_t {}; +struct hb_coretext_aat_font_data_t {}; -hb_coretext_aat_shaper_font_data_t * +hb_coretext_aat_font_data_t * _hb_coretext_aat_shaper_font_data_create (hb_font_t *font) { - return hb_coretext_shaper_font_data_ensure (font) ? (hb_coretext_aat_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr; -} - -void -_hb_coretext_aat_shaper_font_data_destroy (hb_coretext_aat_shaper_font_data_t *data HB_UNUSED) -{ -} - - -/* - * shaper shape_plan data - */ - -struct hb_coretext_aat_shaper_shape_plan_data_t {}; - -hb_coretext_aat_shaper_shape_plan_data_t * -_hb_coretext_aat_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, - const hb_feature_t *user_features HB_UNUSED, - unsigned int num_user_features HB_UNUSED, - const int *coords HB_UNUSED, - unsigned int num_coords HB_UNUSED) -{ - return (hb_coretext_aat_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; + return font->data.coretext ? (hb_coretext_aat_font_data_t *) HB_SHAPER_DATA_SUCCEEDED : nullptr; } void -_hb_coretext_aat_shaper_shape_plan_data_destroy (hb_coretext_aat_shaper_shape_plan_data_t *data HB_UNUSED) +_hb_coretext_aat_shaper_font_data_destroy (hb_coretext_aat_font_data_t *data HB_UNUSED) { } diff --git a/src/hb-debug.hh b/src/hb-debug.hh index c244347..d7d0165 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -27,13 +27,60 @@ #ifndef HB_DEBUG_HH #define HB_DEBUG_HH -#include "hb-private.hh" +#include "hb.hh" +#include "hb-atomic.hh" +#include "hb-dsalgs.hh" #ifndef HB_DEBUG #define HB_DEBUG 0 #endif + +/* + * Global runtime options. + */ + +struct hb_options_t +{ + bool unused : 1; /* In-case sign bit is here. */ + bool initialized : 1; + bool uniscribe_bug_compatible : 1; + bool aat : 1; +}; + +union hb_options_union_t { + int i; + hb_options_t opts; +}; +static_assert ((sizeof (hb_atomic_int_t) >= sizeof (hb_options_union_t)), ""); + +HB_INTERNAL void +_hb_options_init (); + +extern HB_INTERNAL hb_atomic_int_t _hb_options; + +static inline hb_options_t +hb_options () +{ + /* Make a local copy, so we can access bitfield threadsafely. */ + hb_options_union_t u; + u.i = _hb_options.get_relaxed (); + + if (unlikely (!u.i)) + { + _hb_options_init (); + u.i = _hb_options.get_relaxed (); + } + + return u.opts; +} + + +/* + * Debug output (needs enabling at compile time.) + */ + static inline bool _hb_debug (unsigned int level, unsigned int max_level) @@ -126,7 +173,7 @@ _hb_debug_msg_va (const char *what, fprintf (stderr, "\n"); } -template <> inline void +template <> inline void HB_PRINTF_FUNC(7, 0) _hb_debug_msg_va<0> (const char *what HB_UNUSED, const void *obj HB_UNUSED, const char *func HB_UNUSED, @@ -145,7 +192,7 @@ _hb_debug_msg (const char *what, int level_dir, const char *message, ...) HB_PRINTF_FUNC(7, 8); -template static inline void +template static inline void HB_PRINTF_FUNC(7, 8) _hb_debug_msg (const char *what, const void *obj, const char *func, @@ -169,7 +216,7 @@ _hb_debug_msg<0> (const char *what HB_UNUSED, int level_dir HB_UNUSED, const char *message HB_UNUSED, ...) HB_PRINTF_FUNC(7, 8); -template <> inline void +template <> inline void HB_PRINTF_FUNC(7, 8) _hb_debug_msg<0> (const char *what HB_UNUSED, const void *obj HB_UNUSED, const char *func HB_UNUSED, @@ -237,7 +284,7 @@ struct hb_auto_trace_t _hb_debug_msg_va (what, obj, func, true, plevel ? *plevel : 0, +1, message, ap); va_end (ap); } - inline ~hb_auto_trace_t (void) + ~hb_auto_trace_t () { _hb_warn_no_return (returned); if (!returned) { @@ -246,14 +293,16 @@ struct hb_auto_trace_t if (plevel) --*plevel; } - inline ret_t ret (ret_t v, unsigned int line = 0) + ret_t ret (ret_t v, + const char *func = "", + unsigned int line = 0) { if (unlikely (returned)) { fprintf (stderr, "OUCH, double calls to return_trace(). This is a bug, please report.\n"); return v; } - _hb_debug_msg (what, obj, nullptr, true, plevel ? *plevel : 1, -1, + _hb_debug_msg (what, obj, func, true, plevel ? *plevel : 1, -1, "return %s (line %d)", hb_printer_t().print (v), line); if (plevel) --*plevel; @@ -278,17 +327,21 @@ struct hb_auto_trace_t<0, ret_t> const char *message, ...) HB_PRINTF_FUNC(6, 7) {} - inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; } + ret_t ret (ret_t v, + const char *func HB_UNUSED = nullptr, + unsigned int line HB_UNUSED = 0) { return v; } }; /* For disabled tracing; optimize out everything. * https://github.com/harfbuzz/harfbuzz/pull/605 */ template struct hb_no_trace_t { - inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; } + ret_t ret (ret_t v, + const char *func HB_UNUSED = "", + unsigned int line HB_UNUSED = 0) { return v; } }; -#define return_trace(RET) return trace.ret (RET, __LINE__) +#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__) /* @@ -348,30 +401,6 @@ struct hb_no_trace_t { #define TRACE_APPLY(this) hb_no_trace_t trace #endif -#ifndef HB_DEBUG_CLOSURE -#define HB_DEBUG_CLOSURE (HB_DEBUG+0) -#endif -#if HB_DEBUG_CLOSURE -#define TRACE_CLOSURE(this) \ - hb_auto_trace_t trace \ - (&c->debug_depth, c->get_name (), this, HB_FUNC, \ - " ") -#else -#define TRACE_CLOSURE(this) hb_no_trace_t trace HB_UNUSED -#endif - -#ifndef HB_DEBUG_COLLECT_GLYPHS -#define HB_DEBUG_COLLECT_GLYPHS (HB_DEBUG+0) -#endif -#if HB_DEBUG_COLLECT_GLYPHS -#define TRACE_COLLECT_GLYPHS(this) \ - hb_auto_trace_t trace \ - (&c->debug_depth, c->get_name (), this, HB_FUNC, \ - " ") -#else -#define TRACE_COLLECT_GLYPHS(this) hb_no_trace_t trace HB_UNUSED -#endif - #ifndef HB_DEBUG_SANITIZE #define HB_DEBUG_SANITIZE (HB_DEBUG+0) #endif @@ -423,8 +452,6 @@ struct hb_no_trace_t { #ifndef HB_DEBUG_DISPATCH #define HB_DEBUG_DISPATCH ( \ HB_DEBUG_APPLY + \ - HB_DEBUG_CLOSURE + \ - HB_DEBUG_COLLECT_GLYPHS + \ HB_DEBUG_SANITIZE + \ HB_DEBUG_SERIALIZE + \ HB_DEBUG_SUBSET + \ diff --git a/src/hb-deprecated.h b/src/hb-deprecated.h index eac7efb..4a5e702 100644 --- a/src/hb-deprecated.h +++ b/src/hb-deprecated.h @@ -36,10 +36,23 @@ #include "hb-font.h" #include "hb-set.h" + +/** + * SECTION:hb-deprecated + * @title: hb-deprecated + * @short_description: Deprecated API + * @include: hb.h + * + * These API have been deprecated in favor of newer API, or because they + * were deemed unnecessary. + **/ + + HB_BEGIN_DECLS #ifndef HB_DISABLE_DEPRECATED + #define HB_SCRIPT_CANADIAN_ABORIGINAL HB_SCRIPT_CANADIAN_SYLLABICS #define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT @@ -50,14 +63,162 @@ typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t *glyph, void *user_data); -HB_EXTERN void +HB_EXTERN HB_DEPRECATED_FOR(hb_font_funcs_set_nominal_glyph_func or hb_font_funcs_set_variation_glyph_func) void hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_func_t func, void *user_data, hb_destroy_func_t destroy); -HB_EXTERN void +HB_EXTERN HB_DEPRECATED void hb_set_invert (hb_set_t *set); +/** + * hb_unicode_eastasian_width_func_t: + * + * Deprecated: 2.0.0 + */ +typedef unsigned int (*hb_unicode_eastasian_width_func_t) (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode, + void *user_data); + +/** + * hb_unicode_funcs_set_eastasian_width_func: + * @ufuncs: a Unicode function structure + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 0.9.2 + * Deprecated: 2.0.0 + **/ +HB_EXTERN HB_DEPRECATED void +hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs, + hb_unicode_eastasian_width_func_t func, + void *user_data, hb_destroy_func_t destroy); + +/** + * hb_unicode_eastasian_width: + * + * Since: 0.9.2 + * Deprecated: 2.0.0 + **/ +HB_EXTERN HB_DEPRECATED unsigned int +hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t unicode); + + +/** + * hb_unicode_decompose_compatibility_func_t: + * @ufuncs: a Unicode function structure + * @u: codepoint to decompose + * @decomposed: address of codepoint array (of length %HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into + * @user_data: user data pointer as passed to hb_unicode_funcs_set_decompose_compatibility_func() + * + * Fully decompose @u to its Unicode compatibility decomposition. The codepoints of the decomposition will be written to @decomposed. + * The complete length of the decomposition will be returned. + * + * If @u has no compatibility decomposition, zero should be returned. + * + * The Unicode standard guarantees that a buffer of length %HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any + * compatibility decomposition plus an terminating value of 0. Consequently, @decompose must be allocated by the caller to be at least this length. Implementations + * of this function type must ensure that they do not write past the provided array. + * + * Return value: number of codepoints in the full compatibility decomposition of @u, or 0 if no decomposition available. + * + * Deprecated: 2.0.0 + */ +typedef unsigned int (*hb_unicode_decompose_compatibility_func_t) (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t u, + hb_codepoint_t *decomposed, + void *user_data); + +/** + * HB_UNICODE_MAX_DECOMPOSITION_LEN: + * + * See Unicode 6.1 for details on the maximum decomposition length. + * + * Deprecated: 2.0.0 + */ +#define HB_UNICODE_MAX_DECOMPOSITION_LEN (18+1) /* codepoints */ + +/** + * hb_unicode_funcs_set_decompose_compatibility_func: + * @ufuncs: a Unicode function structure + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 0.9.2 + * Deprecated: 2.0.0 + **/ +HB_EXTERN HB_DEPRECATED void +hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs, + hb_unicode_decompose_compatibility_func_t func, + void *user_data, hb_destroy_func_t destroy); + +HB_EXTERN HB_DEPRECATED unsigned int +hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, + hb_codepoint_t u, + hb_codepoint_t *decomposed); + + +typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data, + hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + void *user_data); +typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t; +typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t; + +/** + * hb_font_funcs_set_glyph_h_kerning_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 0.9.2 + * Deprecated: 2.0.0 + **/ +HB_EXTERN void +hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_h_kerning_func_t func, + void *user_data, hb_destroy_func_t destroy); + +/** + * hb_font_funcs_set_glyph_v_kerning_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 0.9.2 + * Deprecated: 2.0.0 + **/ +HB_EXTERN void +hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_v_kerning_func_t func, + void *user_data, hb_destroy_func_t destroy); + +HB_EXTERN hb_position_t +hb_font_get_glyph_h_kerning (hb_font_t *font, + hb_codepoint_t left_glyph, hb_codepoint_t right_glyph); +HB_EXTERN hb_position_t +hb_font_get_glyph_v_kerning (hb_font_t *font, + hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); + +HB_EXTERN void +hb_font_get_glyph_kerning_for_direction (hb_font_t *font, + hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y); + + #endif HB_END_DECLS diff --git a/src/hb-directwrite.cc b/src/hb-directwrite.cc index 187ab3f..aaf10a1 100644 --- a/src/hb-directwrite.cc +++ b/src/hb-directwrite.cc @@ -22,28 +22,22 @@ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */ -#include "hb-private.hh" -#include "hb-debug.hh" -#define HB_SHAPER directwrite -#include "hb-shaper-impl-private.hh" +#include "hb.hh" +#include "hb-shaper-impl.hh" #include #include "hb-directwrite.h" -HB_SHAPER_DATA_ENSURE_DEFINE (directwrite, face) -HB_SHAPER_DATA_ENSURE_DEFINE (directwrite, font) - - /* * hb-directwrite uses new/delete syntatically but as we let users * to override malloc/free, we will redefine new/delete so users * won't need to do that by their own. */ -void* operator new (size_t size) { return malloc (size); } -void* operator new [] (size_t size) { return malloc (size); } -void operator delete (void* pointer) { free (pointer); } +void* operator new (size_t size) { return malloc (size); } +void* operator new [] (size_t size) { return malloc (size); } +void operator delete (void* pointer) { free (pointer); } void operator delete [] (void* pointer) { free (pointer); } @@ -60,23 +54,25 @@ private: IDWriteFontFileStream *mFontFileStream; public: DWriteFontFileLoader (IDWriteFontFileStream *fontFileStream) - { - mFontFileStream = fontFileStream; - } + { mFontFileStream = fontFileStream; } // IUnknown interface - IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) { return S_OK; } - IFACEMETHOD_ (ULONG, AddRef) () { return 1; } + IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) + { return S_OK; } + IFACEMETHOD_ (ULONG, AddRef) () { return 1; } IFACEMETHOD_ (ULONG, Release) () { return 1; } // IDWriteFontFileLoader methods - virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey (void const* fontFileReferenceKey, - uint32_t fontFileReferenceKeySize, - OUT IDWriteFontFileStream** fontFileStream) + virtual HRESULT STDMETHODCALLTYPE + CreateStreamFromKey (void const* fontFileReferenceKey, + uint32_t fontFileReferenceKeySize, + OUT IDWriteFontFileStream** fontFileStream) { *fontFileStream = mFontFileStream; return S_OK; } + + virtual ~DWriteFontFileLoader() {} }; class DWriteFontFileStream : public IDWriteFontFileStream @@ -92,19 +88,20 @@ public: } // IUnknown interface - IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) { return S_OK; } - IFACEMETHOD_ (ULONG, AddRef) () { return 1; } + IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) + { return S_OK; } + IFACEMETHOD_ (ULONG, AddRef) () { return 1; } IFACEMETHOD_ (ULONG, Release) () { return 1; } // IDWriteFontFileStream methods - virtual HRESULT STDMETHODCALLTYPE ReadFileFragment (void const** fragmentStart, - UINT64 fileOffset, - UINT64 fragmentSize, - OUT void** fragmentContext) + virtual HRESULT STDMETHODCALLTYPE + ReadFileFragment (void const** fragmentStart, + UINT64 fileOffset, + UINT64 fragmentSize, + OUT void** fragmentContext) { // We are required to do bounds checking. - if (fileOffset + fragmentSize > mSize) - return E_FAIL; + if (fileOffset + fragmentSize > mSize) return E_FAIL; // truncate the 64 bit fileOffset to size_t sized index into mData size_t index = static_cast (fileOffset); @@ -115,18 +112,20 @@ public: return S_OK; } - virtual void STDMETHODCALLTYPE ReleaseFileFragment (void* fragmentContext) { } + virtual void STDMETHODCALLTYPE + ReleaseFileFragment (void* fragmentContext) {} - virtual HRESULT STDMETHODCALLTYPE GetFileSize (OUT UINT64* fileSize) + virtual HRESULT STDMETHODCALLTYPE + GetFileSize (OUT UINT64* fileSize) { *fileSize = mSize; return S_OK; } - virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime (OUT UINT64* lastWriteTime) - { - return E_NOTIMPL; - } + virtual HRESULT STDMETHODCALLTYPE + GetLastWriteTime (OUT UINT64* lastWriteTime) { return E_NOTIMPL; } + + virtual ~DWriteFontFileStream() {} }; @@ -134,36 +133,33 @@ public: * shaper face data */ -struct hb_directwrite_shaper_face_data_t +struct hb_directwrite_face_data_t { IDWriteFactory *dwriteFactory; IDWriteFontFile *fontFile; - IDWriteFontFileStream *fontFileStream; - IDWriteFontFileLoader *fontFileLoader; + DWriteFontFileStream *fontFileStream; + DWriteFontFileLoader *fontFileLoader; IDWriteFontFace *fontFace; hb_blob_t *faceBlob; }; -hb_directwrite_shaper_face_data_t * +hb_directwrite_face_data_t * _hb_directwrite_shaper_face_data_create (hb_face_t *face) { - hb_directwrite_shaper_face_data_t *data = new hb_directwrite_shaper_face_data_t; + hb_directwrite_face_data_t *data = new hb_directwrite_face_data_t; if (unlikely (!data)) return nullptr; // TODO: factory and fontFileLoader should be cached separately IDWriteFactory* dwriteFactory; - DWriteCreateFactory ( - DWRITE_FACTORY_TYPE_SHARED, - __uuidof (IDWriteFactory), - (IUnknown**) &dwriteFactory - ); + DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), + (IUnknown**) &dwriteFactory); HRESULT hr; hb_blob_t *blob = hb_face_reference_blob (face); - DWriteFontFileStream *fontFileStream = new DWriteFontFileStream ( - (uint8_t *) hb_blob_get_data (blob, nullptr), - hb_blob_get_length (blob)); + DWriteFontFileStream *fontFileStream; + fontFileStream = new DWriteFontFileStream ((uint8_t *) hb_blob_get_data (blob, nullptr), + hb_blob_get_length (blob)); DWriteFontFileLoader *fontFileLoader = new DWriteFontFileLoader (fontFileStream); dwriteFactory->RegisterFontFileLoader (fontFileLoader); @@ -171,7 +167,7 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) IDWriteFontFile *fontFile; uint64_t fontFileKey = 0; hr = dwriteFactory->CreateCustomFontFileReference (&fontFileKey, sizeof (fontFileKey), - fontFileLoader, &fontFile); + fontFileLoader, &fontFile); #define FAIL(...) \ HB_STMT_START { \ @@ -194,7 +190,7 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) IDWriteFontFace *fontFace; dwriteFactory->CreateFontFace (faceType, 1, &fontFile, 0, - DWRITE_FONT_SIMULATIONS_NONE, &fontFace); + DWRITE_FONT_SIMULATIONS_NONE, &fontFace); data->dwriteFactory = dwriteFactory; data->fontFile = fontFile; @@ -207,7 +203,7 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face) } void -_hb_directwrite_shaper_face_data_destroy (hb_directwrite_shaper_face_data_t *data) +_hb_directwrite_shaper_face_data_destroy (hb_directwrite_face_data_t *data) { if (data->fontFace) data->fontFace->Release (); @@ -234,16 +230,12 @@ _hb_directwrite_shaper_face_data_destroy (hb_directwrite_shaper_face_data_t *dat * shaper font data */ -struct hb_directwrite_shaper_font_data_t -{ -}; +struct hb_directwrite_font_data_t {}; -hb_directwrite_shaper_font_data_t * +hb_directwrite_font_data_t * _hb_directwrite_shaper_font_data_create (hb_font_t *font) { - if (unlikely (!hb_directwrite_shaper_face_data_ensure (font->face))) return nullptr; - - hb_directwrite_shaper_font_data_t *data = new hb_directwrite_shaper_font_data_t; + hb_directwrite_font_data_t *data = new hb_directwrite_font_data_t; if (unlikely (!data)) return nullptr; @@ -251,41 +243,20 @@ _hb_directwrite_shaper_font_data_create (hb_font_t *font) } void -_hb_directwrite_shaper_font_data_destroy (hb_directwrite_shaper_font_data_t *data) +_hb_directwrite_shaper_font_data_destroy (hb_directwrite_font_data_t *data) { delete data; } -/* - * shaper shape_plan data - */ - -struct hb_directwrite_shaper_shape_plan_data_t {}; - -hb_directwrite_shaper_shape_plan_data_t * -_hb_directwrite_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, - const hb_feature_t *user_features HB_UNUSED, - unsigned int num_user_features HB_UNUSED, - const int *coords HB_UNUSED, - unsigned int num_coords HB_UNUSED) -{ - return (hb_directwrite_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; -} - -void -_hb_directwrite_shaper_shape_plan_data_destroy (hb_directwrite_shaper_shape_plan_data_t *data HB_UNUSED) -{ -} - // Most of TextAnalysis is originally written by Bas Schouten for Mozilla project // but now is relicensed to MIT for HarfBuzz use -class TextAnalysis - : public IDWriteTextAnalysisSource, public IDWriteTextAnalysisSink +class TextAnalysis : public IDWriteTextAnalysisSource, public IDWriteTextAnalysisSink { public: - IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) { return S_OK; } + IFACEMETHOD (QueryInterface) (IID const& iid, OUT void** ppObject) + { return S_OK; } IFACEMETHOD_ (ULONG, AddRef) () { return 1; } IFACEMETHOD_ (ULONG, Release) () { return 1; } @@ -302,7 +273,7 @@ public: uint8_t mBidiLevel; bool mIsSideways; - inline bool ContainsTextPosition (uint32_t aTextPosition) const + bool ContainsTextPosition (uint32_t aTextPosition) const { return aTextPosition >= mTextStart && aTextPosition < mTextStart + mTextLength; @@ -312,16 +283,10 @@ public: }; public: - TextAnalysis (const wchar_t* text, - uint32_t textLength, - const wchar_t* localeName, - DWRITE_READING_DIRECTION readingDirection) - : mText (text) - , mTextLength (textLength) - , mLocaleName (localeName) - , mReadingDirection (readingDirection) - , mCurrentRun (nullptr) { }; - + TextAnalysis (const wchar_t* text, uint32_t textLength, + const wchar_t* localeName, DWRITE_READING_DIRECTION readingDirection) + : mTextLength (textLength), mText (text), mLocaleName (localeName), + mReadingDirection (readingDirection), mCurrentRun (nullptr) {} ~TextAnalysis () { // delete runs, except mRunHead which is part of the TextAnalysis object @@ -333,8 +298,8 @@ public: } } - STDMETHODIMP GenerateResults (IDWriteTextAnalyzer* textAnalyzer, - Run **runHead) + STDMETHODIMP + GenerateResults (IDWriteTextAnalyzer* textAnalyzer, Run **runHead) { // Analyzes the text using the script analyzer and returns // the result as a series of runs. @@ -359,9 +324,10 @@ public: // IDWriteTextAnalysisSource implementation - IFACEMETHODIMP GetTextAtPosition (uint32_t textPosition, - OUT wchar_t const** textString, - OUT uint32_t* textLength) + IFACEMETHODIMP + GetTextAtPosition (uint32_t textPosition, + OUT wchar_t const** textString, + OUT uint32_t* textLength) { if (textPosition >= mTextLength) { @@ -377,9 +343,10 @@ public: return S_OK; } - IFACEMETHODIMP GetTextBeforePosition (uint32_t textPosition, - OUT wchar_t const** textString, - OUT uint32_t* textLength) + IFACEMETHODIMP + GetTextBeforePosition (uint32_t textPosition, + OUT wchar_t const** textString, + OUT uint32_t* textLength) { if (textPosition == 0 || textPosition > mTextLength) { @@ -397,19 +364,16 @@ public: } IFACEMETHODIMP_ (DWRITE_READING_DIRECTION) - GetParagraphReadingDirection () { return mReadingDirection; } + GetParagraphReadingDirection () { return mReadingDirection; } - IFACEMETHODIMP GetLocaleName (uint32_t textPosition, - uint32_t* textLength, - wchar_t const** localeName) - { - return S_OK; - } + IFACEMETHODIMP GetLocaleName (uint32_t textPosition, uint32_t* textLength, + wchar_t const** localeName) + { return S_OK; } IFACEMETHODIMP - GetNumberSubstitution (uint32_t textPosition, - OUT uint32_t* textLength, - OUT IDWriteNumberSubstitution** numberSubstitution) + GetNumberSubstitution (uint32_t textPosition, + OUT uint32_t* textLength, + OUT IDWriteNumberSubstitution** numberSubstitution) { // We do not support number substitution. *numberSubstitution = nullptr; @@ -421,9 +385,8 @@ public: // IDWriteTextAnalysisSink implementation IFACEMETHODIMP - SetScriptAnalysis (uint32_t textPosition, - uint32_t textLength, - DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis) + SetScriptAnalysis (uint32_t textPosition, uint32_t textLength, + DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis) { SetCurrentRun (textPosition); SplitCurrentRun (textPosition); @@ -437,19 +400,19 @@ public: } IFACEMETHODIMP - SetLineBreakpoints (uint32_t textPosition, - uint32_t textLength, - const DWRITE_LINE_BREAKPOINT* lineBreakpoints) { return S_OK; } + SetLineBreakpoints (uint32_t textPosition, + uint32_t textLength, + const DWRITE_LINE_BREAKPOINT* lineBreakpoints) + { return S_OK; } - IFACEMETHODIMP SetBidiLevel (uint32_t textPosition, - uint32_t textLength, - uint8_t explicitLevel, - uint8_t resolvedLevel) { return S_OK; } + IFACEMETHODIMP SetBidiLevel (uint32_t textPosition, uint32_t textLength, + uint8_t explicitLevel, uint8_t resolvedLevel) + { return S_OK; } IFACEMETHODIMP - SetNumberSubstitution (uint32_t textPosition, - uint32_t textLength, - IDWriteNumberSubstitution* numberSubstitution) { return S_OK; } + SetNumberSubstitution (uint32_t textPosition, uint32_t textLength, + IDWriteNumberSubstitution* numberSubstitution) + { return S_OK; } protected: Run *FetchNextRun (IN OUT uint32_t* textLength) @@ -549,15 +512,14 @@ static inline uint32_t hb_uint32_swap (const uint32_t v) static hb_bool_t _hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, - hb_font_t *font, - hb_buffer_t *buffer, - const hb_feature_t *features, - unsigned int num_features, - float lineWidth) + hb_font_t *font, + hb_buffer_t *buffer, + const hb_feature_t *features, + unsigned int num_features, + float lineWidth) { hb_face_t *face = font->face; - hb_directwrite_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - hb_directwrite_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font); + const hb_directwrite_face_data_t *face_data = face->data.directwrite; IDWriteFactory *dwriteFactory = face_data->dwriteFactory; IDWriteFontFace *fontFace = face_data->fontFace; @@ -609,9 +571,10 @@ _hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, // TODO: Handle TEST_DISABLE_OPTIONAL_LIGATURES - DWRITE_READING_DIRECTION readingDirection = buffer->props.direction ? - DWRITE_READING_DIRECTION_RIGHT_TO_LEFT : - DWRITE_READING_DIRECTION_LEFT_TO_RIGHT; + DWRITE_READING_DIRECTION readingDirection; + readingDirection = buffer->props.direction ? + DWRITE_READING_DIRECTION_RIGHT_TO_LEFT : + DWRITE_READING_DIRECTION_LEFT_TO_RIGHT; /* * There's an internal 16-bit limit on some things inside the analyzer, @@ -640,10 +603,8 @@ _hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, const wchar_t localeName[20] = {0}; if (buffer->props.language != nullptr) - { mbstowcs ((wchar_t*) localeName, - hb_language_to_string (buffer->props.language), 20); - } + hb_language_to_string (buffer->props.language), 20); // TODO: it does work but doesn't care about ranges DWRITE_TYPOGRAPHIC_FEATURES typographic_features; @@ -654,27 +615,29 @@ _hb_directwrite_shape_full (hb_shape_plan_t *shape_plan, for (unsigned int i = 0; i < num_features; ++i) { typographic_features.features[i].nameTag = (DWRITE_FONT_FEATURE_TAG) - hb_uint32_swap (features[i].tag); + hb_uint32_swap (features[i].tag); typographic_features.features[i].parameter = features[i].value; } } - const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures = - (const DWRITE_TYPOGRAPHIC_FEATURES*) &typographic_features; + const DWRITE_TYPOGRAPHIC_FEATURES* dwFeatures; + dwFeatures = (const DWRITE_TYPOGRAPHIC_FEATURES*) &typographic_features; const uint32_t featureRangeLengths[] = { textLength }; // - uint16_t* clusterMap = new uint16_t[textLength]; - DWRITE_SHAPING_TEXT_PROPERTIES* textProperties = - new DWRITE_SHAPING_TEXT_PROPERTIES[textLength]; + uint16_t* clusterMap; + clusterMap = new uint16_t[textLength]; + DWRITE_SHAPING_TEXT_PROPERTIES* textProperties; + textProperties = new DWRITE_SHAPING_TEXT_PROPERTIES[textLength]; retry_getglyphs: uint16_t* glyphIndices = new uint16_t[maxGlyphCount]; - DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties = - new DWRITE_SHAPING_GLYPH_PROPERTIES[maxGlyphCount]; + DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProperties; + glyphProperties = new DWRITE_SHAPING_GLYPH_PROPERTIES[maxGlyphCount]; hr = analyzer->GetGlyphs (textString, textLength, fontFace, false, - isRightToLeft, &runHead->mScript, localeName, nullptr, &dwFeatures, - featureRangeLengths, 1, maxGlyphCount, clusterMap, textProperties, glyphIndices, - glyphProperties, &glyphCount); + isRightToLeft, &runHead->mScript, localeName, + nullptr, &dwFeatures, featureRangeLengths, 1, + maxGlyphCount, clusterMap, textProperties, + glyphIndices, glyphProperties, &glyphCount); if (unlikely (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER))) { @@ -694,30 +657,28 @@ retry_getglyphs: /* The -2 in the following is to compensate for possible * alignment needed after the WORD array. sizeof (WORD) == 2. */ unsigned int glyphs_size = (scratch_size * sizeof (int) - 2) - / (sizeof (WORD) + - sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) + - sizeof (int) + - sizeof (DWRITE_GLYPH_OFFSET) + - sizeof (uint32_t)); + / (sizeof (WORD) + + sizeof (DWRITE_SHAPING_GLYPH_PROPERTIES) + + sizeof (int) + + sizeof (DWRITE_GLYPH_OFFSET) + + sizeof (uint32_t)); ALLOCATE_ARRAY (uint32_t, vis_clusters, glyphs_size); #undef ALLOCATE_ARRAY int fontEmSize = font->face->get_upem (); - if (fontEmSize < 0) - fontEmSize = -fontEmSize; + if (fontEmSize < 0) fontEmSize = -fontEmSize; - if (fontEmSize < 0) - fontEmSize = -fontEmSize; + if (fontEmSize < 0) fontEmSize = -fontEmSize; double x_mult = (double) font->x_scale / fontEmSize; double y_mult = (double) font->y_scale / fontEmSize; - hr = analyzer->GetGlyphPlacements (textString, - clusterMap, textProperties, textLength, glyphIndices, - glyphProperties, glyphCount, fontFace, fontEmSize, - false, isRightToLeft, &runHead->mScript, localeName, - &dwFeatures, featureRangeLengths, 1, - glyphAdvances, glyphOffsets); + hr = analyzer->GetGlyphPlacements (textString, clusterMap, textProperties, + textLength, glyphIndices, glyphProperties, + glyphCount, fontFace, fontEmSize, + false, isRightToLeft, &runHead->mScript, localeName, + &dwFeatures, featureRangeLengths, 1, + glyphAdvances, glyphOffsets); if (FAILED (hr)) FAIL ("Analyzer failed to get glyph placements."); @@ -727,12 +688,12 @@ retry_getglyphs: if (analyzer1 && lineWidth) { - DWRITE_JUSTIFICATION_OPPORTUNITY* justificationOpportunities = new DWRITE_JUSTIFICATION_OPPORTUNITY[maxGlyphCount]; - hr = analyzer1->GetJustificationOpportunities (fontFace, fontEmSize, - runHead->mScript, textLength, glyphCount, textString, clusterMap, - glyphProperties, justificationOpportunities); + hr = analyzer1->GetJustificationOpportunities (fontFace, fontEmSize, runHead->mScript, + textLength, glyphCount, textString, + clusterMap, glyphProperties, + justificationOpportunities); if (FAILED (hr)) FAIL ("Analyzer failed to get justification opportunities."); @@ -740,15 +701,14 @@ retry_getglyphs: float* justifiedGlyphAdvances = new float[maxGlyphCount]; DWRITE_GLYPH_OFFSET* justifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[glyphCount]; hr = analyzer1->JustifyGlyphAdvances (lineWidth, glyphCount, justificationOpportunities, - glyphAdvances, glyphOffsets, justifiedGlyphAdvances, justifiedGlyphOffsets); + glyphAdvances, glyphOffsets, justifiedGlyphAdvances, + justifiedGlyphOffsets); - if (FAILED (hr)) - FAIL ("Analyzer failed to get justified glyph advances."); + if (FAILED (hr)) FAIL ("Analyzer failed to get justify glyph advances."); DWRITE_SCRIPT_PROPERTIES scriptProperties; hr = analyzer1->GetScriptProperties (runHead->mScript, &scriptProperties); - if (FAILED (hr)) - FAIL ("Analyzer failed to get script properties."); + if (FAILED (hr)) FAIL ("Analyzer failed to get script properties."); uint32_t justificationCharacter = scriptProperties.justificationCharacter; // if a script justificationCharacter is not space, it can have GetJustifiedGlyphs @@ -758,14 +718,15 @@ retry_getglyphs: retry_getjustifiedglyphs: uint16_t* modifiedGlyphIndices = new uint16_t[maxGlyphCount]; float* modifiedGlyphAdvances = new float[maxGlyphCount]; - DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = - new DWRITE_GLYPH_OFFSET[maxGlyphCount]; + DWRITE_GLYPH_OFFSET* modifiedGlyphOffsets = new DWRITE_GLYPH_OFFSET[maxGlyphCount]; uint32_t actualGlyphsCount; hr = analyzer1->GetJustifiedGlyphs (fontFace, fontEmSize, runHead->mScript, - textLength, glyphCount, maxGlyphCount, clusterMap, glyphIndices, - glyphAdvances, justifiedGlyphAdvances, justifiedGlyphOffsets, - glyphProperties, &actualGlyphsCount, modifiedClusterMap, modifiedGlyphIndices, - modifiedGlyphAdvances, modifiedGlyphOffsets); + textLength, glyphCount, maxGlyphCount, + clusterMap, glyphIndices, glyphAdvances, + justifiedGlyphAdvances, justifiedGlyphOffsets, + glyphProperties, &actualGlyphsCount, + modifiedClusterMap, modifiedGlyphIndices, + modifiedGlyphAdvances, modifiedGlyphOffsets); if (hr == HRESULT_FROM_WIN32 (ERROR_INSUFFICIENT_BUFFER)) { @@ -805,7 +766,6 @@ retry_getglyphs: } delete [] justificationOpportunities; - } /* Ok, we've got everything we need, now compose output buffer, @@ -813,7 +773,7 @@ retry_getglyphs: /* Calculate visual-clusters. That's what we ship. */ for (unsigned int i = 0; i < glyphCount; i++) - vis_clusters[i] = -1; + vis_clusters[i] = (uint32_t) -1; for (unsigned int i = 0; i < buffer->len; i++) { uint32_t *p = @@ -821,7 +781,7 @@ retry_getglyphs: *p = MIN (*p, buffer->info[i].cluster); } for (unsigned int i = 1; i < glyphCount; i++) - if (vis_clusters[i] == -1) + if (vis_clusters[i] == (uint32_t) -1) vis_clusters[i] = vis_clusters[i - 1]; #undef utf16_index @@ -855,13 +815,11 @@ retry_getglyphs: /* TODO vertical */ pos->x_advance = x_mult * (int32_t) info->mask; - pos->x_offset = - x_mult * (isRightToLeft ? -info->var1.i32 : info->var1.i32); + pos->x_offset = x_mult * (isRightToLeft ? -info->var1.i32 : info->var1.i32); pos->y_offset = y_mult * info->var2.i32; } - if (isRightToLeft) - hb_buffer_reverse (buffer); + if (isRightToLeft) hb_buffer_reverse (buffer); delete [] clusterMap; delete [] glyphIndices; @@ -879,13 +837,13 @@ retry_getglyphs: hb_bool_t _hb_directwrite_shape (hb_shape_plan_t *shape_plan, - hb_font_t *font, - hb_buffer_t *buffer, - const hb_feature_t *features, - unsigned int num_features) + hb_font_t *font, + hb_buffer_t *buffer, + const hb_feature_t *features, + unsigned int num_features) { return _hb_directwrite_shape_full (shape_plan, font, buffer, - features, num_features, 0); + features, num_features, 0); } /* @@ -894,16 +852,17 @@ _hb_directwrite_shape (hb_shape_plan_t *shape_plan, hb_bool_t hb_directwrite_shape_experimental_width (hb_font_t *font, - hb_buffer_t *buffer, - const hb_feature_t *features, - unsigned int num_features, - float width) + hb_buffer_t *buffer, + const hb_feature_t *features, + unsigned int num_features, + float width) { static const char *shapers = "directwrite"; - hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached (font->face, - &buffer->props, features, num_features, &shapers); + hb_shape_plan_t *shape_plan; + shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props, + features, num_features, &shapers); hb_bool_t res = _hb_directwrite_shape_full (shape_plan, font, buffer, - features, num_features, width); + features, num_features, width); buffer->unsafe_to_break_all (); diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index 9586871..cb3057c 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -27,9 +27,348 @@ #ifndef HB_DSALGS_HH #define HB_DSALGS_HH -#include "hb-private.hh" +#include "hb.hh" +#include "hb-null.hh" +/* Void! For when we need a expression-type of void. */ +typedef const struct _hb_void_t *hb_void_t; +#define HB_VOID ((const _hb_void_t *) nullptr) + + +/* + * Bithacks. + */ + +/* Return the number of 1 bits in v. */ +template +static inline HB_CONST_FUNC unsigned int +hb_popcount (T v) +{ +#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) + if (sizeof (T) <= sizeof (unsigned int)) + return __builtin_popcount (v); + + if (sizeof (T) <= sizeof (unsigned long)) + return __builtin_popcountl (v); + + if (sizeof (T) <= sizeof (unsigned long long)) + return __builtin_popcountll (v); +#endif + + if (sizeof (T) <= 4) + { + /* "HACKMEM 169" */ + uint32_t y; + y = (v >> 1) &033333333333; + y = v - y - ((y >>1) & 033333333333); + return (((y + (y >> 3)) & 030707070707) % 077); + } + + if (sizeof (T) == 8) + { + unsigned int shift = 32; + return hb_popcount ((uint32_t) v) + hb_popcount ((uint32_t) (v >> shift)); + } + + if (sizeof (T) == 16) + { + unsigned int shift = 64; + return hb_popcount ((uint64_t) v) + hb_popcount ((uint64_t) (v >> shift)); + } + + assert (0); + return 0; /* Shut up stupid compiler. */ +} + +/* Returns the number of bits needed to store number */ +template +static inline HB_CONST_FUNC unsigned int +hb_bit_storage (T v) +{ + if (unlikely (!v)) return 0; + +#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) + if (sizeof (T) <= sizeof (unsigned int)) + return sizeof (unsigned int) * 8 - __builtin_clz (v); + + if (sizeof (T) <= sizeof (unsigned long)) + return sizeof (unsigned long) * 8 - __builtin_clzl (v); + + if (sizeof (T) <= sizeof (unsigned long long)) + return sizeof (unsigned long long) * 8 - __builtin_clzll (v); +#endif + +#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__) + if (sizeof (T) <= sizeof (unsigned int)) + { + unsigned long where; + _BitScanReverse (&where, v); + return 1 + where; + } +# if defined(_WIN64) + if (sizeof (T) <= 8) + { + unsigned long where; + _BitScanReverse64 (&where, v); + return 1 + where; + } +# endif +#endif + + if (sizeof (T) <= 4) + { + /* "bithacks" */ + const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000}; + const unsigned int S[] = {1, 2, 4, 8, 16}; + unsigned int r = 0; + for (int i = 4; i >= 0; i--) + if (v & b[i]) + { + v >>= S[i]; + r |= S[i]; + } + return r + 1; + } + if (sizeof (T) <= 8) + { + /* "bithacks" */ + const uint64_t b[] = {0x2ULL, 0xCULL, 0xF0ULL, 0xFF00ULL, 0xFFFF0000ULL, 0xFFFFFFFF00000000ULL}; + const unsigned int S[] = {1, 2, 4, 8, 16, 32}; + unsigned int r = 0; + for (int i = 5; i >= 0; i--) + if (v & b[i]) + { + v >>= S[i]; + r |= S[i]; + } + return r + 1; + } + if (sizeof (T) == 16) + { + unsigned int shift = 64; + return (v >> shift) ? hb_bit_storage ((uint64_t) (v >> shift)) + shift : + hb_bit_storage ((uint64_t) v); + } + + assert (0); + return 0; /* Shut up stupid compiler. */ +} + +/* Returns the number of zero bits in the least significant side of v */ +template +static inline HB_CONST_FUNC unsigned int +hb_ctz (T v) +{ + if (unlikely (!v)) return 0; + +#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) + if (sizeof (T) <= sizeof (unsigned int)) + return __builtin_ctz (v); + + if (sizeof (T) <= sizeof (unsigned long)) + return __builtin_ctzl (v); + + if (sizeof (T) <= sizeof (unsigned long long)) + return __builtin_ctzll (v); +#endif + +#if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__) + if (sizeof (T) <= sizeof (unsigned int)) + { + unsigned long where; + _BitScanForward (&where, v); + return where; + } +# if defined(_WIN64) + if (sizeof (T) <= 8) + { + unsigned long where; + _BitScanForward64 (&where, v); + return where; + } +# endif +#endif + + if (sizeof (T) <= 4) + { + /* "bithacks" */ + unsigned int c = 32; + v &= - (int32_t) v; + if (v) c--; + if (v & 0x0000FFFF) c -= 16; + if (v & 0x00FF00FF) c -= 8; + if (v & 0x0F0F0F0F) c -= 4; + if (v & 0x33333333) c -= 2; + if (v & 0x55555555) c -= 1; + return c; + } + if (sizeof (T) <= 8) + { + /* "bithacks" */ + unsigned int c = 64; + v &= - (int64_t) (v); + if (v) c--; + if (v & 0x00000000FFFFFFFFULL) c -= 32; + if (v & 0x0000FFFF0000FFFFULL) c -= 16; + if (v & 0x00FF00FF00FF00FFULL) c -= 8; + if (v & 0x0F0F0F0F0F0F0F0FULL) c -= 4; + if (v & 0x3333333333333333ULL) c -= 2; + if (v & 0x5555555555555555ULL) c -= 1; + return c; + } + if (sizeof (T) == 16) + { + unsigned int shift = 64; + return (uint64_t) v ? hb_bit_storage ((uint64_t) v) : + hb_bit_storage ((uint64_t) (v >> shift)) + shift; + } + + assert (0); + return 0; /* Shut up stupid compiler. */ +} + + +/* + * Tiny stuff. + */ + +template +static inline T* hb_addressof (T& arg) +{ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" + /* https://en.cppreference.com/w/cpp/memory/addressof */ + return reinterpret_cast( + &const_cast( + reinterpret_cast(arg))); +#pragma GCC diagnostic pop +} + +/* ASCII tag/character handling */ +static inline bool ISALPHA (unsigned char c) +{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); } +static inline bool ISALNUM (unsigned char c) +{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'); } +static inline bool ISSPACE (unsigned char c) +{ return c == ' ' || c =='\f'|| c =='\n'|| c =='\r'|| c =='\t'|| c =='\v'; } +static inline unsigned char TOUPPER (unsigned char c) +{ return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; } +static inline unsigned char TOLOWER (unsigned char c) +{ return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; } + +#undef MIN +template +static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; } + +#undef MAX +template +static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; } + +static inline unsigned int DIV_CEIL (const unsigned int a, unsigned int b) +{ return (a + (b - 1)) / b; } + + +#undef ARRAY_LENGTH +template +static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; } +/* A const version, but does not detect erratically being called on pointers. */ +#define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0]))) + + +static inline int +hb_memcmp (const void *a, const void *b, unsigned int len) +{ + /* It's illegal to pass NULL to memcmp(), even if len is zero. + * So, wrap it. + * https://sourceware.org/bugzilla/show_bug.cgi?id=23878 */ + if (!len) return 0; + return memcmp (a, b, len); +} + +static inline bool +hb_unsigned_mul_overflows (unsigned int count, unsigned int size) +{ + return (size > 0) && (count >= ((unsigned int) -1) / size); +} + +static inline unsigned int +hb_ceil_to_4 (unsigned int v) +{ + return ((v - 1) | 3) + 1; +} + +template struct hb_is_signed; +template <> struct hb_is_signed { enum { value = true }; }; +template <> struct hb_is_signed { enum { value = true }; }; +template <> struct hb_is_signed { enum { value = true }; }; +template <> struct hb_is_signed { enum { value = true }; }; +template <> struct hb_is_signed { enum { value = false }; }; +template <> struct hb_is_signed { enum { value = false }; }; +template <> struct hb_is_signed { enum { value = false }; }; +template <> struct hb_is_signed { enum { value = false }; }; +/* We need to define hb_is_signed for the typedefs we use on pre-Visual + * Studio 2010 for the int8_t type, since __int8/__int64 is not considered + * the same as char/long. The previous lines will suffice for the other + * types, though. Note that somehow, unsigned __int8 is considered same + * as unsigned char. + * https://github.com/harfbuzz/harfbuzz/pull/1499 + */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) +template <> struct hb_is_signed<__int8> { enum { value = true }; }; +#endif + +template static inline bool +hb_in_range (T u, T lo, T hi) +{ + /* The sizeof() is here to force template instantiation. + * I'm sure there are better ways to do this but can't think of + * one right now. Declaring a variable won't work as HB_UNUSED + * is unusable on some platforms and unused types are less likely + * to generate a warning than unused variables. */ + static_assert (!hb_is_signed::value, ""); + + /* The casts below are important as if T is smaller than int, + * the subtract results will become a signed int! */ + return (T)(u - lo) <= (T)(hi - lo); +} +template static inline bool +hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2) +{ + return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2); +} +template static inline bool +hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) +{ + return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3); +} + + +/* + * Sort and search. + */ + +static inline void * +hb_bsearch (const void *key, const void *base, + size_t nmemb, size_t size, + int (*compar)(const void *_key, const void *_item)) +{ + int min = 0, max = (int) nmemb - 1; + while (min <= max) + { + int mid = (min + max) / 2; + const void *p = (const void *) (((const char *) base) + (mid * size)); + int c = compar (key, p); + if (c < 0) + max = mid - 1; + else if (c > 0) + min = mid + 1; + else + return (void *) p; + } + return nullptr; +} + static inline void * hb_bsearch_r (const void *key, const void *base, size_t nmemb, size_t size, @@ -39,7 +378,7 @@ hb_bsearch_r (const void *key, const void *base, int min = 0, max = (int) nmemb - 1; while (min <= max) { - int mid = (min + max) / 2; + int mid = ((unsigned int) min + (unsigned int) max) / 2; const void *p = (const void *) (((const char *) base) + (mid * size)); int c = compar (key, p, arg); if (c < 0) @@ -53,8 +392,12 @@ hb_bsearch_r (const void *key, const void *base, } - -/* From https://github.com/noporpoise/sort_r */ +/* From https://github.com/noporpoise/sort_r + * With following modifications: + * + * 10 November 2018: + * https://github.com/noporpoise/sort_r/issues/7 + */ /* Isaac Turner 29 April 2014 Public Domain */ @@ -110,7 +453,7 @@ static inline void sort_r_simple(void *base, size_t nel, size_t w, /* Use median of first, middle and last items as pivot */ char *x, *y, *xend, ch; - char *pl, *pr; + char *pl, *pm, *pr; char *last = b+w*(nel-1), *tmp; char *l[3]; l[0] = b; @@ -132,13 +475,15 @@ static inline void sort_r_simple(void *base, size_t nel, size_t w, pr = last; while(pl < pr) { - for(; pl < pr; pl += w) { + pm = pl+((pr-pl+1)>>1); + for(; pl < pm; pl += w) { if(sort_r_cmpswap(pl, pr, w, compar, arg)) { pr -= w; /* pivot now at pl */ break; } } - for(; pl < pr; pr -= w) { + pm = pl+((pr-pl)>>1); + for(; pm < pr; pr -= w) { if(sort_r_cmpswap(pl, pr, w, compar, arg)) { pl += w; /* pivot now at pr */ break; @@ -158,4 +503,139 @@ static inline void hb_sort_r(void *base, size_t nel, size_t width, sort_r_simple(base, nel, width, compar, arg); } + +template static inline void +hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *), T2 *array2) +{ + for (unsigned int i = 1; i < len; i++) + { + unsigned int j = i; + while (j && compar (&array[j - 1], &array[i]) > 0) + j--; + if (i == j) + continue; + /* Move item i to occupy place for item j, shift what's in between. */ + { + T t = array[i]; + memmove (&array[j + 1], &array[j], (i - j) * sizeof (T)); + array[j] = t; + } + if (array2) + { + T2 t = array2[i]; + memmove (&array2[j + 1], &array2[j], (i - j) * sizeof (T2)); + array2[j] = t; + } + } +} + +template static inline void +hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *)) +{ + hb_stable_sort (array, len, compar, (int *) nullptr); +} + +static inline hb_bool_t +hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *out) +{ + /* Pain because we don't know whether s is nul-terminated. */ + char buf[64]; + len = MIN (ARRAY_LENGTH (buf) - 1, len); + strncpy (buf, s, len); + buf[len] = '\0'; + + char *end; + errno = 0; + unsigned long v = strtoul (buf, &end, base); + if (errno) return false; + if (*end) return false; + *out = v; + return true; +} + + +struct HbOpOr +{ + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = true; + template static void process (T &o, const T &a, const T &b) { o = a | b; } +}; +struct HbOpAnd +{ + static constexpr bool passthru_left = false; + static constexpr bool passthru_right = false; + template static void process (T &o, const T &a, const T &b) { o = a & b; } +}; +struct HbOpMinus +{ + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = false; + template static void process (T &o, const T &a, const T &b) { o = a & ~b; } +}; +struct HbOpXor +{ + static constexpr bool passthru_left = true; + static constexpr bool passthru_right = true; + template static void process (T &o, const T &a, const T &b) { o = a ^ b; } +}; + + +/* Compiler-assisted vectorization. */ + +/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))), + * using vectorized operations if HB_VECTOR_SIZE is set to **bit** numbers (eg 128). + * Define that to 0 to disable. */ +template +struct hb_vector_size_t +{ + elt_t& operator [] (unsigned int i) { return u.v[i]; } + const elt_t& operator [] (unsigned int i) const { return u.v[i]; } + + void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); } + + template + hb_vector_size_t process (const hb_vector_size_t &o) const + { + hb_vector_size_t r; +#if HB_VECTOR_SIZE + if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) + for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) + Op::process (r.u.vec[i], u.vec[i], o.u.vec[i]); + else +#endif + for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) + Op::process (r.u.v[i], u.v[i], o.u.v[i]); + return r; + } + hb_vector_size_t operator | (const hb_vector_size_t &o) const + { return process (o); } + hb_vector_size_t operator & (const hb_vector_size_t &o) const + { return process (o); } + hb_vector_size_t operator ^ (const hb_vector_size_t &o) const + { return process (o); } + hb_vector_size_t operator ~ () const + { + hb_vector_size_t r; +#if HB_VECTOR_SIZE && 0 + if (HB_VECTOR_SIZE && 0 == (byte_size * 8) % HB_VECTOR_SIZE) + for (unsigned int i = 0; i < ARRAY_LENGTH (u.vec); i++) + r.u.vec[i] = ~u.vec[i]; + else +#endif + for (unsigned int i = 0; i < ARRAY_LENGTH (u.v); i++) + r.u.v[i] = ~u.v[i]; + return r; + } + + private: + static_assert (byte_size / sizeof (elt_t) * sizeof (elt_t) == byte_size, ""); + union { + elt_t v[byte_size / sizeof (elt_t)]; +#if HB_VECTOR_SIZE + hb_vector_size_impl_t vec[byte_size / sizeof (hb_vector_size_impl_t)]; +#endif + } u; +}; + + #endif /* HB_DSALGS_HH */ diff --git a/src/hb-face-private.hh b/src/hb-face-private.hh deleted file mode 100644 index 43e7b1c..0000000 --- a/src/hb-face-private.hh +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright © 2009 Red Hat, Inc. - * Copyright © 2011 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_FACE_PRIVATE_HH -#define HB_FACE_PRIVATE_HH - -#include "hb-private.hh" - -#include "hb-object-private.hh" -#include "hb-shaper-private.hh" -#include "hb-shape-plan-private.hh" - - -/* - * hb_face_t - */ - -struct hb_face_t { - hb_object_header_t header; - ASSERT_POD (); - - hb_bool_t immutable; - - hb_reference_table_func_t reference_table_func; - void *user_data; - hb_destroy_func_t destroy; - - unsigned int index; /* Face index in a collection, zero-based. */ - mutable unsigned int upem; /* Units-per-EM. */ - mutable unsigned int num_glyphs; /* Number of glyphs. */ - - struct hb_shaper_data_t shaper_data; /* Various shaper data. */ - - /* Various non-shaping data. */ - /* ... */ - - /* Cache */ - struct plan_node_t { - hb_shape_plan_t *shape_plan; - plan_node_t *next; - } *shape_plans; - - - inline hb_blob_t *reference_table (hb_tag_t tag) const - { - hb_blob_t *blob; - - if (unlikely (!reference_table_func)) - return hb_blob_get_empty (); - - blob = reference_table_func (/*XXX*/const_cast (this), tag, user_data); - if (unlikely (!blob)) - return hb_blob_get_empty (); - - return blob; - } - - inline HB_PURE_FUNC unsigned int get_upem (void) const - { - if (unlikely (!upem)) - load_upem (); - return upem; - } - - inline unsigned int get_num_glyphs (void) const - { - if (unlikely (num_glyphs == (unsigned int) -1)) - load_num_glyphs (); - return num_glyphs; - } - - private: - HB_INTERNAL void load_upem (void) const; - HB_INTERNAL void load_num_glyphs (void) const; -}; - -extern HB_INTERNAL const hb_face_t _hb_face_nil; - -#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS -#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face); -#include "hb-shaper-list.hh" -#undef HB_SHAPER_IMPLEMENT -#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS - - -#endif /* HB_FACE_PRIVATE_HH */ diff --git a/src/hb-face.cc b/src/hb-face.cc index 2fef09d..375ef92 100644 --- a/src/hb-face.cc +++ b/src/hb-face.cc @@ -26,23 +26,35 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" +#include "hb.hh" -#include "hb-face-private.hh" -#include "hb-blob-private.hh" -#include "hb-open-file-private.hh" -#include "hb-ot-head-table.hh" -#include "hb-ot-maxp-table.hh" +#include "hb-face.hh" +#include "hb-blob.hh" +#include "hb-open-file.hh" +#include "hb-ot-face.hh" +#include "hb-ot-cmap-table.hh" +/** + * SECTION:hb-face + * @title: hb-face + * @short_description: Font face objects + * @include: hb.h + * + * Font face is objects represent a single face in a font family. + * More exactly, a font face represents a single face in a binary font file. + * Font faces are typically built from a binary blob and a face index. + * Font faces are used to create fonts. + **/ + /** - * hb_face_count: Get number of faces on the blob - * @blob: + * hb_face_count: + * @blob: a blob. * + * Get number of faces in a blob. * - * - * Return value: Number of faces on the blob + * Return value: Number of faces in @blob * * Since: 1.7.7 **/ @@ -52,36 +64,33 @@ hb_face_count (hb_blob_t *blob) if (unlikely (!blob)) return 0; - hb_blob_t *sanitized = OT::Sanitizer ().sanitize (blob); + /* TODO We shouldn't be sanitizing blob. Port to run sanitizer and return if not sane. */ + /* Make API signature const after. */ + hb_blob_t *sanitized = hb_sanitize_context_t ().sanitize_blob (hb_blob_reference (blob)); const OT::OpenTypeFontFile& ot = *sanitized->as (); + unsigned int ret = ot.get_face_count (); + hb_blob_destroy (sanitized); - return ot.get_face_count (); + return ret; } /* * hb_face_t */ -const hb_face_t _hb_face_nil = { +DEFINE_NULL_INSTANCE (hb_face_t) = +{ HB_OBJECT_HEADER_STATIC, - true, /* immutable */ - nullptr, /* reference_table_func */ nullptr, /* user_data */ nullptr, /* destroy */ 0, /* index */ - 1000, /* upem */ - 0, /* num_glyphs */ + HB_ATOMIC_INT_INIT (1000), /* upem */ + HB_ATOMIC_INT_INIT (0), /* num_glyphs */ - { -#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, -#include "hb-shaper-list.hh" -#undef HB_SHAPER_IMPLEMENT - }, - - nullptr, /* shape_plans */ + /* Zero for the rest is fine. */ }; @@ -114,8 +123,10 @@ hb_face_create_for_tables (hb_reference_table_func_t reference_table_func, face->user_data = user_data; face->destroy = destroy; - face->upem = 0; - face->num_glyphs = (unsigned int) -1; + face->num_glyphs.set_relaxed (-1); + + face->data.init0 (face); + face->table.init0 (face); return face; } @@ -159,11 +170,12 @@ _hb_face_for_data_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void return hb_blob_reference (data->blob); const OT::OpenTypeFontFile &ot_file = *data->blob->as (); - const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index); + unsigned int base_offset; + const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index, &base_offset); const OT::OpenTypeTable &table = ot_face.get_table_by_tag (tag); - hb_blob_t *blob = hb_blob_create_sub_blob (data->blob, table.offset, table.length); + hb_blob_t *blob = hb_blob_create_sub_blob (data->blob, base_offset + table.offset, table.length); return blob; } @@ -188,7 +200,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().sanitize (hb_blob_reference (blob)), index); + hb_face_for_data_closure_t *closure = _hb_face_for_data_closure_create (hb_sanitize_context_t ().sanitize_blob (hb_blob_reference (blob)), index); if (unlikely (!closure)) return hb_face_get_empty (); @@ -212,9 +224,9 @@ hb_face_create (hb_blob_t *blob, * Since: 0.9.2 **/ hb_face_t * -hb_face_get_empty (void) +hb_face_get_empty () { - return const_cast (&_hb_face_nil); + return const_cast (&Null(hb_face_t)); } @@ -255,9 +267,8 @@ hb_face_destroy (hb_face_t *face) node = next; } -#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, face); -#include "hb-shaper-list.hh" -#undef HB_SHAPER_IMPLEMENT + face->data.fini (); + face->table.fini (); if (face->destroy) face->destroy (face->user_data); @@ -301,7 +312,7 @@ hb_face_set_user_data (hb_face_t *face, * Since: 0.9.2 **/ void * -hb_face_get_user_data (hb_face_t *face, +hb_face_get_user_data (const hb_face_t *face, hb_user_data_key_t *key) { return hb_object_get_user_data (face, key); @@ -318,10 +329,10 @@ hb_face_get_user_data (hb_face_t *face, void hb_face_make_immutable (hb_face_t *face) { - if (unlikely (hb_object_is_inert (face))) + if (hb_object_is_immutable (face)) return; - face->immutable = true; + hb_object_make_immutable (face); } /** @@ -335,9 +346,9 @@ hb_face_make_immutable (hb_face_t *face) * Since: 0.9.2 **/ hb_bool_t -hb_face_is_immutable (hb_face_t *face) +hb_face_is_immutable (const hb_face_t *face) { - return face->immutable; + return hb_object_is_immutable (face); } @@ -353,8 +364,8 @@ hb_face_is_immutable (hb_face_t *face) * Since: 0.9.2 **/ hb_blob_t * -hb_face_reference_table (hb_face_t *face, - hb_tag_t tag) +hb_face_reference_table (const hb_face_t *face, + hb_tag_t tag) { return face->reference_table (tag); } @@ -388,7 +399,7 @@ void hb_face_set_index (hb_face_t *face, unsigned int index) { - if (face->immutable) + if (hb_object_is_immutable (face)) return; face->index = index; @@ -405,7 +416,7 @@ hb_face_set_index (hb_face_t *face, * Since: 0.9.2 **/ unsigned int -hb_face_get_index (hb_face_t *face) +hb_face_get_index (const hb_face_t *face) { return face->index; } @@ -423,10 +434,10 @@ void hb_face_set_upem (hb_face_t *face, unsigned int upem) { - if (face->immutable) + if (hb_object_is_immutable (face)) return; - face->upem = upem; + face->upem.set_relaxed (upem); } /** @@ -440,20 +451,11 @@ hb_face_set_upem (hb_face_t *face, * Since: 0.9.2 **/ unsigned int -hb_face_get_upem (hb_face_t *face) +hb_face_get_upem (const hb_face_t *face) { return face->get_upem (); } -void -hb_face_t::load_upem (void) const -{ - hb_blob_t *head_blob = OT::Sanitizer().sanitize (reference_table (HB_OT_TAG_head)); - const OT::head *head_table = head_blob->as (); - upem = head_table->get_upem (); - hb_blob_destroy (head_blob); -} - /** * hb_face_set_glyph_count: * @face: a face. @@ -467,10 +469,10 @@ void hb_face_set_glyph_count (hb_face_t *face, unsigned int glyph_count) { - if (face->immutable) + if (hb_object_is_immutable (face)) return; - face->num_glyphs = glyph_count; + face->num_glyphs.set_relaxed (glyph_count); } /** @@ -484,23 +486,17 @@ hb_face_set_glyph_count (hb_face_t *face, * Since: 0.9.7 **/ unsigned int -hb_face_get_glyph_count (hb_face_t *face) +hb_face_get_glyph_count (const hb_face_t *face) { return face->get_num_glyphs (); } -void -hb_face_t::load_num_glyphs (void) const -{ - hb_blob_t *maxp_blob = OT::Sanitizer().sanitize (reference_table (HB_OT_TAG_maxp)); - const OT::maxp *maxp_table = maxp_blob->as (); - num_glyphs = maxp_table->get_num_glyphs (); - hb_blob_destroy (maxp_blob); -} - /** * hb_face_get_table_tags: * @face: a face. + * @start_offset: index of first tag to return. + * @table_count: input length of @table_tags array, output number of items written. + * @table_tags: array to write tags into. * * Retrieves table tags for a face, if possible. * @@ -509,7 +505,7 @@ hb_face_t::load_num_glyphs (void) const * Since: 1.6.0 **/ unsigned int -hb_face_get_table_tags (hb_face_t *face, +hb_face_get_table_tags (const hb_face_t *face, unsigned int start_offset, unsigned int *table_count, /* IN/OUT */ hb_tag_t *table_tags /* OUT */) @@ -528,3 +524,200 @@ hb_face_get_table_tags (hb_face_t *face, return ot_face.get_table_tags (start_offset, table_count, table_tags); } + + +/* + * Character set. + */ + + +/** + * hb_face_collect_unicodes: + * @face: font face. + * @out: set to add Unicode characters covered by @face to. + * + * Since: 1.9.0 + */ +void +hb_face_collect_unicodes (hb_face_t *face, + hb_set_t *out) +{ + face->table.cmap->collect_unicodes (out); +} + +/** + * hb_face_collect_variation_selectors: + * @face: font face. + * @out: set to add Variation Selector characters covered by @face to. + * + * + * + * Since: 1.9.0 + */ +void +hb_face_collect_variation_selectors (hb_face_t *face, + hb_set_t *out) +{ + face->table.cmap->collect_variation_selectors (out); +} + +/** + * hb_face_collect_variation_unicodes: + * @face: font face. + * @out: set to add Unicode characters for @variation_selector covered by @face to. + * + * + * + * Since: 1.9.0 + */ +void +hb_face_collect_variation_unicodes (hb_face_t *face, + hb_codepoint_t variation_selector, + hb_set_t *out) +{ + face->table.cmap->collect_variation_unicodes (variation_selector, out); +} + + + +/* + * face-builder: A face that has add_table(). + */ + +struct hb_face_builder_data_t +{ + struct table_entry_t + { + int cmp (hb_tag_t t) const + { + if (t < tag) return -1; + if (t > tag) return -1; + return 0; + } + + hb_tag_t tag; + hb_blob_t *blob; + }; + + hb_vector_t tables; +}; + +static hb_face_builder_data_t * +_hb_face_builder_data_create () +{ + hb_face_builder_data_t *data = (hb_face_builder_data_t *) calloc (1, sizeof (hb_face_builder_data_t)); + if (unlikely (!data)) + return nullptr; + + data->tables.init (); + + return data; +} + +static void +_hb_face_builder_data_destroy (void *user_data) +{ + hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data; + + for (unsigned int i = 0; i < data->tables.length; i++) + hb_blob_destroy (data->tables[i].blob); + + data->tables.fini (); + + free (data); +} + +static hb_blob_t * +_hb_face_builder_data_reference_blob (hb_face_builder_data_t *data) +{ + + unsigned int table_count = data->tables.length; + unsigned int face_length = table_count * 16 + 12; + + for (unsigned int i = 0; i < table_count; i++) + face_length += hb_ceil_to_4 (hb_blob_get_length (data->tables[i].blob)); + + char *buf = (char *) malloc (face_length); + if (unlikely (!buf)) + return nullptr; + + hb_serialize_context_t c (buf, face_length); + c.propagate_error (data->tables); + OT::OpenTypeFontFile *f = c.start_serialize (); + + bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2')); + hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag; + + bool ret = f->serialize_single (&c, sfnt_tag, data->tables.as_array ()); + + c.end_serialize (); + + if (unlikely (!ret)) + { + free (buf); + return nullptr; + } + + return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, free); +} + +static hb_blob_t * +_hb_face_builder_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) +{ + hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data; + + if (!tag) + return _hb_face_builder_data_reference_blob (data); + + hb_face_builder_data_t::table_entry_t *entry = data->tables.lsearch (tag); + if (entry) + return hb_blob_reference (entry->blob); + + return nullptr; +} + + +/** + * hb_face_builder_create: + * + * Creates a #hb_face_t that can be used with hb_face_builder_add_table(). + * After tables are added to the face, it can be compiled to a binary + * font file by calling hb_face_reference_blob(). + * + * Return value: (transfer full): New face. + * + * Since: 1.9.0 + **/ +hb_face_t * +hb_face_builder_create () +{ + hb_face_builder_data_t *data = _hb_face_builder_data_create (); + if (unlikely (!data)) return hb_face_get_empty (); + + return hb_face_create_for_tables (_hb_face_builder_reference_table, + data, + _hb_face_builder_data_destroy); +} + +/** + * hb_face_builder_add_table: + * + * Add table for @tag with data provided by @blob to the face. @face must + * be created using hb_face_builder_create(). + * + * Since: 1.9.0 + **/ +hb_bool_t +hb_face_builder_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob) +{ + if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy)) + return false; + + hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data; + hb_face_builder_data_t::table_entry_t *entry = data->tables.push (); + + entry->tag = tag; + entry->blob = hb_blob_reference (blob); + + return true; +} diff --git a/src/hb-face.h b/src/hb-face.h index 983ee56..e8ff090 100644 --- a/src/hb-face.h +++ b/src/hb-face.h @@ -33,6 +33,7 @@ #include "hb-common.h" #include "hb-blob.h" +#include "hb-set.h" HB_BEGIN_DECLS @@ -76,19 +77,19 @@ hb_face_set_user_data (hb_face_t *face, hb_bool_t replace); HB_EXTERN void * -hb_face_get_user_data (hb_face_t *face, +hb_face_get_user_data (const hb_face_t *face, hb_user_data_key_t *key); HB_EXTERN void hb_face_make_immutable (hb_face_t *face); HB_EXTERN hb_bool_t -hb_face_is_immutable (hb_face_t *face); +hb_face_is_immutable (const hb_face_t *face); HB_EXTERN hb_blob_t * -hb_face_reference_table (hb_face_t *face, - hb_tag_t tag); +hb_face_reference_table (const hb_face_t *face, + hb_tag_t tag); HB_EXTERN hb_blob_t * hb_face_reference_blob (hb_face_t *face); @@ -98,28 +99,60 @@ hb_face_set_index (hb_face_t *face, unsigned int index); HB_EXTERN unsigned int -hb_face_get_index (hb_face_t *face); +hb_face_get_index (const hb_face_t *face); HB_EXTERN void hb_face_set_upem (hb_face_t *face, unsigned int upem); HB_EXTERN unsigned int -hb_face_get_upem (hb_face_t *face); +hb_face_get_upem (const hb_face_t *face); HB_EXTERN void hb_face_set_glyph_count (hb_face_t *face, unsigned int glyph_count); HB_EXTERN unsigned int -hb_face_get_glyph_count (hb_face_t *face); +hb_face_get_glyph_count (const hb_face_t *face); HB_EXTERN unsigned int -hb_face_get_table_tags (hb_face_t *face, +hb_face_get_table_tags (const hb_face_t *face, unsigned int start_offset, unsigned int *table_count, /* IN/OUT */ hb_tag_t *table_tags /* OUT */); + +/* + * Character set. + */ + +HB_EXTERN void +hb_face_collect_unicodes (hb_face_t *face, + hb_set_t *out); + +HB_EXTERN void +hb_face_collect_variation_selectors (hb_face_t *face, + hb_set_t *out); + +HB_EXTERN void +hb_face_collect_variation_unicodes (hb_face_t *face, + hb_codepoint_t variation_selector, + hb_set_t *out); + + +/* + * Builder face. + */ + +HB_EXTERN hb_face_t * +hb_face_builder_create (void); + +HB_EXTERN hb_bool_t +hb_face_builder_add_table (hb_face_t *face, + hb_tag_t tag, + hb_blob_t *blob); + + HB_END_DECLS #endif /* HB_FACE_H */ diff --git a/src/hb-face.hh b/src/hb-face.hh new file mode 100644 index 0000000..68834ba --- /dev/null +++ b/src/hb-face.hh @@ -0,0 +1,109 @@ +/* + * Copyright © 2009 Red Hat, Inc. + * Copyright © 2011 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_FACE_HH +#define HB_FACE_HH + +#include "hb.hh" + +#include "hb-shaper.hh" +#include "hb-shape-plan.hh" +#include "hb-ot-face.hh" + + +/* + * hb_face_t + */ + +#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, face); +#include "hb-shaper-list.hh" +#undef HB_SHAPER_IMPLEMENT + +struct hb_face_t +{ + hb_object_header_t header; + + hb_reference_table_func_t reference_table_func; + void *user_data; + hb_destroy_func_t destroy; + + unsigned int index; /* Face index in a collection, zero-based. */ + mutable hb_atomic_int_t upem; /* Units-per-EM. */ + mutable hb_atomic_int_t num_glyphs; /* Number of glyphs. */ + + hb_shaper_object_dataset_t data;/* Various shaper data. */ + hb_ot_face_t table; /* All the face's tables. */ + + /* Cache */ + struct plan_node_t + { + hb_shape_plan_t *shape_plan; + plan_node_t *next; + }; + hb_atomic_ptr_t shape_plans; + + hb_blob_t *reference_table (hb_tag_t tag) const + { + hb_blob_t *blob; + + if (unlikely (!reference_table_func)) + return hb_blob_get_empty (); + + blob = reference_table_func (/*XXX*/const_cast (this), tag, user_data); + if (unlikely (!blob)) + return hb_blob_get_empty (); + + return blob; + } + + HB_PURE_FUNC unsigned int get_upem () const + { + unsigned int ret = upem.get_relaxed (); + if (unlikely (!ret)) + { + return load_upem (); + } + return ret; + } + + unsigned int get_num_glyphs () const + { + unsigned int ret = num_glyphs.get_relaxed (); + if (unlikely (ret == (unsigned int) -1)) + return load_num_glyphs (); + return ret; + } + + private: + HB_INTERNAL unsigned int load_upem () const; + HB_INTERNAL unsigned int load_num_glyphs () const; +}; +DECLARE_NULL_INSTANCE (hb_face_t); + + +#endif /* HB_FACE_HH */ diff --git a/src/hb-fallback-shape.cc b/src/hb-fallback-shape.cc index 3f09c3f..09f0290 100644 --- a/src/hb-fallback-shape.cc +++ b/src/hb-fallback-shape.cc @@ -24,28 +24,23 @@ * Google Author(s): Behdad Esfahbod */ -#define HB_SHAPER fallback -#include "hb-shaper-impl-private.hh" - - -HB_SHAPER_DATA_ENSURE_DEFINE(fallback, face) -HB_SHAPER_DATA_ENSURE_DEFINE(fallback, font) +#include "hb-shaper-impl.hh" /* * shaper face data */ -struct hb_fallback_shaper_face_data_t {}; +struct hb_fallback_face_data_t {}; -hb_fallback_shaper_face_data_t * +hb_fallback_face_data_t * _hb_fallback_shaper_face_data_create (hb_face_t *face HB_UNUSED) { - return (hb_fallback_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED; + return (hb_fallback_face_data_t *) HB_SHAPER_DATA_SUCCEEDED; } void -_hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_UNUSED) +_hb_fallback_shaper_face_data_destroy (hb_fallback_face_data_t *data HB_UNUSED) { } @@ -54,38 +49,16 @@ _hb_fallback_shaper_face_data_destroy (hb_fallback_shaper_face_data_t *data HB_U * shaper font data */ -struct hb_fallback_shaper_font_data_t {}; +struct hb_fallback_font_data_t {}; -hb_fallback_shaper_font_data_t * +hb_fallback_font_data_t * _hb_fallback_shaper_font_data_create (hb_font_t *font HB_UNUSED) { - return (hb_fallback_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; -} - -void -_hb_fallback_shaper_font_data_destroy (hb_fallback_shaper_font_data_t *data HB_UNUSED) -{ -} - - -/* - * shaper shape_plan data - */ - -struct hb_fallback_shaper_shape_plan_data_t {}; - -hb_fallback_shaper_shape_plan_data_t * -_hb_fallback_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, - const hb_feature_t *user_features HB_UNUSED, - unsigned int num_user_features HB_UNUSED, - const int *coords HB_UNUSED, - unsigned int num_coords HB_UNUSED) -{ - return (hb_fallback_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; + return (hb_fallback_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; } void -_hb_fallback_shaper_shape_plan_data_destroy (hb_fallback_shaper_shape_plan_data_t *data HB_UNUSED) +_hb_fallback_shaper_font_data_destroy (hb_fallback_font_data_t *data HB_UNUSED) { } diff --git a/src/hb-font-private.hh b/src/hb-font-private.hh deleted file mode 100644 index 7ba16cd..0000000 --- a/src/hb-font-private.hh +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright © 2009 Red Hat, Inc. - * Copyright © 2011 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_FONT_PRIVATE_HH -#define HB_FONT_PRIVATE_HH - -#include "hb-private.hh" - -#include "hb-object-private.hh" -#include "hb-face-private.hh" -#include "hb-shaper-private.hh" - - - -/* - * hb_font_funcs_t - */ - -#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \ - HB_FONT_FUNC_IMPLEMENT (font_h_extents) \ - HB_FONT_FUNC_IMPLEMENT (font_v_extents) \ - HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \ - HB_FONT_FUNC_IMPLEMENT (variation_glyph) \ - HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \ - HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \ - HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \ - HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \ - HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \ - HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \ - HB_FONT_FUNC_IMPLEMENT (glyph_extents) \ - HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \ - HB_FONT_FUNC_IMPLEMENT (glyph_name) \ - HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \ - /* ^--- Add new callbacks here */ - -struct hb_font_funcs_t { - hb_object_header_t header; - ASSERT_POD (); - - hb_bool_t immutable; - - struct { -#define HB_FONT_FUNC_IMPLEMENT(name) void *name; - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT - } user_data; - - struct { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_destroy_func_t name; - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT - } destroy; - - /* Don't access these directly. Call font->get_*() instead. */ - union get_t { - struct get_funcs_t { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name; - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT - } f; - void (*array[0 -#define HB_FONT_FUNC_IMPLEMENT(name) +1 - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT - ]) (void); - } get; -}; - - - -/* - * hb_font_t - */ - -struct hb_font_t { - hb_object_header_t header; - ASSERT_POD (); - - hb_bool_t immutable; - - hb_font_t *parent; - hb_face_t *face; - - int x_scale; - int y_scale; - - unsigned int x_ppem; - unsigned int y_ppem; - - float ptem; - - /* Font variation coordinates. */ - unsigned int num_coords; - int *coords; - - hb_font_funcs_t *klass; - void *user_data; - hb_destroy_func_t destroy; - - struct hb_shaper_data_t shaper_data; - - - /* Convert from font-space to user-space */ - inline int dir_scale (hb_direction_t direction) - { return HB_DIRECTION_IS_VERTICAL(direction) ? y_scale : x_scale; } - inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, x_scale); } - 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)); } - - /* Convert from parent-font user-space to our user-space */ - inline hb_position_t parent_scale_x_distance (hb_position_t v) { - if (unlikely (parent && parent->x_scale != x_scale)) - return (hb_position_t) (v * (int64_t) this->x_scale / this->parent->x_scale); - return v; - } - inline hb_position_t parent_scale_y_distance (hb_position_t v) { - if (unlikely (parent && parent->y_scale != y_scale)) - return (hb_position_t) (v * (int64_t) this->y_scale / this->parent->y_scale); - return v; - } - inline hb_position_t parent_scale_x_position (hb_position_t v) { - return parent_scale_x_distance (v); - } - inline hb_position_t parent_scale_y_position (hb_position_t v) { - return parent_scale_y_distance (v); - } - - inline void parent_scale_distance (hb_position_t *x, hb_position_t *y) { - *x = parent_scale_x_distance (*x); - *y = parent_scale_y_distance (*y); - } - inline void parent_scale_position (hb_position_t *x, hb_position_t *y) { - *x = parent_scale_x_position (*x); - *y = parent_scale_y_position (*y); - } - - - /* Public getters */ - - HB_INTERNAL bool has_func (unsigned int i); - - /* has_* ... */ -#define HB_FONT_FUNC_IMPLEMENT(name) \ - bool \ - has_##name##_func (void) \ - { \ - hb_font_funcs_t *funcs = this->klass; \ - unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \ - return has_func (i); \ - } - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT - - inline hb_bool_t get_font_h_extents (hb_font_extents_t *extents) - { - memset (extents, 0, sizeof (*extents)); - return klass->get.f.font_h_extents (this, user_data, - extents, - klass->user_data.font_h_extents); - } - inline hb_bool_t get_font_v_extents (hb_font_extents_t *extents) - { - memset (extents, 0, sizeof (*extents)); - return klass->get.f.font_v_extents (this, user_data, - extents, - klass->user_data.font_v_extents); - } - - inline bool has_glyph (hb_codepoint_t unicode) - { - hb_codepoint_t glyph; - return get_nominal_glyph (unicode, &glyph); - } - - inline hb_bool_t get_nominal_glyph (hb_codepoint_t unicode, - hb_codepoint_t *glyph) - { - *glyph = 0; - return klass->get.f.nominal_glyph (this, user_data, - unicode, glyph, - klass->user_data.nominal_glyph); - } - - inline hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector, - hb_codepoint_t *glyph) - { - *glyph = 0; - return klass->get.f.variation_glyph (this, user_data, - unicode, variation_selector, glyph, - klass->user_data.variation_glyph); - } - - inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph) - { - return klass->get.f.glyph_h_advance (this, user_data, - glyph, - klass->user_data.glyph_h_advance); - } - - inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph) - { - return klass->get.f.glyph_v_advance (this, user_data, - glyph, - klass->user_data.glyph_v_advance); - } - - inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - *x = *y = 0; - return klass->get.f.glyph_h_origin (this, user_data, - glyph, x, y, - klass->user_data.glyph_h_origin); - } - - inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - *x = *y = 0; - return klass->get.f.glyph_v_origin (this, user_data, - glyph, x, y, - klass->user_data.glyph_v_origin); - } - - inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) - { - return klass->get.f.glyph_h_kerning (this, user_data, - left_glyph, right_glyph, - klass->user_data.glyph_h_kerning); - } - - inline hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph) - { - return klass->get.f.glyph_v_kerning (this, user_data, - top_glyph, bottom_glyph, - klass->user_data.glyph_v_kerning); - } - - inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph, - hb_glyph_extents_t *extents) - { - memset (extents, 0, sizeof (*extents)); - return klass->get.f.glyph_extents (this, user_data, - glyph, - extents, - klass->user_data.glyph_extents); - } - - inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index, - hb_position_t *x, hb_position_t *y) - { - *x = *y = 0; - return klass->get.f.glyph_contour_point (this, user_data, - glyph, point_index, - x, y, - klass->user_data.glyph_contour_point); - } - - inline hb_bool_t get_glyph_name (hb_codepoint_t glyph, - char *name, unsigned int size) - { - if (size) *name = '\0'; - return klass->get.f.glyph_name (this, user_data, - glyph, - name, size, - klass->user_data.glyph_name); - } - - inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */ - hb_codepoint_t *glyph) - { - *glyph = 0; - if (len == -1) len = strlen (name); - return klass->get.f.glyph_from_name (this, user_data, - name, len, - glyph, - klass->user_data.glyph_from_name); - } - - - /* A bit higher-level, and with fallback */ - - inline void get_h_extents_with_fallback (hb_font_extents_t *extents) - { - if (!get_font_h_extents (extents)) - { - extents->ascender = y_scale * .8; - extents->descender = extents->ascender - y_scale; - extents->line_gap = 0; - } - } - inline void get_v_extents_with_fallback (hb_font_extents_t *extents) - { - if (!get_font_v_extents (extents)) - { - extents->ascender = x_scale / 2; - extents->descender = extents->ascender - x_scale; - extents->line_gap = 0; - } - } - - inline void get_extents_for_direction (hb_direction_t direction, - hb_font_extents_t *extents) - { - if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) - get_h_extents_with_fallback (extents); - else - get_v_extents_with_fallback (extents); - } - - inline void get_glyph_advance_for_direction (hb_codepoint_t glyph, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y) - { - if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) { - *x = get_glyph_h_advance (glyph); - *y = 0; - } else { - *x = 0; - *y = get_glyph_v_advance (glyph); - } - } - - inline void guess_v_origin_minus_h_origin (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - *x = get_glyph_h_advance (glyph) / 2; - - /* TODO cache this somehow?! */ - hb_font_extents_t extents; - get_h_extents_with_fallback (&extents); - *y = extents.ascender; - } - - inline void get_glyph_h_origin_with_fallback (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - if (!get_glyph_h_origin (glyph, x, y) && - get_glyph_v_origin (glyph, x, y)) - { - hb_position_t dx, dy; - guess_v_origin_minus_h_origin (glyph, &dx, &dy); - *x -= dx; *y -= dy; - } - } - inline void get_glyph_v_origin_with_fallback (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - if (!get_glyph_v_origin (glyph, x, y) && - get_glyph_h_origin (glyph, x, y)) - { - hb_position_t dx, dy; - guess_v_origin_minus_h_origin (glyph, &dx, &dy); - *x += dx; *y += dy; - } - } - - inline void get_glyph_origin_for_direction (hb_codepoint_t glyph, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y) - { - if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) - get_glyph_h_origin_with_fallback (glyph, x, y); - else - get_glyph_v_origin_with_fallback (glyph, x, y); - } - - inline void add_glyph_h_origin (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - hb_position_t origin_x, origin_y; - - get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y); - - *x += origin_x; - *y += origin_y; - } - inline void add_glyph_v_origin (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - hb_position_t origin_x, origin_y; - - get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y); - - *x += origin_x; - *y += origin_y; - } - inline void add_glyph_origin_for_direction (hb_codepoint_t glyph, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y) - { - hb_position_t origin_x, origin_y; - - get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y); - - *x += origin_x; - *y += origin_y; - } - - inline void subtract_glyph_h_origin (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - hb_position_t origin_x, origin_y; - - get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y); - - *x -= origin_x; - *y -= origin_y; - } - inline void subtract_glyph_v_origin (hb_codepoint_t glyph, - hb_position_t *x, hb_position_t *y) - { - hb_position_t origin_x, origin_y; - - get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y); - - *x -= origin_x; - *y -= origin_y; - } - inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y) - { - hb_position_t origin_x, origin_y; - - get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y); - - *x -= origin_x; - *y -= origin_y; - } - - inline void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y) - { - if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) { - *x = get_glyph_h_kerning (first_glyph, second_glyph); - *y = 0; - } else { - *x = 0; - *y = get_glyph_v_kerning (first_glyph, second_glyph); - } - } - - inline hb_bool_t get_glyph_extents_for_origin (hb_codepoint_t glyph, - hb_direction_t direction, - hb_glyph_extents_t *extents) - { - hb_bool_t ret = get_glyph_extents (glyph, extents); - - if (ret) - subtract_glyph_origin_for_direction (glyph, direction, &extents->x_bearing, &extents->y_bearing); - - return ret; - } - - inline hb_bool_t get_glyph_contour_point_for_origin (hb_codepoint_t glyph, unsigned int point_index, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y) - { - hb_bool_t ret = get_glyph_contour_point (glyph, point_index, x, y); - - if (ret) - subtract_glyph_origin_for_direction (glyph, direction, x, y); - - return ret; - } - - /* Generates gidDDD if glyph has no name. */ - inline void - glyph_to_string (hb_codepoint_t glyph, - char *s, unsigned int size) - { - if (get_glyph_name (glyph, s, size)) return; - - if (size && snprintf (s, size, "gid%u", glyph) < 0) - *s = '\0'; - } - - /* Parses gidDDD and uniUUUU strings automatically. */ - inline hb_bool_t - glyph_from_string (const char *s, int len, /* -1 means nul-terminated */ - hb_codepoint_t *glyph) - { - if (get_glyph_from_name (s, len, glyph)) return true; - - if (len == -1) len = strlen (s); - - /* Straight glyph index. */ - if (hb_codepoint_parse (s, len, 10, glyph)) - return true; - - if (len > 3) - { - /* gidDDD syntax for glyph indices. */ - if (0 == strncmp (s, "gid", 3) && - hb_codepoint_parse (s + 3, len - 3, 10, glyph)) - return true; - - /* uniUUUU and other Unicode character indices. */ - hb_codepoint_t unichar; - if (0 == strncmp (s, "uni", 3) && - hb_codepoint_parse (s + 3, len - 3, 16, &unichar) && - get_nominal_glyph (unichar, glyph)) - return true; - } - - return false; - } - - inline hb_position_t em_scale (int16_t v, int scale) - { - int upem = face->get_upem (); - int64_t scaled = v * (int64_t) scale; - scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */ - return (hb_position_t) (scaled / upem); - } - inline hb_position_t em_scalef (float v, int scale) - { - 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 (); - } -}; - -#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS -#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font); -#include "hb-shaper-list.hh" -#undef HB_SHAPER_IMPLEMENT -#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS - - -#endif /* HB_FONT_PRIVATE_HH */ diff --git a/src/hb-font.cc b/src/hb-font.cc index 4d62b9e..817a1a7 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -26,9 +26,25 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" +#include "hb.hh" -#include "hb-font-private.hh" +#include "hb-font.hh" +#include "hb-machinery.hh" + +#include "hb-ot.h" + + +/** + * SECTION:hb-font + * @title: hb-font + * @short_description: Font objects + * @include: hb.h + * + * Font objects represent a font face at a certain size and other + * parameters (pixels per EM, points per EM, variation settings.) + * Fonts are created from font faces, and are used as input to + * hb_shape() among other things. + **/ /* @@ -38,23 +54,23 @@ static hb_bool_t hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_font_extents_t *metrics, + hb_font_extents_t *extents, void *user_data HB_UNUSED) { - memset (metrics, 0, sizeof (*metrics)); + memset (extents, 0, sizeof (*extents)); return false; } static hb_bool_t -hb_font_get_font_h_extents_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_font_extents_t *metrics, - void *user_data HB_UNUSED) +hb_font_get_font_h_extents_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_font_extents_t *extents, + void *user_data HB_UNUSED) { - hb_bool_t ret = font->parent->get_font_h_extents (metrics); + hb_bool_t ret = font->parent->get_font_h_extents (extents); if (ret) { - metrics->ascender = font->parent_scale_y_distance (metrics->ascender); - metrics->descender = font->parent_scale_y_distance (metrics->descender); - metrics->line_gap = font->parent_scale_y_distance (metrics->line_gap); + extents->ascender = font->parent_scale_y_distance (extents->ascender); + extents->descender = font->parent_scale_y_distance (extents->descender); + extents->line_gap = font->parent_scale_y_distance (extents->line_gap); } return ret; } @@ -62,23 +78,23 @@ hb_font_get_font_h_extents_parent (hb_font_t *font, static hb_bool_t hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_font_extents_t *metrics, + hb_font_extents_t *extents, void *user_data HB_UNUSED) { - memset (metrics, 0, sizeof (*metrics)); + memset (extents, 0, sizeof (*extents)); return false; } static hb_bool_t -hb_font_get_font_v_extents_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_font_extents_t *metrics, - void *user_data HB_UNUSED) +hb_font_get_font_v_extents_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_font_extents_t *extents, + void *user_data HB_UNUSED) { - hb_bool_t ret = font->parent->get_font_v_extents (metrics); + hb_bool_t ret = font->parent->get_font_v_extents (extents); if (ret) { - metrics->ascender = font->parent_scale_x_distance (metrics->ascender); - metrics->descender = font->parent_scale_x_distance (metrics->descender); - metrics->line_gap = font->parent_scale_x_distance (metrics->line_gap); + extents->ascender = font->parent_scale_x_distance (extents->ascender); + extents->descender = font->parent_scale_x_distance (extents->descender); + extents->line_gap = font->parent_scale_x_distance (extents->line_gap); } return ret; } @@ -86,7 +102,7 @@ hb_font_get_font_v_extents_parent (hb_font_t *font, static hb_bool_t hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t unicode, + hb_codepoint_t unicode HB_UNUSED, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { @@ -94,20 +110,53 @@ hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED, return false; } static hb_bool_t -hb_font_get_nominal_glyph_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t unicode, - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) +hb_font_get_nominal_glyph_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t unicode, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) { + if (font->has_nominal_glyphs_func_set ()) + { + return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0); + } return font->parent->get_nominal_glyph (unicode, glyph); } +#define hb_font_get_nominal_glyphs_nil hb_font_get_nominal_glyphs_default +static unsigned int +hb_font_get_nominal_glyphs_default (hb_font_t *font, + void *font_data HB_UNUSED, + unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + void *user_data HB_UNUSED) +{ + if (font->has_nominal_glyph_func_set ()) + { + for (unsigned int i = 0; i < count; i++) + { + if (!font->get_nominal_glyph (*first_unicode, first_glyph)) + return i; + + first_unicode = &StructAtOffsetUnaligned (first_unicode, unicode_stride); + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + } + return count; + } + + return font->parent->get_nominal_glyphs (count, + first_unicode, unicode_stride, + first_glyph, glyph_stride); +} + static hb_bool_t hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, + hb_codepoint_t unicode HB_UNUSED, + hb_codepoint_t variation_selector HB_UNUSED, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { @@ -115,12 +164,12 @@ hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED, return false; } static hb_bool_t -hb_font_get_variation_glyph_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) +hb_font_get_variation_glyph_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) { return font->parent->get_variation_glyph (unicode, variation_selector, glyph); } @@ -129,42 +178,118 @@ hb_font_get_variation_glyph_parent (hb_font_t *font, static hb_position_t hb_font_get_glyph_h_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, - hb_codepoint_t glyph, + hb_codepoint_t glyph HB_UNUSED, void *user_data HB_UNUSED) { return font->x_scale; } static hb_position_t -hb_font_get_glyph_h_advance_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - void *user_data HB_UNUSED) +hb_font_get_glyph_h_advance_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + void *user_data HB_UNUSED) { + if (font->has_glyph_h_advances_func_set ()) + { + hb_position_t ret; + font->get_glyph_h_advances (1, &glyph, 0, &ret, 0); + return ret; + } return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph)); } static hb_position_t hb_font_get_glyph_v_advance_nil (hb_font_t *font, void *font_data HB_UNUSED, - hb_codepoint_t glyph, + hb_codepoint_t glyph HB_UNUSED, void *user_data HB_UNUSED) { /* TODO use font_extents.ascender+descender */ return font->y_scale; } static hb_position_t -hb_font_get_glyph_v_advance_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - void *user_data HB_UNUSED) +hb_font_get_glyph_v_advance_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + void *user_data HB_UNUSED) { + if (font->has_glyph_v_advances_func_set ()) + { + hb_position_t ret; + font->get_glyph_v_advances (1, &glyph, 0, &ret, 0); + return ret; + } return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); } +#define hb_font_get_glyph_h_advances_nil hb_font_get_glyph_h_advances_default +static void +hb_font_get_glyph_h_advances_default (hb_font_t* font, + void* font_data HB_UNUSED, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + hb_position_t *first_advance, + unsigned int advance_stride, + void *user_data HB_UNUSED) +{ + if (font->has_glyph_h_advance_func_set ()) + { + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->get_glyph_h_advance (*first_glyph); + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); + } + return; + } + + font->parent->get_glyph_h_advances (count, + first_glyph, glyph_stride, + first_advance, advance_stride); + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->parent_scale_x_distance (*first_advance); + first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); + } +} + +#define hb_font_get_glyph_v_advances_nil hb_font_get_glyph_v_advances_default +static void +hb_font_get_glyph_v_advances_default (hb_font_t* font, + void* font_data HB_UNUSED, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + hb_position_t *first_advance, + unsigned int advance_stride, + void *user_data HB_UNUSED) +{ + if (font->has_glyph_v_advance_func_set ()) + { + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->get_glyph_v_advance (*first_glyph); + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); + } + return; + } + + font->parent->get_glyph_v_advances (count, + first_glyph, glyph_stride, + first_advance, advance_stride); + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->parent_scale_y_distance (*first_advance); + first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); + } +} + static hb_bool_t hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t glyph, + hb_codepoint_t glyph HB_UNUSED, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) @@ -173,12 +298,12 @@ hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, return true; } static hb_bool_t -hb_font_get_glyph_h_origin_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) +hb_font_get_glyph_h_origin_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) { hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y); if (ret) @@ -189,7 +314,7 @@ hb_font_get_glyph_h_origin_parent (hb_font_t *font, static hb_bool_t hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t glyph, + hb_codepoint_t glyph HB_UNUSED, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) @@ -198,12 +323,12 @@ hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, return false; } static hb_bool_t -hb_font_get_glyph_v_origin_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) +hb_font_get_glyph_v_origin_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) { hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y); if (ret) @@ -214,18 +339,18 @@ hb_font_get_glyph_v_origin_parent (hb_font_t *font, static hb_position_t hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t left_glyph, - hb_codepoint_t right_glyph, + hb_codepoint_t left_glyph HB_UNUSED, + hb_codepoint_t right_glyph HB_UNUSED, void *user_data HB_UNUSED) { return 0; } static hb_position_t -hb_font_get_glyph_h_kerning_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t left_glyph, - hb_codepoint_t right_glyph, - void *user_data HB_UNUSED) +hb_font_get_glyph_h_kerning_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t left_glyph, + hb_codepoint_t right_glyph, + void *user_data HB_UNUSED) { return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph)); } @@ -233,18 +358,18 @@ hb_font_get_glyph_h_kerning_parent (hb_font_t *font, static hb_position_t hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t top_glyph, - hb_codepoint_t bottom_glyph, + hb_codepoint_t top_glyph HB_UNUSED, + hb_codepoint_t bottom_glyph HB_UNUSED, void *user_data HB_UNUSED) { return 0; } static hb_position_t -hb_font_get_glyph_v_kerning_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t top_glyph, - hb_codepoint_t bottom_glyph, - void *user_data HB_UNUSED) +hb_font_get_glyph_v_kerning_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t top_glyph, + hb_codepoint_t bottom_glyph, + void *user_data HB_UNUSED) { return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph)); } @@ -252,7 +377,7 @@ hb_font_get_glyph_v_kerning_parent (hb_font_t *font, static hb_bool_t hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t glyph, + hb_codepoint_t glyph HB_UNUSED, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) { @@ -260,11 +385,11 @@ hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, return false; } static hb_bool_t -hb_font_get_glyph_extents_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - hb_glyph_extents_t *extents, - void *user_data HB_UNUSED) +hb_font_get_glyph_extents_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + hb_glyph_extents_t *extents, + void *user_data HB_UNUSED) { hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents); if (ret) { @@ -277,8 +402,8 @@ hb_font_get_glyph_extents_parent (hb_font_t *font, static hb_bool_t hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t glyph, - unsigned int point_index, + hb_codepoint_t glyph HB_UNUSED, + unsigned int point_index HB_UNUSED, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) @@ -287,13 +412,13 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, return false; } static hb_bool_t -hb_font_get_glyph_contour_point_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - unsigned int point_index, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) +hb_font_get_glyph_contour_point_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + unsigned int point_index, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) { hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y); if (ret) @@ -304,7 +429,7 @@ hb_font_get_glyph_contour_point_parent (hb_font_t *font, static hb_bool_t hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t glyph, + hb_codepoint_t glyph HB_UNUSED, char *name, unsigned int size, void *user_data HB_UNUSED) { @@ -312,11 +437,11 @@ hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED, return false; } static hb_bool_t -hb_font_get_glyph_name_parent (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t glyph, - char *name, unsigned int size, - void *user_data HB_UNUSED) +hb_font_get_glyph_name_default (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + char *name, unsigned int size, + void *user_data HB_UNUSED) { return font->parent->get_glyph_name (glyph, name, size); } @@ -324,7 +449,8 @@ hb_font_get_glyph_name_parent (hb_font_t *font, static hb_bool_t hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - const char *name, int len, /* -1 means nul-terminated */ + const char *name HB_UNUSED, + int len HB_UNUSED, /* -1 means nul-terminated */ hb_codepoint_t *glyph, void *user_data HB_UNUSED) { @@ -332,20 +458,19 @@ hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED, return false; } static hb_bool_t -hb_font_get_glyph_from_name_parent (hb_font_t *font, - void *font_data HB_UNUSED, - const char *name, int len, /* -1 means nul-terminated */ - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) +hb_font_get_glyph_from_name_default (hb_font_t *font, + void *font_data HB_UNUSED, + const char *name, int len, /* -1 means nul-terminated */ + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) { return font->parent->get_glyph_from_name (name, len, glyph); } -static const hb_font_funcs_t _hb_font_funcs_nil = { +DEFINE_NULL_INSTANCE (hb_font_funcs_t) = +{ HB_OBJECT_HEADER_STATIC, - true, /* immutable */ - { #define HB_FONT_FUNC_IMPLEMENT(name) nullptr, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS @@ -364,10 +489,9 @@ static const hb_font_funcs_t _hb_font_funcs_nil = { } } }; -static const hb_font_funcs_t _hb_font_funcs_parent = { - HB_OBJECT_HEADER_STATIC, - true, /* immutable */ +static const hb_font_funcs_t _hb_font_funcs_default = { + HB_OBJECT_HEADER_STATIC, { #define HB_FONT_FUNC_IMPLEMENT(name) nullptr, @@ -381,7 +505,7 @@ static const hb_font_funcs_t _hb_font_funcs_parent = { }, { { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent, +#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_default, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT } @@ -399,14 +523,14 @@ static const hb_font_funcs_t _hb_font_funcs_parent = { * Since: 0.9.2 **/ hb_font_funcs_t * -hb_font_funcs_create (void) +hb_font_funcs_create () { hb_font_funcs_t *ffuncs; if (!(ffuncs = hb_object_create ())) return hb_font_funcs_get_empty (); - ffuncs->get = _hb_font_funcs_parent.get; + ffuncs->get = _hb_font_funcs_default.get; return ffuncs; } @@ -421,9 +545,9 @@ hb_font_funcs_create (void) * Since: 0.9.2 **/ hb_font_funcs_t * -hb_font_funcs_get_empty (void) +hb_font_funcs_get_empty () { - return const_cast (&_hb_font_funcs_parent); + return const_cast (&_hb_font_funcs_default); } /** @@ -517,10 +641,10 @@ hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs, void hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs) { - if (unlikely (hb_object_is_inert (ffuncs))) + if (hb_object_is_immutable (ffuncs)) return; - ffuncs->immutable = true; + hb_object_make_immutable (ffuncs); } /** @@ -536,7 +660,7 @@ hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs) hb_bool_t hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs) { - return ffuncs->immutable; + return hb_object_is_immutable (ffuncs); } @@ -548,7 +672,7 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \ void *user_data, \ hb_destroy_func_t destroy) \ { \ - if (ffuncs->immutable) { \ + if (hb_object_is_immutable (ffuncs)) { \ if (destroy) \ destroy (user_data); \ return; \ @@ -562,9 +686,9 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \ ffuncs->user_data.name = user_data; \ ffuncs->destroy.name = destroy; \ } else { \ - ffuncs->get.f.name = hb_font_get_##name##_parent; \ - ffuncs->user_data.name = nullptr; \ - ffuncs->destroy.name = nullptr; \ + ffuncs->get.f.name = hb_font_get_##name##_default; \ + ffuncs->user_data.name = nullptr; \ + ffuncs->destroy.name = nullptr; \ } \ } @@ -572,11 +696,16 @@ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT bool +hb_font_t::has_func_set (unsigned int i) +{ + return this->klass->get.array[i] != _hb_font_funcs_default.get.array[i]; +} + +bool hb_font_t::has_func (unsigned int i) { - if (parent && parent != hb_font_get_empty () && parent->has_func (i)) - return true; - return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i]; + return has_func_set (i) || + (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i)); } /* Public getters */ @@ -718,6 +847,43 @@ hb_font_get_glyph_v_advance (hb_font_t *font, } /** + * hb_font_get_glyph_h_advances: + * @font: a font. + * + * + * + * Since: 1.8.6 + **/ +void +hb_font_get_glyph_h_advances (hb_font_t* font, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride) +{ + font->get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride); +} +/** + * hb_font_get_glyph_v_advances: + * @font: a font. + * + * + * + * Since: 1.8.6 + **/ +void +hb_font_get_glyph_v_advances (hb_font_t* font, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride) +{ + font->get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride); +} + +/** * hb_font_get_glyph_h_origin: * @font: a font. * @glyph: @@ -770,6 +936,7 @@ hb_font_get_glyph_v_origin (hb_font_t *font, * Return value: * * Since: 0.9.2 + * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_h_kerning (hb_font_t *font, @@ -789,6 +956,7 @@ hb_font_get_glyph_h_kerning (hb_font_t *font, * Return value: * * Since: 0.9.2 + * Deprecated: 2.0.0 **/ hb_position_t hb_font_get_glyph_v_kerning (hb_font_t *font, @@ -888,7 +1056,7 @@ hb_font_get_glyph_from_name (hb_font_t *font, * hb_font_get_extents_for_direction: * @font: a font. * @direction: - * @extents: + * @extents: (out): * * * @@ -921,6 +1089,26 @@ hb_font_get_glyph_advance_for_direction (hb_font_t *font, { return font->get_glyph_advance_for_direction (glyph, direction, x, y); } +/** + * hb_font_get_glyph_advances_for_direction: + * @font: a font. + * @direction: + * + * + * + * Since: 1.8.6 + **/ +HB_EXTERN void +hb_font_get_glyph_advances_for_direction (hb_font_t* font, + hb_direction_t direction, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride) +{ + font->get_glyph_advances_for_direction (direction, count, first_glyph, glyph_stride, first_advance, advance_stride); +} /** * hb_font_get_glyph_origin_for_direction: @@ -997,6 +1185,7 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, * * * Since: 0.9.2 + * Deprecated: 2.0.0 **/ void hb_font_get_glyph_kerning_for_direction (hb_font_t *font, @@ -1100,6 +1289,49 @@ hb_font_glyph_from_string (hb_font_t *font, * hb_font_t */ +DEFINE_NULL_INSTANCE (hb_font_t) = +{ + HB_OBJECT_HEADER_STATIC, + + nullptr, /* parent */ + const_cast (&_hb_Null_hb_face_t), + + 1000, /* x_scale */ + 1000, /* y_scale */ + + 0, /* x_ppem */ + 0, /* y_ppem */ + 0, /* ptem */ + + 0, /* num_coords */ + nullptr, /* coords */ + + const_cast (&_hb_Null_hb_font_funcs_t), + + /* Zero for the rest is fine. */ +}; + + +static hb_font_t * +_hb_font_create (hb_face_t *face) +{ + hb_font_t *font; + + if (unlikely (!face)) + face = hb_face_get_empty (); + if (!(font = hb_object_create ())) + return hb_font_get_empty (); + + hb_face_make_immutable (face); + font->parent = hb_font_get_empty (); + font->face = hb_face_reference (face); + font->klass = hb_font_funcs_get_empty (); + font->data.init0 (font); + font->x_scale = font->y_scale = hb_face_get_upem (face); + + return font; +} + /** * hb_font_create: (Xconstructor) * @face: a face. @@ -1113,19 +1345,10 @@ hb_font_glyph_from_string (hb_font_t *font, hb_font_t * hb_font_create (hb_face_t *face) { - hb_font_t *font; - - if (unlikely (!face)) - face = hb_face_get_empty (); - if (!(font = hb_object_create ())) - return hb_font_get_empty (); + hb_font_t *font = _hb_font_create (face); - hb_face_make_immutable (face); - font->parent = hb_font_get_empty (); - font->face = hb_face_reference (face); - font->klass = hb_font_funcs_get_empty (); - - font->x_scale = font->y_scale = hb_face_get_upem (face); + /* Install our in-house, very lightweight, funcs. */ + hb_ot_font_set_funcs (font); return font; } @@ -1146,9 +1369,9 @@ hb_font_create_sub_font (hb_font_t *parent) if (unlikely (!parent)) parent = hb_font_get_empty (); - hb_font_t *font = hb_font_create (parent->face); + hb_font_t *font = _hb_font_create (parent->face); - if (unlikely (hb_object_is_inert (font))) + if (unlikely (hb_object_is_immutable (font))) return font; font->parent = hb_font_reference (parent); @@ -1185,38 +1408,9 @@ hb_font_create_sub_font (hb_font_t *parent) * Since: 0.9.2 **/ hb_font_t * -hb_font_get_empty (void) +hb_font_get_empty () { - static const hb_font_t _hb_font_nil = { - HB_OBJECT_HEADER_STATIC, - - true, /* immutable */ - - nullptr, /* parent */ - const_cast (&_hb_face_nil), - - 1000, /* x_scale */ - 1000, /* y_scale */ - - 0, /* x_ppem */ - 0, /* y_ppem */ - 0, /* ptem */ - - 0, /* num_coords */ - nullptr, /* coords */ - - const_cast (&_hb_font_funcs_nil), /* klass */ - nullptr, /* user_data */ - nullptr, /* destroy */ - - { -#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, -#include "hb-shaper-list.hh" -#undef HB_SHAPER_IMPLEMENT - } - }; - - return const_cast (&_hb_font_nil); + return const_cast (&Null(hb_font_t)); } /** @@ -1248,9 +1442,7 @@ hb_font_destroy (hb_font_t *font) { if (!hb_object_destroy (font)) return; -#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, font); -#include "hb-shaper-list.hh" -#undef HB_SHAPER_IMPLEMENT + font->data.fini (); if (font->destroy) font->destroy (font->user_data); @@ -1317,13 +1509,13 @@ hb_font_get_user_data (hb_font_t *font, void hb_font_make_immutable (hb_font_t *font) { - if (unlikely (hb_object_is_inert (font))) + if (hb_object_is_immutable (font)) return; if (font->parent) hb_font_make_immutable (font->parent); - font->immutable = true; + hb_object_make_immutable (font); } /** @@ -1339,7 +1531,7 @@ hb_font_make_immutable (hb_font_t *font) hb_bool_t hb_font_is_immutable (hb_font_t *font) { - return font->immutable; + return hb_object_is_immutable (font); } /** @@ -1355,7 +1547,7 @@ void hb_font_set_parent (hb_font_t *font, hb_font_t *parent) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; if (!parent) @@ -1397,7 +1589,7 @@ void hb_font_set_face (hb_font_t *font, hb_face_t *face) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; if (unlikely (!face)) @@ -1444,7 +1636,8 @@ hb_font_set_funcs (hb_font_t *font, void *font_data, hb_destroy_func_t destroy) { - if (font->immutable) { + if (hb_object_is_immutable (font)) + { if (destroy) destroy (font_data); return; @@ -1479,7 +1672,8 @@ hb_font_set_funcs_data (hb_font_t *font, hb_destroy_func_t destroy) { /* Destroy user_data? */ - if (font->immutable) { + if (hb_object_is_immutable (font)) + { if (destroy) destroy (font_data); return; @@ -1508,7 +1702,7 @@ hb_font_set_scale (hb_font_t *font, int x_scale, int y_scale) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; font->x_scale = x_scale; @@ -1549,7 +1743,7 @@ hb_font_set_ppem (hb_font_t *font, unsigned int x_ppem, unsigned int y_ppem) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; font->x_ppem = x_ppem; @@ -1578,16 +1772,18 @@ hb_font_get_ppem (hb_font_t *font, /** * hb_font_set_ptem: * @font: a font. - * @ptem: + * @ptem: font size in points. * - * Sets "point size" of the font. + * Sets "point size" of the font. Set to 0 to unset. + * + * There are 72 points in an inch. * * Since: 1.6.0 **/ void hb_font_set_ptem (hb_font_t *font, float ptem) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; font->ptem = ptem; @@ -1634,7 +1830,7 @@ hb_font_set_variations (hb_font_t *font, const hb_variation_t *variations, unsigned int variations_length) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; if (!variations_length) @@ -1665,7 +1861,7 @@ hb_font_set_var_coords_design (hb_font_t *font, const float *coords, unsigned int coords_length) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; int *normalized = coords_length ? (int *) calloc (coords_length, sizeof (int)) : nullptr; @@ -1686,7 +1882,7 @@ hb_font_set_var_coords_normalized (hb_font_t *font, const int *coords, /* 2.14 normalized */ unsigned int coords_length) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : nullptr; @@ -1718,8 +1914,6 @@ hb_font_get_var_coords_normalized (hb_font_t *font, } -#ifndef HB_DISABLE_DEPRECATED - /* * Deprecated get_glyph_func(): */ @@ -1806,9 +2000,9 @@ hb_font_get_variation_glyph_trampoline (hb_font_t *font, /** * hb_font_funcs_set_glyph_func: * @ffuncs: font functions. - * @func: (closure user_data) (destroy destroy) (scope notified): - * @user_data: - * @destroy: + * @func: (closure user_data) (destroy destroy) (scope notified): callback function. + * @user_data: data to pass to @func. + * @destroy: function to call when @user_data is not needed anymore. * * Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and * hb_font_funcs_set_variation_glyph_func() instead. @@ -1842,5 +2036,3 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, trampoline, trampoline_destroy); } - -#endif /* HB_DISABLE_DEPRECATED */ diff --git a/src/hb-font.h b/src/hb-font.h index c95b61d..e2086d8 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -110,7 +110,7 @@ typedef struct hb_glyph_extents_t /* func types */ typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data, - hb_font_extents_t *metrics, + hb_font_extents_t *extents, void *user_data); typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t; typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t; @@ -125,6 +125,14 @@ typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void * hb_codepoint_t *glyph, void *user_data); +typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data, + unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + void *user_data); + typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t glyph, @@ -132,6 +140,16 @@ typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t; typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t; +typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_data, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride, + void *user_data); +typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t; +typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t; + typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, @@ -139,12 +157,6 @@ typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *fon typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t; typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t; -typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data, - hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, - void *user_data); -typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t; -typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t; - typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t glyph, @@ -217,6 +229,22 @@ hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs, void *user_data, hb_destroy_func_t destroy); /** + * hb_font_funcs_set_nominal_glyphs_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 2.0.0 + **/ +HB_EXTERN void +hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs, + hb_font_get_nominal_glyphs_func_t func, + void *user_data, hb_destroy_func_t destroy); + +/** * hb_font_funcs_set_variation_glyph_func: * @ffuncs: font functions. * @func: (closure user_data) (destroy destroy) (scope notified): @@ -265,7 +293,7 @@ hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs, void *user_data, hb_destroy_func_t destroy); /** - * hb_font_funcs_set_glyph_h_origin_func: + * hb_font_funcs_set_glyph_h_advances_func: * @ffuncs: font functions. * @func: (closure user_data) (destroy destroy) (scope notified): * @user_data: @@ -273,15 +301,15 @@ hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs, * * * - * Since: 0.9.2 + * Since: 1.8.6 **/ HB_EXTERN void -hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_h_origin_func_t func, - void *user_data, hb_destroy_func_t destroy); +hb_font_funcs_set_glyph_h_advances_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_h_advances_func_t func, + void *user_data, hb_destroy_func_t destroy); /** - * hb_font_funcs_set_glyph_v_origin_func: + * hb_font_funcs_set_glyph_v_advances_func: * @ffuncs: font functions. * @func: (closure user_data) (destroy destroy) (scope notified): * @user_data: @@ -289,15 +317,15 @@ hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs, * * * - * Since: 0.9.2 + * Since: 1.8.6 **/ HB_EXTERN void -hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_v_origin_func_t func, - void *user_data, hb_destroy_func_t destroy); +hb_font_funcs_set_glyph_v_advances_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_v_advances_func_t func, + void *user_data, hb_destroy_func_t destroy); /** - * hb_font_funcs_set_glyph_h_kerning_func: + * hb_font_funcs_set_glyph_h_origin_func: * @ffuncs: font functions. * @func: (closure user_data) (destroy destroy) (scope notified): * @user_data: @@ -308,12 +336,12 @@ hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs, * Since: 0.9.2 **/ HB_EXTERN void -hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_h_kerning_func_t func, - void *user_data, hb_destroy_func_t destroy); +hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_h_origin_func_t func, + void *user_data, hb_destroy_func_t destroy); /** - * hb_font_funcs_set_glyph_v_kerning_func: + * hb_font_funcs_set_glyph_v_origin_func: * @ffuncs: font functions. * @func: (closure user_data) (destroy destroy) (scope notified): * @user_data: @@ -324,9 +352,9 @@ hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, * Since: 0.9.2 **/ HB_EXTERN void -hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_v_kerning_func_t func, - void *user_data, hb_destroy_func_t destroy); +hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_v_origin_func_t func, + void *user_data, hb_destroy_func_t destroy); /** * hb_font_funcs_set_glyph_extents_func: @@ -417,6 +445,21 @@ HB_EXTERN hb_position_t hb_font_get_glyph_v_advance (hb_font_t *font, hb_codepoint_t glyph); +HB_EXTERN void +hb_font_get_glyph_h_advances (hb_font_t* font, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride); +HB_EXTERN void +hb_font_get_glyph_v_advances (hb_font_t* font, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride); + HB_EXTERN hb_bool_t hb_font_get_glyph_h_origin (hb_font_t *font, hb_codepoint_t glyph, @@ -426,13 +469,6 @@ hb_font_get_glyph_v_origin (hb_font_t *font, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y); -HB_EXTERN hb_position_t -hb_font_get_glyph_h_kerning (hb_font_t *font, - hb_codepoint_t left_glyph, hb_codepoint_t right_glyph); -HB_EXTERN hb_position_t -hb_font_get_glyph_v_kerning (hb_font_t *font, - hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); - HB_EXTERN hb_bool_t hb_font_get_glyph_extents (hb_font_t *font, hb_codepoint_t glyph, @@ -472,6 +508,14 @@ hb_font_get_glyph_advance_for_direction (hb_font_t *font, hb_direction_t direction, hb_position_t *x, hb_position_t *y); HB_EXTERN void +hb_font_get_glyph_advances_for_direction (hb_font_t* font, + hb_direction_t direction, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride); +HB_EXTERN void hb_font_get_glyph_origin_for_direction (hb_font_t *font, hb_codepoint_t glyph, hb_direction_t direction, @@ -487,12 +531,6 @@ hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, hb_direction_t direction, hb_position_t *x, hb_position_t *y); -HB_EXTERN void -hb_font_get_glyph_kerning_for_direction (hb_font_t *font, - hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, - hb_direction_t direction, - hb_position_t *x, hb_position_t *y); - HB_EXTERN hb_bool_t hb_font_get_glyph_extents_for_origin (hb_font_t *font, hb_codepoint_t glyph, diff --git a/src/hb-font.hh b/src/hb-font.hh new file mode 100644 index 0000000..aaa0fd9 --- /dev/null +++ b/src/hb-font.hh @@ -0,0 +1,617 @@ +/* + * Copyright © 2009 Red Hat, Inc. + * Copyright © 2011 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_FONT_HH +#define HB_FONT_HH + +#include "hb.hh" + +#include "hb-face.hh" +#include "hb-shaper.hh" + + +/* + * hb_font_funcs_t + */ + +#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \ + HB_FONT_FUNC_IMPLEMENT (font_h_extents) \ + HB_FONT_FUNC_IMPLEMENT (font_v_extents) \ + HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \ + HB_FONT_FUNC_IMPLEMENT (nominal_glyphs) \ + HB_FONT_FUNC_IMPLEMENT (variation_glyph) \ + HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \ + HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \ + HB_FONT_FUNC_IMPLEMENT (glyph_h_advances) \ + HB_FONT_FUNC_IMPLEMENT (glyph_v_advances) \ + HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \ + HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \ + HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \ + HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \ + HB_FONT_FUNC_IMPLEMENT (glyph_extents) \ + HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \ + HB_FONT_FUNC_IMPLEMENT (glyph_name) \ + HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \ + /* ^--- Add new callbacks here */ + +struct hb_font_funcs_t +{ + hb_object_header_t header; + + struct { +#define HB_FONT_FUNC_IMPLEMENT(name) void *name; + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + } user_data; + + struct { +#define HB_FONT_FUNC_IMPLEMENT(name) hb_destroy_func_t name; + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + } destroy; + + /* Don't access these directly. Call font->get_*() instead. */ + union get_t { + struct get_funcs_t { +#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name; + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + } f; + void (*array[0 +#define HB_FONT_FUNC_IMPLEMENT(name) +1 + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + ]) (); + } get; +}; +DECLARE_NULL_INSTANCE (hb_font_funcs_t); + + +/* + * hb_font_t + */ + +#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INSTANTIATE_SHAPERS(shaper, font); +#include "hb-shaper-list.hh" +#undef HB_SHAPER_IMPLEMENT + +struct hb_font_t +{ + hb_object_header_t header; + + hb_font_t *parent; + hb_face_t *face; + + int x_scale; + int y_scale; + + unsigned int x_ppem; + unsigned int y_ppem; + + float ptem; + + /* Font variation coordinates. */ + unsigned int num_coords; + int *coords; + + hb_font_funcs_t *klass; + void *user_data; + hb_destroy_func_t destroy; + + hb_shaper_object_dataset_t data; /* Various shaper data. */ + + + /* Convert from font-space to user-space */ + int dir_scale (hb_direction_t direction) + { return HB_DIRECTION_IS_VERTICAL(direction) ? y_scale : x_scale; } + hb_position_t em_scale_x (int16_t v) { return em_scale (v, x_scale); } + hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); } + hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); } + hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); } + float em_fscale_x (int16_t v) { return em_fscale (v, x_scale); } + float em_fscale_y (int16_t v) { return em_fscale (v, y_scale); } + hb_position_t em_scale_dir (int16_t v, hb_direction_t direction) + { return em_scale (v, dir_scale (direction)); } + + /* Convert from parent-font user-space to our user-space */ + hb_position_t parent_scale_x_distance (hb_position_t v) + { + if (unlikely (parent && parent->x_scale != x_scale)) + return (hb_position_t) (v * (int64_t) this->x_scale / this->parent->x_scale); + return v; + } + hb_position_t parent_scale_y_distance (hb_position_t v) + { + if (unlikely (parent && parent->y_scale != y_scale)) + return (hb_position_t) (v * (int64_t) this->y_scale / this->parent->y_scale); + return v; + } + hb_position_t parent_scale_x_position (hb_position_t v) + { return parent_scale_x_distance (v); } + hb_position_t parent_scale_y_position (hb_position_t v) + { return parent_scale_y_distance (v); } + + void parent_scale_distance (hb_position_t *x, hb_position_t *y) + { + *x = parent_scale_x_distance (*x); + *y = parent_scale_y_distance (*y); + } + void parent_scale_position (hb_position_t *x, hb_position_t *y) + { + *x = parent_scale_x_position (*x); + *y = parent_scale_y_position (*y); + } + + + /* Public getters */ + + HB_INTERNAL bool has_func (unsigned int i); + HB_INTERNAL bool has_func_set (unsigned int i); + + /* has_* ... */ +#define HB_FONT_FUNC_IMPLEMENT(name) \ + bool \ + has_##name##_func () \ + { \ + hb_font_funcs_t *funcs = this->klass; \ + unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \ + return has_func (i); \ + } \ + bool \ + has_##name##_func_set () \ + { \ + hb_font_funcs_t *funcs = this->klass; \ + unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \ + return has_func_set (i); \ + } + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + + hb_bool_t get_font_h_extents (hb_font_extents_t *extents) + { + memset (extents, 0, sizeof (*extents)); + return klass->get.f.font_h_extents (this, user_data, + extents, + klass->user_data.font_h_extents); + } + hb_bool_t get_font_v_extents (hb_font_extents_t *extents) + { + memset (extents, 0, sizeof (*extents)); + return klass->get.f.font_v_extents (this, user_data, + extents, + klass->user_data.font_v_extents); + } + + bool has_glyph (hb_codepoint_t unicode) + { + hb_codepoint_t glyph; + return get_nominal_glyph (unicode, &glyph); + } + + hb_bool_t get_nominal_glyph (hb_codepoint_t unicode, + hb_codepoint_t *glyph) + { + *glyph = 0; + return klass->get.f.nominal_glyph (this, user_data, + unicode, glyph, + klass->user_data.nominal_glyph); + } + unsigned int get_nominal_glyphs (unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride) + { + return klass->get.f.nominal_glyphs (this, user_data, + count, + first_unicode, unicode_stride, + first_glyph, glyph_stride, + klass->user_data.nominal_glyphs); + } + + hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) + { + *glyph = 0; + return klass->get.f.variation_glyph (this, user_data, + unicode, variation_selector, glyph, + klass->user_data.variation_glyph); + } + + hb_position_t get_glyph_h_advance (hb_codepoint_t glyph) + { + return klass->get.f.glyph_h_advance (this, user_data, + glyph, + klass->user_data.glyph_h_advance); + } + + hb_position_t get_glyph_v_advance (hb_codepoint_t glyph) + { + return klass->get.f.glyph_v_advance (this, user_data, + glyph, + klass->user_data.glyph_v_advance); + } + + void get_glyph_h_advances (unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + hb_position_t *first_advance, + unsigned int advance_stride) + { + return klass->get.f.glyph_h_advances (this, user_data, + count, + first_glyph, glyph_stride, + first_advance, advance_stride, + klass->user_data.glyph_h_advances); + } + + void get_glyph_v_advances (unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + hb_position_t *first_advance, + unsigned int advance_stride) + { + return klass->get.f.glyph_v_advances (this, user_data, + count, + first_glyph, glyph_stride, + first_advance, advance_stride, + klass->user_data.glyph_v_advances); + } + + hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + *x = *y = 0; + return klass->get.f.glyph_h_origin (this, user_data, + glyph, x, y, + klass->user_data.glyph_h_origin); + } + + hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + *x = *y = 0; + return klass->get.f.glyph_v_origin (this, user_data, + glyph, x, y, + klass->user_data.glyph_v_origin); + } + + hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, + hb_codepoint_t right_glyph) + { + return klass->get.f.glyph_h_kerning (this, user_data, + left_glyph, right_glyph, + klass->user_data.glyph_h_kerning); + } + + hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, + hb_codepoint_t bottom_glyph) + { + return klass->get.f.glyph_v_kerning (this, user_data, + top_glyph, bottom_glyph, + klass->user_data.glyph_v_kerning); + } + + hb_bool_t get_glyph_extents (hb_codepoint_t glyph, + hb_glyph_extents_t *extents) + { + memset (extents, 0, sizeof (*extents)); + return klass->get.f.glyph_extents (this, user_data, + glyph, + extents, + klass->user_data.glyph_extents); + } + + hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index, + hb_position_t *x, hb_position_t *y) + { + *x = *y = 0; + return klass->get.f.glyph_contour_point (this, user_data, + glyph, point_index, + x, y, + klass->user_data.glyph_contour_point); + } + + hb_bool_t get_glyph_name (hb_codepoint_t glyph, + char *name, unsigned int size) + { + if (size) *name = '\0'; + return klass->get.f.glyph_name (this, user_data, + glyph, + name, size, + klass->user_data.glyph_name); + } + + hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */ + hb_codepoint_t *glyph) + { + *glyph = 0; + if (len == -1) len = strlen (name); + return klass->get.f.glyph_from_name (this, user_data, + name, len, + glyph, + klass->user_data.glyph_from_name); + } + + + /* A bit higher-level, and with fallback */ + + void get_h_extents_with_fallback (hb_font_extents_t *extents) + { + if (!get_font_h_extents (extents)) + { + extents->ascender = y_scale * .8; + extents->descender = extents->ascender - y_scale; + extents->line_gap = 0; + } + } + void get_v_extents_with_fallback (hb_font_extents_t *extents) + { + if (!get_font_v_extents (extents)) + { + extents->ascender = x_scale / 2; + extents->descender = extents->ascender - x_scale; + extents->line_gap = 0; + } + } + + void get_extents_for_direction (hb_direction_t direction, + hb_font_extents_t *extents) + { + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + get_h_extents_with_fallback (extents); + else + get_v_extents_with_fallback (extents); + } + + void get_glyph_advance_for_direction (hb_codepoint_t glyph, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y) + { + *x = *y = 0; + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + *x = get_glyph_h_advance (glyph); + else + *y = get_glyph_v_advance (glyph); + } + void get_glyph_advances_for_direction (hb_direction_t direction, + unsigned int count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride) + { + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride); + else + get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride); + } + + void guess_v_origin_minus_h_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + *x = get_glyph_h_advance (glyph) / 2; + + /* TODO cache this somehow?! */ + hb_font_extents_t extents; + get_h_extents_with_fallback (&extents); + *y = extents.ascender; + } + + void get_glyph_h_origin_with_fallback (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + if (!get_glyph_h_origin (glyph, x, y) && + get_glyph_v_origin (glyph, x, y)) + { + hb_position_t dx, dy; + guess_v_origin_minus_h_origin (glyph, &dx, &dy); + *x -= dx; *y -= dy; + } + } + void get_glyph_v_origin_with_fallback (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + if (!get_glyph_v_origin (glyph, x, y) && + get_glyph_h_origin (glyph, x, y)) + { + hb_position_t dx, dy; + guess_v_origin_minus_h_origin (glyph, &dx, &dy); + *x += dx; *y += dy; + } + } + + void get_glyph_origin_for_direction (hb_codepoint_t glyph, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y) + { + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) + get_glyph_h_origin_with_fallback (glyph, x, y); + else + get_glyph_v_origin_with_fallback (glyph, x, y); + } + + void add_glyph_h_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y); + + *x += origin_x; + *y += origin_y; + } + void add_glyph_v_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y); + + *x += origin_x; + *y += origin_y; + } + void add_glyph_origin_for_direction (hb_codepoint_t glyph, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y); + + *x += origin_x; + *y += origin_y; + } + + void subtract_glyph_h_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y); + + *x -= origin_x; + *y -= origin_y; + } + void subtract_glyph_v_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_v_origin_with_fallback (glyph, &origin_x, &origin_y); + + *x -= origin_x; + *y -= origin_y; + } + void subtract_glyph_origin_for_direction (hb_codepoint_t glyph, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y); + + *x -= origin_x; + *y -= origin_y; + } + + void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y) + { + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) { + *y = 0; + *x = get_glyph_h_kerning (first_glyph, second_glyph); + } else { + *x = 0; + *y = get_glyph_v_kerning (first_glyph, second_glyph); + } + } + + hb_bool_t get_glyph_extents_for_origin (hb_codepoint_t glyph, + hb_direction_t direction, + hb_glyph_extents_t *extents) + { + hb_bool_t ret = get_glyph_extents (glyph, extents); + + if (ret) + subtract_glyph_origin_for_direction (glyph, direction, &extents->x_bearing, &extents->y_bearing); + + return ret; + } + + hb_bool_t get_glyph_contour_point_for_origin (hb_codepoint_t glyph, unsigned int point_index, + hb_direction_t direction, + hb_position_t *x, hb_position_t *y) + { + hb_bool_t ret = get_glyph_contour_point (glyph, point_index, x, y); + + if (ret) + subtract_glyph_origin_for_direction (glyph, direction, x, y); + + return ret; + } + + /* Generates gidDDD if glyph has no name. */ + void + glyph_to_string (hb_codepoint_t glyph, + char *s, unsigned int size) + { + if (get_glyph_name (glyph, s, size)) return; + + if (size && snprintf (s, size, "gid%u", glyph) < 0) + *s = '\0'; + } + + /* Parses gidDDD and uniUUUU strings automatically. */ + hb_bool_t + glyph_from_string (const char *s, int len, /* -1 means nul-terminated */ + hb_codepoint_t *glyph) + { + if (get_glyph_from_name (s, len, glyph)) return true; + + if (len == -1) len = strlen (s); + + /* Straight glyph index. */ + if (hb_codepoint_parse (s, len, 10, glyph)) + return true; + + if (len > 3) + { + /* gidDDD syntax for glyph indices. */ + if (0 == strncmp (s, "gid", 3) && + hb_codepoint_parse (s + 3, len - 3, 10, glyph)) + return true; + + /* uniUUUU and other Unicode character indices. */ + hb_codepoint_t unichar; + if (0 == strncmp (s, "uni", 3) && + hb_codepoint_parse (s + 3, len - 3, 16, &unichar) && + get_nominal_glyph (unichar, glyph)) + return true; + } + + return false; + } + + hb_position_t em_scale (int16_t v, int scale) + { + int upem = face->get_upem (); + int64_t scaled = v * (int64_t) scale; + scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */ + return (hb_position_t) (scaled / upem); + } + hb_position_t em_scalef (float v, int scale) + { return (hb_position_t) round (v * scale / face->get_upem ()); } + float em_fscale (int16_t v, int scale) + { return (float) v * scale / face->get_upem (); } +}; +DECLARE_NULL_INSTANCE (hb_font_t); + + +#endif /* HB_FONT_HH */ diff --git a/src/hb-ft.cc b/src/hb-ft.cc index 7caafba..1900f30 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -27,47 +27,58 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" -#include "hb-debug.hh" +#include "hb.hh" #include "hb-ft.h" -#include "hb-font-private.hh" +#include "hb-font.hh" +#include "hb-machinery.hh" +#include "hb-cache.hh" #include FT_ADVANCES_H #include FT_MULTIPLE_MASTERS_H #include FT_TRUETYPE_TABLES_H +/** + * SECTION:hb-ft + * @title: hb-ft + * @short_description: FreeType integration + * @include: hb-ft.h + * + * Functions for using HarfBuzz with the FreeType library to provide face and + * font data. + **/ + + /* TODO: * * In general, this file does a fine job of what it's supposed to do. * There are, however, things that need more work: * - * - I remember seeing FT_Get_Advance() without the NO_HINTING flag to be buggy. - * Have not investigated. - * * - FreeType works in 26.6 mode. Clients can decide to use that mode, and everything * would work fine. However, we also abuse this API for performing in font-space, * but don't pass the correct flags to FreeType. We just abuse the no-hinting mode * for that, such that no rounding etc happens. As such, we don't set ppem, and * pass NO_HINTING as load_flags. Would be much better to use NO_SCALE, and scale - * ourselves, like we do in uniscribe, etc. + * ourselves. * * - We don't handle / allow for emboldening / obliqueing. * * - In the future, we should add constructors to create fonts in font space? - * - * - FT_Load_Glyph() is extremely costly. Do something about it? */ struct hb_ft_font_t { + mutable hb_mutex_t lock; FT_Face ft_face; int load_flags; bool symbol; /* Whether selected cmap is symbol cmap. */ bool unref; /* Whether to destroy ft_face when done. */ + + mutable hb_atomic_int_t cached_x_scale; + mutable hb_advance_cache_t advance_cache; }; static hb_ft_font_t * @@ -78,12 +89,16 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref) if (unlikely (!ft_font)) return nullptr; + ft_font->lock.init (); ft_font->ft_face = ft_face; ft_font->symbol = symbol; ft_font->unref = unref; ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING; + ft_font->cached_x_scale.set (0); + ft_font->advance_cache.init (); + return ft_font; } @@ -98,9 +113,13 @@ _hb_ft_font_destroy (void *data) { hb_ft_font_t *ft_font = (hb_ft_font_t *) data; + ft_font->advance_cache.fini (); + if (ft_font->unref) _hb_ft_face_destroy (ft_font->ft_face); + ft_font->lock.fini (); + free (ft_font); } @@ -116,7 +135,7 @@ _hb_ft_font_destroy (void *data) void hb_ft_font_set_load_flags (hb_font_t *font, int load_flags) { - if (font->immutable) + if (hb_object_is_immutable (font)) return; if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy) @@ -168,6 +187,7 @@ hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode); if (unlikely (!g)) @@ -191,6 +211,32 @@ hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED, return true; } +static unsigned int +hb_ft_get_nominal_glyphs (hb_font_t *font HB_UNUSED, + void *font_data, + unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + void *user_data HB_UNUSED) +{ + const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); + unsigned int done; + for (done = 0; + done < count && (*first_glyph = FT_Get_Char_Index (ft_font->ft_face, *first_unicode)); + done++) + { + first_unicode = &StructAtOffsetUnaligned (first_unicode, unicode_stride); + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + } + /* We don't need to do ft_font->symbol dance here, since HB calls the singular + * nominal_glyph() for what we don't handle here. */ + return done; +} + + static hb_bool_t hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED, void *font_data, @@ -200,6 +246,7 @@ hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); unsigned int g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector); if (unlikely (!g)) @@ -209,22 +256,45 @@ hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED, return true; } -static hb_position_t -hb_ft_get_glyph_h_advance (hb_font_t *font, - void *font_data, - hb_codepoint_t glyph, - void *user_data HB_UNUSED) +static void +hb_ft_get_glyph_h_advances (hb_font_t* font, void* font_data, + unsigned count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride, + void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; - FT_Fixed v; + hb_lock_t lock (ft_font->lock); + FT_Face ft_face = ft_font->ft_face; + int load_flags = ft_font->load_flags; + int mult = font->x_scale < 0 ? -1 : +1; - if (unlikely (FT_Get_Advance (ft_font->ft_face, glyph, ft_font->load_flags, &v))) - return 0; + if (font->x_scale != ft_font->cached_x_scale.get ()) + { + ft_font->advance_cache.clear (); + ft_font->cached_x_scale.set (font->x_scale); + } - if (font->x_scale < 0) - v = -v; + for (unsigned int i = 0; i < count; i++) + { + FT_Fixed v = 0; + hb_codepoint_t glyph = *first_glyph; - return (v + (1<<9)) >> 10; + unsigned int cv; + if (ft_font->advance_cache.get (glyph, &cv)) + v = cv; + else + { + FT_Get_Advance (ft_face, glyph, load_flags, &v); + ft_font->advance_cache.set (glyph, v); + } + + *first_advance = (v * mult + (1<<9)) >> 10; + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); + } } static hb_position_t @@ -234,6 +304,7 @@ hb_ft_get_glyph_v_advance (hb_font_t *font, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); FT_Fixed v; if (unlikely (FT_Get_Advance (ft_font->ft_face, glyph, ft_font->load_flags | FT_LOAD_VERTICAL_LAYOUT, &v))) @@ -256,6 +327,7 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) @@ -274,23 +346,6 @@ hb_ft_get_glyph_v_origin (hb_font_t *font, return true; } -static hb_position_t -hb_ft_get_glyph_h_kerning (hb_font_t *font, - void *font_data, - hb_codepoint_t left_glyph, - hb_codepoint_t right_glyph, - void *user_data HB_UNUSED) -{ - const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; - FT_Vector kerningv; - - FT_Kerning_Mode mode = font->x_ppem ? FT_KERNING_DEFAULT : FT_KERNING_UNFITTED; - if (FT_Get_Kerning (ft_font->ft_face, left_glyph, right_glyph, mode, &kerningv)) - return 0; - - return kerningv.x; -} - static hb_bool_t hb_ft_get_glyph_extents (hb_font_t *font, void *font_data, @@ -299,6 +354,7 @@ hb_ft_get_glyph_extents (hb_font_t *font, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) @@ -331,6 +387,7 @@ hb_ft_get_glyph_contour_point (hb_font_t *font HB_UNUSED, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; if (unlikely (FT_Load_Glyph (ft_face, glyph, ft_font->load_flags))) @@ -356,8 +413,10 @@ hb_ft_get_glyph_name (hb_font_t *font HB_UNUSED, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); + FT_Face ft_face = ft_font->ft_face; - hb_bool_t ret = !FT_Get_Glyph_Name (ft_font->ft_face, glyph, name, size); + hb_bool_t ret = !FT_Get_Glyph_Name (ft_face, glyph, name, size); if (ret && (size && !*name)) ret = false; @@ -372,6 +431,7 @@ hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; if (len < 0) @@ -404,10 +464,11 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + hb_lock_t lock (ft_font->lock); FT_Face ft_face = ft_font->ft_face; - metrics->ascender = ft_face->size->metrics.ascender; - metrics->descender = ft_face->size->metrics.descender; - metrics->line_gap = ft_face->size->metrics.height - (ft_face->size->metrics.ascender - ft_face->size->metrics.descender); + metrics->ascender = FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale); + metrics->descender = FT_MulFix(ft_face->descender, ft_face->size->metrics.y_scale); + metrics->line_gap = FT_MulFix( ft_face->height, ft_face->size->metrics.y_scale ) - (metrics->ascender - metrics->descender); if (font->y_scale < 0) { metrics->ascender = -metrics->ascender; @@ -417,41 +478,25 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, return true; } -static hb_font_funcs_t *static_ft_funcs = nullptr; - -#ifdef HB_USE_ATEXIT -static -void free_static_ft_funcs (void) -{ -retry: - hb_font_funcs_t *ft_funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ft_funcs); - if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, ft_funcs, nullptr)) - goto retry; - - hb_font_funcs_destroy (ft_funcs); -} +#if HB_USE_ATEXIT +static void free_static_ft_funcs (); #endif -static void -_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref) +static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t { -retry: - hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ft_funcs); - - if (unlikely (!funcs)) + static hb_font_funcs_t *create () { - funcs = hb_font_funcs_create (); + hb_font_funcs_t *funcs = hb_font_funcs_create (); hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, nullptr, nullptr); //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, nullptr, nullptr); hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, nullptr, nullptr); + hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ft_get_nominal_glyphs, nullptr, nullptr); hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, nullptr, nullptr); - hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ft_get_glyph_h_advance, nullptr, nullptr); + hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ft_get_glyph_h_advances, nullptr, nullptr); hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, nullptr, nullptr); //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, nullptr, nullptr); hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, nullptr, nullptr); - hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, nullptr, nullptr); - //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, nullptr, nullptr); hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, nullptr, nullptr); hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, nullptr, nullptr); hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, nullptr, nullptr); @@ -459,20 +504,35 @@ retry: hb_font_funcs_make_immutable (funcs); - if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, nullptr, funcs)) { - hb_font_funcs_destroy (funcs); - goto retry; - } +#if HB_USE_ATEXIT + atexit (free_static_ft_funcs); +#endif -#ifdef HB_USE_ATEXIT - atexit (free_static_ft_funcs); /* First person registers atexit() callback. */ + return funcs; + } +} static_ft_funcs; + +#if HB_USE_ATEXIT +static +void free_static_ft_funcs () +{ + static_ft_funcs.free_instance (); +} #endif - }; +static hb_font_funcs_t * +_hb_ft_get_font_funcs () +{ + return static_ft_funcs.get_unconst (); +} + +static void +_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref) +{ bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL; hb_font_set_funcs (font, - funcs, + _hb_ft_get_font_funcs (), _hb_ft_font_create (ft_face, symbol, unref), _hb_ft_font_destroy); } @@ -498,7 +558,10 @@ reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) error = FT_Load_Sfnt_Table (ft_face, tag, 0, buffer, &length); if (error) + { + free (buffer); return nullptr; + } return hb_blob_create ((const char *) buffer, length, HB_MEMORY_MODE_WRITABLE, @@ -681,47 +744,47 @@ hb_ft_font_create_referenced (FT_Face ft_face) return hb_ft_font_create (ft_face, _hb_ft_face_destroy); } +#if HB_USE_ATEXIT +static void free_static_ft_library (); +#endif -/* Thread-safe, lock-free, FT_Library */ +static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t +{ + static FT_Library create () + { + FT_Library l; + if (FT_Init_FreeType (&l)) + return nullptr; -static FT_Library ft_library; +#if HB_USE_ATEXIT + atexit (free_static_ft_library); +#endif -#ifdef HB_USE_ATEXIT + return l; + } + static void destroy (FT_Library l) + { + FT_Done_FreeType (l); + } + static FT_Library get_null () + { + return nullptr; + } +} static_ft_library; + +#if HB_USE_ATEXIT static -void free_ft_library (void) +void free_static_ft_library () { -retry: - FT_Library library = (FT_Library) hb_atomic_ptr_get (&ft_library); - if (!hb_atomic_ptr_cmpexch (&ft_library, library, nullptr)) - goto retry; - - FT_Done_FreeType (library); + static_ft_library.free_instance (); } #endif static FT_Library -get_ft_library (void) +get_ft_library () { -retry: - FT_Library library = (FT_Library) hb_atomic_ptr_get (&ft_library); - - if (unlikely (!library)) - { - /* Not found; allocate one. */ - if (FT_Init_FreeType (&library)) - return nullptr; - - if (!hb_atomic_ptr_cmpexch (&ft_library, nullptr, library)) { - FT_Done_FreeType (library); - goto retry; - } - -#ifdef HB_USE_ATEXIT - atexit (free_ft_library); /* First person registers atexit() callback. */ -#endif - } - - return library; + return static_ft_library.get_unconst (); } static void diff --git a/src/hb-glib.cc b/src/hb-glib.cc index 246380a..5763754 100644 --- a/src/hb-glib.cc +++ b/src/hb-glib.cc @@ -26,11 +26,21 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" +#include "hb.hh" #include "hb-glib.h" -#include "hb-unicode-private.hh" +#include "hb-machinery.hh" + + +/** + * SECTION:hb-glib + * @title: hb-glib + * @short_description: GLib integration + * @include: hb-glib.h + * + * Functions for using HarfBuzz with the GLib library to provide Unicode data. + **/ #if !GLIB_CHECK_VERSION(2,29,14) @@ -201,14 +211,6 @@ hb_glib_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED, return (hb_unicode_combining_class_t) g_unichar_combining_class (unicode); } -static unsigned int -hb_glib_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - return g_unichar_iswide (unicode) ? 2 : 1; -} - static hb_unicode_general_category_t hb_glib_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t unicode, @@ -333,81 +335,49 @@ hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, return ret; } -static unsigned int -hb_glib_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t u, - hb_codepoint_t *decomposed, - void *user_data HB_UNUSED) -{ -#if GLIB_CHECK_VERSION(2,29,12) - return g_unichar_fully_decompose (u, true, decomposed, HB_UNICODE_MAX_DECOMPOSITION_LEN); -#endif - - /* If the user doesn't have GLib >= 2.29.12 we have to perform - * a round trip to UTF-8 and the associated memory management dance. */ - gchar utf8[6]; - gchar *utf8_decomposed, *c; - gsize utf8_len, utf8_decomposed_len, i; - /* Convert @u to UTF-8 and normalise it in NFKD mode. This performs the compatibility decomposition. */ - utf8_len = g_unichar_to_utf8 (u, utf8); - utf8_decomposed = g_utf8_normalize (utf8, utf8_len, G_NORMALIZE_NFKD); - utf8_decomposed_len = g_utf8_strlen (utf8_decomposed, -1); +#if HB_USE_ATEXIT +static void free_static_glib_funcs (); +#endif - assert (utf8_decomposed_len <= HB_UNICODE_MAX_DECOMPOSITION_LEN); +static struct hb_glib_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t +{ + static hb_unicode_funcs_t *create () + { + hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr); - for (i = 0, c = utf8_decomposed; i < utf8_decomposed_len; i++, c = g_utf8_next_char (c)) - *decomposed++ = g_utf8_get_char (c); + hb_unicode_funcs_set_combining_class_func (funcs, hb_glib_unicode_combining_class, nullptr, nullptr); + hb_unicode_funcs_set_general_category_func (funcs, hb_glib_unicode_general_category, nullptr, nullptr); + hb_unicode_funcs_set_mirroring_func (funcs, hb_glib_unicode_mirroring, nullptr, nullptr); + hb_unicode_funcs_set_script_func (funcs, hb_glib_unicode_script, nullptr, nullptr); + hb_unicode_funcs_set_compose_func (funcs, hb_glib_unicode_compose, nullptr, nullptr); + hb_unicode_funcs_set_decompose_func (funcs, hb_glib_unicode_decompose, nullptr, nullptr); - g_free (utf8_decomposed); + hb_unicode_funcs_make_immutable (funcs); - return utf8_decomposed_len; -} +#if HB_USE_ATEXIT + atexit (free_static_glib_funcs); +#endif -static hb_unicode_funcs_t *static_glib_funcs = nullptr; + return funcs; + } +} static_glib_funcs; -#ifdef HB_USE_ATEXIT +#if HB_USE_ATEXIT static -void free_static_glib_funcs (void) +void free_static_glib_funcs () { -retry: - hb_unicode_funcs_t *glib_funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_glib_funcs); - if (!hb_atomic_ptr_cmpexch (&static_glib_funcs, glib_funcs, nullptr)) - goto retry; - - hb_unicode_funcs_destroy (glib_funcs); + static_glib_funcs.free_instance (); } #endif hb_unicode_funcs_t * -hb_glib_get_unicode_funcs (void) +hb_glib_get_unicode_funcs () { -retry: - hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_glib_funcs); - - if (unlikely (!funcs)) - { - funcs = hb_unicode_funcs_create (nullptr); - -#define HB_UNICODE_FUNC_IMPLEMENT(name) \ - hb_unicode_funcs_set_##name##_func (funcs, hb_glib_unicode_##name, nullptr, nullptr); - HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_UNICODE_FUNC_IMPLEMENT - - hb_unicode_funcs_make_immutable (funcs); - - if (!hb_atomic_ptr_cmpexch (&static_glib_funcs, nullptr, funcs)) { - hb_unicode_funcs_destroy (funcs); - goto retry; - } + return static_glib_funcs.get_unconst (); +} -#ifdef HB_USE_ATEXIT - atexit (free_static_glib_funcs); /* First person registers atexit() callback. */ -#endif - }; - return hb_unicode_funcs_reference (funcs); -} #if GLIB_CHECK_VERSION(2,31,10) diff --git a/src/hb-gobject-enums.cc.tmpl b/src/hb-gobject-enums.cc.tmpl index ca458a3..e3a9a6b 100644 --- a/src/hb-gobject-enums.cc.tmpl +++ b/src/hb-gobject-enums.cc.tmpl @@ -25,7 +25,7 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" +#include "hb.hh" /* g++ didn't like older gtype.h gcc-only code path. */ #include @@ -46,7 +46,7 @@ /*** BEGIN value-header ***/ GType -@enum_name@_get_type (void) +@enum_name@_get_type () { static gsize type_id = 0; diff --git a/src/hb-gobject-enums.h.tmpl b/src/hb-gobject-enums.h.tmpl index 606727c..7ef9dfc 100644 --- a/src/hb-gobject-enums.h.tmpl +++ b/src/hb-gobject-enums.h.tmpl @@ -43,7 +43,7 @@ HB_BEGIN_DECLS /*** BEGIN value-header ***/ HB_EXTERN GType -@enum_name@_get_type (void) G_GNUC_CONST; +@enum_name@_get_type () G_GNUC_CONST; #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) /*** END value-header ***/ diff --git a/src/hb-gobject-structs.cc b/src/hb-gobject-structs.cc index a96c358..3cff880 100644 --- a/src/hb-gobject-structs.cc +++ b/src/hb-gobject-structs.cc @@ -24,7 +24,19 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" +#include "hb.hh" + + +/** + * SECTION:hb-gobject + * @title: hb-gobject + * @short_description: GObject integration + * @include: hb-gobject.h + * + * Functions for using HarfBuzz with the GObject library to provide + * type data. + **/ + /* g++ didn't like older gtype.h gcc-only code path. */ #include @@ -39,7 +51,7 @@ #define HB_DEFINE_BOXED_TYPE(name,copy_func,free_func) \ GType \ -hb_gobject_##name##_get_type (void) \ +hb_gobject_##name##_get_type () \ { \ static gsize type_id = 0; \ if (g_once_init_enter (&type_id)) { \ @@ -52,7 +64,7 @@ hb_gobject_##name##_get_type (void) \ } #define HB_DEFINE_OBJECT_TYPE(name) \ - HB_DEFINE_BOXED_TYPE (name, hb_##name##_reference, hb_##name##_destroy); + HB_DEFINE_BOXED_TYPE (name, hb_##name##_reference, hb_##name##_destroy) #define HB_DEFINE_VALUE_TYPE(name) \ static hb_##name##_t *_hb_##name##_reference (const hb_##name##_t *l) \ @@ -63,7 +75,7 @@ hb_gobject_##name##_get_type (void) \ return c; \ } \ static void _hb_##name##_destroy (hb_##name##_t *l) { free (l); } \ - HB_DEFINE_BOXED_TYPE (name, _hb_##name##_reference, _hb_##name##_destroy); + HB_DEFINE_BOXED_TYPE (name, _hb_##name##_reference, _hb_##name##_destroy) HB_DEFINE_OBJECT_TYPE (buffer) HB_DEFINE_OBJECT_TYPE (blob) @@ -71,6 +83,7 @@ HB_DEFINE_OBJECT_TYPE (face) HB_DEFINE_OBJECT_TYPE (font) HB_DEFINE_OBJECT_TYPE (font_funcs) HB_DEFINE_OBJECT_TYPE (set) +HB_DEFINE_OBJECT_TYPE (map) HB_DEFINE_OBJECT_TYPE (shape_plan) HB_DEFINE_OBJECT_TYPE (unicode_funcs) HB_DEFINE_VALUE_TYPE (feature) diff --git a/src/hb-gobject-structs.h b/src/hb-gobject-structs.h index 302dc95..800beed 100644 --- a/src/hb-gobject-structs.h +++ b/src/hb-gobject-structs.h @@ -90,6 +90,10 @@ hb_gobject_set_get_type (void); #define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ()) HB_EXTERN GType +hb_gobject_map_get_type (void); +#define HB_GOBJECT_TYPE_MAP (hb_gobject_map_get_type ()) + +HB_EXTERN GType hb_gobject_shape_plan_get_type (void); #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ()) diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc index c20f6be..a1c602c 100644 --- a/src/hb-graphite2.cc +++ b/src/hb-graphite2.cc @@ -26,37 +26,46 @@ * Google Author(s): Behdad Esfahbod */ -#define HB_SHAPER graphite2 -#include "hb-shaper-impl-private.hh" +#include "hb-shaper-impl.hh" #include "hb-graphite2.h" #include +#include "hb-ot-layout.h" -HB_SHAPER_DATA_ENSURE_DEFINE(graphite2, face) -HB_SHAPER_DATA_ENSURE_DEFINE(graphite2, font) + +/** + * SECTION:hb-graphite2 + * @title: hb-graphite2 + * @short_description: Graphite2 integration + * @include: hb-graphite2.h + * + * Functions for using HarfBuzz with the Graphite2 fonts. + **/ /* * shaper face data */ -typedef struct hb_graphite2_tablelist_t { +typedef struct hb_graphite2_tablelist_t +{ struct hb_graphite2_tablelist_t *next; hb_blob_t *blob; unsigned int tag; } hb_graphite2_tablelist_t; -struct hb_graphite2_shaper_face_data_t { +struct hb_graphite2_face_data_t +{ hb_face_t *face; gr_face *grface; - hb_graphite2_tablelist_t *tlist; + hb_atomic_ptr_t tlist; }; static const void *hb_graphite2_get_table (const void *data, unsigned int tag, size_t *len) { - hb_graphite2_shaper_face_data_t *face_data = (hb_graphite2_shaper_face_data_t *) data; + hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data; hb_graphite2_tablelist_t *tlist = face_data->tlist; hb_blob_t *blob = nullptr; @@ -80,10 +89,10 @@ static const void *hb_graphite2_get_table (const void *data, unsigned int tag, s p->tag = tag; retry: - hb_graphite2_tablelist_t *tlist = (hb_graphite2_tablelist_t *) hb_atomic_ptr_get (&face_data->tlist); + hb_graphite2_tablelist_t *tlist = face_data->tlist; p->next = tlist; - if (!hb_atomic_ptr_cmpexch (&face_data->tlist, tlist, p)) + if (unlikely (!face_data->tlist.cmpexch (tlist, p))) goto retry; } @@ -93,7 +102,33 @@ retry: return d; } -hb_graphite2_shaper_face_data_t * +static void hb_graphite2_release_table(const void *data, const void *table_buffer) +{ + hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data; + hb_graphite2_tablelist_t *tlist = face_data->tlist; + + hb_graphite2_tablelist_t *prev = nullptr; + hb_graphite2_tablelist_t *curr = tlist; + while (curr) + { + if (hb_blob_get_data(curr->blob, nullptr) == table_buffer) + { + if (prev == nullptr) + face_data->tlist.cmpexch(tlist, curr->next); + else + prev->next = curr->next; + hb_blob_destroy(curr->blob); + free(curr); + break; + } + prev = curr; + curr = curr->next; + } +} + +static gr_face_ops hb_graphite2_face_ops = { sizeof(gr_face_ops), hb_graphite2_get_table, hb_graphite2_release_table }; + +hb_graphite2_face_data_t * _hb_graphite2_shaper_face_data_create (hb_face_t *face) { hb_blob_t *silf_blob = face->reference_table (HB_GRAPHITE2_TAG_SILF); @@ -106,12 +141,12 @@ _hb_graphite2_shaper_face_data_create (hb_face_t *face) } hb_blob_destroy (silf_blob); - hb_graphite2_shaper_face_data_t *data = (hb_graphite2_shaper_face_data_t *) calloc (1, sizeof (hb_graphite2_shaper_face_data_t)); + hb_graphite2_face_data_t *data = (hb_graphite2_face_data_t *) calloc (1, sizeof (hb_graphite2_face_data_t)); if (unlikely (!data)) return nullptr; data->face = face; - data->grface = gr_make_face (data, &hb_graphite2_get_table, gr_face_preloadAll); + data->grface = gr_make_face_with_ops (data, &hb_graphite2_face_ops, gr_face_preloadAll); if (unlikely (!data->grface)) { free (data); @@ -122,7 +157,7 @@ _hb_graphite2_shaper_face_data_create (hb_face_t *face) } void -_hb_graphite2_shaper_face_data_destroy (hb_graphite2_shaper_face_data_t *data) +_hb_graphite2_shaper_face_data_destroy (hb_graphite2_face_data_t *data) { hb_graphite2_tablelist_t *tlist = data->tlist; @@ -145,8 +180,8 @@ _hb_graphite2_shaper_face_data_destroy (hb_graphite2_shaper_face_data_t *data) gr_face * hb_graphite2_face_get_gr_face (hb_face_t *face) { - if (unlikely (!hb_graphite2_shaper_face_data_ensure (face))) return nullptr; - return HB_SHAPER_DATA_GET (face)->grface; + const hb_graphite2_face_data_t *data = face->data.graphite2; + return data ? data->grface : nullptr; } @@ -154,52 +189,33 @@ hb_graphite2_face_get_gr_face (hb_face_t *face) * shaper font data */ -struct hb_graphite2_shaper_font_data_t {}; +struct hb_graphite2_font_data_t {}; -hb_graphite2_shaper_font_data_t * +hb_graphite2_font_data_t * _hb_graphite2_shaper_font_data_create (hb_font_t *font HB_UNUSED) { - return (hb_graphite2_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; + return (hb_graphite2_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; } void -_hb_graphite2_shaper_font_data_destroy (hb_graphite2_shaper_font_data_t *data HB_UNUSED) +_hb_graphite2_shaper_font_data_destroy (hb_graphite2_font_data_t *data HB_UNUSED) { } -/* +/** + * hb_graphite2_font_get_gr_font: + * * Since: 0.9.10 + * Deprecated: 1.4.2 */ gr_font * -hb_graphite2_font_get_gr_font (hb_font_t *font) +hb_graphite2_font_get_gr_font (hb_font_t *font HB_UNUSED) { return nullptr; } /* - * shaper shape_plan data - */ - -struct hb_graphite2_shaper_shape_plan_data_t {}; - -hb_graphite2_shaper_shape_plan_data_t * -_hb_graphite2_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan HB_UNUSED, - const hb_feature_t *user_features HB_UNUSED, - unsigned int num_user_features HB_UNUSED, - const int *coords HB_UNUSED, - unsigned int num_coords HB_UNUSED) -{ - return (hb_graphite2_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED; -} - -void -_hb_graphite2_shaper_shape_plan_data_destroy (hb_graphite2_shaper_shape_plan_data_t *data HB_UNUSED) -{ -} - - -/* * shaper */ @@ -213,14 +229,14 @@ struct hb_graphite2_cluster_t { }; hb_bool_t -_hb_graphite2_shape (hb_shape_plan_t *shape_plan, +_hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features) { hb_face_t *face = font->face; - gr_face *grface = HB_SHAPER_DATA_GET (face)->grface; + gr_face *grface = face->data.graphite2->grface; const char *lang = hb_language_to_string (hb_buffer_get_language (buffer)); const char *lang_end = lang ? strchr (lang, '-') : nullptr; @@ -249,11 +265,16 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan, /* TODO ensure_native_direction. */ - hb_tag_t script_tag[2]; - hb_ot_tags_from_script (hb_buffer_get_script (buffer), &script_tag[0], &script_tag[1]); + hb_tag_t script_tag[HB_OT_MAX_TAGS_PER_SCRIPT]; + unsigned int count = HB_OT_MAX_TAGS_PER_SCRIPT; + hb_ot_tags_from_script_and_language (hb_buffer_get_script (buffer), + HB_LANGUAGE_INVALID, + &count, + script_tag, + nullptr, nullptr); seg = gr_make_seg (nullptr, grface, - script_tag[1] == HB_TAG_NONE ? script_tag[0] : script_tag[1], + count ? script_tag[count - 1] : HB_OT_TAG_DEFAULT_SCRIPT, feats, gr_utf32, chars, buffer->len, 2 | (hb_buffer_get_direction (buffer) == HB_DIRECTION_RTL ? 1 : 0)); diff --git a/src/hb-graphite2.h b/src/hb-graphite2.h index 05c55de..1720191 100644 --- a/src/hb-graphite2.h +++ b/src/hb-graphite2.h @@ -41,7 +41,7 @@ hb_graphite2_face_get_gr_face (hb_face_t *face); #ifndef HB_DISABLE_DEPRECATED -HB_EXTERN gr_font * +HB_EXTERN HB_DEPRECATED_FOR (hb_graphite2_face_get_gr_face) gr_font * hb_graphite2_font_get_gr_font (hb_font_t *font); #endif diff --git a/src/hb-icu.cc b/src/hb-icu.cc index c52e165..c26c91d 100644 --- a/src/hb-icu.cc +++ b/src/hb-icu.cc @@ -27,11 +27,11 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-private.hh" +#include "hb.hh" #include "hb-icu.h" -#include "hb-unicode-private.hh" +#include "hb-machinery.hh" #include #include @@ -40,6 +40,16 @@ #include +/** + * SECTION:hb-icu + * @title: hb-icu + * @short_description: ICU integration + * @include: hb-icu.h + * + * Functions for using HarfBuzz with the ICU library to provide Unicode data. + **/ + + hb_script_t hb_icu_script_to_script (UScriptCode script) { @@ -55,7 +65,8 @@ hb_icu_script_from_script (hb_script_t script) if (unlikely (script == HB_SCRIPT_INVALID)) return USCRIPT_INVALID_CODE; - for (unsigned int i = 0; i < USCRIPT_CODE_LIMIT; i++) + unsigned int numScriptCode = 1 + u_getIntPropertyMaxValue (UCHAR_SCRIPT); + for (unsigned int i = 0; i < numScriptCode; i++) if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script)) return (UScriptCode) i; @@ -72,25 +83,6 @@ hb_icu_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED, return (hb_unicode_combining_class_t) u_getCombiningClass (unicode); } -static unsigned int -hb_icu_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t unicode, - void *user_data HB_UNUSED) -{ - switch (u_getIntPropertyValue(unicode, UCHAR_EAST_ASIAN_WIDTH)) - { - case U_EA_WIDE: - case U_EA_FULLWIDTH: - return 2; - case U_EA_NEUTRAL: - case U_EA_AMBIGUOUS: - case U_EA_HALFWIDTH: - case U_EA_NARROW: - return 1; - } - return 1; -} - static hb_unicode_general_category_t hb_icu_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t unicode, @@ -164,10 +156,6 @@ hb_icu_unicode_script (hb_unicode_funcs_t *ufuncs HB_UNUSED, return hb_icu_script_to_script (scriptCode); } -#if U_ICU_VERSION_MAJOR_NUM >= 49 -static const UNormalizer2 *normalizer; -#endif - static hb_bool_t hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t a, @@ -177,6 +165,7 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, { #if U_ICU_VERSION_MAJOR_NUM >= 49 { + const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data; UChar32 ret = unorm2_composePair (normalizer, a, b); if (ret < 0) return false; *ab = ret; @@ -222,6 +211,7 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, { #if U_ICU_VERSION_MAJOR_NUM >= 49 { + const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data; UChar decomposed[4]; int len; UErrorCode icu_err = U_ZERO_ERROR; @@ -310,90 +300,51 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, return ret; } -static unsigned int -hb_icu_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED, - hb_codepoint_t u, - hb_codepoint_t *decomposed, - void *user_data HB_UNUSED) -{ - UChar utf16[2], normalized[2 * HB_UNICODE_MAX_DECOMPOSITION_LEN + 1]; - unsigned int len; - int32_t utf32_len; - hb_bool_t err; - UErrorCode icu_err; - - /* Copy @u into a UTF-16 array to be passed to ICU. */ - len = 0; - err = false; - U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), u, err); - if (err) - return 0; - - /* Normalise the codepoint using NFKD mode. */ - icu_err = U_ZERO_ERROR; - len = unorm2_normalize (unorm2_getNFKDInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err); - if (U_FAILURE (icu_err)) - return 0; - /* Convert the decomposed form from UTF-16 to UTF-32. */ - icu_err = U_ZERO_ERROR; - u_strToUTF32 ((UChar32*) decomposed, HB_UNICODE_MAX_DECOMPOSITION_LEN, &utf32_len, normalized, len, &icu_err); - if (U_FAILURE (icu_err)) - return 0; - - return utf32_len; -} - - -static hb_unicode_funcs_t *static_icu_funcs = nullptr; - -#ifdef HB_USE_ATEXIT -static -void free_static_icu_funcs (void) -{ -retry: - hb_unicode_funcs_t *icu_funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_icu_funcs); - if (!hb_atomic_ptr_cmpexch (&static_icu_funcs, icu_funcs, nullptr)) - goto retry; - - hb_unicode_funcs_destroy (icu_funcs); -} +#if HB_USE_ATEXIT +static void free_static_icu_funcs (); #endif -hb_unicode_funcs_t * -hb_icu_get_unicode_funcs (void) +static struct hb_icu_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t { -retry: - hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_icu_funcs); - - if (unlikely (!funcs)) + static hb_unicode_funcs_t *create () { + void *user_data = nullptr; #if U_ICU_VERSION_MAJOR_NUM >= 49 - if (!hb_atomic_ptr_get (&normalizer)) { - UErrorCode icu_err = U_ZERO_ERROR; - /* We ignore failure in getNFCInstace(). */ - (void) hb_atomic_ptr_cmpexch (&normalizer, nullptr, unorm2_getNFCInstance (&icu_err)); - } + UErrorCode icu_err = U_ZERO_ERROR; + user_data = (void *) unorm2_getNFCInstance (&icu_err); + assert (user_data); #endif - funcs = hb_unicode_funcs_create (nullptr); + hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr); -#define HB_UNICODE_FUNC_IMPLEMENT(name) \ - hb_unicode_funcs_set_##name##_func (funcs, hb_icu_unicode_##name, nullptr, nullptr); - HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_UNICODE_FUNC_IMPLEMENT + hb_unicode_funcs_set_combining_class_func (funcs, hb_icu_unicode_combining_class, nullptr, nullptr); + hb_unicode_funcs_set_general_category_func (funcs, hb_icu_unicode_general_category, nullptr, nullptr); + hb_unicode_funcs_set_mirroring_func (funcs, hb_icu_unicode_mirroring, nullptr, nullptr); + hb_unicode_funcs_set_script_func (funcs, hb_icu_unicode_script, nullptr, nullptr); + hb_unicode_funcs_set_compose_func (funcs, hb_icu_unicode_compose, user_data, nullptr); + hb_unicode_funcs_set_decompose_func (funcs, hb_icu_unicode_decompose, user_data, nullptr); hb_unicode_funcs_make_immutable (funcs); - if (!hb_atomic_ptr_cmpexch (&static_icu_funcs, nullptr, funcs)) { - hb_unicode_funcs_destroy (funcs); - goto retry; - } +#if HB_USE_ATEXIT + atexit (free_static_icu_funcs); +#endif + + return funcs; + } +} static_icu_funcs; -#ifdef HB_USE_ATEXIT - atexit (free_static_icu_funcs); /* First person registers atexit() callback. */ +#if HB_USE_ATEXIT +static +void free_static_icu_funcs () +{ + static_icu_funcs.free_instance (); +} #endif - }; - return hb_unicode_funcs_reference (funcs); +hb_unicode_funcs_t * +hb_icu_get_unicode_funcs () +{ + return static_icu_funcs.get_unconst (); } diff --git a/src/hb-iter.hh b/src/hb-iter.hh new file mode 100644 index 0000000..c4ab26d --- /dev/null +++ b/src/hb-iter.hh @@ -0,0 +1,153 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_ITER_HH +#define HB_ITER_HH + +#include "hb.hh" +#include "hb-null.hh" + + +/* Unified iterator object. + * + * The goal of this template is to make the same iterator interface + * available to all types, and make it very easy and compact to use. + * hb_iter_tator objects are small, light-weight, objects that can be + * copied by value. If the collection / object being iterated on + * is writable, then the iterator returns lvalues, otherwise it + * returns rvalues. + */ + +/* Base class for all iterators. */ +template +struct hb_iter_t +{ + typedef Iter iter_t; + typedef iter_t const_iter_t; + typedef Item item_t; + static constexpr unsigned item_size = hb_static_size (Item); + + private: + /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ + const iter_t* thiz () const { return static_cast (this); } + iter_t* thiz () { return static_cast< iter_t *> (this); } + public: + + /* Operators. */ + operator iter_t () { return iter(); } + explicit_operator bool () const { return more (); } + item_t& operator * () const { return item (); } + item_t& operator [] (signed i) const { return item_at ((unsigned) i); } + iter_t& operator += (unsigned count) { forward (count); return *thiz(); } + iter_t& operator ++ () { next (); return *thiz(); } + iter_t& operator -= (unsigned count) { rewind (count); return *thiz(); } + iter_t& operator -- () { prev (); return *thiz(); } + iter_t operator + (unsigned count) { iter_t c (*thiz()); c += count; return c; } + iter_t operator ++ (int) { iter_t c (*thiz()); ++*thiz(); return c; } + iter_t operator - (unsigned count) { iter_t c (*thiz()); c -= count; return c; } + iter_t operator -- (int) { iter_t c (*thiz()); --*thiz(); return c; } + + /* Methods. */ + iter_t iter () const { return *thiz(); } + const_iter_t const_iter () const { return iter (); } + item_t& item () const { return thiz()->__item__ (); } + item_t& item_at (unsigned i) const { return thiz()->__item_at__ (i); } + bool more () const { return thiz()->__more__ (); } + unsigned len () const { return thiz()->__len__ (); } + void next () { thiz()->__next__ (); } + void forward (unsigned n) { thiz()->__forward__ (n); } + void prev () { thiz()->__prev__ (); } + void rewind (unsigned n) { thiz()->__rewind__ (n); } + bool random_access () const { return thiz()->__random_access__ (); } + + protected: + hb_iter_t () {} + hb_iter_t (const hb_iter_t &o HB_UNUSED) {} + void operator = (const hb_iter_t &o HB_UNUSED) {} +}; + +/* Base class for sorted iterators. Does not enforce anything. + * Just for class taxonomy and requirements. */ +template +struct hb_sorted_iter_t : hb_iter_t +{ + protected: + hb_sorted_iter_t () {} + hb_sorted_iter_t (const hb_sorted_iter_t &o) : hb_iter_t (o) {} + void operator = (const hb_sorted_iter_t &o HB_UNUSED) {} +}; + +/* Mixin to fill in what the subclass doesn't provide. */ +template +struct hb_iter_mixin_t +{ + private: + /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ + const iter_t* thiz () const { return static_cast (this); } + iter_t* thiz () { return static_cast< iter_t *> (this); } + public: + + /* Access: Implement __item__(), or __item_at__() if random-access. */ + item_t& __item__ () const { return thiz()->item_at (0); } + item_t& __item_at__ (unsigned i) const { return *(thiz() + i); } + + /* Termination: Implement __more__(), or __len__() if random-access. */ + bool __more__ () const { return thiz()->__len__ (); } + unsigned __len__ () const + { iter_t c (*thiz()); unsigned l = 0; while (c) { c++; l++; }; return l; } + + /* Advancing: Implement __next__(), or __forward__() if random-access. */ + void __next__ () { thiz()->forward (1); } + void __forward__ (unsigned n) { while (n--) thiz()->next (); } + + /* Rewinding: Implement __prev__() or __rewind__() if bidirectional. */ + void __prev__ () { thiz()->rewind (1); } + void __rewind__ (unsigned n) { while (n--) thiz()->prev (); } + + /* Random access: Return true if item_at(), len(), forward() are fast. */ + bool __random_access__ () const { return false; } +}; + + +/* Functions operating on iterators or iteratables. */ + +template inline void +hb_fill (const C& c, const V &v) +{ + for (typename C::iter_t i (c); i; i++) + hb_assign (*i, v); +} + +template inline bool +hb_copy (hb_iter_t &id, hb_iter_t &is) +{ + for (; id && is; ++id, ++is) + *id = *is; + return !is; +} + + +#endif /* HB_ITER_HH */ diff --git a/src/hb-kern.hh b/src/hb-kern.hh new file mode 100644 index 0000000..fd5bb9e --- /dev/null +++ b/src/hb-kern.hh @@ -0,0 +1,139 @@ +/* + * 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_KERN_HH +#define HB_KERN_HH + +#include "hb-open-type.hh" +#include "hb-aat-layout-common.hh" +#include "hb-ot-layout-gpos-table.hh" + + +namespace OT { + + +template +struct hb_kern_machine_t +{ + hb_kern_machine_t (const Driver &driver_, + bool crossStream_ = false) : + driver (driver_), + crossStream (crossStream_) {} + + HB_NO_SANITIZE_SIGNED_INTEGER_OVERFLOW + void kern (hb_font_t *font, + hb_buffer_t *buffer, + hb_mask_t kern_mask, + bool scale = true) const + { + OT::hb_ot_apply_context_t c (1, font, buffer); + c.set_lookup_mask (kern_mask); + c.set_lookup_props (OT::LookupFlag::IgnoreMarks); + OT::hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c.iter_input; + skippy_iter.init (&c); + + bool horizontal = HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction); + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + hb_glyph_position_t *pos = buffer->pos; + for (unsigned int idx = 0; idx < count;) + { + if (!(info[idx].mask & kern_mask)) + { + idx++; + continue; + } + + skippy_iter.reset (idx, 1); + if (!skippy_iter.next ()) + { + idx++; + continue; + } + + unsigned int i = idx; + unsigned int j = skippy_iter.idx; + + hb_position_t kern = driver.get_kerning (info[i].codepoint, + info[j].codepoint); + + + if (likely (!kern)) + goto skip; + + if (horizontal) + { + if (scale) + kern = font->em_scale_x (kern); + if (crossStream) + { + pos[j].y_offset = kern; + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; + } + else + { + hb_position_t kern1 = kern >> 1; + hb_position_t kern2 = kern - kern1; + pos[i].x_advance += kern1; + pos[j].x_advance += kern2; + pos[j].x_offset += kern2; + } + } + else + { + if (scale) + kern = font->em_scale_y (kern); + if (crossStream) + { + pos[j].x_offset = kern; + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; + } + else + { + hb_position_t kern1 = kern >> 1; + hb_position_t kern2 = kern - kern1; + pos[i].y_advance += kern1; + pos[j].y_advance += kern2; + pos[j].y_offset += kern2; + } + } + + buffer->unsafe_to_break (i, j + 1); + + skip: + idx = skippy_iter.idx; + } + } + + const Driver &driver; + bool crossStream; +}; + + +} /* namespace OT */ + + +#endif /* HB_KERN_HH */ diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh new file mode 100644 index 0000000..b22c238 --- /dev/null +++ b/src/hb-machinery.hh @@ -0,0 +1,931 @@ +/* + * Copyright © 2007,2008,2009,2010 Red Hat, Inc. + * Copyright © 2012,2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_MACHINERY_HH +#define HB_MACHINERY_HH + +#include "hb.hh" +#include "hb-blob.hh" + +#include "hb-array.hh" +#include "hb-vector.hh" + + +/* + * Casts + */ + +/* Cast to struct T, reference to reference */ +template +static inline const Type& CastR(const TObject &X) +{ return reinterpret_cast (X); } +template +static inline Type& CastR(TObject &X) +{ return reinterpret_cast (X); } + +/* Cast to struct T, pointer to pointer */ +template +static inline const Type* CastP(const TObject *X) +{ return reinterpret_cast (X); } +template +static inline Type* CastP(TObject *X) +{ return reinterpret_cast (X); } + +/* StructAtOffset(P,Ofs) returns the struct T& that is placed at memory + * location pointed to by P plus Ofs bytes. */ +template +static inline const Type& StructAtOffset(const void *P, unsigned int offset) +{ return * reinterpret_cast ((const char *) P + offset); } +template +static inline Type& StructAtOffset(void *P, unsigned int offset) +{ return * reinterpret_cast ((char *) P + offset); } +template +static inline const Type& StructAtOffsetUnaligned(const void *P, unsigned int offset) +{ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" + return * reinterpret_cast ((char *) P + offset); +#pragma GCC diagnostic pop +} +template +static inline Type& StructAtOffsetUnaligned(void *P, unsigned int offset) +{ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" + return * reinterpret_cast ((char *) P + offset); +#pragma GCC diagnostic pop +} + +/* StructAfter(X) returns the struct T& that is placed after X. + * Works with X of variable size also. X must implement get_size() */ +template +static inline const Type& StructAfter(const TObject &X) +{ return StructAtOffset(&X, X.get_size()); } +template +static inline Type& StructAfter(TObject &X) +{ return StructAtOffset(&X, X.get_size()); } + + +/* + * Size checking + */ + +/* Check _assertion in a method environment */ +#define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \ + void _instance_assertion_on_line_##_line () const \ + { static_assert ((_assertion), ""); } +# define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion) +# define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion) + +/* Check that _code compiles in a method environment */ +#define _DEFINE_COMPILES_ASSERTION1(_line, _code) \ + void _compiles_assertion_on_line_##_line () const \ + { _code; } +# define _DEFINE_COMPILES_ASSERTION0(_line, _code) _DEFINE_COMPILES_ASSERTION1 (_line, _code) +# define DEFINE_COMPILES_ASSERTION(_code) _DEFINE_COMPILES_ASSERTION0 (__LINE__, _code) + + +#define DEFINE_SIZE_STATIC(size) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)) \ + unsigned int get_size () const { return (size); } \ + static constexpr unsigned null_size = (size); \ + static constexpr unsigned min_size = (size); \ + static constexpr unsigned static_size = (size) + +#define DEFINE_SIZE_UNION(size, _member) \ + DEFINE_COMPILES_ASSERTION ((void) this->u._member.static_size) \ + DEFINE_INSTANCE_ASSERTION (sizeof(this->u._member) == (size)) \ + static constexpr unsigned null_size = (size); \ + static constexpr unsigned min_size = (size) + +#define DEFINE_SIZE_MIN(size) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \ + static constexpr unsigned null_size = (size); \ + static constexpr unsigned min_size = (size) + +#define DEFINE_SIZE_UNBOUNDED(size) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \ + static constexpr unsigned min_size = (size) + +#define DEFINE_SIZE_ARRAY(size, array) \ + DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0])) \ + static constexpr unsigned null_size = (size); \ + static constexpr unsigned min_size = (size) + +#define DEFINE_SIZE_ARRAY_SIZED(size, array) \ + unsigned int get_size () const { return (size - (array).min_size + (array).get_size ()); } \ + DEFINE_SIZE_ARRAY(size, array) + + +/* + * Dispatch + */ + +template +struct hb_dispatch_context_t +{ + static constexpr unsigned max_debug_depth = MaxDebugDepth; + typedef Return return_t; + template + bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; } + static return_t no_dispatch_return_value () { return Context::default_return_value (); } + static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; } +}; + + +/* + * Sanitize + * + * + * === Introduction === + * + * The sanitize machinery is at the core of our zero-cost font loading. We + * mmap() font file into memory and create a blob out of it. Font subtables + * are returned as a readonly sub-blob of the main font blob. These table + * blobs are then sanitized before use, to ensure invalid memory access does + * not happen. The toplevel sanitize API use is like, eg. to load the 'head' + * table: + * + * hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table (face); + * + * The blob then can be converted to a head table struct with: + * + * const head *head_table = head_blob->as (); + * + * What the reference_table does is, to call hb_face_reference_table() to load + * the table blob, sanitize it and return either the sanitized blob, or empty + * blob if sanitization failed. The blob->as() function returns the null + * object of its template type argument if the blob is empty. Otherwise, it + * just casts the blob contents to the desired type. + * + * Sanitizing a blob of data with a type T works as follows (with minor + * simplification): + * + * - Cast blob content to T*, call sanitize() method of it, + * - If sanitize succeeded, return blob. + * - Otherwise, if blob is not writable, try making it writable, + * or copy if cannot be made writable in-place, + * - Call sanitize() again. Return blob if sanitize succeeded. + * - Return empty blob otherwise. + * + * + * === The sanitize() contract === + * + * The sanitize() method of each object type shall return true if it's safe to + * call other methods of the object, and false otherwise. + * + * Note that what sanitize() checks for might align with what the specification + * describes as valid table data, but does not have to be. In particular, we + * do NOT want to be pedantic and concern ourselves with validity checks that + * are irrelevant to our use of the table. On the contrary, we want to be + * lenient with error handling and accept invalid data to the extent that it + * does not impose extra burden on us. + * + * Based on the sanitize contract, one can see that what we check for depends + * on how we use the data in other table methods. Ie. if other table methods + * assume that offsets do NOT point out of the table data block, then that's + * something sanitize() must check for (GSUB/GPOS/GDEF/etc work this way). On + * the other hand, if other methods do such checks themselves, then sanitize() + * does not have to bother with them (glyf/local work this way). The choice + * depends on the table structure and sanitize() performance. For example, to + * check glyf/loca offsets in sanitize() would cost O(num-glyphs). We try hard + * to avoid such costs during font loading. By postponing such checks to the + * actual glyph loading, we reduce the sanitize cost to O(1) and total runtime + * cost to O(used-glyphs). As such, this is preferred. + * + * The same argument can be made re GSUB/GPOS/GDEF, but there, the table + * structure is so complicated that by checking all offsets at sanitize() time, + * we make the code much simpler in other methods, as offsets and referenced + * objects do not need to be validated at each use site. + */ + +/* This limits sanitizing time on really broken fonts. */ +#ifndef HB_SANITIZE_MAX_EDITS +#define HB_SANITIZE_MAX_EDITS 32 +#endif +#ifndef HB_SANITIZE_MAX_OPS_FACTOR +#define HB_SANITIZE_MAX_OPS_FACTOR 8 +#endif +#ifndef HB_SANITIZE_MAX_OPS_MIN +#define HB_SANITIZE_MAX_OPS_MIN 16384 +#endif +#ifndef HB_SANITIZE_MAX_OPS_MAX +#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF +#endif + +struct hb_sanitize_context_t : + hb_dispatch_context_t +{ + hb_sanitize_context_t () : + debug_depth (0), + start (nullptr), end (nullptr), + max_ops (0), + writable (false), edit_count (0), + blob (nullptr), + num_glyphs (65536), + num_glyphs_set (false) {} + + const char *get_name () { return "SANITIZE"; } + template + bool may_dispatch (const T *obj HB_UNUSED, const F *format) + { return format->sanitize (this); } + template + return_t dispatch (const T &obj) { return obj.sanitize (this); } + static return_t default_return_value () { return true; } + static return_t no_dispatch_return_value () { return false; } + bool stop_sublookup_iteration (const return_t r) const { return !r; } + + void init (hb_blob_t *b) + { + this->blob = hb_blob_reference (b); + this->writable = false; + } + + void set_num_glyphs (unsigned int num_glyphs_) + { + num_glyphs = num_glyphs_; + num_glyphs_set = true; + } + unsigned int get_num_glyphs () { return num_glyphs; } + + void set_max_ops (int max_ops_) { max_ops = max_ops_; } + + template + void set_object (const T *obj) + { + reset_object (); + + if (!obj) return; + + const char *obj_start = (const char *) obj; + if (unlikely (obj_start < this->start || this->end <= obj_start)) + this->start = this->end = nullptr; + else + { + this->start = obj_start; + this->end = obj_start + MIN (this->end - obj_start, obj->get_size ()); + } + } + + void reset_object () + { + this->start = this->blob->data; + this->end = this->start + this->blob->length; + assert (this->start <= this->end); /* Must not overflow. */ + } + + void start_processing () + { + reset_object (); + this->max_ops = MAX ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR, + (unsigned) HB_SANITIZE_MAX_OPS_MIN); + this->edit_count = 0; + this->debug_depth = 0; + + DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1, + "start [%p..%p] (%lu bytes)", + this->start, this->end, + (unsigned long) (this->end - this->start)); + } + + void end_processing () + { + DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1, + "end [%p..%p] %u edit requests", + this->start, this->end, this->edit_count); + + hb_blob_destroy (this->blob); + this->blob = nullptr; + this->start = this->end = nullptr; + } + + bool check_range (const void *base, + unsigned int len) const + { + const char *p = (const char *) base; + bool ok = this->start <= p && + p <= this->end && + (unsigned int) (this->end - p) >= len && + this->max_ops-- > 0; + + DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, + "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s", + p, p + len, len, + this->start, this->end, + ok ? "OK" : "OUT-OF-RANGE"); + + return likely (ok); + } + + template + bool check_range (const T *base, + unsigned int a, + unsigned int b) const + { + return !hb_unsigned_mul_overflows (a, b) && + this->check_range (base, a * b); + } + + template + bool check_range (const T *base, + unsigned int a, + unsigned int b, + unsigned int c) const + { + return !hb_unsigned_mul_overflows (a, b) && + this->check_range (base, a * b, c); + } + + template + bool check_array (const T *base, unsigned int len) const + { + return this->check_range (base, len, hb_static_size (T)); + } + + template + bool check_array (const T *base, + unsigned int a, + unsigned int b) const + { + return this->check_range (base, a, b, hb_static_size (T)); + } + + template + bool check_struct (const Type *obj) const + { return likely (this->check_range (obj, obj->min_size)); } + + bool may_edit (const void *base, unsigned int len) + { + if (this->edit_count >= HB_SANITIZE_MAX_EDITS) + return false; + + const char *p = (const char *) base; + this->edit_count++; + + DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, + "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s", + this->edit_count, + p, p + len, len, + this->start, this->end, + this->writable ? "GRANTED" : "DENIED"); + + return this->writable; + } + + template + bool try_set (const Type *obj, const ValueType &v) + { + if (this->may_edit (obj, hb_static_size (Type))) + { + hb_assign (* const_cast (obj), v); + return true; + } + return false; + } + + template + hb_blob_t *sanitize_blob (hb_blob_t *blob) + { + bool sane; + + init (blob); + + retry: + DEBUG_MSG_FUNC (SANITIZE, start, "start"); + + start_processing (); + + if (unlikely (!start)) + { + end_processing (); + return blob; + } + + Type *t = CastP (const_cast (start)); + + sane = t->sanitize (this); + if (sane) + { + if (edit_count) + { + DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %d edits; going for second round", edit_count); + + /* sanitize again to ensure no toe-stepping */ + edit_count = 0; + sane = t->sanitize (this); + if (edit_count) { + DEBUG_MSG_FUNC (SANITIZE, start, "requested %d edits in second round; FAILLING", edit_count); + sane = false; + } + } + } + else + { + if (edit_count && !writable) { + start = hb_blob_get_data_writable (blob, nullptr); + end = start + blob->length; + + if (start) + { + writable = true; + /* ok, we made it writable by relocating. try again */ + DEBUG_MSG_FUNC (SANITIZE, start, "retry"); + goto retry; + } + } + } + + end_processing (); + + DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED"); + if (sane) + { + hb_blob_make_immutable (blob); + return blob; + } + else + { + hb_blob_destroy (blob); + return hb_blob_get_empty (); + } + } + + template + hb_blob_t *reference_table (const hb_face_t *face, hb_tag_t tableTag = Type::tableTag) + { + if (!num_glyphs_set) + set_num_glyphs (hb_face_get_glyph_count (face)); + return sanitize_blob (hb_face_reference_table (face, tableTag)); + } + + mutable unsigned int debug_depth; + const char *start, *end; + mutable int max_ops; + private: + bool writable; + unsigned int edit_count; + hb_blob_t *blob; + unsigned int num_glyphs; + bool num_glyphs_set; +}; + +struct hb_sanitize_with_object_t +{ + template + hb_sanitize_with_object_t (hb_sanitize_context_t *c, + const T& obj) : c (c) + { c->set_object (obj); } + ~hb_sanitize_with_object_t () + { c->reset_object (); } + + private: + hb_sanitize_context_t *c; +}; + + +/* + * Serialize + */ + +struct hb_serialize_context_t +{ + hb_serialize_context_t (void *start_, unsigned int size) + { + this->start = (char *) start_; + this->end = this->start + size; + reset (); + } + + bool in_error () const { return !this->successful; } + + void reset () + { + this->successful = true; + this->head = this->start; + this->debug_depth = 0; + } + + bool propagate_error (bool e) + { return this->successful = this->successful && e; } + template bool propagate_error (const T &obj) + { return this->successful = this->successful && !obj.in_error (); } + template bool propagate_error (const T *obj) + { return this->successful = this->successful && !obj->in_error (); } + template bool propagate_error (T1 &o1, T2 &o2) + { return propagate_error (o1) && propagate_error (o2); } + template bool propagate_error (T1 *o1, T2 *o2) + { return propagate_error (o1) && propagate_error (o2); } + template + bool propagate_error (T1 &o1, T2 &o2, T3 &o3) + { return propagate_error (o1) && propagate_error (o2, o3); } + template + bool propagate_error (T1 *o1, T2 *o2, T3 *o3) + { return propagate_error (o1) && propagate_error (o2, o3); } + + /* To be called around main operation. */ + template + Type *start_serialize () + { + DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1, + "start [%p..%p] (%lu bytes)", + this->start, this->end, + (unsigned long) (this->end - this->start)); + + return start_embed (); + } + void end_serialize () + { + DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, -1, + "end [%p..%p] serialized %d bytes; %s", + this->start, this->end, + (int) (this->head - this->start), + this->successful ? "successful" : "UNSUCCESSFUL"); + } + + unsigned int length () const { return this->head - this->start; } + + void align (unsigned int alignment) + { + unsigned int l = length () % alignment; + if (l) + allocate_size (alignment - l); + } + + template + Type *start_embed (const Type *_ HB_UNUSED = nullptr) const + { + Type *ret = reinterpret_cast (this->head); + return ret; + } + + template + Type *allocate_size (unsigned int size) + { + if (unlikely (!this->successful || this->end - this->head < ptrdiff_t (size))) { + this->successful = false; + return nullptr; + } + memset (this->head, 0, size); + char *ret = this->head; + this->head += size; + return reinterpret_cast (ret); + } + + template + Type *allocate_min () + { + return this->allocate_size (Type::min_size); + } + + template + Type *embed (const Type &obj) + { + unsigned int size = obj.get_size (); + Type *ret = this->allocate_size (size); + if (unlikely (!ret)) return nullptr; + memcpy (ret, &obj, size); + return ret; + } + template + hb_serialize_context_t &operator << (const Type &obj) { embed (obj); return *this; } + + template + Type *extend_size (Type &obj, unsigned int size) + { + assert (this->start <= (char *) &obj); + assert ((char *) &obj <= this->head); + assert ((char *) &obj + size >= this->head); + if (unlikely (!this->allocate_size (((char *) &obj) + size - this->head))) return nullptr; + return reinterpret_cast (&obj); + } + + template + Type *extend_min (Type &obj) { return extend_size (obj, obj.min_size); } + + template + Type *extend (Type &obj) { return extend_size (obj, obj.get_size ()); } + + /* Output routines. */ + template + Type *copy () const + { + assert (this->successful); + unsigned int len = this->head - this->start; + void *p = malloc (len); + if (p) + memcpy (p, this->start, len); + return reinterpret_cast (p); + } + hb_bytes_t copy_bytes () const + { + assert (this->successful); + unsigned int len = this->head - this->start; + void *p = malloc (len); + if (p) + memcpy (p, this->start, len); + else + return hb_bytes_t (); + return hb_bytes_t ((char *) p, len); + } + hb_blob_t *copy_blob () const + { + assert (this->successful); + return hb_blob_create (this->start, + this->head - this->start, + HB_MEMORY_MODE_DUPLICATE, + nullptr, nullptr); + } + + public: + unsigned int debug_depth; + char *start, *end, *head; + bool successful; +}; + + + +/* + * Big-endian integers. + */ + +template struct BEInt; + +template +struct BEInt +{ + public: + void set (Type V) { v = V; } + operator Type () const { return v; } + private: uint8_t v; +}; +template +struct BEInt +{ + public: + void set (Type V) + { + v[0] = (V >> 8) & 0xFF; + v[1] = (V ) & 0xFF; + } + operator Type () const + { +#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \ + defined(__BYTE_ORDER) && \ + (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN) + /* Spoon-feed the compiler a big-endian integer with alignment 1. + * https://github.com/harfbuzz/harfbuzz/pull/1398 */ + struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; +#if __BYTE_ORDER == __LITTLE_ENDIAN + return __builtin_bswap16 (((packed_uint16_t *) this)->v); +#else /* __BYTE_ORDER == __BIG_ENDIAN */ + return ((packed_uint16_t *) this)->v; +#endif +#endif + return (v[0] << 8) + + (v[1] ); + } + private: uint8_t v[2]; +}; +template +struct BEInt +{ + public: + void set (Type V) + { + v[0] = (V >> 16) & 0xFF; + v[1] = (V >> 8) & 0xFF; + v[2] = (V ) & 0xFF; + } + operator Type () const + { + return (v[0] << 16) + + (v[1] << 8) + + (v[2] ); + } + private: uint8_t v[3]; +}; +template +struct BEInt +{ + public: + typedef Type type; + void set (Type V) + { + v[0] = (V >> 24) & 0xFF; + v[1] = (V >> 16) & 0xFF; + v[2] = (V >> 8) & 0xFF; + v[3] = (V ) & 0xFF; + } + operator Type () const + { + return (v[0] << 24) + + (v[1] << 16) + + (v[2] << 8) + + (v[3] ); + } + private: uint8_t v[4]; +}; + + +/* + * Lazy loaders. + */ + +template +struct hb_data_wrapper_t +{ + static_assert (WheresData > 0, ""); + + Data * get_data () const + { return *(((Data **) (void *) this) - WheresData); } + + bool is_inert () const { return !get_data (); } + + template + Stored * call_create () const { return Subclass::create (get_data ()); } +}; +template <> +struct hb_data_wrapper_t +{ + bool is_inert () const { return false; } + + template + Stored * call_create () const { return Funcs::create (); } +}; + +template struct hb_non_void_t { typedef T1 value; }; +template struct hb_non_void_t { typedef T2 value; }; + +template +struct hb_lazy_loader_t : hb_data_wrapper_t +{ + typedef typename hb_non_void_t + >::value Funcs; + + void init0 () {} /* Init, when memory is already set to 0. No-op for us. */ + void init () { instance.set_relaxed (nullptr); } + void fini () { do_destroy (instance.get ()); } + + void free_instance () + { + retry: + Stored *p = instance.get (); + if (unlikely (p && !cmpexch (p, nullptr))) + goto retry; + do_destroy (p); + } + + static void do_destroy (Stored *p) + { + if (p && p != const_cast (Funcs::get_null ())) + Funcs::destroy (p); + } + + const Returned * operator -> () const { return get (); } + const Returned & operator * () const { return *get (); } + explicit_operator bool () const + { return get_stored () != Funcs::get_null (); } + template operator const C * () const { return get (); } + + Stored * get_stored () const + { + retry: + Stored *p = this->instance.get (); + if (unlikely (!p)) + { + if (unlikely (this->is_inert ())) + return const_cast (Funcs::get_null ()); + + p = this->template call_create (); + if (unlikely (!p)) + p = const_cast (Funcs::get_null ()); + + if (unlikely (!cmpexch (nullptr, p))) + { + do_destroy (p); + goto retry; + } + } + return p; + } + Stored * get_stored_relaxed () const + { + return this->instance.get_relaxed (); + } + + bool cmpexch (Stored *current, Stored *value) const + { + /* This *must* be called when there are no other threads accessing. */ + return this->instance.cmpexch (current, value); + } + + const Returned * get () const { return Funcs::convert (get_stored ()); } + const Returned * get_relaxed () const { return Funcs::convert (get_stored_relaxed ()); } + Returned * get_unconst () const { return const_cast (Funcs::convert (get_stored ())); } + + /* To be possibly overloaded by subclasses. */ + static Returned* convert (Stored *p) { return p; } + + /* By default null/init/fini the object. */ + static const Stored* get_null () { return &Null(Stored); } + static Stored *create (Data *data) + { + Stored *p = (Stored *) calloc (1, sizeof (Stored)); + if (likely (p)) + p->init (data); + return p; + } + static Stored *create () + { + Stored *p = (Stored *) calloc (1, sizeof (Stored)); + if (likely (p)) + p->init (); + return p; + } + static void destroy (Stored *p) + { + p->fini (); + free (p); + } + +// private: + /* Must only have one pointer. */ + hb_atomic_ptr_t instance; +}; + +/* Specializations. */ + +template +struct hb_face_lazy_loader_t : hb_lazy_loader_t, + hb_face_t, WheresFace> {}; + +template +struct hb_table_lazy_loader_t : hb_lazy_loader_t, + hb_face_t, WheresFace, + hb_blob_t> +{ + static hb_blob_t *create (hb_face_t *face) + { return hb_sanitize_context_t ().reference_table (face); } + static void destroy (hb_blob_t *p) { hb_blob_destroy (p); } + + static const hb_blob_t *get_null () + { return hb_blob_get_empty (); } + + static const T* convert (const hb_blob_t *blob) + { return blob->as (); } + + hb_blob_t* get_blob () const { return this->get_stored (); } +}; + +template +struct hb_font_funcs_lazy_loader_t : hb_lazy_loader_t +{ + static void destroy (hb_font_funcs_t *p) + { hb_font_funcs_destroy (p); } + static const hb_font_funcs_t *get_null () + { return hb_font_funcs_get_empty (); } +}; +template +struct hb_unicode_funcs_lazy_loader_t : hb_lazy_loader_t +{ + static void destroy (hb_unicode_funcs_t *p) + { hb_unicode_funcs_destroy (p); } + static const hb_unicode_funcs_t *get_null () + { return hb_unicode_funcs_get_empty (); } +}; + + +#endif /* HB_MACHINERY_HH */ diff --git a/src/hb-map-private.hh b/src/hb-map-private.hh deleted file mode 100644 index d3d4dde..0000000 --- a/src/hb-map-private.hh +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright © 2018 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_MAP_PRIVATE_HH -#define HB_MAP_PRIVATE_HH - -#include "hb-private.hh" -#include "hb-object-private.hh" - - -template -inline uint32_t Hash (const T &v) -{ - /* Knuth's multiplicative method: */ - return (uint32_t) v * 2654435761u; -} - - -/* - * hb_map_t - */ - -struct hb_map_t -{ - struct item_t - { - hb_codepoint_t key; - hb_codepoint_t value; - - inline bool is_unused (void) const { return key == INVALID; } - inline bool is_tombstone (void) const { return key != INVALID && value == INVALID; } - }; - - hb_object_header_t header; - bool successful; /* Allocations successful */ - unsigned int population; /* Not including tombstones. */ - unsigned int occupancy; /* Including tombstones. */ - unsigned int mask; - unsigned int prime; - item_t *items; - - inline void init_shallow (void) - { - successful = true; - population = occupancy = 0; - mask = 0; - prime = 0; - items = nullptr; - } - inline void init (void) - { - hb_object_init (this); - init_shallow (); - } - inline void fini_shallow (void) - { - free (items); - } - inline void fini (void) - { - hb_object_fini (this); - fini_shallow (); - } - - inline bool resize (void) - { - if (unlikely (!successful)) return false; - - unsigned int power = _hb_bit_storage (population * 2 + 8); - unsigned int new_size = 1u << power; - item_t *new_items = (item_t *) malloc ((size_t) new_size * sizeof (item_t)); - if (unlikely (!new_items)) - { - successful = false; - return false; - } - memset (new_items, 0xFF, (size_t) new_size * sizeof (item_t)); - - unsigned int old_size = mask + 1; - item_t *old_items = items; - - /* Switch to new, empty, array. */ - population = occupancy = 0; - mask = new_size - 1; - prime = prime_for (power); - items = new_items; - - /* Insert back old items. */ - if (old_items) - for (unsigned int i = 0; i < old_size; i++) - if (old_items[i].key != INVALID && old_items[i].value != INVALID) - set (old_items[i].key, old_items[i].value); - - free (old_items); - - return true; - } - - inline void set (hb_codepoint_t key, hb_codepoint_t value) - { - if (unlikely (!successful)) return; - if (unlikely (key == INVALID)) return; - if ((occupancy + occupancy / 2) >= mask && !resize ()) return; - unsigned int i = bucket_for (key); - - if (value == INVALID && items[i].key != key) - return; /* Trying to delete non-existent key. */ - - if (!items[i].is_unused ()) - { - occupancy--; - if (items[i].is_tombstone ()) - population--; - } - - items[i].key = key; - items[i].value = value; - - occupancy++; - if (!items[i].is_tombstone ()) - population++; - - } - inline hb_codepoint_t get (hb_codepoint_t key) const - { - if (unlikely (!items)) return INVALID; - unsigned int i = bucket_for (key); - return items[i].key == key ? items[i].value : INVALID; - } - - inline void del (hb_codepoint_t key) - { - set (key, INVALID); - } - inline bool has (hb_codepoint_t key) const - { - return get (key) != INVALID; - } - - inline hb_codepoint_t operator [] (unsigned int key) const - { return get (key); } - - static const hb_codepoint_t INVALID = HB_MAP_VALUE_INVALID; - - inline void clear (void) - { - memset (items, 0xFF, ((size_t) mask + 1) * sizeof (item_t)); - population = occupancy = 0; - } - - inline bool is_empty (void) const - { - return population != 0; - } - - inline unsigned int get_population () const - { - return population; - } - - protected: - - inline unsigned int bucket_for (hb_codepoint_t key) const - { - unsigned int i = Hash (key) % prime; - unsigned int step = 0; - unsigned int tombstone = INVALID; - while (!items[i].is_unused ()) - { - if (items[i].key == key) - return i; - if (tombstone == INVALID && items[i].is_tombstone ()) - tombstone = i; - i = (i + ++step) & mask; - } - return tombstone == INVALID ? i : tombstone; - } - - static inline unsigned int prime_for (unsigned int shift) - { - /* Following comment and table copied from glib. */ - /* Each table size has an associated prime modulo (the first prime - * lower than the table size) used to find the initial bucket. Probing - * then works modulo 2^n. The prime modulo is necessary to get a - * good distribution with poor hash functions. - */ - /* Not declaring static to make all kinds of compilers happy... */ - /*static*/ const unsigned int prime_mod [32] = - { - 1, /* For 1 << 0 */ - 2, - 3, - 7, - 13, - 31, - 61, - 127, - 251, - 509, - 1021, - 2039, - 4093, - 8191, - 16381, - 32749, - 65521, /* For 1 << 16 */ - 131071, - 262139, - 524287, - 1048573, - 2097143, - 4194301, - 8388593, - 16777213, - 33554393, - 67108859, - 134217689, - 268435399, - 536870909, - 1073741789, - 2147483647 /* For 1 << 31 */ - }; - - if (unlikely (shift >= ARRAY_LENGTH (prime_mod))) - return prime_mod[ARRAY_LENGTH (prime_mod) - 1]; - - return prime_mod[shift]; - } -}; - - -#endif /* HB_MAP_PRIVATE_HH */ diff --git a/src/hb-map.cc b/src/hb-map.cc index e3ddae4..a2c770c 100644 --- a/src/hb-map.cc +++ b/src/hb-map.cc @@ -24,10 +24,19 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-map-private.hh" +#include "hb-map.hh" -/* Public API */ +/** + * SECTION:hb-map + * @title: hb-map + * @short_description: Object representing integer to integer mapping + * @include: hb.h + * + * Map objects are integer-to-integer hash-maps. Currently they are + * not used in the HarfBuzz public API, but are provided for client's + * use if desired. + **/ /** @@ -38,7 +47,7 @@ * Since: 1.7.7 **/ hb_map_t * -hb_map_create (void) +hb_map_create () { hb_map_t *map; @@ -58,7 +67,7 @@ hb_map_create (void) * Since: 1.7.7 **/ hb_map_t * -hb_map_get_empty (void) +hb_map_get_empty () { return const_cast (&Null(hb_map_t)); } @@ -157,8 +166,6 @@ hb_map_allocation_successful (const hb_map_t *map) * * * - * Return value: - * * Since: 1.7.7 **/ void @@ -188,7 +195,7 @@ hb_map_get (const hb_map_t *map, /** * hb_map_del: * @map: a map. - * @codepoint: + * @key: * * * @@ -204,7 +211,7 @@ hb_map_del (hb_map_t *map, /** * hb_map_has: * @map: a map. - * @codepoint: + * @key: * * * diff --git a/src/hb-map.hh b/src/hb-map.hh new file mode 100644 index 0000000..02d5406 --- /dev/null +++ b/src/hb-map.hh @@ -0,0 +1,252 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_MAP_HH +#define HB_MAP_HH + +#include "hb.hh" + + +template +inline uint32_t Hash (const T &v) +{ + /* Knuth's multiplicative method: */ + return (uint32_t) v * 2654435761u; +} + + +/* + * hb_map_t + */ + +struct hb_map_t +{ + HB_NO_COPY_ASSIGN (hb_map_t); + hb_map_t () { init (); } + ~hb_map_t () { fini (); } + + struct item_t + { + hb_codepoint_t key; + hb_codepoint_t value; + + bool is_unused () const { return key == INVALID; } + bool is_tombstone () const { return key != INVALID && value == INVALID; } + }; + + hb_object_header_t header; + bool successful; /* Allocations successful */ + unsigned int population; /* Not including tombstones. */ + unsigned int occupancy; /* Including tombstones. */ + unsigned int mask; + unsigned int prime; + item_t *items; + + void init_shallow () + { + successful = true; + population = occupancy = 0; + mask = 0; + prime = 0; + items = nullptr; + } + void init () + { + hb_object_init (this); + init_shallow (); + } + void fini_shallow () + { + free (items); + items = nullptr; + } + void fini () + { + population = occupancy = 0; + hb_object_fini (this); + fini_shallow (); + } + + bool in_error () const { return !successful; } + + bool resize () + { + if (unlikely (!successful)) return false; + + unsigned int power = hb_bit_storage (population * 2 + 8); + unsigned int new_size = 1u << power; + item_t *new_items = (item_t *) malloc ((size_t) new_size * sizeof (item_t)); + if (unlikely (!new_items)) + { + successful = false; + return false; + } + memset (new_items, 0xFF, (size_t) new_size * sizeof (item_t)); + + unsigned int old_size = mask + 1; + item_t *old_items = items; + + /* Switch to new, empty, array. */ + population = occupancy = 0; + mask = new_size - 1; + prime = prime_for (power); + items = new_items; + + /* Insert back old items. */ + if (old_items) + for (unsigned int i = 0; i < old_size; i++) + if (old_items[i].key != INVALID && old_items[i].value != INVALID) + set (old_items[i].key, old_items[i].value); + + free (old_items); + + return true; + } + + void set (hb_codepoint_t key, hb_codepoint_t value) + { + if (unlikely (!successful)) return; + if (unlikely (key == INVALID)) return; + if ((occupancy + occupancy / 2) >= mask && !resize ()) return; + unsigned int i = bucket_for (key); + + if (value == INVALID && items[i].key != key) + return; /* Trying to delete non-existent key. */ + + if (!items[i].is_unused ()) + { + occupancy--; + if (items[i].is_tombstone ()) + population--; + } + + items[i].key = key; + items[i].value = value; + + occupancy++; + if (!items[i].is_tombstone ()) + population++; + + } + hb_codepoint_t get (hb_codepoint_t key) const + { + if (unlikely (!items)) return INVALID; + unsigned int i = bucket_for (key); + return items[i].key == key ? items[i].value : INVALID; + } + + void del (hb_codepoint_t key) { set (key, INVALID); } + + bool has (hb_codepoint_t key) const + { return get (key) != INVALID; } + + hb_codepoint_t operator [] (unsigned int key) const + { return get (key); } + + static constexpr hb_codepoint_t INVALID = HB_MAP_VALUE_INVALID; + + void clear () + { + memset (items, 0xFF, ((size_t) mask + 1) * sizeof (item_t)); + population = occupancy = 0; + } + + bool is_empty () const { return population == 0; } + + unsigned int get_population () const { return population; } + + protected: + + unsigned int bucket_for (hb_codepoint_t key) const + { + unsigned int i = Hash (key) % prime; + unsigned int step = 0; + unsigned int tombstone = INVALID; + while (!items[i].is_unused ()) + { + if (items[i].key == key) + return i; + if (tombstone == INVALID && items[i].is_tombstone ()) + tombstone = i; + i = (i + ++step) & mask; + } + return tombstone == INVALID ? i : tombstone; + } + + static unsigned int prime_for (unsigned int shift) + { + /* Following comment and table copied from glib. */ + /* Each table size has an associated prime modulo (the first prime + * lower than the table size) used to find the initial bucket. Probing + * then works modulo 2^n. The prime modulo is necessary to get a + * good distribution with poor hash functions. + */ + /* Not declaring static to make all kinds of compilers happy... */ + /*static*/ const unsigned int prime_mod [32] = + { + 1, /* For 1 << 0 */ + 2, + 3, + 7, + 13, + 31, + 61, + 127, + 251, + 509, + 1021, + 2039, + 4093, + 8191, + 16381, + 32749, + 65521, /* For 1 << 16 */ + 131071, + 262139, + 524287, + 1048573, + 2097143, + 4194301, + 8388593, + 16777213, + 33554393, + 67108859, + 134217689, + 268435399, + 536870909, + 1073741789, + 2147483647 /* For 1 << 31 */ + }; + + if (unlikely (shift >= ARRAY_LENGTH (prime_mod))) + return prime_mod[ARRAY_LENGTH (prime_mod) - 1]; + + return prime_mod[shift]; + } +}; + + +#endif /* HB_MAP_HH */ diff --git a/src/hb-mutex-private.hh b/src/hb-mutex-private.hh deleted file mode 100644 index 14bde31..0000000 --- a/src/hb-mutex-private.hh +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright © 2007 Chris Wilson - * Copyright © 2009,2010 Red Hat, Inc. - * 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. - * - * Contributor(s): - * Chris Wilson - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_MUTEX_PRIVATE_HH -#define HB_MUTEX_PRIVATE_HH - -#include "hb-private.hh" - - -/* mutex */ - -/* We need external help for these */ - -#if defined(HB_MUTEX_IMPL_INIT) \ - && defined(hb_mutex_impl_init) \ - && defined(hb_mutex_impl_lock) \ - && defined(hb_mutex_impl_unlock) \ - && defined(hb_mutex_impl_finish) - -/* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */ - - -#elif !defined(HB_NO_MT) && (defined(_WIN32) || defined(__CYGWIN__)) - -#include -typedef CRITICAL_SECTION hb_mutex_impl_t; -#define HB_MUTEX_IMPL_INIT {0} -#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) -#define hb_mutex_impl_init(M) InitializeCriticalSectionEx (M, 0, 0) -#else -#define hb_mutex_impl_init(M) InitializeCriticalSection (M) -#endif -#define hb_mutex_impl_lock(M) EnterCriticalSection (M) -#define hb_mutex_impl_unlock(M) LeaveCriticalSection (M) -#define hb_mutex_impl_finish(M) DeleteCriticalSection (M) - - -#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__)) - -#include -typedef pthread_mutex_t hb_mutex_impl_t; -#define HB_MUTEX_IMPL_INIT PTHREAD_MUTEX_INITIALIZER -#define hb_mutex_impl_init(M) pthread_mutex_init (M, nullptr) -#define hb_mutex_impl_lock(M) pthread_mutex_lock (M) -#define hb_mutex_impl_unlock(M) pthread_mutex_unlock (M) -#define hb_mutex_impl_finish(M) pthread_mutex_destroy (M) - - -#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES) - -#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD) -# include -# define HB_SCHED_YIELD() sched_yield () -#else -# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END -#endif - -/* This actually is not a totally awful implementation. */ -typedef volatile int hb_mutex_impl_t; -#define HB_MUTEX_IMPL_INIT 0 -#define hb_mutex_impl_init(M) *(M) = 0 -#define hb_mutex_impl_lock(M) HB_STMT_START { while (__sync_lock_test_and_set((M), 1)) HB_SCHED_YIELD (); } HB_STMT_END -#define hb_mutex_impl_unlock(M) __sync_lock_release (M) -#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END - - -#elif !defined(HB_NO_MT) - -#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD) -# include -# define HB_SCHED_YIELD() sched_yield () -#else -# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END -#endif - -#define HB_MUTEX_INT_NIL 1 /* Warn that fallback implementation is in use. */ -typedef volatile int hb_mutex_impl_t; -#define HB_MUTEX_IMPL_INIT 0 -#define hb_mutex_impl_init(M) *(M) = 0 -#define hb_mutex_impl_lock(M) HB_STMT_START { while (*(M)) HB_SCHED_YIELD (); (*(M))++; } HB_STMT_END -#define hb_mutex_impl_unlock(M) (*(M))--; -#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END - - -#else /* HB_NO_MT */ - -typedef int hb_mutex_impl_t; -#define HB_MUTEX_IMPL_INIT 0 -#define hb_mutex_impl_init(M) HB_STMT_START {} HB_STMT_END -#define hb_mutex_impl_lock(M) HB_STMT_START {} HB_STMT_END -#define hb_mutex_impl_unlock(M) HB_STMT_START {} HB_STMT_END -#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END - - -#endif - - -#define HB_MUTEX_INIT {HB_MUTEX_IMPL_INIT} - -struct hb_mutex_t -{ - /* TODO Add tracing. */ - - hb_mutex_impl_t m; - - inline void init (void) { hb_mutex_impl_init (&m); } - inline void lock (void) { hb_mutex_impl_lock (&m); } - inline void unlock (void) { hb_mutex_impl_unlock (&m); } - inline void fini (void) { hb_mutex_impl_finish (&m); } -}; - - -#endif /* HB_MUTEX_PRIVATE_HH */ diff --git a/src/hb-mutex.hh b/src/hb-mutex.hh new file mode 100644 index 0000000..35f1fde --- /dev/null +++ b/src/hb-mutex.hh @@ -0,0 +1,149 @@ +/* + * Copyright © 2007 Chris Wilson + * Copyright © 2009,2010 Red Hat, Inc. + * 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. + * + * Contributor(s): + * Chris Wilson + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_MUTEX_HH +#define HB_MUTEX_HH + +#include "hb.hh" + + +/* mutex */ + +/* We need external help for these */ + +#if defined(HB_MUTEX_IMPL_INIT) \ + && defined(hb_mutex_impl_init) \ + && defined(hb_mutex_impl_lock) \ + && defined(hb_mutex_impl_unlock) \ + && defined(hb_mutex_impl_finish) + +/* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */ + + +#elif !defined(HB_NO_MT) && defined(_WIN32) + +#include +typedef CRITICAL_SECTION hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT {0} +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP) +#define hb_mutex_impl_init(M) InitializeCriticalSectionEx (M, 0, 0) +#else +#define hb_mutex_impl_init(M) InitializeCriticalSection (M) +#endif +#define hb_mutex_impl_lock(M) EnterCriticalSection (M) +#define hb_mutex_impl_unlock(M) LeaveCriticalSection (M) +#define hb_mutex_impl_finish(M) DeleteCriticalSection (M) + + +#elif !defined(HB_NO_MT) && (defined(HAVE_PTHREAD) || defined(__APPLE__)) + +#include +typedef pthread_mutex_t hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT PTHREAD_MUTEX_INITIALIZER +#define hb_mutex_impl_init(M) pthread_mutex_init (M, nullptr) +#define hb_mutex_impl_lock(M) pthread_mutex_lock (M) +#define hb_mutex_impl_unlock(M) pthread_mutex_unlock (M) +#define hb_mutex_impl_finish(M) pthread_mutex_destroy (M) + + +#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES) + +#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD) +# include +# define HB_SCHED_YIELD() sched_yield () +#else +# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END +#endif + +/* This actually is not a totally awful implementation. */ +typedef volatile int hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT 0 +#define hb_mutex_impl_init(M) *(M) = 0 +#define hb_mutex_impl_lock(M) HB_STMT_START { while (__sync_lock_test_and_set((M), 1)) HB_SCHED_YIELD (); } HB_STMT_END +#define hb_mutex_impl_unlock(M) __sync_lock_release (M) +#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END + + +#elif !defined(HB_NO_MT) + +#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD) +# include +# define HB_SCHED_YIELD() sched_yield () +#else +# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END +#endif + +#define HB_MUTEX_INT_NIL 1 /* Warn that fallback implementation is in use. */ +typedef volatile int hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT 0 +#define hb_mutex_impl_init(M) *(M) = 0 +#define hb_mutex_impl_lock(M) HB_STMT_START { while (*(M)) HB_SCHED_YIELD (); (*(M))++; } HB_STMT_END +#define hb_mutex_impl_unlock(M) (*(M))--; +#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END + + +#else /* HB_NO_MT */ + +typedef int hb_mutex_impl_t; +#define HB_MUTEX_IMPL_INIT 0 +#define hb_mutex_impl_init(M) HB_STMT_START {} HB_STMT_END +#define hb_mutex_impl_lock(M) HB_STMT_START {} HB_STMT_END +#define hb_mutex_impl_unlock(M) HB_STMT_START {} HB_STMT_END +#define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END + + +#endif + + +#define HB_MUTEX_INIT {HB_MUTEX_IMPL_INIT} + +struct hb_mutex_t +{ + /* TODO Add tracing. */ + + hb_mutex_impl_t m; + + void init () { hb_mutex_impl_init (&m); } + void lock () { hb_mutex_impl_lock (&m); } + void unlock () { hb_mutex_impl_unlock (&m); } + void fini () { hb_mutex_impl_finish (&m); } +}; + +struct hb_lock_t +{ + hb_lock_t (hb_mutex_t &mutex_) : mutex (mutex_) { mutex.lock (); } + ~hb_lock_t () { mutex.unlock (); } + private: + hb_mutex_t &mutex; +}; + + +#endif /* HB_MUTEX_HH */ diff --git a/src/hb-null.hh b/src/hb-null.hh new file mode 100644 index 0000000..204c2fe --- /dev/null +++ b/src/hb-null.hh @@ -0,0 +1,204 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_NULL_HH +#define HB_NULL_HH + +#include "hb.hh" + + +/* + * Static pools + */ + +/* Global nul-content Null pool. Enlarge as necessary. */ + +#define HB_NULL_POOL_SIZE 9880 + +/* Use SFINAE to sniff whether T has min_size; in which case return T::null_size, + * otherwise return sizeof(T). */ + +/* The hard way... + * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol + */ + +template struct _hb_bool_type {}; + +template +struct _hb_null_size +{ enum { value = sizeof (T) }; }; +template +struct _hb_null_size > +{ enum { value = T::null_size }; }; + +template +struct hb_null_size +{ enum { value = _hb_null_size >::value }; }; +#define hb_null_size(T) hb_null_size::value + +/* These doesn't belong here, but since is copy/paste from above, put it here. */ + +/* hb_static_size (T) + * Returns T::static_size if T::min_size is defined, or sizeof (T) otherwise. */ + +template +struct _hb_static_size +{ enum { value = sizeof (T) }; }; +template +struct _hb_static_size > +{ enum { value = T::static_size }; }; + +template +struct hb_static_size +{ enum { value = _hb_static_size >::value }; }; +#define hb_static_size(T) hb_static_size::value + + +/* hb_assign (obj, value) + * Calls obj.set (value) if obj.min_size is defined and value has different type + * from obj, or obj = v otherwise. */ + +template +struct _hb_assign +{ static inline void value (T &o, const V v) { o = v; } }; +template +struct _hb_assign > +{ static inline void value (T &o, const V v) { o.set (v); } }; +template +struct _hb_assign > +{ static inline void value (T &o, const T v) { o = v; } }; + +template +static inline void hb_assign (T &o, const V v) +{ _hb_assign >::value (o, v); } + + +/* + * Null() + */ + +extern HB_INTERNAL +hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; + +/* Generic nul-content Null objects. */ +template +static inline Type const & Null () { + static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); + return *reinterpret_cast (_hb_NullPool); +} +template +struct NullHelper +{ + typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type; + static const Type & get_null () { return Null (); } +}; +#define Null(Type) NullHelper::get_null () + +/* Specializations for arbitrary-content Null objects expressed in bytes. */ +#define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \ + } /* Close namespace. */ \ + extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]; \ + template <> \ + /*static*/ inline const Namespace::Type& Null () { \ + return *reinterpret_cast (_hb_Null_##Namespace##_##Type); \ + } \ + namespace Namespace { \ + static_assert (true, "Just so we take semicolon after.") +#define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \ + const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size] + +/* Specializations for arbitrary-content Null objects expressed as struct initializer. */ +#define DECLARE_NULL_INSTANCE(Type) \ + extern HB_INTERNAL const Type _hb_Null_##Type; \ + template <> \ + /*static*/ inline const Type& Null () { \ + return _hb_Null_##Type; \ + } \ +static_assert (true, "Just so we take semicolon after.") +#define DEFINE_NULL_INSTANCE(Type) \ + const Type _hb_Null_##Type + +/* Global writable pool. Enlarge as necessary. */ + +/* To be fully correct, CrapPool must be thread_local. However, we do not rely on CrapPool + * for correct operation. It only exist to catch and divert program logic bugs instead of + * causing bad memory access. So, races there are not actually introducing incorrectness + * in the code. Has ~12kb binary size overhead to have it, also clang build fails with it. */ +extern HB_INTERNAL +/*thread_local*/ hb_vector_size_impl_t _hb_CrapPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; + +/* CRAP pool: Common Region for Access Protection. */ +template +static inline Type& Crap () { + static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); + Type *obj = reinterpret_cast (_hb_CrapPool); + memcpy (obj, &Null(Type), sizeof (*obj)); + return *obj; +} +template +struct CrapHelper +{ + typedef typename hb_remove_const (typename hb_remove_reference (QType)) Type; + static Type & get_crap () { return Crap (); } +}; +#define Crap(Type) CrapHelper::get_crap () + +template +struct CrapOrNullHelper { + static Type & get () { return Crap(Type); } +}; +template +struct CrapOrNullHelper { + static const Type & get () { return Null(Type); } +}; +#define CrapOrNull(Type) CrapOrNullHelper::get () + + +/* + * hb_nonnull_ptr_t + */ + +template +struct hb_nonnull_ptr_t +{ + typedef typename hb_remove_pointer (P) T; + + hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {} + T * operator = (T *v_) { return v = v_; } + T * operator -> () const { return get (); } + T & operator * () const { return *get (); } + T ** operator & () const { return &v; } + /* Only auto-cast to const types. */ + template operator const C * () const { return get (); } + operator const char * () const { return (const char *) get (); } + T * get () const { return v ? v : const_cast (&Null(T)); } + T * get_raw () const { return v; } + + T *v; +}; + + +#endif /* HB_NULL_HH */ diff --git a/src/hb-object-private.hh b/src/hb-object-private.hh deleted file mode 100644 index fc48a91..0000000 --- a/src/hb-object-private.hh +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright © 2007 Chris Wilson - * Copyright © 2009,2010 Red Hat, Inc. - * 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. - * - * Contributor(s): - * Chris Wilson - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_OBJECT_PRIVATE_HH -#define HB_OBJECT_PRIVATE_HH - -#include "hb-private.hh" -#include "hb-debug.hh" - -#include "hb-atomic-private.hh" -#include "hb-mutex-private.hh" - - -/* reference_count */ - -#define HB_REFERENCE_COUNT_INERT_VALUE 0 -#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD -#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT (HB_REFERENCE_COUNT_INERT_VALUE)} - -struct hb_reference_count_t -{ - hb_atomic_int_t ref_count; - - inline void init (int v) { ref_count.set_unsafe (v); } - inline int get_unsafe (void) const { return ref_count.get_unsafe (); } - inline int inc (void) { return ref_count.inc (); } - inline int dec (void) { return ref_count.dec (); } - inline void fini (void) { ref_count.set_unsafe (HB_REFERENCE_COUNT_POISON_VALUE); } - - inline bool is_inert (void) const { return ref_count.get_unsafe () == HB_REFERENCE_COUNT_INERT_VALUE; } - inline bool is_valid (void) const { return ref_count.get_unsafe () > 0; } -}; - - -/* user_data */ - -struct hb_user_data_array_t -{ - struct hb_user_data_item_t { - hb_user_data_key_t *key; - void *data; - hb_destroy_func_t destroy; - - inline bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; } - inline bool operator == (hb_user_data_item_t &other) const { return key == other.key; } - - void fini (void) { if (destroy) destroy (data); } - }; - - hb_mutex_t lock; - hb_lockable_set_t items; - - inline void init (void) { lock.init (); items.init (); } - - HB_INTERNAL bool set (hb_user_data_key_t *key, - void * data, - hb_destroy_func_t destroy, - hb_bool_t replace); - - HB_INTERNAL void *get (hb_user_data_key_t *key); - - inline void fini (void) { items.fini (lock); lock.fini (); } -}; - - -/* object_header */ - -struct hb_object_header_t -{ - hb_reference_count_t ref_count; - hb_user_data_array_t *user_data; - -#define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INIT, nullptr} - - private: - ASSERT_POD (); -}; - - -/* object */ - -template -static inline void hb_object_trace (const Type *obj, const char *function) -{ - DEBUG_MSG (OBJECT, (void *) obj, - "%s refcount=%d", - function, - obj ? obj->header.ref_count.get_unsafe () : 0); -} - -template -static inline Type *hb_object_create (void) -{ - Type *obj = (Type *) calloc (1, sizeof (Type)); - - if (unlikely (!obj)) - return obj; - - hb_object_init (obj); - hb_object_trace (obj, HB_FUNC); - return obj; -} -template -static inline void hb_object_init (Type *obj) -{ - obj->header.ref_count.init (1); - obj->header.user_data = nullptr; -} -template -static inline bool hb_object_is_inert (const Type *obj) -{ - return unlikely (obj->header.ref_count.is_inert ()); -} -template -static inline bool hb_object_is_valid (const Type *obj) -{ - return likely (obj->header.ref_count.is_valid ()); -} -template -static inline Type *hb_object_reference (Type *obj) -{ - hb_object_trace (obj, HB_FUNC); - if (unlikely (!obj || hb_object_is_inert (obj))) - return obj; - assert (hb_object_is_valid (obj)); - obj->header.ref_count.inc (); - return obj; -} -template -static inline bool hb_object_destroy (Type *obj) -{ - hb_object_trace (obj, HB_FUNC); - if (unlikely (!obj || hb_object_is_inert (obj))) - return false; - assert (hb_object_is_valid (obj)); - if (obj->header.ref_count.dec () != 1) - return false; - - hb_object_fini (obj); - return true; -} -template -static inline void hb_object_fini (Type *obj) -{ - obj->header.ref_count.fini (); /* Do this before user_data */ - if (obj->header.user_data) - { - obj->header.user_data->fini (); - free (obj->header.user_data); - } -} -template -static inline bool hb_object_set_user_data (Type *obj, - hb_user_data_key_t *key, - void * data, - hb_destroy_func_t destroy, - hb_bool_t replace) -{ - if (unlikely (!obj || hb_object_is_inert (obj))) - return false; - assert (hb_object_is_valid (obj)); - -retry: - hb_user_data_array_t *user_data = (hb_user_data_array_t *) hb_atomic_ptr_get (&obj->header.user_data); - if (unlikely (!user_data)) - { - user_data = (hb_user_data_array_t *) calloc (sizeof (hb_user_data_array_t), 1); - if (unlikely (!user_data)) - return false; - user_data->init (); - if (unlikely (!hb_atomic_ptr_cmpexch (&obj->header.user_data, nullptr, user_data))) - { - user_data->fini (); - free (user_data); - goto retry; - } - } - - return user_data->set (key, data, destroy, replace); -} - -template -static inline void *hb_object_get_user_data (Type *obj, - hb_user_data_key_t *key) -{ - if (unlikely (!obj || hb_object_is_inert (obj) || !obj->header.user_data)) - return nullptr; - assert (hb_object_is_valid (obj)); - return obj->header.user_data->get (key); -} - - -#endif /* HB_OBJECT_PRIVATE_HH */ diff --git a/src/hb-object.hh b/src/hb-object.hh new file mode 100644 index 0000000..68520f2 --- /dev/null +++ b/src/hb-object.hh @@ -0,0 +1,342 @@ +/* + * Copyright © 2007 Chris Wilson + * Copyright © 2009,2010 Red Hat, Inc. + * 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. + * + * Contributor(s): + * Chris Wilson + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OBJECT_HH +#define HB_OBJECT_HH + +#include "hb.hh" +#include "hb-atomic.hh" +#include "hb-mutex.hh" +#include "hb-vector.hh" + + +/* + * Lockable set + */ + +template +struct hb_lockable_set_t +{ + hb_vector_t items; + + void init () { items.init (); } + + template + item_t *replace_or_insert (T v, lock_t &l, bool replace) + { + l.lock (); + item_t *item = items.find (v); + if (item) { + if (replace) { + item_t old = *item; + *item = v; + l.unlock (); + old.fini (); + } + else { + item = nullptr; + l.unlock (); + } + } else { + item = items.push (v); + l.unlock (); + } + return item; + } + + template + void remove (T v, lock_t &l) + { + l.lock (); + item_t *item = items.find (v); + if (item) + { + item_t old = *item; + *item = items[items.length - 1]; + items.pop (); + l.unlock (); + old.fini (); + } else { + l.unlock (); + } + } + + template + bool find (T v, item_t *i, lock_t &l) + { + l.lock (); + item_t *item = items.find (v); + if (item) + *i = *item; + l.unlock (); + return !!item; + } + + template + item_t *find_or_insert (T v, lock_t &l) + { + l.lock (); + item_t *item = items.find (v); + if (!item) { + item = items.push (v); + } + l.unlock (); + return item; + } + + void fini (lock_t &l) + { + if (!items.length) + { + /* No need to lock. */ + items.fini (); + return; + } + l.lock (); + while (items.length) + { + item_t old = items[items.length - 1]; + items.pop (); + l.unlock (); + old.fini (); + l.lock (); + } + items.fini (); + l.unlock (); + } + +}; + + +/* + * Reference-count. + */ + +#define HB_REFERENCE_COUNT_INERT_VALUE 0 +#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD +#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT (HB_REFERENCE_COUNT_INERT_VALUE)} + +struct hb_reference_count_t +{ + mutable hb_atomic_int_t ref_count; + + void init (int v = 1) { ref_count.set_relaxed (v); } + int get_relaxed () const { return ref_count.get_relaxed (); } + int inc () const { return ref_count.inc (); } + int dec () const { return ref_count.dec (); } + void fini () { ref_count.set_relaxed (HB_REFERENCE_COUNT_POISON_VALUE); } + + bool is_inert () const { return ref_count.get_relaxed () == HB_REFERENCE_COUNT_INERT_VALUE; } + bool is_valid () const { return ref_count.get_relaxed () > 0; } +}; + + +/* user_data */ + +struct hb_user_data_array_t +{ + struct hb_user_data_item_t { + hb_user_data_key_t *key; + void *data; + hb_destroy_func_t destroy; + + bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; } + bool operator == (hb_user_data_item_t &other) const { return key == other.key; } + + void fini () { if (destroy) destroy (data); } + }; + + hb_mutex_t lock; + hb_lockable_set_t items; + + void init () { lock.init (); items.init (); } + + HB_INTERNAL bool set (hb_user_data_key_t *key, + void * data, + hb_destroy_func_t destroy, + hb_bool_t replace); + + HB_INTERNAL void *get (hb_user_data_key_t *key); + + void fini () { items.fini (lock); lock.fini (); } +}; + + +/* + * Object header + */ + +struct hb_object_header_t +{ + hb_reference_count_t ref_count; + mutable hb_atomic_int_t writable; + hb_atomic_ptr_t user_data; +}; +#define HB_OBJECT_HEADER_STATIC \ + { \ + HB_REFERENCE_COUNT_INIT, \ + HB_ATOMIC_INT_INIT (false), \ + HB_ATOMIC_PTR_INIT (nullptr) \ + } + + +/* + * Object + */ + +template +static inline void hb_object_trace (const Type *obj, const char *function) +{ + DEBUG_MSG (OBJECT, (void *) obj, + "%s refcount=%d", + function, + obj ? obj->header.ref_count.get_relaxed () : 0); +} + +template +static inline Type *hb_object_create () +{ + Type *obj = (Type *) calloc (1, sizeof (Type)); + + if (unlikely (!obj)) + return obj; + + hb_object_init (obj); + hb_object_trace (obj, HB_FUNC); + return obj; +} +template +static inline void hb_object_init (Type *obj) +{ + obj->header.ref_count.init (); + obj->header.writable.set_relaxed (true); + obj->header.user_data.init (); +} +template +static inline bool hb_object_is_inert (const Type *obj) +{ + return unlikely (obj->header.ref_count.is_inert ()); +} +template +static inline bool hb_object_is_valid (const Type *obj) +{ + return likely (obj->header.ref_count.is_valid ()); +} +template +static inline bool hb_object_is_immutable (const Type *obj) +{ + return !obj->header.writable.get_relaxed (); +} +template +static inline void hb_object_make_immutable (const Type *obj) +{ + obj->header.writable.set_relaxed (false); +} +template +static inline Type *hb_object_reference (Type *obj) +{ + hb_object_trace (obj, HB_FUNC); + if (unlikely (!obj || hb_object_is_inert (obj))) + return obj; + assert (hb_object_is_valid (obj)); + obj->header.ref_count.inc (); + return obj; +} +template +static inline bool hb_object_destroy (Type *obj) +{ + hb_object_trace (obj, HB_FUNC); + if (unlikely (!obj || hb_object_is_inert (obj))) + return false; + assert (hb_object_is_valid (obj)); + if (obj->header.ref_count.dec () != 1) + return false; + + hb_object_fini (obj); + return true; +} +template +static inline void hb_object_fini (Type *obj) +{ + obj->header.ref_count.fini (); /* Do this before user_data */ + hb_user_data_array_t *user_data = obj->header.user_data.get (); + if (user_data) + { + user_data->fini (); + free (user_data); + user_data = nullptr; + } +} +template +static inline bool hb_object_set_user_data (Type *obj, + hb_user_data_key_t *key, + void * data, + hb_destroy_func_t destroy, + hb_bool_t replace) +{ + if (unlikely (!obj || hb_object_is_inert (obj))) + return false; + assert (hb_object_is_valid (obj)); + +retry: + hb_user_data_array_t *user_data = obj->header.user_data.get (); + if (unlikely (!user_data)) + { + user_data = (hb_user_data_array_t *) calloc (sizeof (hb_user_data_array_t), 1); + if (unlikely (!user_data)) + return false; + user_data->init (); + if (unlikely (!obj->header.user_data.cmpexch (nullptr, user_data))) + { + user_data->fini (); + free (user_data); + goto retry; + } + } + + return user_data->set (key, data, destroy, replace); +} + +template +static inline void *hb_object_get_user_data (Type *obj, + hb_user_data_key_t *key) +{ + if (unlikely (!obj || hb_object_is_inert (obj))) + return nullptr; + assert (hb_object_is_valid (obj)); + hb_user_data_array_t *user_data = obj->header.user_data.get (); + if (!user_data) + return nullptr; + return user_data->get (key); +} + + +#endif /* HB_OBJECT_HH */ diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh deleted file mode 100644 index 2965b46..0000000 --- a/src/hb-open-file-private.hh +++ /dev/null @@ -1,374 +0,0 @@ -/* - * Copyright © 2007,2008,2009 Red Hat, Inc. - * Copyright © 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. - * - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_OPEN_FILE_PRIVATE_HH -#define HB_OPEN_FILE_PRIVATE_HH - -#include "hb-open-type-private.hh" -#include "hb-ot-head-table.hh" - - -namespace OT { - - -/* - * - * The OpenType Font File - * - */ - - -/* - * Organization of an OpenType Font - */ - -struct OpenTypeFontFile; -struct OffsetTable; -struct TTCHeader; - - -typedef struct TableRecord -{ - int cmp (Tag t) const - { return -t.cmp (tag); } - - static int cmp (const void *pa, const void *pb) - { - const TableRecord *a = (const TableRecord *) pa; - const TableRecord *b = (const TableRecord *) pb; - return b->cmp (a->tag); - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); - } - - Tag tag; /* 4-byte identifier. */ - CheckSum checkSum; /* CheckSum for this table. */ - Offset32 offset; /* Offset from beginning of TrueType font - * file. */ - HBUINT32 length; /* Length of this table. */ - public: - DEFINE_SIZE_STATIC (16); -} OpenTypeTable; - -typedef struct OffsetTable -{ - friend struct OpenTypeFontFile; - - inline unsigned int get_table_count (void) const - { return tables.len; } - inline const TableRecord& get_table (unsigned int i) const - { - return tables[i]; - } - inline unsigned int get_table_tags (unsigned int start_offset, - unsigned int *table_count, /* IN/OUT */ - hb_tag_t *table_tags /* OUT */) const - { - if (table_count) - { - if (start_offset >= tables.len) - *table_count = 0; - else - *table_count = MIN (*table_count, tables.len - start_offset); - - const TableRecord *sub_tables = tables.arrayZ + start_offset; - unsigned int count = *table_count; - for (unsigned int i = 0; i < count; i++) - table_tags[i] = sub_tables[i].tag; - } - return tables.len; - } - inline bool find_table_index (hb_tag_t tag, unsigned int *table_index) const - { - Tag t; - t.set (tag); - /* Linear-search for small tables to work around fonts with unsorted - * table list. */ - int i = tables.len < 64 ? tables.lsearch (t) : tables.bsearch (t); - if (table_index) - *table_index = i == -1 ? Index::NOT_FOUND_INDEX : (unsigned int) i; - return i != -1; - } - inline const TableRecord& get_table_by_tag (hb_tag_t tag) const - { - unsigned int table_index; - find_table_index (tag, &table_index); - return get_table (table_index); - } - - public: - - inline bool serialize (hb_serialize_context_t *c, - hb_tag_t sfnt_tag, - Supplier &tags, - Supplier &blobs, - unsigned int table_count) - { - TRACE_SERIALIZE (this); - /* Alloc 12 for the OTHeader. */ - if (unlikely (!c->extend_min (*this))) return_trace (false); - /* Write sfntVersion (bytes 0..3). */ - sfnt_version.set (sfnt_tag); - /* Take space for numTables, searchRange, entrySelector, RangeShift - * and the TableRecords themselves. */ - if (unlikely (!tables.serialize (c, table_count))) return_trace (false); - - const char *dir_end = (const char *) c->head; - HBUINT32 *checksum_adjustment = nullptr; - - /* Write OffsetTables, alloc for and write actual table blobs. */ - for (unsigned int i = 0; i < table_count; i++) - { - TableRecord &rec = tables.arrayZ[i]; - hb_blob_t *blob = blobs[i]; - rec.tag.set (tags[i]); - rec.length.set (hb_blob_get_length (blob)); - rec.offset.serialize (c, this); - - /* Allocate room for the table and copy it. */ - char *start = (char *) c->allocate_size (rec.length); - if (unlikely (!start)) {return false;} - - memcpy (start, hb_blob_get_data (blob, nullptr), rec.length); - - /* 4-byte allignment. */ - if (rec.length % 4) - c->allocate_size (4 - rec.length % 4); - const char *end = (const char *) c->head; - - if (tags[i] == HB_OT_TAG_head && end - start >= head::static_size) - { - head *h = (head *) start; - checksum_adjustment = &h->checkSumAdjustment; - checksum_adjustment->set (0); - } - - rec.checkSum.set_for_data (start, end - start); - } - tags += table_count; - blobs += table_count; - - tables.qsort (); - - if (checksum_adjustment) - { - CheckSum checksum; - - /* The following line is a slower version of the following block. */ - //checksum.set_for_data (this, (const char *) c->head - (const char *) this); - checksum.set_for_data (this, dir_end - (const char *) this); - for (unsigned int i = 0; i < table_count; i++) - { - TableRecord &rec = tables.arrayZ[i]; - checksum.set (checksum + rec.checkSum); - } - - checksum_adjustment->set (0xB1B0AFBAu - checksum); - } - - return_trace (true); - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && tables.sanitize (c)); - } - - protected: - Tag sfnt_version; /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */ - BinSearchArrayOf - tables; - public: - DEFINE_SIZE_ARRAY (12, tables); -} OpenTypeFontFace; - - -/* - * TrueType Collections - */ - -struct TTCHeaderVersion1 -{ - friend struct TTCHeader; - - inline unsigned int get_face_count (void) const { return table.len; } - inline const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (table.sanitize (c, this)); - } - - protected: - Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ - FixedVersion<>version; /* Version of the TTC Header (1.0), - * 0x00010000u */ - LArrayOf > - table; /* Array of offsets to the OffsetTable for each font - * from the beginning of the file */ - public: - DEFINE_SIZE_ARRAY (12, table); -}; - -struct TTCHeader -{ - friend struct OpenTypeFontFile; - - private: - - inline unsigned int get_face_count (void) const - { - switch (u.header.version.major) { - case 2: /* version 2 is compatible with version 1 */ - case 1: return u.version1.get_face_count (); - default:return 0; - } - } - inline const OpenTypeFontFace& get_face (unsigned int i) const - { - switch (u.header.version.major) { - case 2: /* version 2 is compatible with version 1 */ - case 1: return u.version1.get_face (i); - default:return Null(OpenTypeFontFace); - } - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - if (unlikely (!u.header.version.sanitize (c))) return_trace (false); - switch (u.header.version.major) { - case 2: /* version 2 is compatible with version 1 */ - case 1: return_trace (u.version1.sanitize (c)); - default:return_trace (true); - } - } - - protected: - union { - struct { - Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ - FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0), - * 0x00010000u or 0x00020000u */ - } header; - TTCHeaderVersion1 version1; - } u; -}; - - -/* - * OpenType Font File - */ - -struct OpenTypeFontFile -{ - static const hb_tag_t tableTag = HB_TAG ('_','_','_','_'); /* Sanitizer needs this. */ - - enum { - CFFTag = HB_TAG ('O','T','T','O'), /* OpenType with Postscript outlines */ - TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ), /* OpenType with TrueType outlines */ - TTCTag = HB_TAG ('t','t','c','f'), /* TrueType Collection */ - TrueTag = HB_TAG ('t','r','u','e'), /* Obsolete Apple TrueType */ - Typ1Tag = HB_TAG ('t','y','p','1') /* Obsolete Apple Type1 font in SFNT container */ - }; - - inline hb_tag_t get_tag (void) const { return u.tag; } - - inline unsigned int get_face_count (void) const - { - switch (u.tag) { - case CFFTag: /* All the non-collection tags */ - case TrueTag: - case Typ1Tag: - case TrueTypeTag: return 1; - case TTCTag: return u.ttcHeader.get_face_count (); - default: return 0; - } - } - inline const OpenTypeFontFace& get_face (unsigned int i) const - { - switch (u.tag) { - /* Note: for non-collection SFNT data we ignore index. This is because - * Apple dfont container is a container of SFNT's. So each SFNT is a - * non-TTC, but the index is more than zero. */ - case CFFTag: /* All the non-collection tags */ - case TrueTag: - case Typ1Tag: - case TrueTypeTag: return u.fontFace; - case TTCTag: return u.ttcHeader.get_face (i); - default: return Null(OpenTypeFontFace); - } - } - - inline bool serialize_single (hb_serialize_context_t *c, - hb_tag_t sfnt_tag, - Supplier &tags, - Supplier &blobs, - unsigned int table_count) - { - TRACE_SERIALIZE (this); - assert (sfnt_tag != TTCTag); - if (unlikely (!c->extend_min (*this))) return_trace (false); - return_trace (u.fontFace.serialize (c, sfnt_tag, tags, blobs, table_count)); - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - if (unlikely (!u.tag.sanitize (c))) return_trace (false); - switch (u.tag) { - case CFFTag: /* All the non-collection tags */ - case TrueTag: - case Typ1Tag: - case TrueTypeTag: return_trace (u.fontFace.sanitize (c)); - case TTCTag: return_trace (u.ttcHeader.sanitize (c)); - default: return_trace (true); - } - } - - protected: - union { - Tag tag; /* 4-byte identifier. */ - OpenTypeFontFace fontFace; - TTCHeader ttcHeader; - } u; - public: - DEFINE_SIZE_UNION (4, tag); -}; - - -} /* namespace OT */ - - -#endif /* HB_OPEN_FILE_PRIVATE_HH */ diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh new file mode 100644 index 0000000..32a223c --- /dev/null +++ b/src/hb-open-file.hh @@ -0,0 +1,525 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 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. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OPEN_FILE_HH +#define HB_OPEN_FILE_HH + +#include "hb-open-type.hh" +#include "hb-ot-head-table.hh" + + +namespace OT { + + +/* + * + * The OpenType Font File + * + */ + + +/* + * Organization of an OpenType Font + */ + +struct OpenTypeFontFile; +struct OffsetTable; +struct TTCHeader; + + +typedef struct TableRecord +{ + int cmp (Tag t) const { return -t.cmp (tag); } + + static int cmp (const void *pa, const void *pb) + { + const TableRecord *a = (const TableRecord *) pa; + const TableRecord *b = (const TableRecord *) pb; + return b->cmp (a->tag); + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + Tag tag; /* 4-byte identifier. */ + CheckSum checkSum; /* CheckSum for this table. */ + Offset32 offset; /* Offset from beginning of TrueType font + * file. */ + HBUINT32 length; /* Length of this table. */ + public: + DEFINE_SIZE_STATIC (16); +} OpenTypeTable; + +typedef struct OffsetTable +{ + friend struct OpenTypeFontFile; + + unsigned int get_table_count () const { return tables.len; } + const TableRecord& get_table (unsigned int i) const + { return tables[i]; } + unsigned int get_table_tags (unsigned int start_offset, + unsigned int *table_count, /* IN/OUT */ + hb_tag_t *table_tags /* OUT */) const + { + if (table_count) + { + if (start_offset >= tables.len) + *table_count = 0; + else + *table_count = MIN (*table_count, tables.len - start_offset); + + const TableRecord *sub_tables = tables.arrayZ + start_offset; + unsigned int count = *table_count; + for (unsigned int i = 0; i < count; i++) + table_tags[i] = sub_tables[i].tag; + } + return tables.len; + } + bool find_table_index (hb_tag_t tag, unsigned int *table_index) const + { + Tag t; + t.set (tag); + return tables.bfind (t, table_index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX); + } + const TableRecord& get_table_by_tag (hb_tag_t tag) const + { + unsigned int table_index; + find_table_index (tag, &table_index); + return get_table (table_index); + } + + public: + + template + bool serialize (hb_serialize_context_t *c, + hb_tag_t sfnt_tag, + hb_array_t items) + { + TRACE_SERIALIZE (this); + /* Alloc 12 for the OTHeader. */ + if (unlikely (!c->extend_min (*this))) return_trace (false); + /* Write sfntVersion (bytes 0..3). */ + sfnt_version.set (sfnt_tag); + /* Take space for numTables, searchRange, entrySelector, RangeShift + * and the TableRecords themselves. */ + if (unlikely (!tables.serialize (c, items.length))) return_trace (false); + + const char *dir_end = (const char *) c->head; + HBUINT32 *checksum_adjustment = nullptr; + + /* Write OffsetTables, alloc for and write actual table blobs. */ + for (unsigned int i = 0; i < tables.len; i++) + { + TableRecord &rec = tables.arrayZ[i]; + hb_blob_t *blob = items[i].blob; + rec.tag.set (items[i].tag); + rec.length.set (hb_blob_get_length (blob)); + rec.offset.serialize (c, this); + + /* Allocate room for the table and copy it. */ + char *start = (char *) c->allocate_size (rec.length); + if (unlikely (!start)) {return false;} + + memcpy (start, hb_blob_get_data (blob, nullptr), rec.length); + + /* 4-byte alignment. */ + c->align (4); + const char *end = (const char *) c->head; + + if (items[i].tag == HB_OT_TAG_head && + (unsigned) (end - start) >= head::static_size) + { + head *h = (head *) start; + checksum_adjustment = &h->checkSumAdjustment; + checksum_adjustment->set (0); + } + + rec.checkSum.set_for_data (start, end - start); + } + + tables.qsort (); + + if (checksum_adjustment) + { + CheckSum checksum; + + /* The following line is a slower version of the following block. */ + //checksum.set_for_data (this, (const char *) c->head - (const char *) this); + checksum.set_for_data (this, dir_end - (const char *) this); + for (unsigned int i = 0; i < items.length; i++) + { + TableRecord &rec = tables.arrayZ[i]; + checksum.set (checksum + rec.checkSum); + } + + checksum_adjustment->set (0xB1B0AFBAu - checksum); + } + + return_trace (true); + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && tables.sanitize (c)); + } + + protected: + Tag sfnt_version; /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */ + BinSearchArrayOf + tables; + public: + DEFINE_SIZE_ARRAY (12, tables); +} OpenTypeFontFace; + + +/* + * TrueType Collections + */ + +struct TTCHeaderVersion1 +{ + friend struct TTCHeader; + + unsigned int get_face_count () const { return table.len; } + const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (table.sanitize (c, this)); + } + + protected: + Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ + FixedVersion<>version; /* Version of the TTC Header (1.0), + * 0x00010000u */ + LArrayOf > + table; /* Array of offsets to the OffsetTable for each font + * from the beginning of the file */ + public: + DEFINE_SIZE_ARRAY (12, table); +}; + +struct TTCHeader +{ + friend struct OpenTypeFontFile; + + private: + + unsigned int get_face_count () const + { + switch (u.header.version.major) { + case 2: /* version 2 is compatible with version 1 */ + case 1: return u.version1.get_face_count (); + default:return 0; + } + } + const OpenTypeFontFace& get_face (unsigned int i) const + { + switch (u.header.version.major) { + case 2: /* version 2 is compatible with version 1 */ + case 1: return u.version1.get_face (i); + default:return Null(OpenTypeFontFace); + } + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!u.header.version.sanitize (c))) return_trace (false); + switch (u.header.version.major) { + case 2: /* version 2 is compatible with version 1 */ + case 1: return_trace (u.version1.sanitize (c)); + default:return_trace (true); + } + } + + protected: + union { + struct { + Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ + FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0), + * 0x00010000u or 0x00020000u */ + } header; + TTCHeaderVersion1 version1; + } u; +}; + +/* + * Mac Resource Fork + * + * http://mirror.informatimago.com/next/developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html + */ + +struct ResourceRecord +{ + const OpenTypeFontFace & get_face (const void *data_base) const + { return CastR ((data_base+offset).arrayZ); } + + bool sanitize (hb_sanitize_context_t *c, + const void *data_base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + offset.sanitize (c, data_base) && + get_face (data_base).sanitize (c)); + } + + protected: + HBUINT16 id; /* Resource ID. */ + HBINT16 nameOffset; /* Offset from beginning of resource name list + * to resource name, -1 means there is none. */ + HBUINT8 attrs; /* Resource attributes */ + NNOffsetTo, HBUINT24> + offset; /* Offset from beginning of data block to + * data for this resource */ + HBUINT32 reserved; /* Reserved for handle to resource */ + public: + DEFINE_SIZE_STATIC (12); +}; + +#define HB_TAG_sfnt HB_TAG ('s','f','n','t') + +struct ResourceTypeRecord +{ + unsigned int get_resource_count () const + { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; } + + bool is_sfnt () const { return tag == HB_TAG_sfnt; } + + const ResourceRecord& get_resource_record (unsigned int i, + const void *type_base) const + { return (type_base+resourcesZ).as_array (get_resource_count ())[i]; } + + bool sanitize (hb_sanitize_context_t *c, + const void *type_base, + const void *data_base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + resourcesZ.sanitize (c, type_base, + get_resource_count (), + data_base)); + } + + protected: + Tag tag; /* Resource type. */ + HBUINT16 resCountM1; /* Number of resources minus 1. */ + NNOffsetTo > + resourcesZ; /* Offset from beginning of resource type list + * to reference item list for this type. */ + public: + DEFINE_SIZE_STATIC (8); +}; + +struct ResourceMap +{ + unsigned int get_face_count () const + { + unsigned int count = get_type_count (); + for (unsigned int i = 0; i < count; i++) + { + const ResourceTypeRecord& type = get_type_record (i); + if (type.is_sfnt ()) + return type.get_resource_count (); + } + return 0; + } + + const OpenTypeFontFace& get_face (unsigned int idx, + const void *data_base) const + { + unsigned int count = get_type_count (); + for (unsigned int i = 0; i < count; i++) + { + const ResourceTypeRecord& type = get_type_record (i); + /* The check for idx < count is here because ResourceRecord is NOT null-safe. + * Because an offset of 0 there does NOT mean null. */ + if (type.is_sfnt () && idx < type.get_resource_count ()) + return type.get_resource_record (idx, &(this+typeList)).get_face (data_base); + } + return Null (OpenTypeFontFace); + } + + bool sanitize (hb_sanitize_context_t *c, const void *data_base) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + typeList.sanitize (c, this, + &(this+typeList), + data_base)); + } + + private: + unsigned int get_type_count () const { return (this+typeList).lenM1 + 1; } + + const ResourceTypeRecord& get_type_record (unsigned int i) const + { return (this+typeList)[i]; } + + protected: + HBUINT8 reserved0[16]; /* Reserved for copy of resource header */ + HBUINT32 reserved1; /* Reserved for handle to next resource map */ + HBUINT16 resreved2; /* Reserved for file reference number */ + HBUINT16 attrs; /* Resource fork attribute */ + NNOffsetTo > + typeList; /* Offset from beginning of map to + * resource type list */ + Offset16 nameList; /* Offset from beginning of map to + * resource name list */ + public: + DEFINE_SIZE_STATIC (28); +}; + +struct ResourceForkHeader +{ + unsigned int get_face_count () const + { return (this+map).get_face_count (); } + + const OpenTypeFontFace& get_face (unsigned int idx, + unsigned int *base_offset = nullptr) const + { + const OpenTypeFontFace &face = (this+map).get_face (idx, &(this+data)); + if (base_offset) + *base_offset = (const char *) &face - (const char *) this; + return face; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + data.sanitize (c, this, dataLen) && + map.sanitize (c, this, &(this+data))); + } + + protected: + LNNOffsetTo > + data; /* Offset from beginning of resource fork + * to resource data */ + LNNOffsetTo + map; /* Offset from beginning of resource fork + * to resource map */ + HBUINT32 dataLen; /* Length of resource data */ + HBUINT32 mapLen; /* Length of resource map */ + public: + DEFINE_SIZE_STATIC (16); +}; + +/* + * OpenType Font File + */ + +struct OpenTypeFontFile +{ + enum { + CFFTag = HB_TAG ('O','T','T','O'), /* OpenType with Postscript outlines */ + TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ), /* OpenType with TrueType outlines */ + TTCTag = HB_TAG ('t','t','c','f'), /* TrueType Collection */ + DFontTag = HB_TAG ( 0 , 0 , 1 , 0 ), /* DFont Mac Resource Fork */ + TrueTag = HB_TAG ('t','r','u','e'), /* Obsolete Apple TrueType */ + Typ1Tag = HB_TAG ('t','y','p','1') /* Obsolete Apple Type1 font in SFNT container */ + }; + + hb_tag_t get_tag () const { return u.tag; } + + unsigned int get_face_count () const + { + switch (u.tag) { + case CFFTag: /* All the non-collection tags */ + case TrueTag: + case Typ1Tag: + case TrueTypeTag: return 1; + case TTCTag: return u.ttcHeader.get_face_count (); + case DFontTag: return u.rfHeader.get_face_count (); + default: return 0; + } + } + const OpenTypeFontFace& get_face (unsigned int i, unsigned int *base_offset = nullptr) const + { + if (base_offset) + *base_offset = 0; + switch (u.tag) { + /* Note: for non-collection SFNT data we ignore index. This is because + * Apple dfont container is a container of SFNT's. So each SFNT is a + * non-TTC, but the index is more than zero. */ + case CFFTag: /* All the non-collection tags */ + case TrueTag: + case Typ1Tag: + case TrueTypeTag: return u.fontFace; + case TTCTag: return u.ttcHeader.get_face (i); + case DFontTag: return u.rfHeader.get_face (i, base_offset); + default: return Null(OpenTypeFontFace); + } + } + + template + bool serialize_single (hb_serialize_context_t *c, + hb_tag_t sfnt_tag, + hb_array_t items) + { + TRACE_SERIALIZE (this); + assert (sfnt_tag != TTCTag); + if (unlikely (!c->extend_min (*this))) return_trace (false); + return_trace (u.fontFace.serialize (c, sfnt_tag, items)); + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!u.tag.sanitize (c))) return_trace (false); + switch (u.tag) { + case CFFTag: /* All the non-collection tags */ + case TrueTag: + case Typ1Tag: + case TrueTypeTag: return_trace (u.fontFace.sanitize (c)); + case TTCTag: return_trace (u.ttcHeader.sanitize (c)); + case DFontTag: return_trace (u.rfHeader.sanitize (c)); + default: return_trace (true); + } + } + + protected: + union { + Tag tag; /* 4-byte identifier. */ + OpenTypeFontFace fontFace; + TTCHeader ttcHeader; + ResourceForkHeader rfHeader; + } u; + public: + DEFINE_SIZE_UNION (4, tag); +}; + + +} /* namespace OT */ + + +#endif /* HB_OPEN_FILE_HH */ diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh deleted file mode 100644 index 8180287..0000000 --- a/src/hb-open-type-private.hh +++ /dev/null @@ -1,1299 +0,0 @@ -/* - * Copyright © 2007,2008,2009,2010 Red Hat, Inc. - * Copyright © 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. - * - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_OPEN_TYPE_PRIVATE_HH -#define HB_OPEN_TYPE_PRIVATE_HH - -#include "hb-private.hh" -#include "hb-debug.hh" -#include "hb-blob-private.hh" -#include "hb-face-private.hh" - - -namespace OT { - - - -/* - * Casts - */ - -/* Cast to struct T, reference to reference */ -template -static inline const Type& CastR(const TObject &X) -{ return reinterpret_cast (X); } -template -static inline Type& CastR(TObject &X) -{ return reinterpret_cast (X); } - -/* Cast to struct T, pointer to pointer */ -template -static inline const Type* CastP(const TObject *X) -{ return reinterpret_cast (X); } -template -static inline Type* CastP(TObject *X) -{ return reinterpret_cast (X); } - -/* StructAtOffset(P,Ofs) returns the struct T& that is placed at memory - * location pointed to by P plus Ofs bytes. */ -template -static inline const Type& StructAtOffset(const void *P, unsigned int offset) -{ return * reinterpret_cast ((const char *) P + offset); } -template -static inline Type& StructAtOffset(void *P, unsigned int offset) -{ return * reinterpret_cast ((char *) P + offset); } - -/* StructAfter(X) returns the struct T& that is placed after X. - * Works with X of variable size also. X must implement get_size() */ -template -static inline const Type& StructAfter(const TObject &X) -{ return StructAtOffset(&X, X.get_size()); } -template -static inline Type& StructAfter(TObject &X) -{ return StructAtOffset(&X, X.get_size()); } - - - -/* - * Size checking - */ - -/* Check _assertion in a method environment */ -#define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \ - inline void _instance_assertion_on_line_##_line (void) const \ - { \ - static_assert ((_assertion), ""); \ - ASSERT_INSTANCE_POD (*this); /* Make sure it's POD. */ \ - } -# define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion) -# define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion) - -/* Check that _code compiles in a method environment */ -#define _DEFINE_COMPILES_ASSERTION1(_line, _code) \ - inline void _compiles_assertion_on_line_##_line (void) const \ - { _code; } -# define _DEFINE_COMPILES_ASSERTION0(_line, _code) _DEFINE_COMPILES_ASSERTION1 (_line, _code) -# define DEFINE_COMPILES_ASSERTION(_code) _DEFINE_COMPILES_ASSERTION0 (__LINE__, _code) - - -#define DEFINE_SIZE_STATIC(size) \ - DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \ - static const unsigned int static_size = (size); \ - static const unsigned int min_size = (size); \ - inline unsigned int get_size (void) const { return (size); } - -#define DEFINE_SIZE_UNION(size, _member) \ - DEFINE_INSTANCE_ASSERTION (0*sizeof(this->u._member.static_size) + sizeof(this->u._member) == (size)); \ - static const unsigned int min_size = (size) - -#define DEFINE_SIZE_MIN(size) \ - DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)); \ - static const unsigned int min_size = (size) - -#define DEFINE_SIZE_ARRAY(size, array) \ - DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (array[0])); \ - DEFINE_COMPILES_ASSERTION ((void) array[0].static_size) \ - static const unsigned int min_size = (size) - -#define DEFINE_SIZE_ARRAY2(size, array1, array2) \ - DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \ - DEFINE_COMPILES_ASSERTION ((void) array1[0].static_size; (void) array2[0].static_size) \ - static const unsigned int min_size = (size) - - - -/* - * Dispatch - */ - -template -struct hb_dispatch_context_t -{ - static const unsigned int max_debug_depth = MaxDebugDepth; - typedef Return return_t; - template - inline bool may_dispatch (const T *obj, const F *format) { return true; } - static return_t no_dispatch_return_value (void) { return Context::default_return_value (); } -}; - - -/* - * Sanitize - */ - -/* This limits sanitizing time on really broken fonts. */ -#ifndef HB_SANITIZE_MAX_EDITS -#define HB_SANITIZE_MAX_EDITS 32 -#endif -#ifndef HB_SANITIZE_MAX_OPS_FACTOR -#define HB_SANITIZE_MAX_OPS_FACTOR 8 -#endif -#ifndef HB_SANITIZE_MAX_OPS_MIN -#define HB_SANITIZE_MAX_OPS_MIN 16384 -#endif - -struct hb_sanitize_context_t : - hb_dispatch_context_t -{ - inline hb_sanitize_context_t (void) : - debug_depth (0), - start (nullptr), end (nullptr), - writable (false), edit_count (0), max_ops (0), - blob (nullptr), - num_glyphs (0) {} - - inline const char *get_name (void) { return "SANITIZE"; } - template - inline bool may_dispatch (const T *obj, const F *format) - { return format->sanitize (this); } - template - inline return_t dispatch (const T &obj) { return obj.sanitize (this); } - static return_t default_return_value (void) { return true; } - static return_t no_dispatch_return_value (void) { return false; } - bool stop_sublookup_iteration (const return_t r) const { return !r; } - - inline void init (hb_blob_t *b) - { - this->blob = hb_blob_reference (b); - this->writable = false; - } - - inline void start_processing (void) - { - this->start = hb_blob_get_data (this->blob, nullptr); - this->end = this->start + this->blob->length; - assert (this->start <= this->end); /* Must not overflow. */ - this->max_ops = MAX ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR, - (unsigned) HB_SANITIZE_MAX_OPS_MIN); - this->edit_count = 0; - this->debug_depth = 0; - - DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1, - "start [%p..%p] (%lu bytes)", - this->start, this->end, - (unsigned long) (this->end - this->start)); - } - - inline void end_processing (void) - { - DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1, - "end [%p..%p] %u edit requests", - this->start, this->end, this->edit_count); - - hb_blob_destroy (this->blob); - this->blob = nullptr; - this->start = this->end = nullptr; - } - - inline bool check_range (const void *base, unsigned int len) const - { - const char *p = (const char *) base; - bool ok = this->max_ops-- > 0 && - this->start <= p && - p <= this->end && - (unsigned int) (this->end - p) >= len; - - DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, - "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s", - p, p + len, len, - this->start, this->end, - ok ? "OK" : "OUT-OF-RANGE"); - - return likely (ok); - } - - inline bool check_array (const void *base, unsigned int record_size, unsigned int len) const - { - const char *p = (const char *) base; - bool overflows = _hb_unsigned_int_mul_overflows (len, record_size); - unsigned int array_size = record_size * len; - bool ok = !overflows && this->check_range (base, array_size); - - DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, - "check_array [%p..%p] (%d*%d=%d bytes) in [%p..%p] -> %s", - p, p + (record_size * len), record_size, len, (unsigned int) array_size, - this->start, this->end, - overflows ? "OVERFLOWS" : ok ? "OK" : "OUT-OF-RANGE"); - - return likely (ok); - } - - template - inline bool check_struct (const Type *obj) const - { - return likely (this->check_range (obj, obj->min_size)); - } - - inline bool may_edit (const void *base, unsigned int len) - { - if (this->edit_count >= HB_SANITIZE_MAX_EDITS) - return false; - - const char *p = (const char *) base; - this->edit_count++; - - DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0, - "may_edit(%u) [%p..%p] (%d bytes) in [%p..%p] -> %s", - this->edit_count, - p, p + len, len, - this->start, this->end, - this->writable ? "GRANTED" : "DENIED"); - - return this->writable; - } - - template - inline bool try_set (const Type *obj, const ValueType &v) { - if (this->may_edit (obj, obj->static_size)) { - const_cast (obj)->set (v); - return true; - } - return false; - } - - mutable unsigned int debug_depth; - const char *start, *end; - bool writable; - unsigned int edit_count; - mutable int max_ops; - hb_blob_t *blob; - unsigned int num_glyphs; -}; - - - -/* Template to sanitize an object. */ -template -struct Sanitizer -{ - inline Sanitizer (void) {} - - inline hb_blob_t *sanitize (hb_blob_t *blob) { - bool sane; - - /* TODO is_sane() stuff */ - - c->init (blob); - - retry: - DEBUG_MSG_FUNC (SANITIZE, c->start, "start"); - - c->start_processing (); - - if (unlikely (!c->start)) { - c->end_processing (); - return blob; - } - - Type *t = CastP (const_cast (c->start)); - - sane = t->sanitize (c); - if (sane) { - if (c->edit_count) { - DEBUG_MSG_FUNC (SANITIZE, c->start, "passed first round with %d edits; going for second round", c->edit_count); - - /* sanitize again to ensure no toe-stepping */ - c->edit_count = 0; - sane = t->sanitize (c); - if (c->edit_count) { - DEBUG_MSG_FUNC (SANITIZE, c->start, "requested %d edits in second round; FAILLING", c->edit_count); - sane = false; - } - } - } else { - unsigned int edit_count = c->edit_count; - if (edit_count && !c->writable) { - c->start = hb_blob_get_data_writable (blob, nullptr); - c->end = c->start + blob->length; - - if (c->start) { - c->writable = true; - /* ok, we made it writable by relocating. try again */ - DEBUG_MSG_FUNC (SANITIZE, c->start, "retry"); - goto retry; - } - } - } - - c->end_processing (); - - DEBUG_MSG_FUNC (SANITIZE, c->start, sane ? "PASSED" : "FAILED"); - if (sane) - { - blob->lock (); - return blob; - } - else - { - hb_blob_destroy (blob); - return hb_blob_get_empty (); - } - } - - inline void set_num_glyphs (unsigned int num_glyphs) { c->num_glyphs = num_glyphs; } - - private: - hb_sanitize_context_t c[1]; -}; - - - -/* - * Serialize - */ - - -struct hb_serialize_context_t -{ - inline hb_serialize_context_t (void *start_, unsigned int size) - { - this->start = (char *) start_; - this->end = this->start + size; - - this->ran_out_of_room = false; - this->head = this->start; - this->debug_depth = 0; - } - - template - inline Type *start_serialize (void) - { - DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, +1, - "start [%p..%p] (%lu bytes)", - this->start, this->end, - (unsigned long) (this->end - this->start)); - - return start_embed (); - } - - inline void end_serialize (void) - { - DEBUG_MSG_LEVEL (SERIALIZE, this->start, 0, -1, - "end [%p..%p] serialized %d bytes; %s", - this->start, this->end, - (int) (this->head - this->start), - this->ran_out_of_room ? "RAN OUT OF ROOM" : "did not ran out of room"); - - } - - template - inline Type *copy (void) - { - assert (!this->ran_out_of_room); - unsigned int len = this->head - this->start; - void *p = malloc (len); - if (p) - memcpy (p, this->start, len); - return reinterpret_cast (p); - } - - template - inline Type *allocate_size (unsigned int size) - { - if (unlikely (this->ran_out_of_room || this->end - this->head < ptrdiff_t (size))) { - this->ran_out_of_room = true; - return nullptr; - } - memset (this->head, 0, size); - char *ret = this->head; - this->head += size; - return reinterpret_cast (ret); - } - - template - inline Type *allocate_min (void) - { - return this->allocate_size (Type::min_size); - } - - template - inline Type *start_embed (void) - { - Type *ret = reinterpret_cast (this->head); - return ret; - } - - template - inline Type *embed (const Type &obj) - { - unsigned int size = obj.get_size (); - Type *ret = this->allocate_size (size); - if (unlikely (!ret)) return nullptr; - memcpy (ret, obj, size); - return ret; - } - - template - inline Type *extend_min (Type &obj) - { - unsigned int size = obj.min_size; - assert (this->start <= (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head); - if (unlikely (!this->allocate_size (((char *) &obj) + size - this->head))) return nullptr; - return reinterpret_cast (&obj); - } - - template - inline Type *extend (Type &obj) - { - unsigned int size = obj.get_size (); - assert (this->start < (char *) &obj && (char *) &obj <= this->head && (char *) &obj + size >= this->head); - if (unlikely (!this->allocate_size (((char *) &obj) + size - this->head))) return nullptr; - return reinterpret_cast (&obj); - } - - inline void truncate (void *new_head) - { - assert (this->start < new_head && new_head <= this->head); - this->head = (char *) new_head; - } - - unsigned int debug_depth; - char *start, *end, *head; - bool ran_out_of_room; -}; - -template -struct Supplier -{ - inline Supplier (const Type *array, unsigned int len_, unsigned int stride_=sizeof(Type)) - { - head = array; - len = len_; - stride = stride_; - } - inline const Type operator [] (unsigned int i) const - { - if (unlikely (i >= len)) return Type (); - return * (const Type *) (const void *) ((const char *) head + stride * i); - } - - inline Supplier & operator += (unsigned int count) - { - if (unlikely (count > len)) - count = len; - len -= count; - head = (const Type *) (const void *) ((const char *) head + stride * count); - return *this; - } - - private: - inline Supplier (const Supplier &); /* Disallow copy */ - inline Supplier& operator= (const Supplier &); /* Disallow copy */ - - unsigned int len; - unsigned int stride; - const Type *head; -}; - - -/* - * - * The OpenType Font File: Data Types - */ - - -/* "The following data types are used in the OpenType font file. - * All OpenType fonts use Motorola-style byte ordering (Big Endian):" */ - -/* - * Int types - */ - - -template struct BEInt; - -template -struct BEInt -{ - public: - inline void set (Type V) - { - v = V; - } - inline operator Type (void) const - { - return v; - } - private: uint8_t v; -}; -template -struct BEInt -{ - public: - inline void set (Type V) - { - v[0] = (V >> 8) & 0xFF; - v[1] = (V ) & 0xFF; - } - inline operator Type (void) const - { - return (v[0] << 8) - + (v[1] ); - } - private: uint8_t v[2]; -}; -template -struct BEInt -{ - public: - inline void set (Type V) - { - v[0] = (V >> 16) & 0xFF; - v[1] = (V >> 8) & 0xFF; - v[2] = (V ) & 0xFF; - } - inline operator Type (void) const - { - return (v[0] << 16) - + (v[1] << 8) - + (v[2] ); - } - private: uint8_t v[3]; -}; -template -struct BEInt -{ - public: - inline void set (Type V) - { - v[0] = (V >> 24) & 0xFF; - v[1] = (V >> 16) & 0xFF; - v[2] = (V >> 8) & 0xFF; - v[3] = (V ) & 0xFF; - } - inline operator Type (void) const - { - return (v[0] << 24) - + (v[1] << 16) - + (v[2] << 8) - + (v[3] ); - } - private: uint8_t v[4]; -}; - -/* Integer types in big-endian order and no alignment requirement */ -template -struct IntType -{ - inline void set (Type i) { v.set (i); } - inline operator Type(void) const { return v; } - inline bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; } - inline bool operator != (const IntType &o) const { return !(*this == o); } - static inline int cmp (const IntType *a, const IntType *b) { return b->cmp (*a); } - template - inline int cmp (Type2 a) const - { - Type b = v; - if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int)) - return (int) a - (int) b; - else - return a < b ? -1 : a == b ? 0 : +1; - } - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); - } - protected: - BEInt v; - public: - DEFINE_SIZE_STATIC (Size); -}; - -typedef IntType HBUINT8; /* 8-bit unsigned integer. */ -typedef IntType HBINT8; /* 8-bit signed integer. */ -typedef IntType HBUINT16; /* 16-bit unsigned integer. */ -typedef IntType HBINT16; /* 16-bit signed integer. */ -typedef IntType HBUINT32; /* 32-bit unsigned integer. */ -typedef IntType HBINT32; /* 32-bit signed integer. */ -typedef IntType HBUINT24; /* 24-bit unsigned integer. */ - -/* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */ -typedef HBINT16 FWORD; - -/* 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 : HBINT16 -{ - // 16384 means 1<<14 - inline float to_float (void) const { return ((int32_t) v) / 16384.f; } - inline void set_float (float f) { v.set (round (f * 16384.f)); } - public: - DEFINE_SIZE_STATIC (2); -}; - -/* 32-bit signed fixed-point number (16.16). */ -struct Fixed : HBINT32 -{ - // 65536 means 1<<16 - inline float to_float (void) const { return ((int32_t) v) / 65536.f; } - inline void set_float (float f) { v.set (round (f * 65536.f)); } - public: - DEFINE_SIZE_STATIC (4); -}; - -/* Date represented in number of seconds since 12:00 midnight, January 1, - * 1904. The value is represented as a signed 64-bit integer. */ -struct LONGDATETIME -{ - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); - } - protected: - 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 : HBUINT32 -{ - /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */ - inline operator const char* (void) const { return reinterpret_cast (&this->v); } - inline operator char* (void) { return reinterpret_cast (&this->v); } - public: - DEFINE_SIZE_STATIC (4); -}; -DEFINE_NULL_DATA (OT, Tag, " "); - -/* Glyph index number, same as uint16 (length = 16 bits) */ -typedef HBUINT16 GlyphID; - -/* Name-table index, same as uint16 (length = 16 bits) */ -typedef HBUINT16 NameID; - -/* Script/language-system/feature index */ -struct Index : HBUINT16 { - static const unsigned int NOT_FOUND_INDEX = 0xFFFFu; -}; -DEFINE_NULL_DATA (OT, Index, "\xff\xff"); - -/* Offset, Null offset = 0 */ -template -struct Offset : Type -{ - inline bool is_null (void) const { return 0 == *this; } - - inline void *serialize (hb_serialize_context_t *c, const void *base) - { - void *t = c->start_embed (); - this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */ - return t; - } - - public: - DEFINE_SIZE_STATIC (sizeof(Type)); -}; - -typedef Offset Offset16; -typedef Offset Offset32; - - -/* CheckSum */ -struct CheckSum : HBUINT32 -{ - /* This is reference implementation from the spec. */ - static inline uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length) - { - uint32_t Sum = 0L; - assert (0 == (Length & 3)); - const HBUINT32 *EndPtr = Table + Length / HBUINT32::static_size; - - while (Table < EndPtr) - Sum += *Table++; - return Sum; - } - - /* 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 HBUINT32 *) data, length)); } - - public: - DEFINE_SIZE_STATIC (4); -}; - - -/* - * Version Numbers - */ - -template -struct FixedVersion -{ - inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); - } - - FixedType major; - FixedType minor; - public: - DEFINE_SIZE_STATIC (2 * sizeof(FixedType)); -}; - - - -/* - * Template subclasses of Offset that do the dereferencing. - * Use: (base+offset) - */ - -template -struct OffsetTo : Offset -{ - inline const Type& operator () (const void *base) const - { - unsigned int offset = *this; - if (unlikely (!offset)) return Null(Type); - return StructAtOffset (base, offset); - } - inline Type& operator () (void *base) const - { - unsigned int offset = *this; - if (unlikely (!offset)) return Crap(Type); - return StructAtOffset (base, offset); - } - - inline Type& serialize (hb_serialize_context_t *c, const void *base) - { - return * (Type *) Offset::serialize (c, base); - } - - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - if (unlikely (!c->check_struct (this))) return_trace (false); - unsigned int offset = *this; - if (unlikely (!offset)) return_trace (true); - if (unlikely (!c->check_range (base, offset))) return_trace (false); - const Type &obj = StructAtOffset (base, offset); - return_trace (likely (obj.sanitize (c)) || neuter (c)); - } - template - inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const - { - TRACE_SANITIZE (this); - if (unlikely (!c->check_struct (this))) return_trace (false); - unsigned int offset = *this; - if (unlikely (!offset)) return_trace (true); - if (unlikely (!c->check_range (base, offset))) return_trace (false); - const Type &obj = StructAtOffset (base, offset); - return_trace (likely (obj.sanitize (c, user_data)) || neuter (c)); - } - - /* Set the offset to Null */ - inline bool neuter (hb_sanitize_context_t *c) const { - return c->try_set (this, 0); - } - DEFINE_SIZE_STATIC (sizeof(OffsetType)); -}; -template struct LOffsetTo : OffsetTo {}; -template -static inline const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } -template -static inline Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } - - -/* - * Array Types - */ - - -/* TODO Use it in ArrayOf, HeadlessArrayOf, and other places around the code base?? */ -template -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 - 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); - } - - 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 -struct UnsizedOffsetArrayOf : UnsizedArrayOf > {}; - -/* Unsized array of offsets relative to the beginning of the array itself. */ -template -struct UnsizedOffsetListOf : UnsizedOffsetArrayOf -{ - 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::sanitize (c, count, this))); - } - template - inline bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const - { - TRACE_SANITIZE (this); - return_trace ((UnsizedOffsetArrayOf::sanitize (c, count, this, user_data))); - } -}; - - -/* An array with a number of elements. */ -template -struct ArrayOf -{ - const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const - { - unsigned int count = len; - if (unlikely (start_offset > count)) - count = 0; - else - count -= start_offset; - count = MIN (count, *pcount); - *pcount = count; - return arrayZ + start_offset; - } - - inline const Type& operator [] (unsigned int i) const - { - if (unlikely (i >= len)) return Null(Type); - return arrayZ[i]; - } - inline Type& operator [] (unsigned int i) - { - if (unlikely (i >= len)) return Crap(Type); - return arrayZ[i]; - } - inline unsigned int get_size (void) const - { return len.static_size + len * Type::static_size; } - - inline bool serialize (hb_serialize_context_t *c, - unsigned int items_len) - { - TRACE_SERIALIZE (this); - if (unlikely (!c->extend_min (*this))) return_trace (false); - len.set (items_len); /* TODO(serialize) Overflow? */ - if (unlikely (!c->extend (*this))) return_trace (false); - return_trace (true); - } - - inline bool serialize (hb_serialize_context_t *c, - Supplier &items, - unsigned int items_len) - { - TRACE_SERIALIZE (this); - if (unlikely (!serialize (c, items_len))) return_trace (false); - for (unsigned int i = 0; i < items_len; i++) - arrayZ[i] = items[i]; - items += items_len; - return_trace (true); - } - - 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 && arrayZ[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 = len; - for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, base))) - return_trace (false); - return_trace (true); - } - template - inline bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const - { - TRACE_SANITIZE (this); - if (unlikely (!sanitize_shallow (c))) return_trace (false); - unsigned int count = len; - for (unsigned int i = 0; i < count; i++) - if (unlikely (!arrayZ[i].sanitize (c, base, user_data))) - return_trace (false); - return_trace (true); - } - - template - inline int lsearch (const SearchType &x) const - { - unsigned int count = len; - for (unsigned int i = 0; i < count; i++) - if (!this->arrayZ[i].cmp (x)) - return i; - return -1; - } - - inline void qsort (void) - { - ::qsort (arrayZ, len, sizeof (Type), Type::cmp); - } - - private: - inline bool sanitize_shallow (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (len.sanitize (c) && c->check_array (arrayZ, Type::static_size, len)); - } - - public: - LenType len; - Type arrayZ[VAR]; - public: - DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); -}; -template struct LArrayOf : ArrayOf {}; - -/* Array of Offset's */ -template -struct OffsetArrayOf : ArrayOf > {}; - -/* Array of offsets relative to the beginning of the array itself. */ -template -struct OffsetListOf : OffsetArrayOf -{ - inline const Type& operator [] (unsigned int i) const - { - if (unlikely (i >= this->len)) return Null(Type); - return this+this->arrayZ[i]; - } - inline const Type& operator [] (unsigned int i) - { - if (unlikely (i >= this->len)) return Crap(Type); - return this+this->arrayZ[i]; - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (OffsetArrayOf::sanitize (c, this)); - } - template - inline bool sanitize (hb_sanitize_context_t *c, T user_data) const - { - TRACE_SANITIZE (this); - return_trace (OffsetArrayOf::sanitize (c, this, user_data)); - } -}; - - -/* An array starting at second element. */ -template -struct HeadlessArrayOf -{ - inline const Type& operator [] (unsigned int i) const - { - if (unlikely (i >= len || !i)) return Null(Type); - return arrayZ[i-1]; - } - inline Type& operator [] (unsigned int i) - { - if (unlikely (i >= len || !i)) return Crap(Type); - return arrayZ[i-1]; - } - inline unsigned int get_size (void) const - { return len.static_size + (len ? len - 1 : 0) * Type::static_size; } - - inline bool serialize (hb_serialize_context_t *c, - Supplier &items, - unsigned int items_len) - { - TRACE_SERIALIZE (this); - if (unlikely (!c->extend_min (*this))) return_trace (false); - len.set (items_len); /* TODO(serialize) Overflow? */ - if (unlikely (!items_len)) return_trace (true); - if (unlikely (!c->extend (*this))) return_trace (false); - for (unsigned int i = 0; i < items_len - 1; i++) - arrayZ[i] = items[i]; - items += items_len - 1; - return_trace (true); - } - - 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 && arrayZ[0].sanitize (c)); - - return_trace (true); - } - - private: - inline bool sanitize_shallow (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (len.sanitize (c) && - (!len || c->check_array (arrayZ, Type::static_size, len - 1))); - } - - public: - LenType len; - Type arrayZ[VAR]; - public: - DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); -}; - - -/* - * An array with sorted elements. Supports binary searching. - */ -template -struct SortedArrayOf : ArrayOf -{ - template - inline int bsearch (const SearchType &x) const - { - /* Hand-coded bsearch here since this is in the hot inner loop. */ - const Type *arr = this->arrayZ; - int min = 0, max = (int) this->len - 1; - while (min <= max) - { - int mid = (min + max) / 2; - int c = arr[mid].cmp (x); - if (c < 0) - max = mid - 1; - else if (c > 0) - min = mid + 1; - else - return mid; - } - return -1; - } -}; - -/* - * Binary-search arrays - */ - -struct BinSearchHeader -{ - inline operator uint32_t (void) const { return len; } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); - } - - inline void set (unsigned int v) - { - len.set (v); - assert (len == v); - entrySelector.set (MAX (1u, _hb_bit_storage (v)) - 1); - searchRange.set (16 * (1u << entrySelector)); - rangeShift.set (v * 16 > searchRange - ? 16 * v - searchRange - : 0); - } - - protected: - HBUINT16 len; - HBUINT16 searchRange; - HBUINT16 entrySelector; - HBUINT16 rangeShift; - - public: - DEFINE_SIZE_STATIC (8); -}; - -template -struct BinSearchArrayOf : SortedArrayOf {}; - - -/* Lazy struct and blob loaders. */ - -/* Logic is shared between hb_lazy_loader_t and hb_table_lazy_loader_t */ -template -struct hb_lazy_loader_t -{ - inline void init (hb_face_t *face_) - { - face = face_; - instance = nullptr; - } - - inline void fini (void) - { - if (instance && instance != &Null(T)) - { - instance->fini(); - free (instance); - } - } - - inline const T* get (void) const - { - retry: - T *p = (T *) hb_atomic_ptr_get (&instance); - if (unlikely (!p)) - { - p = (T *) calloc (1, sizeof (T)); - if (unlikely (!p)) - p = const_cast (&Null(T)); - else - p->init (face); - if (unlikely (!hb_atomic_ptr_cmpexch (const_cast(&instance), nullptr, p))) - { - if (p != &Null(T)) - p->fini (); - goto retry; - } - } - return p; - } - - inline const T* operator-> (void) const - { - return get (); - } - - private: - hb_face_t *face; - T *instance; -}; - -/* Logic is shared between hb_lazy_loader_t and hb_table_lazy_loader_t */ -template -struct hb_table_lazy_loader_t -{ - inline void init (hb_face_t *face_) - { - face = face_; - blob = nullptr; - } - - inline void fini (void) - { - hb_blob_destroy (blob); - } - - inline const T* get (void) const - { - retry: - hb_blob_t *blob_ = (hb_blob_t *) hb_atomic_ptr_get (&blob); - if (unlikely (!blob_)) - { - blob_ = OT::Sanitizer().sanitize (face->reference_table (T::tableTag)); - if (!hb_atomic_ptr_cmpexch (&blob, nullptr, blob_)) - { - hb_blob_destroy (blob_); - goto retry; - } - blob = blob_; - } - return blob_->as (); - } - - inline const T* operator-> (void) const - { - return get(); - } - - private: - hb_face_t *face; - mutable hb_blob_t *blob; -}; - - -} /* namespace OT */ - - -#endif /* HB_OPEN_TYPE_PRIVATE_HH */ diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh new file mode 100644 index 0000000..6abb898 --- /dev/null +++ b/src/hb-open-type.hh @@ -0,0 +1,1008 @@ +/* + * Copyright © 2007,2008,2009,2010 Red Hat, Inc. + * Copyright © 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. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OPEN_TYPE_HH +#define HB_OPEN_TYPE_HH + +#include "hb.hh" +#include "hb-blob.hh" +#include "hb-face.hh" +#include "hb-machinery.hh" +#include "hb-subset.hh" + + +namespace OT { + + +/* + * + * The OpenType Font File: Data Types + */ + + +/* "The following data types are used in the OpenType font file. + * All OpenType fonts use Motorola-style byte ordering (Big Endian):" */ + +/* + * Int types + */ + +template struct hb_signedness_int; +template <> struct hb_signedness_int { typedef unsigned int value; }; +template <> struct hb_signedness_int { typedef signed int value; }; + +/* Integer types in big-endian order and no alignment requirement */ +template +struct IntType +{ + typedef Type type; + typedef typename hb_signedness_int::value>::value wide_type; + + void set (wide_type i) { v.set (i); } + operator wide_type () const { return v; } + bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; } + bool operator != (const IntType &o) const { return !(*this == o); } + static int cmp (const IntType *a, const IntType *b) { return b->cmp (*a); } + template + int cmp (Type2 a) const + { + Type b = v; + if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int)) + return (int) a - (int) b; + else + return a < b ? -1 : a == b ? 0 : +1; + } + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + protected: + BEInt v; + public: + DEFINE_SIZE_STATIC (Size); +}; + +typedef IntType HBUINT8; /* 8-bit unsigned integer. */ +typedef IntType HBINT8; /* 8-bit signed integer. */ +typedef IntType HBUINT16; /* 16-bit unsigned integer. */ +typedef IntType HBINT16; /* 16-bit signed integer. */ +typedef IntType HBUINT32; /* 32-bit unsigned integer. */ +typedef IntType HBINT32; /* 32-bit signed integer. */ +/* Note: we cannot defined a signed HBINT24 because there's no corresponding C type. + * Works for unsigned, but not signed, since we rely on compiler for sign-extension. */ +typedef IntType HBUINT24; /* 24-bit unsigned integer. */ + +/* 16-bit signed integer (HBINT16) that describes a quantity in FUnits. */ +typedef HBINT16 FWORD; + +/* 32-bit signed integer (HBINT32) that describes a quantity in FUnits. */ +typedef HBINT32 FWORD32; + +/* 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 : HBINT16 +{ + // 16384 means 1<<14 + float to_float () const { return ((int32_t) v) / 16384.f; } + void set_float (float f) { v.set (round (f * 16384.f)); } + public: + DEFINE_SIZE_STATIC (2); +}; + +/* 32-bit signed fixed-point number (16.16). */ +struct Fixed : HBINT32 +{ + // 65536 means 1<<16 + float to_float () const { return ((int32_t) v) / 65536.f; } + void set_float (float f) { v.set (round (f * 65536.f)); } + public: + DEFINE_SIZE_STATIC (4); +}; + +/* Date represented in number of seconds since 12:00 midnight, January 1, + * 1904. The value is represented as a signed 64-bit integer. */ +struct LONGDATETIME +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + protected: + 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 : HBUINT32 +{ + /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */ + operator const char* () const { return reinterpret_cast (&this->v); } + operator char* () { return reinterpret_cast (&this->v); } + public: + DEFINE_SIZE_STATIC (4); +}; + +/* Glyph index number, same as uint16 (length = 16 bits) */ +typedef HBUINT16 GlyphID; + +/* Script/language-system/feature index */ +struct Index : HBUINT16 { + static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFu; +}; +DECLARE_NULL_NAMESPACE_BYTES (OT, Index); + +typedef Index NameID; + +/* Offset, Null offset = 0 */ +template +struct Offset : Type +{ + typedef Type type; + + bool is_null () const { return has_null && 0 == *this; } + + void *serialize (hb_serialize_context_t *c, const void *base) + { + void *t = c->start_embed (); + this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */ + return t; + } + + public: + DEFINE_SIZE_STATIC (sizeof (Type)); +}; + +typedef Offset Offset16; +typedef Offset Offset32; + + +/* CheckSum */ +struct CheckSum : HBUINT32 +{ + /* This is reference implementation from the spec. */ + static uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length) + { + uint32_t Sum = 0L; + assert (0 == (Length & 3)); + const HBUINT32 *EndPtr = Table + Length / HBUINT32::static_size; + + while (Table < EndPtr) + Sum += *Table++; + return Sum; + } + + /* Note: data should be 4byte aligned and have 4byte padding at the end. */ + void set_for_data (const void *data, unsigned int length) + { set (CalcTableChecksum ((const HBUINT32 *) data, length)); } + + public: + DEFINE_SIZE_STATIC (4); +}; + + +/* + * Version Numbers + */ + +template +struct FixedVersion +{ + uint32_t to_int () const { return (major << (sizeof (FixedType) * 8)) + minor; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + FixedType major; + FixedType minor; + public: + DEFINE_SIZE_STATIC (2 * sizeof (FixedType)); +}; + + +/* + * Template subclasses of Offset that do the dereferencing. + * Use: (base+offset) + */ + +template +struct _hb_has_null +{ + static const Type *get_null () { return nullptr; } + static Type *get_crap () { return nullptr; } +}; +template +struct _hb_has_null +{ + static const Type *get_null () { return &Null(Type); } + static Type *get_crap () { return &Crap(Type); } +}; + +template +struct OffsetTo : Offset +{ + const Type& operator () (const void *base) const + { + if (unlikely (this->is_null ())) return *_hb_has_null::get_null (); + return StructAtOffset (base, *this); + } + Type& operator () (void *base) const + { + if (unlikely (this->is_null ())) return *_hb_has_null::get_crap (); + return StructAtOffset (base, *this); + } + + Type& serialize (hb_serialize_context_t *c, const void *base) + { + return * (Type *) Offset::serialize (c, base); + } + + template + void serialize_subset (hb_subset_context_t *c, const T &src, const void *base) + { + if (&src == &Null (T)) + { + this->set (0); + return; + } + serialize (c->serializer, base); + if (!src.subset (c)) + this->set (0); + } + + bool sanitize_shallow (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) return_trace (false); + if (unlikely (this->is_null ())) return_trace (true); + if (unlikely (!c->check_range (base, *this))) return_trace (false); + return_trace (true); + } + + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + return_trace (sanitize_shallow (c, base) && + (this->is_null () || + StructAtOffset (base, *this).sanitize (c) || + neuter (c))); + } + template + bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1) const + { + TRACE_SANITIZE (this); + return_trace (sanitize_shallow (c, base) && + (this->is_null () || + StructAtOffset (base, *this).sanitize (c, d1) || + neuter (c))); + } + template + bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2) const + { + TRACE_SANITIZE (this); + return_trace (sanitize_shallow (c, base) && + (this->is_null () || + StructAtOffset (base, *this).sanitize (c, d1, d2) || + neuter (c))); + } + template + bool sanitize (hb_sanitize_context_t *c, const void *base, T1 d1, T2 d2, T3 d3) const + { + TRACE_SANITIZE (this); + return_trace (sanitize_shallow (c, base) && + (this->is_null () || + StructAtOffset (base, *this).sanitize (c, d1, d2, d3) || + neuter (c))); + } + + /* Set the offset to Null */ + bool neuter (hb_sanitize_context_t *c) const + { + if (!has_null) return false; + return c->try_set (this, 0); + } + DEFINE_SIZE_STATIC (sizeof (OffsetType)); +}; +/* Partial specializations. */ +template struct LOffsetTo : OffsetTo {}; +template struct NNOffsetTo : OffsetTo {}; +template struct LNNOffsetTo : OffsetTo {}; + +template +static inline const Type& operator + (const Base &base, const OffsetTo &offset) { return offset (base); } +template +static inline Type& operator + (Base &base, OffsetTo &offset) { return offset (base); } + + +/* + * Array Types + */ + +template +struct UnsizedArrayOf +{ + typedef Type item_t; + static constexpr unsigned item_size = hb_static_size (Type); + + HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (UnsizedArrayOf, Type); + + const Type& operator [] (int i_) const + { + unsigned int i = (unsigned int) i_; + const Type *p = &arrayZ[i]; + if (unlikely (p < arrayZ)) return Null (Type); /* Overflowed. */ + return *p; + } + Type& operator [] (int i_) + { + unsigned int i = (unsigned int) i_; + Type *p = &arrayZ[i]; + if (unlikely (p < arrayZ)) return Crap (Type); /* Overflowed. */ + return *p; + } + + unsigned int get_size (unsigned int len) const + { return len * Type::static_size; } + + template operator T * () { return arrayZ; } + template operator const T * () const { return arrayZ; } + hb_array_t as_array (unsigned int len) + { return hb_array (arrayZ, len); } + hb_array_t as_array (unsigned int len) const + { return hb_array (arrayZ, len); } + operator hb_array_t () { return as_array (); } + operator hb_array_t () const { return as_array (); } + + template + Type &lsearch (unsigned int len, const T &x, Type ¬_found = Crap (Type)) + { return *as_array (len).lsearch (x, ¬_found); } + template + const Type &lsearch (unsigned int len, const T &x, const Type ¬_found = Null (Type)) const + { return *as_array (len).lsearch (x, ¬_found); } + + void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1) + { as_array (len).qsort (start, end); } + + bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + { + 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); + } + 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 + 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); + } + + bool sanitize_shallow (hb_sanitize_context_t *c, unsigned int count) const + { + TRACE_SANITIZE (this); + return_trace (c->check_array (arrayZ, count)); + } + + public: + Type arrayZ[VAR]; + public: + DEFINE_SIZE_UNBOUNDED (0); +}; + +/* Unsized array of offset's */ +template +struct UnsizedOffsetArrayOf : UnsizedArrayOf > {}; + +/* Unsized array of offsets relative to the beginning of the array itself. */ +template +struct UnsizedOffsetListOf : UnsizedOffsetArrayOf +{ + const Type& operator [] (int i_) const + { + unsigned int i = (unsigned int) i_; + const OffsetTo *p = &this->arrayZ[i]; + if (unlikely (p < this->arrayZ)) return Null (Type); /* Overflowed. */ + return this+*p; + } + Type& operator [] (int i_) + { + unsigned int i = (unsigned int) i_; + const OffsetTo *p = &this->arrayZ[i]; + if (unlikely (p < this->arrayZ)) return Crap (Type); /* Overflowed. */ + return this+*p; + } + + + bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + { + TRACE_SANITIZE (this); + return_trace ((UnsizedOffsetArrayOf::sanitize (c, count, this))); + } + template + bool sanitize (hb_sanitize_context_t *c, unsigned int count, T user_data) const + { + TRACE_SANITIZE (this); + return_trace ((UnsizedOffsetArrayOf::sanitize (c, count, this, user_data))); + } +}; + +/* An array with sorted elements. Supports binary searching. */ +template +struct SortedUnsizedArrayOf : UnsizedArrayOf +{ + hb_sorted_array_t as_array (unsigned int len) + { return hb_sorted_array (this->arrayZ, len); } + hb_sorted_array_t as_array (unsigned int len) const + { return hb_sorted_array (this->arrayZ, len); } + operator hb_sorted_array_t () { return as_array (); } + operator hb_sorted_array_t () const { return as_array (); } + + template + Type &bsearch (unsigned int len, const T &x, Type ¬_found = Crap (Type)) + { return *as_array (len).bsearch (x, ¬_found); } + template + const Type &bsearch (unsigned int len, const T &x, const Type ¬_found = Null (Type)) const + { return *as_array (len).bsearch (x, ¬_found); } + template + bool bfind (unsigned int len, const T &x, unsigned int *i = nullptr, + hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE, + unsigned int to_store = (unsigned int) -1) const + { return as_array (len).bfind (x, i, not_found, to_store); } +}; + + +/* An array with a number of elements. */ +template +struct ArrayOf +{ + typedef Type item_t; + static constexpr unsigned item_size = hb_static_size (Type); + + HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType); + + const Type& operator [] (int i_) const + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= len)) return Null (Type); + return arrayZ[i]; + } + Type& operator [] (int i_) + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= len)) return Crap (Type); + return arrayZ[i]; + } + + unsigned int get_size () const + { return len.static_size + len * Type::static_size; } + + hb_array_t as_array () + { return hb_array (arrayZ, len); } + hb_array_t as_array () const + { return hb_array (arrayZ, len); } + operator hb_array_t (void) { return as_array (); } + operator hb_array_t (void) const { return as_array (); } + + hb_array_t sub_array (unsigned int start_offset, unsigned int count) const + { return as_array ().sub_array (start_offset, count);} + hb_array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const + { return as_array ().sub_array (start_offset, count);} + hb_array_t sub_array (unsigned int start_offset, unsigned int count) + { return as_array ().sub_array (start_offset, count);} + hb_array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) + { return as_array ().sub_array (start_offset, count);} + + bool serialize (hb_serialize_context_t *c, unsigned int items_len) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (*this))) return_trace (false); + len.set (items_len); /* TODO(serialize) Overflow? */ + if (unlikely (!c->extend (*this))) return_trace (false); + return_trace (true); + } + template + bool serialize (hb_serialize_context_t *c, hb_array_t items) + { + TRACE_SERIALIZE (this); + if (unlikely (!serialize (c, items.length))) return_trace (false); + for (unsigned int i = 0; i < items.length; i++) + hb_assign (arrayZ[i], items[i]); + return_trace (true); + } + + 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 && arrayZ[0].sanitize (c)); + + return_trace (true); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + unsigned int count = len; + for (unsigned int i = 0; i < count; i++) + if (unlikely (!arrayZ[i].sanitize (c, base))) + return_trace (false); + return_trace (true); + } + template + bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + unsigned int count = len; + for (unsigned int i = 0; i < count; i++) + if (unlikely (!arrayZ[i].sanitize (c, base, user_data))) + return_trace (false); + return_trace (true); + } + + template + Type &lsearch (const T &x, Type ¬_found = Crap (Type)) + { return *as_array ().lsearch (x, ¬_found); } + template + const Type &lsearch (const T &x, const Type ¬_found = Null (Type)) const + { return *as_array ().lsearch (x, ¬_found); } + + void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1) + { as_array ().qsort (start, end); } + + bool sanitize_shallow (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (len.sanitize (c) && c->check_array (arrayZ, len)); + } + + public: + LenType len; + Type arrayZ[VAR]; + public: + DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); +}; +template struct LArrayOf : ArrayOf {}; +typedef ArrayOf PString; + +/* Array of Offset's */ +template +struct OffsetArrayOf : ArrayOf > {}; +template +struct LOffsetArrayOf : ArrayOf > {}; +template +struct LOffsetLArrayOf : ArrayOf, HBUINT32> {}; + +/* Array of offsets relative to the beginning of the array itself. */ +template +struct OffsetListOf : OffsetArrayOf +{ + const Type& operator [] (int i_) const + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= this->len)) return Null (Type); + return this+this->arrayZ[i]; + } + const Type& operator [] (int i_) + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= this->len)) return Crap (Type); + return this+this->arrayZ[i]; + } + + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + struct OffsetListOf *out = c->serializer->embed (*this); + if (unlikely (!out)) return_trace (false); + unsigned int count = this->len; + for (unsigned int i = 0; i < count; i++) + out->arrayZ[i].serialize_subset (c, (*this)[i], out); + return_trace (true); + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (OffsetArrayOf::sanitize (c, this)); + } + template + bool sanitize (hb_sanitize_context_t *c, T user_data) const + { + TRACE_SANITIZE (this); + return_trace (OffsetArrayOf::sanitize (c, this, user_data)); + } +}; + +/* An array starting at second element. */ +template +struct HeadlessArrayOf +{ + static constexpr unsigned item_size = Type::static_size; + + HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (HeadlessArrayOf, Type, LenType); + + const Type& operator [] (int i_) const + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= lenP1 || !i)) return Null (Type); + return arrayZ[i-1]; + } + Type& operator [] (int i_) + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= lenP1 || !i)) return Crap (Type); + return arrayZ[i-1]; + } + unsigned int get_size () const + { return lenP1.static_size + (lenP1 ? lenP1 - 1 : 0) * Type::static_size; } + + bool serialize (hb_serialize_context_t *c, + hb_array_t items) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (*this))) return_trace (false); + lenP1.set (items.length + 1); /* TODO(serialize) Overflow? */ + if (unlikely (!c->extend (*this))) return_trace (false); + for (unsigned int i = 0; i < items.length; i++) + arrayZ[i] = items[i]; + return_trace (true); + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + + /* Note: for structs that do not reference other structs, + * we do not need to call their sanitize() as we already did + * a bound check on the aggregate array size. We just include + * a small unreachable expression to make sure the structs + * pointed to do have a simple sanitize(), ie. they do not + * reference other structs via offsets. + */ + (void) (false && arrayZ[0].sanitize (c)); + + return_trace (true); + } + + private: + bool sanitize_shallow (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (lenP1.sanitize (c) && + (!lenP1 || c->check_array (arrayZ, lenP1 - 1))); + } + + public: + LenType lenP1; + Type arrayZ[VAR]; + public: + DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); +}; + +/* An array storing length-1. */ +template +struct ArrayOfM1 +{ + HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOfM1, Type, LenType); + + const Type& operator [] (int i_) const + { + unsigned int i = (unsigned int) i_; + if (unlikely (i > lenM1)) return Null (Type); + return arrayZ[i]; + } + Type& operator [] (int i_) + { + unsigned int i = (unsigned int) i_; + if (unlikely (i > lenM1)) return Crap (Type); + return arrayZ[i]; + } + unsigned int get_size () const + { return lenM1.static_size + (lenM1 + 1) * Type::static_size; } + + template + bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + unsigned int count = lenM1 + 1; + for (unsigned int i = 0; i < count; i++) + if (unlikely (!arrayZ[i].sanitize (c, base, user_data))) + return_trace (false); + return_trace (true); + } + + private: + bool sanitize_shallow (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (lenM1.sanitize (c) && + (c->check_array (arrayZ, lenM1 + 1))); + } + + public: + LenType lenM1; + Type arrayZ[VAR]; + public: + DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); +}; + +/* An array with sorted elements. Supports binary searching. */ +template +struct SortedArrayOf : ArrayOf +{ + hb_sorted_array_t as_array () + { return hb_sorted_array (this->arrayZ, this->len); } + hb_sorted_array_t as_array () const + { return hb_sorted_array (this->arrayZ, this->len); } + operator hb_sorted_array_t () { return as_array (); } + operator hb_sorted_array_t () const { return as_array (); } + + hb_array_t sub_array (unsigned int start_offset, unsigned int count) const + { return as_array ().sub_array (start_offset, count);} + hb_array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const + { return as_array ().sub_array (start_offset, count);} + hb_array_t sub_array (unsigned int start_offset, unsigned int count) + { return as_array ().sub_array (start_offset, count);} + hb_array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) + { return as_array ().sub_array (start_offset, count);} + + template + Type &bsearch (const T &x, Type ¬_found = Crap (Type)) + { return *as_array ().bsearch (x, ¬_found); } + template + const Type &bsearch (const T &x, const Type ¬_found = Null (Type)) const + { return *as_array ().bsearch (x, ¬_found); } + template + bool bfind (const T &x, unsigned int *i = nullptr, + hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE, + unsigned int to_store = (unsigned int) -1) const + { return as_array ().bfind (x, i, not_found, to_store); } +}; + +/* + * Binary-search arrays + */ + +template +struct BinSearchHeader +{ + operator uint32_t () const { return len; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + void set (unsigned int v) + { + len.set (v); + assert (len == v); + entrySelector.set (MAX (1u, hb_bit_storage (v)) - 1); + searchRange.set (16 * (1u << entrySelector)); + rangeShift.set (v * 16 > searchRange + ? 16 * v - searchRange + : 0); + } + + protected: + LenType len; + LenType searchRange; + LenType entrySelector; + LenType rangeShift; + + public: + DEFINE_SIZE_STATIC (8); +}; + +template +struct BinSearchArrayOf : SortedArrayOf > {}; + + +struct VarSizedBinSearchHeader +{ + + 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 +struct VarSizedBinSearchArrayOf +{ + static constexpr unsigned item_size = Type::static_size; + + HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (VarSizedBinSearchArrayOf, Type); + + bool last_is_terminator () const + { + if (unlikely (!header.nUnits)) return false; + + /* Gah. + * + * "The number of termination values that need to be included is table-specific. + * The value that indicates binary search termination is 0xFFFF." */ + const HBUINT16 *words = &StructAtOffset (&bytesZ, (header.nUnits - 1) * header.unitSize); + unsigned int count = Type::TerminationWordCount; + for (unsigned int i = 0; i < count; i++) + if (words[i] != 0xFFFFu) + return false; + return true; + } + + const Type& operator [] (int i_) const + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= get_length ())) return Null (Type); + return StructAtOffset (&bytesZ, i * header.unitSize); + } + Type& operator [] (int i_) + { + unsigned int i = (unsigned int) i_; + if (unlikely (i >= get_length ())) return Crap (Type); + return StructAtOffset (&bytesZ, i * header.unitSize); + } + unsigned int get_length () const + { return header.nUnits - last_is_terminator (); } + unsigned int get_size () const + { return header.static_size + header.nUnits * header.unitSize; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + + /* Note: for structs that do not reference other structs, + * we do not need to call their sanitize() as we already did + * a bound check on the aggregate array size. We just include + * a small unreachable expression to make sure the structs + * pointed to do have a simple sanitize(), ie. they do not + * reference other structs via offsets. + */ + (void) (false && StructAtOffset (&bytesZ, 0).sanitize (c)); + + return_trace (true); + } + bool sanitize (hb_sanitize_context_t *c, const void *base) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + unsigned int count = get_length (); + for (unsigned int i = 0; i < count; i++) + if (unlikely (!(*this)[i].sanitize (c, base))) + return_trace (false); + return_trace (true); + } + template + bool sanitize (hb_sanitize_context_t *c, const void *base, T user_data) const + { + TRACE_SANITIZE (this); + if (unlikely (!sanitize_shallow (c))) return_trace (false); + unsigned int count = get_length (); + for (unsigned int i = 0; i < count; i++) + if (unlikely (!(*this)[i].sanitize (c, base, user_data))) + return_trace (false); + return_trace (true); + } + + template + const Type *bsearch (const T &key) const + { + unsigned int size = header.unitSize; + int min = 0, max = (int) get_length () - 1; + while (min <= max) + { + int mid = ((unsigned int) min + (unsigned int) max) / 2; + const Type *p = (const Type *) (((const char *) &bytesZ) + (mid * size)); + int c = p->cmp (key); + if (c < 0) max = mid - 1; + else if (c > 0) min = mid + 1; + else return p; + } + return nullptr; + } + + private: + bool sanitize_shallow (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (header.sanitize (c) && + Type::static_size <= header.unitSize && + c->check_range (bytesZ.arrayZ, + header.nUnits, + header.unitSize)); + } + + protected: + VarSizedBinSearchHeader header; + UnsizedArrayOf bytesZ; + public: + DEFINE_SIZE_ARRAY (10, bytesZ); +}; + + +} /* namespace OT */ + + +#endif /* HB_OPEN_TYPE_HH */ diff --git a/src/hb-ot-cff-common.hh b/src/hb-ot-cff-common.hh new file mode 100644 index 0000000..c645953 --- /dev/null +++ b/src/hb-ot-cff-common.hh @@ -0,0 +1,713 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ +#ifndef HB_OT_CFF_COMMON_HH +#define HB_OT_CFF_COMMON_HH + +#include "hb-open-type.hh" +#include "hb-ot-layout-common.hh" +#include "hb-cff-interp-dict-common.hh" +#include "hb-subset-plan.hh" + +namespace CFF { + +using namespace OT; + +#define CFF_UNDEF_CODE 0xFFFFFFFF + +/* utility macro */ +template +static inline const Type& StructAtOffsetOrNull(const void *P, unsigned int offset) +{ return offset? (* reinterpret_cast ((const char *) P + offset)): Null(Type); } + +inline unsigned int calcOffSize(unsigned int dataSize) +{ + unsigned int size = 1; + unsigned int offset = dataSize + 1; + while ((offset & ~0xFF) != 0) + { + size++; + offset >>= 8; + } + /* format does not support size > 4; caller should handle it as an error */ + return size; +} + +struct code_pair_t +{ + hb_codepoint_t code; + hb_codepoint_t glyph; +}; + +typedef hb_vector_t str_buff_t; +struct str_buff_vec_t : hb_vector_t +{ + void fini () { SUPER::fini_deep (); } + + unsigned int total_size () const + { + unsigned int size = 0; + for (unsigned int i = 0; i < length; i++) + size += (*this)[i].length; + return size; + } + + private: + typedef hb_vector_t SUPER; +}; + +/* CFF INDEX */ +template +struct CFFIndex +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely ((count.sanitize (c) && count == 0) || /* empty INDEX */ + (c->check_struct (this) && offSize >= 1 && offSize <= 4 && + c->check_array (offsets, offSize, count + 1) && + c->check_array ((const HBUINT8*)data_base (), 1, max_offset () - 1)))); + } + + static unsigned int calculate_offset_array_size (unsigned int offSize, unsigned int count) + { return offSize * (count + 1); } + + unsigned int offset_array_size () const + { return calculate_offset_array_size (offSize, count); } + + static unsigned int calculate_serialized_size (unsigned int offSize, unsigned int count, unsigned int dataSize) + { + if (count == 0) + return COUNT::static_size; + else + return min_size + calculate_offset_array_size (offSize, count) + dataSize; + } + + bool serialize (hb_serialize_context_t *c, const CFFIndex &src) + { + TRACE_SERIALIZE (this); + unsigned int size = src.get_size (); + CFFIndex *dest = c->allocate_size (size); + if (unlikely (dest == nullptr)) return_trace (false); + memcpy (dest, &src, size); + return_trace (true); + } + + bool serialize (hb_serialize_context_t *c, + unsigned int offSize_, + const byte_str_array_t &byteArray) + { + TRACE_SERIALIZE (this); + if (byteArray.length == 0) + { + COUNT *dest = c->allocate_min (); + if (unlikely (dest == nullptr)) return_trace (false); + dest->set (0); + } + else + { + /* serialize CFFIndex header */ + if (unlikely (!c->extend_min (*this))) return_trace (false); + this->count.set (byteArray.length); + this->offSize.set (offSize_); + if (!unlikely (c->allocate_size (offSize_ * (byteArray.length + 1)))) + return_trace (false); + + /* serialize indices */ + unsigned int offset = 1; + unsigned int i = 0; + for (; i < byteArray.length; i++) + { + set_offset_at (i, offset); + offset += byteArray[i].get_size (); + } + set_offset_at (i, offset); + + /* serialize data */ + for (unsigned int i = 0; i < byteArray.length; i++) + { + const byte_str_t &bs = byteArray[i]; + unsigned char *dest = c->allocate_size (bs.length); + if (unlikely (dest == nullptr)) + return_trace (false); + memcpy (dest, &bs[0], bs.length); + } + } + return_trace (true); + } + + bool serialize (hb_serialize_context_t *c, + unsigned int offSize_, + const str_buff_vec_t &buffArray) + { + byte_str_array_t byteArray; + byteArray.init (); + byteArray.resize (buffArray.length); + for (unsigned int i = 0; i < byteArray.length; i++) + { + byteArray[i] = byte_str_t (buffArray[i].arrayZ (), buffArray[i].length); + } + bool result = this->serialize (c, offSize_, byteArray); + byteArray.fini (); + return result; + } + + void set_offset_at (unsigned int index, unsigned int offset) + { + HBUINT8 *p = offsets + offSize * index + offSize; + unsigned int size = offSize; + for (; size; size--) + { + --p; + p->set (offset & 0xFF); + offset >>= 8; + } + } + + unsigned int offset_at (unsigned int index) const + { + assert (index <= count); + const HBUINT8 *p = offsets + offSize * index; + unsigned int size = offSize; + unsigned int offset = 0; + for (; size; size--) + offset = (offset << 8) + *p++; + return offset; + } + + unsigned int length_at (unsigned int index) const + { + if (likely ((offset_at (index + 1) >= offset_at (index)) && + (offset_at (index + 1) <= offset_at (count)))) + return offset_at (index + 1) - offset_at (index); + else + return 0; + } + + const unsigned char *data_base () const + { return (const unsigned char *)this + min_size + offset_array_size (); } + + unsigned int data_size () const { return HBINT8::static_size; } + + byte_str_t operator [] (unsigned int index) const + { + if (likely (index < count)) + return byte_str_t (data_base () + offset_at (index) - 1, length_at (index)); + else + return Null(byte_str_t); + } + + unsigned int get_size () const + { + if (this != &Null(CFFIndex)) + { + if (count > 0) + return min_size + offset_array_size () + (offset_at (count) - 1); + else + return count.static_size; /* empty CFFIndex contains count only */ + } + else + return 0; + } + + protected: + unsigned int max_offset () const + { + unsigned int max = 0; + for (unsigned int i = 0; i < count + 1u; i++) + { + unsigned int off = offset_at (i); + if (off > max) max = off; + } + return max; + } + + public: + COUNT count; /* Number of object data. Note there are (count+1) offsets */ + HBUINT8 offSize; /* The byte size of each offset in the offsets array. */ + HBUINT8 offsets[VAR]; /* The array of (count + 1) offsets into objects array (1-base). */ + /* HBUINT8 data[VAR]; Object data */ + public: + DEFINE_SIZE_ARRAY (COUNT::static_size + HBUINT8::static_size, offsets); +}; + +template +struct CFFIndexOf : CFFIndex +{ + const byte_str_t operator [] (unsigned int index) const + { + if (likely (index < CFFIndex::count)) + return byte_str_t (CFFIndex::data_base () + CFFIndex::offset_at (index) - 1, CFFIndex::length_at (index)); + return Null(byte_str_t); + } + + template + bool serialize (hb_serialize_context_t *c, + unsigned int offSize_, + const DATA *dataArray, + unsigned int dataArrayLen, + const hb_vector_t &dataSizeArray, + const PARAM1 ¶m1, + const PARAM2 ¶m2) + { + TRACE_SERIALIZE (this); + /* serialize CFFIndex header */ + if (unlikely (!c->extend_min (*this))) return_trace (false); + this->count.set (dataArrayLen); + this->offSize.set (offSize_); + if (!unlikely (c->allocate_size (offSize_ * (dataArrayLen + 1)))) + return_trace (false); + + /* serialize indices */ + unsigned int offset = 1; + unsigned int i = 0; + for (; i < dataArrayLen; i++) + { + CFFIndex::set_offset_at (i, offset); + offset += dataSizeArray[i]; + } + CFFIndex::set_offset_at (i, offset); + + /* serialize data */ + for (unsigned int i = 0; i < dataArrayLen; i++) + { + TYPE *dest = c->start_embed (); + if (unlikely (dest == nullptr || + !dest->serialize (c, dataArray[i], param1, param2))) + return_trace (false); + } + return_trace (true); + } + + /* in parallel to above */ + template + static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */, + const DATA *dataArray, + unsigned int dataArrayLen, + hb_vector_t &dataSizeArray, /* OUT */ + const PARAM ¶m) + { + /* determine offset size */ + unsigned int totalDataSize = 0; + for (unsigned int i = 0; i < dataArrayLen; i++) + { + unsigned int dataSize = TYPE::calculate_serialized_size (dataArray[i], param); + dataSizeArray[i] = dataSize; + totalDataSize += dataSize; + } + offSize_ = calcOffSize (totalDataSize); + + return CFFIndex::calculate_serialized_size (offSize_, dataArrayLen, totalDataSize); + } +}; + +/* Top Dict, Font Dict, Private Dict */ +struct Dict : UnsizedByteStr +{ + template + bool serialize (hb_serialize_context_t *c, + const DICTVAL &dictval, + OP_SERIALIZER& opszr, + PARAM& param) + { + TRACE_SERIALIZE (this); + for (unsigned int i = 0; i < dictval.get_count (); i++) + { + if (unlikely (!opszr.serialize (c, dictval[i], param))) + return_trace (false); + } + return_trace (true); + } + + /* in parallel to above */ + template + static unsigned int calculate_serialized_size (const DICTVAL &dictval, + OP_SERIALIZER& opszr, + PARAM& param) + { + unsigned int size = 0; + for (unsigned int i = 0; i < dictval.get_count (); i++) + size += opszr.calculate_serialized_size (dictval[i], param); + return size; + } + + template + static unsigned int calculate_serialized_size (const DICTVAL &dictval, + OP_SERIALIZER& opszr) + { + unsigned int size = 0; + for (unsigned int i = 0; i < dictval.get_count (); i++) + size += opszr.calculate_serialized_size (dictval[i]); + return size; + } + + template + static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, int value, op_code_t intOp) + { + // XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation + if (/*unlikely*/ (!serialize_int (c, intOp, value))) + return false; + + TRACE_SERIALIZE (this); + /* serialize the opcode */ + HBUINT8 *p = c->allocate_size (OpCode_Size (op)); + if (unlikely (p == nullptr)) return_trace (false); + if (Is_OpCode_ESC (op)) + { + p->set (OpCode_escape); + op = Unmake_OpCode_ESC (op); + p++; + } + p->set (op); + return_trace (true); + } + + static bool serialize_uint4_op (hb_serialize_context_t *c, op_code_t op, int value) + { return serialize_int_op (c, op, value, OpCode_longintdict); } + + static bool serialize_uint2_op (hb_serialize_context_t *c, op_code_t op, int value) + { return serialize_int_op (c, op, value, OpCode_shortint); } + + static bool serialize_offset4_op (hb_serialize_context_t *c, op_code_t op, int value) + { + return serialize_uint4_op (c, op, value); + } + + static bool serialize_offset2_op (hb_serialize_context_t *c, op_code_t op, int value) + { + return serialize_uint2_op (c, op, value); + } +}; + +struct TopDict : Dict {}; +struct FontDict : Dict {}; +struct PrivateDict : Dict {}; + +struct table_info_t +{ + void init () { offSize = offset = size = 0; } + + unsigned int offset; + unsigned int size; + unsigned int offSize; +}; + +/* used to remap font index or SID from fullset to subset. + * set to CFF_UNDEF_CODE if excluded from subset */ +struct remap_t : hb_vector_t +{ + void init () { SUPER::init (); } + + void fini () { SUPER::fini (); } + + bool reset (unsigned int size) + { + if (unlikely (!SUPER::resize (size))) + return false; + for (unsigned int i = 0; i < length; i++) + (*this)[i] = CFF_UNDEF_CODE; + count = 0; + return true; + } + + bool identity (unsigned int size) + { + if (unlikely (!SUPER::resize (size))) + return false; + unsigned int i; + for (i = 0; i < length; i++) + (*this)[i] = i; + count = i; + return true; + } + + bool excludes (hb_codepoint_t id) const + { return (id < length) && ((*this)[id] == CFF_UNDEF_CODE); } + + bool includes (hb_codepoint_t id) const + { return !excludes (id); } + + unsigned int add (unsigned int i) + { + if ((*this)[i] == CFF_UNDEF_CODE) + (*this)[i] = count++; + return (*this)[i]; + } + + hb_codepoint_t get_count () const { return count; } + + protected: + hb_codepoint_t count; + + private: + typedef hb_vector_t SUPER; +}; + +template +struct FDArray : CFFIndexOf +{ + /* used by CFF1 */ + template + bool serialize (hb_serialize_context_t *c, + unsigned int offSize_, + const hb_vector_t &fontDicts, + OP_SERIALIZER& opszr) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (*this))) return_trace (false); + this->count.set (fontDicts.length); + this->offSize.set (offSize_); + if (!unlikely (c->allocate_size (offSize_ * (fontDicts.length + 1)))) + return_trace (false); + + /* serialize font dict offsets */ + unsigned int offset = 1; + unsigned int fid = 0; + for (; fid < fontDicts.length; fid++) + { + CFFIndexOf::set_offset_at (fid, offset); + offset += FontDict::calculate_serialized_size (fontDicts[fid], opszr); + } + CFFIndexOf::set_offset_at (fid, offset); + + /* serialize font dicts */ + for (unsigned int i = 0; i < fontDicts.length; i++) + { + FontDict *dict = c->start_embed (); + if (unlikely (!dict->serialize (c, fontDicts[i], opszr, fontDicts[i]))) + return_trace (false); + } + return_trace (true); + } + + /* used by CFF2 */ + template + bool serialize (hb_serialize_context_t *c, + unsigned int offSize_, + const hb_vector_t &fontDicts, + unsigned int fdCount, + const remap_t &fdmap, + OP_SERIALIZER& opszr, + const hb_vector_t &privateInfos) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (*this))) return_trace (false); + this->count.set (fdCount); + this->offSize.set (offSize_); + if (!unlikely (c->allocate_size (offSize_ * (fdCount + 1)))) + return_trace (false); + + /* serialize font dict offsets */ + unsigned int offset = 1; + unsigned int fid = 0; + for (unsigned i = 0; i < fontDicts.length; i++) + if (fdmap.includes (i)) + { + CFFIndexOf::set_offset_at (fid++, offset); + offset += FontDict::calculate_serialized_size (fontDicts[i], opszr); + } + CFFIndexOf::set_offset_at (fid, offset); + + /* serialize font dicts */ + for (unsigned int i = 0; i < fontDicts.length; i++) + if (fdmap.includes (i)) + { + FontDict *dict = c->start_embed (); + if (unlikely (!dict->serialize (c, fontDicts[i], opszr, privateInfos[fdmap[i]]))) + return_trace (false); + } + return_trace (true); + } + + /* in parallel to above */ + template + static unsigned int calculate_serialized_size (unsigned int &offSize_ /* OUT */, + const hb_vector_t &fontDicts, + unsigned int fdCount, + const remap_t &fdmap, + OP_SERIALIZER& opszr) + { + unsigned int dictsSize = 0; + for (unsigned int i = 0; i < fontDicts.len; i++) + if (fdmap.includes (i)) + dictsSize += FontDict::calculate_serialized_size (fontDicts[i], opszr); + + offSize_ = calcOffSize (dictsSize); + return CFFIndex::calculate_serialized_size (offSize_, fdCount, dictsSize); + } +}; + +/* FDSelect */ +struct FDSelect0 { + bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const + { + TRACE_SANITIZE (this); + if (unlikely (!(c->check_struct (this)))) + return_trace (false); + for (unsigned int i = 0; i < c->get_num_glyphs (); i++) + if (unlikely (!fds[i].sanitize (c))) + return_trace (false); + + return_trace (true); + } + + hb_codepoint_t get_fd (hb_codepoint_t glyph) const + { + return (hb_codepoint_t)fds[glyph]; + } + + unsigned int get_size (unsigned int num_glyphs) const + { return HBUINT8::static_size * num_glyphs; } + + HBUINT8 fds[VAR]; + + DEFINE_SIZE_MIN (1); +}; + +template +struct FDSelect3_4_Range { + bool sanitize (hb_sanitize_context_t *c, const void */*nullptr*/, unsigned int fdcount) const + { + TRACE_SANITIZE (this); + return_trace (first < c->get_num_glyphs () && (fd < fdcount)); + } + + GID_TYPE first; + FD_TYPE fd; + + DEFINE_SIZE_STATIC (GID_TYPE::static_size + FD_TYPE::static_size); +}; + +template +struct FDSelect3_4 { + unsigned int get_size () const + { return GID_TYPE::static_size * 2 + ranges.get_size (); } + + bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this) || !ranges.sanitize (c, nullptr, fdcount) || + (nRanges () == 0) || ranges[0].first != 0)) + return_trace (false); + + for (unsigned int i = 1; i < nRanges (); i++) + { + if (unlikely (ranges[i - 1].first >= ranges[i].first)) + return_trace (false); + } + + if (unlikely (!sentinel().sanitize (c) || (sentinel() != c->get_num_glyphs ()))) + return_trace (false); + + return_trace (true); + } + + hb_codepoint_t get_fd (hb_codepoint_t glyph) const + { + unsigned int i; + for (i = 1; i < nRanges (); i++) + if (glyph < ranges[i].first) + break; + + return (hb_codepoint_t)ranges[i - 1].fd; + } + + GID_TYPE &nRanges () { return ranges.len; } + GID_TYPE nRanges () const { return ranges.len; } + GID_TYPE &sentinel () { return StructAfter (ranges[nRanges () - 1]); } + const GID_TYPE &sentinel () const { return StructAfter (ranges[nRanges () - 1]); } + + ArrayOf, GID_TYPE> ranges; + /* GID_TYPE sentinel */ + + DEFINE_SIZE_ARRAY (GID_TYPE::static_size, ranges); +}; + +typedef FDSelect3_4 FDSelect3; +typedef FDSelect3_4_Range FDSelect3_Range; + +struct FDSelect { + bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const + { + TRACE_SANITIZE (this); + + return_trace (likely (c->check_struct (this) && (format == 0 || format == 3) && + (format == 0)? + u.format0.sanitize (c, fdcount): + u.format3.sanitize (c, fdcount))); + } + + bool serialize (hb_serialize_context_t *c, const FDSelect &src, unsigned int num_glyphs) + { + TRACE_SERIALIZE (this); + unsigned int size = src.get_size (num_glyphs); + FDSelect *dest = c->allocate_size (size); + if (unlikely (dest == nullptr)) return_trace (false); + memcpy (dest, &src, size); + return_trace (true); + } + + unsigned int calculate_serialized_size (unsigned int num_glyphs) const + { return get_size (num_glyphs); } + + unsigned int get_size (unsigned int num_glyphs) const + { + unsigned int size = format.static_size; + if (format == 0) + size += u.format0.get_size (num_glyphs); + else + size += u.format3.get_size (); + return size; + } + + hb_codepoint_t get_fd (hb_codepoint_t glyph) const + { + if (this == &Null(FDSelect)) + return 0; + if (format == 0) + return u.format0.get_fd (glyph); + else + return u.format3.get_fd (glyph); + } + + HBUINT8 format; + union { + FDSelect0 format0; + FDSelect3 format3; + } u; + + DEFINE_SIZE_MIN (1); +}; + +template +struct Subrs : CFFIndex +{ + typedef COUNT count_type; + typedef CFFIndex SUPER; +}; + +} /* namespace CFF */ + +#endif /* HB_OT_CFF_COMMON_HH */ diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc new file mode 100644 index 0000000..8773c05 --- /dev/null +++ b/src/hb-ot-cff1-table.cc @@ -0,0 +1,385 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ + +#include "hb-ot-cff1-table.hh" +#include "hb-cff1-interp-cs.hh" + +using namespace CFF; + +/* SID to code */ +static const uint8_t standard_encoding_to_code [] = +{ + 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 177, + 178, 179, 180, 182, 183, 184, 185, 186, 187, 188, 189, 191, 193, 194, 195, 196, + 197, 198, 199, 200, 202, 203, 205, 206, 207, 208, 225, 227, 232, 233, 234, 235, + 241, 245, 248, 249, 250, 251 +}; + +/* SID to code */ +static const uint8_t expert_encoding_to_code [] = +{ + 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 46, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 189, 0, 0, 188, 0, + 0, 0, 0, 190, 202, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 60, 61, 62, 63, 65, 66, 67, + 68, 69, 73, 76, 77, 78, 79, 82, 83, 84, 86, 89, 90, 91, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 161, 162, 163, 166, 167, 168, 169, 170, 172, 175, 178, 179, 182, 183, 184, 191, + 192, 193, 194, 195, 196, 197, 200, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 +}; + +/* glyph ID to SID */ +static const uint16_t expert_charset_to_sid [] = +{ + 0, 1, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 109, 110, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 158, 155, 163, 319, 320, 321, 322, 323, 324, 325, 326, 150, + 164, 169, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 +}; + +/* glyph ID to SID */ +static const uint16_t expert_subset_charset_to_sid [] = +{ + 0, 1, 231, 232, 235, 236, 237, 238, 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, 249, 250, 251, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 109, 110, 267, 268, 269, 270, 272, + 300, 301, 302, 305, 314, 315, 158, 155, 163, 320, 321, 322, 323, 324, 325, 326, + 150, 164, 169, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 +}; + +/* code to SID */ +static const uint8_t standard_encoding_to_sid [] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 115, 116, 117, 118, 119, 120, 121, 122, 0, 123, + 0, 124, 125, 126, 127, 128, 129, 130, 131, 0, 132, 133, 0, 134, 135, 136, + 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 0, 139, 0, 0, 0, 0, 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, 146, 147, 148, 149, 0, 0, 0, 0 +}; + +hb_codepoint_t OT::cff1::lookup_standard_encoding_for_code (hb_codepoint_t sid) +{ + if (sid < ARRAY_LENGTH (standard_encoding_to_code)) + return (hb_codepoint_t)standard_encoding_to_code[sid]; + else + return 0; +} + +hb_codepoint_t OT::cff1::lookup_expert_encoding_for_code (hb_codepoint_t sid) +{ + if (sid < ARRAY_LENGTH (expert_encoding_to_code)) + return (hb_codepoint_t)expert_encoding_to_code[sid]; + else + return 0; +} + +hb_codepoint_t OT::cff1::lookup_expert_charset_for_sid (hb_codepoint_t glyph) +{ + if (glyph < ARRAY_LENGTH (expert_charset_to_sid)) + return (hb_codepoint_t)expert_charset_to_sid[glyph]; + else + return 0; +} + +hb_codepoint_t OT::cff1::lookup_expert_subset_charset_for_sid (hb_codepoint_t glyph) +{ + if (glyph < ARRAY_LENGTH (expert_subset_charset_to_sid)) + return (hb_codepoint_t)expert_subset_charset_to_sid[glyph]; + else + return 0; +} + +hb_codepoint_t OT::cff1::lookup_standard_encoding_for_sid (hb_codepoint_t code) +{ + if (code < ARRAY_LENGTH (standard_encoding_to_sid)) + return (hb_codepoint_t)standard_encoding_to_sid[code]; + else + return CFF_UNDEF_SID; +} + +struct bounds_t +{ + void init () + { + min.set_int (0x7FFFFFFF, 0x7FFFFFFF); + max.set_int (-0x80000000, -0x80000000); + } + + void update (const point_t &pt) + { + if (pt.x < min.x) min.x = pt.x; + if (pt.x > max.x) max.x = pt.x; + if (pt.y < min.y) min.y = pt.y; + if (pt.y > max.y) max.y = pt.y; + } + + void merge (const bounds_t &b) + { + if (empty ()) + *this = b; + else if (!b.empty ()) + { + if (b.min.x < min.x) min.x = b.min.x; + if (b.max.x > max.x) max.x = b.max.x; + if (b.min.y < min.y) min.y = b.min.y; + if (b.max.y > max.y) max.y = b.max.y; + } + } + + void offset (const point_t &delta) + { + if (!empty ()) + { + min.move (delta); + max.move (delta); + } + } + + bool empty () const + { return (min.x >= max.x) || (min.y >= max.y); } + + point_t min; + point_t max; +}; + +struct extents_param_t +{ + void init (const OT::cff1::accelerator_t *_cff) + { + path_open = false; + cff = _cff; + bounds.init (); + } + + void start_path () { path_open = true; } + void end_path () { path_open = false; } + bool is_path_open () const { return path_open; } + + bool path_open; + bounds_t bounds; + + const OT::cff1::accelerator_t *cff; +}; + +struct cff1_path_procs_extents_t : path_procs_t +{ + static void moveto (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt) + { + param.end_path (); + env.moveto (pt); + } + + static void line (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1) + { + if (!param.is_path_open ()) + { + param.start_path (); + param.bounds.update (env.get_pt ()); + } + env.moveto (pt1); + param.bounds.update (env.get_pt ()); + } + + static void curve (cff1_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1, const point_t &pt2, const point_t &pt3) + { + if (!param.is_path_open ()) + { + param.start_path (); + param.bounds.update (env.get_pt ()); + } + /* include control points */ + param.bounds.update (pt1); + param.bounds.update (pt2); + env.moveto (pt3); + param.bounds.update (env.get_pt ()); + } +}; + +static bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, bounds_t &bounds, bool in_seac=false); + +struct cff1_cs_opset_extents_t : cff1_cs_opset_t +{ + static void process_seac (cff1_cs_interp_env_t &env, extents_param_t& param) + { + unsigned int n = env.argStack.get_count (); + point_t delta; + delta.x = env.argStack[n-4]; + delta.y = env.argStack[n-3]; + hb_codepoint_t base = param.cff->std_code_to_glyph (env.argStack[n-2].to_int ()); + hb_codepoint_t accent = param.cff->std_code_to_glyph (env.argStack[n-1].to_int ()); + + bounds_t base_bounds, accent_bounds; + if (likely (!env.in_seac && base && accent + && _get_bounds (param.cff, base, base_bounds, true) + && _get_bounds (param.cff, accent, accent_bounds, true))) + { + param.bounds.merge (base_bounds); + accent_bounds.offset (delta); + param.bounds.merge (accent_bounds); + } + else + env.set_error (); + } +}; + +bool _get_bounds (const OT::cff1::accelerator_t *cff, hb_codepoint_t glyph, bounds_t &bounds, bool in_seac) +{ + bounds.init (); + if (unlikely (!cff->is_valid () || (glyph >= cff->num_glyphs))) return false; + + unsigned int fd = cff->fdSelect->get_fd (glyph); + cff1_cs_interpreter_t interp; + const byte_str_t str = (*cff->charStrings)[glyph]; + interp.env.init (str, *cff, fd); + interp.env.set_in_seac (in_seac); + extents_param_t param; + param.init (cff); + if (unlikely (!interp.interpret (param))) return false; + bounds = param.bounds; + return true; +} + +bool OT::cff1::accelerator_t::get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const +{ + bounds_t bounds; + + if (!_get_bounds (this, glyph, bounds)) + return false; + + if (bounds.min.x >= bounds.max.x) + { + extents->width = 0; + extents->x_bearing = 0; + } + else + { + extents->x_bearing = (int32_t)bounds.min.x.floor (); + extents->width = (int32_t)bounds.max.x.ceil () - extents->x_bearing; + } + if (bounds.min.y >= bounds.max.y) + { + extents->height = 0; + extents->y_bearing = 0; + } + else + { + extents->y_bearing = (int32_t)bounds.max.y.ceil (); + extents->height = (int32_t)bounds.min.y.floor () - extents->y_bearing; + } + + return true; +} + +struct get_seac_param_t +{ + void init (const OT::cff1::accelerator_t *_cff) + { + cff = _cff; + base = 0; + accent = 0; + } + + bool has_seac () const { return base && accent; } + + const OT::cff1::accelerator_t *cff; + hb_codepoint_t base; + hb_codepoint_t accent; +}; + +struct cff1_cs_opset_seac_t : cff1_cs_opset_t +{ + static void process_seac (cff1_cs_interp_env_t &env, get_seac_param_t& param) + { + unsigned int n = env.argStack.get_count (); + hb_codepoint_t base_char = (hb_codepoint_t)env.argStack[n-2].to_int (); + hb_codepoint_t accent_char = (hb_codepoint_t)env.argStack[n-1].to_int (); + + param.base = param.cff->std_code_to_glyph (base_char); + param.accent = param.cff->std_code_to_glyph (accent_char); + } +}; + +bool OT::cff1::accelerator_t::get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const +{ + if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false; + + unsigned int fd = fdSelect->get_fd (glyph); + cff1_cs_interpreter_t interp; + const byte_str_t str = (*charStrings)[glyph]; + interp.env.init (str, *this, fd); + get_seac_param_t param; + param.init (this); + if (unlikely (!interp.interpret (param))) return false; + + if (param.has_seac ()) + { + *base = param.base; + *accent = param.accent; + return true; + } + return false; +} diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh new file mode 100644 index 0000000..1effdf0 --- /dev/null +++ b/src/hb-ot-cff1-table.hh @@ -0,0 +1,1299 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ + +#ifndef HB_OT_CFF1_TABLE_HH +#define HB_OT_CFF1_TABLE_HH + +#include "hb-ot-head-table.hh" +#include "hb-ot-cff-common.hh" +#include "hb-subset-cff1.hh" + +namespace CFF { + +/* + * CFF -- Compact Font Format (CFF) + * http://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf + */ +#define HB_OT_TAG_cff1 HB_TAG('C','F','F',' ') + +#define CFF_UNDEF_SID CFF_UNDEF_CODE + +enum EncodingID { StandardEncoding = 0, ExpertEncoding = 1 }; +enum CharsetID { ISOAdobeCharset = 0, ExpertCharset = 1, ExpertSubsetCharset = 2 }; + +typedef CFFIndex CFF1Index; +template struct CFF1IndexOf : CFFIndexOf {}; + +typedef CFFIndex CFF1Index; +typedef CFF1Index CFF1CharStrings; +typedef FDArray CFF1FDArray; +typedef Subrs CFF1Subrs; + +struct CFF1FDSelect : FDSelect {}; + +/* Encoding */ +struct Encoding0 { + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && codes[nCodes - 1].sanitize (c)); + } + + hb_codepoint_t get_code (hb_codepoint_t glyph) const + { + assert (glyph > 0); + glyph--; + if (glyph < nCodes) + { + return (hb_codepoint_t)codes[glyph]; + } + else + return CFF_UNDEF_CODE; + } + + unsigned int get_size () const + { return HBUINT8::static_size * (nCodes + 1); } + + HBUINT8 nCodes; + HBUINT8 codes[VAR]; + + DEFINE_SIZE_ARRAY(1, codes); +}; + +struct Encoding1_Range { + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + HBUINT8 first; + HBUINT8 nLeft; + + DEFINE_SIZE_STATIC (2); +}; + +struct Encoding1 { + unsigned int get_size () const + { return HBUINT8::static_size + Encoding1_Range::static_size * nRanges; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && ((nRanges == 0) || (ranges[nRanges - 1]).sanitize (c))); + } + + hb_codepoint_t get_code (hb_codepoint_t glyph) const + { + assert (glyph > 0); + glyph--; + for (unsigned int i = 0; i < nRanges; i++) + { + if (glyph <= ranges[i].nLeft) + { + return (hb_codepoint_t)ranges[i].first + glyph; + } + glyph -= (ranges[i].nLeft + 1); + } + return CFF_UNDEF_CODE; + } + + HBUINT8 nRanges; + Encoding1_Range ranges[VAR]; + + DEFINE_SIZE_ARRAY (1, ranges); +}; + +struct SuppEncoding { + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + HBUINT8 code; + HBUINT16 glyph; + + DEFINE_SIZE_STATIC (3); +}; + +struct CFF1SuppEncData { + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && ((nSups == 0) || (supps[nSups - 1]).sanitize (c))); + } + + void get_codes (hb_codepoint_t sid, hb_vector_t &codes) const + { + for (unsigned int i = 0; i < nSups; i++) + if (sid == supps[i].glyph) + codes.push (supps[i].code); + } + + unsigned int get_size () const + { return HBUINT8::static_size + SuppEncoding::static_size * nSups; } + + HBUINT8 nSups; + SuppEncoding supps[VAR]; + + DEFINE_SIZE_ARRAY (1, supps); +}; + +struct Encoding { + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + + if (unlikely (!c->check_struct (this))) + return_trace (false); + unsigned int fmt = format & 0x7F; + if (unlikely (fmt > 1)) + return_trace (false); + if (unlikely (!((fmt == 0)? u.format0.sanitize (c): u.format1.sanitize (c)))) + return_trace (false); + return_trace (((format & 0x80) == 0) || suppEncData ().sanitize (c)); + } + + /* serialize a fullset Encoding */ + bool serialize (hb_serialize_context_t *c, const Encoding &src) + { + TRACE_SERIALIZE (this); + unsigned int size = src.get_size (); + Encoding *dest = c->allocate_size (size); + if (unlikely (dest == nullptr)) return_trace (false); + memcpy (dest, &src, size); + return_trace (true); + } + + /* serialize a subset Encoding */ + bool serialize (hb_serialize_context_t *c, + uint8_t format, + unsigned int enc_count, + const hb_vector_t& code_ranges, + const hb_vector_t& supp_codes) + { + TRACE_SERIALIZE (this); + Encoding *dest = c->extend_min (*this); + if (unlikely (dest == nullptr)) return_trace (false); + dest->format.set (format | ((supp_codes.length > 0)? 0x80: 0)); + if (format == 0) + { + Encoding0 *fmt0 = c->allocate_size (Encoding0::min_size + HBUINT8::static_size * enc_count); + if (unlikely (fmt0 == nullptr)) return_trace (false); + fmt0->nCodes.set (enc_count); + unsigned int glyph = 0; + for (unsigned int i = 0; i < code_ranges.length; i++) + { + hb_codepoint_t code = code_ranges[i].code; + for (int left = (int)code_ranges[i].glyph; left >= 0; left--) + fmt0->codes[glyph++].set (code++); + if (unlikely (!((glyph <= 0x100) && (code <= 0x100)))) + return_trace (false); + } + } + else + { + Encoding1 *fmt1 = c->allocate_size (Encoding1::min_size + Encoding1_Range::static_size * code_ranges.length); + if (unlikely (fmt1 == nullptr)) return_trace (false); + fmt1->nRanges.set (code_ranges.length); + for (unsigned int i = 0; i < code_ranges.length; i++) + { + if (unlikely (!((code_ranges[i].code <= 0xFF) && (code_ranges[i].glyph <= 0xFF)))) + return_trace (false); + fmt1->ranges[i].first.set (code_ranges[i].code); + fmt1->ranges[i].nLeft.set (code_ranges[i].glyph); + } + } + if (supp_codes.length > 0) + { + CFF1SuppEncData *suppData = c->allocate_size (CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_codes.length); + if (unlikely (suppData == nullptr)) return_trace (false); + suppData->nSups.set (supp_codes.length); + for (unsigned int i = 0; i < supp_codes.length; i++) + { + suppData->supps[i].code.set (supp_codes[i].code); + suppData->supps[i].glyph.set (supp_codes[i].glyph); /* actually SID */ + } + } + return_trace (true); + } + + /* parallel to above: calculate the size of a subset Encoding */ + static unsigned int calculate_serialized_size (uint8_t format, + unsigned int enc_count, + unsigned int supp_count) + { + unsigned int size = min_size; + if (format == 0) + size += Encoding0::min_size + HBUINT8::static_size * enc_count; + else + size += Encoding1::min_size + Encoding1_Range::static_size * enc_count; + if (supp_count > 0) + size += CFF1SuppEncData::min_size + SuppEncoding::static_size * supp_count; + return size; + } + + unsigned int get_size () const + { + unsigned int size = min_size; + if (table_format () == 0) + size += u.format0.get_size (); + else + size += u.format1.get_size (); + if (has_supplement ()) + size += suppEncData ().get_size (); + return size; + } + + hb_codepoint_t get_code (hb_codepoint_t glyph) const + { + if (table_format () == 0) + return u.format0.get_code (glyph); + else + return u.format1.get_code (glyph); + } + + uint8_t table_format () const { return (format & 0x7F); } + bool has_supplement () const { return (format & 0x80) != 0; } + + void get_supplement_codes (hb_codepoint_t sid, hb_vector_t &codes) const + { + codes.resize (0); + if (has_supplement ()) + suppEncData().get_codes (sid, codes); + } + + protected: + const CFF1SuppEncData &suppEncData () const + { + if ((format & 0x7F) == 0) + return StructAfter (u.format0.codes[u.format0.nCodes-1]); + else + return StructAfter (u.format1.ranges[u.format1.nRanges-1]); + } + + public: + HBUINT8 format; + + union { + Encoding0 format0; + Encoding1 format1; + } u; + /* CFF1SuppEncData suppEncData; */ + + DEFINE_SIZE_MIN (1); +}; + +/* Charset */ +struct Charset0 { + bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && sids[num_glyphs - 1].sanitize (c)); + } + + hb_codepoint_t get_sid (hb_codepoint_t glyph) const + { + if (glyph == 0) + return 0; + else + return sids[glyph - 1]; + } + + hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const + { + if (sid == 0) + return 0; + + for (unsigned int glyph = 1; glyph < num_glyphs; glyph++) + { + if (sids[glyph-1] == sid) + return glyph; + } + return 0; + } + + unsigned int get_size (unsigned int num_glyphs) const + { + assert (num_glyphs > 0); + return HBUINT16::static_size * (num_glyphs - 1); + } + + HBUINT16 sids[VAR]; + + DEFINE_SIZE_ARRAY(0, sids); +}; + +template +struct Charset_Range { + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + HBUINT16 first; + TYPE nLeft; + + DEFINE_SIZE_STATIC (HBUINT16::static_size + TYPE::static_size); +}; + +template +struct Charset1_2 { + bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const + { + TRACE_SANITIZE (this); + if (unlikely (!c->check_struct (this))) + return_trace (false); + num_glyphs--; + for (unsigned int i = 0; num_glyphs > 0; i++) + { + if (unlikely (!ranges[i].sanitize (c) || (num_glyphs < ranges[i].nLeft + 1))) + return_trace (false); + num_glyphs -= (ranges[i].nLeft + 1); + } + return_trace (true); + } + + hb_codepoint_t get_sid (hb_codepoint_t glyph) const + { + if (glyph == 0) return 0; + glyph--; + for (unsigned int i = 0;; i++) + { + if (glyph <= ranges[i].nLeft) + return (hb_codepoint_t)ranges[i].first + glyph; + glyph -= (ranges[i].nLeft + 1); + } + + return 0; + } + + hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const + { + if (sid == 0) return 0; + hb_codepoint_t glyph = 1; + for (unsigned int i = 0;; i++) + { + if (glyph >= num_glyphs) + return 0; + if ((ranges[i].first <= sid) && (sid <= ranges[i].first + ranges[i].nLeft)) + return glyph + (sid - ranges[i].first); + glyph += (ranges[i].nLeft + 1); + } + + return 0; + } + + unsigned int get_size (unsigned int num_glyphs) const + { + unsigned int size = HBUINT8::static_size; + int glyph = (int)num_glyphs; + + assert (glyph > 0); + glyph--; + for (unsigned int i = 0; glyph > 0; i++) + { + glyph -= (ranges[i].nLeft + 1); + size += Charset_Range::static_size; + } + + return size; + } + + Charset_Range ranges[VAR]; + + DEFINE_SIZE_ARRAY (0, ranges); +}; + +typedef Charset1_2 Charset1; +typedef Charset1_2 Charset2; +typedef Charset_Range Charset1_Range; +typedef Charset_Range Charset2_Range; + +struct Charset { + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + + if (unlikely (!c->check_struct (this))) + return_trace (false); + if (format == 0) + return_trace (u.format0.sanitize (c, c->get_num_glyphs ())); + else if (format == 1) + return_trace (u.format1.sanitize (c, c->get_num_glyphs ())); + else if (likely (format == 2)) + return_trace (u.format2.sanitize (c, c->get_num_glyphs ())); + else + return_trace (false); + } + + /* serialize a fullset Charset */ + bool serialize (hb_serialize_context_t *c, const Charset &src, unsigned int num_glyphs) + { + TRACE_SERIALIZE (this); + unsigned int size = src.get_size (num_glyphs); + Charset *dest = c->allocate_size (size); + if (unlikely (dest == nullptr)) return_trace (false); + memcpy (dest, &src, size); + return_trace (true); + } + + /* serialize a subset Charset */ + bool serialize (hb_serialize_context_t *c, + uint8_t format, + unsigned int num_glyphs, + const hb_vector_t& sid_ranges) + { + TRACE_SERIALIZE (this); + Charset *dest = c->extend_min (*this); + if (unlikely (dest == nullptr)) return_trace (false); + dest->format.set (format); + if (format == 0) + { + Charset0 *fmt0 = c->allocate_size (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1)); + if (unlikely (fmt0 == nullptr)) return_trace (false); + unsigned int glyph = 0; + for (unsigned int i = 0; i < sid_ranges.length; i++) + { + hb_codepoint_t sid = sid_ranges[i].code; + for (int left = (int)sid_ranges[i].glyph; left >= 0; left--) + fmt0->sids[glyph++].set (sid++); + } + } + else if (format == 1) + { + Charset1 *fmt1 = c->allocate_size (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length); + if (unlikely (fmt1 == nullptr)) return_trace (false); + for (unsigned int i = 0; i < sid_ranges.length; i++) + { + if (unlikely (!(sid_ranges[i].glyph <= 0xFF))) + return_trace (false); + fmt1->ranges[i].first.set (sid_ranges[i].code); + fmt1->ranges[i].nLeft.set (sid_ranges[i].glyph); + } + } + else /* format 2 */ + { + Charset2 *fmt2 = c->allocate_size (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length); + if (unlikely (fmt2 == nullptr)) return_trace (false); + for (unsigned int i = 0; i < sid_ranges.length; i++) + { + if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF))) + return_trace (false); + fmt2->ranges[i].first.set (sid_ranges[i].code); + fmt2->ranges[i].nLeft.set (sid_ranges[i].glyph); + } + } + return_trace (true); + } + + /* parallel to above: calculate the size of a subset Charset */ + static unsigned int calculate_serialized_size ( + uint8_t format, + unsigned int count) + { + unsigned int size = min_size; + if (format == 0) + size += Charset0::min_size + HBUINT16::static_size * (count - 1); + else if (format == 1) + size += Charset1::min_size + Charset1_Range::static_size * count; + else + size += Charset2::min_size + Charset2_Range::static_size * count; + + return size; + } + + unsigned int get_size (unsigned int num_glyphs) const + { + unsigned int size = min_size; + if (format == 0) + size += u.format0.get_size (num_glyphs); + else if (format == 1) + size += u.format1.get_size (num_glyphs); + else + size += u.format2.get_size (num_glyphs); + return size; + } + + hb_codepoint_t get_sid (hb_codepoint_t glyph) const + { + if (format == 0) + return u.format0.get_sid (glyph); + else if (format == 1) + return u.format1.get_sid (glyph); + else + return u.format2.get_sid (glyph); + } + + hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const + { + if (format == 0) + return u.format0.get_glyph (sid, num_glyphs); + else if (format == 1) + return u.format1.get_glyph (sid, num_glyphs); + else + return u.format2.get_glyph (sid, num_glyphs); + } + + HBUINT8 format; + union { + Charset0 format0; + Charset1 format1; + Charset2 format2; + } u; + + DEFINE_SIZE_MIN (1); +}; + +struct CFF1StringIndex : CFF1Index +{ + bool serialize (hb_serialize_context_t *c, const CFF1StringIndex &strings, + unsigned int offSize_, const remap_t &sidmap) + { + TRACE_SERIALIZE (this); + if (unlikely ((strings.count == 0) || (sidmap.get_count () == 0))) + { + if (!unlikely (c->extend_min (this->count))) + return_trace (false); + count.set (0); + return_trace (true); + } + + byte_str_array_t bytesArray; + bytesArray.init (); + if (!bytesArray.resize (sidmap.get_count ())) + return_trace (false); + for (unsigned int i = 0; i < strings.count; i++) + { + hb_codepoint_t j = sidmap[i]; + if (j != CFF_UNDEF_CODE) + bytesArray[j] = strings[i]; + } + + bool result = CFF1Index::serialize (c, offSize_, bytesArray); + bytesArray.fini (); + return_trace (result); + } + + /* in parallel to above */ + unsigned int calculate_serialized_size (unsigned int &offSize /*OUT*/, const remap_t &sidmap) const + { + offSize = 0; + if ((count == 0) || (sidmap.get_count () == 0)) + return count.static_size; + + unsigned int dataSize = 0; + for (unsigned int i = 0; i < count; i++) + if (sidmap[i] != CFF_UNDEF_CODE) + dataSize += length_at (i); + + offSize = calcOffSize(dataSize); + return CFF1Index::calculate_serialized_size (offSize, sidmap.get_count (), dataSize); + } +}; + +struct cff1_top_dict_interp_env_t : num_interp_env_t +{ + cff1_top_dict_interp_env_t () + : num_interp_env_t(), prev_offset(0), last_offset(0) {} + + unsigned int prev_offset; + unsigned int last_offset; +}; + +struct name_dict_values_t +{ + enum name_dict_val_index_t + { + version, + notice, + copyright, + fullName, + familyName, + weight, + postscript, + fontName, + baseFontName, + registry, + ordering, + + ValCount + }; + + void init () + { + for (unsigned int i = 0; i < ValCount; i++) + values[i] = CFF_UNDEF_SID; + } + + unsigned int& operator[] (unsigned int i) + { assert (i < ValCount); return values[i]; } + + unsigned int operator[] (unsigned int i) const + { assert (i < ValCount); return values[i]; } + + static enum name_dict_val_index_t name_op_to_index (op_code_t op) + { + switch (op) { + default: // can't happen - just make some compiler happy + case OpCode_version: + return version; + case OpCode_Notice: + return notice; + case OpCode_Copyright: + return copyright; + case OpCode_FullName: + return fullName; + case OpCode_FamilyName: + return familyName; + case OpCode_Weight: + return weight; + case OpCode_PostScript: + return postscript; + case OpCode_FontName: + return fontName; + case OpCode_BaseFontName: + return baseFontName; + } + } + + unsigned int values[ValCount]; +}; + +struct cff1_top_dict_val_t : op_str_t +{ + unsigned int last_arg_offset; +}; + +struct cff1_top_dict_values_t : top_dict_values_t +{ + void init () + { + top_dict_values_t::init (); + + nameSIDs.init (); + ros_supplement = 0; + cidCount = 8720; + EncodingOffset = 0; + CharsetOffset = 0; + FDSelectOffset = 0; + privateDictInfo.init (); + } + void fini () { top_dict_values_t::fini (); } + + bool is_CID () const + { return nameSIDs[name_dict_values_t::registry] != CFF_UNDEF_SID; } + + name_dict_values_t nameSIDs; + unsigned int ros_supplement_offset; + unsigned int ros_supplement; + unsigned int cidCount; + + unsigned int EncodingOffset; + unsigned int CharsetOffset; + unsigned int FDSelectOffset; + table_info_t privateDictInfo; +}; + +struct cff1_top_dict_opset_t : top_dict_opset_t +{ + static void process_op (op_code_t op, cff1_top_dict_interp_env_t& env, cff1_top_dict_values_t& dictval) + { + cff1_top_dict_val_t val; + val.last_arg_offset = (env.last_offset-1) - dictval.opStart; /* offset to the last argument */ + + switch (op) { + case OpCode_version: + case OpCode_Notice: + case OpCode_Copyright: + case OpCode_FullName: + case OpCode_FamilyName: + case OpCode_Weight: + case OpCode_PostScript: + case OpCode_BaseFontName: + dictval.nameSIDs[name_dict_values_t::name_op_to_index (op)] = env.argStack.pop_uint (); + env.clear_args (); + break; + case OpCode_isFixedPitch: + case OpCode_ItalicAngle: + case OpCode_UnderlinePosition: + case OpCode_UnderlineThickness: + case OpCode_PaintType: + case OpCode_CharstringType: + case OpCode_UniqueID: + case OpCode_StrokeWidth: + case OpCode_SyntheticBase: + case OpCode_CIDFontVersion: + case OpCode_CIDFontRevision: + case OpCode_CIDFontType: + case OpCode_UIDBase: + case OpCode_FontBBox: + case OpCode_XUID: + case OpCode_BaseFontBlend: + env.clear_args (); + break; + + case OpCode_CIDCount: + dictval.cidCount = env.argStack.pop_uint (); + env.clear_args (); + break; + + case OpCode_ROS: + dictval.ros_supplement = env.argStack.pop_uint (); + dictval.nameSIDs[name_dict_values_t::ordering] = env.argStack.pop_uint (); + dictval.nameSIDs[name_dict_values_t::registry] = env.argStack.pop_uint (); + env.clear_args (); + break; + + case OpCode_Encoding: + dictval.EncodingOffset = env.argStack.pop_uint (); + env.clear_args (); + if (unlikely (dictval.EncodingOffset == 0)) return; + break; + + case OpCode_charset: + dictval.CharsetOffset = env.argStack.pop_uint (); + env.clear_args (); + if (unlikely (dictval.CharsetOffset == 0)) return; + break; + + case OpCode_FDSelect: + dictval.FDSelectOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + + case OpCode_Private: + dictval.privateDictInfo.offset = env.argStack.pop_uint (); + dictval.privateDictInfo.size = env.argStack.pop_uint (); + env.clear_args (); + break; + + default: + env.last_offset = env.str_ref.offset; + top_dict_opset_t::process_op (op, env, dictval); + /* Record this operand below if stack is empty, otherwise done */ + if (!env.argStack.is_empty ()) return; + break; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref, val); + } +}; + +struct cff1_font_dict_values_t : dict_values_t +{ + void init () + { + dict_values_t::init (); + privateDictInfo.init (); + fontName = CFF_UNDEF_SID; + } + void fini () { dict_values_t::fini (); } + + table_info_t privateDictInfo; + unsigned int fontName; +}; + +struct cff1_font_dict_opset_t : dict_opset_t +{ + static void process_op (op_code_t op, num_interp_env_t& env, cff1_font_dict_values_t& dictval) + { + switch (op) { + case OpCode_FontName: + dictval.fontName = env.argStack.pop_uint (); + env.clear_args (); + break; + case OpCode_FontMatrix: + case OpCode_PaintType: + env.clear_args (); + break; + case OpCode_Private: + dictval.privateDictInfo.offset = env.argStack.pop_uint (); + dictval.privateDictInfo.size = env.argStack.pop_uint (); + env.clear_args (); + break; + + default: + dict_opset_t::process_op (op, env); + if (!env.argStack.is_empty ()) return; + break; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref); + } +}; + +template +struct cff1_private_dict_values_base_t : dict_values_t +{ + void init () + { + dict_values_t::init (); + subrsOffset = 0; + localSubrs = &Null(CFF1Subrs); + } + void fini () { dict_values_t::fini (); } + + unsigned int calculate_serialized_size () const + { + unsigned int size = 0; + for (unsigned int i = 0; i < dict_values_t::get_count; i++) + if (dict_values_t::get_value (i).op == OpCode_Subrs) + size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs); + else + size += dict_values_t::get_value (i).str.length; + return size; + } + + unsigned int subrsOffset; + const CFF1Subrs *localSubrs; +}; + +typedef cff1_private_dict_values_base_t cff1_private_dict_values_subset_t; +typedef cff1_private_dict_values_base_t cff1_private_dict_values_t; + +struct cff1_private_dict_opset_t : dict_opset_t +{ + static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_t& dictval) + { + num_dict_val_t val; + val.init (); + + switch (op) { + case OpCode_BlueValues: + case OpCode_OtherBlues: + case OpCode_FamilyBlues: + case OpCode_FamilyOtherBlues: + case OpCode_StemSnapH: + case OpCode_StemSnapV: + env.clear_args (); + break; + case OpCode_StdHW: + case OpCode_StdVW: + case OpCode_BlueScale: + case OpCode_BlueShift: + case OpCode_BlueFuzz: + case OpCode_ForceBold: + case OpCode_LanguageGroup: + case OpCode_ExpansionFactor: + case OpCode_initialRandomSeed: + case OpCode_defaultWidthX: + case OpCode_nominalWidthX: + val.single_val = env.argStack.pop_num (); + env.clear_args (); + break; + case OpCode_Subrs: + dictval.subrsOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + + default: + dict_opset_t::process_op (op, env); + if (!env.argStack.is_empty ()) return; + break; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref, val); + } +}; + +struct cff1_private_dict_opset_subset : dict_opset_t +{ + static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_subset_t& dictval) + { + switch (op) { + case OpCode_BlueValues: + case OpCode_OtherBlues: + case OpCode_FamilyBlues: + case OpCode_FamilyOtherBlues: + case OpCode_StemSnapH: + case OpCode_StemSnapV: + case OpCode_StdHW: + case OpCode_StdVW: + case OpCode_BlueScale: + case OpCode_BlueShift: + case OpCode_BlueFuzz: + case OpCode_ForceBold: + case OpCode_LanguageGroup: + case OpCode_ExpansionFactor: + case OpCode_initialRandomSeed: + case OpCode_defaultWidthX: + case OpCode_nominalWidthX: + env.clear_args (); + break; + + case OpCode_Subrs: + dictval.subrsOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + + default: + dict_opset_t::process_op (op, env); + if (!env.argStack.is_empty ()) return; + break; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref); + } +}; + +typedef dict_interpreter_t cff1_top_dict_interpreter_t; +typedef dict_interpreter_t cff1_font_dict_interpreter_t; + +typedef CFF1Index CFF1NameIndex; +typedef CFF1IndexOf CFF1TopDictIndex; + +} /* namespace CFF */ + +namespace OT { + +using namespace CFF; + +struct cff1 +{ + static constexpr hb_tag_t tableTag = HB_OT_TAG_cff1; + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + likely (version.major == 1)); + } + + template + struct accelerator_templ_t + { + void init (hb_face_t *face) + { + topDict.init (); + fontDicts.init (); + privateDicts.init (); + + this->blob = sc.reference_table (face); + + /* setup for run-time santization */ + sc.init (this->blob); + sc.start_processing (); + + const OT::cff1 *cff = this->blob->template as (); + + if (cff == &Null(OT::cff1)) + { fini (); return; } + + nameIndex = &cff->nameIndex (cff); + if ((nameIndex == &Null (CFF1NameIndex)) || !nameIndex->sanitize (&sc)) + { fini (); return; } + + topDictIndex = &StructAtOffset (nameIndex, nameIndex->get_size ()); + if ((topDictIndex == &Null (CFF1TopDictIndex)) || !topDictIndex->sanitize (&sc) || (topDictIndex->count == 0)) + { fini (); return; } + + { /* parse top dict */ + const byte_str_t topDictStr = (*topDictIndex)[0]; + if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; } + cff1_top_dict_interpreter_t top_interp; + top_interp.env.init (topDictStr); + topDict.init (); + if (unlikely (!top_interp.interpret (topDict))) { fini (); return; } + } + + if (is_predef_charset ()) + charset = &Null(Charset); + else + { + charset = &StructAtOffsetOrNull (cff, topDict.CharsetOffset); + if (unlikely ((charset == &Null (Charset)) || !charset->sanitize (&sc))) { fini (); return; } + } + + fdCount = 1; + if (is_CID ()) + { + fdArray = &StructAtOffsetOrNull (cff, topDict.FDArrayOffset); + fdSelect = &StructAtOffsetOrNull (cff, topDict.FDSelectOffset); + if (unlikely ((fdArray == &Null(CFF1FDArray)) || !fdArray->sanitize (&sc) || + (fdSelect == &Null(CFF1FDSelect)) || !fdSelect->sanitize (&sc, fdArray->count))) + { fini (); return; } + + fdCount = fdArray->count; + } + else + { + fdArray = &Null(CFF1FDArray); + fdSelect = &Null(CFF1FDSelect); + } + + stringIndex = &StructAtOffset (topDictIndex, topDictIndex->get_size ()); + if ((stringIndex == &Null (CFF1StringIndex)) || !stringIndex->sanitize (&sc)) + { fini (); return; } + + globalSubrs = &StructAtOffset (stringIndex, stringIndex->get_size ()); + if ((globalSubrs != &Null (CFF1Subrs)) && !globalSubrs->sanitize (&sc)) + { fini (); return; } + + charStrings = &StructAtOffsetOrNull (cff, topDict.charStringsOffset); + + if ((charStrings == &Null(CFF1CharStrings)) || unlikely (!charStrings->sanitize (&sc))) + { fini (); return; } + + num_glyphs = charStrings->count; + if (num_glyphs != sc.get_num_glyphs ()) + { fini (); return; } + + privateDicts.resize (fdCount); + for (unsigned int i = 0; i < fdCount; i++) + privateDicts[i].init (); + + // parse CID font dicts and gather private dicts + if (is_CID ()) + { + for (unsigned int i = 0; i < fdCount; i++) + { + byte_str_t fontDictStr = (*fdArray)[i]; + if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; } + cff1_font_dict_values_t *font; + cff1_font_dict_interpreter_t font_interp; + font_interp.env.init (fontDictStr); + font = fontDicts.push (); + if (unlikely (font == &Crap(cff1_font_dict_values_t))) { fini (); return; } + font->init (); + if (unlikely (!font_interp.interpret (*font))) { fini (); return; } + PRIVDICTVAL *priv = &privateDicts[i]; + const byte_str_t privDictStr (StructAtOffset (cff, font->privateDictInfo.offset), font->privateDictInfo.size); + if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; } + dict_interpreter_t priv_interp; + priv_interp.env.init (privDictStr); + priv->init (); + if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; } + + priv->localSubrs = &StructAtOffsetOrNull (&privDictStr, priv->subrsOffset); + if (priv->localSubrs != &Null(CFF1Subrs) && + unlikely (!priv->localSubrs->sanitize (&sc))) + { fini (); return; } + } + } + else /* non-CID */ + { + cff1_top_dict_values_t *font = &topDict; + PRIVDICTVAL *priv = &privateDicts[0]; + + const byte_str_t privDictStr (StructAtOffset (cff, font->privateDictInfo.offset), font->privateDictInfo.size); + if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; } + dict_interpreter_t priv_interp; + priv_interp.env.init (privDictStr); + priv->init (); + if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; } + + priv->localSubrs = &StructAtOffsetOrNull (&privDictStr, priv->subrsOffset); + if (priv->localSubrs != &Null(CFF1Subrs) && + unlikely (!priv->localSubrs->sanitize (&sc))) + { fini (); return; } + } + } + + void fini () + { + sc.end_processing (); + topDict.fini (); + fontDicts.fini_deep (); + privateDicts.fini_deep (); + hb_blob_destroy (blob); + blob = nullptr; + } + + bool is_valid () const { return blob != nullptr; } + bool is_CID () const { return topDict.is_CID (); } + + bool is_predef_charset () const { return topDict.CharsetOffset <= ExpertSubsetCharset; } + + unsigned int std_code_to_glyph (hb_codepoint_t code) const + { + hb_codepoint_t sid = lookup_standard_encoding_for_sid (code); + if (unlikely (sid == CFF_UNDEF_SID)) + return 0; + + if (charset != &Null(Charset)) + return charset->get_glyph (sid, num_glyphs); + else if ((topDict.CharsetOffset == ISOAdobeCharset) + && (code <= 228 /*zcaron*/)) return sid; + return 0; + } + + protected: + hb_blob_t *blob; + hb_sanitize_context_t sc; + + public: + const Charset *charset; + const CFF1NameIndex *nameIndex; + const CFF1TopDictIndex *topDictIndex; + const CFF1StringIndex *stringIndex; + const CFF1Subrs *globalSubrs; + const CFF1CharStrings *charStrings; + const CFF1FDArray *fdArray; + const CFF1FDSelect *fdSelect; + unsigned int fdCount; + + cff1_top_dict_values_t topDict; + hb_vector_t fontDicts; + hb_vector_t privateDicts; + + unsigned int num_glyphs; + }; + + struct accelerator_t : accelerator_templ_t + { + HB_INTERNAL bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const; + HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const; + }; + + struct accelerator_subset_t : accelerator_templ_t + { + void init (hb_face_t *face) + { + SUPER::init (face); + if (blob == nullptr) return; + + const OT::cff1 *cff = this->blob->as (); + encoding = &Null(Encoding); + if (is_CID ()) + { + if (unlikely (charset == &Null(Charset))) { fini (); return; } + } + else + { + if (!is_predef_encoding ()) + { + encoding = &StructAtOffsetOrNull (cff, topDict.EncodingOffset); + if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) { fini (); return; } + } + } + } + + bool is_predef_encoding () const { return topDict.EncodingOffset <= ExpertEncoding; } + + hb_codepoint_t glyph_to_code (hb_codepoint_t glyph) const + { + if (encoding != &Null(Encoding)) + return encoding->get_code (glyph); + else + { + hb_codepoint_t sid = glyph_to_sid (glyph); + if (sid == 0) return 0; + hb_codepoint_t code = 0; + switch (topDict.EncodingOffset) + { + case StandardEncoding: + code = lookup_standard_encoding_for_code (sid); + break; + case ExpertEncoding: + code = lookup_expert_encoding_for_code (sid); + break; + default: + break; + } + return code; + } + } + + hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph) const + { + if (charset != &Null(Charset)) + return charset->get_sid (glyph); + else + { + hb_codepoint_t sid = 0; + switch (topDict.CharsetOffset) + { + case ISOAdobeCharset: + if (glyph <= 228 /*zcaron*/) sid = glyph; + break; + case ExpertCharset: + sid = lookup_expert_charset_for_sid (glyph); + break; + case ExpertSubsetCharset: + sid = lookup_expert_subset_charset_for_sid (glyph); + break; + default: + break; + } + return sid; + } + } + + const Encoding *encoding; + + private: + typedef accelerator_templ_t SUPER; + }; + + bool subset (hb_subset_plan_t *plan) const + { + hb_blob_t *cff_prime = nullptr; + + bool success = true; + if (hb_subset_cff1 (plan, &cff_prime)) { + success = success && plan->add_table (HB_OT_TAG_cff1, cff_prime); + hb_blob_t *head_blob = hb_sanitize_context_t().reference_table (plan->source); + success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob); + hb_blob_destroy (head_blob); + } else { + success = false; + } + hb_blob_destroy (cff_prime); + + return success; + } + + protected: + HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_code (hb_codepoint_t sid); + HB_INTERNAL static hb_codepoint_t lookup_expert_encoding_for_code (hb_codepoint_t sid); + HB_INTERNAL static hb_codepoint_t lookup_expert_charset_for_sid (hb_codepoint_t glyph); + HB_INTERNAL static hb_codepoint_t lookup_expert_subset_charset_for_sid (hb_codepoint_t glyph); + HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_sid (hb_codepoint_t code); + + public: + FixedVersion version; /* Version of CFF table. set to 0x0100u */ + OffsetTo nameIndex; /* headerSize = Offset to Name INDEX. */ + HBUINT8 offSize; /* offset size (unused?) */ + + public: + DEFINE_SIZE_STATIC (4); +}; + +struct cff1_accelerator_t : cff1::accelerator_t {}; +} /* namespace OT */ + +#endif /* HB_OT_CFF1_TABLE_HH */ diff --git a/src/hb-ot-cff2-table.cc b/src/hb-ot-cff2-table.cc new file mode 100644 index 0000000..7daa536 --- /dev/null +++ b/src/hb-ot-cff2-table.cc @@ -0,0 +1,136 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ + +#include "hb-ot-cff2-table.hh" +#include "hb-cff2-interp-cs.hh" + +using namespace CFF; + +struct extents_param_t +{ + void init () + { + path_open = false; + min_x.set_int (0x7FFFFFFF); + min_y.set_int (0x7FFFFFFF); + max_x.set_int (-0x80000000); + max_y.set_int (-0x80000000); + } + + void start_path () { path_open = true; } + void end_path () { path_open = false; } + bool is_path_open () const { return path_open; } + + void update_bounds (const point_t &pt) + { + if (pt.x < min_x) min_x = pt.x; + if (pt.x > max_x) max_x = pt.x; + if (pt.y < min_y) min_y = pt.y; + if (pt.y > max_y) max_y = pt.y; + } + + bool path_open; + number_t min_x; + number_t min_y; + number_t max_x; + number_t max_y; +}; + +struct cff2_path_procs_extents_t : path_procs_t +{ + static void moveto (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt) + { + param.end_path (); + env.moveto (pt); + } + + static void line (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1) + { + if (!param.is_path_open ()) + { + param.start_path (); + param.update_bounds (env.get_pt ()); + } + env.moveto (pt1); + param.update_bounds (env.get_pt ()); + } + + static void curve (cff2_cs_interp_env_t &env, extents_param_t& param, const point_t &pt1, const point_t &pt2, const point_t &pt3) + { + if (!param.is_path_open ()) + { + param.start_path (); + param.update_bounds (env.get_pt ()); + } + /* include control points */ + param.update_bounds (pt1); + param.update_bounds (pt2); + env.moveto (pt3); + param.update_bounds (env.get_pt ()); + } +}; + +struct cff2_cs_opset_extents_t : cff2_cs_opset_t {}; + +bool OT::cff2::accelerator_t::get_extents (hb_font_t *font, + hb_codepoint_t glyph, + hb_glyph_extents_t *extents) const +{ + if (unlikely (!is_valid () || (glyph >= num_glyphs))) return false; + + unsigned int num_coords; + const int *coords = hb_font_get_var_coords_normalized (font, &num_coords); + unsigned int fd = fdSelect->get_fd (glyph); + cff2_cs_interpreter_t interp; + const byte_str_t str = (*charStrings)[glyph]; + interp.env.init (str, *this, fd, coords, num_coords); + extents_param_t param; + param.init (); + if (unlikely (!interp.interpret (param))) return false; + + if (param.min_x >= param.max_x) + { + extents->width = 0; + extents->x_bearing = 0; + } + else + { + extents->x_bearing = (int32_t)param.min_x.floor (); + extents->width = (int32_t)param.max_x.ceil () - extents->x_bearing; + } + if (param.min_y >= param.max_y) + { + extents->height = 0; + extents->y_bearing = 0; + } + else + { + extents->y_bearing = (int32_t)param.max_y.ceil (); + extents->height = (int32_t)param.min_y.floor () - extents->y_bearing; + } + + return true; +} diff --git a/src/hb-ot-cff2-table.hh b/src/hb-ot-cff2-table.hh new file mode 100644 index 0000000..a7b0ba9 --- /dev/null +++ b/src/hb-ot-cff2-table.hh @@ -0,0 +1,566 @@ +/* + * Copyright © 2018 Adobe 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. + * + * Adobe Author(s): Michiharu Ariza + */ + +#ifndef HB_OT_CFF2_TABLE_HH +#define HB_OT_CFF2_TABLE_HH + +#include "hb-ot-head-table.hh" +#include "hb-ot-cff-common.hh" +#include "hb-subset-cff2.hh" + +namespace CFF { + +/* + * CFF2 -- Compact Font Format (CFF) Version 2 + * https://docs.microsoft.com/en-us/typography/opentype/spec/cff2 + */ +#define HB_OT_TAG_cff2 HB_TAG('C','F','F','2') + +typedef CFFIndex CFF2Index; +template struct CFF2IndexOf : CFFIndexOf {}; + +typedef CFF2Index CFF2CharStrings; +typedef FDArray CFF2FDArray; +typedef Subrs CFF2Subrs; + +typedef FDSelect3_4 FDSelect4; +typedef FDSelect3_4_Range FDSelect4_Range; + +struct CFF2FDSelect +{ + bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const + { + TRACE_SANITIZE (this); + + return_trace (likely (c->check_struct (this) && (format == 0 || format == 3 || format == 4) && + (format == 0)? + u.format0.sanitize (c, fdcount): + ((format == 3)? + u.format3.sanitize (c, fdcount): + u.format4.sanitize (c, fdcount)))); + } + + bool serialize (hb_serialize_context_t *c, const CFF2FDSelect &src, unsigned int num_glyphs) + { + TRACE_SERIALIZE (this); + unsigned int size = src.get_size (num_glyphs); + CFF2FDSelect *dest = c->allocate_size (size); + if (unlikely (dest == nullptr)) return_trace (false); + memcpy (dest, &src, size); + return_trace (true); + } + + unsigned int calculate_serialized_size (unsigned int num_glyphs) const + { return get_size (num_glyphs); } + + unsigned int get_size (unsigned int num_glyphs) const + { + unsigned int size = format.static_size; + if (format == 0) + size += u.format0.get_size (num_glyphs); + else if (format == 3) + size += u.format3.get_size (); + else + size += u.format4.get_size (); + return size; + } + + hb_codepoint_t get_fd (hb_codepoint_t glyph) const + { + if (this == &Null(CFF2FDSelect)) + return 0; + if (format == 0) + return u.format0.get_fd (glyph); + else if (format == 3) + return u.format3.get_fd (glyph); + else + return u.format4.get_fd (glyph); + } + + HBUINT8 format; + union { + FDSelect0 format0; + FDSelect3 format3; + FDSelect4 format4; + } u; + + DEFINE_SIZE_MIN (2); +}; + +struct CFF2VariationStore +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this)) && c->check_range (&varStore, size) && varStore.sanitize (c)); + } + + bool serialize (hb_serialize_context_t *c, const CFF2VariationStore *varStore) + { + TRACE_SERIALIZE (this); + unsigned int size_ = varStore->get_size (); + CFF2VariationStore *dest = c->allocate_size (size_); + if (unlikely (dest == nullptr)) return_trace (false); + memcpy (dest, varStore, size_); + return_trace (true); + } + + unsigned int get_size () const { return HBUINT16::static_size + size; } + + HBUINT16 size; + VariationStore varStore; + + DEFINE_SIZE_MIN (2 + VariationStore::min_size); +}; + +struct cff2_top_dict_values_t : top_dict_values_t<> +{ + void init () + { + top_dict_values_t<>::init (); + vstoreOffset = 0; + FDSelectOffset = 0; + } + void fini () { top_dict_values_t<>::fini (); } + + unsigned int calculate_serialized_size () const + { + unsigned int size = 0; + for (unsigned int i = 0; i < get_count (); i++) + { + op_code_t op = get_value (i).op; + switch (op) + { + case OpCode_vstore: + case OpCode_FDSelect: + size += OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (op); + break; + default: + size += top_dict_values_t<>::calculate_serialized_op_size (get_value (i)); + break; + } + } + return size; + } + + unsigned int vstoreOffset; + unsigned int FDSelectOffset; +}; + +struct cff2_top_dict_opset_t : top_dict_opset_t<> +{ + static void process_op (op_code_t op, num_interp_env_t& env, cff2_top_dict_values_t& dictval) + { + switch (op) { + case OpCode_FontMatrix: + { + dict_val_t val; + val.init (); + dictval.add_op (op, env.str_ref); + env.clear_args (); + } + break; + + case OpCode_vstore: + dictval.vstoreOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + case OpCode_FDSelect: + dictval.FDSelectOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + + default: + SUPER::process_op (op, env, dictval); + /* Record this operand below if stack is empty, otherwise done */ + if (!env.argStack.is_empty ()) return; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref); + } + + typedef top_dict_opset_t<> SUPER; +}; + +struct cff2_font_dict_values_t : dict_values_t +{ + void init () + { + dict_values_t::init (); + privateDictInfo.init (); + } + void fini () { dict_values_t::fini (); } + + table_info_t privateDictInfo; +}; + +struct cff2_font_dict_opset_t : dict_opset_t +{ + static void process_op (op_code_t op, num_interp_env_t& env, cff2_font_dict_values_t& dictval) + { + switch (op) { + case OpCode_Private: + dictval.privateDictInfo.offset = env.argStack.pop_uint (); + dictval.privateDictInfo.size = env.argStack.pop_uint (); + env.clear_args (); + break; + + default: + SUPER::process_op (op, env); + if (!env.argStack.is_empty ()) + return; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref); + } + + private: + typedef dict_opset_t SUPER; +}; + +template +struct cff2_private_dict_values_base_t : dict_values_t +{ + void init () + { + dict_values_t::init (); + subrsOffset = 0; + localSubrs = &Null(CFF2Subrs); + ivs = 0; + } + void fini () { dict_values_t::fini (); } + + unsigned int calculate_serialized_size () const + { + unsigned int size = 0; + for (unsigned int i = 0; i < dict_values_t::get_count; i++) + if (dict_values_t::get_value (i).op == OpCode_Subrs) + size += OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Subrs); + else + size += dict_values_t::get_value (i).str.length; + return size; + } + + unsigned int subrsOffset; + const CFF2Subrs *localSubrs; + unsigned int ivs; +}; + +typedef cff2_private_dict_values_base_t cff2_private_dict_values_subset_t; +typedef cff2_private_dict_values_base_t cff2_private_dict_values_t; + +struct cff2_priv_dict_interp_env_t : num_interp_env_t +{ + void init (const byte_str_t &str) + { + num_interp_env_t::init (str); + ivs = 0; + seen_vsindex = false; + } + + void process_vsindex () + { + if (likely (!seen_vsindex)) + { + set_ivs (argStack.pop_uint ()); + } + seen_vsindex = true; + } + + unsigned int get_ivs () const { return ivs; } + void set_ivs (unsigned int ivs_) { ivs = ivs_; } + + protected: + unsigned int ivs; + bool seen_vsindex; +}; + +struct cff2_private_dict_opset_t : dict_opset_t +{ + static void process_op (op_code_t op, cff2_priv_dict_interp_env_t& env, cff2_private_dict_values_t& dictval) + { + num_dict_val_t val; + val.init (); + + switch (op) { + case OpCode_StdHW: + case OpCode_StdVW: + case OpCode_BlueScale: + case OpCode_BlueShift: + case OpCode_BlueFuzz: + case OpCode_ExpansionFactor: + case OpCode_LanguageGroup: + val.single_val = env.argStack.pop_num (); + env.clear_args (); + break; + case OpCode_BlueValues: + case OpCode_OtherBlues: + case OpCode_FamilyBlues: + case OpCode_FamilyOtherBlues: + case OpCode_StemSnapH: + case OpCode_StemSnapV: + env.clear_args (); + break; + case OpCode_Subrs: + dictval.subrsOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + case OpCode_vsindexdict: + env.process_vsindex (); + dictval.ivs = env.get_ivs (); + env.clear_args (); + break; + case OpCode_blenddict: + break; + + default: + dict_opset_t::process_op (op, env); + if (!env.argStack.is_empty ()) return; + break; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref, val); + } +}; + +struct cff2_private_dict_opset_subset_t : dict_opset_t +{ + static void process_op (op_code_t op, cff2_priv_dict_interp_env_t& env, cff2_private_dict_values_subset_t& dictval) + { + switch (op) { + case OpCode_BlueValues: + case OpCode_OtherBlues: + case OpCode_FamilyBlues: + case OpCode_FamilyOtherBlues: + case OpCode_StdHW: + case OpCode_StdVW: + case OpCode_BlueScale: + case OpCode_BlueShift: + case OpCode_BlueFuzz: + case OpCode_StemSnapH: + case OpCode_StemSnapV: + case OpCode_LanguageGroup: + case OpCode_ExpansionFactor: + env.clear_args (); + break; + + case OpCode_blenddict: + env.clear_args (); + return; + + case OpCode_Subrs: + dictval.subrsOffset = env.argStack.pop_uint (); + env.clear_args (); + break; + + default: + SUPER::process_op (op, env); + if (!env.argStack.is_empty ()) return; + break; + } + + if (unlikely (env.in_error ())) return; + + dictval.add_op (op, env.str_ref); + } + + private: + typedef dict_opset_t SUPER; +}; + +typedef dict_interpreter_t cff2_top_dict_interpreter_t; +typedef dict_interpreter_t cff2_font_dict_interpreter_t; + +} /* namespace CFF */ + +namespace OT { + +using namespace CFF; + +struct cff2 +{ + static constexpr hb_tag_t tableTag = HB_OT_TAG_cff2; + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + likely (version.major == 2)); + } + + template + struct accelerator_templ_t + { + void init (hb_face_t *face) + { + topDict.init (); + fontDicts.init (); + privateDicts.init (); + + this->blob = sc.reference_table (face); + + /* setup for run-time santization */ + sc.init (this->blob); + sc.start_processing (); + + const OT::cff2 *cff2 = this->blob->template as (); + + if (cff2 == &Null(OT::cff2)) + { fini (); return; } + + { /* parse top dict */ + byte_str_t topDictStr (cff2 + cff2->topDict, cff2->topDictSize); + if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; } + cff2_top_dict_interpreter_t top_interp; + top_interp.env.init (topDictStr); + topDict.init (); + if (unlikely (!top_interp.interpret (topDict))) { fini (); return; } + } + + globalSubrs = &StructAtOffset (cff2, cff2->topDict + cff2->topDictSize); + varStore = &StructAtOffsetOrNull (cff2, topDict.vstoreOffset); + charStrings = &StructAtOffsetOrNull (cff2, topDict.charStringsOffset); + fdArray = &StructAtOffsetOrNull (cff2, topDict.FDArrayOffset); + fdSelect = &StructAtOffsetOrNull (cff2, topDict.FDSelectOffset); + + if (((varStore != &Null(CFF2VariationStore)) && unlikely (!varStore->sanitize (&sc))) || + (charStrings == &Null(CFF2CharStrings)) || unlikely (!charStrings->sanitize (&sc)) || + (globalSubrs == &Null(CFF2Subrs)) || unlikely (!globalSubrs->sanitize (&sc)) || + (fdArray == &Null(CFF2FDArray)) || unlikely (!fdArray->sanitize (&sc)) || + (((fdSelect != &Null(CFF2FDSelect)) && unlikely (!fdSelect->sanitize (&sc, fdArray->count))))) + { fini (); return; } + + num_glyphs = charStrings->count; + if (num_glyphs != sc.get_num_glyphs ()) + { fini (); return; } + + fdCount = fdArray->count; + privateDicts.resize (fdCount); + + /* parse font dicts and gather private dicts */ + for (unsigned int i = 0; i < fdCount; i++) + { + const byte_str_t fontDictStr = (*fdArray)[i]; + if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; } + cff2_font_dict_values_t *font; + cff2_font_dict_interpreter_t font_interp; + font_interp.env.init (fontDictStr); + font = fontDicts.push (); + if (unlikely (font == &Crap(cff2_font_dict_values_t))) { fini (); return; } + font->init (); + if (unlikely (!font_interp.interpret (*font))) { fini (); return; } + + const byte_str_t privDictStr (StructAtOffsetOrNull (cff2, font->privateDictInfo.offset), font->privateDictInfo.size); + if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; } + dict_interpreter_t priv_interp; + priv_interp.env.init(privDictStr); + privateDicts[i].init (); + if (unlikely (!priv_interp.interpret (privateDicts[i]))) { fini (); return; } + + privateDicts[i].localSubrs = &StructAtOffsetOrNull (&privDictStr[0], privateDicts[i].subrsOffset); + if (privateDicts[i].localSubrs != &Null(CFF2Subrs) && + unlikely (!privateDicts[i].localSubrs->sanitize (&sc))) + { fini (); return; } + } + } + + void fini () + { + sc.end_processing (); + topDict.fini (); + fontDicts.fini_deep (); + privateDicts.fini_deep (); + hb_blob_destroy (blob); + blob = nullptr; + } + + bool is_valid () const { return blob != nullptr; } + + protected: + hb_blob_t *blob; + hb_sanitize_context_t sc; + + public: + cff2_top_dict_values_t topDict; + const CFF2Subrs *globalSubrs; + const CFF2VariationStore *varStore; + const CFF2CharStrings *charStrings; + const CFF2FDArray *fdArray; + const CFF2FDSelect *fdSelect; + unsigned int fdCount; + + hb_vector_t fontDicts; + hb_vector_t privateDicts; + + unsigned int num_glyphs; + }; + + struct accelerator_t : accelerator_templ_t + { + HB_INTERNAL bool get_extents (hb_font_t *font, + hb_codepoint_t glyph, + hb_glyph_extents_t *extents) const; + }; + + typedef accelerator_templ_t accelerator_subset_t; + + bool subset (hb_subset_plan_t *plan) const + { + hb_blob_t *cff2_prime = nullptr; + + bool success = true; + if (hb_subset_cff2 (plan, &cff2_prime)) { + success = success && plan->add_table (HB_OT_TAG_cff2, cff2_prime); + hb_blob_t *head_blob = hb_sanitize_context_t().reference_table (plan->source); + success = success && head_blob && plan->add_table (HB_OT_TAG_head, head_blob); + hb_blob_destroy (head_blob); + } else { + success = false; + } + hb_blob_destroy (cff2_prime); + + return success; + } + + public: + FixedVersion version; /* Version of CFF2 table. set to 0x0200u */ + NNOffsetTo topDict; /* headerSize = Offset to Top DICT. */ + HBUINT16 topDictSize; /* Top DICT size */ + + public: + DEFINE_SIZE_STATIC (5); +}; + +struct cff2_accelerator_t : cff2::accelerator_t {}; +} /* namespace OT */ + +#endif /* HB_OT_CFF2_TABLE_HH */ diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index c1903f6..0526c35 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -27,9 +27,8 @@ #ifndef HB_OT_CMAP_TABLE_HH #define HB_OT_CMAP_TABLE_HH -#include "hb-open-type-private.hh" -#include "hb-set-private.hh" -#include "hb-subset-plan.hh" +#include "hb-open-type.hh" +#include "hb-set.hh" /* * cmap -- Character to Glyph Index Mapping @@ -37,13 +36,12 @@ */ #define HB_OT_TAG_cmap HB_TAG('c','m','a','p') - namespace OT { struct CmapSubtableFormat0 { - inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const { hb_codepoint_t gid = codepoint < 256 ? glyphIdArray[codepoint] : 0; if (!gid) @@ -51,8 +49,14 @@ struct CmapSubtableFormat0 *glyph = gid; return true; } + void collect_unicodes (hb_set_t *out) const + { + for (unsigned int i = 0; i < 256; i++) + if (glyphIdArray[i]) + out->add (i); + } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); @@ -78,8 +82,8 @@ struct CmapSubtableFormat4 }; bool serialize (hb_serialize_context_t *c, - const hb_subset_plan_t *plan, - const hb_vector_t &segments) + const hb_subset_plan_t *plan, + const hb_vector_t &segments) { TRACE_SERIALIZE (this); @@ -88,92 +92,92 @@ struct CmapSubtableFormat4 this->format.set (4); this->length.set (get_sub_table_size (segments)); - this->segCountX2.set (segments.len * 2); - this->entrySelector.set (MAX (1u, _hb_bit_storage (segments.len)) - 1); + this->segCountX2.set (segments.length * 2); + this->entrySelector.set (MAX (1u, hb_bit_storage (segments.length)) - 1); this->searchRange.set (2 * (1u << this->entrySelector)); - this->rangeShift.set (segments.len * 2 > this->searchRange - ? 2 * segments.len - this->searchRange - : 0); + this->rangeShift.set (segments.length * 2 > this->searchRange + ? 2 * segments.length - this->searchRange + : 0); - HBUINT16 *end_count = c->allocate_size (HBUINT16::static_size * segments.len); + HBUINT16 *end_count = c->allocate_size (HBUINT16::static_size * segments.length); c->allocate_size (HBUINT16::static_size); // 2 bytes of padding. - HBUINT16 *start_count = c->allocate_size (HBUINT16::static_size * segments.len); - HBINT16 *id_delta = c->allocate_size (HBUINT16::static_size * segments.len); - HBUINT16 *id_range_offset = c->allocate_size (HBUINT16::static_size * segments.len); + HBUINT16 *start_count = c->allocate_size (HBUINT16::static_size * segments.length); + HBINT16 *id_delta = c->allocate_size (HBUINT16::static_size * segments.length); + HBUINT16 *id_range_offset = c->allocate_size (HBUINT16::static_size * segments.length); if (id_range_offset == nullptr) return_trace (false); - for (unsigned int i = 0; i < segments.len; i++) + for (unsigned int i = 0; i < segments.length; i++) { end_count[i].set (segments[i].end_code); start_count[i].set (segments[i].start_code); if (segments[i].use_delta) { - hb_codepoint_t cp = segments[i].start_code; - hb_codepoint_t start_gid = 0; - if (unlikely (!plan->new_gid_for_codepoint (cp, &start_gid) && cp != 0xFFFF)) - return_trace (false); - id_delta[i].set (start_gid - segments[i].start_code); + hb_codepoint_t cp = segments[i].start_code; + hb_codepoint_t start_gid = 0; + if (unlikely (!plan->new_gid_for_codepoint (cp, &start_gid) && cp != 0xFFFF)) + return_trace (false); + id_delta[i].set (start_gid - segments[i].start_code); } else { - id_delta[i].set (0); - unsigned int num_codepoints = segments[i].end_code - segments[i].start_code + 1; - HBUINT16 *glyph_id_array = c->allocate_size (HBUINT16::static_size * num_codepoints); - if (glyph_id_array == nullptr) - return_trace (false); - // From the cmap spec: - // - // id_range_offset[i]/2 - // + (cp - segments[i].start_code) - // + (id_range_offset + i) - // = - // glyph_id_array + (cp - segments[i].start_code) - // - // So, solve for id_range_offset[i]: - // - // id_range_offset[i] - // = - // 2 * (glyph_id_array - id_range_offset - i) - id_range_offset[i].set (2 * ( - glyph_id_array - id_range_offset - i)); - for (unsigned int j = 0; j < num_codepoints; j++) - { - hb_codepoint_t cp = segments[i].start_code + j; - hb_codepoint_t new_gid; - if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) - return_trace (false); - glyph_id_array[j].set (new_gid); - } + id_delta[i].set (0); + unsigned int num_codepoints = segments[i].end_code - segments[i].start_code + 1; + HBUINT16 *glyph_id_array = c->allocate_size (HBUINT16::static_size * num_codepoints); + if (glyph_id_array == nullptr) + return_trace (false); + // From the cmap spec: + // + // id_range_offset[i]/2 + // + (cp - segments[i].start_code) + // + (id_range_offset + i) + // = + // glyph_id_array + (cp - segments[i].start_code) + // + // So, solve for id_range_offset[i]: + // + // id_range_offset[i] + // = + // 2 * (glyph_id_array - id_range_offset - i) + id_range_offset[i].set (2 * ( + glyph_id_array - id_range_offset - i)); + for (unsigned int j = 0; j < num_codepoints; j++) + { + hb_codepoint_t cp = segments[i].start_code + j; + hb_codepoint_t new_gid; + if (unlikely (!plan->new_gid_for_codepoint (cp, &new_gid))) + return_trace (false); + glyph_id_array[j].set (new_gid); + } } } return_trace (true); } - static inline size_t get_sub_table_size (const hb_vector_t &segments) + static size_t get_sub_table_size (const hb_vector_t &segments) { size_t segment_size = 0; - for (unsigned int i = 0; i < segments.len; i++) + for (unsigned int i = 0; i < segments.length; i++) { // Parallel array entries segment_size += - 2 // end count - + 2 // start count - + 2 // delta - + 2; // range offset + 2 // end count + + 2 // start count + + 2 // delta + + 2; // range offset if (!segments[i].use_delta) - // Add bytes for the glyph index array entries for this segment. - segment_size += (segments[i].end_code - segments[i].start_code + 1) * 2; + // Add bytes for the glyph index array entries for this segment. + segment_size += (segments[i].end_code - segments[i].start_code + 1) * 2; } return min_size - + 2 // Padding - + segment_size; + + 2 // Padding + + segment_size; } - static inline bool create_sub_table_plan (const hb_subset_plan_t *plan, - hb_vector_t *segments) + static bool create_sub_table_plan (const hb_subset_plan_t *plan, + hb_vector_t *segments) { segment_plan *segment = nullptr; hb_codepoint_t last_gid = 0; @@ -187,24 +191,22 @@ struct CmapSubtableFormat4 return false; } - if (cp > 0xFFFF) { - // We are now outside of unicode BMP, stop adding to this cmap. - break; - } + /* Stop adding to cmap if we are now outside of unicode BMP. */ + if (cp > 0xFFFF) break; - if (!segment - || cp != segment->end_code + 1u) + if (!segment || + cp != segment->end_code + 1u) { - segment = segments->push (); - segment->start_code.set (cp); - segment->end_code.set (cp); - segment->use_delta = true; + segment = segments->push (); + segment->start_code.set (cp); + segment->end_code.set (cp); + segment->use_delta = true; } else { - segment->end_code.set (cp); - if (last_gid + 1u != new_gid) - // gid's are not consecutive in this segment so delta - // cannot be used. - segment->use_delta = false; + segment->end_code.set (cp); + if (last_gid + 1u != new_gid) + // gid's are not consecutive in this segment so delta + // cannot be used. + segment->use_delta = false; } last_gid = new_gid; @@ -224,29 +226,32 @@ struct CmapSubtableFormat4 struct accelerator_t { - inline void init (const CmapSubtableFormat4 *subtable) + accelerator_t () {} + accelerator_t (const CmapSubtableFormat4 *subtable) { init (subtable); } + ~accelerator_t () { fini (); } + + void init (const CmapSubtableFormat4 *subtable) { segCount = subtable->segCountX2 / 2; - endCount = subtable->values; + endCount = subtable->values.arrayZ; startCount = endCount + segCount + 1; idDelta = startCount + segCount; idRangeOffset = idDelta + segCount; glyphIdArray = idRangeOffset + segCount; glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2; } + void fini () {} - static inline bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph) + bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const { - const accelerator_t *thiz = (const accelerator_t *) obj; - /* Custom two-array bsearch. */ - int min = 0, max = (int) thiz->segCount - 1; - const HBUINT16 *startCount = thiz->startCount; - const HBUINT16 *endCount = thiz->endCount; + int min = 0, max = (int) this->segCount - 1; + const HBUINT16 *startCount = this->startCount; + const HBUINT16 *endCount = this->endCount; unsigned int i; while (min <= max) { - int mid = (min + max) / 2; + int mid = ((unsigned int) min + (unsigned int) max) / 2; if (codepoint < startCount[mid]) max = mid - 1; else if (codepoint > endCount[mid]) @@ -261,33 +266,55 @@ struct CmapSubtableFormat4 found: hb_codepoint_t gid; - unsigned int rangeOffset = thiz->idRangeOffset[i]; + unsigned int rangeOffset = this->idRangeOffset[i]; if (rangeOffset == 0) - gid = codepoint + thiz->idDelta[i]; + gid = codepoint + this->idDelta[i]; else { /* Somebody has been smoking... */ - unsigned int index = rangeOffset / 2 + (codepoint - thiz->startCount[i]) + i - thiz->segCount; - if (unlikely (index >= thiz->glyphIdArrayLength)) + unsigned int index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount; + if (unlikely (index >= this->glyphIdArrayLength)) return false; - gid = thiz->glyphIdArray[index]; + gid = this->glyphIdArray[index]; if (unlikely (!gid)) return false; - gid += thiz->idDelta[i]; + gid += this->idDelta[i]; } - - *glyph = gid & 0xFFFFu; + gid &= 0xFFFFu; + if (!gid) + return false; + *glyph = gid; return true; } - - static inline void get_all_codepoints_func (const void *obj, hb_set_t *out) + static bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph) { - const accelerator_t *thiz = (const accelerator_t *) obj; - for (unsigned int i = 0; i < thiz->segCount; i++) + return ((const accelerator_t *) obj)->get_glyph (codepoint, glyph); + } + void collect_unicodes (hb_set_t *out) const + { + unsigned int count = this->segCount; + if (count && this->startCount[count - 1] == 0xFFFFu) + count--; /* Skip sentinel segment. */ + for (unsigned int i = 0; i < count; i++) { - if (thiz->startCount[i] != 0xFFFFu - || thiz->endCount[i] != 0xFFFFu) // Skip the last segment (0xFFFF) - hb_set_add_range (out, thiz->startCount[i], thiz->endCount[i]); + unsigned int rangeOffset = this->idRangeOffset[i]; + if (rangeOffset == 0) + out->add_range (this->startCount[i], this->endCount[i]); + else + { + for (hb_codepoint_t codepoint = this->startCount[i]; + codepoint <= this->endCount[i]; + codepoint++) + { + unsigned int index = rangeOffset / 2 + (codepoint - this->startCount[i]) + i - this->segCount; + if (unlikely (index >= this->glyphIdArrayLength)) + break; + hb_codepoint_t gid = this->glyphIdArray[index]; + if (unlikely (!gid)) + continue; + out->add (codepoint); + } + } } } @@ -300,14 +327,18 @@ struct CmapSubtableFormat4 unsigned int glyphIdArrayLength; }; - inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const { - accelerator_t accel; - accel.init (this); + accelerator_t accel (this); return accel.get_glyph_func (&accel, codepoint, glyph); } + void collect_unicodes (hb_set_t *out) const + { + accelerator_t accel (this); + accel.collect_unicodes (out); + } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); if (unlikely (!c->check_struct (this))) @@ -340,7 +371,8 @@ struct CmapSubtableFormat4 HBUINT16 entrySelector; /* log2(searchRange/2) */ HBUINT16 rangeShift; /* 2 x segCount - searchRange */ - HBUINT16 values[VAR]; + UnsizedArrayOf + values; #if 0 HBUINT16 endCount[segCount]; /* End characterCode for each segment, * last=0xFFFFu. */ @@ -348,7 +380,8 @@ struct CmapSubtableFormat4 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) */ + UnsizedArrayOf + glyphIdArray; /* Glyph index array (arbitrary length) */ #endif public: @@ -370,7 +403,7 @@ struct CmapSubtableLongGroup return 0; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); @@ -380,15 +413,16 @@ struct CmapSubtableLongGroup 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. */ + * subtable format. */ public: DEFINE_SIZE_STATIC (12); }; +DECLARE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup); template struct CmapSubtableTrimmed { - inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const { /* Rely on our implicit array bound-checking. */ hb_codepoint_t gid = glyphIdArray[codepoint - startCharCode]; @@ -397,8 +431,16 @@ struct CmapSubtableTrimmed *glyph = gid; return true; } + void collect_unicodes (hb_set_t *out) const + { + hb_codepoint_t start = startCharCode; + unsigned int count = glyphIdArray.len; + for (unsigned int i = 0; i < count; i++) + if (glyphIdArray[i]) + out->add (start + i); + } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && glyphIdArray.sanitize (c)); @@ -424,37 +466,36 @@ struct CmapSubtableLongSegmented { friend struct cmap; - inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const { - int i = groups.bsearch (codepoint); - if (i == -1) + hb_codepoint_t gid = T::group_get_glyph (groups.bsearch (codepoint), codepoint); + if (!gid) return false; - *glyph = T::group_get_glyph (groups[i], codepoint); + *glyph = gid; return true; } - inline void get_all_codepoints (hb_set_t *out) const + void collect_unicodes (hb_set_t *out) const { for (unsigned int i = 0; i < this->groups.len; i++) { - hb_set_add_range (out, - this->groups[i].startCharCode, - this->groups[i].endCharCode); + out->add_range (this->groups[i].startCharCode, + MIN ((hb_codepoint_t) this->groups[i].endCharCode, + (hb_codepoint_t) HB_UNICODE_MAX)); } } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && groups.sanitize (c)); } - inline bool serialize (hb_serialize_context_t *c, - const hb_vector_t &group_data) + bool serialize (hb_serialize_context_t *c, + const hb_vector_t &group_data) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - Supplier supplier (group_data.arrayZ, group_data.len); - if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false); + if (unlikely (!groups.serialize (c, group_data.as_array ()))) return_trace (false); return true; } @@ -471,13 +512,14 @@ struct CmapSubtableLongSegmented struct CmapSubtableFormat12 : CmapSubtableLongSegmented { - static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group, - hb_codepoint_t u) - { return group.glyphID + (u - group.startCharCode); } + static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group, + hb_codepoint_t u) + { return likely (group.startCharCode <= group.endCharCode) ? + group.glyphID + (u - group.startCharCode) : 0; } bool serialize (hb_serialize_context_t *c, - const hb_vector_t &groups) + const hb_vector_t &groups) { if (unlikely (!c->extend_min (*this))) return false; @@ -488,13 +530,13 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented return CmapSubtableLongSegmented::serialize (c, groups); } - static inline size_t get_sub_table_size (const hb_vector_t &groups) + static size_t get_sub_table_size (const hb_vector_t &groups) { - return 16 + 12 * groups.len; + return 16 + 12 * groups.length; } - static inline bool create_sub_table_plan (const hb_subset_plan_t *plan, - hb_vector_t *groups) + static bool create_sub_table_plan (const hb_subset_plan_t *plan, + hb_vector_t *groups) { CmapSubtableLongGroup *group = nullptr; @@ -509,18 +551,16 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented if (!group || !_is_gid_consecutive (group, cp, new_gid)) { - group = groups->push (); - group->startCharCode.set (cp); - group->endCharCode.set (cp); - group->glyphID.set (new_gid); - } else - { - group->endCharCode.set (cp); + group = groups->push (); + group->startCharCode.set (cp); + group->endCharCode.set (cp); + group->glyphID.set (new_gid); } + else group->endCharCode.set (cp); } DEBUG_MSG(SUBSET, nullptr, "cmap"); - for (unsigned int i = 0; i < groups->len; i++) { + for (unsigned int i = 0; i < groups->length; i++) { CmapSubtableLongGroup& group = (*groups)[i]; DEBUG_MSG(SUBSET, nullptr, " %d: U+%04X-U+%04X, gid %d-%d", i, (uint32_t) group.startCharCode, (uint32_t) group.endCharCode, (uint32_t) group.glyphID, (uint32_t) group.glyphID + ((uint32_t) group.endCharCode - (uint32_t) group.startCharCode)); } @@ -529,9 +569,9 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented } private: - static inline bool _is_gid_consecutive (CmapSubtableLongGroup *group, - hb_codepoint_t cp, - hb_codepoint_t new_gid) + static bool _is_gid_consecutive (CmapSubtableLongGroup *group, + hb_codepoint_t cp, + hb_codepoint_t new_gid) { return (cp - 1 == group->endCharCode) && new_gid == group->glyphID + (cp - group->startCharCode); @@ -541,8 +581,8 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented struct CmapSubtableFormat13 : CmapSubtableLongSegmented { - static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group, - hb_codepoint_t u HB_UNUSED) + static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group, + hb_codepoint_t u HB_UNUSED) { return group.glyphID; } }; @@ -555,36 +595,52 @@ typedef enum struct UnicodeValueRange { - inline int cmp (const hb_codepoint_t &codepoint) const + int cmp (const hb_codepoint_t &codepoint) const { if (codepoint < startUnicodeValue) return -1; if (codepoint > startUnicodeValue + additionalCount) return +1; return 0; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); } HBUINT24 startUnicodeValue; /* First value in this range. */ - HBUINT8 additionalCount; /* Number of additional values in this + HBUINT8 additionalCount; /* Number of additional values in this * range. */ public: DEFINE_SIZE_STATIC (4); }; -typedef SortedArrayOf DefaultUVS; +struct DefaultUVS : SortedArrayOf +{ + void collect_unicodes (hb_set_t *out) const + { + unsigned int count = len; + for (unsigned int i = 0; i < count; i++) + { + hb_codepoint_t first = arrayZ[i].startUnicodeValue; + hb_codepoint_t last = MIN ((hb_codepoint_t) (first + arrayZ[i].additionalCount), + (hb_codepoint_t) HB_UNICODE_MAX); + out->add_range (first, last); + } + } + + public: + DEFINE_SIZE_ARRAY (4, *this); +}; struct UVSMapping { - inline int cmp (const hb_codepoint_t &codepoint) const + int cmp (const hb_codepoint_t &codepoint) const { return unicodeValue.cmp (codepoint); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); @@ -596,35 +652,48 @@ struct UVSMapping DEFINE_SIZE_STATIC (5); }; -typedef SortedArrayOf NonDefaultUVS; +struct NonDefaultUVS : SortedArrayOf +{ + void collect_unicodes (hb_set_t *out) const + { + unsigned int count = len; + for (unsigned int i = 0; i < count; i++) + out->add (arrayZ[i].glyphID); + } + + public: + DEFINE_SIZE_ARRAY (4, *this); +}; struct VariationSelectorRecord { - inline glyph_variant_t get_glyph (hb_codepoint_t codepoint, - hb_codepoint_t *glyph, - const void *base) const + glyph_variant_t get_glyph (hb_codepoint_t codepoint, + hb_codepoint_t *glyph, + const void *base) const { - int i; - const DefaultUVS &defaults = base+defaultUVS; - i = defaults.bsearch (codepoint); - if (i != -1) + if ((base+defaultUVS).bfind (codepoint)) return GLYPH_VARIANT_USE_DEFAULT; - const NonDefaultUVS &nonDefaults = base+nonDefaultUVS; - i = nonDefaults.bsearch (codepoint); - if (i != -1) + const UVSMapping &nonDefault = (base+nonDefaultUVS).bsearch (codepoint); + if (nonDefault.glyphID) { - *glyph = nonDefaults[i].glyphID; + *glyph = nonDefault.glyphID; return GLYPH_VARIANT_FOUND; } return GLYPH_VARIANT_NOT_FOUND; } - inline int cmp (const hb_codepoint_t &variation_selector) const + void collect_unicodes (hb_set_t *out, const void *base) const + { + (base+defaultUVS).collect_unicodes (out); + (base+nonDefaultUVS).collect_unicodes (out); + } + + int cmp (const hb_codepoint_t &variation_selector) const { return varSelector.cmp (variation_selector); } - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && @@ -634,23 +703,35 @@ struct VariationSelectorRecord HBUINT24 varSelector; /* Variation selector. */ LOffsetTo - defaultUVS; /* Offset to Default UVS Table. May be 0. */ + defaultUVS; /* Offset to Default UVS Table. May be 0. */ LOffsetTo - nonDefaultUVS; /* Offset to Non-Default UVS Table. May be 0. */ + nonDefaultUVS; /* Offset to Non-Default UVS Table. May be 0. */ public: DEFINE_SIZE_STATIC (11); }; struct CmapSubtableFormat14 { - inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph) const + glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) const { - return record[record.bsearch(variation_selector)].get_glyph (codepoint, glyph, this); + return record.bsearch (variation_selector).get_glyph (codepoint, glyph, this); } - inline bool sanitize (hb_sanitize_context_t *c) const + void collect_variation_selectors (hb_set_t *out) const + { + unsigned int count = record.len; + for (unsigned int i = 0; i < count; i++) + out->add (record.arrayZ[i].varSelector); + } + void collect_variation_unicodes (hb_codepoint_t variation_selector, + hb_set_t *out) const + { + record.bsearch (variation_selector).collect_unicodes (out, this); + } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && @@ -671,8 +752,8 @@ struct CmapSubtable { /* Note: We intentionally do NOT implement subtable formats 2 and 8. */ - inline bool get_glyph (hb_codepoint_t codepoint, - hb_codepoint_t *glyph) const + bool get_glyph (hb_codepoint_t codepoint, + hb_codepoint_t *glyph) const { switch (u.format) { case 0: return u.format0 .get_glyph (codepoint, glyph); @@ -685,8 +766,21 @@ struct CmapSubtable default: return false; } } + void collect_unicodes (hb_set_t *out) const + { + switch (u.format) { + case 0: u.format0 .collect_unicodes (out); return; + case 4: u.format4 .collect_unicodes (out); return; + case 6: u.format6 .collect_unicodes (out); return; + case 10: u.format10.collect_unicodes (out); return; + case 12: u.format12.collect_unicodes (out); return; + case 13: u.format13.collect_unicodes (out); return; + case 14: + default: return; + } + } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); if (!u.format.sanitize (c)) return_trace (false); @@ -720,7 +814,7 @@ struct CmapSubtable struct EncodingRecord { - inline int cmp (const EncodingRecord &other) const + int cmp (const EncodingRecord &other) const { int ret; ret = platformID.cmp (other.platformID); @@ -730,7 +824,7 @@ struct EncodingRecord return 0; } - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && @@ -747,106 +841,85 @@ struct EncodingRecord struct cmap { - static const hb_tag_t tableTag = HB_OT_TAG_cmap; + static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap; - struct subset_plan { - subset_plan(void) - { - format4_segments.init(); - format12_groups.init(); - } - - ~subset_plan(void) - { - format4_segments.fini(); - format12_groups.fini(); - } - - inline size_t final_size() const + struct subset_plan + { + size_t final_size () const { return 4 // header - + 8 * 3 // 3 EncodingRecord - + CmapSubtableFormat4::get_sub_table_size (this->format4_segments) - + CmapSubtableFormat12::get_sub_table_size (this->format12_groups); + + 8 * 3 // 3 EncodingRecord + + CmapSubtableFormat4::get_sub_table_size (this->format4_segments) + + CmapSubtableFormat12::get_sub_table_size (this->format12_groups); } - // Format 4 hb_vector_t format4_segments; - // Format 12 hb_vector_t format12_groups; }; - inline bool sanitize (hb_sanitize_context_t *c) const + bool _create_plan (const hb_subset_plan_t *plan, + subset_plan *cmap_plan) const { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - likely (version == 0) && - encodingRecord.sanitize (c, this)); - } - - inline bool _create_plan (const hb_subset_plan_t *plan, - subset_plan *cmap_plan) const - { - if (unlikely( !CmapSubtableFormat4::create_sub_table_plan (plan, &cmap_plan->format4_segments))) + if (unlikely (!CmapSubtableFormat4::create_sub_table_plan (plan, &cmap_plan->format4_segments))) return false; return CmapSubtableFormat12::create_sub_table_plan (plan, &cmap_plan->format12_groups); } - inline bool _subset (const hb_subset_plan_t *plan, - const subset_plan &cmap_subset_plan, - size_t dest_sz, - void *dest) const + bool _subset (const hb_subset_plan_t *plan, + const subset_plan &cmap_subset_plan, + size_t dest_sz, + void *dest) const { hb_serialize_context_t c (dest, dest_sz); - OT::cmap *cmap = c.start_serialize (); - if (unlikely (!c.extend_min (*cmap))) + cmap *table = c.start_serialize (); + if (unlikely (!c.extend_min (*table))) { return false; } - cmap->version.set (0); + table->version.set (0); - if (unlikely (!cmap->encodingRecord.serialize (&c, /* numTables */ 3))) + if (unlikely (!table->encodingRecord.serialize (&c, /* numTables */ 3))) return false; // TODO(grieger): Convert the below to a for loop // Format 4, Plat 0 Encoding Record - EncodingRecord &format4_plat0_rec = cmap->encodingRecord[0]; + EncodingRecord &format4_plat0_rec = table->encodingRecord[0]; format4_plat0_rec.platformID.set (0); // Unicode format4_plat0_rec.encodingID.set (3); // Format 4, Plat 3 Encoding Record - EncodingRecord &format4_plat3_rec = cmap->encodingRecord[1]; + EncodingRecord &format4_plat3_rec = table->encodingRecord[1]; format4_plat3_rec.platformID.set (3); // Windows format4_plat3_rec.encodingID.set (1); // Unicode BMP // Format 12 Encoding Record - EncodingRecord &format12_rec = cmap->encodingRecord[2]; + EncodingRecord &format12_rec = table->encodingRecord[2]; format12_rec.platformID.set (3); // Windows format12_rec.encodingID.set (10); // Unicode UCS-4 // Write out format 4 sub table { - CmapSubtable &subtable = format4_plat0_rec.subtable.serialize (&c, cmap); + CmapSubtable &subtable = format4_plat0_rec.subtable.serialize (&c, table); format4_plat3_rec.subtable.set (format4_plat0_rec.subtable); subtable.u.format.set (4); CmapSubtableFormat4 &format4 = subtable.u.format4; if (unlikely (!format4.serialize (&c, plan, cmap_subset_plan.format4_segments))) - return false; + return false; } // Write out format 12 sub table. { - CmapSubtable &subtable = format12_rec.subtable.serialize (&c, cmap); + CmapSubtable &subtable = format12_rec.subtable.serialize (&c, table); subtable.u.format.set (12); CmapSubtableFormat12 &format12 = subtable.u.format12; if (unlikely (!format12.serialize (&c, cmap_subset_plan.format12_groups))) - return false; + return false; } c.end_serialize (); @@ -854,7 +927,7 @@ struct cmap return true; } - inline bool subset (hb_subset_plan_t *plan) const + bool subset (hb_subset_plan_t *plan) const { subset_plan cmap_subset_plan; @@ -865,7 +938,7 @@ struct cmap } // We now know how big our blob needs to be - size_t dest_sz = cmap_subset_plan.final_size(); + size_t dest_sz = cmap_subset_plan.final_size (); void *dest = malloc (dest_sz); if (unlikely (!dest)) { DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for cmap subset output", (unsigned long) dest_sz); @@ -880,147 +953,159 @@ struct cmap } // all done, write the blob into dest - hb_blob_t *cmap_prime = hb_blob_create ((const char *)dest, - dest_sz, - HB_MEMORY_MODE_READONLY, - dest, - free); + hb_blob_t *cmap_prime = hb_blob_create ((const char *) dest, + dest_sz, + HB_MEMORY_MODE_READONLY, + dest, + free); bool result = plan->add_table (HB_OT_TAG_cmap, cmap_prime); hb_blob_destroy (cmap_prime); return result; } - struct accelerator_t + const CmapSubtable *find_best_subtable (bool *symbol = nullptr) const { - inline void init (hb_face_t *face) + if (symbol) *symbol = false; + + const CmapSubtable *subtable; + + /* 32-bit subtables. */ + if ((subtable = this->find_subtable (3, 10))) return subtable; + if ((subtable = this->find_subtable (0, 6))) return subtable; + if ((subtable = this->find_subtable (0, 4))) return subtable; + + /* 16-bit subtables. */ + if ((subtable = this->find_subtable (3, 1))) return subtable; + if ((subtable = this->find_subtable (0, 3))) return subtable; + if ((subtable = this->find_subtable (0, 2))) return subtable; + if ((subtable = this->find_subtable (0, 1))) return subtable; + if ((subtable = this->find_subtable (0, 0))) return subtable; + + /* Symbol subtable. */ + if ((subtable = this->find_subtable (3, 0))) { - this->blob = OT::Sanitizer().sanitize (face->reference_table (HB_OT_TAG_cmap)); - const OT::cmap *cmap = this->blob->as (); - const OT::CmapSubtable *subtable = nullptr; - const OT::CmapSubtableFormat14 *subtable_uvs = nullptr; - - bool symbol = false; - /* 32-bit subtables. */ - if (!subtable) subtable = cmap->find_subtable (3, 10); - if (!subtable) subtable = cmap->find_subtable (0, 6); - if (!subtable) subtable = cmap->find_subtable (0, 4); - /* 16-bit subtables. */ - if (!subtable) subtable = cmap->find_subtable (3, 1); - if (!subtable) subtable = cmap->find_subtable (0, 3); - if (!subtable) subtable = cmap->find_subtable (0, 2); - if (!subtable) subtable = cmap->find_subtable (0, 1); - if (!subtable) subtable = cmap->find_subtable (0, 0); - if (!subtable) - { - subtable = cmap->find_subtable (3, 0); - if (subtable) symbol = true; - } - /* Meh. */ - if (!subtable) subtable = &Null(OT::CmapSubtable); + if (symbol) *symbol = true; + return subtable; + } + + /* Meh. */ + return &Null (CmapSubtable); + } - /* UVS subtable. */ - if (!subtable_uvs) + struct accelerator_t + { + void init (hb_face_t *face) + { + this->table = hb_sanitize_context_t ().reference_table (face); + bool symbol; + this->subtable = table->find_best_subtable (&symbol); + this->subtable_uvs = &Null (CmapSubtableFormat14); { - const OT::CmapSubtable *st = cmap->find_subtable (0, 5); + const CmapSubtable *st = table->find_subtable (0, 5); if (st && st->u.format == 14) subtable_uvs = &st->u.format14; } - /* Meh. */ - if (!subtable_uvs) subtable_uvs = &Null(OT::CmapSubtableFormat14); - - this->uvs_table = subtable_uvs; this->get_glyph_data = subtable; if (unlikely (symbol)) { - this->get_glyph_func = get_glyph_from_symbol; - this->get_all_codepoints_func = null_get_all_codepoints_func; + this->get_glyph_funcZ = get_glyph_from_symbol; } else { switch (subtable->u.format) { /* Accelerate format 4 and format 12. */ default: - this->get_glyph_func = get_glyph_from; - this->get_all_codepoints_func = null_get_all_codepoints_func; + this->get_glyph_funcZ = get_glyph_from; break; case 12: - this->get_glyph_func = get_glyph_from; - this->get_all_codepoints_func = get_all_codepoints_from; + this->get_glyph_funcZ = get_glyph_from; break; case 4: { this->format4_accel.init (&subtable->u.format4); this->get_glyph_data = &this->format4_accel; - this->get_glyph_func = this->format4_accel.get_glyph_func; - this->get_all_codepoints_func = this->format4_accel.get_all_codepoints_func; + this->get_glyph_funcZ = this->format4_accel.get_glyph_func; } break; } } } - inline void fini (void) - { - hb_blob_destroy (this->blob); - } + void fini () { this->table.destroy (); } - inline bool get_nominal_glyph (hb_codepoint_t unicode, + bool get_nominal_glyph (hb_codepoint_t unicode, hb_codepoint_t *glyph) const { - return this->get_glyph_func (this->get_glyph_data, unicode, glyph); + if (unlikely (!this->get_glyph_funcZ)) return false; + return this->get_glyph_funcZ (this->get_glyph_data, unicode, glyph); } + unsigned int get_nominal_glyphs (unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride) const + { + if (unlikely (!this->get_glyph_funcZ)) return 0; - inline bool get_variation_glyph (hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph) const + hb_cmap_get_glyph_func_t get_glyph_funcZ = this->get_glyph_funcZ; + const void *get_glyph_data = this->get_glyph_data; + + unsigned int done; + for (done = 0; + done < count && get_glyph_funcZ (get_glyph_data, *first_unicode, first_glyph); + done++) + { + first_unicode = &StructAtOffsetUnaligned (first_unicode, unicode_stride); + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + } + return done; + } + + bool get_variation_glyph (hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) const { - switch (this->uvs_table->get_glyph_variant (unicode, - variation_selector, - glyph)) + switch (this->subtable_uvs->get_glyph_variant (unicode, + variation_selector, + glyph)) { - case OT::GLYPH_VARIANT_NOT_FOUND: return false; - case OT::GLYPH_VARIANT_FOUND: return true; - case OT::GLYPH_VARIANT_USE_DEFAULT: break; + case GLYPH_VARIANT_NOT_FOUND: return false; + case GLYPH_VARIANT_FOUND: return true; + case GLYPH_VARIANT_USE_DEFAULT: break; } return get_nominal_glyph (unicode, glyph); } - inline void get_all_codepoints (hb_set_t *out) const + void collect_unicodes (hb_set_t *out) const + { + subtable->collect_unicodes (out); + } + void collect_variation_selectors (hb_set_t *out) const + { + subtable_uvs->collect_variation_selectors (out); + } + void collect_variation_unicodes (hb_codepoint_t variation_selector, + hb_set_t *out) const { - this->get_all_codepoints_func (get_glyph_data, out); + subtable_uvs->collect_variation_unicodes (variation_selector, out); } protected: typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph); - typedef void (*hb_cmap_get_all_codepoints_func_t) (const void *obj, - hb_set_t *out); - - static inline void null_get_all_codepoints_func (const void *obj, hb_set_t *out) - { - // NOOP - } template - static inline bool get_glyph_from (const void *obj, - hb_codepoint_t codepoint, - hb_codepoint_t *glyph) + static bool get_glyph_from (const void *obj, + hb_codepoint_t codepoint, + hb_codepoint_t *glyph) { const Type *typed_obj = (const Type *) obj; return typed_obj->get_glyph (codepoint, glyph); } template - static inline void get_all_codepoints_from (const void *obj, - hb_set_t *out) - { - const Type *typed_obj = (const Type *) obj; - typed_obj->get_all_codepoints (out); - } - - template - static inline bool get_glyph_from_symbol (const void *obj, + static bool get_glyph_from_symbol (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph) { @@ -1042,33 +1127,41 @@ struct cmap } private: - hb_cmap_get_glyph_func_t get_glyph_func; + hb_nonnull_ptr_t subtable; + hb_nonnull_ptr_t subtable_uvs; + + hb_cmap_get_glyph_func_t get_glyph_funcZ; const void *get_glyph_data; - hb_cmap_get_all_codepoints_func_t get_all_codepoints_func; - OT::CmapSubtableFormat4::accelerator_t format4_accel; + CmapSubtableFormat4::accelerator_t format4_accel; - const OT::CmapSubtableFormat14 *uvs_table; - hb_blob_t *blob; + hb_blob_ptr_t table; }; protected: - inline const CmapSubtable *find_subtable (unsigned int platform_id, - unsigned int encoding_id) const + const CmapSubtable *find_subtable (unsigned int platform_id, + unsigned int encoding_id) const { EncodingRecord key; key.platformID.set (platform_id); key.encodingID.set (encoding_id); - /* Note: We can use bsearch, but since it has no performance - * implications, we use lsearch and as such accept fonts with - * unsorted subtable list. */ - int result = encodingRecord./*bsearch*/lsearch (key); - if (result == -1 || !encodingRecord[result].subtable) + const EncodingRecord &result = encodingRecord.bsearch (key); + if (!result.subtable) return nullptr; - return &(this+encodingRecord[result].subtable); + return &(this+result.subtable); + } + + public: + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + likely (version == 0) && + encodingRecord.sanitize (c, this)); } protected: @@ -1079,6 +1172,7 @@ struct cmap DEFINE_SIZE_ARRAY (4, encodingRecord); }; +struct cmap_accelerator_t : cmap::accelerator_t {}; } /* namespace OT */ diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh index d1dd9de..333ceaa 100644 --- a/src/hb-ot-color-cbdt-table.hh +++ b/src/hb-ot-color-cbdt-table.hh @@ -27,7 +27,7 @@ #ifndef HB_OT_COLOR_CBDT_TABLE_HH #define HB_OT_COLOR_CBDT_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" /* * CBLC -- Color Bitmap Location @@ -45,18 +45,18 @@ namespace OT { struct SmallGlyphMetrics { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); } - inline void get_extents (hb_glyph_extents_t *extents) const + void get_extents (hb_glyph_extents_t *extents) const { extents->x_bearing = bearingX; extents->y_bearing = bearingY; extents->width = width; - extents->height = -height; + extents->height = - (hb_position_t) height; } HBUINT8 height; @@ -79,7 +79,7 @@ struct BigGlyphMetrics : SmallGlyphMetrics struct SBitLineMetrics { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); @@ -108,7 +108,7 @@ struct SBitLineMetrics struct IndexSubtableHeader { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); @@ -124,11 +124,11 @@ struct IndexSubtableHeader template struct IndexSubtableFormat1Or3 { - inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const + bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - c->check_array (offsetArrayZ, offsetArrayZ[0].static_size, glyph_count + 1)); + offsetArrayZ.sanitize (c, glyph_count + 1)); } bool get_image_data (unsigned int idx, @@ -144,7 +144,8 @@ struct IndexSubtableFormat1Or3 } IndexSubtableHeader header; - Offset offsetArrayZ[VAR]; + UnsizedArrayOf > + offsetArrayZ; public: DEFINE_SIZE_ARRAY(8, offsetArrayZ); }; @@ -154,7 +155,7 @@ struct IndexSubtableFormat3 : IndexSubtableFormat1Or3 {}; struct IndexSubtable { - inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const + bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const { TRACE_SANITIZE (this); if (!u.header.sanitize (c)) return_trace (false); @@ -165,7 +166,7 @@ struct IndexSubtable } } - inline bool get_extents (hb_glyph_extents_t *extents) const + bool get_extents (hb_glyph_extents_t *extents HB_UNUSED) const { switch (u.header.indexFormat) { case 2: case 5: /* TODO */ @@ -200,29 +201,28 @@ struct IndexSubtable struct IndexSubtableRecord { - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && firstGlyphIndex <= lastGlyphIndex && - offsetToSubtable.sanitize (c, this, lastGlyphIndex - firstGlyphIndex + 1)); + offsetToSubtable.sanitize (c, base, lastGlyphIndex - firstGlyphIndex + 1)); } - inline bool get_extents (hb_glyph_extents_t *extents) const + bool get_extents (hb_glyph_extents_t *extents, + const void *base) const { - return (this+offsetToSubtable).get_extents (extents); + return (base+offsetToSubtable).get_extents (extents); } - bool get_image_data (unsigned int gid, + bool get_image_data (unsigned int gid, + const void *base, unsigned int *offset, unsigned int *length, unsigned int *format) const { - if (gid < firstGlyphIndex || gid > lastGlyphIndex) - { - return false; - } - return (this+offsetToSubtable).get_image_data (gid - firstGlyphIndex, + if (gid < firstGlyphIndex || gid > lastGlyphIndex) return false; + return (base+offsetToSubtable).get_image_data (gid - firstGlyphIndex, offset, length, format); } @@ -237,15 +237,10 @@ struct IndexSubtableArray { friend struct CBDT; - inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const + bool sanitize (hb_sanitize_context_t *c, unsigned int count) const { TRACE_SANITIZE (this); - if (unlikely (!c->check_array (&indexSubtablesZ, indexSubtablesZ[0].static_size, count))) - return_trace (false); - for (unsigned int i = 0; i < count; i++) - if (unlikely (!indexSubtablesZ[i].sanitize (c, this))) - return_trace (false); - return_trace (true); + return_trace (indexSubtablesZ.sanitize (c, count, this)); } public: @@ -255,17 +250,14 @@ struct IndexSubtableArray { unsigned int firstGlyphIndex = indexSubtablesZ[i].firstGlyphIndex; unsigned int lastGlyphIndex = indexSubtablesZ[i].lastGlyphIndex; - if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex) { + if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex) return &indexSubtablesZ[i]; - } } return nullptr; } protected: - IndexSubtableRecord indexSubtablesZ[VAR]; - public: - DEFINE_SIZE_ARRAY(0, indexSubtablesZ); + UnsizedArrayOf indexSubtablesZ; }; struct BitmapSizeTable @@ -273,23 +265,25 @@ struct BitmapSizeTable friend struct CBLC; friend struct CBDT; - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) && - c->check_range (&(base+indexSubtableArrayOffset), indexTablesSize) && horizontal.sanitize (c) && vertical.sanitize (c)); } - const IndexSubtableRecord *find_table (hb_codepoint_t glyph, const void *base) const + const IndexSubtableRecord *find_table (hb_codepoint_t glyph, + const void *base, + const void **out_base) const { + *out_base = &(base+indexSubtableArrayOffset); return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables); } protected: - LOffsetTo + LNNOffsetTo indexSubtableArrayOffset; HBUINT32 indexTablesSize; HBUINT32 numberOfIndexSubtables; @@ -338,9 +332,9 @@ struct CBLC { friend struct CBDT; - static const hb_tag_t tableTag = HB_OT_TAG_CBLC; + static constexpr hb_tag_t tableTag = HB_OT_TAG_CBLC; - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && @@ -349,25 +343,30 @@ struct CBLC } protected: - const IndexSubtableRecord *find_table (hb_codepoint_t glyph, - unsigned int *x_ppem, unsigned int *y_ppem) const + const BitmapSizeTable &choose_strike (hb_font_t *font) const { - /* TODO: Make it possible to select strike. */ + unsigned count = sizeTables.len; + if (unlikely (!count)) + return Null(BitmapSizeTable); + + unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem); + if (!requested_ppem) + requested_ppem = 1<<30; /* Choose largest strike. */ + unsigned int best_i = 0; + unsigned int best_ppem = MAX (sizeTables[0].ppemX, sizeTables[0].ppemY); - unsigned int count = sizeTables.len; - for (uint32_t i = 0; i < count; ++i) + for (unsigned int i = 1; i < count; i++) { - unsigned int startGlyphIndex = sizeTables.arrayZ[i].startGlyphIndex; - unsigned int endGlyphIndex = sizeTables.arrayZ[i].endGlyphIndex; - if (startGlyphIndex <= glyph && glyph <= endGlyphIndex) + unsigned int ppem = MAX (sizeTables[i].ppemX, sizeTables[i].ppemY); + if ((requested_ppem <= ppem && ppem < best_ppem) || + (requested_ppem > best_ppem && ppem > best_ppem)) { - *x_ppem = sizeTables[i].ppemX; - *y_ppem = sizeTables[i].ppemY; - return sizeTables[i].find_table (glyph, this); + best_i = i; + best_ppem = ppem; } } - return nullptr; + return sizeTables[best_i]; } protected: @@ -379,60 +378,42 @@ struct CBLC struct CBDT { - static const hb_tag_t tableTag = HB_OT_TAG_CBDT; - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - likely (version.major == 2 || version.major == 3)); - } + static constexpr hb_tag_t tableTag = HB_OT_TAG_CBDT; struct accelerator_t { - inline void init (hb_face_t *face) + void init (hb_face_t *face) { - upem = hb_face_get_upem (face); - - cblc_blob = Sanitizer().sanitize (face->reference_table (HB_OT_TAG_CBLC)); - cbdt_blob = Sanitizer().sanitize (face->reference_table (HB_OT_TAG_CBDT)); - cbdt_len = hb_blob_get_length (cbdt_blob); - - if (hb_blob_get_length (cblc_blob) == 0) { - cblc = nullptr; - cbdt = nullptr; - return; /* Not a bitmap font. */ - } - cblc = cblc_blob->as (); - cbdt = cbdt_blob->as (); + cblc = hb_sanitize_context_t().reference_table (face); + cbdt = hb_sanitize_context_t().reference_table (face); + upem = hb_face_get_upem (face); } - inline void fini (void) + void fini () { - hb_blob_destroy (this->cblc_blob); - hb_blob_destroy (this->cbdt_blob); + this->cblc.destroy (); + this->cbdt.destroy (); } - inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const + bool get_extents (hb_font_t *font, hb_codepoint_t glyph, + hb_glyph_extents_t *extents) const { - unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */ - - if (!cblc) - return false; // Not a color bitmap font. - - const IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem); - if (!subtable_record || !x_ppem || !y_ppem) + const void *base; + const BitmapSizeTable &strike = this->cblc->choose_strike (font); + const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base); + if (!subtable_record || !strike.ppemX || !strike.ppemY) return false; - if (subtable_record->get_extents (extents)) + if (subtable_record->get_extents (extents, base)) return true; unsigned int image_offset = 0, image_length = 0, image_format = 0; - if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format)) + if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format)) return false; { + unsigned int cbdt_len = cbdt.get_length (); if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length)) return false; @@ -441,98 +422,114 @@ struct CBDT case 17: { if (unlikely (image_length < GlyphBitmapDataFormat17::min_size)) return false; - const GlyphBitmapDataFormat17& glyphFormat17 = StructAtOffset (this->cbdt, image_offset); glyphFormat17.glyphMetrics.get_extents (extents); + break; + } + case 18: { + if (unlikely (image_length < GlyphBitmapDataFormat18::min_size)) + return false; + const GlyphBitmapDataFormat18& glyphFormat18 = + StructAtOffset (this->cbdt, image_offset); + glyphFormat18.glyphMetrics.get_extents (extents); + break; } - break; default: // TODO: Support other image formats. return false; } } - /* Convert to the font units. */ - extents->x_bearing *= upem / (float) x_ppem; - extents->y_bearing *= upem / (float) y_ppem; - extents->width *= upem / (float) x_ppem; - extents->height *= upem / (float) y_ppem; + /* Convert to font units. */ + double x_scale = upem / (double) strike.ppemX; + double y_scale = upem / (double) strike.ppemY; + extents->x_bearing = round (extents->x_bearing * x_scale); + extents->y_bearing = round (extents->y_bearing * y_scale); + extents->width = round (extents->width * x_scale); + extents->height = round (extents->height * y_scale); return true; } - inline void dump (void (*callback) (const uint8_t* data, unsigned int length, - unsigned int group, unsigned int gid)) const + hb_blob_t* reference_png (hb_font_t *font, + hb_codepoint_t glyph) const { - if (!cblc) - return; // Not a color bitmap font. + const void *base; + const BitmapSizeTable &strike = this->cblc->choose_strike (font); + const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base); + if (!subtable_record || !strike.ppemX || !strike.ppemY) + return hb_blob_get_empty (); + + unsigned int image_offset = 0, image_length = 0, image_format = 0; + if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format)) + return hb_blob_get_empty (); - for (unsigned int i = 0; i < cblc->sizeTables.len; ++i) { - const BitmapSizeTable &sizeTable = cblc->sizeTables[i]; - const IndexSubtableArray &subtable_array = cblc+sizeTable.indexSubtableArrayOffset; - for (unsigned int j = 0; j < sizeTable.numberOfIndexSubtables; ++j) - { - const IndexSubtableRecord &subtable_record = subtable_array.indexSubtablesZ[j]; - for (unsigned int gid = subtable_record.firstGlyphIndex; - gid <= subtable_record.lastGlyphIndex; ++gid) - { - unsigned int image_offset = 0, image_length = 0, image_format = 0; - - if (!subtable_record.get_image_data (gid, - &image_offset, &image_length, &image_format)) - continue; - - switch (image_format) - { - case 17: { - const GlyphBitmapDataFormat17& glyphFormat17 = - StructAtOffset (this->cbdt, image_offset); - callback ((const uint8_t *) &glyphFormat17.data.arrayZ, - glyphFormat17.data.len, i, gid); - } - break; - case 18: { - const GlyphBitmapDataFormat18& glyphFormat18 = - StructAtOffset (this->cbdt, image_offset); - callback ((const uint8_t *) &glyphFormat18.data.arrayZ, - glyphFormat18.data.len, i, gid); - } - break; - case 19: { - const GlyphBitmapDataFormat19& glyphFormat19 = - StructAtOffset (this->cbdt, image_offset); - callback ((const uint8_t *) &glyphFormat19.data.arrayZ, - glyphFormat19.data.len, i, gid); - } - break; - default: - continue; - } - } - } + unsigned int cbdt_len = cbdt.get_length (); + if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length)) + return hb_blob_get_empty (); + + switch (image_format) + { + case 17: { + if (unlikely (image_length < GlyphBitmapDataFormat17::min_size)) + return hb_blob_get_empty (); + const GlyphBitmapDataFormat17& glyphFormat17 = + StructAtOffset (this->cbdt, image_offset); + return hb_blob_create_sub_blob (cbdt.get_blob (), + image_offset + GlyphBitmapDataFormat17::min_size, + glyphFormat17.data.len); + } + case 18: { + if (unlikely (image_length < GlyphBitmapDataFormat18::min_size)) + return hb_blob_get_empty (); + const GlyphBitmapDataFormat18& glyphFormat18 = + StructAtOffset (this->cbdt, image_offset); + return hb_blob_create_sub_blob (cbdt.get_blob (), + image_offset + GlyphBitmapDataFormat18::min_size, + glyphFormat18.data.len); + } + case 19: { + if (unlikely (image_length < GlyphBitmapDataFormat19::min_size)) + return hb_blob_get_empty (); + const GlyphBitmapDataFormat19& glyphFormat19 = + StructAtOffset (this->cbdt, image_offset); + return hb_blob_create_sub_blob (cbdt.get_blob (), + image_offset + GlyphBitmapDataFormat19::min_size, + glyphFormat19.data.len); + } + } } + + return hb_blob_get_empty (); } + bool has_data () const { return cbdt.get_length (); } + private: - hb_blob_t *cblc_blob; - hb_blob_t *cbdt_blob; - const CBLC *cblc; - const CBDT *cbdt; + hb_blob_ptr_t cblc; + hb_blob_ptr_t cbdt; - unsigned int cbdt_len; unsigned int upem; }; + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + likely (version.major == 2 || version.major == 3)); + } protected: - FixedVersion<> version; - HBUINT8 dataZ[VAR]; + FixedVersion<> version; + UnsizedArrayOf dataZ; public: DEFINE_SIZE_ARRAY(4, dataZ); }; +struct CBDT_accelerator_t : CBDT::accelerator_t {}; + } /* namespace OT */ #endif /* HB_OT_COLOR_CBDT_TABLE_HH */ diff --git a/src/hb-ot-color-colr-table.hh b/src/hb-ot-color-colr-table.hh index ce6702d..a57911a 100644 --- a/src/hb-ot-color-colr-table.hh +++ b/src/hb-ot-color-colr-table.hh @@ -25,7 +25,7 @@ #ifndef HB_OT_COLOR_COLR_TABLE_HH #define HB_OT_COLOR_COLR_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" /* * COLR -- Color @@ -39,101 +39,97 @@ namespace OT { struct LayerRecord { - friend struct COLR; - - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); } - protected: - GlyphID glyphid; /* Glyph ID of layer glyph */ - HBUINT16 colorIdx; /* Index value to use with a selected color palette */ + public: + GlyphID glyphId; /* Glyph ID of layer glyph */ + Index colorIdx; /* Index value to use with a + * selected color palette. + * An index value of 0xFFFF + * is a special case indicating + * that the text foreground + * color (defined by a + * higher-level client) should + * be used and shall not be + * treated as actual index + * into CPAL ColorRecord array. */ public: DEFINE_SIZE_STATIC (4); }; struct BaseGlyphRecord { - friend struct COLR; + int cmp (hb_codepoint_t g) const + { return g < glyphId ? -1 : g > glyphId ? 1 : 0; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this))); } - inline int cmp (hb_codepoint_t g) const { - return g < glyphid ? -1 : g > glyphid ? 1 : 0; - } - - protected: - GlyphID glyphid; /* Glyph ID of reference glyph */ - HBUINT16 firstLayerIdx; /* Index to the layer record */ - HBUINT16 numLayers; /* Number of color layers associated with this glyph */ + public: + GlyphID glyphId; /* Glyph ID of reference glyph */ + HBUINT16 firstLayerIdx; /* Index (from beginning of + * the Layer Records) to the + * layer record. There will be + * numLayers consecutive entries + * for this base glyph. */ + HBUINT16 numLayers; /* Number of color layers + * associated with this glyph */ public: DEFINE_SIZE_STATIC (6); }; -static int compare_bgr (const void *pa, const void *pb) -{ - const hb_codepoint_t *a = (const hb_codepoint_t *) pa; - const BaseGlyphRecord *b = (const BaseGlyphRecord *) pb; - return b->cmp (*a); -} - struct COLR { - static const hb_tag_t tableTag = HB_OT_TAG_COLR; + static constexpr hb_tag_t tableTag = HB_OT_TAG_COLR; - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) && - (this+layersZ).sanitize (c, numLayers))); - } + bool has_data () const { return numBaseGlyphs; } - inline bool get_base_glyph_record (hb_codepoint_t glyph_id, - unsigned int *first_layer /* OUT */, - unsigned int *num_layers /* OUT */) const + unsigned int get_glyph_layers (hb_codepoint_t glyph, + unsigned int start_offset, + unsigned int *count, /* IN/OUT. May be NULL. */ + hb_ot_color_layer_t *layers /* OUT. May be NULL. */) const { - const BaseGlyphRecord* record; - record = (BaseGlyphRecord *) bsearch (&glyph_id, &(this+baseGlyphsZ), numBaseGlyphs, - sizeof (BaseGlyphRecord), compare_bgr); - if (unlikely (!record)) - return false; - - *first_layer = record->firstLayerIdx; - *num_layers = record->numLayers; - return true; - } + const BaseGlyphRecord &record = (this+baseGlyphsZ).bsearch (numBaseGlyphs, glyph); - inline bool get_layer_record (unsigned int record, - hb_codepoint_t *glyph_id /* OUT */, - unsigned int *palette_index /* OUT */) const - { - if (unlikely (record >= numLayers)) + hb_array_t all_layers ((this+layersZ).arrayZ, numLayers); + hb_array_t glyph_layers = all_layers.sub_array (record.firstLayerIdx, + record.numLayers); + if (count) { - *glyph_id = 0; - *palette_index = 0xFFFF; - return false; + hb_array_t segment_layers = glyph_layers.sub_array (start_offset, *count); + *count = segment_layers.length; + for (unsigned int i = 0; i < segment_layers.length; i++) + { + layers[i].glyph = segment_layers.arrayZ[i].glyphId; + layers[i].color_index = segment_layers.arrayZ[i].colorIdx; + } } - const LayerRecord &layer = (this+layersZ)[record]; - *glyph_id = layer.glyphid; - *palette_index = layer.colorIdx; - return true; + return glyph_layers.length; + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) && + (this+layersZ).sanitize (c, numLayers))); } protected: - HBUINT16 version; /* Table version number */ - HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records */ - LOffsetTo > + HBUINT16 version; /* Table version number (starts at 0). */ + HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records. */ + LNNOffsetTo > baseGlyphsZ; /* Offset to Base Glyph records. */ - LOffsetTo > - layersZ; /* Offset to Layer Records */ - HBUINT16 numLayers; /* Number of Layer Records */ + LNNOffsetTo > + layersZ; /* Offset to Layer Records. */ + HBUINT16 numLayers; /* Number of Layer Records. */ public: DEFINE_SIZE_STATIC (14); }; diff --git a/src/hb-ot-color-cpal-table.hh b/src/hb-ot-color-cpal-table.hh index 2c31274..4070493 100644 --- a/src/hb-ot-color-cpal-table.hh +++ b/src/hb-ot-color-cpal-table.hh @@ -28,54 +28,9 @@ #ifndef HB_OT_COLOR_CPAL_TABLE_HH #define HB_OT_COLOR_CPAL_TABLE_HH -#include "hb-open-type-private.hh" - - -/* - * Following parts to be moved to a public header. - */ - -/** - * hb_ot_color_t: - * ARGB data type for holding color values. - * - * Since: REPLACEME - */ -typedef uint32_t hb_ot_color_t; - - -/** - * hb_ot_color_palette_flags_t: - * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special to note about a color palette. - * @HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND: flag indicating that the color palette is suitable for rendering text on light background. - * @HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND: flag indicating that the color palette is suitable for rendering text on dark background. - * - * Since: REPLACEME - */ -typedef enum { /*< flags >*/ - HB_OT_COLOR_PALETTE_FLAG_DEFAULT = 0x00000000u, - HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND = 0x00000001u, - HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND = 0x00000002u, -} hb_ot_color_palette_flags_t; - -// HB_EXTERN unsigned int -// hb_ot_color_get_palette_count (hb_face_t *face); - -// HB_EXTERN unsigned int -// hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette); - -// HB_EXTERN hb_ot_color_palette_flags_t -// hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette); - -// HB_EXTERN unsigned int -// hb_ot_color_get_palette_colors (hb_face_t *face, -// unsigned int palette, /* default=0 */ -// unsigned int start_offset, -// unsigned int *color_count /* IN/OUT */, -// hb_ot_color_t *colors /* OUT */); - - - +#include "hb-open-type.hh" +#include "hb-ot-color.h" +#include "hb-ot-name.h" /* @@ -92,43 +47,57 @@ struct CPALV1Tail { friend struct CPAL; - inline bool - sanitize (hb_sanitize_context_t *c, const void *base, unsigned int palettes) const + private: + hb_ot_color_palette_flags_t get_palette_flags (const void *base, + unsigned int palette_index, + unsigned int palette_count) const { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - (base+paletteFlagsZ).sanitize (c, palettes) && - (base+paletteLabelZ).sanitize (c, palettes) && - (base+paletteEntryLabelZ).sanitize (c, palettes)); + if (!paletteFlagsZ) return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; + return (hb_ot_color_palette_flags_t) (uint32_t) + (base+paletteFlagsZ).as_array (palette_count)[palette_index]; } - private: - inline hb_ot_color_palette_flags_t - get_palette_flags (const void *base, unsigned int palette) const + hb_ot_name_id_t get_palette_name_id (const void *base, + unsigned int palette_index, + unsigned int palette_count) const { - // range checked at the CPAL caller - return (hb_ot_color_palette_flags_t) (uint32_t) (base+paletteFlagsZ)[palette]; + if (!paletteLabelsZ) return HB_OT_NAME_ID_INVALID; + return (base+paletteLabelsZ).as_array (palette_count)[palette_index]; } - inline unsigned int - get_palette_name_id (const void *base, unsigned int palette) const + hb_ot_name_id_t get_color_name_id (const void *base, + unsigned int color_index, + unsigned int color_count) const { - // range checked at the CPAL caller - return (base+paletteLabelZ)[palette]; + if (!colorLabelsZ) return HB_OT_NAME_ID_INVALID; + return (base+colorLabelsZ).as_array (color_count)[color_index]; + } + + public: + bool sanitize (hb_sanitize_context_t *c, + const void *base, + unsigned int palette_count, + unsigned int color_count) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + (!paletteFlagsZ || (base+paletteFlagsZ).sanitize (c, palette_count)) && + (!paletteLabelsZ || (base+paletteLabelsZ).sanitize (c, palette_count)) && + (!colorLabelsZ || (base+colorLabelsZ).sanitize (c, color_count))); } protected: - LOffsetTo > + LNNOffsetTo > paletteFlagsZ; /* Offset from the beginning of CPAL table to * the Palette Type Array. Set to 0 if no array * is provided. */ - LOffsetTo > - paletteLabelZ; /* Offset from the beginning of CPAL table to - * the Palette Labels Array. Set to 0 if no + LNNOffsetTo > + paletteLabelsZ; /* Offset from the beginning of CPAL table to + * the palette labels array. Set to 0 if no * array is provided. */ - LOffsetTo > - paletteEntryLabelZ; /* Offset from the beginning of CPAL table to - * the Palette Entry Label Array. Set to 0 + LNNOffsetTo > + colorLabelsZ; /* Offset from the beginning of CPAL table to + * the color labels array. Set to 0 * if no array is provided. */ public: DEFINE_SIZE_STATIC (12); @@ -138,76 +107,76 @@ typedef HBUINT32 BGRAColor; struct CPAL { - static const hb_tag_t tableTag = HB_OT_TAG_CPAL; + static constexpr hb_tag_t tableTag = HB_OT_TAG_CPAL; - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - if (unlikely (!(c->check_struct (this) && // it checks colorRecordIndices also - // see #get_size - (this+colorRecordsZ).sanitize (c, numColorRecords)))) - return_trace (false); - - // Check for indices sanity so no need for doing it runtime - for (unsigned int i = 0; i < numPalettes; ++i) - if (unlikely (colorRecordIndicesZ[i] + numPaletteEntries > numColorRecords)) - return_trace (false); - - // If version is zero, we are done here; otherwise we need to check tail also - if (version == 0) - return_trace (true); - - const CPALV1Tail &v1 = StructAfter (*this); - return_trace (likely (v1.sanitize (c, this, numPalettes))); - } + bool has_data () const { return numPalettes; } - inline unsigned int get_size (void) const - { - return min_size + numPalettes * sizeof (HBUINT16); - } + unsigned int get_size () const + { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0]); } - inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette) const - { - if (unlikely (version == 0 || palette >= numPalettes)) - return HB_OT_COLOR_PALETTE_FLAG_DEFAULT; + unsigned int get_palette_count () const { return numPalettes; } + unsigned int get_color_count () const { return numColors; } - const CPALV1Tail& cpal1 = StructAfter (*this); - return cpal1.get_palette_flags (this, palette); - } + hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette_index) const + { return v1 ().get_palette_flags (this, palette_index, numPalettes); } - inline unsigned int get_palette_name_id (unsigned int palette) const - { - if (unlikely (version == 0 || palette >= numPalettes)) - return 0xFFFF; + hb_ot_name_id_t get_palette_name_id (unsigned int palette_index) const + { return v1 ().get_palette_name_id (this, palette_index, numPalettes); } - const CPALV1Tail& cpal1 = StructAfter (*this); - return cpal1.get_palette_name_id (this, palette); - } + hb_ot_name_id_t get_color_name_id (unsigned int color_index) const + { return v1 ().get_color_name_id (this, color_index, numColors); } - inline unsigned int get_palette_count () const + unsigned int get_palette_colors (unsigned int palette_index, + unsigned int start_offset, + unsigned int *color_count, /* IN/OUT. May be NULL. */ + hb_color_t *colors /* OUT. May be NULL. */) const { - return numPalettes; + if (unlikely (palette_index >= numPalettes)) + { + if (color_count) *color_count = 0; + return 0; + } + unsigned int start_index = colorRecordIndicesZ[palette_index]; + hb_array_t all_colors ((this+colorRecordsZ).arrayZ, numColorRecords); + hb_array_t palette_colors = all_colors.sub_array (start_index, + numColors); + if (color_count) + { + hb_array_t segment_colors = palette_colors.sub_array (start_offset, *color_count); + /* Always return numColors colors per palette even if it has out-of-bounds start index. */ + unsigned int count = MIN (MAX (numColors - start_offset, 0), *color_count); + *color_count = count; + for (unsigned int i = 0; i < count; i++) + colors[i] = segment_colors[i]; /* Bound-checked read. */ + } + return numColors; } - inline hb_ot_color_t - get_color_record_argb (unsigned int color_index, unsigned int palette) const + private: + const CPALV1Tail& v1 () const { - if (unlikely (color_index >= numPaletteEntries || palette >= numPalettes)) - return 0; + if (version == 0) return Null(CPALV1Tail); + return StructAfter (*this); + } - // No need for more range check as it is already done on #sanitize - const UnsizedArrayOf& color_records = this+colorRecordsZ; - return color_records[colorRecordIndicesZ[palette] + color_index]; + public: + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + (this+colorRecordsZ).sanitize (c, numColorRecords) && + colorRecordIndicesZ.sanitize (c, numPalettes) && + (version == 0 || v1 ().sanitize (c, this, numPalettes, numColors))); } protected: HBUINT16 version; /* Table version number */ /* Version 0 */ - HBUINT16 numPaletteEntries; /* Number of palette entries in each palette. */ + HBUINT16 numColors; /* Number of colors in each palette. */ HBUINT16 numPalettes; /* Number of palettes in the table. */ HBUINT16 numColorRecords; /* Total number of color records, combined for * all palettes. */ - LOffsetTo > + LNNOffsetTo > colorRecordsZ; /* Offset from the beginning of CPAL table to * the first ColorRecord. */ UnsizedArrayOf diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index 09a9517..f6bdbb3 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -25,7 +25,7 @@ #ifndef HB_OT_COLOR_SBIX_TABLE_HH #define HB_OT_COLOR_SBIX_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" /* * sbix -- Standard Bitmap Graphics @@ -62,19 +62,65 @@ struct SBIXGlyph struct SBIXStrike { - friend struct sbix; - - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - imageOffsetsZ.sanitize_shallow (c, c->num_glyphs + 1)); + imageOffsetsZ.sanitize_shallow (c, c->get_num_glyphs () + 1)); } - protected: + hb_blob_t *get_glyph_blob (unsigned int glyph_id, + hb_blob_t *sbix_blob, + hb_tag_t file_type, + int *x_offset, + int *y_offset, + unsigned int num_glyphs, + unsigned int *strike_ppem) const + { + if (unlikely (!ppem)) return hb_blob_get_empty (); /* To get Null() object out of the way. */ + + unsigned int retry_count = 8; + unsigned int sbix_len = sbix_blob->length; + unsigned int strike_offset = (const char *) this - (const char *) sbix_blob->data; + assert (strike_offset < sbix_len); + + retry: + if (unlikely (glyph_id >= num_glyphs || + imageOffsetsZ[glyph_id + 1] <= imageOffsetsZ[glyph_id] || + imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] <= SBIXGlyph::min_size || + (unsigned int) imageOffsetsZ[glyph_id + 1] > sbix_len - strike_offset)) + return hb_blob_get_empty (); + + unsigned int glyph_offset = strike_offset + (unsigned int) imageOffsetsZ[glyph_id] + SBIXGlyph::min_size; + unsigned int glyph_length = imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] - SBIXGlyph::min_size; + + const SBIXGlyph *glyph = &(this+imageOffsetsZ[glyph_id]); + + if (glyph->graphicType == HB_TAG ('d','u','p','e')) + { + if (glyph_length >= 2) + { + glyph_id = *((HBUINT16 *) &glyph->data); + if (retry_count--) + goto retry; + } + return hb_blob_get_empty (); + } + + if (unlikely (file_type != glyph->graphicType)) + return hb_blob_get_empty (); + + if (strike_ppem) *strike_ppem = ppem; + if (x_offset) *x_offset = glyph->xOffset; + if (y_offset) *y_offset = glyph->yOffset; + return hb_blob_create_sub_blob (sbix_blob, glyph_offset, glyph_length); + } + + public: HBUINT16 ppem; /* The PPEM size for which this strike was designed. */ HBUINT16 resolution; /* The device pixel density (in PPI) for which this * strike was designed. (E.g., 96 PPI, 192 PPI.) */ + protected: UnsizedArrayOf > imageOffsetsZ; /* Offset from the beginning of the strike data header * to bitmap data for an individual glyph ID. */ @@ -84,70 +130,157 @@ struct SBIXStrike struct sbix { - static const hb_tag_t tableTag = HB_OT_TAG_sbix; + static constexpr hb_tag_t tableTag = HB_OT_TAG_sbix; - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && strikes.sanitize (c, this))); - } + bool has_data () const { return version; } + + const SBIXStrike &get_strike (unsigned int i) const { return this+strikes[i]; } struct accelerator_t { - inline void init (hb_face_t *face) + void init (hb_face_t *face) { - num_glyphs = hb_face_get_glyph_count (face); + table = hb_sanitize_context_t().reference_table (face); + num_glyphs = face->get_num_glyphs (); + } + void fini () { table.destroy (); } + + bool has_data () const { return table->has_data (); } - OT::Sanitizer sanitizer; - sanitizer.set_num_glyphs (num_glyphs); - sbix_blob = sanitizer.sanitize (face->reference_table (HB_OT_TAG_sbix)); - sbix_len = hb_blob_get_length (sbix_blob); - sbix_table = sbix_blob->as (); + bool get_extents (hb_font_t *font, + hb_codepoint_t glyph, + hb_glyph_extents_t *extents) const + { + /* We only support PNG right now, and following function checks type. */ + return get_png_extents (font, glyph, extents); + } + hb_blob_t *reference_png (hb_font_t *font, + hb_codepoint_t glyph_id, + int *x_offset, + int *y_offset, + unsigned int *available_ppem) const + { + return choose_strike (font).get_glyph_blob (glyph_id, table.get_blob (), + HB_TAG ('p','n','g',' '), + x_offset, y_offset, + num_glyphs, available_ppem); } - inline void fini (void) + private: + + const SBIXStrike &choose_strike (hb_font_t *font) const { - hb_blob_destroy (sbix_blob); + unsigned count = table->strikes.len; + if (unlikely (!count)) + return Null(SBIXStrike); + + unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem); + if (!requested_ppem) + requested_ppem = 1<<30; /* Choose largest strike. */ + /* TODO Add DPI sensitivity as well? */ + unsigned int best_i = 0; + unsigned int best_ppem = table->get_strike (0).ppem; + + for (unsigned int i = 1; i < count; i++) + { + unsigned int ppem = (table->get_strike (i)).ppem; + if ((requested_ppem <= ppem && ppem < best_ppem) || + (requested_ppem > best_ppem && ppem > best_ppem)) + { + best_i = i; + best_ppem = ppem; + } + } + + return table->get_strike (best_i); } - inline void dump (void (*callback) (const uint8_t* data, unsigned int length, - unsigned int group, unsigned int gid)) const + struct PNGHeader { - for (unsigned group = 0; group < sbix_table->strikes.len; ++group) + HBUINT8 signature[8]; + struct { - const SBIXStrike &strike = sbix_table->strikes[group](sbix_table); - for (unsigned int glyph = 0; glyph < num_glyphs; ++glyph) - if (strike.imageOffsetsZ[glyph + 1] - strike.imageOffsetsZ[glyph] > 0) - { - const SBIXGlyph &sbixGlyph = strike.imageOffsetsZ[glyph]((const void *) &strike); - callback ((const uint8_t*) &sbixGlyph.data, - strike.imageOffsetsZ[glyph + 1] - strike.imageOffsetsZ[glyph] - 8, - group, glyph); - } + struct + { + HBUINT32 length; + Tag type; + } header; + HBUINT32 width; + HBUINT32 height; + HBUINT8 bitDepth; + HBUINT8 colorType; + HBUINT8 compressionMethod; + HBUINT8 filterMethod; + HBUINT8 interlaceMethod; + } IHDR; + + public: + DEFINE_SIZE_STATIC (29); + }; + + bool get_png_extents (hb_font_t *font, + hb_codepoint_t glyph, + hb_glyph_extents_t *extents) const + { + /* Following code is safe to call even without data. + * But faster to short-circuit. */ + if (!has_data ()) + return false; + + int x_offset = 0, y_offset = 0; + unsigned int strike_ppem = 0; + hb_blob_t *blob = reference_png (font, glyph, &x_offset, &y_offset, &strike_ppem); + + const PNGHeader &png = *blob->as(); + + extents->x_bearing = x_offset; + extents->y_bearing = y_offset; + extents->width = png.IHDR.width; + extents->height = png.IHDR.height; + + /* Convert to font units. */ + if (strike_ppem) + { + double scale = font->face->get_upem () / (double) strike_ppem; + extents->x_bearing = round (extents->x_bearing * scale); + extents->y_bearing = round (extents->y_bearing * scale); + extents->width = round (extents->width * scale); + extents->height = round (extents->height * scale); } + + hb_blob_destroy (blob); + + return strike_ppem; } private: - hb_blob_t *sbix_blob; - const sbix *sbix_table; + hb_blob_ptr_t table; - unsigned int sbix_len; unsigned int num_glyphs; - }; + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + version >= 1 && + strikes.sanitize (c, this))); + } + protected: HBUINT16 version; /* Table version number — set to 1 */ HBUINT16 flags; /* Bit 0: Set to 1. Bit 1: Draw outlines. * Bits 2 to 15: reserved (set to 0). */ - LArrayOf > + LOffsetLArrayOf strikes; /* Offsets from the beginning of the 'sbix' * table to data for each individual bitmap strike. */ public: DEFINE_SIZE_ARRAY (8, strikes); }; +struct sbix_accelerator_t : sbix::accelerator_t {}; + } /* namespace OT */ #endif /* HB_OT_COLOR_SBIX_TABLE_HH */ diff --git a/src/hb-ot-color-svg-table.hh b/src/hb-ot-color-svg-table.hh index ed6cf97..6e8eddf 100644 --- a/src/hb-ot-color-svg-table.hh +++ b/src/hb-ot-color-svg-table.hh @@ -25,7 +25,7 @@ #ifndef HB_OT_COLOR_SVG_TABLE_HH #define HB_OT_COLOR_SVG_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" /* * SVG -- SVG (Scalable Vector Graphics) @@ -40,13 +40,21 @@ namespace OT { struct SVGDocumentIndexEntry { - friend struct SVG; + int cmp (hb_codepoint_t g) const + { return g < startGlyphID ? -1 : g > endGlyphID ? 1 : 0; } - inline bool sanitize (hb_sanitize_context_t *c, const void* base) const + hb_blob_t *reference_blob (hb_blob_t *svg_blob, unsigned int index_offset) const + { + return hb_blob_create_sub_blob (svg_blob, + index_offset + (unsigned int) svgDoc, + svgDocLength); + } + + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && - (base+svgDoc).sanitize (c, svgDocLength)); + svgDoc.sanitize (c, base, svgDocLength)); } protected: @@ -54,91 +62,62 @@ struct SVGDocumentIndexEntry * this index entry. */ HBUINT16 endGlyphID; /* The last glyph ID in the range described by * this index entry. Must be >= startGlyphID. */ - LOffsetTo > + LNNOffsetTo > svgDoc; /* Offset from the beginning of the SVG Document Index * to an SVG document. Must be non-zero. */ - HBUINT32 svgDocLength; /* Length of the SVG document. + HBUINT32 svgDocLength; /* Length of the SVG document. * Must be non-zero. */ public: DEFINE_SIZE_STATIC (12); }; -struct SVGDocumentIndex -{ - friend struct SVG; - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - entries.sanitize (c, this)); - } - - protected: - ArrayOf - entries; /* Array of SVG Document Index Entries. */ - public: - DEFINE_SIZE_ARRAY (2, entries); -}; - struct SVG { - static const hb_tag_t tableTag = HB_OT_TAG_SVG; + static constexpr hb_tag_t tableTag = HB_OT_TAG_SVG; - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this) && - (this+svgDocIndex).sanitize (c))); - } + bool has_data () const { return svgDocEntries; } struct accelerator_t { - inline void init (hb_face_t *face) - { - OT::Sanitizer sanitizer; - svg_blob = sanitizer.sanitize (face->reference_table (HB_OT_TAG_SVG)); - svg_len = hb_blob_get_length (svg_blob); - svg = svg_blob->as (); - - } + void init (hb_face_t *face) + { table = hb_sanitize_context_t().reference_table (face); } + void fini () { table.destroy (); } - inline void fini (void) + hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id) const { - hb_blob_destroy (svg_blob); + return table->get_glyph_entry (glyph_id).reference_blob (table.get_blob (), + table->svgDocEntries); } - inline void - dump (void (*callback) (const uint8_t* data, unsigned int length, - unsigned int start_glyph, unsigned int end_glyph)) const - { - const SVGDocumentIndex &index = svg+svg->svgDocIndex; - const ArrayOf &entries = index.entries; - for (unsigned int i = 0; i < entries.len; ++i) - { - const SVGDocumentIndexEntry &entry = entries[i]; - callback ((const uint8_t*) &entry.svgDoc (&index), entry.svgDocLength, - entry.startGlyphID, entry.endGlyphID); - } - } + bool has_data () const { return table->has_data (); } private: - hb_blob_t *svg_blob; - const SVG *svg; - - unsigned int svg_len; + hb_blob_ptr_t table; }; + const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const + { return (this+svgDocEntries).bsearch (glyph_id); } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this) && + (this+svgDocEntries).sanitize_shallow (c))); + } + protected: HBUINT16 version; /* Table version (starting at 0). */ - LOffsetTo - svgDocIndex; /* Offset (relative to the start of the SVG table) to the + LOffsetTo > + svgDocEntries; /* Offset (relative to the start of the SVG table) to the * SVG Documents Index. Must be non-zero. */ + /* Array of SVG Document Index Entries. */ HBUINT32 reserved; /* Set to 0. */ public: DEFINE_SIZE_STATIC (10); }; +struct SVG_accelerator_t : SVG::accelerator_t {}; + } /* namespace OT */ diff --git a/src/hb-ot-color.cc b/src/hb-ot-color.cc index 86171c6..791135b 100644 --- a/src/hb-ot-color.cc +++ b/src/hb-ot-color.cc @@ -22,162 +22,278 @@ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * - * Google Author(s): Sascha Brawer + * Google Author(s): Sascha Brawer, Behdad Esfahbod */ -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" +#include "hb-ot-color-cbdt-table.hh" #include "hb-ot-color-colr-table.hh" #include "hb-ot-color-cpal-table.hh" +#include "hb-ot-color-sbix-table.hh" +#include "hb-ot-color-svg-table.hh" +#include "hb-ot-face.hh" #include "hb-ot.h" #include #include -#include "hb-ot-layout-private.hh" -#include "hb-shaper-private.hh" +#include "hb-ot-layout.hh" -#if 0 -HB_MARK_AS_FLAG_T (hb_ot_color_palette_flags_t) -//HB_SHAPER_DATA_ENSURE_DECLARE(ot, face) Hmm? +/** + * SECTION:hb-ot-color + * @title: hb-ot-color + * @short_description: OpenType Color Fonts + * @include: hb-ot.h + * + * Functions for fetching color-font information from OpenType font faces. + **/ + + +/* + * CPAL + */ -static inline const OT::COLR& -_get_colr (hb_face_t *face) -{ - if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::COLR); - hb_ot_layout_t * layout = hb_ot_layout_from_face (face); - return *(layout->colr.get ()); -} -static inline const OT::CPAL& -_get_cpal (hb_face_t *face) +/** + * hb_ot_color_has_palettes: + * @face: a font face. + * + * Returns: whether CPAL table is available. + * + * Since: 2.1.0 + */ +hb_bool_t +hb_ot_color_has_palettes (hb_face_t *face) { - if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::CPAL); - hb_ot_layout_t * layout = hb_ot_layout_from_face (face); - return *(layout->cpal.get ()); + return face->table.CPAL->has_data (); } - /** - * hb_ot_color_get_palette_count: + * hb_ot_color_palette_get_count: * @face: a font face. * * Returns: the number of color palettes in @face, or zero if @face has * no colors. * - * Since: REPLACEME + * Since: 2.1.0 */ unsigned int -hb_ot_color_get_palette_count (hb_face_t *face) +hb_ot_color_palette_get_count (hb_face_t *face) { - const OT::CPAL& cpal = _get_cpal (face); - return cpal.get_palette_count (); + return face->table.CPAL->get_palette_count (); } - /** - * hb_ot_color_get_palette_name_id: - * @face: a font face. - * @palette: the index of the color palette whose name is being requested. + * hb_ot_color_palette_get_name_id: + * @face: a font face. + * @palette_index: the index of the color palette whose name is being requested. * * Retrieves the name id of a color palette. For example, a color font can * have themed palettes like "Spring", "Summer", "Fall", and "Winter". * * Returns: an identifier within @face's `name` table. - * If the requested palette has no name, or if @face has no colors, - * or if @palette is not between 0 and hb_ot_color_get_palette_count(), - * the result is 0xFFFF. The implementation does not check whether - * the returned palette name id is actually in @face's `name` table. + * If the requested palette has no name the result is #HB_OT_NAME_ID_INVALID. * - * Since: REPLACEME + * Since: 2.1.0 */ -unsigned int -hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette) +hb_ot_name_id_t +hb_ot_color_palette_get_name_id (hb_face_t *face, + unsigned int palette_index) { - const OT::CPAL& cpal = _get_cpal (face); - return cpal.get_palette_name_id (palette); + return face->table.CPAL->get_palette_name_id (palette_index); } +/** + * hb_ot_color_palette_color_get_name_id: + * @face: a font face. + * @color_index: palette entry index. + * + * Returns: Name ID associated with a palette entry, e.g. eye color + * + * Since: 2.1.0 + */ +hb_ot_name_id_t +hb_ot_color_palette_color_get_name_id (hb_face_t *face, + unsigned int color_index) +{ + return face->table.CPAL->get_color_name_id (color_index); +} /** - * hb_ot_color_get_palette_flags: - * @face: a font face - * @palette: the index of the color palette whose flags are being requested + * hb_ot_color_palette_get_flags: + * @face: a font face + * @palette_index: the index of the color palette whose flags are being requested * - * Returns: the flags for the requested color palette. If @face has no colors, - * or if @palette is not between 0 and hb_ot_color_get_palette_count(), - * the result is #HB_OT_COLOR_PALETTE_FLAG_DEFAULT. + * Returns: the flags for the requested color palette. * - * Since: REPLACEME + * Since: 2.1.0 */ hb_ot_color_palette_flags_t -hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette) +hb_ot_color_palette_get_flags (hb_face_t *face, + unsigned int palette_index) { - const OT::CPAL& cpal = _get_cpal(face); - return cpal.get_palette_flags (palette); + return face->table.CPAL->get_palette_flags (palette_index); } - /** - * hb_ot_color_get_palette_colors: + * hb_ot_color_palette_get_colors: * @face: a font face. - * @palette: the index of the color palette whose colors + * @palette_index:the index of the color palette whose colors * are being requested. * @start_offset: the index of the first color being requested. * @color_count: (inout) (optional): on input, how many colors * can be maximally stored into the @colors array; * on output, how many colors were actually stored. - * @colors: (array length=color_count) (optional): - * an array of #hb_ot_color_t records. After calling + * @colors: (array length=color_count) (out) (optional): + * an array of #hb_color_t records. After calling * this function, @colors will be filled with * the palette colors. If @colors is NULL, the function * will just return the number of total colors * without storing any actual colors; this can be used * for allocating a buffer of suitable size before calling - * hb_ot_color_get_palette_colors() a second time. + * hb_ot_color_palette_get_colors() a second time. * * Retrieves the colors in a color palette. * - * Returns: the total number of colors in the palette. All palettes in - * a font have the same number of colors. If @face has no colors, or if - * @palette is not between 0 and hb_ot_color_get_palette_count(), - * the result is zero. + * Returns: the total number of colors in the palette. + * + * Since: 2.1.0 + */ +unsigned int +hb_ot_color_palette_get_colors (hb_face_t *face, + unsigned int palette_index, + unsigned int start_offset, + unsigned int *colors_count /* IN/OUT. May be NULL. */, + hb_color_t *colors /* OUT. May be NULL. */) +{ + return face->table.CPAL->get_palette_colors (palette_index, start_offset, colors_count, colors); +} + + +/* + * COLR + */ + +/** + * hb_ot_color_has_layers: + * @face: a font face. + * + * Returns: whether COLR table is available. + * + * Since: 2.1.0 + */ +hb_bool_t +hb_ot_color_has_layers (hb_face_t *face) +{ + return face->table.COLR->has_data (); +} + +/** + * hb_ot_color_glyph_get_layers: + * @face: a font face. + * @glyph: a layered color glyph id. + * @start_offset: starting offset of layers. + * @count: (inout) (optional): gets number of layers available to be written on buffer + * and returns number of written layers. + * @layers: (array length=count) (out) (optional): layers buffer to buffer. + * + * Returns: Total number of layers a layered color glyph have. * - * Since: REPLACEME + * Since: 2.1.0 */ unsigned int -hb_ot_color_get_palette_colors (hb_face_t *face, - unsigned int palette, /* default=0 */ - unsigned int start_offset, - unsigned int *color_count /* IN/OUT */, - hb_ot_color_t *colors /* OUT */) +hb_ot_color_glyph_get_layers (hb_face_t *face, + hb_codepoint_t glyph, + unsigned int start_offset, + unsigned int *count, /* IN/OUT. May be NULL. */ + hb_ot_color_layer_t *layers /* OUT. May be NULL. */) { - const OT::CPAL& cpal = _get_cpal(face); - if (unlikely (palette >= cpal.numPalettes)) - { - if (color_count) *color_count = 0; - return 0; - } - - const OT::ColorRecord* crec = &cpal.offsetFirstColorRecord (&cpal); - crec += cpal.colorRecordIndices[palette]; - - unsigned int num_results = 0; - if (likely (color_count && colors)) - { - for (unsigned int i = start_offset; - i < cpal.numPaletteEntries && num_results < *color_count; ++i) - { - hb_ot_color_t* result = &colors[num_results]; - result->red = crec[i].red; - result->green = crec[i].green; - result->blue = crec[i].blue; - result->alpha = crec[i].alpha; - ++num_results; - } - } - - if (likely (color_count)) *color_count = num_results; - return cpal.numPaletteEntries; + return face->table.COLR->get_glyph_layers (glyph, start_offset, count, layers); +} + + +/* + * SVG + */ + +/** + * hb_ot_color_has_svg: + * @face: a font face. + * + * Check whether @face has SVG glyph images. + * + * Returns true if available, false otherwise. + * + * Since: 2.1.0 + */ +hb_bool_t +hb_ot_color_has_svg (hb_face_t *face) +{ + return face->table.SVG->has_data (); +} + +/** + * hb_ot_color_glyph_reference_svg: + * @face: a font face. + * @glyph: a svg glyph index. + * + * Get SVG document for a glyph. The blob may be either plain text or gzip-encoded. + * + * Returns: (transfer full): respective svg blob of the glyph, if available. + * + * Since: 2.1.0 + */ +hb_blob_t * +hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph) +{ + return face->table.SVG->reference_blob_for_glyph (glyph); +} + + +/* + * PNG: CBDT or sbix + */ + +/** + * hb_ot_color_has_png: + * @face: a font face. + * + * Check whether @face has PNG glyph images (either CBDT or sbix tables). + * + * Returns true if available, false otherwise. + * + * Since: 2.1.0 + */ +hb_bool_t +hb_ot_color_has_png (hb_face_t *face) +{ + return face->table.CBDT->has_data () || face->table.sbix->has_data (); +} + +/** + * hb_ot_color_glyph_reference_png: + * @font: a font object, not face. upem should be set on + * that font object if one wants to get optimal png blob, otherwise + * return the biggest one + * @glyph: a glyph index. + * + * Get PNG image for a glyph. + * + * Returns: (transfer full): respective PNG blob of the glyph, if available. + * + * Since: 2.1.0 + */ +hb_blob_t * +hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph) +{ + hb_blob_t *blob = hb_blob_get_empty (); + + if (font->face->table.sbix->has_data ()) + blob = font->face->table.sbix->reference_png (font, glyph, nullptr, nullptr, nullptr); + + if (!blob->length && font->face->table.CBDT->has_data ()) + blob = font->face->table.CBDT->reference_png (font, glyph); + + return blob; } -#endif diff --git a/src/hb-ot-color.h b/src/hb-ot-color.h new file mode 100644 index 0000000..49646bf --- /dev/null +++ b/src/hb-ot-color.h @@ -0,0 +1,139 @@ +/* + * Copyright © 2016 Google, Inc. + * Copyright © 2018 Khaled Hosny + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Sascha Brawer, Behdad Esfahbod + */ + +#ifndef HB_OT_H_IN +#error "Include instead." +#endif + +#ifndef HB_OT_COLOR_H +#define HB_OT_COLOR_H + +#include "hb.h" +#include "hb-ot-name.h" + +HB_BEGIN_DECLS + + +/* + * Color palettes. + */ + +HB_EXTERN hb_bool_t +hb_ot_color_has_palettes (hb_face_t *face); + +HB_EXTERN unsigned int +hb_ot_color_palette_get_count (hb_face_t *face); + +HB_EXTERN hb_ot_name_id_t +hb_ot_color_palette_get_name_id (hb_face_t *face, + unsigned int palette_index); + +HB_EXTERN hb_ot_name_id_t +hb_ot_color_palette_color_get_name_id (hb_face_t *face, + unsigned int color_index); + +/** + * hb_ot_color_palette_flags_t: + * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special + * to note about a color palette. + * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: flag indicating that the color + * palette is appropriate to use when displaying the font on a light background such as white. + * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: flag indicating that the color + * palette is appropriate to use when displaying the font on a dark background such as black. + * + * Since: 2.1.0 + */ +typedef enum { /*< flags >*/ + HB_OT_COLOR_PALETTE_FLAG_DEFAULT = 0x00000000u, + HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND = 0x00000001u, + HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND = 0x00000002u +} hb_ot_color_palette_flags_t; + +HB_EXTERN hb_ot_color_palette_flags_t +hb_ot_color_palette_get_flags (hb_face_t *face, + unsigned int palette_index); + +HB_EXTERN unsigned int +hb_ot_color_palette_get_colors (hb_face_t *face, + unsigned int palette_index, + unsigned int start_offset, + unsigned int *color_count, /* IN/OUT. May be NULL. */ + hb_color_t *colors /* OUT. May be NULL. */); + + +/* + * Color layers. + */ + +HB_EXTERN hb_bool_t +hb_ot_color_has_layers (hb_face_t *face); + +/** + * hb_ot_color_layer_t: + * + * Pairs of glyph and color index. + * + * Since: 2.1.0 + **/ +typedef struct hb_ot_color_layer_t +{ + hb_codepoint_t glyph; + unsigned int color_index; +} hb_ot_color_layer_t; + +HB_EXTERN unsigned int +hb_ot_color_glyph_get_layers (hb_face_t *face, + hb_codepoint_t glyph, + unsigned int start_offset, + unsigned int *count, /* IN/OUT. May be NULL. */ + hb_ot_color_layer_t *layers /* OUT. May be NULL. */); + +/* + * SVG + */ + +HB_EXTERN hb_bool_t +hb_ot_color_has_svg (hb_face_t *face); + +HB_EXTERN hb_blob_t * +hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph); + +/* + * PNG: CBDT or sbix + */ + +HB_EXTERN hb_bool_t +hb_ot_color_has_png (hb_face_t *face); + +HB_EXTERN hb_blob_t * +hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph); + + +HB_END_DECLS + +#endif /* HB_OT_COLOR_H */ diff --git a/src/hb-ot-deprecated.h b/src/hb-ot-deprecated.h new file mode 100644 index 0000000..bce51b7 --- /dev/null +++ b/src/hb-ot-deprecated.h @@ -0,0 +1,107 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_H_IN +#error "Include instead." +#endif + +#ifndef HB_OT_DEPRECATED_H +#define HB_OT_DEPRECATED_H + +#include "hb.h" +#include "hb-ot-name.h" + + +HB_BEGIN_DECLS + +#ifndef HB_DISABLE_DEPRECATED + + +/* Like hb_ot_layout_table_find_script, but takes zero-terminated array of scripts to test */ +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_table_select_script) hb_bool_t +hb_ot_layout_table_choose_script (hb_face_t *face, + hb_tag_t table_tag, + const hb_tag_t *script_tags, + unsigned int *script_index, + hb_tag_t *chosen_script); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_layout_script_select_language) hb_bool_t +hb_ot_layout_script_find_language (hb_face_t *face, + hb_tag_t table_tag, + unsigned int script_index, + hb_tag_t language_tag, + unsigned int *language_index); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) void +hb_ot_tags_from_script (hb_script_t script, + hb_tag_t *script_tag_1, + hb_tag_t *script_tag_2); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_tags_from_script_and_language) hb_tag_t +hb_ot_tag_from_language (hb_language_t language); + + +/** + * HB_OT_VAR_NO_AXIS_INDEX: + * + * Since: 1.4.2 + * Deprecated: 2.2.0 + */ +#define HB_OT_VAR_NO_AXIS_INDEX 0xFFFFFFFFu + +/** + * hb_ot_var_axis_t: + * + * Since: 1.4.2 + * Deprecated: 2.2.0 + */ +typedef struct hb_ot_var_axis_t +{ + hb_tag_t tag; + hb_ot_name_id_t name_id; + float min_value; + float default_value; + float max_value; +} hb_ot_var_axis_t; + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int +hb_ot_var_get_axes (hb_face_t *face, + unsigned int start_offset, + unsigned int *axes_count /* IN/OUT */, + hb_ot_var_axis_t *axes_array /* OUT */); + +HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t +hb_ot_var_find_axis (hb_face_t *face, + hb_tag_t axis_tag, + unsigned int *axis_index, + hb_ot_var_axis_t *axis_info); + + +#endif + +HB_END_DECLS + +#endif /* HB_OT_DEPRECATED_H */ diff --git a/src/hb-ot-face.cc b/src/hb-ot-face.cc new file mode 100644 index 0000000..9b17526 --- /dev/null +++ b/src/hb-ot-face.cc @@ -0,0 +1,61 @@ +/* + * Copyright © 2018 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "hb-ot-face.hh" + +#include "hb-ot-cmap-table.hh" +#include "hb-ot-glyf-table.hh" +#include "hb-ot-cff1-table.hh" +#include "hb-ot-cff2-table.hh" +#include "hb-ot-hmtx-table.hh" +#include "hb-ot-kern-table.hh" +#include "hb-ot-name-table.hh" +#include "hb-ot-post-table.hh" +#include "hb-ot-color-cbdt-table.hh" +#include "hb-ot-color-sbix-table.hh" +#include "hb-ot-color-svg-table.hh" +#include "hb-ot-layout-gdef-table.hh" +#include "hb-ot-layout-gsub-table.hh" +#include "hb-ot-layout-gpos-table.hh" + + +void hb_ot_face_t::init0 (hb_face_t *face) +{ + this->face = face; +#define HB_OT_TABLE(Namespace, Type) Type.init0 (); +#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) + HB_OT_TABLES +#undef HB_OT_ACCELERATOR +#undef HB_OT_TABLE +} +void hb_ot_face_t::fini () +{ +#define HB_OT_TABLE(Namespace, Type) Type.fini (); +#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) + HB_OT_TABLES +#undef HB_OT_ACCELERATOR +#undef HB_OT_TABLE +} diff --git a/src/hb-ot-face.hh b/src/hb-ot-face.hh new file mode 100644 index 0000000..7f47ba6 --- /dev/null +++ b/src/hb-ot-face.hh @@ -0,0 +1,120 @@ +/* + * Copyright © 2007,2008,2009 Red Hat, Inc. + * Copyright © 2012,2013 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Red Hat Author(s): Behdad Esfahbod + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_FACE_HH +#define HB_OT_FACE_HH + +#include "hb.hh" + +#include "hb-machinery.hh" + + +/* + * hb_ot_face_t + */ + +#define HB_OT_TABLES \ + /* OpenType fundamentals. */ \ + HB_OT_TABLE(OT, head) \ + HB_OT_ACCELERATOR(OT, cmap) \ + HB_OT_ACCELERATOR(OT, hmtx) \ + HB_OT_ACCELERATOR(OT, vmtx) \ + HB_OT_ACCELERATOR(OT, post) \ + HB_OT_TABLE(OT, kern) \ + HB_OT_ACCELERATOR(OT, glyf) \ + HB_OT_ACCELERATOR(OT, cff1) \ + HB_OT_ACCELERATOR(OT, cff2) \ + HB_OT_TABLE(OT, VORG) \ + HB_OT_ACCELERATOR(OT, name) \ + HB_OT_TABLE(OT, OS2) \ + HB_OT_TABLE(OT, STAT) \ + /* OpenType shaping. */ \ + HB_OT_ACCELERATOR(OT, GDEF) \ + HB_OT_ACCELERATOR(OT, GSUB) \ + HB_OT_ACCELERATOR(OT, GPOS) \ + HB_OT_TABLE(OT, BASE) \ + HB_OT_TABLE(OT, JSTF) \ + /* AAT shaping. */ \ + HB_OT_TABLE(AAT, mort) \ + HB_OT_TABLE(AAT, morx) \ + HB_OT_TABLE(AAT, kerx) \ + HB_OT_TABLE(AAT, ankr) \ + HB_OT_TABLE(AAT, trak) \ + HB_OT_TABLE(AAT, lcar) \ + HB_OT_TABLE(AAT, ltag) \ + HB_OT_TABLE(AAT, feat) \ + /* OpenType variations. */ \ + HB_OT_TABLE(OT, fvar) \ + HB_OT_TABLE(OT, avar) \ + HB_OT_TABLE(OT, MVAR) \ + /* OpenType math. */ \ + HB_OT_TABLE(OT, MATH) \ + /* OpenType color fonts. */ \ + HB_OT_TABLE(OT, COLR) \ + HB_OT_TABLE(OT, CPAL) \ + HB_OT_ACCELERATOR(OT, CBDT) \ + HB_OT_ACCELERATOR(OT, sbix) \ + HB_OT_ACCELERATOR(OT, SVG) \ + /* */ + +/* Declare tables. */ +#define HB_OT_TABLE(Namespace, Type) namespace Namespace { struct Type; } +#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type##_accelerator_t) +HB_OT_TABLES +#undef HB_OT_ACCELERATOR +#undef HB_OT_TABLE + +struct hb_ot_face_t +{ + HB_INTERNAL void init0 (hb_face_t *face); + HB_INTERNAL void fini (); + +#define HB_OT_TABLE_ORDER(Namespace, Type) \ + HB_PASTE (ORDER_, HB_PASTE (Namespace, HB_PASTE (_, Type))) + enum order_t + { + ORDER_ZERO, +#define HB_OT_TABLE(Namespace, Type) HB_OT_TABLE_ORDER (Namespace, Type), +#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type) + HB_OT_TABLES +#undef HB_OT_ACCELERATOR +#undef HB_OT_TABLE + }; + + hb_face_t *face; /* MUST be JUST before the lazy loaders. */ +#define HB_OT_TABLE(Namespace, Type) \ + hb_table_lazy_loader_t Type; +#define HB_OT_ACCELERATOR(Namespace, Type) \ + hb_face_lazy_loader_t Type; + HB_OT_TABLES +#undef HB_OT_ACCELERATOR +#undef HB_OT_TABLE +}; + + +#endif /* HB_OT_FACE_HH */ diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 8310230..20b09df 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -24,67 +24,38 @@ * Google Author(s): Behdad Esfahbod, Roozbeh Pournader */ -#include "hb-private.hh" +#include "hb.hh" #include "hb-ot.h" -#include "hb-font-private.hh" +#include "hb-font.hh" +#include "hb-machinery.hh" +#include "hb-ot-face.hh" #include "hb-ot-cmap-table.hh" #include "hb-ot-glyf-table.hh" +#include "hb-ot-cff1-table.hh" +#include "hb-ot-cff2-table.hh" #include "hb-ot-hmtx-table.hh" #include "hb-ot-kern-table.hh" +#include "hb-ot-os2-table.hh" #include "hb-ot-post-table.hh" - +#include "hb-ot-stat-table.hh" // Just so we compile it; unused otherwise. +#include "hb-ot-vorg-table.hh" #include "hb-ot-color-cbdt-table.hh" +#include "hb-ot-color-sbix-table.hh" -struct hb_ot_font_t -{ - OT::cmap::accelerator_t cmap; - OT::hmtx::accelerator_t h_metrics; - OT::vmtx::accelerator_t v_metrics; - OT::hb_lazy_loader_t glyf; - OT::hb_lazy_loader_t cbdt; - OT::hb_lazy_loader_t post; - OT::hb_lazy_loader_t kern; -}; - - -static hb_ot_font_t * -_hb_ot_font_create (hb_face_t *face) -{ - hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t)); - - if (unlikely (!ot_font)) - return nullptr; - - ot_font->cmap.init (face); - ot_font->h_metrics.init (face); - ot_font->v_metrics.init (face, ot_font->h_metrics.ascender - ot_font->h_metrics.descender); /* TODO Can we do this lazily? */ - ot_font->glyf.init (face); - ot_font->cbdt.init (face); - ot_font->post.init (face); - ot_font->kern.init (face); - - return ot_font; -} - -static void -_hb_ot_font_destroy (void *data) -{ - hb_ot_font_t *ot_font = (hb_ot_font_t *) data; - - ot_font->cmap.fini (); - ot_font->h_metrics.fini (); - ot_font->v_metrics.fini (); - ot_font->glyf.fini (); - ot_font->cbdt.fini (); - ot_font->post.fini (); - ot_font->kern.fini (); - - free (ot_font); -} +/** + * SECTION:hb-ot-font + * @title: hb-ot-font + * @short_description: OpenType font implementation + * @include: hb-ot.h + * + * Functions for using OpenType fonts with hb_shape(). Not that fonts returned + * by hb_font_create() default to using these functions, so most clients would + * never need to call these functions directly. + **/ static hb_bool_t @@ -93,10 +64,25 @@ hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED, hb_codepoint_t unicode, hb_codepoint_t *glyph, void *user_data HB_UNUSED) +{ + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + return ot_face->cmap->get_nominal_glyph (unicode, glyph); +} +static unsigned int +hb_ot_get_nominal_glyphs (hb_font_t *font HB_UNUSED, + void *font_data, + unsigned int count, + const hb_codepoint_t *first_unicode, + unsigned int unicode_stride, + hb_codepoint_t *first_glyph, + unsigned int glyph_stride, + void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return ot_font->cmap.get_nominal_glyph (unicode, glyph); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + return ot_face->cmap->get_nominal_glyphs (count, + first_unicode, unicode_stride, + first_glyph, glyph_stride); } static hb_bool_t @@ -107,39 +93,83 @@ hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return ot_font->cmap.get_variation_glyph (unicode, variation_selector, glyph); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + return ot_face->cmap->get_variation_glyph (unicode, variation_selector, glyph); } -static hb_position_t -hb_ot_get_glyph_h_advance (hb_font_t *font, - void *font_data, - hb_codepoint_t glyph, - void *user_data HB_UNUSED) +static void +hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, + unsigned count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride, + void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return font->em_scale_x (ot_font->h_metrics.get_advance (glyph, font)); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + const OT::hmtx_accelerator_t &hmtx = *ot_face->hmtx; + + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->em_scale_x (hmtx.get_advance (*first_glyph, font)); + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); + } } -static hb_position_t -hb_ot_get_glyph_v_advance (hb_font_t *font, - void *font_data, - hb_codepoint_t glyph, - void *user_data HB_UNUSED) +static void +hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data, + unsigned count, + const hb_codepoint_t *first_glyph, + unsigned glyph_stride, + hb_position_t *first_advance, + unsigned advance_stride, + void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return font->em_scale_y (-(int) ot_font->v_metrics.get_advance (glyph, font)); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx; + + for (unsigned int i = 0; i < count; i++) + { + *first_advance = font->em_scale_y (-(int) vmtx.get_advance (*first_glyph, font)); + first_glyph = &StructAtOffsetUnaligned (first_glyph, glyph_stride); + first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); + } } -static hb_position_t -hb_ot_get_glyph_h_kerning (hb_font_t *font, - void *font_data, - hb_codepoint_t left_glyph, - hb_codepoint_t right_glyph, - void *user_data HB_UNUSED) +static hb_bool_t +hb_ot_get_glyph_v_origin (hb_font_t *font, + void *font_data, + hb_codepoint_t glyph, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return font->em_scale_x (ot_font->kern->get_h_kerning (left_glyph, right_glyph)); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + + *x = font->get_glyph_h_advance (glyph) / 2; + + const OT::VORG &VORG = *ot_face->VORG; + if (VORG.has_data ()) + { + *y = font->em_scale_y (VORG.get_y_origin (glyph)); + return true; + } + + hb_glyph_extents_t extents = {0}; + if (ot_face->glyf->get_extents (glyph, &extents)) + { + const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx; + hb_position_t tsb = vmtx.get_side_bearing (glyph); + *y = font->em_scale_y (extents.y_bearing + tsb); + return true; + } + + hb_font_extents_t font_extents; + font->get_h_extents_with_fallback (&font_extents); + *y = font_extents.ascender; + + return true; } static hb_bool_t @@ -149,10 +179,16 @@ hb_ot_get_glyph_extents (hb_font_t *font, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - bool ret = ot_font->glyf->get_extents (glyph, extents); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + bool ret = ot_face->sbix->get_extents (font, glyph, extents); + if (!ret) + ret = ot_face->glyf->get_extents (glyph, extents); + if (!ret) + ret = ot_face->cff1->get_extents (glyph, extents); + if (!ret) + ret = ot_face->cff2->get_extents (font, glyph, extents); if (!ret) - ret = ot_font->cbdt->get_extents (glyph, extents); + ret = ot_face->CBDT->get_extents (font, glyph, extents); // TODO Hook up side-bearings variations. extents->x_bearing = font->em_scale_x (extents->x_bearing); extents->y_bearing = font->em_scale_y (extents->y_bearing); @@ -168,8 +204,8 @@ hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED, char *name, unsigned int size, void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return ot_font->post->get_glyph_name (glyph, name, size); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + return ot_face->post->get_glyph_name (glyph, name, size); } static hb_bool_t @@ -179,8 +215,8 @@ hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED, hb_codepoint_t *glyph, void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return ot_font->post->get_glyph_from_name (name, len, glyph); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + return ot_face->post->get_glyph_from_name (name, len, glyph); } static hb_bool_t @@ -189,12 +225,13 @@ hb_ot_get_font_h_extents (hb_font_t *font, hb_font_extents_t *metrics, void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender); - metrics->descender = font->em_scale_y (ot_font->h_metrics.descender); - metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + const OT::hmtx_accelerator_t &hmtx = *ot_face->hmtx; + metrics->ascender = font->em_scale_y (hmtx.ascender); + metrics->descender = font->em_scale_y (hmtx.descender); + metrics->line_gap = font->em_scale_y (hmtx.line_gap); // TODO Hook up variations. - return ot_font->h_metrics.has_font_extents; + return hmtx.has_font_extents; } static hb_bool_t @@ -203,49 +240,34 @@ hb_ot_get_font_v_extents (hb_font_t *font, hb_font_extents_t *metrics, void *user_data HB_UNUSED) { - const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender); - metrics->descender = font->em_scale_x (ot_font->v_metrics.descender); - metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap); + const hb_ot_face_t *ot_face = (const hb_ot_face_t *) font_data; + const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx; + metrics->ascender = font->em_scale_x (vmtx.ascender); + metrics->descender = font->em_scale_x (vmtx.descender); + metrics->line_gap = font->em_scale_x (vmtx.line_gap); // TODO Hook up variations. - return ot_font->v_metrics.has_font_extents; + return vmtx.has_font_extents; } -static hb_font_funcs_t *static_ot_funcs = nullptr; - -#ifdef HB_USE_ATEXIT -static -void free_static_ot_funcs (void) -{ -retry: - hb_font_funcs_t *ot_funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs); - if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, ot_funcs, nullptr)) - goto retry; - - hb_font_funcs_destroy (ot_funcs); -} +#if HB_USE_ATEXIT +static void free_static_ot_funcs (); #endif -static hb_font_funcs_t * -_hb_ot_get_font_funcs (void) +static struct hb_ot_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t { -retry: - hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs); - - if (unlikely (!funcs)) + static hb_font_funcs_t *create () { - funcs = hb_font_funcs_create (); + hb_font_funcs_t *funcs = hb_font_funcs_create (); hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr); hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr); hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, nullptr, nullptr); + hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ot_get_nominal_glyphs, nullptr, nullptr); hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, nullptr, nullptr); - hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, nullptr, nullptr); - hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, nullptr, nullptr); + hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ot_get_glyph_h_advances, nullptr, nullptr); + hb_font_funcs_set_glyph_v_advances_func (funcs, hb_ot_get_glyph_v_advances, nullptr, nullptr); //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, nullptr, nullptr); - //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr); - hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, nullptr, nullptr); - //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, nullptr, nullptr); + hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr); hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, nullptr, nullptr); //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, nullptr, nullptr); hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, nullptr, nullptr); @@ -253,17 +275,26 @@ retry: hb_font_funcs_make_immutable (funcs); - if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, nullptr, funcs)) { - hb_font_funcs_destroy (funcs); - goto retry; - } +#if HB_USE_ATEXIT + atexit (free_static_ot_funcs); +#endif -#ifdef HB_USE_ATEXIT - atexit (free_static_ot_funcs); /* First person registers atexit() callback. */ + return funcs; + } +} static_ot_funcs; + +#if HB_USE_ATEXIT +static +void free_static_ot_funcs () +{ + static_ot_funcs.free_instance (); +} #endif - }; - return funcs; +static hb_font_funcs_t * +_hb_ot_get_font_funcs () +{ + return static_ot_funcs.get_unconst (); } @@ -275,12 +306,8 @@ retry: void hb_ot_font_set_funcs (hb_font_t *font) { - hb_ot_font_t *ot_font = _hb_ot_font_create (font->face); - if (unlikely (!ot_font)) - return; - hb_font_set_funcs (font, _hb_ot_get_font_funcs (), - ot_font, - _hb_ot_font_destroy); + &font->face->table, + nullptr); } diff --git a/src/hb-ot-gasp-table.hh b/src/hb-ot-gasp-table.hh new file mode 100644 index 0000000..94fff58 --- /dev/null +++ b/src/hb-ot-gasp-table.hh @@ -0,0 +1,84 @@ +/* + * Copyright © 2018 Ebrahim Byagowi + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_OT_GASP_TABLE_HH +#define HB_OT_GASP_TABLE_HH + +#include "hb-open-type.hh" +#include "hb-ot-hhea-table.hh" +#include "hb-ot-os2-table.hh" +#include "hb-ot-var-hvar-table.hh" + +/* + * gasp -- Grid-fitting and Scan-conversion Procedure + * https://docs.microsoft.com/en-us/typography/opentype/spec/gasp + */ +#define HB_OT_TAG_gasp HB_TAG('g','a','s','p') + + +namespace OT { + +struct GaspRange +{ + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + public: + HBUINT16 rangeMaxPPEM; /* Upper limit of range, in PPEM */ + HBUINT16 rangeGaspBehavior; + /* Flags describing desired rasterizer behavior. */ + public: + DEFINE_SIZE_STATIC (4); +}; + +struct gasp +{ + static constexpr hb_tag_t tableTag = HB_OT_TAG_gasp; + + const GaspRange &get_gasp_range (unsigned int i) const + { return gaspRanges[i]; } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && + gaspRanges.sanitize (c)); + } + + protected: + HBUINT16 version; /* Version number (set to 1) */ + ArrayOf + gaspRanges; /* Number of records to follow + * Sorted by ppem */ + public: + DEFINE_SIZE_ARRAY (4, gaspRanges); +}; + +} /* namespace OT */ + + +#endif /* HB_OT_GASP_TABLE_HH */ diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 89c867d..c2b38b0 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -27,11 +27,9 @@ #ifndef HB_OT_GLYF_TABLE_HH #define HB_OT_GLYF_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" #include "hb-ot-head-table.hh" #include "hb-subset-glyf.hh" -#include "hb-subset-plan.hh" -#include "hb-subset-private.hh" namespace OT { @@ -47,17 +45,20 @@ struct loca { friend struct glyf; - static const hb_tag_t tableTag = HB_OT_TAG_loca; + static constexpr hb_tag_t tableTag = HB_OT_TAG_loca; - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const { TRACE_SANITIZE (this); return_trace (true); } protected: - HBUINT8 dataZ[VAR]; /* Location data. */ - DEFINE_SIZE_ARRAY (0, dataZ); + UnsizedArrayOf dataZ; /* Location data. */ + public: + DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always + * check the size externally, allow Null() object of it by + * defining it MIN() instead. */ }; @@ -70,9 +71,9 @@ struct loca struct glyf { - static const hb_tag_t tableTag = HB_OT_TAG_glyf; + static constexpr hb_tag_t tableTag = HB_OT_TAG_glyf; - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const { TRACE_SANITIZE (this); /* We don't check for anything specific here. The users of the @@ -80,7 +81,7 @@ struct glyf return_trace (true); } - inline bool subset (hb_subset_plan_t *plan) const + bool subset (hb_subset_plan_t *plan) const { hb_blob_t *glyf_prime = nullptr; hb_blob_t *loca_prime = nullptr; @@ -103,14 +104,14 @@ struct glyf static bool _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) { - hb_blob_t *head_blob = OT::Sanitizer().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_head)); + hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table (plan->source); hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob); hb_blob_destroy (head_blob); if (unlikely (!head_prime_blob)) return false; - OT::head *head_prime = (OT::head *) hb_blob_get_data_writable (head_prime_blob, nullptr); + head *head_prime = (head *) hb_blob_get_data_writable (head_prime_blob, nullptr); head_prime->indexToLocFormat.set (use_short_loca ? 0 : 1); bool success = plan->add_table (HB_OT_TAG_head, head_prime_blob); @@ -121,9 +122,9 @@ struct glyf struct GlyphHeader { HBINT16 numberOfContours; /* If the number of contours is - * greater than or equal to zero, - * this is a simple glyph; if negative, - * this is a composite glyph. */ + * greater than or equal to zero, + * this is a simple glyph; if negative, + * this is a composite glyph. */ FWORD xMin; /* Minimum x for coordinate data. */ FWORD yMin; /* Minimum y for coordinate data. */ FWORD xMax; /* Maximum x for coordinate data. */ @@ -150,28 +151,23 @@ struct glyf }; HBUINT16 flags; - HBUINT16 glyphIndex; + GlyphID glyphIndex; - inline unsigned int get_size (void) const + unsigned int get_size () const { unsigned int size = min_size; - if (flags & ARG_1_AND_2_ARE_WORDS) { - // arg1 and 2 are int16 - size += 4; - } else { - // arg1 and 2 are int8 - size += 2; - } - if (flags & WE_HAVE_A_SCALE) { - // One x 16 bit (scale) - size += 2; - } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { - // Two x 16 bit (xscale, yscale) - size += 4; - } else if (flags & WE_HAVE_A_TWO_BY_TWO) { - // Four x 16 bit (xscale, scale01, scale10, yscale) - size += 8; - } + // arg1 and 2 are int16 + if (flags & ARG_1_AND_2_ARE_WORDS) size += 4; + // arg1 and 2 are int8 + else size += 2; + + // One x 16 bit (scale) + if (flags & WE_HAVE_A_SCALE) size += 2; + // Two x 16 bit (xscale, yscale) + else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) size += 4; + // Four x 16 bit (xscale, scale01, scale10, yscale) + else if (flags & WE_HAVE_A_TWO_BY_TWO) size += 8; + return size; } @@ -181,7 +177,7 @@ struct glyf const char *glyph_end; const CompositeGlyphHeader *current; - inline bool move_to_next () + bool move_to_next () { if (current->flags & CompositeGlyphHeader::MORE_COMPONENTS) { @@ -195,17 +191,17 @@ struct glyf return false; } - inline bool in_range (const CompositeGlyphHeader *composite) const + bool in_range (const CompositeGlyphHeader *composite) const { return (const char *) composite >= glyph_start && ((const char *) composite + CompositeGlyphHeader::min_size) <= glyph_end - && ((const char *) composite + composite->get_size()) <= glyph_end; + && ((const char *) composite + composite->get_size ()) <= glyph_end; } }; - static inline bool get_iterator (const char * glyph_data, - unsigned int length, - CompositeGlyphHeader::Iterator *iterator /* OUT */) + static bool get_iterator (const char * glyph_data, + unsigned int length, + CompositeGlyphHeader::Iterator *iterator /* OUT */) { if (length < GlyphHeader::static_size) return false; /* Empty glyph; zero extents. */ @@ -213,15 +209,15 @@ struct glyf const GlyphHeader &glyph_header = StructAtOffset (glyph_data, 0); if (glyph_header.numberOfContours < 0) { - const CompositeGlyphHeader *possible = + const CompositeGlyphHeader *possible = &StructAfter (glyph_header); iterator->glyph_start = glyph_data; iterator->glyph_end = (const char *) glyph_data + length; if (!iterator->in_range (possible)) - return false; - iterator->current = possible; - return true; + return false; + iterator->current = possible; + return true; } return false; @@ -232,34 +228,26 @@ struct glyf struct accelerator_t { - inline void init (hb_face_t *face) + void init (hb_face_t *face) { memset (this, 0, sizeof (accelerator_t)); - hb_blob_t *head_blob = Sanitizer().sanitize (face->reference_table (HB_OT_TAG_head)); - const head *head_table = head_blob->as (); - if (head_table == &Null(head) || (unsigned int) head_table->indexToLocFormat > 1 || head_table->glyphDataFormat != 0) - { - /* head table is not present, or in an unknown format. Leave num_glyphs=0, that takes care of disabling us. */ - hb_blob_destroy (head_blob); + const OT::head &head = *face->table.head; + if (head.indexToLocFormat > 1 || head.glyphDataFormat != 0) + /* Unknown format. Leave num_glyphs=0, that takes care of disabling us. */ return; - } - short_offset = 0 == head_table->indexToLocFormat; - hb_blob_destroy (head_blob); + short_offset = 0 == head.indexToLocFormat; - loca_blob = Sanitizer().sanitize (face->reference_table (HB_OT_TAG_loca)); - loca_table = loca_blob->as (); - glyf_blob = Sanitizer().sanitize (face->reference_table (HB_OT_TAG_glyf)); - glyf_table = glyf_blob->as (); + loca_table = hb_sanitize_context_t ().reference_table (face); + glyf_table = hb_sanitize_context_t ().reference_table (face); - num_glyphs = MAX (1u, hb_blob_get_length (loca_blob) / (short_offset ? 2 : 4)) - 1; - glyf_len = hb_blob_get_length (glyf_blob); + num_glyphs = MAX (1u, loca_table.get_length () / (short_offset ? 2 : 4)) - 1; } - inline void fini (void) + void fini () { - hb_blob_destroy (loca_blob); - hb_blob_destroy (glyf_blob); + loca_table.destroy (); + glyf_table.destroy (); } /* @@ -267,35 +255,37 @@ struct glyf * If true is returned a pointer to the composite glyph will be written into * composite. */ - inline bool get_composite (hb_codepoint_t glyph, - CompositeGlyphHeader::Iterator *composite /* OUT */) const + bool get_composite (hb_codepoint_t glyph, + CompositeGlyphHeader::Iterator *composite /* OUT */) const { - if (this->glyf_table == &Null(glyf) || !num_glyphs) + if (unlikely (!num_glyphs)) return false; unsigned int start_offset, end_offset; if (!get_offsets (glyph, &start_offset, &end_offset)) - return false; /* glyph not found */ + return false; /* glyph not found */ - return CompositeGlyphHeader::get_iterator ((const char*) this->glyf_table + start_offset, + return CompositeGlyphHeader::get_iterator ((const char *) this->glyf_table + start_offset, end_offset - start_offset, composite); } enum simple_glyph_flag_t { + FLAG_ON_CURVE = 0x01, FLAG_X_SHORT = 0x02, FLAG_Y_SHORT = 0x04, FLAG_REPEAT = 0x08, FLAG_X_SAME = 0x10, - FLAG_Y_SAME = 0x20 + FLAG_Y_SAME = 0x20, + FLAG_RESERVED1 = 0x40, + FLAG_RESERVED2 = 0x80 }; /* based on FontTools _g_l_y_f.py::trim */ - inline bool remove_padding(unsigned int start_offset, - unsigned int *end_offset) const + bool remove_padding (unsigned int start_offset, + unsigned int *end_offset) const { - if (*end_offset - start_offset < GlyphHeader::static_size) - return true; + if (*end_offset - start_offset < GlyphHeader::static_size) return true; const char *glyph = ((const char *) glyf_table) + start_offset; const char * const glyph_end = glyph + (*end_offset - start_offset); @@ -303,143 +293,139 @@ struct glyf int16_t num_contours = (int16_t) glyph_header.numberOfContours; if (num_contours < 0) - /* Trimming for composites not implemented. - * If removing hints it falls out of that. */ - return true; + /* Trimming for composites not implemented. + * If removing hints it falls out of that. */ + return true; else if (num_contours > 0) { - /* simple glyph w/contours, possibly trimmable */ - glyph += GlyphHeader::static_size + 2 * num_contours; - - if (unlikely (glyph + 2 >= glyph_end)) return false; - uint16_t nCoordinates = (uint16_t) StructAtOffset(glyph - 2, 0) + 1; - uint16_t nInstructions = (uint16_t) StructAtOffset(glyph, 0); - - glyph += 2 + nInstructions; - if (unlikely (glyph + 2 >= glyph_end)) return false; - - unsigned int coordBytes = 0; - unsigned int coordsWithFlags = 0; - while (glyph < glyph_end) - { - uint8_t flag = (uint8_t) *glyph; - glyph++; - - unsigned int repeat = 1; - if (flag & FLAG_REPEAT) - { - if (glyph >= glyph_end) - { - DEBUG_MSG(SUBSET, nullptr, "Bad flag"); - return false; - } - repeat = ((uint8_t) *glyph) + 1; - glyph++; - } - - unsigned int xBytes, yBytes; - xBytes = yBytes = 0; - if (flag & FLAG_X_SHORT) - xBytes = 1; - else if ((flag & FLAG_X_SAME) == 0) - xBytes = 2; - - if (flag & FLAG_Y_SHORT) - yBytes = 1; - else if ((flag & FLAG_Y_SAME) == 0) - yBytes = 2; - - coordBytes += (xBytes + yBytes) * repeat; - coordsWithFlags += repeat; - if (coordsWithFlags >= nCoordinates) - break; - } - - if (coordsWithFlags != nCoordinates) - { - DEBUG_MSG(SUBSET, nullptr, "Expect %d coords to have flags, got flags for %d", nCoordinates, coordsWithFlags); - return false; - } - glyph += coordBytes; - - if (glyph < glyph_end) - *end_offset -= glyph_end - glyph; + /* simple glyph w/contours, possibly trimmable */ + glyph += GlyphHeader::static_size + 2 * num_contours; + + if (unlikely (glyph + 2 >= glyph_end)) return false; + uint16_t nCoordinates = (uint16_t) StructAtOffset (glyph - 2, 0) + 1; + uint16_t nInstructions = (uint16_t) StructAtOffset (glyph, 0); + + glyph += 2 + nInstructions; + if (unlikely (glyph + 2 >= glyph_end)) return false; + + unsigned int coordBytes = 0; + unsigned int coordsWithFlags = 0; + while (glyph < glyph_end) + { + uint8_t flag = (uint8_t) *glyph; + glyph++; + + unsigned int repeat = 1; + if (flag & FLAG_REPEAT) + { + if (glyph >= glyph_end) + { + DEBUG_MSG(SUBSET, nullptr, "Bad flag"); + return false; + } + repeat = ((uint8_t) *glyph) + 1; + glyph++; + } + + unsigned int xBytes, yBytes; + xBytes = yBytes = 0; + if (flag & FLAG_X_SHORT) xBytes = 1; + else if ((flag & FLAG_X_SAME) == 0) xBytes = 2; + + if (flag & FLAG_Y_SHORT) yBytes = 1; + else if ((flag & FLAG_Y_SAME) == 0) yBytes = 2; + + coordBytes += (xBytes + yBytes) * repeat; + coordsWithFlags += repeat; + if (coordsWithFlags >= nCoordinates) + break; + } + + if (coordsWithFlags != nCoordinates) + { + DEBUG_MSG(SUBSET, nullptr, "Expect %d coords to have flags, got flags for %d", nCoordinates, coordsWithFlags); + return false; + } + glyph += coordBytes; + + if (glyph < glyph_end) + *end_offset -= glyph_end - glyph; } return true; } - inline bool get_offsets (hb_codepoint_t glyph, - unsigned int *start_offset /* OUT */, - unsigned int *end_offset /* OUT */) const + bool get_offsets (hb_codepoint_t glyph, + unsigned int *start_offset /* OUT */, + unsigned int *end_offset /* OUT */) const { if (unlikely (glyph >= num_glyphs)) return false; if (short_offset) { - const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataZ; + const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataZ.arrayZ; *start_offset = 2 * offsets[glyph]; *end_offset = 2 * offsets[glyph + 1]; } else { - const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataZ; + const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataZ.arrayZ; *start_offset = offsets[glyph]; *end_offset = offsets[glyph + 1]; } - if (*start_offset > *end_offset || *end_offset > glyf_len) + if (*start_offset > *end_offset || *end_offset > glyf_table.get_length ()) return false; return true; } - inline bool get_instruction_offsets(unsigned int start_offset, - unsigned int end_offset, - unsigned int *instruction_start /* OUT */, - unsigned int *instruction_end /* OUT */) const + bool get_instruction_offsets (unsigned int start_offset, + unsigned int end_offset, + unsigned int *instruction_start /* OUT */, + unsigned int *instruction_end /* OUT */) const { if (end_offset - start_offset < GlyphHeader::static_size) { - *instruction_start = 0; - *instruction_end = 0; - return true; /* Empty glyph; no instructions. */ + *instruction_start = 0; + *instruction_end = 0; + return true; /* Empty glyph; no instructions. */ } const GlyphHeader &glyph_header = StructAtOffset (glyf_table, start_offset); int16_t num_contours = (int16_t) glyph_header.numberOfContours; if (num_contours < 0) { - CompositeGlyphHeader::Iterator composite_it; - if (unlikely (!CompositeGlyphHeader::get_iterator ( - (const char*) this->glyf_table + start_offset, - end_offset - start_offset, &composite_it))) return false; - const CompositeGlyphHeader *last; - do { - last = composite_it.current; - } while (composite_it.move_to_next()); - - if ( (uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS) - *instruction_start = ((char *) last - (char *) glyf_table->dataZ) + last->get_size(); - else - *instruction_start = end_offset; - *instruction_end = end_offset; - if (unlikely (*instruction_start > *instruction_end)) - { - DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset); - return false; - } + CompositeGlyphHeader::Iterator composite_it; + if (unlikely (!CompositeGlyphHeader::get_iterator ( + (const char*) this->glyf_table + start_offset, + end_offset - start_offset, &composite_it))) return false; + const CompositeGlyphHeader *last; + do { + last = composite_it.current; + } while (composite_it.move_to_next ()); + + if ((uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS) + *instruction_start = ((char *) last - (char *) glyf_table->dataZ.arrayZ) + last->get_size (); + else + *instruction_start = end_offset; + *instruction_end = end_offset; + if (unlikely (*instruction_start > *instruction_end)) + { + DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset); + return false; + } } else { - unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours; + unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours; if (unlikely (instruction_length_offset + 2 > end_offset)) { DEBUG_MSG(SUBSET, nullptr, "Glyph size is too short, missing field instructionLength."); return false; } - const HBUINT16 &instruction_length = StructAtOffset (glyf_table, instruction_length_offset); + const HBUINT16 &instruction_length = StructAtOffset (glyf_table, instruction_length_offset); unsigned int start = instruction_length_offset + 2; unsigned int end = start + (uint16_t) instruction_length; if (unlikely (end > end_offset)) // Out of bounds of the current glyph @@ -449,17 +435,16 @@ struct glyf } *instruction_start = start; - *instruction_end = end; + *instruction_end = end; } return true; } - inline bool get_extents (hb_codepoint_t glyph, - hb_glyph_extents_t *extents) const + bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const { unsigned int start_offset, end_offset; if (!get_offsets (glyph, &start_offset, &end_offset)) - return false; + return false; if (end_offset - start_offset < GlyphHeader::static_size) return true; /* Empty glyph; zero extents. */ @@ -477,19 +462,20 @@ struct glyf private: bool short_offset; unsigned int num_glyphs; - const loca *loca_table; - const glyf *glyf_table; - hb_blob_t *loca_blob; - hb_blob_t *glyf_blob; - unsigned int glyf_len; + hb_blob_ptr_t loca_table; + hb_blob_ptr_t glyf_table; }; protected: - HBUINT8 dataZ[VAR]; /* Glyphs data. */ - - DEFINE_SIZE_ARRAY (0, dataZ); + UnsizedArrayOf dataZ; /* Glyphs data. */ + public: + DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always + * check the size externally, allow Null() object of it by + * defining it MIN() instead. */ }; +struct glyf_accelerator_t : glyf::accelerator_t {}; + } /* namespace OT */ diff --git a/src/hb-ot-hdmx-table.hh b/src/hb-ot-hdmx-table.hh index d406e3e..95229c5 100644 --- a/src/hb-ot-hdmx-table.hh +++ b/src/hb-ot-hdmx-table.hh @@ -27,8 +27,7 @@ #ifndef HB_OT_HDMX_TABLE_HH #define HB_OT_HDMX_TABLE_HH -#include "hb-open-type-private.hh" -#include "hb-subset-plan.hh" +#include "hb-open-type.hh" /* * hdmx -- Horizontal Device Metrics @@ -45,57 +44,51 @@ struct DeviceRecord struct SubsetView { const DeviceRecord *source_device_record; - unsigned int size_device_record; + unsigned int sizeDeviceRecord; hb_subset_plan_t *subset_plan; - inline void init(const DeviceRecord *source_device_record, - unsigned int size_device_record, - hb_subset_plan_t *subset_plan) + void init (const DeviceRecord *source_device_record, + unsigned int sizeDeviceRecord, + hb_subset_plan_t *subset_plan) { this->source_device_record = source_device_record; - this->size_device_record = size_device_record; + this->sizeDeviceRecord = sizeDeviceRecord; this->subset_plan = subset_plan; } - inline unsigned int len () const - { - return this->subset_plan->glyphs.len; - } + unsigned int len () const + { return this->subset_plan->glyphs.length; } - inline const HBUINT8* operator [] (unsigned int i) const + const HBUINT8* operator [] (unsigned int i) const { - if (unlikely (i >= len())) return nullptr; + if (unlikely (i >= len ())) return nullptr; hb_codepoint_t gid = this->subset_plan->glyphs [i]; - const HBUINT8* width = &(this->source_device_record->widths[gid]); - - if (width < ((const HBUINT8 *) this->source_device_record) + size_device_record) - return width; - else - return nullptr; + if (gid >= sizeDeviceRecord - DeviceRecord::min_size) + return nullptr; + return &(this->source_device_record->widthsZ[gid]); } }; - static inline unsigned int get_size (unsigned int count) - { - unsigned int raw_size = min_size + count * HBUINT8::static_size; - if (raw_size % 4) - /* Align to 32 bits */ - return raw_size + (4 - (raw_size % 4)); - return raw_size; - } + static unsigned int get_size (unsigned int count) + { return hb_ceil_to_4 (min_size + count * HBUINT8::static_size); } - inline bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view) + bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view) { TRACE_SERIALIZE (this); - if (unlikely (!c->allocate_size (get_size (subset_view.len())))) + unsigned int size = get_size (subset_view.len ()); + if (unlikely (!c->allocate_size (size))) + { + DEBUG_MSG(SUBSET, nullptr, "Couldn't allocate enough space for DeviceRecord: %d.", + size); return_trace (false); + } - this->pixel_size.set (subset_view.source_device_record->pixel_size); - this->max_width.set (subset_view.source_device_record->max_width); + this->pixelSize.set (subset_view.source_device_record->pixelSize); + this->maxWidth.set (subset_view.source_device_record->maxWidth); - for (unsigned int i = 0; i < subset_view.len(); i++) + for (unsigned int i = 0; i < subset_view.len (); i++) { const HBUINT8 *width = subset_view[i]; if (!width) @@ -103,56 +96,56 @@ struct DeviceRecord DEBUG_MSG(SUBSET, nullptr, "HDMX width for new gid %d is missing.", i); return_trace (false); } - widths[i].set (*width); + widthsZ[i].set (*width); } return_trace (true); } - inline bool sanitize (hb_sanitize_context_t *c, unsigned int size_device_record) const + bool sanitize (hb_sanitize_context_t *c, unsigned int sizeDeviceRecord) const { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - c->check_range (this, size_device_record))); + c->check_range (this, sizeDeviceRecord))); } - HBUINT8 pixel_size; /* Pixel size for following widths (as ppem). */ - HBUINT8 max_width; /* Maximum width. */ - HBUINT8 widths[VAR]; /* Array of widths (numGlyphs is from the 'maxp' table). */ + HBUINT8 pixelSize; /* Pixel size for following widths (as ppem). */ + HBUINT8 maxWidth; /* Maximum width. */ + UnsizedArrayOf widthsZ; /* Array of widths (numGlyphs is from the 'maxp' table). */ public: - DEFINE_SIZE_ARRAY (2, widths); + DEFINE_SIZE_ARRAY (2, widthsZ); }; struct hdmx { - static const hb_tag_t tableTag = HB_OT_TAG_hdmx; + static constexpr hb_tag_t tableTag = HB_OT_TAG_hdmx; - inline unsigned int get_size (void) const - { - return min_size + num_records * size_device_record; - } + unsigned int get_size () const + { return min_size + numRecords * sizeDeviceRecord; } - inline const DeviceRecord& operator [] (unsigned int i) const + const DeviceRecord& operator [] (unsigned int i) const { - if (unlikely (i >= num_records)) return Null(DeviceRecord); - return StructAtOffset (this->data, i * size_device_record); + /* XXX Null(DeviceRecord) is NOT safe as it's num-glyphs lengthed. + * https://github.com/harfbuzz/harfbuzz/issues/1300 */ + if (unlikely (i >= numRecords)) return Null (DeviceRecord); + return StructAtOffset (&this->firstDeviceRecord, i * sizeDeviceRecord); } - inline bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan) + bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min ((*this)))) return_trace (false); this->version.set (source_hdmx->version); - this->num_records.set (source_hdmx->num_records); - this->size_device_record.set (DeviceRecord::get_size (plan->glyphs.len)); + this->numRecords.set (source_hdmx->numRecords); + this->sizeDeviceRecord.set (DeviceRecord::get_size (plan->glyphs.length)); - for (unsigned int i = 0; i < source_hdmx->num_records; i++) + for (unsigned int i = 0; i < source_hdmx->numRecords; i++) { DeviceRecord::SubsetView subset_view; - subset_view.init (&(*source_hdmx)[i], source_hdmx->size_device_record, plan); + subset_view.init (&(*source_hdmx)[i], source_hdmx->sizeDeviceRecord, plan); if (!c->start_embed ()->serialize (c, subset_view)) return_trace (false); @@ -161,14 +154,14 @@ struct hdmx return_trace (true); } - static inline size_t get_subsetted_size (hb_subset_plan_t *plan) + static size_t get_subsetted_size (const hdmx *source_hdmx, hb_subset_plan_t *plan) { - return min_size + DeviceRecord::get_size (plan->glyphs.len); + return min_size + source_hdmx->numRecords * DeviceRecord::get_size (plan->glyphs.length); } - inline bool subset (hb_subset_plan_t *plan) const + bool subset (hb_subset_plan_t *plan) const { - size_t dest_size = get_subsetted_size (plan); + size_t dest_size = get_subsetted_size (this, plan); hdmx *dest = (hdmx *) malloc (dest_size); if (unlikely (!dest)) { @@ -178,8 +171,10 @@ struct hdmx hb_serialize_context_t c (dest, dest_size); hdmx *hdmx_prime = c.start_serialize (); - if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan)) { + if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan)) + { free (dest); + DEBUG_MSG(SUBSET, nullptr, "Failed to serialize write new hdmx."); return false; } c.end_serialize (); @@ -195,22 +190,22 @@ struct hdmx return result; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && version == 0 && - !_hb_unsigned_int_mul_overflows (num_records, size_device_record) && - size_device_record >= DeviceRecord::min_size && - c->check_range (this, get_size())); + return_trace (c->check_struct (this) && + !hb_unsigned_mul_overflows (numRecords, sizeDeviceRecord) && + sizeDeviceRecord >= DeviceRecord::min_size && + c->check_range (this, get_size ())); } protected: - HBUINT16 version; /* Table version number (0) */ - HBUINT16 num_records; /* Number of device records. */ - HBUINT32 size_device_record; /* Size of a device record, 32-bit aligned. */ - HBUINT8 data[VAR]; /* Array of device records. */ + HBUINT16 version; /* Table version number (0) */ + HBUINT16 numRecords; /* Number of device records. */ + HBUINT32 sizeDeviceRecord; /* Size of a device record, 32-bit aligned. */ + DeviceRecord firstDeviceRecord; /* Array of device records. */ public: - DEFINE_SIZE_ARRAY (8, data); + DEFINE_SIZE_MIN (8); }; } /* namespace OT */ diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh index 965e30a..3c0bb3d 100644 --- a/src/hb-ot-head-table.hh +++ b/src/hb-ot-head-table.hh @@ -29,7 +29,7 @@ #ifndef HB_OT_HEAD_TABLE_HH #define HB_OT_HEAD_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" /* * head -- Font Header @@ -45,16 +45,29 @@ struct head { friend struct OffsetTable; - static const hb_tag_t tableTag = HB_OT_TAG_head; + static constexpr hb_tag_t tableTag = HB_OT_TAG_head; - inline unsigned int get_upem (void) const + unsigned int get_upem () const { unsigned int upem = unitsPerEm; /* If no valid head table found, assume 1000, which matches typical Type1 usage. */ return 16 <= upem && upem <= 16384 ? upem : 1000; } - inline bool sanitize (hb_sanitize_context_t *c) const + enum mac_style_flag_t { + BOLD = 1u<<0, + ITALIC = 1u<<1, + UNDERLINE = 1u<<2, + OUTLINE = 1u<<3, + SHADOW = 1u<<4, + CONDENSED = 1u<<5 + }; + + bool is_bold () const { return macStyle & BOLD; } + bool is_italic () const { return macStyle & ITALIC; } + bool is_condensed () const { return macStyle & CONDENSED; } + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && @@ -141,8 +154,8 @@ struct head * -1: Only strongly right to left; * -2: Like -1 but also contains neutrals. */ public: - HBINT16 indexToLocFormat; /* 0 for short offsets, 1 for long. */ - HBINT16 glyphDataFormat; /* 0 for current format. */ + HBUINT16 indexToLocFormat; /* 0 for short offsets, 1 for long. */ + HBUINT16 glyphDataFormat; /* 0 for current format. */ DEFINE_SIZE_STATIC (54); }; diff --git a/src/hb-ot-hhea-table.hh b/src/hb-ot-hhea-table.hh index efb42b6..c3155b7 100644 --- a/src/hb-ot-hhea-table.hh +++ b/src/hb-ot-hhea-table.hh @@ -27,7 +27,7 @@ #ifndef HB_OT_HHEA_TABLE_HH #define HB_OT_HHEA_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" /* * hhea -- Horizontal Header @@ -45,7 +45,7 @@ namespace OT { template struct _hea { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && likely (version.major == 1)); @@ -86,10 +86,10 @@ struct _hea }; struct hhea : _hea { - static const hb_tag_t tableTag = HB_OT_TAG_hhea; + static constexpr hb_tag_t tableTag = HB_OT_TAG_hhea; }; struct vhea : _hea { - static const hb_tag_t tableTag = HB_OT_TAG_vhea; + static constexpr hb_tag_t tableTag = HB_OT_TAG_vhea; }; diff --git a/src/hb-ot-hmtx-table.hh b/src/hb-ot-hmtx-table.hh index 2c62664..a95a56f 100644 --- a/src/hb-ot-hmtx-table.hh +++ b/src/hb-ot-hmtx-table.hh @@ -27,11 +27,10 @@ #ifndef HB_OT_HMTX_TABLE_HH #define HB_OT_HMTX_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-open-type.hh" #include "hb-ot-hhea-table.hh" #include "hb-ot-os2-table.hh" #include "hb-ot-var-hvar-table.hh" -#include "hb-subset-plan.hh" /* * hmtx -- Horizontal Metrics @@ -49,7 +48,7 @@ namespace OT { struct LongMetric { UFWORD advance; /* Advance width/height. */ - FWORD lsb; /* Leading (left/top) side bearing. */ + FWORD sb; /* Leading (left/top) side bearing. */ public: DEFINE_SIZE_STATIC (4); }; @@ -57,7 +56,7 @@ struct LongMetric template struct hmtxvmtx { - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const { TRACE_SANITIZE (this); /* We don't check for anything specific here. The users of the @@ -66,11 +65,11 @@ struct hmtxvmtx } - inline bool subset_update_header (hb_subset_plan_t *plan, - unsigned int num_hmetrics) const + bool subset_update_header (hb_subset_plan_t *plan, + unsigned int num_hmetrics) const { - hb_blob_t *src_blob = OT::Sanitizer ().sanitize (plan->source->reference_table (H::tableTag)); - hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail(src_blob); + hb_blob_t *src_blob = hb_sanitize_context_t ().reference_table (plan->source, H::tableTag); + hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail (src_blob); hb_blob_destroy (src_blob); if (unlikely (!dest_blob)) { @@ -87,7 +86,7 @@ struct hmtxvmtx return result; } - inline bool subset (hb_subset_plan_t *plan) const + bool subset (hb_subset_plan_t *plan) const { typename T::accelerator_t _mtx; _mtx.init (plan->source); @@ -95,33 +94,33 @@ struct hmtxvmtx /* All the trailing glyphs with the same advance can use one LongMetric * and just keep LSB */ hb_vector_t &gids = plan->glyphs; - unsigned int num_advances = gids.len; + unsigned int num_advances = gids.length; unsigned int last_advance = _mtx.get_advance (gids[num_advances - 1]); - while (num_advances > 1 - && last_advance == _mtx.get_advance (gids[num_advances - 2])) + while (num_advances > 1 && + last_advance == _mtx.get_advance (gids[num_advances - 2])) { num_advances--; } /* alloc the new table */ size_t dest_sz = num_advances * 4 - + (gids.len - num_advances) * 2; + + (gids.length - num_advances) * 2; void *dest = (void *) malloc (dest_sz); if (unlikely (!dest)) { return false; } DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in src has %d advances, %d lsbs", HB_UNTAG(T::tableTag), _mtx.num_advances, _mtx.num_metrics - _mtx.num_advances); - DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in dest has %d advances, %d lsbs, %u bytes", HB_UNTAG(T::tableTag), num_advances, gids.len - num_advances, (unsigned int) dest_sz); + DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in dest has %d advances, %d lsbs, %u bytes", HB_UNTAG(T::tableTag), num_advances, gids.length - num_advances, (unsigned int) dest_sz); - const char *source_table = hb_blob_get_data (_mtx.blob, nullptr); + const char *source_table = hb_blob_get_data (_mtx.table.get_blob (), nullptr); // Copy everything over LongMetric * old_metrics = (LongMetric *) source_table; FWORD *lsbs = (FWORD *) (old_metrics + _mtx.num_advances); char * dest_pos = (char *) dest; bool failed = false; - for (unsigned int i = 0; i < gids.len; i++) + for (unsigned int i = 0; i < gids.length; i++) { /* the last metric or the one for gids[i] */ LongMetric *src_metric = old_metrics + MIN ((hb_codepoint_t) _mtx.num_advances - 1, gids[i]); @@ -135,8 +134,8 @@ struct hmtxvmtx } else { - /* dest just lsb */ - *((FWORD *) dest_pos) = src_metric->lsb; + /* dest just sb */ + *((FWORD *) dest_pos) = src_metric->sb; } } else @@ -148,18 +147,18 @@ struct hmtxvmtx failed = true; break; } - FWORD src_lsb = *(lsbs + gids[i] - _mtx.num_advances); + FWORD src_sb = *(lsbs + gids[i] - _mtx.num_advances); if (i < num_advances) { /* dest needs a full LongMetric */ LongMetric *metric = (LongMetric *)dest_pos; metric->advance = src_metric->advance; - metric->lsb = src_lsb; + metric->sb = src_sb; } else { - /* dest just needs an lsb */ - *((FWORD *) dest_pos) = src_lsb; + /* dest just needs an sb */ + *((FWORD *) dest_pos) = src_sb; } } dest_pos += (i < num_advances ? 4 : 2); @@ -187,34 +186,27 @@ struct hmtxvmtx { friend struct hmtxvmtx; - inline void init (hb_face_t *face, + void init (hb_face_t *face, unsigned int default_advance_ = 0) { default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face); bool got_font_extents = false; - if (T::os2Tag) + if (T::os2Tag != HB_TAG_NONE && face->table.OS2->is_typo_metrics ()) { - hb_blob_t *os2_blob = Sanitizer ().sanitize (face->reference_table (T::os2Tag)); - const os2 *os2_table = os2_blob->as (); -#define USE_TYPO_METRICS (1u<<7) - if (0 != (os2_table->fsSelection & USE_TYPO_METRICS)) - { - ascender = os2_table->sTypoAscender; - descender = os2_table->sTypoDescender; - line_gap = os2_table->sTypoLineGap; - got_font_extents = (ascender | descender) != 0; - } - hb_blob_destroy (os2_blob); + ascender = abs (face->table.OS2->sTypoAscender); + descender = -abs (face->table.OS2->sTypoDescender); + line_gap = face->table.OS2->sTypoLineGap; + got_font_extents = (ascender | descender) != 0; } - hb_blob_t *_hea_blob = Sanitizer ().sanitize (face->reference_table (H::tableTag)); + hb_blob_t *_hea_blob = hb_sanitize_context_t().reference_table (face); const H *_hea_table = _hea_blob->as (); num_advances = _hea_table->numberOfLongMetrics; if (!got_font_extents) { - ascender = _hea_table->ascender; - descender = _hea_table->descender; + ascender = abs (_hea_table->ascender); + descender = -abs (_hea_table->descender); line_gap = _hea_table->lineGap; got_font_extents = (ascender | descender) != 0; } @@ -222,10 +214,10 @@ struct hmtxvmtx has_font_extents = got_font_extents; - blob = Sanitizer ().sanitize (face->reference_table (T::tableTag)); + table = hb_sanitize_context_t().reference_table (face, T::tableTag); /* Cap num_metrics() and num_advances() based on table length. */ - unsigned int len = hb_blob_get_length (blob); + unsigned int len = table.get_length (); if (unlikely (num_advances * 4 > len)) num_advances = len / 4; num_metrics = num_advances + (len - 4 * num_advances) / 2; @@ -235,53 +227,64 @@ struct hmtxvmtx if (unlikely (!num_advances)) { num_metrics = num_advances = 0; - hb_blob_destroy (blob); - blob = hb_blob_get_empty (); + table.destroy (); + table = hb_blob_get_empty (); } - table = blob->as (); - var_blob = Sanitizer ().sanitize (face->reference_table (T::variationsTag)); - var_table = var_blob->as (); + var_table = hb_sanitize_context_t().reference_table (face, T::variationsTag); } - inline void fini (void) + void fini () { - hb_blob_destroy (blob); - hb_blob_destroy (var_blob); + table.destroy (); + var_table.destroy (); } - inline unsigned int get_advance (hb_codepoint_t glyph) const + /* TODO Add variations version. */ + unsigned int get_side_bearing (hb_codepoint_t glyph) const + { + if (glyph < num_advances) + return table->longMetricZ[glyph].sb; + + if (unlikely (glyph >= num_metrics)) + return 0; + + const FWORD *bearings = (const FWORD *) &table->longMetricZ[num_advances]; + return bearings[glyph - num_advances]; + } + + unsigned int get_advance (hb_codepoint_t glyph) const { if (unlikely (glyph >= num_metrics)) { - /* If num_metrics is zero, it means we don't have the metrics table - * for this direction: return default advance. Otherwise, it means that the - * glyph index is out of bound: return zero. */ - if (num_metrics) - return 0; - else - return default_advance; + /* If num_metrics is zero, it means we don't have the metrics table + * for this direction: return default advance. Otherwise, it means that the + * glyph index is out of bound: return zero. */ + if (num_metrics) + return 0; + else + return default_advance; } - return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance; + return table->longMetricZ[MIN (glyph, (uint32_t) num_advances - 1)].advance; } - inline unsigned int get_advance (hb_codepoint_t glyph, - hb_font_t *font) const + unsigned int get_advance (hb_codepoint_t glyph, + hb_font_t *font) const { unsigned int advance = get_advance (glyph); - if (likely(glyph < num_metrics)) + if (likely (glyph < num_metrics)) { - advance += (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?! + advance += (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?! } return advance; } public: bool has_font_extents; - unsigned short ascender; - unsigned short descender; - unsigned short line_gap; + int ascender; + int descender; + int line_gap; protected: unsigned int num_metrics; @@ -289,14 +292,12 @@ struct hmtxvmtx unsigned int default_advance; private: - const hmtxvmtx *table; - hb_blob_t *blob; - const HVARVVAR *var_table; - hb_blob_t *var_blob; + hb_blob_ptr_t table; + hb_blob_ptr_t var_table; }; protected: - LongMetric longMetric[VAR]; /* Paired advance width and leading + UnsizedArrayOflongMetricZ;/* Paired advance width and leading * bearing values for each glyph. The * value numOfHMetrics comes from * the 'hhea' table. If the font is @@ -304,7 +305,7 @@ struct hmtxvmtx * be in the array, but that entry is * required. The last entry applies to * all subsequent glyphs. */ -/*FWORD leadingBearingX[VAR];*/ /* Here the advance is assumed +/*UnsizedArrayOf leadingBearingX;*//* Here the advance is assumed * to be the same as the advance * for the last entry above. The * number of entries in this array is @@ -318,20 +319,23 @@ struct hmtxvmtx * font to vary the side bearing * values for each glyph. */ public: - DEFINE_SIZE_ARRAY (0, longMetric); + DEFINE_SIZE_ARRAY (0, longMetricZ); }; struct hmtx : hmtxvmtx { - static const hb_tag_t tableTag = HB_OT_TAG_hmtx; - static const hb_tag_t variationsTag = HB_OT_TAG_HVAR; - static const hb_tag_t os2Tag = HB_OT_TAG_os2; + static constexpr hb_tag_t tableTag = HB_OT_TAG_hmtx; + static constexpr hb_tag_t variationsTag = HB_OT_TAG_HVAR; + static constexpr hb_tag_t os2Tag = HB_OT_TAG_OS2; }; struct vmtx : hmtxvmtx { - static const hb_tag_t tableTag = HB_OT_TAG_vmtx; - static const hb_tag_t variationsTag = HB_OT_TAG_VVAR; - static const hb_tag_t os2Tag = HB_TAG_NONE; + static constexpr hb_tag_t tableTag = HB_OT_TAG_vmtx; + static constexpr hb_tag_t variationsTag = HB_OT_TAG_VVAR; + static constexpr hb_tag_t os2Tag = HB_TAG_NONE; }; +struct hmtx_accelerator_t : hmtx::accelerator_t {}; +struct vmtx_accelerator_t : vmtx::accelerator_t {}; + } /* namespace OT */ diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index b0fdea4..ec6a3c8 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -27,7 +27,8 @@ #ifndef HB_OT_KERN_TABLE_HH #define HB_OT_KERN_TABLE_HH -#include "hb-open-type-private.hh" +#include "hb-aat-layout-kerx-table.hh" + /* * kern -- Kerning @@ -40,354 +41,297 @@ namespace OT { -struct hb_glyph_pair_t -{ - hb_codepoint_t left; - hb_codepoint_t right; -}; - -struct KernPair -{ - inline int get_kerning (void) const - { return value; } - - inline int cmp (const hb_glyph_pair_t &o) const - { - int ret = left.cmp (o.left); - if (ret) return ret; - return right.cmp (o.right); - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); - } - - protected: - GlyphID left; - GlyphID right; - FWORD value; - public: - DEFINE_SIZE_STATIC (6); -}; - -struct KernSubTableFormat0 +template +struct KernSubTableFormat3 { - inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const + int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - hb_glyph_pair_t pair = {left, right}; - int i = pairs.bsearch (pair); - if (i == -1) + hb_array_t kernValue = kernValueZ.as_array (kernValueCount); + hb_array_t leftClass = StructAfter > (kernValue).as_array (glyphCount); + hb_array_t rightClass = StructAfter > (leftClass).as_array (glyphCount); + hb_array_t kernIndex = StructAfter > (rightClass).as_array (leftClassCount * rightClassCount); + + unsigned int leftC = leftClass[left]; + unsigned int rightC = rightClass[right]; + if (unlikely (leftC >= leftClassCount || rightC >= rightClassCount)) return 0; - return pairs[i].get_kerning (); + unsigned int i = leftC * rightClassCount + rightC; + return kernValue[kernIndex[i]]; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool apply (AAT::hb_aat_apply_context_t *c) const { - TRACE_SANITIZE (this); - return_trace (pairs.sanitize (c)); - } - - protected: - BinSearchArrayOf pairs; /* Array of kerning pairs. */ - public: - DEFINE_SIZE_ARRAY (8, pairs); -}; + TRACE_APPLY (this); -struct KernClassTable -{ - inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; } + if (!c->plan->requested_kerning) + return false; - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (firstGlyph.sanitize (c) && classes.sanitize (c)); - } + if (header.coverage & header.Backwards) + return false; - protected: - HBUINT16 firstGlyph; /* First glyph in class range. */ - ArrayOf classes; /* Glyph classes. */ - public: - DEFINE_SIZE_ARRAY (4, classes); -}; + hb_kern_machine_t machine (*this, header.coverage & header.CrossStream); + machine.kern (c->font, c->buffer, c->plan->kern_mask); -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+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)) - return 0; - const FWORD *v = &StructAtOffset (arr, offset); - if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end)) - return 0; - return *v; + return_trace (true); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (rowWidth.sanitize (c) && - leftClassTable.sanitize (c, this) && - rightClassTable.sanitize (c, this) && - array.sanitize (c, this)); + return_trace (c->check_struct (this) && + c->check_range (kernValueZ, + kernValueCount * sizeof (FWORD) + + glyphCount * 2 + + leftClassCount * rightClassCount)); } protected: - HBUINT16 rowWidth; /* The width, in bytes, of a row in the table. */ - OffsetTo - leftClassTable; /* Offset from beginning of this subtable to - * left-hand class table. */ - OffsetTo - rightClassTable;/* Offset from beginning of this subtable to - * right-hand class table. */ - OffsetTo - array; /* Offset from beginning of this subtable to - * the start of the kerning array. */ + KernSubTableHeader header; + HBUINT16 glyphCount; /* The number of glyphs in this font. */ + HBUINT8 kernValueCount; /* The number of kerning values. */ + HBUINT8 leftClassCount; /* The number of left-hand classes. */ + HBUINT8 rightClassCount;/* The number of right-hand classes. */ + HBUINT8 flags; /* Set to zero (reserved for future use). */ + UnsizedArrayOf kernValueZ; /* The kerning values. + * Length kernValueCount. */ +#if 0 + UnsizedArrayOfleftClass; /* The left-hand classes. + * Length glyphCount. */ + UnsizedArrayOfrightClass; /* The right-hand classes. + * Length glyphCount. */ + UnsizedArrayOfkernIndex; /* The indices into the kernValue array. + * Length leftClassCount * rightClassCount */ +#endif public: - DEFINE_SIZE_MIN (8); + DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 6, kernValueZ); }; +template struct KernSubTable { - inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end, unsigned int format) const + unsigned int get_size () const { return u.header.length; } + unsigned int get_type () const { return u.header.format; } + + int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - switch (format) { + switch (get_type ()) { + /* This method hooks up to hb_font_t's get_h_kerning. Only support Format0. */ case 0: return u.format0.get_kerning (left, right); - case 2: return u.format2.get_kerning (left, right, end); default:return 0; } } - inline bool sanitize (hb_sanitize_context_t *c, unsigned int format) const + template + typename context_t::return_t dispatch (context_t *c) const { - TRACE_SANITIZE (this); - switch (format) { - case 0: return_trace (u.format0.sanitize (c)); - case 2: return_trace (u.format2.sanitize (c)); - default:return_trace (true); + unsigned int subtable_type = get_type (); + TRACE_DISPATCH (this, subtable_type); + switch (subtable_type) { + case 0: return_trace (c->dispatch (u.format0)); + case 1: return_trace (u.header.apple ? c->dispatch (u.format1) : c->default_return_value ()); + case 2: return_trace (c->dispatch (u.format2)); + case 3: return_trace (u.header.apple ? c->dispatch (u.format3) : c->default_return_value ()); + default: return_trace (c->default_return_value ()); } } - protected: + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (unlikely (!u.header.sanitize (c) || + u.header.length < u.header.min_size || + !c->check_range (this, u.header.length))) return_trace (false); + + return_trace (dispatch (c)); + } + + public: union { - KernSubTableFormat0 format0; - KernSubTableFormat2 format2; + KernSubTableHeader header; + AAT::KerxSubTableFormat0 format0; + AAT::KerxSubTableFormat1 format1; + AAT::KerxSubTableFormat2 format2; + KernSubTableFormat3 format3; } u; public: - DEFINE_SIZE_MIN (0); + DEFINE_SIZE_MIN (KernSubTableHeader::static_size); }; -template -struct KernSubTableWrapper +struct KernOTSubTableHeader { - /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ - inline const T* thiz (void) const { return static_cast (this); } - - inline bool is_horizontal (void) const - { return (thiz()->coverage & T::COVERAGE_CHECK_FLAGS) == T::COVERAGE_CHECK_HORIZONTAL; } + static constexpr bool apple = false; + typedef AAT::ObsoleteTypes Types; - inline bool is_override (void) const - { return bool (thiz()->coverage & T::COVERAGE_OVERRIDE_FLAG); } + unsigned int tuple_count () const { return 0; } + bool is_horizontal () const { return (coverage & Horizontal); } - inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const - { return thiz()->subtable.get_kerning (left, right, end, thiz()->format); } - - inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const - { return is_horizontal () ? get_kerning (left, right, end) : 0; } - - inline unsigned int get_size (void) const { return thiz()->length; } + enum Coverage + { + Horizontal = 0x01u, + Minimum = 0x02u, + CrossStream = 0x04u, + Override = 0x08u, + + /* Not supported: */ + Backwards = 0x00u, + Variation = 0x00u, + }; - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (thiz()) && - thiz()->length >= T::min_size && - c->check_array (thiz(), 1, thiz()->length) && - thiz()->subtable.sanitize (c, thiz()->format)); + return_trace (c->check_struct (this)); } + + public: + HBUINT16 versionZ; /* Unused. */ + HBUINT16 length; /* Length of the subtable (including this header). */ + HBUINT8 format; /* Subtable format. */ + HBUINT8 coverage; /* Coverage bits. */ + public: + DEFINE_SIZE_STATIC (6); }; -template -struct KernTable +struct KernOT : AAT::KerxTable { - /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ - inline const T* thiz (void) const { return static_cast (this); } + friend struct AAT::KerxTable; - inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int table_length) const - { - int v = 0; - const typename T::SubTableWrapper *st = CastP (thiz()->data); - unsigned int count = thiz()->nTables; - for (unsigned int i = 0; i < count; i++) - { - if (st->is_override ()) - v = 0; - v += st->get_h_kerning (left, right, table_length + (const char *) this); - st = &StructAfter (*st); - } - return v; - } + static constexpr hb_tag_t tableTag = HB_OT_TAG_kern; + static constexpr unsigned minVersion = 0u; - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - if (unlikely (!c->check_struct (thiz()) || - thiz()->version != T::VERSION)) - return_trace (false); - - const typename T::SubTableWrapper *st = CastP (thiz()->data); - unsigned int count = thiz()->nTables; - for (unsigned int i = 0; i < count; i++) - { - if (unlikely (!st->sanitize (c))) - return_trace (false); - st = &StructAfter (*st); - } + typedef KernOTSubTableHeader SubTableHeader; + typedef SubTableHeader::Types Types; + typedef KernSubTable SubTable; - return_trace (true); - } + protected: + HBUINT16 version; /* Version--0x0000u */ + HBUINT16 tableCount; /* Number of subtables in the kerning table. */ + SubTable firstSubTable; /* Subtables. */ + public: + DEFINE_SIZE_MIN (4); }; -struct KernOT : KernTable + +struct KernAATSubTableHeader { - friend struct KernTable; + static constexpr bool apple = true; + typedef AAT::ObsoleteTypes Types; - static const uint16_t VERSION = 0x0000u; + unsigned int tuple_count () const { return 0; } + bool is_horizontal () const { return !(coverage & Vertical); } - struct SubTableWrapper : KernSubTableWrapper + enum Coverage { - friend struct KernSubTableWrapper; - - enum coverage_flags_t { - COVERAGE_DIRECTION_FLAG = 0x01u, - COVERAGE_MINIMUM_FLAG = 0x02u, - COVERAGE_CROSSSTREAM_FLAG = 0x04u, - COVERAGE_OVERRIDE_FLAG = 0x08u, - - COVERAGE_VARIATION_FLAG = 0x00u, /* Not supported. */ - - COVERAGE_CHECK_FLAGS = 0x07u, - COVERAGE_CHECK_HORIZONTAL = 0x01u - }; - - protected: - 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); + Vertical = 0x80u, + CrossStream = 0x40u, + Variation = 0x20u, + + /* Not supported: */ + Backwards = 0x00u, }; - protected: - HBUINT16 version; /* Version--0x0000u */ - HBUINT16 nTables; /* Number of subtables in the kerning table. */ - HBUINT8 data[VAR]; + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + public: + 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. + * Note: We don't implement. */ public: - DEFINE_SIZE_ARRAY (4, data); + DEFINE_SIZE_STATIC (8); }; -struct KernAAT : KernTable +struct KernAAT : AAT::KerxTable { - friend struct KernTable; + friend struct AAT::KerxTable; - static const uint32_t VERSION = 0x00010000u; + static constexpr hb_tag_t tableTag = HB_OT_TAG_kern; + static constexpr unsigned minVersion = 0x00010000u; - struct SubTableWrapper : KernSubTableWrapper - { - friend struct KernSubTableWrapper; - - enum coverage_flags_t { - COVERAGE_DIRECTION_FLAG = 0x80u, - COVERAGE_CROSSSTREAM_FLAG = 0x40u, - COVERAGE_VARIATION_FLAG = 0x20u, - - COVERAGE_OVERRIDE_FLAG = 0x00u, /* Not supported. */ - - COVERAGE_CHECK_FLAGS = 0xE0u, - COVERAGE_CHECK_HORIZONTAL = 0x00u - }; - - protected: - 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: - DEFINE_SIZE_MIN (8); - }; + typedef KernAATSubTableHeader SubTableHeader; + typedef SubTableHeader::Types Types; + typedef KernSubTable SubTable; protected: - HBUINT32 version; /* Version--0x00010000u */ - HBUINT32 nTables; /* Number of subtables in the kerning table. */ - HBUINT8 data[VAR]; + HBUINT32 version; /* Version--0x00010000u */ + HBUINT32 tableCount; /* Number of subtables in the kerning table. */ + SubTable firstSubTable; /* Subtables. */ public: - DEFINE_SIZE_ARRAY (8, data); + DEFINE_SIZE_MIN (8); }; struct kern { - static const hb_tag_t tableTag = HB_OT_TAG_kern; + static constexpr hb_tag_t tableTag = HB_OT_TAG_kern; - inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int table_length) const + bool has_data () const { return u.version32; } + unsigned int get_type () const { return u.major; } + + bool has_state_machine () const { - switch (u.major) { - case 0: return u.ot.get_h_kerning (left, right, table_length); - case 1: return u.aat.get_h_kerning (left, right, table_length); - default:return 0; + switch (get_type ()) { + case 0: return u.ot.has_state_machine (); + case 1: return u.aat.has_state_machine (); + default:return false; } } - inline bool sanitize (hb_sanitize_context_t *c) const + bool has_cross_stream () const { - TRACE_SANITIZE (this); - if (!u.major.sanitize (c)) return_trace (false); - switch (u.major) { - case 0: return_trace (u.ot.sanitize (c)); - case 1: return_trace (u.aat.sanitize (c)); - default:return_trace (true); + switch (get_type ()) { + case 0: return u.ot.has_cross_stream (); + case 1: return u.aat.has_cross_stream (); + default:return false; } } - struct accelerator_t + int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - inline void init (hb_face_t *face) - { - blob = Sanitizer().sanitize (face->reference_table (HB_OT_TAG_kern)); - table = blob->as (); - table_length = blob->length; - } - inline void fini (void) - { - hb_blob_destroy (blob); + switch (get_type ()) { + case 0: return u.ot.get_h_kerning (left, right); + case 1: return u.aat.get_h_kerning (left, right); + default:return 0; } + } - inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const - { return table->get_h_kerning (left, right, table_length); } + bool apply (AAT::hb_aat_apply_context_t *c) const + { return dispatch (c); } - private: - hb_blob_t *blob; - const kern *table; - unsigned int table_length; - }; + template + 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 0: return_trace (c->dispatch (u.ot)); + case 1: return_trace (c->dispatch (u.aat)); + default: return_trace (c->default_return_value ()); + } + } + + bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + if (!u.version32.sanitize (c)) return_trace (false); + return_trace (dispatch (c)); + } protected: union { + HBUINT32 version32; HBUINT16 major; KernOT ot; KernAAT aat; } u; public: - DEFINE_SIZE_UNION (2, major); + DEFINE_SIZE_UNION (4, version32); }; } /* namespace OT */ diff --git a/src/hb-ot-layout-base-table.hh b/src/hb-ot-layout-base-table.hh index 33dce89..dd0fba1 100644 --- a/src/hb-ot-layout-base-table.hh +++ b/src/hb-ot-layout-base-table.hh @@ -1,6 +1,7 @@ /* * Copyright © 2016 Elie Roux * Copyright © 2018 Google, Inc. + * Copyright © 2018 Ebrahim Byagowi * * This is part of HarfBuzz, a text shaping library. * @@ -28,12 +29,13 @@ #ifndef HB_OT_LAYOUT_BASE_TABLE_HH #define HB_OT_LAYOUT_BASE_TABLE_HH -#include "hb-open-type-private.hh" -#include "hb-ot-layout-common-private.hh" +#include "hb-open-type.hh" +#include "hb-ot-layout-common.hh" -namespace OT { +/* To be removed */ +typedef hb_tag_t hb_ot_layout_baseline_t; -#define NOT_INDEXED ((unsigned int) -1) +namespace OT { /* * BASE -- Baseline @@ -42,30 +44,30 @@ namespace OT { struct BaseCoordFormat1 { - inline int get_coord (void) const { return coordinate; } + hb_position_t get_coord () const { return coordinate; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (likely (c->check_struct (this))); } protected: HBUINT16 format; /* Format identifier--format = 1 */ - HBINT16 coordinate; /* X or Y value, in design units */ + FWORD coordinate; /* X or Y value, in design units */ public: DEFINE_SIZE_STATIC (4); }; struct BaseCoordFormat2 { - inline int get_coord (void) const + hb_position_t get_coord () const { /* TODO */ return coordinate; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); @@ -73,7 +75,7 @@ struct BaseCoordFormat2 protected: HBUINT16 format; /* Format identifier--format = 2 */ - HBINT16 coordinate; /* X or Y value, in design units */ + FWORD coordinate; /* X or Y value, in design units */ GlyphID referenceGlyph; /* Glyph ID of control glyph */ HBUINT16 coordPoint; /* Index of contour point on the * reference glyph */ @@ -83,44 +85,53 @@ struct BaseCoordFormat2 struct BaseCoordFormat3 { - inline int get_coord (void) const + hb_position_t get_coord (hb_font_t *font, + const VariationStore &var_store, + hb_direction_t direction) const { - /* TODO */ - return coordinate; + const Device &device = this+deviceTable; + return coordinate + (HB_DIRECTION_IS_VERTICAL (direction) ? + device.get_y_delta (font, var_store) : + device.get_x_delta (font, var_store)); } - inline bool sanitize (hb_sanitize_context_t *c) const + + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && deviceTable.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + deviceTable.sanitize (c, this))); } protected: - HBUINT16 format; /* Format identifier--format = 3 */ - HBINT16 coordinate; /* X or Y value, in design units */ - OffsetTo deviceTable; /* Offset to Device table for X or - * Y value, from beginning of - * BaseCoord table (may be NULL). */ + HBUINT16 format; /* Format identifier--format = 3 */ + FWORD coordinate; /* X or Y value, in design units */ + OffsetTo + deviceTable; /* Offset to Device table for X or + * Y value, from beginning of + * BaseCoord table (may be NULL). */ public: DEFINE_SIZE_STATIC (6); }; struct BaseCoord { - inline int get_coord (void) const + hb_position_t get_coord (hb_font_t *font, + const VariationStore &var_store, + hb_direction_t direction) const { switch (u.format) { case 1: return u.format1.get_coord (); case 2: return u.format2.get_coord (); - case 3: return u.format3.get_coord (); + case 3: return u.format3.get_coord (font, var_store, direction); default:return 0; } } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - if (!u.format.sanitize (c)) return_trace (false); + if (unlikely (!u.format.sanitize (c))) return_trace (false); switch (u.format) { case 1: return_trace (u.format1.sanitize (c)); case 2: return_trace (u.format2.sanitize (c)); @@ -142,32 +153,40 @@ struct BaseCoord struct FeatMinMaxRecord { - inline int get_min_value (void) const - { return (this+minCoord).get_coord(); } - - inline int get_max_value (void) const - { return (this+maxCoord).get_coord(); } + static int cmp (const void *key_, const void *entry_) + { + hb_tag_t key = * (hb_tag_t *) key_; + const FeatMinMaxRecord &entry = * (const FeatMinMaxRecord *) entry_; + return key < (unsigned int) entry.tag ? -1 : + key > (unsigned int) entry.tag ? 1 : + 0; + } - inline const Tag &get_tag () const - { return tag; } + void get_min_max (const BaseCoord **min, const BaseCoord **max) const + { + if (likely (min)) *min = &(this+minCoord); + if (likely (max)) *max = &(this+maxCoord); + } - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - minCoord.sanitize (c, base) && - maxCoord.sanitize (c, base)); + return_trace (likely (c->check_struct (this) && + minCoord.sanitize (c, this) && + maxCoord.sanitize (c, this))); } protected: - Tag tag; /* 4-byte feature identification tag--must - * match feature tag in FeatureList */ - OffsetTo minCoord; /* Offset to BaseCoord table that defines - * the minimum extent value, from beginning - * of MinMax table (may be NULL) */ - OffsetTo maxCoord; /* Offset to BaseCoord table that defines - * the maximum extent value, from beginning - * of MinMax table (may be NULL) */ + Tag tag; /* 4-byte feature identification tag--must + * match feature tag in FeatureList */ + OffsetTo + minCoord; /* Offset to BaseCoord table that defines + * the minimum extent value, from beginning + * of MinMax table (may be NULL) */ + OffsetTo + maxCoord; /* Offset to BaseCoord table that defines + * the maximum extent value, from beginning + * of MinMax table (may be NULL) */ public: DEFINE_SIZE_STATIC (8); @@ -175,356 +194,269 @@ struct FeatMinMaxRecord struct MinMax { - inline unsigned int get_feature_tag_index (Tag featureTableTag) const - { - /* TODO bsearch */ - unsigned int count = featMinMaxRecords.len; - for (unsigned int i = 0; i < count; i++) + void get_min_max (hb_tag_t feature_tag, + const BaseCoord **min, + const BaseCoord **max) const + { + /* TODO Replace hb_bsearch() with .bsearch(). */ + const FeatMinMaxRecord *minMaxCoord = (const FeatMinMaxRecord *) + hb_bsearch (&feature_tag, featMinMaxRecords.arrayZ, + featMinMaxRecords.len, + FeatMinMaxRecord::static_size, + FeatMinMaxRecord::cmp); + if (minMaxCoord) + minMaxCoord->get_min_max (min, max); + else { - Tag tag = featMinMaxRecords[i].get_tag(); - int cmp = tag.cmp(featureTableTag); - if (cmp == 0) return i; - if (cmp > 0) return NOT_INDEXED; + if (likely (min)) *min = &(this+minCoord); + if (likely (max)) *max = &(this+maxCoord); } - return NOT_INDEXED; - } - - inline int get_min_value (unsigned int featureTableTagIndex) const - { - if (featureTableTagIndex == NOT_INDEXED) - return (this+minCoord).get_coord(); - return featMinMaxRecords[featureTableTagIndex].get_min_value(); - } - - inline int get_max_value (unsigned int featureTableTagIndex) const - { - if (featureTableTagIndex == NOT_INDEXED) - return (this+maxCoord).get_coord(); - return featMinMaxRecords[featureTableTagIndex].get_max_value(); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - minCoord.sanitize (c, this) && - maxCoord.sanitize (c, this) && - featMinMaxRecords.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + minCoord.sanitize (c, this) && + maxCoord.sanitize (c, this) && + featMinMaxRecords.sanitize (c, this))); } protected: - OffsetTo minCoord; /* Offset to BaseCoord table that defines - * minimum extent value, from the beginning - * of MinMax table (may be NULL) */ - OffsetTo maxCoord; /* Offset to BaseCoord table that defines - * maximum extent value, from the beginning - * of MinMax table (may be NULL) */ - ArrayOf - featMinMaxRecords; /* Array of FeatMinMaxRecords, in alphabetical - * order by featureTableTag */ + OffsetTo + minCoord; /* Offset to BaseCoord table that defines + * minimum extent value, from the beginning + * of MinMax table (may be NULL) */ + OffsetTo + maxCoord; /* Offset to BaseCoord table that defines + * maximum extent value, from the beginning + * of MinMax table (may be NULL) */ + SortedArrayOf + featMinMaxRecords; + /* Array of FeatMinMaxRecords, in alphabetical + * order by featureTableTag */ public: DEFINE_SIZE_ARRAY (6, featMinMaxRecords); }; -/* TODO... */ -struct BaseLangSysRecord -{ - inline const Tag& get_tag(void) const - { return baseLangSysTag; } - - inline unsigned int get_feature_tag_index (Tag featureTableTag) const - { return (this+minMax).get_feature_tag_index(featureTableTag); } - - inline int get_min_value (unsigned int featureTableTagIndex) const - { return (this+minMax).get_min_value(featureTableTagIndex); } - - inline int get_max_value (unsigned int featureTableTagIndex) const - { return (this+minMax).get_max_value(featureTableTagIndex); } - - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - minMax.sanitize (c, base)); - } - - protected: - Tag baseLangSysTag; - OffsetTo minMax; - public: - DEFINE_SIZE_STATIC (6); - -}; - struct BaseValues { - inline unsigned int get_default_base_tag_index (void) const - { return defaultIndex; } - - inline int get_base_coord (unsigned int baselineTagIndex) const + const BaseCoord &get_base_coord (int baseline_tag_index) const { - return (this+baseCoords[baselineTagIndex]).get_coord(); + if (baseline_tag_index == -1) baseline_tag_index = defaultIndex; + return this+baseCoords[baseline_tag_index]; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - defaultIndex <= baseCoordCount && - baseCoords.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + baseCoords.sanitize (c, this))); } protected: - Index defaultIndex; - HBUINT16 baseCoordCount; - OffsetArrayOf baseCoords; + Index defaultIndex; /* Index number of default baseline for this + * script — equals index position of baseline tag + * in baselineTags array of the BaseTagList */ + OffsetArrayOf + baseCoords; /* Number of BaseCoord tables defined — should equal + * baseTagCount in the BaseTagList + * + * Array of offsets to BaseCoord tables, from beginning of + * BaseValues table — order matches baselineTags array in + * the BaseTagList */ public: - DEFINE_SIZE_ARRAY (6, baseCoords); - + DEFINE_SIZE_ARRAY (4, baseCoords); }; -struct BaseScript { - - inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const - { - Tag tag; - int cmp; - for (unsigned int i = 0; i < baseLangSysCount; i++) { - tag = baseLangSysRecords[i].get_tag(); - // taking advantage of alphabetical order - cmp = tag.cmp(baseLangSysTag); - if (cmp == 0) return i; - if (cmp > 0) return NOT_INDEXED; - } - return NOT_INDEXED; - } - - inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const - { - if (baseLangSysIndex == NOT_INDEXED) { - if (unlikely(defaultMinMax)) return NOT_INDEXED; - return (this+defaultMinMax).get_feature_tag_index(featureTableTag); - } - if (unlikely(baseLangSysIndex >= baseLangSysCount)) return NOT_INDEXED; - return baseLangSysRecords[baseLangSysIndex].get_feature_tag_index(featureTableTag); - } - - inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - if (baseLangSysIndex == NOT_INDEXED) - return (this+defaultMinMax).get_min_value(featureTableTagIndex); - return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex); - } - - inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const +struct BaseLangSysRecord +{ + static int cmp (const void *key_, const void *entry_) { - if (baseLangSysIndex == NOT_INDEXED) - return (this+defaultMinMax).get_min_value(featureTableTagIndex); - return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex); + hb_tag_t key = * (hb_tag_t *) key_; + const BaseLangSysRecord &entry = * (const BaseLangSysRecord *) entry_; + return key < (unsigned int) entry.baseLangSysTag ? -1 : + key > (unsigned int) entry.baseLangSysTag ? 1 : + 0; } - inline unsigned int get_default_base_tag_index (void) const - { return (this+baseValues).get_default_base_tag_index(); } + const MinMax &get_min_max () const + { return this+minMax; } - inline int get_base_coord (unsigned int baselineTagIndex) const - { return (this+baseValues).get_base_coord(baselineTagIndex); } - - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - baseValues.sanitize (c, this) && - defaultMinMax.sanitize (c, this) && - baseLangSysRecords.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + minMax.sanitize (c, this))); } protected: - OffsetTo baseValues; - OffsetTo defaultMinMax; - HBUINT16 baseLangSysCount; - ArrayOf baseLangSysRecords; - + Tag baseLangSysTag; /* 4-byte language system identification tag */ + OffsetTo + minMax; /* Offset to MinMax table, from beginning + * of BaseScript table */ public: - DEFINE_SIZE_ARRAY (8, baseLangSysRecords); + DEFINE_SIZE_STATIC (6); }; +struct BaseScript +{ + const MinMax &get_min_max (hb_tag_t language_tag) const + { + /* TODO Replace hb_bsearch() with .bsearch(). */ + const BaseLangSysRecord* record = (const BaseLangSysRecord *) + hb_bsearch (&language_tag, baseLangSysRecords.arrayZ, + baseLangSysRecords.len, + BaseLangSysRecord::static_size, + BaseLangSysRecord::cmp); + return record ? record->get_min_max () : this+defaultMinMax; + } -struct BaseScriptRecord { - - inline const Tag& get_tag (void) const - { return baseScriptTag; } - - inline unsigned int get_default_base_tag_index(void) const - { return (this+baseScript).get_default_base_tag_index(); } - - inline int get_base_coord(unsigned int baselineTagIndex) const - { return (this+baseScript).get_base_coord(baselineTagIndex); } - - inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const - { return (this+baseScript).get_lang_tag_index(baseLangSysTag); } - - inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const - { return (this+baseScript).get_feature_tag_index(baseLangSysIndex, featureTableTag); } - - inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { return (this+baseScript).get_max_value(baseLangSysIndex, featureTableTagIndex); } + const BaseCoord &get_base_coord (int baseline_tag_index) const + { return (this+baseValues).get_base_coord (baseline_tag_index); } - inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { return (this+baseScript).get_min_value(baseLangSysIndex, featureTableTagIndex); } + bool is_empty () const { return !baseValues; } - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - baseScript != Null(OffsetTo) && - baseScript.sanitize (c, base)); + return_trace (likely (c->check_struct (this) && + baseValues.sanitize (c, this) && + defaultMinMax.sanitize (c, this) && + baseLangSysRecords.sanitize (c, this))); } protected: - Tag baseScriptTag; - OffsetTo baseScript; + OffsetTo + baseValues; /* Offset to BaseValues table, from beginning + * of BaseScript table (may be NULL) */ + OffsetTo + defaultMinMax; /* Offset to MinMax table, from beginning of + * BaseScript table (may be NULL) */ + SortedArrayOf + baseLangSysRecords; + /* Number of BaseLangSysRecords + * defined — may be zero (0) */ public: - DEFINE_SIZE_STATIC (6); + DEFINE_SIZE_ARRAY (6, baseLangSysRecords); }; -struct BaseScriptList { - - inline unsigned int get_base_script_index (Tag baseScriptTag) const - { - for (unsigned int i = 0; i < baseScriptCount; i++) - if (baseScriptRecords[i].get_tag() == baseScriptTag) - return i; - return NOT_INDEXED; - } - - inline unsigned int get_default_base_tag_index (unsigned int baseScriptIndex) const - { - if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED; - return baseScriptRecords[baseScriptIndex].get_default_base_tag_index(); - } - - inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const - { - return baseScriptRecords[baseScriptIndex].get_base_coord(baselineTagIndex); - } - - inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const - { - if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED; - return baseScriptRecords[baseScriptIndex].get_lang_tag_index(baseLangSysTag); - } - - inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const - { - if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED; - return baseScriptRecords[baseScriptIndex].get_feature_tag_index(baseLangSysIndex, featureTableTag); - } - - inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const +struct BaseScriptList; +struct BaseScriptRecord +{ + static int cmp (const void *key_, const void *entry_) { - return baseScriptRecords[baseScriptIndex].get_max_value(baseLangSysIndex, featureTableTagIndex); + hb_tag_t key = * (hb_tag_t *) key_; + const BaseScriptRecord &entry = * (const BaseScriptRecord *) entry_; + return key < (unsigned int) entry.baseScriptTag ? -1 : + key > (unsigned int) entry.baseScriptTag ? 1 : + 0; } - inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - return baseScriptRecords[baseScriptIndex].get_min_value(baseLangSysIndex, featureTableTagIndex); - } + const BaseScript &get_base_script (const BaseScriptList *list) const + { return list+baseScript; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - baseScriptRecords.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + baseScript.sanitize (c, base))); } protected: - HBUINT16 baseScriptCount; - ArrayOf baseScriptRecords; + Tag baseScriptTag; /* 4-byte script identification tag */ + OffsetTo + baseScript; /* Offset to BaseScript table, from beginning + * of BaseScriptList */ public: - DEFINE_SIZE_ARRAY (4, baseScriptRecords); - + DEFINE_SIZE_STATIC (6); }; -struct BaseTagList +struct BaseScriptList { + const BaseScriptRecord *find_record (hb_tag_t script) const + { + /* TODO Replace hb_bsearch() with .bsearch(). */ + return (const BaseScriptRecord *) hb_bsearch (&script, baseScriptRecords.arrayZ, + baseScriptRecords.len, + BaseScriptRecord::static_size, + BaseScriptRecord::cmp); + } - inline unsigned int get_tag_index(Tag baselineTag) const + /* TODO: Or client should handle fallback? */ + const BaseScript &get_base_script (hb_tag_t script) const { - for (unsigned int i = 0; i < baseTagCount; i++) - if (baselineTags[i] == baselineTag) - return i; - return NOT_INDEXED; + const BaseScriptRecord *record = find_record (script); + if (!record) record = find_record ((hb_script_t) HB_TAG ('D','F','L','T')); + + return record ? record->get_base_script (this) : Null (BaseScript); } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); + return_trace (c->check_struct (this) && + baseScriptRecords.sanitize (c, this)); } protected: - HBUINT16 baseTagCount; - SortedArrayOf baselineTags; + SortedArrayOf + baseScriptRecords; public: - DEFINE_SIZE_ARRAY (4, baselineTags); + DEFINE_SIZE_ARRAY (2, baseScriptRecords); }; struct Axis { - - inline unsigned int get_base_tag_index(Tag baselineTag) const + bool get_baseline (hb_ot_layout_baseline_t baseline, + hb_tag_t script_tag, + hb_tag_t language_tag, + const BaseCoord **coord) const { - if (unlikely(baseTagList == Null(OffsetTo))) return NOT_INDEXED; - return (this+baseTagList).get_tag_index(baselineTag); - } + const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag); + if (base_script.is_empty ()) return false; - inline unsigned int get_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const - { - if (unlikely(baseScriptList == Null(OffsetTo))) return NOT_INDEXED; - return (this+baseScriptList).get_default_base_tag_index(baseScriptIndex); - } - - inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const - { - return (this+baseScriptList).get_base_coord(baseScriptIndex, baselineTagIndex); - } + if (likely (coord)) *coord = &base_script.get_base_coord ((this+baseTagList).bsearch (baseline)); - inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const - { - if (unlikely(baseScriptList == Null(OffsetTo))) return NOT_INDEXED; - return (this+baseScriptList).get_lang_tag_index(baseScriptIndex, baseLangSysTag); + return true; } - inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const + bool get_min_max (hb_tag_t script_tag, + hb_tag_t language_tag, + hb_tag_t feature_tag, + const BaseCoord **min_coord, + const BaseCoord **max_coord) const { - if (unlikely(baseScriptList == Null(OffsetTo))) return NOT_INDEXED; - return (this+baseScriptList).get_feature_tag_index(baseScriptIndex, baseLangSysIndex, featureTableTag); - } + const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag); + if (base_script.is_empty ()) return false; - inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - return (this+baseScriptList).get_max_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex); - } + base_script.get_min_max (language_tag).get_min_max (feature_tag, min_coord, max_coord); - inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - return (this+baseScriptList).get_min_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + return true; } - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - baseTagList.sanitize (c, this) && - baseScriptList.sanitize (c, this)); + return_trace (likely (c->check_struct (this) && + (this+baseTagList).sanitize (c) && + (this+baseScriptList).sanitize (c))); } protected: - OffsetTo baseTagList; - OffsetTo baseScriptList; + OffsetTo > + baseTagList; /* Offset to BaseTagList table, from beginning + * of Axis table (may be NULL) + * Array of 4-byte baseline identification tags — must + * be in alphabetical order */ + OffsetTo + baseScriptList; /* Offset to BaseScriptList table, from beginning + * of Axis table + * Array of BaseScriptRecords, in alphabetical order + * by baseScriptTag */ public: DEFINE_SIZE_STATIC (4); @@ -532,119 +464,72 @@ struct Axis struct BASE { - static const hb_tag_t tableTag = HB_OT_TAG_BASE; - - inline bool has_vert_axis(void) - { return vertAxis != Null(OffsetTo); } + static constexpr hb_tag_t tableTag = HB_OT_TAG_BASE; - inline bool has_horiz_axis(void) - { return horizAxis != Null(OffsetTo); } + const Axis &get_axis (hb_direction_t direction) const + { return HB_DIRECTION_IS_VERTICAL (direction) ? this+vAxis : this+hAxis; } - // horizontal axis base coords: + const VariationStore &get_var_store () const + { return version.to_int () < 0x00010001u ? Null (VariationStore) : this+varStore; } - inline unsigned int get_horiz_base_tag_index(Tag baselineTag) const + bool get_baseline (hb_font_t *font, + hb_ot_layout_baseline_t baseline, + hb_direction_t direction, + hb_tag_t script_tag, + hb_tag_t language_tag, + hb_position_t *base) const { - if (unlikely(horizAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+horizAxis).get_base_tag_index(baselineTag); - } + const BaseCoord *base_coord; + if (!get_axis (direction).get_baseline (baseline, script_tag, language_tag, &base_coord)) + return false; - inline unsigned int get_horiz_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const - { - if (unlikely(horizAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+horizAxis).get_default_base_tag_index_for_script_index(baseScriptIndex); + if (likely (base && base_coord)) *base = base_coord->get_coord (font, + get_var_store (), + direction); + return true; } - inline int get_horiz_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const + /* TODO: Expose this separately sometime? */ + bool get_min_max (hb_font_t *font, + hb_direction_t direction, + hb_tag_t script_tag, + hb_tag_t language_tag, + hb_tag_t feature_tag, + hb_position_t *min, + hb_position_t *max) { - return (this+horizAxis).get_base_coord(baseScriptIndex, baselineTagIndex); - } - - // vertical axis base coords: - - inline unsigned int get_vert_base_tag_index(Tag baselineTag) const - { - if (unlikely(vertAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+vertAxis).get_base_tag_index(baselineTag); - } - - inline unsigned int get_vert_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const - { - if (unlikely(vertAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+vertAxis).get_default_base_tag_index_for_script_index(baseScriptIndex); - } - - inline int get_vert_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const - { - return (this+vertAxis).get_base_coord(baseScriptIndex, baselineTagIndex); - } - - // horizontal axis min/max coords: - - inline unsigned int get_horiz_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const - { - if (unlikely(horizAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+horizAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag); - } - - inline unsigned int get_horiz_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const - { - if (unlikely(horizAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+horizAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag); - } + const BaseCoord *min_coord, *max_coord; + if (!get_axis (direction).get_min_max (script_tag, language_tag, feature_tag, + &min_coord, &max_coord)) + return false; - inline int get_horiz_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - return (this+horizAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); - } - - inline int get_horiz_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - return (this+horizAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); - } - - // vertical axis min/max coords: - - inline unsigned int get_vert_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const - { - if (unlikely(vertAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+vertAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag); - } - - inline unsigned int get_vert_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const - { - if (unlikely(vertAxis == Null(OffsetTo))) return NOT_INDEXED; - return (this+vertAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag); - } - - inline int get_vert_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - return (this+vertAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); + const VariationStore &var_store = get_var_store (); + if (likely (min && min_coord)) *min = min_coord->get_coord (font, var_store, direction); + if (likely (max && max_coord)) *max = max_coord->get_coord (font, var_store, direction); + return true; } - inline int get_vert_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const - { - return (this+vertAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex); - } - - inline bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && - likely (version.major == 1) && - horizAxis.sanitize (c, this) && - vertAxis.sanitize (c, this) && - (version.to_int () < 0x00010001u || varStore.sanitize (c, this))); + return_trace (likely (c->check_struct (this) && + likely (version.major == 1) && + hAxis.sanitize (c, this) && + vAxis.sanitize (c, this) && + (version.to_int () < 0x00010001u || varStore.sanitize (c, this)))); } protected: - FixedVersion<> version; - OffsetTo horizAxis; - OffsetTo vertAxis; + FixedVersion<>version; /* Version of the BASE table */ + OffsetTohAxis; /* Offset to horizontal Axis table, from beginning + * of BASE table (may be NULL) */ + OffsetTovAxis; /* Offset to vertical Axis table, from beginning + * of BASE table (may be NULL) */ LOffsetTo - varStore; /* Offset to the table of Item Variation - * Store--from beginning of BASE - * header (may be NULL). Introduced - * in version 0x00010001. */ + varStore; /* Offset to the table of Item Variation + * Store--from beginning of BASE + * header (may be NULL). Introduced + * in version 0x00010001. */ public: DEFINE_SIZE_MIN (8); }; diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh deleted file mode 100644 index 763ea92..0000000 --- a/src/hb-ot-layout-common-private.hh +++ /dev/null @@ -1,1773 +0,0 @@ -/* - * Copyright © 2007,2008,2009 Red Hat, Inc. - * Copyright © 2010,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. - * - * Red Hat Author(s): Behdad Esfahbod - * Google Author(s): Behdad Esfahbod - */ - -#ifndef HB_OT_LAYOUT_COMMON_PRIVATE_HH -#define HB_OT_LAYOUT_COMMON_PRIVATE_HH - -#include "hb-private.hh" -#include "hb-debug.hh" -#include "hb-ot-layout-private.hh" -#include "hb-open-type-private.hh" -#include "hb-set-private.hh" - - -#ifndef HB_MAX_NESTING_LEVEL -#define HB_MAX_NESTING_LEVEL 6 -#endif -#ifndef HB_MAX_CONTEXT_LENGTH -#define HB_MAX_CONTEXT_LENGTH 64 -#endif - - -namespace OT { - - -#define NOT_COVERED ((unsigned int) -1) - - - -/* - * - * OpenType Layout Common Table Formats - * - */ - - -/* - * Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList - */ - -template -struct Record -{ - inline int cmp (hb_tag_t a) const { - return tag.cmp (a); - } - - struct sanitize_closure_t { - hb_tag_t tag; - const void *list_base; - }; - inline bool sanitize (hb_sanitize_context_t *c, const void *base) const - { - TRACE_SANITIZE (this); - const sanitize_closure_t closure = {tag, base}; - return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure)); - } - - Tag tag; /* 4-byte Tag identifier */ - OffsetTo - offset; /* Offset from beginning of object holding - * the Record */ - public: - DEFINE_SIZE_STATIC (6); -}; - -template -struct RecordArrayOf : SortedArrayOf > { - inline const Tag& get_tag (unsigned int i) const - { - /* We cheat slightly and don't define separate Null objects - * for Record types. Instead, we return the correct Null(Tag) - * here. */ - if (unlikely (i >= this->len)) return Null(Tag); - return (*this)[i].tag; - } - inline unsigned int get_tags (unsigned int start_offset, - unsigned int *record_count /* IN/OUT */, - hb_tag_t *record_tags /* OUT */) const - { - if (record_count) { - const Record *arr = this->sub_array (start_offset, record_count); - unsigned int count = *record_count; - for (unsigned int i = 0; i < count; i++) - record_tags[i] = arr[i].tag; - } - return this->len; - } - inline bool find_index (hb_tag_t tag, unsigned int *index) const - { - /* If we want to allow non-sorted data, we can lsearch(). */ - int i = this->/*lsearch*/bsearch (tag); - if (i != -1) { - if (index) *index = i; - return true; - } else { - if (index) *index = Index::NOT_FOUND_INDEX; - return false; - } - } -}; - -template -struct RecordListOf : RecordArrayOf -{ - inline const Type& operator [] (unsigned int i) const - { return this+RecordArrayOf::operator [](i).offset; } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (RecordArrayOf::sanitize (c, this)); - } -}; - - -struct RangeRecord -{ - inline int cmp (hb_codepoint_t g) const { - return g < start ? -1 : g <= end ? 0 : +1 ; - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this)); - } - - inline bool intersects (const hb_set_t *glyphs) const { - return glyphs->intersects (start, end); - } - - template - inline bool add_coverage (set_t *glyphs) const { - return glyphs->add_range (start, end); - } - - GlyphID start; /* First GlyphID in the range */ - GlyphID end; /* Last GlyphID in the range */ - HBUINT16 value; /* Value */ - public: - DEFINE_SIZE_STATIC (6); -}; -DEFINE_NULL_DATA (OT, RangeRecord, "\000\001"); - - -struct IndexArray : ArrayOf -{ - inline unsigned int get_indexes (unsigned int start_offset, - unsigned int *_count /* IN/OUT */, - unsigned int *_indexes /* OUT */) const - { - if (_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]; - } - return this->len; - } -}; - - -struct Script; -struct LangSys; -struct Feature; - - -struct LangSys -{ - inline unsigned int get_feature_count (void) const - { return featureIndex.len; } - inline hb_tag_t get_feature_index (unsigned int i) const - { return featureIndex[i]; } - inline unsigned int get_feature_indexes (unsigned int start_offset, - unsigned int *feature_count /* IN/OUT */, - unsigned int *feature_indexes /* OUT */) const - { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); } - - inline bool has_required_feature (void) const { return reqFeatureIndex != 0xFFFFu; } - inline unsigned int get_required_feature_index (void) const - { - if (reqFeatureIndex == 0xFFFFu) - return Index::NOT_FOUND_INDEX; - return reqFeatureIndex;; - } - - inline bool sanitize (hb_sanitize_context_t *c, - const Record::sanitize_closure_t * = nullptr) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && featureIndex.sanitize (c)); - } - - Offset16 lookupOrderZ; /* = Null (reserved for an offset to a - * reordering table) */ - HBUINT16 reqFeatureIndex;/* Index of a feature required for this - * language system--if no required features - * = 0xFFFFu */ - IndexArray featureIndex; /* Array of indices into the FeatureList */ - public: - DEFINE_SIZE_ARRAY (6, featureIndex); -}; -DEFINE_NULL_DATA (OT, LangSys, "\0\0\xFF\xFF"); - - -struct Script -{ - inline unsigned int get_lang_sys_count (void) const - { return langSys.len; } - inline const Tag& get_lang_sys_tag (unsigned int i) const - { return langSys.get_tag (i); } - inline unsigned int get_lang_sys_tags (unsigned int start_offset, - unsigned int *lang_sys_count /* IN/OUT */, - hb_tag_t *lang_sys_tags /* OUT */) const - { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); } - inline const LangSys& get_lang_sys (unsigned int i) const - { - if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys (); - return this+langSys[i].offset; - } - inline bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const - { return langSys.find_index (tag, index); } - - inline bool has_default_lang_sys (void) const { return defaultLangSys != 0; } - inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; } - - inline bool sanitize (hb_sanitize_context_t *c, - const Record