boring-expansion-spec
boring-expansion-spec copied to clipboard
[`GDEF` / `GSUB`/`GPOS`] Glyph Filtering
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
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:
UseGlyphSkipSetUseGlyphStopSet
For each of those bits, if set, the Lookup structure will be followed by a uint16:
uint16 GlyphSkipSetuint16 GlyphStopSetwhich are indices intoGDEF's ~~MarkGlyphSetsstruct (which we might return to justGlyphSets)~~ UPDATE: (See https://github.com/be-fonts/boring-expansion-spec/issues/25) a newGlyphSetsarray-of-coverages struct.
The glyph filtering algorithm then will be this:
- If
UseGlyphStopSetis used and current glyph is in the referenced set, stop; - If
UseGlyphSkipSetis used and current glyph is in the referenced set, skip; - Otherwise use the OpenType algorithm.
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;
};
cc @mhosken @jfkthame
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.
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.