/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #pragma once #if __has_include("msdfgen.h") #include "Scene/AtlasMetadata.hpp" #include "FontAtlasGenerator.hpp" #include "Scene/Texture.hpp" #include #include #include #include #include #include #define MSDFGEN_AVAILABLE 1 namespace OpenVulkano::Scene { struct MsdfFontAtlasGeneratorConfig { int glyphSize = 42; double miterLimit = 1.0; msdfgen::Range pixelRange = 5; }; class MsdfFontAtlasGenerator : public FontAtlasGenerator { public: using SdfGenerator = msdf_atlas::ImmediateAtlasGenerator>; using Config = MsdfFontAtlasGeneratorConfig; static msdf_atlas::Charset LoadAllGlyphs(const std::variant>& data); void GenerateAtlas(const std::string& fontFile, const std::set& charset, const std::optional& pngOutput = std::nullopt) override; void GenerateAtlas(const Array& fontData, int length, const std::set& charset, const std::optional& pngOutput = std::nullopt) override; void GenerateAtlas(const std::string& fontFile, const msdf_atlas::Charset& charset = msdf_atlas::Charset::ASCII, const std::optional& pngOutput = std::nullopt); void GenerateAtlas(const msdfgen::byte* fontData, int length, const msdf_atlas::Charset& charset = msdf_atlas::Charset::ASCII, const std::optional& pngOutput = std::nullopt); void SaveAtlasMetadataInfo(const std::string& outputFile, bool packIntoSingleFile = true) const override; void SetGeneratorConfig(const Config& config) { m_config = config; } const Texture& GetAtlas() const override { return m_atlasTex; } std::map& GetGlyphsInfo() override { return m_symbols; } AtlasMetadata& GetAtlasMetadata() override { return m_meta; } SdfGenerator& GetFontAtlasGenerator() { return m_generator; } Config& GetGeneratorConfig() { return m_config; } private: void InitFreetypeFromFile(msdfgen::FreetypeHandle*& ft, msdfgen::FontHandle*& font, const std::string& file); void InitFreetypeFromBuffer(msdfgen::FreetypeHandle*& ft, msdfgen::FontHandle*& font, const msdfgen::byte* fontData, int length); void Generate(msdfgen::FreetypeHandle* ft, msdfgen::FontHandle* font, const msdf_atlas::Charset& chset, const std::optional& pngOutput); void SavePng(const msdfgen::BitmapConstRef& storage, const std::string& output, int channels) const; private: SdfGenerator m_generator; Texture m_atlasTex; AtlasMetadata m_meta; Config m_config; std::map m_symbols; }; } #endif