Store hinting flags on the Face object

This commit is contained in:
Kovid Goyal 2017-10-25 14:45:41 +05:30
parent 25c6735a5f
commit 5b0e2311e9
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 22 additions and 21 deletions

View File

@ -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))

View File

@ -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):

View File

@ -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)