readDict static method

dynamic readDict(
  1. Uint8List data,
  2. int offset,
  3. int end
)

Implementation

static readDict(Uint8List data, int offset, int end) {
  Map<String,dynamic> dict = {};
  var carr = [];
  int _len = data.length;

  while (offset < end) {
    int? b0 = null;
    if (offset < _len) {
      b0 = data[offset];
    }

    int _offset1 = offset + 1;

    int? b1 = null;
    if (_offset1 < _len) {
      b1 = data[_offset1];
    }

    int vs = 1;
    var key = null, val = null;
    // operand
    if (b0 == 28) {
      val = TyprBin.readShort(data, offset + 1);
      vs = 3;
    }
    if (b0 == 29) {
      val = TyprBin.readInt(data, offset + 1);
      vs = 5;
    }
    if (b0 != null && 32 <= b0 && b0 <= 246) {
      val = b0 - 139;
      vs = 1;
    }
    if (b0 != null && b1 != null && 247 <= b0 && b0 <= 250) {
      val = (b0 - 247) * 256 + b1 + 108;
      vs = 2;
    }
    if (b0 != null && b1 != null && 251 <= b0 && b0 <= 254) {
      val = -(b0 - 251) * 256 - b1 - 108;
      vs = 2;
    }
    if (b0 == 255) {
      val = TyprBin.readInt(data, offset + 1) / 0xffff;
      vs = 5;
      throw "unknown number";
    }

    if (b0 == 30) {
      var nibs = [];
      vs = 1;
      while (true) {
        int b = data[offset + vs];
        vs++;
        int nib0 = b >> 4, nib1 = b & 0xf;
        if (nib0 != 0xf) nibs.add(nib0);
        if (nib1 != 0xf) nibs.add(nib1);
        if (nib1 == 0xf) break;
      }
      String s = "";
      List chars = [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        ".",
        "e",
        "e-",
        "reserved",
        "-",
        "endOfNumber"
      ];
      for (int i = 0; i < nibs.length; i++) s += chars[nibs[i]].toString();
      //console.warn(nibs);
      val = double.parse(s);
    }

    if (b0 != null && b0 <= 21){
      List keys = [
        "version",
        "Notice",
        "FullName",
        "FamilyName",
        "Weight",
        "FontBBox",
        "BlueValues",
        "OtherBlues",
        "FamilyBlues",
        "FamilyOtherBlues",
        "StdHW",
        "StdVW",
        "escape",
        "UniqueID",
        "XUID",
        "charset",
        "Encoding",
        "CharStrings",
        "Private",
        "Subrs",
        "defaultWidthX",
        "nominalWidthX"
      ];

      key = keys[b0];
      vs = 1;
      if (b0 == 12) {
        List keys = [
          "Copyright",
          "isFixedPitch",
          "ItalicAngle",
          "UnderlinePosition",
          "UnderlineThickness",
          "PaintType",
          "CharstringType",
          "FontMatrix",
          "StrokeWidth",
          "BlueScale",
          "BlueShift",
          "BlueFuzz",
          "StemSnapH",
          "StemSnapV",
          "ForceBold",
          0,
          0,
          "LanguageGroup",
          "ExpansionFactor",
          "initialRandomSeed",
          "SyntheticBase",
          "PostScript",
          "BaseFontName",
          "BaseFontBlend",
          0,
          0,
          0,
          0,
          0,
          0,
          "ROS",
          "CIDFontVersion",
          "CIDFontRevision",
          "CIDFontType",
          "CIDCount",
          "UIDBase",
          "FDArray",
          "FDSelect",
          "FontName"
        ];
        key = keys[b1!];
        vs = 2;
      }
    }

    if (key != null) {
      dict[key] = carr.length == 1 ? carr[0] : carr;
      carr = [];
    } else
      carr.add(val);

    offset += vs;
  }
  return dict;
}