Dependency configuration optimized

This commit is contained in:
Chlumsky 2024-03-10 13:27:29 +01:00
parent bed35b13b0
commit f424021a2b
12 changed files with 80 additions and 27 deletions

View File

@ -12,6 +12,7 @@ option(MSDF_ATLAS_DYNAMIC_RUNTIME "Link dynamic runtime library instead of stati
option(BUILD_SHARED_LIBS "Generate dynamic library files instead of static" OFF)
if(NOT MSDF_ATLAS_MSDFGEN_EXTERNAL)
set(MSDFGEN_DISABLE_SVG ON CACHE BOOL "Disable unused SVG functionality to minimize dependencies")
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_VCPKG ${MSDF_ATLAS_USE_VCPKG} CACHE INTERNAL "Use vcpkg package manager to link msdfgen project dependencies" FORCE)
@ -82,7 +83,7 @@ else()
add_subdirectory(msdfgen)
endif()
find_package(Threads REQUIRED)
if(NOT TARGET PNG::PNG)
if(NOT MSDFGEN_DISABLE_PNG AND NOT TARGET PNG::PNG)
find_package(PNG REQUIRED)
endif()
@ -113,7 +114,10 @@ endif()
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 PRIVATE Threads::Threads)
if(NOT MSDFGEN_DISABLE_PNG)
target_link_libraries(msdf-atlas-gen PRIVATE PNG::PNG)
endif()
target_link_libraries(msdf-atlas-gen PUBLIC msdfgen::msdfgen)
if(BUILD_SHARED_LIBS AND WIN32)

View File

@ -27,8 +27,8 @@ The atlas generator can generate the following six types of atlases.
Notes:
- *Sharp corners* refers to preservation of corner sharpness when upscaled.
- *Soft effects* refers to the support of effects that use true distance, such as glows, rounded borders, or simplified shadows.
- *Hard effects* refers to the support of effects that use pseudo-distance, such as mitered borders or thickness adjustment.
- *Soft effects* refers to the support of effects that use true distance, such as glows, rounded outlines, or simplified shadows.
- *Hard effects* refers to the support of effects that use perpendicular distance, such as mitered outlines or thickness adjustment.
## Getting started
@ -63,7 +63,7 @@ Use the following command line arguments for the standalone version of the atlas
- `hardmask` – a non-anti-aliased binary image
- `softmask` – an anti-aliased image
- `sdf` – a true signed distance field (SDF)
- `psdf` – a pseudo-distance field
- `psdf` – a signed perpendicular distance field (PSDF)
- `msdf` (default) – a multi-channel signed distance field (MSDF)
- `mtsdf` – a combination of MSDF and true SDF in the alpha channel

View File

@ -2,8 +2,11 @@
include(CMakeFindDependencyMacro)
set(MSDF_ATLAS_STANDALONE_AVAILABLE @MSDF_ATLAS_BUILD_STANDALONE@)
set(MSDF_ATLAS_NO_PNG @MSDFGEN_DISABLE_PNG@)
find_dependency(PNG REQUIRED)
if(NOT MSDF_ATLAS_NO_PNG)
find_dependency(PNG REQUIRED)
endif()
find_dependency(msdfgen REQUIRED)
include("${CMAKE_CURRENT_LIST_DIR}/msdf-atlas-gen-targets.cmake")

View File

