Stylistic Sets vs Character Variants

Genuine and stupid Question:
What is the disadvantage of CVs compared to SSs (apart from not being able to name them)?

1 Like

Lack of third-party app support. A few apps support SSXX, but even fewer support CVXX. Not an issue if the font is intended for the web.

There’s no point in naming CVXX because by definition two glyphs with the same cvXX suffix have nothing in common, they do not form a set.

1 Like

I take it CVs are also no problem for developer apps? Since it is used in Fira Code extensively.

Sorry, I need follow up here: I can create a set alternates using CVXX (i e alternate letterforms), how is that different from SSXX (again apart from naming and support)?

Among the apps supporting cvXX features are Chrome, Edge, Safari and Firefox, so if you’re developing in whole or in part for the web, they are very worth your while. You can name the feature, and you can individually name each variant within the feature, so naming for the cvXX features is nice, but you have to write the code yourself. The only app I know of that makes use of these names is Affinity Publisher, but I suspect that others will be coming along behind.

The ssXX and cvXX features are for different purposes. An ssXX feature typically applies to several glyphs that, when altered, produce a stylistic effect. Each cvXX feature should be applied to a single glyph or several closely related ones (like a case-pair). There are more details about the distinction in the OpenType feature tag registry.

2 Likes

Here’s an example of naming for a cvXX feature. Glyphs will export the naming stuff correctly with the font, and so will glyphslib/fontmake.

“FeatUILabelNameID” names the feature; “ParamUILabelNameID” names the individual variant; “Character” is the Unicode of the base character.

cvParameters {
  FeatUILabelNameID {
    name 3 1 0x0409 "Variants of a";
  };
  ParamUILabelNameID {
    name 3 1 0x0409 "Insular a";
  };
  ParamUILabelNameID {
    name 3 1 0x0409 "Uncial a";
  };
  ParamUILabelNameID {
    name 3 1 0x0409 "Carolingian open a";
  };
  ParamUILabelNameID {
    name 3 1 0x0409 "Gothic closed a";
  };
  ParamUILabelNameID {
    name 3 1 0x0409 "Neckless a";
  };
  ParamUILabelNameID {
    name 3 1 0x0409 "Enlarged minuscule a";
  };
  Character 0x0061;
};
sub a from [ a.alt3 a.alt1 a.alt2 a.alt4 a.alt5 a.enlarged ] ;
5 Likes

A significant difference, deduced from the wording of the specifications of each:

  • ssXX are binary – either on or off – thus supporting one-to-one mappings.
  • cvXX are multivalued, supporting one to one-from-a-list (alternation) mappings.

Another, perhaps obvious, difference is there are only 20 ssXX features and 100 cvXX features (though iirc some rendering stacks support 100 of each).

1 Like