docs: function Font(filePath) {
    var that = this;
    this._firstSize = null;
    this._detailsAndBitmapToSize = [];
    this._size = null;
    this._transparentColor = null;
    this._color = null;
  
    // Read JSON main and subfiles, create Bitmaps
    var json = fs.readFileSync(filePath);  // throws Error
    var filesAndSizes = JSON.parse(json);  // throws SyntaxError
    assert(filesAndSizes instanceof Array && filesAndSizes.length >= 1);
    var lastDetailsAndBitmap;
  
    filesAndSizes.forEach(function (fileAndSize) {
      assert(fileAndSize.size && fileAndSize.filename);
      // Read JSON subfile (specification:
      // https://github.com/mattdesl/bmfont2json/wiki/JsonSpec)
      var detailsAndBitmap = {};
      that._detailsAndBitmapToSize[fileAndSize.size] = detailsAndBitmap;
      json = fs.readFileSync(path.join(path.dirname(filePath), fileAndSize.filename));
      // throws Error
      detailsAndBitmap.details = JSON.parse(json);  // throws SyntaxError
      assert(
        !lastDetailsAndBitmap || (
          detailsAndBitmap.details.info.face == lastDetailsAndBitmap.details.info.face &&
          detailsAndBitmap.details.info.bold == lastDetailsAndBitmap.details.info.bold &&
          detailsAndBitmap.details.info.italic == lastDetailsAndBitmap.details.info.italic
        )
      );
      // Restructure details object to make the data accessible by character keys
      var newChars = {};
      detailsAndBitmap.details.chars.forEach(function (char) {
        newChars[String.fromCodePoint(char.id)] = char;
        delete char.id;
      });
  
      detailsAndBitmap.details.chars = newChars;
  
      var newKernings = {};
      detailsAndBitmap.details.kernings.forEach(function (kerning) {
        var firstChar = String.fromCodePoint(kerning.first);
        var secondChar = String.fromCodePoint(kerning.second);
        var newKerning = newKernings[secondChar];
        if (!newKerning) {
          newKerning = newKernings[secondChar] = {};
        }
        newKerning[firstChar] = kerning;
        delete kerning.first;
        delete kerning.second;
      });
  
      detailsAndBitmap.details.kernings = newKernings;
      // Create bitmap from font image file
      assert(detailsAndBitmap.details.pages.length >= 1);
      detailsAndBitmap.bitmap = Bitmap.fromFile(
        path.join(path.dirname(filePath), detailsAndBitmap.details.pages[0]));
      var palette = detailsAndBitmap.bitmap.getPalette();
      var currentColor = palette.indexOf(0x000000/*black*/);
      assert(currentColor > -1);
      that._transparentColor = palette.indexOf(0xff00ff/*magenta*/);
      if (that._transparentColor == -1) {
        that._transparentColor = 0x80;
      }
      detailsAndBitmap.bitmap.replaceColor(currentColor, that._transparentColor);
      that._color = palette.indexOf(0xffffff/*white*/);
  //			currentColor = palette.indexOf(0xffffff/*white*/);
  //			that._color = palette.indexOf(0x000000/*black*/);
  //			assert(currentColor > -1 && that._color > -1);
  //			detailsAndBitmap.bitmap.replaceColor(currentColor, that._color);
      lastDetailsAndBitmap = detailsAndBitmap;
    });
  
    // Set size variables to first available
    for (
      this._firstSize = 0, this._size = 0;
      this._size < this._detailsAndBitmapToSize.length;
      this._firstSize++, this._size++
    ) {
      if (this._detailsAndBitmapToSize[this._size]) {
        break;
      }
    }
  }