mirror of
https://github.com/raysan5/raylib.git
synced 2026-04-10 01:09:10 -04:00
[rtext] Add MeasureTextCodepoints() for direct measurement of codepoints (#5623)
* Measuring length of an array of codepoints * Applied style changes and removed default measurement function
This commit is contained in:
@ -1509,6 +1509,7 @@ RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int codepointCou
|
|||||||
RLAPI void SetTextLineSpacing(int spacing); // Set vertical line spacing when drawing with line-breaks
|
RLAPI void SetTextLineSpacing(int spacing); // Set vertical line spacing when drawing with line-breaks
|
||||||
RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font
|
RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font
|
||||||
RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font
|
RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font
|
||||||
|
RLAPI Vector2 MeasureTextCodepoints(Font font, const int *codepoints, int length, float fontSize, float spacing); // Measure string size for an existing array of codepoints for Font
|
||||||
RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found
|
RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found
|
||||||
RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found
|
RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found
|
||||||
RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found
|
RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found
|
||||||
|
|||||||
58
src/rtext.c
58
src/rtext.c
@ -1388,6 +1388,64 @@ Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing
|
|||||||
return textSize;
|
return textSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Measure string size for an existing array of codepoints for Font
|
||||||
|
Vector2 MeasureTextCodepoints(Font font, const int *codepoints, int length, float fontSize, float spacing)
|
||||||
|
{
|
||||||
|
Vector2 textSize = { 0 };
|
||||||
|
|
||||||
|
// Security check
|
||||||
|
if ((font.texture.id == 0) || (codepoints == NULL) || (length == 0)) return textSize;
|
||||||
|
|
||||||
|
float textWidth = 0.0f;
|
||||||
|
// Used to count longer text line width
|
||||||
|
float tempTextWidth = 0.0f;
|
||||||
|
|
||||||
|
// Used to count longer text line num chars
|
||||||
|
int tempGlyphCounter = 0;
|
||||||
|
int glyphCounter = 0;
|
||||||
|
|
||||||
|
float textHeight = fontSize;
|
||||||
|
float scaleFactor = fontSize/(float)font.baseSize;
|
||||||
|
|
||||||
|
// Current character
|
||||||
|
int letter = 0;
|
||||||
|
// Index position in sprite font
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
letter = codepoints[i];
|
||||||
|
index = GetGlyphIndex(font, letter);
|
||||||
|
|
||||||
|
if (letter != '\n')
|
||||||
|
{
|
||||||
|
glyphCounter++;
|
||||||
|
|
||||||
|
if (font.glyphs[index].advanceX > 0) textWidth += font.glyphs[index].advanceX;
|
||||||
|
else textWidth += (font.recs[index].width + font.glyphs[index].offsetX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (tempTextWidth < textWidth) tempTextWidth = textWidth;
|
||||||
|
|
||||||
|
textWidth = 0;
|
||||||
|
glyphCounter = 0;
|
||||||
|
|
||||||
|
// NOTE: Line spacing is a global variable, use SetTextLineSpacing() to setup
|
||||||
|
textHeight += (fontSize + textLineSpacing);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tempGlyphCounter < glyphCounter) tempGlyphCounter = glyphCounter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tempTextWidth < textWidth) tempTextWidth = textWidth;
|
||||||
|
|
||||||
|
textSize.x = tempTextWidth*scaleFactor + (float)((tempGlyphCounter - 1)*spacing);
|
||||||
|
textSize.y = textHeight;
|
||||||
|
|
||||||
|
return textSize;
|
||||||
|
}
|
||||||
|
|
||||||
// Get index position for a unicode character on font
|
// Get index position for a unicode character on font
|
||||||
// NOTE: If codepoint is not found in the font it fallbacks to '?'
|
// NOTE: If codepoint is not found in the font it fallbacks to '?'
|
||||||
int GetGlyphIndex(Font font, int codepoint)
|
int GetGlyphIndex(Font font, int codepoint)
|
||||||
|
|||||||
Reference in New Issue
Block a user