System/Utilities/TrueType: Add @stbtt_GetTextWidth()
This commit is contained in:
parent
546fd54a62
commit
80f691385a
3 changed files with 62 additions and 0 deletions
|
@ -50,6 +50,19 @@ U8* @stbtt_RenderText(stbtt_fontinfo* info, I32 b_w, I32 b_h, I32 l_h, I32* word
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
I32 @stbtt_GetTextWidth(stbtt_fontinfo* info, I32 l_h, I32* word, I32* advance = NULL)
|
||||||
|
{
|
||||||
|
U64 reg RDI rdi = info;
|
||||||
|
U64 reg RSI rsi = l_h;
|
||||||
|
U64 reg RDX rdx = word;
|
||||||
|
U64 reg RCX rcx = advance;
|
||||||
|
no_warn rdi, rsi, rdx, rcx;
|
||||||
|
asm {
|
||||||
|
MOV RAX, STBTT_GETTEXTWIDTH
|
||||||
|
CALL RAX
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
U8* @stbtt_GetFontNameDefault(stbtt_fontinfo* font, I32* length)
|
U8* @stbtt_GetFontNameDefault(stbtt_fontinfo* font, I32* length)
|
||||||
{
|
{
|
||||||
U64 reg RDI rdi = font;
|
U64 reg RDI rdi = font;
|
||||||
|
|
|
@ -209,6 +209,7 @@ def generate_iso_c_file():
|
||||||
|
|
||||||
truetype_hc_fixup('STBTT_INITFONT', 'stbtt_InitFont', truetype_bin_path, truetype_hc_path)
|
truetype_hc_fixup('STBTT_INITFONT', 'stbtt_InitFont', truetype_bin_path, truetype_hc_path)
|
||||||
truetype_hc_fixup('STBTT_RENDERTEXT', 'stbtt_RenderText', truetype_bin_path, truetype_hc_path)
|
truetype_hc_fixup('STBTT_RENDERTEXT', 'stbtt_RenderText', truetype_bin_path, truetype_hc_path)
|
||||||
|
truetype_hc_fixup('STBTT_GETTEXTWIDTH', 'stbtt_GetTextWidth', truetype_bin_path, truetype_hc_path)
|
||||||
truetype_hc_fixup('STBTT_GETFONTNAMEDEFAULT', 'stbtt_GetFontNameDefault', truetype_bin_path, truetype_hc_path)
|
truetype_hc_fixup('STBTT_GETFONTNAMEDEFAULT', 'stbtt_GetFontNameDefault', truetype_bin_path, truetype_hc_path)
|
||||||
|
|
||||||
# Fixup addresses for Tlse.HC
|
# Fixup addresses for Tlse.HC
|
||||||
|
|
48
src/truetype/truetype.c
vendored
48
src/truetype/truetype.c
vendored
|
@ -55,4 +55,52 @@ unsigned char* stbtt_RenderText(stbtt_fontinfo* info, int b_w, int b_h, int l_h,
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int stbtt_GetTextWidth(stbtt_fontinfo* info, int l_h, int* word, int* advance)
|
||||||
|
{
|
||||||
|
// https://github.com/justinmeiners/stb-truetype-example
|
||||||
|
|
||||||
|
/* calculate font scaling */
|
||||||
|
float scale = stbtt_ScaleForPixelHeight(info, l_h);
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
|
int ascent, descent, lineGap;
|
||||||
|
stbtt_GetFontVMetrics(info, &ascent, &descent, &lineGap);
|
||||||
|
|
||||||
|
ascent = roundf(ascent * scale);
|
||||||
|
descent = roundf(descent * scale);
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while (word[i]) {
|
||||||
|
/* how wide is this character */
|
||||||
|
int ax;
|
||||||
|
int lsb;
|
||||||
|
stbtt_GetCodepointHMetrics(info, word[i], &ax, &lsb);
|
||||||
|
/* (Note that each Codepoint call has an alternative Glyph version which caches the work required to lookup the character word[i].) */
|
||||||
|
|
||||||
|
/* get bounding box for character (may be offset to account for chars that dip above or below the line) */
|
||||||
|
int c_x1, c_y1, c_x2, c_y2;
|
||||||
|
stbtt_GetCodepointBitmapBox(info, word[i], scale, scale, &c_x1, &c_y1, &c_x2, &c_y2);
|
||||||
|
|
||||||
|
/* compute y (different characters have different heights) */
|
||||||
|
int y = ascent + c_y1;
|
||||||
|
|
||||||
|
/* advance x */
|
||||||
|
x += roundf(ax * scale);
|
||||||
|
|
||||||
|
/* add kerning */
|
||||||
|
int kern;
|
||||||
|
kern = stbtt_GetCodepointKernAdvance(info, word[i], word[i + 1]);
|
||||||
|
x += roundf(kern * scale);
|
||||||
|
|
||||||
|
if (advance) {
|
||||||
|
advance[i] = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
int main() { return 0; }
|
int main() { return 0; }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue