Function to get the named style used by a variable font instance

This commit is contained in:
Kovid Goyal
2024-05-10 22:20:59 +05:30
parent b44ffb9815
commit 1763cbde46
4 changed files with 44 additions and 1 deletions

View File

@@ -939,6 +939,12 @@ get_best_name(CTFace *self, PyObject *nameid) {
return get_best_name_from_name_table(self->name_lookup_table, nameid);
}
static PyObject*
get_variation(CTFace *self) {
RAII_CoreFoundation(CFDictionaryRef, src, CTFontCopyVariation(self->ct_font));
return variation_to_python(src);
}
static PyObject*
get_variable_data(CTFace *self) {
if (!ensure_name_table(self)) return NULL;
@@ -982,6 +988,7 @@ static PyMethodDef methods[] = {
METHODB(display_name, METH_NOARGS),
METHODB(postscript_name, METH_NOARGS),
METHODB(get_variable_data, METH_NOARGS),
METHODB(get_variation, METH_NOARGS),
METHODB(identify_for_debug, METH_NOARGS),
METHODB(set_size, METH_VARARGS),
METHODB(render_sample_text, METH_VARARGS),

View File

@@ -429,6 +429,7 @@ class Face:
def postscript_name(self) -> str: ...
def set_size(self, sz_in_pts: float, dpi_x: float, dpi_y: float) -> None: ...
def render_sample_text(self, text: str, width: int, height: int, fg_color: int = 0xffffff) -> bytes: ...
def get_variation(self) -> Optional[Dict[str, float]]: ...
class CoreTextFont(TypedDict):
@@ -461,6 +462,7 @@ class CTFace:
def postscript_name(self) -> str: ...
def set_size(self, sz_in_pts: float, dpi_x: float, dpi_y: float) -> None: ...
def render_sample_text(self, text: str, width: int, height: int, fg_color: int = 0xffffff) -> bytes: ...
def get_variation(self) -> Optional[Dict[str, float]]: ...
def coretext_all_fonts(monospaced_only: bool) -> Tuple[CoreTextFont, ...]:

View File

@@ -4,7 +4,7 @@
from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Sequence, Tuple, TypedDict, Union
from kitty.constants import is_macos
from kitty.fonts import Descriptor, DesignAxis, FontSpec, Scorer, VariableData, family_name_to_key
from kitty.fonts import Descriptor, DesignAxis, FontSpec, NamedStyle, Scorer, VariableData, family_name_to_key
from kitty.options.types import Options
if TYPE_CHECKING:
@@ -289,5 +289,16 @@ def develop(family: str = '') -> None:
print('Bold-Italic:', s(ff['bi']))
def get_named_style(face: Face) -> Optional[NamedStyle]:
axis_map = face.get_variation()
if axis_map is None:
return None
vd = face.get_variable_data()
for ns in vd['named_styles']:
if ns['axis_values'] == axis_map:
return ns
return None
if __name__ == '__main__':
develop()

View File

@@ -820,6 +820,28 @@ convert_axis_to_python(Face *face, const FT_Var_Axis *src, FT_UInt flags) {
);
}
static PyObject*
get_variation(Face *self, PyObject *a UNUSED) {
RAII_FTMMVar(mm);
FT_Error err;
if ((err = FT_Get_MM_Var(self->face, &mm))) { Py_RETURN_NONE; }
RAII_ALLOC(FT_Fixed, coords, malloc(mm->num_axis * sizeof(FT_Fixed)));
if (!coords) return PyErr_NoMemory();
if ((err = FT_Get_Var_Design_Coordinates(self->face, mm->num_axis, coords))) {
set_freetype_error("Failed to load the variation data from font with error:", err); return NULL;
}
RAII_PyObject(ans, PyDict_New()); if (!ans) return NULL;
uint8_t tag[5];
for (FT_UInt i = 0; i < mm->num_axis; i++) {
double val = coords[i] / 65536.0;
tag_to_string(mm->axis[i].tag, tag);
RAII_PyObject(pval, PyFloat_FromDouble(val));
if (!pval) return NULL;
if (PyDict_SetItemString(ans, (const char*)tag, pval) != 0) return NULL;
}
Py_INCREF(ans); return ans;
}
static PyObject*
get_variable_data(Face *self, PyObject *a UNUSED) {
if (!ensure_name_table(self)) return NULL;
@@ -969,6 +991,7 @@ static PyMethodDef methods[] = {
METHODB(identify_for_debug, METH_NOARGS),
METHODB(extra_data, METH_NOARGS),
METHODB(get_variable_data, METH_NOARGS),
METHODB(get_variation, METH_NOARGS),
METHODB(get_best_name, METH_O),
METHODB(set_size, METH_VARARGS),
METHODB(render_sample_text, METH_VARARGS),