Files
palladium/include/pd/lithium/font.hpp
T

125 lines
3.7 KiB
C++
Raw Normal View History

2026-03-22 21:50:53 +01:00
#pragma once
#include <pd/lithium/texture.hpp>
using LiTextFlags = PD::u32;
enum LiTextFlags_ : PD::u32 {
LiTextFlags_None = 0, ///< Do nothing
LiTextFlags_AlignRight = 1 << 0, ///< Align Right of position
LiTextFlags_AlignMid = 1 << 1, ///< Align in the middle of pos and box
LiTextFlags_Shaddow = 1 << 2, ///< Draws the text twice to create shaddow
LiTextFlags_Wrap = 1 << 3, ///< Wrap Text: May be runs better with TMS
LiTextFlags_Short = 1 << 4, ///< Short Text: May be runs better with TMS
LiTextFlags_Scroll = 1 << 5, ///< Not implemented [scoll text if to long]
LiTextFlags_NoOOS = 1 << 6, ///< No Out of Screen Rendering
};
2026-09-05 11:56:13 +02:00
using LiFontFlags = PD::u32;
enum LiFontFlags_ : PD::u32 {
LiFontFlags_None = 0, ///< Not special (bitmap font)
LiFontFlags_SDF = 1 << 0, ///< SDF Texture (and mode)
LiFontFlags_Monospace = 1 << 1, ///< Monospace Rendering
};
2026-03-22 21:50:53 +01:00
namespace PD {
namespace Li {
class Drawlist;
class PD_API Font {
public:
struct Codepoint {
2026-03-25 22:24:54 +01:00
u32 pCodepoint = 0;
2026-03-22 21:50:53 +01:00
fvec4 SimpleUV;
2026-03-25 22:24:54 +01:00
size_t Tex = 0;
2026-03-22 21:50:53 +01:00
fvec2 Size;
2026-09-05 11:56:13 +02:00
fvec2 Offset;
// float Offset = 0.f;
float AdvanceX = 0.f;
2026-03-25 22:24:54 +01:00
bool pInvalid = false;
2026-03-22 21:50:53 +01:00
};
Font() {}
~Font() {}
2026-09-05 11:56:13 +02:00
bool IsMonospace() { return pFlags & LiFontFlags_Monospace; }
bool IsSDF() { return pFlags & LiFontFlags_SDF; }
2026-03-22 21:50:53 +01:00
/**
* Load a TTF File
* @param path Path to the TTF file
* @param px_height Pixelheight of the codepoints (limit by 64)
*/
2026-09-05 11:56:13 +02:00
void LoadTTF(const std::string& path, int px_height = 32,
LiFontFlags flags = LiFontFlags_None);
2026-03-22 21:50:53 +01:00
/**
* Load a TTF File from Memory
* @param data File data
* @param px_height Pixelheight of the codepoints (limit by 64)
*/
2026-09-05 11:56:13 +02:00
void LoadTTF(const std::vector<u8>& data, int px_height = 32,
LiFontFlags flags = LiFontFlags_None);
2026-03-22 21:50:53 +01:00
/**
* Function that loads a default integrated font...
* This will only work if PD_LI_INCLUDE_FONTS was set
* on lithium build cause otherwise the font data is not included
*/
void LoadDefaultFont(int id = 0, int pixel_height = 32);
/**
* Getter for Codepoint reference
* @return codepoint dataholder reference
*/
Codepoint& GetCodepoint(u32 c);
/**
* Get Text Bounding Box
*/
fvec2 GetTextBounds(const char* text, float scale);
/**
* Extended Draw Text Function that vreates a Command List
*/
void CmdTextEx(Drawlist& dl, const fvec2& pos, u32 color, float scale,
const char* text, LiTextFlags flags = 0, const fvec2& box = 0);
2026-03-26 21:01:43 +01:00
/**
* Cleanup Font and unload Textures
*/
void Delete();
2026-03-22 21:50:53 +01:00
/**
* Garbage collection for TextMapSystem
*/
void CleanupTMS();
/**
* Utility function to create a font atlas
* During TTF loading (Internal and should not be called)
*/
void BakeAndPush(bool final, std::vector<u8>& font_tex, int texszs);
std::string pWrapText(const std::string& txt, float scale,
const PD::fvec2& max, PD::fvec2& dim);
std::string pShortText(const std::string& txt, float scale,
const PD::fvec2& max, PD::fvec2& dim);
/** Data Section */
int PixelHeight = 0;
2026-03-26 21:01:43 +01:00
int DefaultPixelHeight = 32;
2026-03-22 21:50:53 +01:00
std::vector<TextureID> Textures;
/**
* 32Bit Codepoint Dataholder reference map
* **Now using unordered map**
*/
std::unordered_map<u32, Codepoint> CodeMap;
2026-09-01 21:20:52 +02:00
/** need some performance tweaks */
std::array<Codepoint, 128> pAsciiCache;
2026-03-22 21:50:53 +01:00
/** TMS */
struct TMELEM {
PD::u32 ID;
PD::fvec2 Size;
std::string Text;
u64 TimeStamp;
};
std::unordered_map<u32, TMELEM> pTMS;
private:
size_t pCurrentTex = 0;
2026-09-05 11:56:13 +02:00
LiFontFlags pFlags = 0;
2026-03-22 21:50:53 +01:00
};
} // namespace Li
} // namespace PD