memononen/fontstash

why need to xadvance * 10.0f?

tailangjun opened this issue · 6 comments

why need to xadvance * 10.0f?

glyph->xadv = (short)(scale * advance * 10.0f)
*x += (int)(glyph->xadv / 10.0f + 0.5f);

xadv is in kind of fixed point. the value type is short and there's need for more precision. I cannot remember why I used short instead of float for xadv. Maybe I wanted to save few bytes and the short fit better into the struct.

thank you very much!

Another question, I cannot understand the role of xoff and yoff. If has a pictures of glyph and texAtlas will be fine.

struct FONSglyph
{
unsigned int codepoint;
int index;
int next;
short size, blur;
short x0,y0,x1,y1;
short xadv,xoff,yoff;
};

Probably my understanding of stbtt_GetGlyphBitmapBox(..., x0, y0, x1, y1) is wrong.
Is x0 = bearingX, y0 = bearingY?

The (x0,y0) (x1,y1) is the bitmap inside the atlas. When rendering a glyph, the (0,0) is at the baseline. For example character y needs to move the bitmap down, and character ' higher up. xoff and yoff is that offset.

Also, note that the x0,y0,x1,y1 used by fons__tt_buildGlyphBitmap are different than the ones in * FONSglyph*. See: https://github.com/memononen/fontstash/blob/master/src/fontstash.h#L1053
The padding there is necessary so that when you render the glyphs the neighbour bitmap in atlas data will not leak.