/* * 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/AtlasData.hpp" #include "IFontAtlasGenerator.hpp" #include "Scene/Texture.hpp" #include #include #include #include #include #include #define MSDFGEN_AVAILABLE 1 namespace OpenVulkano::Scene { struct FontAtlasGeneratorConfig { static FontAtlasGeneratorConfig sdfDefaultConfig; static FontAtlasGeneratorConfig msdfDefaultConfig; int glyphSize; double miterLimit; msdfgen::Range pixelRange; }; template class FontAtlasGenerator : public IFontAtlasGenerator { private: using SdfGenerator = msdf_atlas::ImmediateAtlasGenerator>; using MsdfGenerator = msdf_atlas::ImmediateAtlasGenerator>; public: using Generator = std::conditional::type; using Config = FontAtlasGeneratorConfig; static constexpr int channelsCount = (Channels == 1 ? 1 : 4); static msdf_atlas::Charset LoadAllGlyphs(const std::variant>& data); FontAtlasGenerator(); 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; } std::shared_ptr GetAtlasData() const { return m_atlasData; } 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 std::string& output) const; private: Config m_config; std::shared_ptr m_atlasData; }; using SdfFontAtlasGenerator = FontAtlasGenerator<1>; using MsdfFontAtlasGenerator = FontAtlasGenerator<3>; } #endif