codeToGlyph static method

int codeToGlyph(
  1. Font font,
  2. int code
)

Implementation

static int codeToGlyph(Font font, int code) {
  Map<String, dynamic> cmap = font.cmap;

  int tind = -1;
  if (cmap["p0e4"] != null)
    tind = cmap["p0e4"];
  else if (cmap["p3e1"] != null)
    tind = cmap["p3e1"];
  else if (cmap["p1e0"] != null)
    tind = cmap["p1e0"];
  else if (cmap["p0e3"] != null) tind = cmap["p0e3"];

  if (tind == -1) throw "no familiar platform and encoding!";

  Map<String, dynamic> tab = cmap["tables"][tind];

  if (tab["format"] == 0) {
    if (code >= tab["map"].length) return 0;
    return tab["map"][code];
  } else if (tab["format"] == 4) {
    int sind = -1;
    for (int i = 0; i < tab["endCount"].length; i++)
      if (code <= tab["endCount"][i]) {
        sind = i;
        break;
      }
    if (sind == -1) return 0;
    if (tab["startCount"][sind] > code) return 0;

    int gli = 0;
    if (tab["idRangeOffset"][sind] != 0)
      gli = tab["glyphIdArray"][(code - tab["startCount"][sind]) +
          (tab["idRangeOffset"][sind] >> 1) -
          (tab["idRangeOffset"].length - sind)];
    else
      gli = code + (tab["idDelta"][sind] as int);
    return gli & 0xFFFF;
  } else if (tab["format"] == 12) {
    if (code > tab["groups"][tab["groups"].length - 1][1]) return 0;
    for (int i = 0; i < tab["groups"].length; i++) {
      var grp = tab["groups"][i];
      if (grp[0] <= code && code <= grp[1]) return grp[2] + (code - grp[0]);
    }
    return 0;
  } else
    throw "unknown cmap table format " + tab["format"];
}