Skip to content

[makeotf] Save space in class-based kerning #90

@brawer

Description

@brawer

Could makeotf possibly save some space when building class-based kerning tables (GPOS type 2, format 2)?

Input feature file:

feature kern {
  pos [T] [comma semicolon period] -100;
} kern;

Output from makeotf v2.0.90:

      <Lookup index="0">
        <!-- LookupType=2 -->
        <LookupFlag value="0"/>
        <!-- SubTableCount=1 -->
        <PairPos index="0" Format="2">
          <Coverage>
            <Glyph value="T"/>
          </Coverage>
          <ValueFormat1 value="4"/>
          <ValueFormat2 value="0"/>
          <ClassDef1>
          </ClassDef1>
          <ClassDef2>
            <ClassDef glyph="comma" class="1"/>
            <ClassDef glyph="period" class="1"/>
            <ClassDef glyph="semicolon" class="1"/>
          </ClassDef2>
          <!-- Class1Count=1 -->
          <!-- Class2Count=2 -->
          <Class1Record index="0">
            <Class2Record index="0">
              <Value1 XAdvance="0"/>
            </Class2Record>
            <Class2Record index="1">
              <Value1 XAdvance="-100"/>
            </Class2Record>
          </Class1Record>
        </PairPos>
      </Lookup>

Wouldn’t the following be equivalent? As in the above version, ClassDef1 would continue to omit entries for glyph class 0 (because for glyphs in the Coverage table, ClassDef1 defaults to 0). However, ClassDef2 would actually assign class 0, so the dummy Class2Records for class 0 would not be needed anymore. There’s one Class2Record for every Class1Record, so the savings might add up in a large font.

      <Lookup index="0">
        <!-- LookupType=2 -->
        <LookupFlag value="0"/>
        <!-- SubTableCount=1 -->
        <PairPos index="0" Format="2">
          <Coverage>
            <Glyph value="T"/>
          </Coverage>
          <ValueFormat1 value="4"/>
          <ValueFormat2 value="0"/>
          <ClassDef1>
          </ClassDef1>
          <ClassDef2>
            <ClassDef glyph="comma" class="0"/>
            <ClassDef glyph="period" class="0"/>
            <ClassDef glyph="semicolon" class="0"/>
          </ClassDef2>
          <!-- Class1Count=1 -->
          <!-- Class2Count=1 -->
          <Class1Record index="0">
            <Class2Record index="0">
              <Value1 XAdvance="-100"/>
            </Class2Record>
          </Class1Record>
        </PairPos>
      </Lookup>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions