From 6ae5e1ade8a7cf7b6f970f0d1b124ab8d90b905b Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Thu, 23 Nov 2023 23:35:03 +0100 Subject: [PATCH] Core: Allow Optional Use of Harfbuzz and FriBiDi Harfbuzz and FriBiDi are included in our external libraries for all platforms. This PR adds the glue to make them available as optional build components (off by default). Pull Request: https://projects.blender.org/blender/blender/pulls/114947 --- CMakeLists.txt | 4 ++ build_files/cmake/Modules/FindFribidi.cmake | 54 +++++++++++++++++++ build_files/cmake/Modules/FindHarfbuzz.cmake | 54 +++++++++++++++++++ .../cmake/platform/platform_apple.cmake | 8 +++ .../cmake/platform/platform_unix.cmake | 8 +++ .../cmake/platform/platform_win32.cmake | 18 +++++++ 6 files changed, 146 insertions(+) create mode 100644 build_files/cmake/Modules/FindFribidi.cmake create mode 100644 build_files/cmake/Modules/FindHarfbuzz.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index df9beb74bfe..214d3b34814 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -419,6 +419,10 @@ option(WITH_MATERIALX "Enable MaterialX Support" ON) # Hydra render engine option(WITH_HYDRA "Enable Hydra render engine" ON) +# RTL Languages, Complex Shaping, OpenType Features +option(WITH_FRIBIDI "Enable features relying on fribidi" OFF) +option(WITH_HARFBUZZ "Enable features relying on harfbuzz" OFF) + # 3D format support # Disable opencollada when we don't have precompiled libs option(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org)" ON) diff --git a/build_files/cmake/Modules/FindFribidi.cmake b/build_files/cmake/Modules/FindFribidi.cmake new file mode 100644 index 00000000000..f6f8d214c2b --- /dev/null +++ b/build_files/cmake/Modules/FindFribidi.cmake @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: BSD-3-Clause +# - Find Fribidi library +# Find the native fribidi includes and library +# This module defines +# LIBFRIBIDI_INCLUDE_DIRS, where to find hb.h, Set when +# LIBFRIBIDI_INCLUDE_DIR is found. +# LIBFRIBIDI_LIBRARIES, libraries to link against to use fribidi. +# LIBFRIBIDI_ROOT_DIR, The base directory to search for Fribidi. +# This can also be an environment variable. +# FRIBIDI_FOUND, If false, do not try to use Fribidi. +# +# also defined, but not for general use are +# LIBFRIBIDI_LIBRARY, where to find the Fribidi library. + +# If LIBFRIBIDI_ROOT_DIR was defined in the environment, use it. +IF(NOT LIBFRIBIDI_ROOT_DIR AND NOT $ENV{LIBFRIBIDI_ROOT_DIR} STREQUAL "") + SET(LIBFRIBIDI_ROOT_DIR $ENV{LIBFRIBIDI_ROOT_DIR}) +ENDIF() + +SET(_fribidi_SEARCH_DIRS + ${LIBFRIBIDI_ROOT_DIR} +) + +FIND_PATH(LIBFRIBIDI_INCLUDE_DIR fribidi/fribidi.h + HINTS + ${_fribidi_SEARCH_DIRS} + PATH_SUFFIXES + include +) + +FIND_LIBRARY(LIBFRIBIDI_LIBRARY + NAMES + fribidi + HINTS + ${_fribidi_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +# handle the QUIETLY and REQUIRED arguments and set FRIBIDI_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Fribidi DEFAULT_MSG + LIBFRIBIDI_LIBRARY LIBFRIBIDI_INCLUDE_DIR) + +IF(FRIBIDI_FOUND) + SET(LIBFRIBIDI_LIBRARIES ${LIBFRIBIDI_LIBRARY}) + SET(LIBFRIBIDI_INCLUDE_DIRS ${LIBFRIBIDI_INCLUDE_DIR}) +ENDIF() + +MARK_AS_ADVANCED( + LIBFRIBIDI_INCLUDE_DIR + LIBFRIBIDI_LIBRARY +) diff --git a/build_files/cmake/Modules/FindHarfbuzz.cmake b/build_files/cmake/Modules/FindHarfbuzz.cmake new file mode 100644 index 00000000000..174cc1478de --- /dev/null +++ b/build_files/cmake/Modules/FindHarfbuzz.cmake @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: BSD-3-Clause +# - Find Harfbuzz library +# Find the native harfbuzz includes and library +# This module defines +# LIBHARFBUZZ_INCLUDE_DIRS, where to find hb.h, Set when +# LIBHARFBUZZ_INCLUDE_DIR is found. +# LIBHARFBUZZ_LIBRARIES, libraries to link against to use harfbuzz. +# LIBHARFBUZZ_ROOT_DIR, The base directory to search for Harfbuzz. +# This can also be an environment variable. +# HARFBUZZ_FOUND, If false, do not try to use Harfbuzz. +# +# also defined, but not for general use are +# LIBHARFBUZZ_LIBRARY, where to find the Harfbuzz library. + +# If LIBHARFBUZZ_ROOT_DIR was defined in the environment, use it. +IF(NOT LIBHARFBUZZ_ROOT_DIR AND NOT $ENV{LIBHARFBUZZ_ROOT_DIR} STREQUAL "") + SET(LIBHARFBUZZ_ROOT_DIR $ENV{LIBHARFBUZZ_ROOT_DIR}) +ENDIF() + +SET(_harfbuzz_SEARCH_DIRS + ${LIBHARFBUZZ_ROOT_DIR} +) + +FIND_PATH(LIBHARFBUZZ_INCLUDE_DIR harfbuzz/hb.h + HINTS + ${_harfbuzz_SEARCH_DIRS} + PATH_SUFFIXES + include +) + +FIND_LIBRARY(LIBHARFBUZZ_LIBRARY + NAMES + harfbuzz + HINTS + ${_harfbuzz_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + ) + +# handle the QUIETLY and REQUIRED arguments and set HARFBUZZ_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Harfbuzz DEFAULT_MSG + LIBHARFBUZZ_LIBRARY LIBHARFBUZZ_INCLUDE_DIR) + +IF(HARFBUZZ_FOUND) + SET(LIBHARFBUZZ_LIBRARIES ${LIBHARFBUZZ_LIBRARY}) + SET(LIBHARFBUZZ_INCLUDE_DIRS ${LIBHARFBUZZ_INCLUDE_DIR}) +ENDIF() + +MARK_AS_ADVANCED( + LIBHARFBUZZ_INCLUDE_DIR + LIBHARFBUZZ_LIBRARY +) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 98f463733f1..809d0888166 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -146,6 +146,14 @@ set(BROTLI_LIBRARIES ${LIBDIR}/brotli/lib/libbrotlidec-static.a ) +if(WITH_HARFBUZZ) + find_package(Harfbuzz) +endif() + +if(WITH_FRIBIDI) + find_package(Fribidi) +endif() + if(WITH_IMAGE_OPENEXR) find_package(OpenEXR) endif() diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 71e09e228ce..46786a48970 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -173,6 +173,14 @@ if(NOT WITH_SYSTEM_FREETYPE) check_freetype_for_brotli() endif() +if(WITH_HARFBUZZ) + find_package(Harfbuzz) +endif() + +if(WITH_FRIBIDI) + find_package(Fribidi) +endif() + if(WITH_PYTHON) # This could be used, see: D14954 for details. # `find_package(PythonLibs)` diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 84c3531d244..9e334050c5e 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -374,6 +374,24 @@ set(BROTLI_LIBRARIES windows_find_package(Freetype REQUIRED) +if(WITH_HARFBUZZ) + windows_find_package(Harfbuzz) + if(NOT Harfbuzz_FOUND) + set(LIBHARFBUZZ_INCLUDE_DIRS ${LIBDIR}/harfbuzz/include) + set(LIBHARFBUZZ_LIBRARIES optimized ${LIBDIR}/harfbuzz/lib/libharfbuzz.lib debug ${LIBDIR}/harfbuzz/lib/libharfbuzz_d.lib) + set(Harfbuzz_FOUND ON) + endif() +endif() + +if(WITH_FRIBIDI) + windows_find_package(Fribidi) + if(NOT Fribidi_FOUND) + set(LIBFRIBIDI_INCLUDE_DIRS ${LIBDIR}/fribidi/include) + set(LIBFRIBIDI_LIBRARIES ${LIBDIR}/fribidi/lib/libfribidi.lib) + set(Fribidi_FOUND ON) + endif() +endif() + if(WITH_FFTW3) set(FFTW3 ${LIBDIR}/fftw3) if(EXISTS ${FFTW3}/lib/libfftw3-3.lib) # 3.6 libraries