fc-pattern/fc-pattern.c | 2 - src/fcmatch.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++-- src/fcpat.c | 10 +++++++- 3 files changed, 61 insertions(+), 5 deletions(-) New commits: commit 650b051a2562ab5813d0671323e00f31cd79b37b Author: Behdad Esfahbod <behdad@xxxxxxxxxx> Date: Tue Dec 19 15:04:25 2017 -0500 Set font-variations settings for standard axes in variable fonts This is the last piece of the puzzle for variable-font support in fontconfig. This takes care of automatically setting the variation settings when user requests a weight / width / size that has variation in the matched font. diff --git a/src/fcmatch.c b/src/fcmatch.c index 04301f9..4656417 100644 --- a/src/fcmatch.c +++ b/src/fcmatch.c @@ -531,10 +531,22 @@ FcFontRenderPrepare (FcConfig *config, FcPatternElt *fe, *pe; FcValue v; FcResult result; + FcBool variable = FcFalse; + FcStrBuf variations; assert (pat != NULL); assert (font != NULL); + FcPatternObjectGetBool (font, FC_VARIABLE_OBJECT, 0, &variable); + assert (variable != FcDontCare); + if (variable) + { + FcChar8 *vars = NULL; + FcStrBufInit (&variations, NULL, 0); + if (FcPatternObjectGetString (pat, FC_FONT_VARIATIONS_OBJECT, 0, &vars) == FcResultMatch) + FcStrBufString (&variations, vars); + } + new = FcPatternCreate (); if (!new) return NULL; @@ -639,6 +651,39 @@ FcFontRenderPrepare (FcConfig *config, return NULL; } FcPatternObjectAdd (new, fe->object, v, FcFalse); + + /* Set font-variations settings for standard axes in variable fonts. */ + if (variable && + FcPatternEltValues(fe)->value.type == FcTypeRange && + (fe->object == FC_WEIGHT_OBJECT || + fe->object == FC_WIDTH_OBJECT || + fe->object == FC_SIZE_OBJECT)) + { + double num; + FcChar8 temp[128]; + const char *tag = " "; + assert (v.type == FcTypeDouble); + num = v.u.d; + if (variations.len) + FcStrBufChar (&variations, ','); + switch (fe->object) + { + case FC_WEIGHT_OBJECT: + tag = "wght"; + num = FcWeightToOpenType (num); + break; + + case FC_WIDTH_OBJECT: + tag = "wdth"; + break; + + case FC_SIZE_OBJECT: + tag = "opsz"; + break; + } + sprintf ((char *) temp, "%4s=%g", tag, num); + FcStrBufString (&variations, temp); + } } else { @@ -652,8 +697,6 @@ FcFontRenderPrepare (FcConfig *config, if (!l) goto bail0; dir = FcStrDirname (FcValueString (&l->value)); - if (!config) - config = FcConfigGetCurrent (); if (config && FcHashTableFind (config->alias_table, dir, (void **) &alias)) { FcChar8 *base = FcStrBasename (FcValueString (&l->value)); @@ -696,6 +739,13 @@ FcFontRenderPrepare (FcConfig *config, } } + if (variable) + { + FcPatternObjectDel (new, FC_FONT_VARIATIONS_OBJECT); + FcPatternObjectAddString (new, FC_FONT_VARIATIONS_OBJECT, FcStrBufDoneStatic (&variations)); + FcStrBufDestroy (&variations); + } + FcConfigSubstituteWithPat (config, new, pat, FcMatchFont); return new; } diff --git a/src/fcpat.c b/src/fcpat.c index dd1307d..e624aea 100644 --- a/src/fcpat.c +++ b/src/fcpat.c @@ -1021,12 +1021,12 @@ FcPatternGetMatrix(const FcPattern *p, const char *object, int id, FcMatrix **m) FcResult -FcPatternGetBool(const FcPattern *p, const char *object, int id, FcBool *b) +FcPatternObjectGetBool (const FcPattern *p, FcObject object, int id, FcBool *b) { FcValue v; FcResult r; - r = FcPatternGet (p, object, id, &v); + r = FcPatternObjectGet (p, object, id, &v); if (r != FcResultMatch) return r; if (v.type != FcTypeBool) @@ -1036,6 +1036,12 @@ FcPatternGetBool(const FcPattern *p, const char *object, int id, FcBool *b) } FcResult +FcPatternGetBool(const FcPattern *p, const char *object, int id, FcBool *b) +{ + return FcPatternObjectGetBool (p, FcObjectFromName (object), id, b); +} + +FcResult FcPatternGetCharSet(const FcPattern *p, const char *object, int id, FcCharSet **c) { FcValue v; commit 288d3348122a695615c39d82142d988e56064b9f Author: Behdad Esfahbod <behdad@xxxxxxxxxx> Date: Mon Dec 18 23:51:17 2017 -0500 Minor diff --git a/fc-pattern/fc-pattern.c b/fc-pattern/fc-pattern.c index 37c5ccf..f63761c 100644 --- a/fc-pattern/fc-pattern.c +++ b/fc-pattern/fc-pattern.c @@ -86,7 +86,7 @@ usage (char *program, int error) fprintf (file, "\n"); #if HAVE_GETOPT_LONG fprintf (file, _(" -c, --config perform config substitution on pattern\n")); - fprintf (file, _(" -d, -default perform default substitution on pattern\n")); + fprintf (file, _(" -d, --default perform default substitution on pattern\n")); fprintf (file, _(" -f, --format=FORMAT use the given output format\n")); fprintf (file, _(" -V, --version display font config version and exit\n")); fprintf (file, _(" -h, --help display this help and exit\n")); _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/fontconfig