From 5b0e2311e9d083eca8fff90218f81dffa5ea3f4c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 25 Oct 2017 14:45:41 +0530 Subject: [PATCH] Store hinting flags on the Face object --- kitty/fonts/fontconfig.py | 6 +++--- kitty/fonts/freetype.py | 6 +++--- kitty/freetype.c | 31 ++++++++++++++++--------------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/kitty/fonts/fontconfig.py b/kitty/fonts/fontconfig.py index ecbf23e2b..ccae6679a 100644 --- a/kitty/fonts/fontconfig.py +++ b/kitty/fonts/fontconfig.py @@ -102,7 +102,7 @@ def get_font_files(opts): return ans n = get_font_information(get_family()) - ans['regular'] = n._replace(face=Face(n.face, n.index)) + ans['regular'] = n._replace(face=Face(n.face, n.index, n.hinting, n.hintstyle)) def do(key): b = get_font_information( @@ -111,7 +111,7 @@ def get_font_files(opts): italic=key in ('italic', 'bi') ) if b.face != n.face: - ans[key] = b._replace(face=Face(b.face, b.index)) + ans[key] = b._replace(face=Face(b.face, b.index, b.hinting, b.hintstyle)) do('bold'), do('italic'), do('bi') return ans @@ -119,4 +119,4 @@ def get_font_files(opts): def font_for_family(family): ans = get_font_information(family) - return ans._replace(face=Face(ans.face, ans.index)) + return ans._replace(face=Face(ans.face, ans.index, ans.hinting, ans.hintstyle)) diff --git a/kitty/fonts/freetype.py b/kitty/fonts/freetype.py index 9bb759d66..77ad75ef8 100644 --- a/kitty/fonts/freetype.py +++ b/kitty/fonts/freetype.py @@ -27,7 +27,7 @@ def set_char_size(face, width=0, height=0, hres=0, vres=0): def load_char(font, face, text): - face.load_char(text, font.hinting, font.hintstyle) + face.load_char(ord(text[0])) def calc_cell_width(font, face): @@ -178,7 +178,7 @@ def face_for_text(text, bold=False, italic=False): ) face = alt_face_cache.get(font) if face is None: - face = alt_face_cache[font] = Face(font.face, font.index) + face = alt_face_cache[font] = Face(font.face, font.index, font.hinting, font.hintstyle) if face.is_scalable: set_char_size(face, **cff_size) else: @@ -194,7 +194,7 @@ def render_char(text, bold=False, italic=False, width=1): def render_complex_char(text, bold=False, italic=False, width=1): font, face = face_for_text(text, bold, italic) import pprint - pprint.pprint(face.shape(text, font.hinting, font.hintstyle)) + pprint.pprint(face.shape(text)) def place_char_in_cell(bitmap_char): diff --git a/kitty/freetype.c b/kitty/freetype.c index 41e75e8fd..c07c13fb8 100644 --- a/kitty/freetype.c +++ b/kitty/freetype.c @@ -25,6 +25,7 @@ typedef struct { FT_Face face; unsigned int units_per_EM; int ascender, descender, height, max_advance_width, max_advance_height, underline_position, underline_thickness; + int hinting, hintstyle; bool is_scalable; PyObject *path; hb_buffer_t *harfbuzz_buffer; @@ -70,10 +71,10 @@ static PyObject* new(PyTypeObject *type, PyObject *args, PyObject UNUSED *kwds) { Face *self; char *path; - int error; + int error, hinting, hintstyle; long index; /* unsigned int columns=80, lines=24, scrollback=0; */ - if (!PyArg_ParseTuple(args, "sl", &path, &index)) return NULL; + if (!PyArg_ParseTuple(args, "slii", &path, &index, &hinting, &hintstyle)) return NULL; self = (Face *)type->tp_alloc(type, 0); if (self != NULL) { @@ -86,6 +87,7 @@ new(PyTypeObject *type, PyObject *args, PyObject UNUSED *kwds) { #undef CPY self->is_scalable = FT_IS_SCALABLE(self->face); self->harfbuzz_buffer = hb_buffer_create(); + self->hinting = hinting; self->hintstyle = hintstyle; if (self->harfbuzz_buffer == NULL || !hb_buffer_allocation_successful(self->harfbuzz_buffer) || !hb_buffer_pre_allocate(self->harfbuzz_buffer, 20)) { Py_CLEAR(self); return PyErr_NoMemory(); } self->harfbuzz_font = hb_ft_font_create(self->face, NULL); if (self->harfbuzz_font == NULL) { Py_CLEAR(self); return PyErr_NoMemory(); } @@ -138,13 +140,12 @@ get_load_flags(int hinting, int hintstyle, int base) { } static PyObject* -load_char(Face *self, PyObject *args) { -#define load_char_doc "load_char(char, hinting, hintstyle)" - int char_code, hinting, hintstyle, error; - if (!PyArg_ParseTuple(args, "Cpp", &char_code, &hinting, &hintstyle)) return NULL; - int flags = get_load_flags(hinting, hintstyle, FT_LOAD_RENDER); +load_char(Face *self, PyObject *ch) { +#define load_char_doc "load_char(char)" + int char_code = (int)PyLong_AsLong(ch); + int flags = get_load_flags(self->hinting, self->hintstyle, FT_LOAD_RENDER); int glyph_index = FT_Get_Char_Index(self->face, char_code); - error = FT_Load_Glyph(self->face, glyph_index, flags); + int error = FT_Load_Glyph(self->face, glyph_index, flags); if (error) { set_freetype_error("Failed to load glyph, with error:", error); Py_CLEAR(self); return NULL; } Py_RETURN_NONE; } @@ -256,10 +257,10 @@ typedef struct { static inline void -_shape(Face *self, const char *string, int len, int UNUSED hinting, int UNUSED hintstyle, ShapeData *ans) { +_shape(Face *self, const char *string, int len, ShapeData *ans) { hb_buffer_clear_contents(self->harfbuzz_buffer); #ifdef HARBUZZ_HAS_LOAD_FLAGS - hb_ft_font_set_load_flags(self->harfbuzz_font, get_load_flags(hinting, hintstyle, FT_LOAD_DEFAULT)); + hb_ft_font_set_load_flags(self->harfbuzz_font, get_load_flags(self->hinting, self->hintstyle, FT_LOAD_DEFAULT)); #endif hb_buffer_add_utf8(self->harfbuzz_buffer, string, len, 0, len); hb_buffer_guess_segment_properties(self->harfbuzz_buffer); @@ -274,13 +275,13 @@ _shape(Face *self, const char *string, int len, int UNUSED hinting, int UNUSED h static PyObject* shape(Face *self, PyObject *args) { -#define shape_doc "shape(text, hinting, hintstyle)" +#define shape_doc "shape(text)" const char *string; - int hinting, hintstyle, len; - if (!PyArg_ParseTuple(args, "s#ii", &string, &len, &hinting, &hintstyle)) return NULL; + int len; + if (!PyArg_ParseTuple(args, "s#", &string, &len)) return NULL; ShapeData sd; - _shape(self, string, len, hinting, hintstyle, &sd); + _shape(self, string, len, &sd); PyObject *ans = PyTuple_New(sd.length); if (ans == NULL) return NULL; for (unsigned int i = 0; i < sd.length; i++) { @@ -351,7 +352,7 @@ static PyMemberDef members[] = { static PyMethodDef methods[] = { METHOD(set_char_size, METH_VARARGS) - METHOD(load_char, METH_VARARGS) + METHOD(load_char, METH_O) METHOD(shape, METH_VARARGS) METHOD(get_char_index, METH_VARARGS) METHOD(glyph_metrics, METH_NOARGS)