mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-26 07:57:59 -04:00
font: calculate underline/strikeout metrics in font, not main
This commit is contained in:
parent
780a346071
commit
5a0bb292ee
2 changed files with 41 additions and 43 deletions
41
font.c
41
font.c
|
|
@ -4,9 +4,12 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
#include <math.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <threads.h>
|
#include <threads.h>
|
||||||
|
|
||||||
|
#include <freetype/tttables.h>
|
||||||
|
|
||||||
#define LOG_MODULE "font"
|
#define LOG_MODULE "font"
|
||||||
#define LOG_ENABLE_DBG 0
|
#define LOG_ENABLE_DBG 0
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
@ -35,6 +38,43 @@ fini(void)
|
||||||
FcFini();
|
FcFini();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
underline_strikeout_metrics(struct font *font)
|
||||||
|
{
|
||||||
|
FT_Face ft_face = font->face;
|
||||||
|
double x_scale = ft_face->size->metrics.x_scale / 65526.;
|
||||||
|
double height = ft_face->size->metrics.height / 64;
|
||||||
|
double descent = ft_face->size->metrics.descender / 64;
|
||||||
|
|
||||||
|
LOG_DBG("ft: x-scale: %f, height: %f, descent: %f",
|
||||||
|
x_scale, height, descent);
|
||||||
|
|
||||||
|
font->underline.position = round(ft_face->underline_position * x_scale / 64.);
|
||||||
|
font->underline.thickness = ceil(ft_face->underline_thickness * x_scale / 64.);
|
||||||
|
|
||||||
|
if (font->underline.position == 0.) {
|
||||||
|
font->underline.position = round(descent / 2.);
|
||||||
|
font->underline.thickness = fabs(round(descent / 5.));
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_DBG("underline: pos=%d, thick=%d",
|
||||||
|
font->underline.position, font->underline.thickness);
|
||||||
|
|
||||||
|
TT_OS2 *os2 = FT_Get_Sfnt_Table(ft_face, ft_sfnt_os2);
|
||||||
|
if (os2 != NULL) {
|
||||||
|
font->strikeout.position = round(os2->yStrikeoutPosition * x_scale / 64.);
|
||||||
|
font->strikeout.thickness = ceil(os2->yStrikeoutSize * x_scale / 64.);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (font->strikeout.position == 0.) {
|
||||||
|
font->strikeout.position = round(height / 2. + descent);
|
||||||
|
font->strikeout.thickness = font->underline.thickness;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_DBG("strikeout: pos=%d, thick=%d",
|
||||||
|
font->strikeout.position, font->strikeout.thickness);
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
from_font_set(FcPattern *pattern, FcFontSet *fonts, int start_idx, const font_list_t *fallbacks,
|
from_font_set(FcPattern *pattern, FcFontSet *fonts, int start_idx, const font_list_t *fallbacks,
|
||||||
const char *attributes, struct font *font, bool is_fallback)
|
const char *attributes, struct font *font, bool is_fallback)
|
||||||
|
|
@ -196,6 +236,7 @@ from_font_set(FcPattern *pattern, FcFontSet *fonts, int start_idx, const font_li
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
underline_strikeout_metrics(font);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
43
main.c
43
main.c
|
|
@ -17,7 +17,6 @@
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
#include <freetype/tttables.h>
|
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
#include <wayland-cursor.h>
|
#include <wayland-cursor.h>
|
||||||
#include <xdg-shell.h>
|
#include <xdg-shell.h>
|
||||||
|
|
@ -635,48 +634,6 @@ main(int argc, char *const *argv)
|
||||||
|
|
||||||
tll_free(font_names);
|
tll_free(font_names);
|
||||||
|
|
||||||
/* Underline position and size */
|
|
||||||
for (size_t i = 0; i < sizeof(term.fonts) / sizeof(term.fonts[0]); i++) {
|
|
||||||
struct font *f = &term.fonts[i];
|
|
||||||
|
|
||||||
if (f->face == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
FT_Face ft_face = f->face;
|
|
||||||
|
|
||||||
double x_scale = ft_face->size->metrics.x_scale / 65526.;
|
|
||||||
double height = ft_face->size->metrics.height / 64;
|
|
||||||
double descent = ft_face->size->metrics.descender / 64;
|
|
||||||
|
|
||||||
LOG_DBG("ft: x-scale: %f, height: %f, descent: %f",
|
|
||||||
x_scale, height, descent);
|
|
||||||
|
|
||||||
f->underline.position = round(ft_face->underline_position * x_scale / 64.);
|
|
||||||
f->underline.thickness = ceil(ft_face->underline_thickness * x_scale / 64.);
|
|
||||||
|
|
||||||
if (f->underline.position == 0.) {
|
|
||||||
f->underline.position = round(descent / 2.);
|
|
||||||
f->underline.thickness = fabs(round(descent / 5.));
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_DBG("underline: pos=%d, thick=%d",
|
|
||||||
f->underline.position, f->underline.thickness);
|
|
||||||
|
|
||||||
TT_OS2 *os2 = FT_Get_Sfnt_Table(ft_face, ft_sfnt_os2);
|
|
||||||
if (os2 != NULL) {
|
|
||||||
f->strikeout.position = round(os2->yStrikeoutPosition * x_scale / 64.);
|
|
||||||
f->strikeout.thickness = ceil(os2->yStrikeoutSize * x_scale / 64.);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f->strikeout.position == 0.) {
|
|
||||||
f->strikeout.position = round(height / 2. + descent);
|
|
||||||
f->strikeout.thickness = f->underline.thickness;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_DBG("strikeout: pos=%d, thick=%d",
|
|
||||||
f->strikeout.position, f->strikeout.thickness);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
FT_Face ft_face = term.fonts[0].face;
|
FT_Face ft_face = term.fonts[0].face;
|
||||||
int max_x_advance = ft_face->size->metrics.max_advance / 64;
|
int max_x_advance = ft_face->size->metrics.max_advance / 64;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue