Unified · Split
| @@ -226,7 +226,7 @@ static void · 225 unmodified lines | ||
| 226 | 226 | prepare(Sfont *f, char *s) |
| 227 | 227 | { |
| 228 | 228 | int i, base, n, map, x0, y0; |
| 229 | − int glyph, prevglyph, adv, kern, leftb; | |
| 229 | + int glyph, prevglyph, adv, leftb; | |
| 230 | 230 | float x, shift, subx, suby; |
| 231 | 231 | Rune r; |
| 232 | 232 | Rectangle rect, o; |
| @@ -243,10 +243,14 @@ prepare(Sfont *f, char *s) · 10 unmodified lines | ||
| 243 | 243 | base = 0; |
| 244 | 244 | |
| 245 | 245 | for(i = 0; s[i]; i += n){ |
| 246 | − shift = x - floor(x); | |
| 247 | 246 | n = chartorune(&r, s+i); |
| 248 | 247 | map = r >> 16; |
| 249 | 248 | glyph = f->u2g[map][r&0xffff]; |
| 249 | + | |
| 250 | + if(prevglyph > 0 && glyph > 0 && r != '\n') | |
| 251 | + x += stbtt_GetGlyphKernAdvance(&f->fi, prevglyph, glyph) * f->scale; | |
| 252 | + shift = x - floor(x); | |
| 253 | + | |
| 250 | 254 | if(r != '\n' && glyph > 0){ |
| 251 | 255 | memfillcolor(f->g, DBlack); |
| 252 | 256 | stbtt_MakeGlyphBitmapSubpixelPrefilter( |
| @@ -271,13 +275,13 @@ prepare(Sfont *f, char *s) · 18 unmodified lines | ||
| 271 | 275 | o.min.y = base + f->asc*f->scale + y0; |
| 272 | 276 | memimagedraw(mi, o, f->white, ZP, f->g, ZP, DoutS); |
| 273 | 277 | stbtt_GetGlyphHMetrics(&f->fi, glyph, &adv, &leftb); |
| 274 | − kern = prevglyph ? stbtt_GetGlyphKernAdvance(&f->fi, prevglyph, glyph) : 0; | |
| 275 | − x += (adv + kern)*f->scale; | |
| 278 | + x += adv * f->scale; | |
| 276 | 279 | }else |
| 277 | 280 | glyph = 0; |
| 278 | 281 | prevglyph = glyph; |
| 279 | 282 | if(r == '\n'){ |
| 280 | 283 | x = x0 = 0; |
| 284 | + prevglyph = 0; | |
| 281 | 285 | base += ceil(f->scale * f->lineh); |
| 282 | 286 | } |
| 283 | 287 | } |