Cleanup font generators

This commit is contained in:
Georg Hagen
2025-03-02 18:58:33 +01:00
parent ee82919293
commit 6c796bb3a0
6 changed files with 24 additions and 61 deletions

View File

@@ -11,21 +11,18 @@
namespace OpenVulkano::Scene
{
void BitmapFontAtlasGenerator::GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput)
void BitmapFontAtlasGenerator::GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset)
{
GenerateAtlas(Utils::ReadFile(fontFile), charset, pngOutput);
GenerateAtlas(Utils::ReadFile(fontFile), charset);
}
void BitmapFontAtlasGenerator::GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput)
void BitmapFontAtlasGenerator::GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset)
{
Generate({ reinterpret_cast<const uint8_t*>(fontData.Data()), fontData.Size() }, charset, pngOutput);
Generate(fontData.AsBytes(), charset);
}
void BitmapFontAtlasGenerator::Generate(const std::span<const uint8_t>& fontData,
const std::set<uint32_t>& inCs,
const std::optional<std::string>& pngOutput)
const std::set<uint32_t>& inCs)
{
const auto& [lib, face] = FontAtlasGeneratorBase::InitFreetype(fontData);
@@ -64,7 +61,6 @@ namespace OpenVulkano::Scene
FontAtlasType::BITMAP,
m_subpixelLayout.GetTextureDataFormat());
FillGlyphsInfo(allGlyphs, face, scaleFactor);
if (pngOutput) m_atlasData->Save(*pngOutput);
}
std::pair<std::vector<GlyphForPacking>, double>

View File

@@ -42,12 +42,10 @@ namespace OpenVulkano::Scene
, m_subpixelLayout(subpixelLayout.value_or(SubpixelLayout::UNKNOWN))
{
}
[[deprecated]] void GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput = std::nullopt) override;
void GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput = std::nullopt) override;
[[deprecated]] void GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset) override;
void GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset) override;
private:
void Generate(const std::span<const uint8_t>& fontData, const std::set<uint32_t>& chset, const std::optional<std::string>& pngOutput);
void Generate(const std::span<const uint8_t>& fontData, const std::set<uint32_t>& chset);
void FillGlyphsInfo(const std::vector<GlyphForPacking>& allGlyphs, const FtFaceRecPtr& face, double scaleFactor);
void FillSubpixelData(const FT_Bitmap& bitmap, const GlyphForPacking& glyph);
FT_Int32 GetGlyphRenderMode() const;

View File

@@ -20,10 +20,8 @@ namespace OpenVulkano::Scene
{
public:
virtual ~IFontAtlasGenerator() = default;
[[deprecated]] virtual void GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput = std::nullopt) = 0;
virtual void GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput = std::nullopt) = 0;
[[deprecated]] virtual void GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset) = 0;
virtual void GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset) = 0;
virtual const std::shared_ptr<FontAtlas>& GetAtlas() const = 0;
};
}

View File

