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