font: add support for fallback fonts

A top-level font now has a list of fallback fonts. When a glyph cannot
be found, we try each fallback font in turn, until we either find one
that has the glyph, or until we've exhausted the list.

To make this actually work in practise (read: to make performance
acceptable), the cache is re-worked and is now populated on demand.

It also supports non-ASCII characters, by using the 4-byte unicode
character as index instead.

Since having an array that can be indexed by a 4-byte value isn't
really viable, we now have a simple hash table instead of an array.
This commit is contained in:
Daniel Eklöf 2019-07-30 18:04:28 +02:00
parent 85ef9df586
commit 73b4d5d05a
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
7 changed files with 280 additions and 127 deletions

View file

@ -7,17 +7,13 @@
#include <threads.h>
#include <semaphore.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_LCD_FILTER_H
#include <cairo.h>
#include <wayland-client.h>
#include <primary-selection-unstable-v1.h>
#include <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-keysyms.h>
#include "font.h"
#include "tllist.h"
#define likely(c) __builtin_expect(!!(c), 1)
@ -211,36 +207,6 @@ struct primary {
uint32_t serial;
};
struct glyph {
void *data;
cairo_surface_t *surf;
int left;
int top;
int format;
int width;
int height;
int stride;
};
struct font {
FT_Face face;
int load_flags;
int render_flags;
FT_LcdFilter lcd_filter;
struct {
double position;
double thickness;
} underline;
struct {
double position;
double thickness;
} strikeout;
struct glyph cache[256];
mtx_t lock;
};
enum cursor_style { CURSOR_BLOCK, CURSOR_UNDERLINE, CURSOR_BAR };
struct terminal {