harfbuzz / boring-expansion-spec

Better-Engineered Font Formats; Part 1. Boring Expansion
80 stars 9 forks source link

[`GDEF` / `GSUB`/`GPOS`] Glyph Filtering #25

Open behdad opened 3 years ago

behdad commented 3 years ago

EDIT: Changed my mind about the details. See updated proposal in comments.

Generalized glyph filtering in GSUB/GPOS based on work Martin Hosken and I proposed in 2016.

Original proposal: https://github.com/OpenType/opentype-layout/blob/63d169c92160832cf5b2333f28b559c80c9a4389/proposals/glyph_filtering.md

Details are fleshed out in: https://github.com/OpenType/opentype-layout/issues/21

behdad commented 3 years ago

To be done after LookupFlag extension https://github.com/be-fonts/boring-expansion-spec/issues/26.

Allocate two bits from LookupFlag extension (leave the existing OpenType free LookupFlags intact).

The two new bits will be:

For each of those bits, if set, the Lookup structure will be followed by a uint16:

The glyph filtering algorithm then will be this:

GDEF version major 1 minor 4 will have the following field follow itemVarStoreOffset:

  Offset24To<GlyphSets> glyphSets;

whereas

struct GlyphSetsFormat1 {
  uint8 format; == 1
  Array24Of<Offset24To<Coverage>> coverages;
};
behdad commented 3 years ago

cc @mhosken @jfkthame

simoncozens commented 3 years ago

Currently in GDEF we have a glyph class definition which takes a ClassDef structure but only assigns meaning to four values (base, lig, mark, component) which are special-cased the lookup flags. Allowing glyph classes >4 in the glyph class definition table would give you the ability to subdivide bases etc. into multiple classes for free.

behdad commented 3 years ago

Allowing glyph classes >4 in the glyph class definition table would give you the ability to subdivide bases etc. into multiple classes for free.

That takes us in the wrong direction though...

Mark glyphs were divided so into classes. But it was found that we need overlapping sets. That's when MarkFilteringSets were added. So, dividing glyphs into more disjoint sets doesn't help, hence extending the MarkFilterintSets to all glyphs is the way to go.