From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.Client/Common/UI/UIFontData.h | 133 ++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 Minecraft.Client/Common/UI/UIFontData.h (limited to 'Minecraft.Client/Common/UI/UIFontData.h') diff --git a/Minecraft.Client/Common/UI/UIFontData.h b/Minecraft.Client/Common/UI/UIFontData.h new file mode 100644 index 00000000..b7e38ffa --- /dev/null +++ b/Minecraft.Client/Common/UI/UIFontData.h @@ -0,0 +1,133 @@ +#pragma once + +#include + +using namespace std; + +#define _DEBUG_BLOCK_CHARS 0 + +// For hardcoded font data. +struct SFontData +{ +public: + static const unsigned short FONTCOLS = 23; + static const unsigned short FONTROWS = 20; + + static const unsigned short FONTSIZE = FONTCOLS * FONTROWS; + +public: + // Font name. + string m_strFontName; + + // Filename of the glyph archive. + wstring m_wstrFilename; + + // Number of glyphs in the archive. + unsigned int m_uiGlyphCount; + + // Unicode values of each glyph. + unsigned short *m_arrCodepoints; + + // X resolution of glyph archive. + unsigned int m_uiGlyphMapX; + + // Y resolution of glyph archive. + unsigned int m_uiGlyphMapY; + + // Number of columns in the glyph archive. + unsigned int m_uiGlyphMapCols; + + // Number of rows in the glyph archive. + unsigned int m_uiGlyphMapRows; + + // Width of each glyph. + unsigned int m_uiGlyphWidth; + + // Height of each glyph. + unsigned int m_uiGlyphHeight; + + // Ascent of each glyph above the baseline (units?). + float m_fAscent; + + // Descent of each glyph below the baseline (units?). + float m_fDescent; + + // How much to advance for each pixel wide the glyph is. + float m_fAdvPerPixel; + + // How many pixels wide any whitespace characters are. + unsigned int m_uiWhitespaceWidth; + +public: + static unsigned short Codepoints[FONTSIZE]; + static SFontData Mojangles_7; + static SFontData Mojangles_11; +}; + +// Provides a common interface for dealing with font data. +class CFontData +{ +public: + CFontData(); + + // pbRawImage consumed by constructor. + CFontData(SFontData &sFontData, int *pbRawImage); + + // Release memory. + void release(); + +protected: + + // Hardcoded font data. + SFontData *m_sFontData; + + // Map Unicodepoints to glyph ids. + unordered_map m_unicodeMap; + + // Kerning value for each glyph. + unsigned short *m_kerningTable; + + // Binary blob of the archive image. + unsigned char *m_pbRawImage; + + // Total advance of each character. + float *m_pfAdvanceTable; + +public: + + // Accessor for the font name in the internal SFontData. + const string getFontName(); + + // Accessor for the hardcoded internal font data. + SFontData *getFontData(); + + // Get the glyph id corresponding to a unicode point. + unsigned short getGlyphId(unsigned int unicodepoint); + + // Get the unicodepoint corresponding to a glyph id. + unsigned int getUnicode(unsigned short glyphId); + + // Get a pointer to the top left pixel of a row/column in the raw image. + unsigned char *topLeftPixel(int row, int col); + + // Get the row and column where a glyph appears in the archive. + void getPos(unsigned short gyphId, int &row, int &col); + + // Get the advance of this character (units?). + float getAdvance(unsigned short glyphId); + + // Get the width (in pixels) of a given character. + int getWidth(unsigned short glyphId); + + // Returns true if this glyph is whitespace. + bool glyphIsWhitespace(unsigned short glyphId); + + // Returns true if this unicodepoint is whitespace + bool unicodeIsWhitespace(unsigned int unicodepoint); + +private: + + // Move a pointer in an image dx pixels right and dy pixels down, wrap around in either dimension leads to unknown behaviour. + void moveCursor(unsigned char *&cursor, unsigned int dx, unsigned int dy); +}; + -- cgit v1.2.3