stringToGlyphs static method

List<int> stringToGlyphs(
  1. Font font,
  2. String str
)

Implementation

static List<int> stringToGlyphs(Font font, String str) {
  List<int> gls = [];
  for (int i = 0; i < str.length; i++) {
    int cc = str.codeUnitAt(i);
    if (cc > 0xffff) i++;
    gls.add(codeToGlyph(font, cc));
  }
  for (int i = 0; i < str.length; i++) {
    int cc = str.codeUnitAt(i); //
    if (cc == 2367) {
      var t = gls[i - 1];
      gls[i - 1] = gls[i];
      gls[i] = t;
    }
    if (cc > 0xffff) i++;
  }

  Map<String, dynamic>? gsub = font.GSUB;
  if (gsub == null) return gls;
  var llist = gsub["lookupList"], flist = gsub["featureList"];

  final List<String> cligs = [
    "rlig",
    "liga",
    "mset",
    "isol",
    "init",
    "fina",
    "medi",
    "half",
    "pres",
    "blws" /* Tibetan fonts like Himalaya.ttf */
  ];

  //console.warn(gls.slice(0));
  Map<int, bool> tused = {};

  for (int fi = 0; fi < flist.length; fi++) {
    Map<String, dynamic> fl = flist[fi];

    if (cligs.indexOf(fl["tag"]) == -1) continue;
    for (int ti = 0; ti < fl["tab"].length; ti++) {
      if (fl["tab"][ti] == true) continue;

      tused[fl["tab"][ti]] = true;
      var tab = llist[fl["tab"][ti]];
      //console.warn(fl.tab[ti], tab.ltype);
      //console.warn(fl.tag, tab);
      for (int ci = 0; ci < gls.length; ci++) {
        var feat = _getWPfeature(str, ci);
        if ("isol,init,fina,medi".indexOf(fl["tag"]) != -1 &&
            fl["tag"] != feat) continue;

        applySubs(gls, ci, tab, llist);
      }
    }
  }

  return gls;
}