@ -134,12 +134,14 @@ bool exportArteryFont(const FontGeometry *fonts, int fontCount, const msdfgen::B
image.channels = N;
image.imageType = convertImageType(properties.imageType);
switch (properties.imageFormat) {
#ifndef MSDFGEN_DISABLE_PNG
case ImageFormat::PNG:
image.encoding = artery_font::IMAGE_PNG;
image.pixelFormat = artery_font::PIXEL_UNSIGNED8;
if (!encodePng((std::vector<byte> &) image.data, atlas))
return false;
break;
#endif
case ImageFormat::TIFF:
image.encoding = artery_font::IMAGE_TIFF;
image.pixelFormat = artery_font::PIXEL_FLOAT32;

View File

@ -14,7 +14,7 @@ void sdfGenerator(const msdfgen::BitmapRef<float, 1> &output, const GlyphGeometr
}
void psdfGenerator(const msdfgen::BitmapRef<float, 1> &output, const GlyphGeometry &glyph, const GeneratorAttributes &attribs) {
msdfgen::generatePseudoSDF(output, glyph.getShape(), glyph.getBoxProjection(), glyph.getBoxRange(), attribs.config);
msdfgen::generatePSDF(output, glyph.getShape(), glyph.getBoxProjection(), glyph.getBoxRange(), attribs.config);
if (attribs.scanlinePass)
msdfgen::distanceSignCorrection(output, glyph.getShape(), glyph.getBoxProjection(), MSDF_ATLAS_GLYPH_FILL_RULE);
}

View File

@ -15,7 +15,7 @@ namespace msdf_atlas {
void scanlineGenerator(const msdfgen::BitmapRef<float, 1> &output, const GlyphGeometry &glyph, const GeneratorAttributes &attribs);
/// Generates a true signed distance field of the glyph
void sdfGenerator(const msdfgen::BitmapRef<float, 1> &output, const GlyphGeometry &glyph, const GeneratorAttributes &attribs);
/// Generates a signed pseudo-distance field of the glyph
/// Generates a signed perpendicular distance field of the glyph
void psdfGenerator(const msdfgen::BitmapRef<float, 1> &output, const GlyphGeometry &glyph, const GeneratorAttributes &attribs);
/// Generates a multi-channel signed distance field of the glyph
void msdfGenerator(const msdfgen::BitmapRef<float, 3> &output, const GlyphGeometry &glyph, const GeneratorAttributes &attribs);

View File

@ -5,6 +5,8 @@
#include <msdfgen.h>
#include "types.h"
#ifndef MSDFGEN_DISABLE_PNG
namespace msdf_atlas {
// Functions to encode an image as a sequence of bytes in memory
@ -18,3 +20,5 @@ bool encodePng(std::vector<byte> &output, const msdfgen::BitmapConstRef<float, 3
bool encodePng(std::vector<byte> &output, const msdfgen::BitmapConstRef<float, 4> &bitmap);
}
#endif

View File

@ -21,8 +21,10 @@ bool saveImageText(const msdfgen::BitmapConstRef<float, N> &bitmap, const char *
template <int N>
bool saveImage(const msdfgen::BitmapConstRef<byte, N> &bitmap, ImageFormat format, const char *filename, YDirection outputYDirection) {
switch (format) {
#ifndef MSDFGEN_DISABLE_PNG
case ImageFormat::PNG:
return msdfgen::savePng(bitmap, filename);
#endif
case ImageFormat::BMP:
return msdfgen::saveBmp(bitmap, filename);
case ImageFormat::TIFF:
@ -44,8 +46,10 @@ bool saveImage(const msdfgen::BitmapConstRef<byte, N> &bitmap, ImageFormat forma
template <int N>
bool saveImage(const msdfgen::BitmapConstRef<float, N> &bitmap, ImageFormat format, const char *filename, YDirection outputYDirection) {
switch (format) {
#ifndef MSDFGEN_DISABLE_PNG
case ImageFormat::PNG:
return msdfgen::savePng(bitmap, filename);
#endif
case ImageFormat::BMP:
return msdfgen::saveBmp(bitmap, filename);
case ImageFormat::TIFF:

View File

@ -57,9 +57,13 @@ MSDF Atlas Generator by Viktor Chlumsky v)" MSDF_ATLAS_VERSION_STRING R"( (with
INPUT SPECIFICATION
-font <filename.ttf/otf>
Specifies the input TrueType / OpenType font file. A font specification is required.
Specifies the input TrueType / OpenType font file. A font specification is required.)"
#ifndef MSDFGEN_DISABLE_VARIABLE_FONTS
R"(
-varfont <filename.ttf/otf?var0=value0&var1=value1>
Specifies an input variable font file and configures its variables.
Specifies an input variable font file and configures its variables.)"
#endif
R"(
-charset <filename>
Specifies the input character set. Refer to the documentation for format of charset specification. Defaults to ASCII.
-glyphset <filename>
@ -76,7 +80,13 @@ INPUT SPECIFICATION
ATLAS CONFIGURATION
-type <hardmask / softmask / sdf / psdf / msdf / mtsdf>
Selects the type of atlas to be generated.
-format <png / bmp / tiff / text / textfloat / bin / binfloat / binfloatbe>
)"
#ifndef MSDFGEN_DISABLE_PNG
R"( -format <png / bmp / tiff / text / textfloat / bin / binfloat / binfloatbe>)"
#else
R"( -format <bmp / tiff / text / textfloat / bin / binfloat / binfloatbe>)"
#endif
R"(
Selects the format for the atlas image output. Some image formats may be incompatible with embedded output formats.
-dimensions <width> <height>
Sets the atlas to have fixed dimensions (width x height).
@ -90,9 +100,9 @@ ATLAS CONFIGURATION
-uniformcell <width> <height>
Sets fixed dimensions of the grid's cells.
-uniformcellconstraint <none / pots / potr / square / square2 / square4>
Constrains cell dimensions to the given rule (see -pots / ... above)
Constrains cell dimensions to the given rule (see -pots / ... above).
-uniformorigin <off / on / horizontal / vertical>
Sets whether the glyph's origin point should be fixed at the same position in each cell
Sets whether the glyph's origin point should be fixed at the same position in each cell.
-yorigin <bottom / top>
Determines whether the Y-axis is oriented upwards (bottom origin, default) or downwards (top origin).
@ -228,6 +238,7 @@ static bool strStartsWith(const char *str, const char *prefix) {
return true;
}
#ifndef MSDFGEN_DISABLE_VARIABLE_FONTS
static msdfgen::FontHandle *loadVarFont(msdfgen::FreetypeHandle *library, const char *filename) {
std::string buffer;
while (*filename && *filename != '?')
@ -250,6 +261,7 @@ static msdfgen::FontHandle *loadVarFont(msdfgen::FreetypeHandle *library, const
}
return font;
}
#endif
struct FontInput {
const char *fontFilename;
@ -406,9 +418,12 @@ int main(int argc, const char *const *argv) {
continue;
}
ARG_CASE("-format", 1) {
if (ARG_IS("png"))
config.imageFormat = ImageFormat::PNG;
else if (ARG_IS("bmp"))
#ifndef MSDFGEN_DISABLE_PNG
if (ARG_IS("png"))
config.imageFormat = ImageFormat::PNG;
else
#endif
if (ARG_IS("bmp"))
config.imageFormat = ImageFormat::BMP;
else if (ARG_IS("tiff"))
config.imageFormat = ImageFormat::TIFF;
@ -422,8 +437,13 @@ int main(int argc, const char *const *argv) {
config.imageFormat = ImageFormat::BINARY_FLOAT;
else if (ARG_IS("binfloatbe"))
config.imageFormat = ImageFormat::BINARY_FLOAT_BE;
else
ABORT("Invalid image format. Valid formats are: png, bmp, tiff, text, textfloat, bin, binfloat");
else {
#ifndef MSDFGEN_DISABLE_PNG
ABORT("Invalid image format. Valid formats are: png, bmp, tiff, text, textfloat, bin, binfloat");
#else
ABORT("Invalid image format. Valid formats are: bmp, tiff, text, textfloat, bin, binfloat");
#endif
}
imageFormatName = arg;
++argPos;
continue;
@ -433,11 +453,13 @@ int main(int argc, const char *const *argv) {
fontInput.variableFont = false;
continue;
}
#ifndef MSDFGEN_DISABLE_VARIABLE_FONTS
ARG_CASE("-varfont", 1) {
fontInput.fontFilename = argv[argPos++];
fontInput.variableFont = true;
continue;
}
#endif
ARG_CASE("-charset", 1) {
fontInput.charsetFilename = argv[argPos++];
fontInput.glyphIdentifierType = GlyphIdentifierType::UNICODE_CODEPOINT;
@ -845,21 +867,31 @@ int main(int argc, const char *const *argv) {
// Finalize image format
ImageFormat imageExtension = ImageFormat::UNSPECIFIED;
if (config.imageFilename) {
if (cmpExtension(config.imageFilename, ".png")) imageExtension = ImageFormat::PNG;
else if (cmpExtension(config.imageFilename, ".bmp")) imageExtension = ImageFormat::BMP;
if (cmpExtension(config.imageFilename, ".png")) {
#ifndef MSDFGEN_DISABLE_PNG
imageExtension = ImageFormat::PNG;
#else
fputs("Warning: You are using a version of this program without PNG image support!\n", stderr);
#endif
} else if (cmpExtension(config.imageFilename, ".bmp")) imageExtension = ImageFormat::BMP;
else if (cmpExtension(config.imageFilename, ".tif") || cmpExtension(config.imageFilename, ".tiff")) imageExtension = ImageFormat::TIFF;
else if (cmpExtension(config.imageFilename, ".txt")) imageExtension = ImageFormat::TEXT;
else if (cmpExtension(config.imageFilename, ".bin")) imageExtension = ImageFormat::BINARY;
}
if (config.imageFormat == ImageFormat::UNSPECIFIED) {
config.imageFormat = ImageFormat::PNG;
imageFormatName = "png";
#ifndef MSDFGEN_DISABLE_PNG
config.imageFormat = ImageFormat::PNG;
imageFormatName = "png";
#else
config.imageFormat = ImageFormat::TIFF;
imageFormatName = "tiff";
#endif
// If image format is not specified and -imageout is the only image output, infer format from its extension
if (!config.arteryFontFilename) {
if (imageExtension != ImageFormat::UNSPECIFIED)
config.imageFormat = imageExtension;
else if (config.imageFilename)
fputs("Warning: Could not infer image format from file extension, PNG will be used.\n", stderr);
fprintf(stderr, "Warning: Could not infer image format from file extension, %s will be used.\n", imageFormatName);
}
}
if (config.imageType == ImageType::MTSDF && config.imageFormat == ImageFormat::BMP)
@ -926,7 +958,12 @@ int main(int argc, const char *const *argv) {
return true;
if (font)
msdfgen::destroyFont(font);
if ((font = isVarFont ? loadVarFont(ft, fontFilename) : msdfgen::loadFont(ft, fontFilename))) {
if ((font = (
#ifndef MSDFGEN_DISABLE_VARIABLE_FONTS
isVarFont ? loadVarFont(ft, fontFilename) :
#endif
msdfgen::loadFont(ft, fontFilename)
))) {
this->fontFilename = fontFilename;
return true;
}

View File

@ -16,7 +16,7 @@ enum class ImageType {
SOFT_MASK,
/// Signed (true) distance field
SDF,
/// Signed pseudo-distance field
/// Signed perpendicular distance field
PSDF,
/// Multi-channel signed distance field
MSDF,

@ -1 +1 @@
Subproject commit 682381a03c5876cffcad256a59eab7efd83c3f4e
Subproject commit 937f31ff418e488e4b707a77c294cdb4fadb4235

View File

@ -7,7 +7,6 @@
"license": "MIT",
"dependencies": [
"freetype",
"tinyxml2",
"libpng"
],
"default-features": [