Variable Font with Virtual Master doesn’t work (Figma)

I have a variable font with a virtual master (opsz) set up as outlined here Side bearing deltas / intermediate sidebearings - #23 by SCarewe. That’s working really well in Indesign and FontGauntlet/FontGoggles, but not in Figma. There, the font doesn’t show up as variable at all. I guess the problem is on their end, and I’ll try to file a report so that they can get this fixed – in the meantime, what would be the best way to provide a (working) variable font to my client?

The optical size axis is special. It is supposed to be applied based on the text size. So if you like to allow manual control, use a different axis.

We don’t know how Figma determines if a font is variable. Probably it checks for the presence of a gvar or fvar table. Are those present in your font? The gvar table is probably missing if no glyph has a variation. You could try to add a glyph layer at the virtual master location to a unused glyph, and do a small change to the outlines there, so that a gvar table would be necessary.

1 Like

Hey Jens, thanks for this. I’m in contact with Figma already and we’re trying to resolve this. Please excuse my naivety, but wouldn’t it make sense to write an empty gvar or fvar table in any case?

Could you send me a sample file?

I wrote about fvar and gvar too fast …

An fvar table is required in a variable font, because it describes the variation axes. So it can’t possibly be empty.

The gvar table is optional, and its presence should not be used to determine if a font is variable or not.

The spec also requires the presence of a STAT table in a variable font.

1 Like

For anyone coming back to this, here’s the response by the Figma Engineering team:

The engineers have taken a further look here and confirmed there seems to be an issue with how the font parsing library we use (FreeType) is not able to retrieve variable axis data for this font file. The engineers did indicate it seems likely the font file is malformed and that the missing gvar and avar tables could be contributing to the issue.