getPairAdjustment static method

num getPairAdjustment(
  1. Font font,
  2. dynamic g1,
  3. dynamic g2
)

Implementation

static num getPairAdjustment(Font font, g1, g2) {
  num offset = 0;
  if (font.GPOS != null) {
    var gpos = font.GPOS;
    var llist = gpos["lookupList"], flist = gpos["featureList"];
    Map<int, bool> tused = {};
    for (int i = 0; i < flist.length; i++) {
      var fl = flist[i];
      //console.warn(fl);
      if (fl["tag"] != "kern") continue;

      var _fl_tab = fl["tab"];

      for (int ti = 0; ti < _fl_tab.length; ti++) {
        var _ftti = _fl_tab[ti];

        if (tused[_ftti] == true) continue;
        tused[_ftti] = true;
        var tab = llist[_ftti];
        //console.warn(tab);

        for (int j = 0; j < tab["tabs"].length; j++) {
          if (tab["tabs"][j] == null) continue;
          var ltab = tab["tabs"][j], ind;
          if (ltab["coverage"] != null) {
            ind = Typr_LCTF.coverageIndex(ltab["coverage"], g1);
            if (ind == -1) continue;
          }

          if (tab["ltype"] == 1) {
            //console.warn(ltab);
          }
          else if (tab["ltype"] == 2) {
            var adj;
            if (ltab["fmt"] == 1) {
              var right = ltab["pairsets"][ind];
              for (int i = 0; i < right.length; i++)
                if (right[i].gid2 == g2) adj = right[i];
            }
            else if (ltab["fmt"] == 2) {
              int c1 = _getGlyphClass(g1, ltab["classDef1"]);
              int c2 = _getGlyphClass(g2, ltab["classDef2"]);
              adj = ltab["matrix"][c1][c2];
            }
            if (adj != null &&
                adj["val1"] != null &&
                adj["val1"][2] != null) {
              offset += adj.val1[2]; // xAdvance adjustment of first glyph
            }
            if (adj != null &&
                adj["val2"] != null &&
                adj["val2"][0] != null) {
              offset += adj.val2[0]; // xPlacement adjustment of second glyph
            }
          }
        }
      }
    }
  }
  if (font.kern != null) {
    var ind1 = font.kern.glyph1.indexOf(g1);
    if (ind1 != -1) {
      var ind2 = font.kern.rval[ind1].glyph2.indexOf(g2);
      if (ind2 != -1) offset += font.kern.rval[ind1].vals[ind2];
    }
  }

  return offset;
}