[varfonts] Use fvar data even if there's no variation in it

This commit is contained in:
Behdad Esfahbod 2017-09-18 14:52:17 -04:00
parent 38a6d6fba0
commit 01f14de417
1 changed files with 18 additions and 9 deletions

View File

@ -1255,7 +1255,7 @@ FcFreeTypeQueryFace (const FT_Face face,
double max_value = master->axis[i].maximum / (double) (1 << 16); double max_value = master->axis[i].maximum / (double) (1 << 16);
const char *elt = NULL; const char *elt = NULL;
if (min_value > def_value || def_value > max_value || min_value == max_value) if (min_value > def_value || def_value > max_value)
continue; continue;
switch (master->axis[i].tag) switch (master->axis[i].tag)
@ -1264,33 +1264,42 @@ FcFreeTypeQueryFace (const FT_Face face,
elt = FC_WEIGHT; elt = FC_WEIGHT;
min_value = FcWeightFromOpenType (min_value); min_value = FcWeightFromOpenType (min_value);
max_value = FcWeightFromOpenType (max_value); max_value = FcWeightFromOpenType (max_value);
variable = variable_weight = FcTrue; variable_weight = FcTrue;
weight = 0; /* To stop looking for weight. */ weight = 0; /* To stop looking for weight. */
break; break;
case FT_MAKE_TAG ('w','d','t','h'): case FT_MAKE_TAG ('w','d','t','h'):
elt = FC_WIDTH; elt = FC_WIDTH;
/* Values in 'wdth' match Fontconfig FC_WIDTH_* scheme directly. */ /* Values in 'wdth' match Fontconfig FC_WIDTH_* scheme directly. */
variable = variable_width = FcTrue; variable_width = FcTrue;
width = 0; /* To stop looking for width. */ width = 0; /* To stop looking for width. */
break; break;
case FT_MAKE_TAG ('o','p','s','z'): case FT_MAKE_TAG ('o','p','s','z'):
elt = FC_SIZE; elt = FC_SIZE;
/* Values in 'opsz' match Fontconfig FC_SIZE, both are in points. */ /* Values in 'opsz' match Fontconfig FC_SIZE, both are in points. */
variable = variable_size = FcTrue; variable_size = FcTrue;
break; break;
} }
if (elt) if (elt)
{ {
FcRange *r = FcRangeCreateDouble (min_value, max_value); if (min_value == max_value)
if (!FcPatternAddRange (pat, elt, r))
{ {
FcRangeDestroy (r); if (!FcPatternAddDouble (pat, elt, min_value))
goto bail1; goto bail1;
}
else
{
FcRange *r = FcRangeCreateDouble (min_value, max_value);
if (!FcPatternAddRange (pat, elt, r))
{
FcRangeDestroy (r);
goto bail1;
}
FcRangeDestroy (r);
variable = FcTrue;
} }
FcRangeDestroy (r);
} }
} }