font: move metrics from terminal struct to font struct

This commit is contained in:
Daniel Eklöf 2019-11-26 18:54:32 +01:00
parent 431800a8a5
commit bc86cd61c7
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 35 additions and 34 deletions

16
font.c
View file

@ -245,6 +245,22 @@ from_font_set(FcPattern *pattern, FcFontSet *fonts, int start_idx,
font->glyph_cache = calloc(cache_size, sizeof(font->glyph_cache[0]));
}
double max_x_advance = ft_face->size->metrics.max_advance / 64.;
double height= ft_face->size->metrics.height / 64.;
double descent = ft_face->size->metrics.descender / 64.;
double ascent = ft_face->size->metrics.ascender / 64.;
font->height = ceil(height * font->pixel_size_fixup);
font->descent = ceil(-descent * font->pixel_size_fixup);
font->ascent = ceil(ascent * font->pixel_size_fixup);
font->max_x_advance = ceil(max_x_advance * font->pixel_size_fixup);
LOG_DBG("%s: size=%f, pixel-size=%f, dpi=%f, fixup-factor: %f, "
"line-height: %d, ascent: %d, descent: %d, x-advance: %d",
font->name, size, pixel_size, dpi, font->pixel_size_fixup,
font->height, font->ascent, font->descent,
font->max_x_advance);
underline_strikeout_metrics(font);
return true;
}

6
font.h
View file

@ -46,6 +46,12 @@ struct font {
double pixel_size_fixup; /* Scale factor - should only be used with ARGB32 glyphs */
bool bgr; /* True for FC_RGBA_BGR and FC_RGBA_VBGR */
/* font extents */
int height;
int descent;
int ascent;
int max_x_advance;
struct {
int position;
int thickness;

View file

@ -83,19 +83,19 @@ pixman_color_dim_for_search(pixman_color_t *color)
static inline int
font_baseline(const struct terminal *term)
{
assert(term->fextents.ascent >= 0);
assert(term->fextents.descent >= 0);
assert(term->fonts[0]->ascent >= 0);
assert(term->fonts[0]->descent >= 0);
int diff = term->fextents.height - (term->fextents.ascent + term->fextents.descent);
int diff = term->fonts[0]->height - (term->fonts[0]->ascent + term->fonts[0]->descent);
#if 0
LOG_INFO("height=%d, ascent=%d, descent=%d, diff=%d",
term->fextents.height,
term->fextents.ascent, term->fextents.descent,
term->fonts[0]->height,
term->fonts[0]->ascent, term->fonts[0]->descent,
diff);
#endif
return term->fextents.height - diff / 2 - term->fextents.descent;
return term->fonts[0]->height - diff / 2 - term->fonts[0]->descent;
}
static void
@ -103,12 +103,12 @@ draw_bar(const struct terminal *term, pixman_image_t *pix,
const struct font *font,
const pixman_color_t *color, int x, int y)
{
int baseline = y + font_baseline(term) - term->fextents.ascent;
int baseline = y + font_baseline(term) - term->fonts[0]->ascent;
pixman_image_fill_rectangles(
PIXMAN_OP_SRC, pix, color,
1, &(pixman_rectangle16_t){
x, baseline,
font->underline.thickness, term->fextents.ascent + term->fextents.descent});
font->underline.thickness, term->fonts[0]->ascent + term->fonts[0]->descent});
}
static void
@ -280,7 +280,7 @@ render_cell(struct terminal *term, pixman_image_t *pix,
if (!(cell->attrs.blink && term->blink.state == BLINK_OFF)) {
pixman_image_composite32(
PIXMAN_OP_OVER, glyph->pix, NULL, pix, 0, 0, 0, 0,
x + glyph->x, y + term->fextents.ascent - glyph->y,
x + glyph->x, y + term->fonts[0]->ascent - glyph->y,
glyph->width, glyph->height);
}
} else {
@ -289,7 +289,7 @@ render_cell(struct terminal *term, pixman_image_t *pix,
pixman_image_t *src = pixman_image_create_solid_fill(&fg);
pixman_image_composite32(
PIXMAN_OP_OVER, src, glyph->pix, pix, 0, 0, 0, 0,
x + glyph->x, y + term->fextents.ascent - glyph->y,
x + glyph->x, y + term->fonts[0]->ascent - glyph->y,
glyph->width, glyph->height);
pixman_image_unref(src);
}
@ -786,7 +786,7 @@ render_search_box(struct terminal *term)
pixman_image_t *src = pixman_image_create_solid_fill(&fg);
pixman_image_composite32(
PIXMAN_OP_OVER, src, glyph->pix, buf->pix, 0, 0, 0, 0,
x + glyph->x, y + term->fextents.ascent - glyph->y,
x + glyph->x, y + term->fonts[0]->ascent - glyph->y,
glyph->width, glyph->height);
pixman_image_unref(src);

View file

@ -377,21 +377,6 @@ initialize_fonts(struct terminal *term, const struct config *conf)
}
tll_free(font_names);
FT_Face ft_face = term->fonts[0]->face;
int max_x_advance = ft_face->size->metrics.max_advance / 64;
int height = ft_face->size->metrics.height / 64;
int descent = ft_face->size->metrics.descender / 64;
int ascent = ft_face->size->metrics.ascender / 64;
term->fextents.height = height * term->fonts[0]->pixel_size_fixup;
term->fextents.descent = -descent * term->fonts[0]->pixel_size_fixup;
term->fextents.ascent = ascent * term->fonts[0]->pixel_size_fixup;
term->fextents.max_x_advance = max_x_advance * term->fonts[0]->pixel_size_fixup;
LOG_DBG("metrics: height: %d, descent: %d, ascent: %d, x-advance: %d",
height, descent, ascent, max_x_advance);
return true;
}
@ -529,8 +514,8 @@ term_init(const struct config *conf, struct fdm *fdm, struct wayland *wayl,
goto err;
/* Cell dimensions are based on the font metrics. Obviously */
term->cell_width = (int)ceil(term->fextents.max_x_advance);
term->cell_height = (int)ceil(term->fextents.height);
term->cell_width = term->fonts[0]->max_x_advance;
term->cell_height = term->fonts[0]->height;
LOG_INFO("cell width=%d, height=%d", term->cell_width, term->cell_height);
/* Start the slave/client */

View file

@ -265,12 +265,6 @@ struct terminal {
struct grid *grid;
struct font *fonts[4];
struct {
int height;
int descent;
int ascent;
int max_x_advance;
} fextents;
tll(int) tab_stops;