implement text rendering without msdfgen library

This commit is contained in:
ohyzha
2024-08-05 18:25:19 +03:00
parent 62a0e84634
commit afccf5dee0
10 changed files with 302 additions and 150 deletions

View File

@@ -1,96 +1,98 @@
include(FetchContent)
if(WIN32 OR UNIX OR APPLE OR IOS)
include(FetchContent)
if(NOT DEFINED MSDFGEN_REPO)
set(MSDFGEN_REPO https://github.com/Chlumsky/msdfgen.git)
endif ()
if(NOT DEFINED MSDFGEN_REPO)
set(MSDFGEN_REPO https://github.com/Chlumsky/msdfgen.git)
endif ()
if(NOT DEFINED MSDFGEN_ATRLAS_REPO)
set(MSDFGEN_ATRLAS_REPO https://github.com/Chlumsky/msdf-atlas-gen.git)
endif()
if(NOT DEFINED MSDFGEN_ATRLAS_REPO)
set(MSDFGEN_ATRLAS_REPO https://github.com/Chlumsky/msdf-atlas-gen.git)
endif()
if(NOT DEFINED VCPKG_REPO)
set(VCPKG_REPO https://github.com/microsoft/vcpkg.git)
endif()
if(NOT DEFINED VCPKG_REPO)
set(VCPKG_REPO https://github.com/microsoft/vcpkg.git)
endif()
set(VCPKG_SRC_DIR "${CMAKE_BINARY_DIR}/_deps/vcpkg-src" CACHE INTERNAL "vcpkg source dir")
if (NOT EXISTS ${VCPKG_SRC_DIR} OR VCPKG_EXECUTABLE STREQUAL "" OR NOT DEFINED VCPKG_EXECUTABLE)
message("Cloning vcpkg...")
FetchContent_Declare(
vcpkg
EXCLUDE_FROM_ALL
GIT_REPOSITORY ${VCPKG_REPO}
GIT_TAG master
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(vcpkg)
if (WIN32)
execute_process(COMMAND "${VCPKG_SRC_DIR}/bootstrap-vcpkg.bat")
set(VCPKG_EXECUTABLE "${VCPKG_SRC_DIR}/vcpkg.exe" CACHE INTERNAL "vcpkg executable")
else()
execute_process(COMMAND bash "${VCPKG_SRC_DIR}/bootstrap-vcpkg.sh")
set(VCPKG_EXECUTABLE "${VCPKG_SRC_DIR}/vcpkg" CACHE INTERNAL "vcpkg executable")
endif()
endif()
if (WIN32)
set(TRIPLET x64-windows-static-md-release CACHE INTERNAL "triplet")
elseif(UNIX AND NOT APPLE)
set(TRIPLET x64-linux CACHE INTERNAL "triplet")
elseif(APPLE AND NOT IOS)
set(TRIPLET arm64-osx CACHE INTERNAL "triplet")
elseif(IOS)
set(TRIPLET arm64-ios CACHE INTERNAL "triplet")
endif()
execute_process(COMMAND ${VCPKG_EXECUTABLE} install freetype:${TRIPLET} libpng:${TRIPLET})
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_BINARY_DIR}/_deps/vcpkg-src/scripts/buildsystems/vcpkg.cmake" CACHE STRING "cmake toolchain")
include("${VCPKG_SRC_DIR}/scripts/buildsystems/vcpkg.cmake")
list(APPEND CMAKE_PREFIX_PATH "${VCPKG_SRC_DIR}/installed/${TRIPLET}/lib")
list(APPEND CMAKE_PREFIX_PATH "${VCPKG_SRC_DIR}/installed/${TRIPLET}/include")
set(MSDFGEN_DISABLE_SVG TRUE CACHE INTERNAL "disable msdfgen svg")
set(MSDFGEN_USE_SKIA OFF CACHE BOOL "use skia" FORCE)
set(MSDF_ATLAS_USE_SKIA OFF CACHE BOOL "use skia" FORCE)
set(MSDF_ATLAS_MSDFGEN_EXTERNAL ON CACHE BOOL "do not build msdfgen submodule" FORCE)
set(MSDFGEN_DYNAMIC_RUNTIME ON CACHE BOOL "msvc dynamic runtime" FORCE)
set(MSDF_ATLAS_DYNAMIC_RUNTIME ON CACHE BOOL "msvc dynamic runtime" FORCE)
set(VCPKG_SRC_DIR "${CMAKE_BINARY_DIR}/_deps/vcpkg-src" CACHE INTERNAL "vcpkg source dir")
if (NOT EXISTS ${VCPKG_SRC_DIR} OR VCPKG_EXECUTABLE STREQUAL "" OR NOT DEFINED VCPKG_EXECUTABLE)
message("Cloning vcpkg...")
FetchContent_Declare(
vcpkg
msdfgen
EXCLUDE_FROM_ALL
GIT_REPOSITORY ${VCPKG_REPO}
GIT_REPOSITORY ${MSDFGEN_REPO}
GIT_TAG v1.12
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(msdfgen)
FetchContent_Declare(
msdfgen_atlas
EXCLUDE_FROM_ALL
GIT_REPOSITORY ${MSDFGEN_ATRLAS_REPO}
GIT_TAG master
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(vcpkg)
if (WIN32)
execute_process(COMMAND "${VCPKG_SRC_DIR}/bootstrap-vcpkg.bat")
set(VCPKG_EXECUTABLE "${VCPKG_SRC_DIR}/vcpkg.exe" CACHE INTERNAL "vcpkg executable")
else()
execute_process(COMMAND bash "${VCPKG_SRC_DIR}/bootstrap-vcpkg.sh")
set(VCPKG_EXECUTABLE "${VCPKG_SRC_DIR}/vcpkg" CACHE INTERNAL "vcpkg executable")
endif()
FetchContent_MakeAvailable(msdfgen_atlas)
endif()
if (WIN32)
set(TRIPLET x64-windows-static-md-release CACHE INTERNAL "triplet")
elseif(UNIX AND NOT APPLE)
set(TRIPLET x64-linux CACHE INTERNAL "triplet")
elseif(APPLE AND NOT IOS)
set(TRIPLET arm64-osx CACHE INTERNAL "triplet")
elseif(IOS)
set(TRIPLET arm64-ios CACHE INTERNAL "triplet")
else()
message(FATAL_ERROR "Unknown OS, can't build msdfgen")
endif()
execute_process(COMMAND ${VCPKG_EXECUTABLE} install freetype:${TRIPLET} libpng:${TRIPLET})
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_BINARY_DIR}/_deps/vcpkg-src/scripts/buildsystems/vcpkg.cmake" CACHE STRING "cmake toolchain")
include("${VCPKG_SRC_DIR}/scripts/buildsystems/vcpkg.cmake")
list(APPEND CMAKE_PREFIX_PATH "${VCPKG_SRC_DIR}/installed/${TRIPLET}/lib")
list(APPEND CMAKE_PREFIX_PATH "${VCPKG_SRC_DIR}/installed/${TRIPLET}/include")
set(MSDFGEN_DISABLE_SVG TRUE CACHE INTERNAL "disable msdfgen svg")
set(MSDFGEN_USE_SKIA OFF CACHE BOOL "use skia" FORCE)
set(MSDF_ATLAS_USE_SKIA OFF CACHE BOOL "use skia" FORCE)
set(MSDF_ATLAS_MSDFGEN_EXTERNAL ON CACHE BOOL "do not build msdfgen submodule" FORCE)
set(MSDFGEN_DYNAMIC_RUNTIME ON CACHE BOOL "msvc dynamic runtime" FORCE)
set(MSDF_ATLAS_DYNAMIC_RUNTIME ON CACHE BOOL "msvc dynamic runtime" FORCE)
FetchContent_Declare(
msdfgen
EXCLUDE_FROM_ALL
GIT_REPOSITORY ${MSDFGEN_REPO}
GIT_TAG v1.12
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(msdfgen)
FetchContent_Declare(
msdfgen_atlas
EXCLUDE_FROM_ALL
GIT_REPOSITORY ${MSDFGEN_ATRLAS_REPO}
GIT_TAG master
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(msdfgen_atlas)
function(LinkMsdf TARGET)
if(WIN32)
set(STATIC_LIB_EXT "lib")
set(freetype_lib_name "freetype")
else()
set(STATIC_LIB_EXT "a")
set(freetype_lib_name "libfreetype")
endif()
# link freetype first to fix linkage issues on linux
target_link_libraries(${TARGET} PUBLIC "${VCPKG_SRC_DIR}/installed/${TRIPLET}/lib/${freetype_lib_name}.${STATIC_LIB_EXT}")
file(GLOB installed_libs "${VCPKG_SRC_DIR}/installed/${TRIPLET}/lib/*.${STATIC_LIB_EXT}")
foreach(lib ${installed_libs})
get_filename_component(libname ${lib} NAME_WE)
if (NOT ${libname} STREQUAL ${freetype_lib_name})
target_link_libraries(${TARGET} PUBLIC ${lib})
if (WIN32 OR UNIX OR APPLE OR IOS)
target_link_libraries(${TARGET} PRIVATE msdfgen::msdfgen msdfgen::msdfgen-ext msdf-atlas-gen)
if(WIN32)
set(STATIC_LIB_EXT "lib")
set(freetype_lib_name "freetype")
else()
set(STATIC_LIB_EXT "a")
set(freetype_lib_name "libfreetype")
endif()
endforeach()
# link freetype first to fix linkage issues on linux
target_link_libraries(${TARGET} PUBLIC "${VCPKG_SRC_DIR}/installed/${TRIPLET}/lib/${freetype_lib_name}.${STATIC_LIB_EXT}")
file(GLOB installed_libs "${VCPKG_SRC_DIR}/installed/${TRIPLET}/lib/*.${STATIC_LIB_EXT}")
foreach(lib ${installed_libs})
get_filename_component(libname ${lib} NAME_WE)
if (NOT ${libname} STREQUAL ${freetype_lib_name})
target_link_libraries(${TARGET} PUBLIC ${lib})
endif()
endforeach()
endif()
endfunction()