@@ -18,15 +18,9 @@ namespace OpenVulkano::Scene
SdfFontAtlasGeneratorConfig SdfFontAtlasGeneratorConfig::msdfDefaultConfig = { 32, 1.0, 3 };
template<int Channels>
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput)
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& inCs)
{
msdfgen::FreetypeHandle* ft;
msdfgen::FontHandle* font;
InitFreetypeFromFile(ft, font, fontFile);
msdf_atlas::Charset s;
std::for_each(charset.begin(), charset.end(), [&](uint32_t unicode) { s.add(unicode); });
Generate(ft, font, s, pngOutput);
GenerateAtlas(Utils::ReadFile(fontFile), inCs);
}
template<int Channels> SdfFontAtlasGeneratorGeneric<Channels>::SdfFontAtlasGeneratorGeneric() : FontAtlasGeneratorBase(Channels)
@@ -36,8 +30,7 @@ namespace OpenVulkano::Scene
}
template<int Channels>
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& inCs,
const std::optional<std::string>& pngOutput)
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& inCs)
{
msdfgen::FreetypeHandle* ft;
msdfgen::FontHandle* font;
@@ -50,30 +43,26 @@ namespace OpenVulkano::Scene
}
const auto& charset = inCs.empty() ? fallback : inCs;
std::for_each(charset.begin(), charset.end(), [&](uint32_t unicode) { s.add(unicode); });
Generate(ft, font, s, pngOutput);
Generate(ft, font, s);
}
template<int Channels>
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const std::string& fontFile,
const msdf_atlas::Charset& charset,
const std::optional<std::string>& pngOutput)
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const std::string& fontFile, const msdf_atlas::Charset& charset)
{
// TODO: dynamic atlas and add only those symbols which are not present yet in current atlas
msdfgen::FreetypeHandle* ft;
msdfgen::FontHandle* font;
InitFreetypeFromFile(ft, font, fontFile);
Generate(ft, font, charset, pngOutput);
Generate(ft, font, charset);
}
template<int Channels>
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const msdfgen::byte* fontData, int length,
const msdf_atlas::Charset& charset,
const std::optional<std::string>& pngOutput)
void SdfFontAtlasGeneratorGeneric<Channels>::GenerateAtlas(const msdfgen::byte* fontData, int length, const msdf_atlas::Charset& charset)
{
msdfgen::FreetypeHandle* ft;
msdfgen::FontHandle* font;
InitFreetypeFromBuffer(ft, font, fontData, length);
Generate(ft, font, charset, pngOutput);
Generate(ft, font, charset);
}
template<int Channels>
@@ -115,9 +104,7 @@ namespace OpenVulkano::Scene
}
template<int Channels>
void SdfFontAtlasGeneratorGeneric<Channels>::Generate(msdfgen::FreetypeHandle* ft, msdfgen::FontHandle* font,
const msdf_atlas::Charset& chset,
const std::optional<std::string>& pngOutput)
void SdfFontAtlasGeneratorGeneric<Channels>::Generate(msdfgen::FreetypeHandle* ft, msdfgen::FontHandle* font, const msdf_atlas::Charset& chset)
{
std::vector<msdf_atlas::GlyphGeometry> glyphsGeometry;
// FontGeometry is a helper class that loads a set of glyphs from a single font.
@@ -212,10 +199,6 @@ namespace OpenVulkano::Scene
SetGlyphData(info, { bearingX, bearingY }, { w, h }, glyphAtlasAABB, glyphBox.advance);
}
if (pngOutput && !pngOutput->empty())
{
m_atlasData->Save(*pngOutput);
}
destroyFont(font);
deinitializeFreetype(ft);
}

View File

@@ -42,24 +42,19 @@ namespace OpenVulkano::Scene
using Config = SdfFontAtlasGeneratorConfig;
static constexpr int channelsCount = (Channels == 1 ? 1 : 4);
SdfFontAtlasGeneratorGeneric();
[[deprecated]] void GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput = std::nullopt) override;
void GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset,
const std::optional<std::string>& pngOutput = std::nullopt) override;
[[deprecated]] void GenerateAtlas(const std::string& fontFile, const std::set<uint32_t>& charset) override;
void GenerateAtlas(const Array<char>& fontData, const std::set<uint32_t>& charset) override;
[[deprecated]] void GenerateAtlas(const std::string& fontFile,
const msdf_atlas::Charset& charset = msdf_atlas::Charset::ASCII,
const std::optional<std::string>& pngOutput = std::nullopt);
const msdf_atlas::Charset& charset = msdf_atlas::Charset::ASCII);
void GenerateAtlas(const msdfgen::byte* fontData, int length,
const msdf_atlas::Charset& charset = msdf_atlas::Charset::ASCII,
const std::optional<std::string>& pngOutput = std::nullopt);
const msdf_atlas::Charset& charset = msdf_atlas::Charset::ASCII);
void SetGeneratorConfig(const Config& config) { m_config = config; }
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<std::string>& pngOutput);
void Generate(msdfgen::FreetypeHandle* ft, msdfgen::FontHandle* font, const msdf_atlas::Charset& chset);
private:
Config m_config;
};