Allow specifying monospace when calling fc_match

This commit is contained in:
Kovid Goyal 2018-10-24 06:45:06 +05:30
parent 60fa812b60
commit 6bf290149e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -114,6 +114,7 @@ _fc_match(FcPattern *pat) {
FcResult result; FcResult result;
FcConfigSubstitute(NULL, pat, FcMatchPattern); FcConfigSubstitute(NULL, pat, FcMatchPattern);
FcDefaultSubstitute(pat); FcDefaultSubstitute(pat);
/* printf("fc_match = %s\n", FcNameUnparse(pat)); */
match = FcFontMatch(NULL, pat, &result); match = FcFontMatch(NULL, pat, &result);
if (match == NULL) { PyErr_SetString(PyExc_KeyError, "FcFontMatch() failed"); goto end; } if (match == NULL) { PyErr_SetString(PyExc_KeyError, "FcFontMatch() failed"); goto end; }
ans = pattern_as_dict(match); ans = pattern_as_dict(match);
@ -145,16 +146,22 @@ end:
static PyObject* static PyObject*
fc_match(PyObject UNUSED *self, PyObject *args) { fc_match(PyObject UNUSED *self, PyObject *args) {
char *family = NULL; char *family = NULL;
int bold = 0, italic = 0, allow_bitmapped_fonts = 0; int bold = 0, italic = 0, allow_bitmapped_fonts = 0, monospaced = 0;
double size_in_pts = 0, dpi = 0; double size_in_pts = 0, dpi = 0;
FcPattern *pat = NULL; FcPattern *pat = NULL;
PyObject *ans = NULL; PyObject *ans = NULL;
if (!PyArg_ParseTuple(args, "|zpppdd", &family, &bold, &italic, &allow_bitmapped_fonts, &size_in_pts, &dpi)) return NULL; if (!PyArg_ParseTuple(args, "|zppppdd", &family, &bold, &italic, &monospaced, &allow_bitmapped_fonts, &size_in_pts, &dpi)) return NULL;
pat = FcPatternCreate(); pat = FcPatternCreate();
if (pat == NULL) return PyErr_NoMemory(); if (pat == NULL) return PyErr_NoMemory();
if (family && strlen(family) > 0) AP(FcPatternAddString, FC_FAMILY, (const FcChar8*)family, "family"); if (family && strlen(family) > 0) AP(FcPatternAddString, FC_FAMILY, (const FcChar8*)family, "family");
if (monospaced) {
// pass the family,monospace as the family parameter to fc-match,
// which will fallback to using monospace if the family does not match.
AP(FcPatternAddString, FC_FAMILY, (const FcChar8*)"monospace", "family");
AP(FcPatternAddInteger, FC_SPACING, FC_MONO, "spacing");
}
if (!allow_bitmapped_fonts) { if (!allow_bitmapped_fonts) {
AP(FcPatternAddBool, FC_OUTLINE, true, "outline"); AP(FcPatternAddBool, FC_OUTLINE, true, "outline");
AP(FcPatternAddBool, FC_SCALABLE, true, "scalable"); AP(FcPatternAddBool, FC_SCALABLE, true, "scalable");