From 6932b35c002213a7668e1a4bab2e6af4a53bd7e2 Mon Sep 17 00:00:00 2001 From: Chlumsky Date: Fri, 20 Jan 2023 21:58:52 +0100 Subject: [PATCH] Build configuration overhaul, vcpkg dependency management --- .gitattributes | 1 + .gitignore | 22 +- CHANGELOG.md | 18 ++ CMakeLists.txt | 187 +++++++++++-- LICENSE.txt | 2 +- Makefile | 4 - README.md | 5 +- artery-font-format | 2 +- cmake/msdf-atlas-gen-config.cmake.in | 18 ++ cmake/version.cmake | 19 ++ msdf-atlas-gen.aps | Bin 35252 -> 0 bytes msdf-atlas-gen.rc | Bin 5274 -> 4676 bytes msdf-atlas-gen.sln | 61 ----- msdf-atlas-gen.vcxproj | 374 -------------------------- msdf-atlas-gen.vcxproj.filters | 184 ------------- msdf-atlas-gen/Charset.h | 2 +- msdf-atlas-gen/artery-font-export.cpp | 18 +- msdf-atlas-gen/image-encode.cpp | 94 +++++++ msdf-atlas-gen/main.cpp | 21 +- msdf-atlas-gen/msdf-atlas-gen.h | 12 +- msdfgen | 2 +- resource.h | Bin 916 -> 1336 bytes vcpkg.json | 25 ++ 23 files changed, 388 insertions(+), 683 deletions(-) create mode 100644 .gitattributes delete mode 100644 Makefile create mode 100644 cmake/msdf-atlas-gen-config.cmake.in create mode 100644 cmake/version.cmake delete mode 100644 msdf-atlas-gen.aps delete mode 100644 msdf-atlas-gen.sln delete mode 100644 msdf-atlas-gen.vcxproj delete mode 100644 msdf-atlas-gen.vcxproj.filters create mode 100644 vcpkg.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/.gitignore b/.gitignore index f1f1ac1..74e81a5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,15 @@ -Debug/ -Release/ -Debug Library/ -Release Library/ -x86/ -x64/ +/build/ +/Debug/ +/Release/ +/Debug Library/ +/Release Library/ +/x86/ +/x64/ +.vs/ +.vscode/ +.DS_Store *.exe +*.zip *.user *.sdf *.pdb @@ -13,9 +18,8 @@ x64/ *.suo *.VC.opendb *.VC.db -bin/msdf-atlas-gen -bin/*.lib +/bin/*.lib +/bin/msdf-atlas-gen output.png out/ -build/ /cmake-gen.bat diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d4480..08b970e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,22 @@ +## Version 1.3 (forthcoming) + +- Updated to MSDFgen 1.10 +- Switched to vcpkg as the primary dependency management system +- Removed Visual Studio solution and Makefile - now has to be generated by CMake +- CMake configuration overhaul, added installation configuration +- Switched to libpng as the primary PNG file encoder +- Fixed a bug that prevented glyph 0 to be specified in a glyphset + +### Version 1.2.2 (2021-09-06) + +- CMake support +- Conan package manager support + +### Version 1.2.1 (2021-07-09) + +- Updated to MSDFgen 1.9.1 + ## Version 1.2 (2021-05-29) - Updated to MSDFgen 1.9. diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a3bb34..c9a2f7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,52 +1,135 @@ cmake_minimum_required(VERSION 3.15) +include(cmake/version.cmake) -option(MSDF_ATLAS_GEN_BUILD_STANDALONE "Build the msdf-atlas-gen standalone executable" ON) -option(MSDF_ATLAS_GEN_MSDFGEN_EXTERNAL "Do not build the msdfgen submodule but find it as an external package" OFF) -if(NOT MSDF_ATLAS_GEN_MSDFGEN_EXTERNAL) +option(MSDF_ATLAS_BUILD_STANDALONE "Build the msdf-atlas-gen standalone executable" ON) +option(MSDF_ATLAS_USE_VCPKG "Use vcpkg package manager to link project dependencies" ON) +option(MSDF_ATLAS_USE_SKIA "Build with the Skia library" ON) +option(MSDF_ATLAS_MSDFGEN_EXTERNAL "Do not build the msdfgen submodule but find it as an external package" OFF) +option(MSDF_ATLAS_INSTALL "Generate installation target" OFF) +option(MSDF_ATLAS_DYNAMIC_RUNTIME "Link dynamic runtime library instead of static" OFF) +option(BUILD_SHARED_LIBS "Generate dynamic library files instead of static" OFF) + +if(NOT MSDF_ATLAS_MSDFGEN_EXTERNAL) + set(MSDFGEN_CORE_ONLY OFF CACHE INTERNAL "Only build the core msdfgen library with no dependencies (disabled for msdf-atlas-gen)" FORCE) set(MSDFGEN_BUILD_STANDALONE OFF CACHE BOOL "Build the msdfgen standalone executable") - set(MSDFGEN_USE_OPENMP OFF CACHE INTERNAL "Build with OpenMP support for multithreaded code (disabled for atlas gen)" FORCE) - set(MSDFGEN_USE_CPP11 ON CACHE INTERNAL "Build with C++11 enabled (always enabled for atlas gen)" FORCE) - set(MSDFGEN_INSTALL OFF CACHE BOOL "Generate installation target for msdfgen") + set(MSDFGEN_USE_VCPKG ${MSDF_ATLAS_USE_VCPKG} CACHE INTERNAL "Use vcpkg package manager to link msdfgen project dependencies" FORCE) + set(MSDFGEN_USE_OPENMP OFF CACHE INTERNAL "Build with OpenMP support for multithreaded code (disabled for msdf-atlas-gen)" FORCE) + set(MSDFGEN_USE_CPP11 ON CACHE INTERNAL "Build with C++11 enabled (always enabled for msdf-atlas-gen)" FORCE) + set(MSDFGEN_USE_SKIA ${MSDF_ATLAS_USE_SKIA} CACHE INTERNAL "Build msdfgen with the Skia library" FORCE) + set(MSDFGEN_INSTALL ${MSDF_ATLAS_INSTALL} CACHE INTERNAL "Generate installation target for msdfgen" FORCE) + set(MSDFGEN_DYNAMIC_RUNTIME ${MSDF_ATLAS_DYNAMIC_RUNTIME} CACHE INTERNAL "Link dynamic runtime library instead of static for msdfgen" FORCE) endif() -project(msdf-atlas-gen VERSION 1.2 LANGUAGES CXX) +get_property(MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(NOT MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE) + message(STATUS "CMAKE_BUILD_TYPE not set, defaulting to Release") + set(CMAKE_BUILD_TYPE Release) +endif() -find_package(Threads REQUIRED) +if(MSDF_ATLAS_DYNAMIC_RUNTIME) + set(MSDF_ATLAS_MSVC_RUNTIME "MultiThreaded$<$:Debug>DLL") +else() + set(MSDF_ATLAS_MSVC_RUNTIME "MultiThreaded$<$:Debug>") +endif() -if(MSDF_ATLAS_GEN_MSDFGEN_EXTERNAL) - find_package(msdfgen REQUIRED) +if(BUILD_SHARED_LIBS) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif() + +if(MSDF_ATLAS_USE_VCPKG) + # Make sure that vcpkg toolchain file is set + if(NOT CMAKE_TOOLCHAIN_FILE) + if(DEFINED ENV{VCPKG_ROOT}) + set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") + else() + message(SEND_ERROR "Vcpkg toolchain not configured. Either set VCPKG_ROOT environment variable or pass -DCMAKE_TOOLCHAIN_FILE=VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake to cmake") + endif() + endif() + # Default to statically linked vcpkg triplet on Windows + if(WIN32 AND NOT VCPKG_TARGET_TRIPLET AND NOT MSDF_ATLAS_DYNAMIC_RUNTIME) + if(CMAKE_GENERATOR_PLATFORM MATCHES "64$" AND NOT CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64") + set(VCPKG_TARGET_TRIPLET "x64-windows-static") + elseif(CMAKE_GENERATOR_PLATFORM MATCHES "32$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "x86") + set(VCPKG_TARGET_TRIPLET "x86-windows-static") + else() + if(CMAKE_GENERATOR_PLATFORM) + message(WARNING "Vcpkg triplet not explicitly specified and could not be deduced. Recommend using -DVCPKG_TARGET_TRIPLET=x64-windows-static or similar") + else() + message(WARNING "Vcpkg triplet not explicitly specified and could not be deduced. Recommend using -A to explicitly select platform (Win32 or x64)") + endif() + endif() + endif() + # Select project features + if(NOT MSDF_ATLAS_VCPKG_FEATURES_SET) + set(VCPKG_MANIFEST_NO_DEFAULT_FEATURES ON) + if(MSDF_ATLAS_USE_SKIA) + list(APPEND VCPKG_MANIFEST_FEATURES "geometry-preprocessing") + endif() + endif() + set(MSDFGEN_VCPKG_FEATURES_SET ON) +endif() + +# Version is specified in vcpkg.json +project(msdf-atlas-gen VERSION ${MSDF_ATLAS_VERSION} LANGUAGES CXX) + +if(MSDF_ATLAS_MSDFGEN_EXTERNAL) + if(NOT TARGET msdfgen::msdfgen) + find_package(msdfgen REQUIRED) + endif() else() add_subdirectory(msdfgen) endif() +find_package(Threads REQUIRED) +if(NOT TARGET PNG::PNG) + find_package(PNG REQUIRED) +endif() -file(GLOB_RECURSE MSDF_ATLAS_GEN_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "msdf-atlas-gen/*.h" "msdf-atlas-gen/*.hpp") -file(GLOB_RECURSE MSDF_ATLAS_GEN_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "msdf-atlas-gen/*.cpp") +file(GLOB_RECURSE MSDF_ATLAS_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "msdf-atlas-gen/*.h" "msdf-atlas-gen/*.hpp") +file(GLOB_RECURSE MSDF_ATLAS_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "msdf-atlas-gen/*.cpp") # msdf-atlas-gen library -add_library(msdf-atlas-gen ${MSDF_ATLAS_GEN_HEADERS} ${MSDF_ATLAS_GEN_SOURCES}) +add_library(msdf-atlas-gen ${MSDF_ATLAS_HEADERS} ${MSDF_ATLAS_SOURCES}) add_library(msdf-atlas-gen::msdf-atlas-gen ALIAS msdf-atlas-gen) -set_target_properties(msdf-atlas-gen PROPERTIES PUBLIC_HEADER "${MSDF_ATLAS_GEN_HEADERS}") +set_target_properties(msdf-atlas-gen PROPERTIES PUBLIC_HEADER "${MSDF_ATLAS_HEADERS}") +set_property(TARGET msdf-atlas-gen PROPERTY MSVC_RUNTIME_LIBRARY "${MSDF_ATLAS_MSVC_RUNTIME}") +target_compile_definitions(msdf-atlas-gen PUBLIC + MSDF_ATLAS_VERSION=${MSDF_ATLAS_VERSION} + MSDF_ATLAS_VERSION_MAJOR=${MSDF_ATLAS_VERSION_MAJOR} + MSDF_ATLAS_VERSION_MINOR=${MSDF_ATLAS_VERSION_MINOR} + MSDF_ATLAS_VERSION_REVISION=${MSDF_ATLAS_VERSION_REVISION} + MSDF_ATLAS_COPYRIGHT_YEAR=${MSDF_ATLAS_COPYRIGHT_YEAR} +) target_include_directories(msdf-atlas-gen INTERFACE + $ $ PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/msdfgen/include # for lodepng.h ${CMAKE_CURRENT_SOURCE_DIR}/artery-font-format ) - -target_compile_features(msdf-atlas-gen PUBLIC cxx_std_11) -target_link_libraries(msdf-atlas-gen PUBLIC Threads::Threads msdfgen::msdfgen) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT msdf-atlas-gen) +target_compile_features(msdf-atlas-gen PUBLIC cxx_std_11) +target_link_libraries(msdf-atlas-gen PRIVATE Threads::Threads PNG::PNG) +target_link_libraries(msdf-atlas-gen PUBLIC msdfgen::msdfgen) + +if(BUILD_SHARED_LIBS AND WIN32) + target_compile_definitions(msdf-atlas-gen PRIVATE "MSDF_ATLAS_PUBLIC=__declspec(dllexport)") + target_compile_definitions(msdf-atlas-gen INTERFACE "MSDF_ATLAS_PUBLIC=__declspec(dllimport)") +else() + target_compile_definitions(msdf-atlas-gen PUBLIC MSDF_ATLAS_PUBLIC=) +endif() + # msdf-atlas-gen standalone executable -if(MSDF_ATLAS_GEN_BUILD_STANDALONE) - set(MSDF_ATLAS_GEN_STANDALONE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/msdf-atlas-gen/main.cpp") +if(MSDF_ATLAS_BUILD_STANDALONE) + set(MSDF_ATLAS_STANDALONE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/msdf-atlas-gen/main.cpp") if(MSVC) - set(MSDF_ATLAS_GEN_STANDALONE_SOURCES ${MSDF_ATLAS_GEN_STANDALONE_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/msdf-atlas-gen.rc") + set(MSDF_ATLAS_STANDALONE_SOURCES ${MSDF_ATLAS_STANDALONE_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/msdf-atlas-gen.rc") endif() - add_executable(msdf-atlas-gen-standalone ${MSDF_ATLAS_GEN_STANDALONE_SOURCES}) + add_executable(msdf-atlas-gen-standalone ${MSDF_ATLAS_STANDALONE_SOURCES}) target_compile_definitions(msdf-atlas-gen-standalone PUBLIC MSDF_ATLAS_STANDALONE) + target_compile_definitions(msdf-atlas-gen-standalone PRIVATE MSDF_ATLAS_VERSION_UNDERLINE=${MSDF_ATLAS_VERSION_UNDERLINE}) + set_property(TARGET msdf-atlas-gen-standalone PROPERTY MSVC_RUNTIME_LIBRARY "${MSDF_ATLAS_MSVC_RUNTIME}") set_target_properties(msdf-atlas-gen-standalone PROPERTIES OUTPUT_NAME msdf-atlas-gen ARCHIVE_OUTPUT_NAME msdf-atlas-gen-standalone @@ -54,6 +137,64 @@ if(MSDF_ATLAS_GEN_BUILD_STANDALONE) ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) - target_link_libraries(msdf-atlas-gen-standalone PUBLIC msdf-atlas-gen::msdf-atlas-gen) + target_link_libraries(msdf-atlas-gen-standalone PRIVATE msdf-atlas-gen::msdf-atlas-gen) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT msdf-atlas-gen-standalone) endif() + +# Installation +if(MSDF_ATLAS_INSTALL) + include(GNUInstallDirs) + include(CMakePackageConfigHelpers) + set(MSDF_ATLAS_CONFIG_PATH "lib/cmake/msdf-atlas-gen") + + # install tree package config + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/msdf-atlas-gen-config-version.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) + + configure_package_config_file( + cmake/msdf-atlas-gen-config.cmake.in + ${MSDF_ATLAS_CONFIG_PATH}/msdf-atlas-gen-config.cmake + INSTALL_DESTINATION ${MSDF_ATLAS_CONFIG_PATH} + NO_CHECK_REQUIRED_COMPONENTS_MACRO + ) + + # build tree package config + configure_file( + cmake/msdf-atlas-gen-config.cmake.in + msdf-atlas-gen-config.cmake + @ONLY + ) + + install(TARGETS msdf-atlas-gen EXPORT msdf-atlas-gen-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/msdf-atlas-gen + ) + if(MSVC AND BUILD_SHARED_LIBS) + install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) + endif() + + export(EXPORT msdf-atlas-gen-targets NAMESPACE msdf-atlas-gen:: FILE "${CMAKE_CURRENT_BINARY_DIR}/msdf-atlas-gen-targets.cmake") + install(EXPORT msdf-atlas-gen-targets FILE msdf-atlas-gen-targets.cmake NAMESPACE msdf-atlas-gen:: DESTINATION ${MSDF_ATLAS_CONFIG_PATH}) + + if(MSDF_ATLAS_BUILD_STANDALONE) + install(TARGETS msdf-atlas-gen-standalone EXPORT msdf-atlas-gen-binary-targets DESTINATION ${CMAKE_INSTALL_BINDIR}) + if(MSVC) + install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) + endif() + export(EXPORT msdf-atlas-gen-binary-targets NAMESPACE msdf-atlas-gen-standalone:: FILE "${CMAKE_CURRENT_BINARY_DIR}/msdf-atlas-gen-binary-targets.cmake") + install(EXPORT msdf-atlas-gen-binary-targets FILE msdf-atlas-gen-binary-targets.cmake NAMESPACE msdf-atlas-gen-standalone:: DESTINATION ${MSDF_ATLAS_CONFIG_PATH}) + endif() + + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/${MSDF_ATLAS_CONFIG_PATH}/msdf-atlas-gen-config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/msdf-atlas-gen-config-version.cmake" + DESTINATION ${MSDF_ATLAS_CONFIG_PATH} + ) +endif() diff --git a/LICENSE.txt b/LICENSE.txt index 83edc59..3642b9f 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 Viktor Chlumsky +Copyright (c) 2020 - 2023 Viktor Chlumsky Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile deleted file mode 100644 index 88acefb..0000000 --- a/Makefile +++ /dev/null @@ -1,4 +0,0 @@ - -all: - mkdir -p bin - g++ -I /usr/local/include/freetype2 -I /usr/include/freetype2 -I artery-font-format -I msdfgen/include -I msdfgen -D MSDFGEN_USE_CPP11 -D MSDF_ATLAS_STANDALONE -std=c++11 -pthread -O2 -o bin/msdf-atlas-gen msdfgen/core/*.cpp msdfgen/lib/*.cpp msdfgen/ext/*.cpp msdf-atlas-gen/*.cpp -lfreetype diff --git a/README.md b/README.md index e5f3ff6..22b242b 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,11 @@ Notes: ## Getting started This project can be used either as a library or as a standalone console program. +Examples of how to use it as a library are available at the [bottom of the page](#library-usage-examples). To start using the program immediately, there is a Windows binary available for download in the ["Releases" section](https://github.com/Chlumsky/msdf-atlas-gen/releases). -To build the project, you may use the included [Visual Studio solution](msdf-atlas-gen.sln) or the [CMake script](CMakeLists.txt). Examples of how to use it as a library are available [at the bottom](#library-usage-examples). +To build the project from source, you may use the included [CMake script](CMakeLists.txt). +In its default configuration, it requires [vcpkg](https://vcpkg.io/) as the provider for third-party library dependencies. +If you set the environment variable `VCPKG_ROOT` to the vcpkg directory, the CMake configuration will take care of fetching all required packages from vcpkg. ## Command line arguments diff --git a/artery-font-format b/artery-font-format index 00ac3d8..a3dcadb 160000 --- a/artery-font-format +++ b/artery-font-format @@ -1 +1 @@ -Subproject commit 00ac3d8f964ec00a836c2bb5aeb126235ac98234 +Subproject commit a3dcadb9df2b5d45db2691ceea84318c711cb3e1 diff --git a/cmake/msdf-atlas-gen-config.cmake.in b/cmake/msdf-atlas-gen-config.cmake.in new file mode 100644 index 0000000..8789a4a --- /dev/null +++ b/cmake/msdf-atlas-gen-config.cmake.in @@ -0,0 +1,18 @@ + +include(CMakeFindDependencyMacro) + +set(MSDF_ATLAS_STANDALONE_AVAILABLE @MSDF_ATLAS_BUILD_STANDALONE@) + +find_dependency(PNG REQUIRED) +find_dependency(msdfgen REQUIRED) + +include("${CMAKE_CURRENT_LIST_DIR}/msdf-atlas-gen-targets.cmake") + +if(MSDF_ATLAS_STANDALONE_AVAILABLE) + include("${CMAKE_CURRENT_LIST_DIR}/msdf-atlas-gen-binary-targets.cmake") + if(${CMAKE_VERSION} VERSION_LESS "3.18.0") + set_target_properties(msdf-atlas-gen-standalone::msdf-atlas-gen-standalone PROPERTIES IMPORTED_GLOBAL TRUE) + endif() + add_executable(msdf-atlas-gen::msdf-atlas-gen-run ALIAS msdf-atlas-gen-standalone::msdf-atlas-gen-standalone) + set(MSDF_ATLAS_GEN_EXECUTABLE "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/msdf-atlas-gen@CMAKE_EXECUTABLE_SUFFIX@") +endif() diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 0000000..291f632 --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,19 @@ + +# This script reads version from vcpkg.json and sets it to ${MSDF_ATLAS_VERSION} etc. + +cmake_minimum_required(VERSION 3.15) + +file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/../vcpkg.json" MSDF_ATLAS_VCPKG_JSON) + +string(REGEX MATCH "\"version\"[ \t\n\r]*:[ \t\n\r]*\"[^\"]*\"" MSDF_ATLAS_TMP_VERSION_PAIR ${MSDF_ATLAS_VCPKG_JSON}) +string(REGEX REPLACE "\"version\"[ \t\n\r]*:[ \t\n\r]*\"([^\"]*)\"" "\\1" MSDF_ATLAS_VERSION ${MSDF_ATLAS_TMP_VERSION_PAIR}) +string(REGEX REPLACE "^([0-9]*)\\.([0-9]*)\\.([0-9]*)" "\\1" MSDF_ATLAS_VERSION_MAJOR ${MSDF_ATLAS_VERSION}) +string(REGEX REPLACE "^([0-9]*)\\.([0-9]*)\\.([0-9]*)" "\\2" MSDF_ATLAS_VERSION_MINOR ${MSDF_ATLAS_VERSION}) +string(REGEX REPLACE "^([0-9]*)\\.([0-9]*)\\.([0-9]*)" "\\3" MSDF_ATLAS_VERSION_REVISION ${MSDF_ATLAS_VERSION}) +string(LENGTH ${MSDF_ATLAS_VERSION} MSDF_ATLAS_VERSION_LENGTH) +string(REPEAT "-" ${MSDF_ATLAS_VERSION_LENGTH} MSDF_ATLAS_VERSION_UNDERLINE) +string(TIMESTAMP MSDF_ATLAS_COPYRIGHT_YEAR "%Y") + +unset(MSDF_ATLAS_TMP_VERSION_PAIR) +unset(MSDF_ATLAS_VERSION_LENGTH) +unset(MSDF_ATLAS_VCPKG_JSON) diff --git a/msdf-atlas-gen.aps b/msdf-atlas-gen.aps deleted file mode 100644 index 154da62d73367e37b1abaaaaa0bec7df105cb0a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35252 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 L;lhc9yefAUSLRl7dhQG!otw)& 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 b=WA7M%*XqpxE}fL-xuibPpN$O{r&#~;~X66 diff --git a/msdf-atlas-gen.rc b/msdf-atlas-gen.rc index 49499c63b69f9a3818fc9c682423d15429afb875..e43820b9bb57bb0f5be53d465b432135a131aa37 100644 GIT binary patch delta 617 zcmbQGc|>Ic7xUzA%xSEy41NrulM`8#O+hSo1|J4bhF}H{1|0?kARWr!1Qc-u%fvIF zs)z^525(-^@|LyU7pT;Q!Hppvs5AtuAsEOG18N8Y%6KyP0}Y60@CC|x0og%d!->`7 z3DiqKj}n?iK|p>O*dGw9fqt31oJ)NOICJw&E?#Cs;({g^7}P;PUjk!oawCuEWCc!+ z$pU=)+?9Yahus8cU_b^iM1pm>1LHUZ7%7p!uyO>7!~-J=ZXVDCrOj9QrZbZ1lsiSS1`00-C|0a->sQH9BdyxyBH@Ov?GBPp8f&nrGTLGXdE0?-*CNFC40Gc6Y8 zW#D3fVP#;zq%q`8zRi4d@-#*}W@Dgp1X+bAzhdN>T*kIcUKtofc?>CFRj4k>0|sKr L - - - - Debug Library - Win32 - - - Debug Library - x64 - - - Debug - Win32 - - - Release Library - Win32 - - - Release Library - x64 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - {223EDB94-5B35-45F2-A584-273DE6E45F6F} - msdfatlasgen - 8.1 - - - - Application - true - v140 - MultiByte - - - StaticLibrary - true - v140 - MultiByte - - - Application - false - v140 - true - MultiByte - - - StaticLibrary - false - v140 - true - MultiByte - - - Application - true - v140 - MultiByte - - - StaticLibrary - true - v140 - MultiByte - - - Application - false - v140 - true - MultiByte - - - StaticLibrary - false - v140 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - msdf-atlas-gen - $(Configuration)\ - - - msdf-atlas-gen - $(Configuration)\ - - - msdf-atlas-gen - bin\ - - - msdf-atlas-gen - bin\ - - - msdf-atlas-gen - $(Platform)\$(Configuration)\ - - - msdf-atlas-gen - $(Platform)\$(Configuration)\ - - - msdf-atlas-gen - $(Platform)\$(Configuration)\ - - - msdf-atlas-gen - $(Platform)\$(Configuration)\ - - - - Level3 - Disabled - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreadedDebug - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;MSDF_ATLAS_STANDALONE;%(PreprocessorDefinitions) - - - Console - freetype.lib;skia.lib;msdfgen.lib;%(AdditionalDependencies) - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\$(Configuration);msdfgen\$(Configuration) Library;%(AdditionalLibraryDirectories) - - - - - Level3 - Disabled - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreadedDebug - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;%(PreprocessorDefinitions) - - - Console - freetype.lib;msdfgen.lib;%(AdditionalDependencies) - ..\msdfgen\freetype\win32;$(SolutionDir)$(Configuration) Library;%(AdditionalLibraryDirectories) - - - MachineX86 - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\debug;msdfgen\$(Configuration);%(AdditionalLibraryDirectories) - - - - - Level3 - Disabled - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreadedDebug - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;MSDF_ATLAS_STANDALONE;%(PreprocessorDefinitions) - - - Console - freetype.lib;skia.lib;msdfgen.lib;%(AdditionalDependencies) - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\$(Configuration);msdfgen\$(Platform)\$(Configuration) Library;%(AdditionalLibraryDirectories) - - - - - Level3 - Disabled - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreadedDebug - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;%(PreprocessorDefinitions) - - - Console - freetype.lib;msdfgen.lib;%(AdditionalDependencies) - ..\msdfgen\freetype\win64;$(SolutionDir)$(Platform)\$(Configuration) Library;%(AdditionalLibraryDirectories) - - - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\debug;msdfgen\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) - - - - - Level3 - MaxSpeed - true - true - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreaded - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;MSDF_ATLAS_STANDALONE;%(PreprocessorDefinitions) - None - - - true - true - Console - freetype.lib;skia.lib;msdfgen.lib;%(AdditionalDependencies) - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\$(Configuration);msdfgen\bin;%(AdditionalLibraryDirectories) - false - - - - - Level3 - MaxSpeed - true - true - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreaded - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;%(PreprocessorDefinitions) - - - true - true - Console - freetype.lib;msdfgen.lib;%(AdditionalDependencies) - ..\msdfgen\freetype\win32;$(SolutionDir)bin;%(AdditionalLibraryDirectories) - - - MachineX86 - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\release;msdfgen\$(Configuration);%(AdditionalLibraryDirectories) - - - - - Level3 - MaxSpeed - true - true - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreaded - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;MSDF_ATLAS_STANDALONE;%(PreprocessorDefinitions) - None - - - true - true - Console - freetype.lib;skia.lib;msdfgen.lib;%(AdditionalDependencies) - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\$(Configuration);msdfgen\$(Platform)\$(Configuration) Library;%(AdditionalLibraryDirectories) - false - - - - - Level3 - MaxSpeed - true - true - true - msdfgen\include;msdfgen\freetype\include;msdfgen;artery-font-format;%(AdditionalIncludeDirectories) - MultiThreaded - _CRT_SECURE_NO_WARNINGS;MSDFGEN_USE_CPP11;MSDFGEN_USE_SKIA;%(PreprocessorDefinitions) - - - true - true - Console - freetype.lib;msdfgen.lib;%(AdditionalDependencies) - ..\msdfgen\freetype\win64;$(SolutionDir)$(Platform)\$(Configuration) Library;%(AdditionalLibraryDirectories) - - - msdfgen\freetype\win$(PlatformArchitecture);msdfgen\skia\win$(PlatformArchitecture)\release;msdfgen\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/msdf-atlas-gen.vcxproj.filters b/msdf-atlas-gen.vcxproj.filters deleted file mode 100644 index dda43f0..0000000 --- a/msdf-atlas-gen.vcxproj.filters +++ /dev/null @@ -1,184 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {ee785f45-c1cf-48ae-b864-f27237b077c1} - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Template Source Files - - - Header Files - - - Header Files - - - Header Files - - - Template Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Template Source Files - - - Header Files - - - Template Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Template Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Resource Files - - - - - Resource Files - - - \ No newline at end of file diff --git a/msdf-atlas-gen/Charset.h b/msdf-atlas-gen/Charset.h index d0cc719..185f265 100644 --- a/msdf-atlas-gen/Charset.h +++ b/msdf-atlas-gen/Charset.h @@ -12,7 +12,7 @@ class Charset { public: /// The set of the 95 printable ASCII characters - static const Charset ASCII; + static MSDF_ATLAS_PUBLIC const Charset ASCII; /// Adds a codepoint void add(unicode_t cp); diff --git a/msdf-atlas-gen/artery-font-export.cpp b/msdf-atlas-gen/artery-font-export.cpp index e7d96b5..bd1ca82 100644 --- a/msdf-atlas-gen/artery-font-export.cpp +++ b/msdf-atlas-gen/artery-font-export.cpp @@ -58,11 +58,12 @@ bool exportArteryFont(const FontGeometry *fonts, int fontCount, const msdfgen::B artery_font::StdArteryFont arfont = { }; arfont.metadataFormat = artery_font::METADATA_NONE; + arfont.variants = artery_font::StdList::Variant>(fontCount); for (int i = 0; i < fontCount; ++i) { const FontGeometry &font = fonts[i]; GlyphIdentifierType identifierType = font.getPreferredIdentifierType(); const msdfgen::FontMetrics &fontMetrics = font.getMetrics(); - artery_font::StdFontVariant fontVariant = { }; + typename artery_font::StdArteryFont::Variant &fontVariant = arfont.variants[i] = typename artery_font::StdArteryFont::Variant(); fontVariant.codepointType = convertCodepointType(identifierType); fontVariant.imageType = convertImageType(properties.imageType); fontVariant.metrics.fontSize = REAL(properties.fontSize*fontMetrics.emSize); @@ -76,7 +77,7 @@ bool exportArteryFont(const FontGeometry *fonts, int fontCount, const msdfgen::B fontVariant.metrics.underlineThickness = REAL(fontMetrics.underlineThickness); const char *name = font.getName(); if (name) - fontVariant.name.string = name; + (std::string &) fontVariant.name = name; fontVariant.glyphs = artery_font::StdList >(font.getGlyphs().size()); int j = 0; for (const GlyphGeometry &glyphGeom : font.getGlyphs()) { @@ -104,7 +105,7 @@ bool exportArteryFont(const FontGeometry *fonts, int fontCount, const msdfgen::B kernPair.codepoint1 = elem.first.first; kernPair.codepoint2 = elem.first.second; kernPair.advance.h = REAL(elem.second); - fontVariant.kernPairs.vector.push_back((artery_font::KernPair &&) kernPair); + ((std::vector > &) fontVariant.kernPairs).push_back((artery_font::KernPair &&) kernPair); } break; case GlyphIdentifierType::UNICODE_CODEPOINT: @@ -116,16 +117,16 @@ bool exportArteryFont(const FontGeometry *fonts, int fontCount, const msdfgen::B kernPair.codepoint1 = glyph1->getCodepoint(); kernPair.codepoint2 = glyph2->getCodepoint(); kernPair.advance.h = REAL(elem.second); - fontVariant.kernPairs.vector.push_back((artery_font::KernPair &&) kernPair); + ((std::vector > &) fontVariant.kernPairs).push_back((artery_font::KernPair &&) kernPair); } } break; } - arfont.variants.vector.push_back((artery_font::StdFontVariant &&) fontVariant); } + arfont.images = artery_font::StdList::Image>(1); { - artery_font::StdImage image = { }; + typename artery_font::StdArteryFont::Image &image = arfont.images[0] = typename artery_font::StdArteryFont::Image(); image.width = atlas.width; image.height = atlas.height; image.channels = N; @@ -134,13 +135,13 @@ bool exportArteryFont(const FontGeometry *fonts, int fontCount, const msdfgen::B case ImageFormat::PNG: image.encoding = artery_font::IMAGE_PNG; image.pixelFormat = artery_font::PIXEL_UNSIGNED8; - if (!encodePng(image.data.vector, atlas)) + if (!encodePng((std::vector &) image.data, atlas)) return false; break; case ImageFormat::TIFF: image.encoding = artery_font::IMAGE_TIFF; image.pixelFormat = artery_font::PIXEL_FLOAT32; - if (!encodeTiff(image.data.vector, atlas)) + if (!encodeTiff((std::vector &) image.data, atlas)) return false; break; case ImageFormat::BINARY: @@ -174,7 +175,6 @@ bool exportArteryFont(const FontGeometry *fonts, int fontCount, const msdfgen::B default: return false; } - arfont.images.vector.push_back((artery_font::StdImage &&) image); } return artery_font::writeFile(arfont, filename); diff --git a/msdf-atlas-gen/image-encode.cpp b/msdf-atlas-gen/image-encode.cpp index b34fc5a..948a7be 100644 --- a/msdf-atlas-gen/image-encode.cpp +++ b/msdf-atlas-gen/image-encode.cpp @@ -1,6 +1,98 @@ #include "image-encode.h" +#include + +#ifdef MSDFGEN_USE_LIBPNG + +#include + +namespace msdf_atlas { + +class PngGuard { + png_structp png; + png_infop info; + +public: + inline PngGuard(png_structp png, png_infop info) : png(png), info(info) { } + inline ~PngGuard() { + png_destroy_write_struct(&png, &info); + } + +}; + +static void pngIgnoreError(png_structp, png_const_charp) { } + +static void pngWrite(png_structp png, png_bytep data, png_size_t length) { + std::vector &output = *reinterpret_cast *>(png_get_io_ptr(png)); + output.insert(output.end(), data, data+length); +} + +static void pngFlush(png_structp) { } + +static bool pngEncode(std::vector &output, const byte *pixels, int width, int height, int channels, int colorType) { + if (!(pixels && width && height)) + return false; + png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, &pngIgnoreError, &pngIgnoreError); + if (!png) + return false; + png_infop info = png_create_info_struct(png); + PngGuard guard(png, info); + if (!info) + return false; + std::vector rows(height); + for (int y = 0; y < height; ++y) + rows[y] = pixels+channels*width*(height-y-1); + if (setjmp(png_jmpbuf(png))) + return false; + png_set_write_fn(png, &output, &pngWrite, &pngFlush); + png_set_IHDR(png, info, width, height, 8, colorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + png_set_compression_level(png, 9); + png_set_rows(png, info, const_cast(&rows[0])); + png_write_png(png, info, PNG_TRANSFORM_IDENTITY, NULL); + return true; +} + +static bool pngEncode(std::vector &output, const float *pixels, int width, int height, int channels, int colorType) { + if (!(pixels && width && height)) + return false; + int subpixels = channels*width*height; + std::vector bytePixels(subpixels); + for (int i = 0; i < subpixels; ++i) + bytePixels[i] = msdfgen::pixelFloatToByte(pixels[i]); + return pngEncode(output, bytePixels.data(), width, height, channels, colorType); +} + +bool encodePng(std::vector &output, const msdfgen::BitmapConstRef &bitmap) { + return pngEncode(output, bitmap.pixels, bitmap.width, bitmap.height, 1, PNG_COLOR_TYPE_GRAY); +} + +bool encodePng(std::vector &output, const msdfgen::BitmapConstRef &bitmap) { + return pngEncode(output, bitmap.pixels, bitmap.width, bitmap.height, 3, PNG_COLOR_TYPE_RGB); +} + +bool encodePng(std::vector &output, const msdfgen::BitmapConstRef &bitmap) { + return pngEncode(output, bitmap.pixels, bitmap.width, bitmap.height, 4, PNG_COLOR_TYPE_RGB_ALPHA); +} + +bool encodePng(std::vector &output, const msdfgen::BitmapConstRef &bitmap) { + return pngEncode(output, bitmap.pixels, bitmap.width, bitmap.height, 1, PNG_COLOR_TYPE_GRAY); +} + +bool encodePng(std::vector &output, const msdfgen::BitmapConstRef &bitmap) { + return pngEncode(output, bitmap.pixels, bitmap.width, bitmap.height, 3, PNG_COLOR_TYPE_RGB); +} + +bool encodePng(std::vector &output, const msdfgen::BitmapConstRef &bitmap) { + return pngEncode(output, bitmap.pixels, bitmap.width, bitmap.height, 4, PNG_COLOR_TYPE_RGB_ALPHA); +} + +} + +#endif + +#ifdef MSDFGEN_USE_LODEPNG + #include namespace msdf_atlas { @@ -61,3 +153,5 @@ bool encodePng(std::vector &output, const msdfgen::BitmapConstRef diff --git a/msdf-atlas-gen/msdf-atlas-gen.h b/msdf-atlas-gen/msdf-atlas-gen.h index cf24d54..e833a43 100644 --- a/msdf-atlas-gen/msdf-atlas-gen.h +++ b/msdf-atlas-gen/msdf-atlas-gen.h @@ -2,12 +2,10 @@ #pragma once /* - * MULTI-CHANNEL SIGNED DISTANCE FIELD ATLAS GENERATOR v1.2 (2021-05-29) - * --------------------------------------------------------------------- - * A utility by Viktor Chlumsky, (c) 2020 - 2021 - * - * Generates compact bitmap font atlases using MSDFGEN. - * + * MULTI-CHANNEL SIGNED DISTANCE FIELD ATLAS GENERATOR + * --------------------------------------------------- + * A utility by Viktor Chlumsky, (c) 2020 - 2023 + * Generates compact bitmap font atlases using MSDFgen */ #include @@ -38,5 +36,3 @@ #include "csv-export.h" #include "json-export.h" #include "shadron-preview-generator.h" - -#define MSDF_ATLAS_VERSION "1.2" diff --git a/msdfgen b/msdfgen index 4e8ff23..a811ef8 160000 --- a/msdfgen +++ b/msdfgen @@ -1 +1 @@ -Subproject commit 4e8ff2321ea9696801675c908a4822c4d8e71eb8 +Subproject commit a811ef8935354d3f6d767cff6c4eebeb683777f2 diff --git a/resource.h b/resource.h index d0ca059fb29154229292d8b3bdb6f4fab890847b..2b808651339802d4095c15904834ffbeb1ed5252 100644 GIT binary patch delta 381 zcmbQjzJts3|36*^E(T?W6oyoWG=@xuJRq&W5X=z55X9ig;K$$&B%>Hy8R8i<7%CVv zfpW?W6%#Lt8e=MfDZrG0Y6fb{^#z*k!r%rp&k<;c50DH7vcrHj1OZu|4E{hn<5BF# z<{AwKV$9J5T3C-=p)=5;0ES4gC*2u5fKG`A@?3$=38KJyET#&>jn!lTg)|6nWSYbb E0FL86u>b%7 delta 12 UcmdnNHHDq&|G&-47$-3U03%-oOaK4? diff --git a/vcpkg.json b/vcpkg.json new file mode 100644 index 0000000..81fd080 --- /dev/null +++ b/vcpkg.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", + "name": "msdf-atlas-gen", + "version": "1.3.0", + "description": "Multi-channel signed distance field atlas generator", + "homepage": "https://github.com/Chlumsky/msdf-atlas-gen", + "license": "MIT", + "dependencies": [ + "freetype", + "tinyxml2", + "libpng" + ], + "default-features": [ + "geometry-preprocessing" + ], + "features": { + "geometry-preprocessing": { + "description": "Preprocessing of non-compliant vector geometry via the Skia library", + "dependencies": [ { + "name": "skia", + "default-features": false + } ] + } + } +}