LGM Seville Hackfest & Fonts Selection

Just got back from LGM in Seville! It was a very invigorating experience. I had great conversations about Inkscape both with Inkscape users and with Inkscape developers and I did a bit of hacking, getting the user interface working for variable fonts. The organizers did a wonderful job providing a good balance between interesting presentations and time for discussions. I would urge anyone who cares about Free Graphics software to come to next year's conference which will be in Saarbrücken, Germany, probably at the end of May in 2019.

Font Selection

I've been talking about font selection in Inkscape and other programs with lots of people in the past month including graphics designers and font designers. From these discussion I can conclude that designers need a way to quickly weed through lots of fonts to choose the ones they want to use for a particular project. Their requirements include:

  • Being able to preview a font's appearance in different contexts.
  • Being able to know what features are included in a particular font and how they are meant to work (for example, a font may include a stylistic alternate 'Q' with a long tail which is meant to stretch under a 'u').
  • Being able to select fonts that work together, for example matching a sans-serif for headers to a serif for the body.

These needs are quite complex and probably need to be solved outside of Inkscape by a dedicated font selection tool.

But we can improve the Inkscape font experience. Dave Crossland (Google Fonts consultant) suggested adding a new column in the Font tab of the Inkscape Text and Font dialog, to the left of the existing Font Family menu. This column would allow a user to select a set of fonts. Only fonts in the set would be shown in the Font Family menu. A set could be created from inside Inkscape or imported from an external font selection tool.

Dave also suggested a set of lower hanging fruit to fix:

  • Rename the "Variants" tab in the Text and Font dialog to "Features" to avoid confusion with "Variable Fonts".
  • Reorder the tabs so the "Font" and "Variants" tabs are text to each other (or even split into two separate dialogs).
  • Add a "Font Search" entry to the Font Family menu (like in the text toolbar).
  • Allow user reordering of font families.
  • Rename the "Glyphs" dialog to "Unicode Characters" which better reflects what the dialog shows.
  • Change the Font Size drop-down menu to a slider with non-uniform scale and with preset values. (The relative difference between small font sizes is large than at large sizes.)
  • Remove variable font axes from the "Unicode Characters" dialog (which you'll only see if you've got the latest developer Inkscape version AND all the latest harfbuzz/pango/freetype libraries).
  • Switch the variable font axes to use Inkscape's slider widget which allows numerical entry.
  • Font preview for "Features" tab.
  • Better OpenType features discovery.

An improvement desired by many is the immediate update of the font on canvas when the Text and Font dialog is used for font selection (i.e. remove the "Apply" button). This will take a little bit of work, especially with variable fonts due to how we handle fonts internally. (The way it works now we cache a font instance every time a new font face is used. Imagine dragging a variable font axis slider and creating a font face for each value the slider has during the drag. You would soon have hundreds.)

I also discussed the Font Selection dialog with Matthias Classen (Red Hat), the GTK maintainer, at the Boston Hackfest. I contemplated switching our font selector to use the GTK stock font-selector widget (which Matthias has made recent improvement too like handling variable fonts) but I think it would be better to stay with our own for the following reasons:

  • We have two menus, one for family and the other for style. The GTK widget uses just one menu. We'll want to add a third menu for font sets.
  • We include fonts used in the dialog even if they are not on the system (with a warning for users), listing them ahead of other fonts.
  • We handle CSS font fallback lists (e.g. "font-family: "Times New Roman", Times, sans-serif").
  • We disable "faux" font faces (artificially created bold and/or italic faces).
  • We display the font designer style name as well as the CSS name.
  • We have only one entry for faces that cannot be distinguished uniquely by CSS (and Pango), The GTK widget shows all faces, but the rendering is incorrect for some.
  • We display the name of generic fonts (e.g. sans) using the CSS value.
  • We rename some weight to match CSS (e.g. "Book" is mapped to "Normal").

I'm going to be turning my attention to writing SVG 2 tests for the next week or two. It is getting urgent as features without tests will be dropped soon.

Thanks to all my supporters!