parse static method

Map<String, dynamic> parse(
  1. Uint8List buffer,
  2. int offset,
  3. int length
)

Implementation

static Map<String,dynamic> parse(Uint8List buffer, int offset, int length) {
  final data = buffer.sublist(offset, offset + length);

  offset = 0;

  // Header
  offset++;
  offset++;
  offset++;
  offset++;

  // Name INDEX
  List<int> ninds = [];
  offset = readIndex(data, offset, ninds);
  var names = [];

  for (int i = 0; i < ninds.length - 1; i++){
    names.add(TyprBin.readASCII(data, offset + ninds[i], ninds[i + 1] - ninds[i]));
  }
  offset += ninds[ninds.length - 1];

  // Top DICT INDEX
  List<int> tdinds = [];
  offset = readIndex(data, offset, tdinds); //console.warn(tdinds);
  // Top DICT Data
  var topDicts = [];
  for (int i = 0; i < tdinds.length - 1; i++)
    topDicts.add(readDict(data, offset + tdinds[i], offset + tdinds[i + 1]));
  offset += tdinds[tdinds.length - 1];
  Map<String, dynamic> topdict = Map<String, dynamic>.from(topDicts[0]);
  //console.warn(topdict);

  // String INDEX
  List<int> sinds = [];
  offset = readIndex(data, offset, sinds);
  // String Data
  List<String> strings = [];
  for (int i = 0; i < sinds.length - 1; i++){
    strings.add(TyprBin.readASCII(data, offset + sinds[i], sinds[i + 1] - sinds[i]));
  }
  offset += sinds[sinds.length - 1];

  // Global Subr INDEX  (subroutines)
  readSubrs(data, offset, topdict);

  // charstrings
  if (topdict["CharStrings"] != null) {
    offset = topdict["CharStrings"];
    List<int> sinds = [];
    offset = readIndex(data, offset, sinds);

    List<List<int>> cstr = [];
    for (int i = 0; i < sinds.length - 1; i++){
      cstr.add(TyprBin.readBytes(
          data, offset + sinds[i], sinds[i + 1] - sinds[i]));
    }
    //offset += sinds[sinds.length-1];
    topdict["CharStrings"] = cstr;
    //console.warn(topdict.CharStrings);
  }

  // CID font
  if (topdict["ROS"] != null) {
    offset = topdict["FDArray"];
    List<int> fdind = [];
    offset = readIndex(data, offset, fdind);

    topdict["FDArray"] = [];
    for (int i = 0; i < fdind.length - 1; i++) {
      var dict = readDict(data, offset + fdind[i], offset + fdind[i + 1]);
      _readFDict(data, dict, strings);
      topdict["FDArray"].add(dict);
    }
    offset += fdind[fdind.length - 1];

    offset = topdict["FDSelect"];
    topdict["FDSelect"] = [];
    var fmt = data[offset];
    offset++;
    if (fmt == 3) {
      var rns = TyprBin.readUshort(data, offset);
      offset += 2;
      for (var i = 0; i < rns + 1; i++) {
        topdict["FDSelect"]
            .addAll([TyprBin.readUshort(data, offset), data[offset + 2]]);
        offset += 3;
      }
    } else
      throw fmt;
  }

  // Encoding
  if (topdict["Encoding"] != null) {
    topdict["Encoding"] = readEncoding(
        data, topdict["Encoding"], topdict["CharStrings"].length);
  }

  // charset
  if (topdict["charset"] != null) {
    topdict["charset"] =
        readCharset(data, topdict["charset"], topdict["CharStrings"].length);
  }

  _readFDict(data, topdict, strings);
  return topdict;
}