decode static method

String decode(
  1. Uint8List bytes
)

Decodes exactly 13 bytes back into an SVG string.

Implementation

static String decode(Uint8List bytes) {
  if (bytes.length < 13) {
    final padded = Uint8List(13);
    for (int i = 0; i < bytes.length; i++) padded[i] = bytes[i];
    bytes = padded;
  }
  final reader = _BitReader(bytes);
  int styleIdx = reader.read(3);
  AvatarStyle style = styleIdx < AvatarStyle.values.length ? AvatarStyle.values[styleIdx] : AvatarStyle.openPeeps;

  switch (style) {
    case AvatarStyle.openPeeps:
      int headIdx = reader.read(_bits(OpenPeepsAssets.head.length));
      int faceIdx = reader.read(_bits(OpenPeepsAssets.face.length));
      int facialHairIdx = reader.read(_bits(OpenPeepsAssets.facialHair.length + 1));
      int accIdx = reader.read(_bits(OpenPeepsAssets.accessories.length + 1));
      int maskIdx = reader.read(_bits(OpenPeepsAssets.mask.length + 1));
      int skinColIdx = reader.read(7);
      int clothColIdx = reader.read(7);
      int hairColIdx = reader.read(7);

      return SvgEngine.generateSvg(
        style: style,
        headOrHairKey: _keyAt(OpenPeepsAssets.head, headIdx),
        faceOrEyesKey: _keyAt(OpenPeepsAssets.face, faceIdx),
        facialHairKey: facialHairIdx == OpenPeepsAssets.facialHair.length ? null : _keyAt(OpenPeepsAssets.facialHair, facialHairIdx),
        accessoriesKey: accIdx == OpenPeepsAssets.accessories.length ? null : _keyAt(OpenPeepsAssets.accessories, accIdx),
        maskKey: maskIdx == OpenPeepsAssets.mask.length ? null : _keyAt(OpenPeepsAssets.mask, maskIdx),
        skinColor: _colorAt(skinColIdx),
        clothingColor: _colorAt(clothColIdx),
        hairColor: _colorAt(hairColIdx),
      );
    case AvatarStyle.personas:
      int hairIdx = reader.read(_bits(PersonasAssets.hair.length));
      int eyesIdx = reader.read(_bits(PersonasAssets.eyes.length));
      int bodyIdx = reader.read(_bits(PersonasAssets.body.length));
      int mouthIdx = reader.read(_bits(PersonasAssets.mouth.length));
      int noseIdx = reader.read(_bits(PersonasAssets.nose.length));
      int facialHairIdx = reader.read(_bits(PersonasAssets.facialHair.length + 1));
      int skinColIdx = reader.read(7);
      int clothColIdx = reader.read(7);
      int hairColIdx = reader.read(7);

      return SvgEngine.generateSvg(
        style: style,
        headOrHairKey: _keyAt(PersonasAssets.hair, hairIdx),
        faceOrEyesKey: _keyAt(PersonasAssets.eyes, eyesIdx),
        bodyKey: _keyAt(PersonasAssets.body, bodyIdx),
        mouthKey: _keyAt(PersonasAssets.mouth, mouthIdx),
        noseKey: _keyAt(PersonasAssets.nose, noseIdx),
        facialHairKey: facialHairIdx == PersonasAssets.facialHair.length ? null : _keyAt(PersonasAssets.facialHair, facialHairIdx),
        skinColor: _colorAt(skinColIdx),
        clothingColor: _colorAt(clothColIdx),
        hairColor: _colorAt(hairColIdx),
      );
    case AvatarStyle.micah:
      int hairIdx = reader.read(_bits(MicahAssets.hair.length));
      int eyesIdx = reader.read(_bits(MicahAssets.eyes.length));
      int eyeBrowsIdx = reader.read(_bits(MicahAssets.eyebrows.length));
      int earsIdx = reader.read(_bits(MicahAssets.ears.length));
      int shirtIdx = reader.read(_bits(MicahAssets.shirt.length));
      int noseIdx = reader.read(_bits(MicahAssets.nose.length));
      int mouthIdx = reader.read(_bits(MicahAssets.mouth.length));
      int facialHairIdx = reader.read(_bits(MicahAssets.facialHair.length + 1));
      int glassesIdx = reader.read(_bits(MicahAssets.glasses.length + 1));
      int earringsIdx = reader.read(_bits(MicahAssets.earrings.length + 1));
      int skinColIdx = reader.read(7);
      int hairColIdx = reader.read(7);
      int shirtColIdx = reader.read(7);
      int glassesColIdx = reader.read(7);
      int earringColIdx = reader.read(7);
      int shadowColIdx = reader.read(7);

      return SvgEngine.generateSvg(
        style: style,
        headOrHairKey: _keyAt(MicahAssets.hair, hairIdx),
        faceOrEyesKey: _keyAt(MicahAssets.eyes, eyesIdx),
        eyebrowsKey: _keyAt(MicahAssets.eyebrows, eyeBrowsIdx),
        earsKey: _keyAt(MicahAssets.ears, earsIdx),
        bodyKey: _keyAt(MicahAssets.shirt, shirtIdx),
        noseKey: _keyAt(MicahAssets.nose, noseIdx),
        mouthKey: _keyAt(MicahAssets.mouth, mouthIdx),
        facialHairKey: facialHairIdx == MicahAssets.facialHair.length ? null : _keyAt(MicahAssets.facialHair, facialHairIdx),
        glassesKey: glassesIdx == MicahAssets.glasses.length ? null : _keyAt(MicahAssets.glasses, glassesIdx),
        earringsKey: earringsIdx == MicahAssets.earrings.length ? null : _keyAt(MicahAssets.earrings, earringsIdx),
        skinColor: _colorAt(skinColIdx),
        hairColor: _colorAt(hairColIdx),
        clothingColor: _colorAt(shirtColIdx),
        glassesColor: _colorAt(glassesColIdx),
        earringColor: _colorAt(earringColIdx),
        eyeShadowColor: _colorAt(shadowColIdx),
      );
    case AvatarStyle.toonhead:
      int hairIdx = reader.read(_bits(ToonHeadAssets.hair.length));
      int eyesIdx = reader.read(_bits(ToonHeadAssets.eyes.length));
      int mouthIdx = reader.read(_bits(ToonHeadAssets.mouth.length));
      int clothesIdx = reader.read(_bits(ToonHeadAssets.clothes.length));
      int eyebrowsIdx = reader.read(_bits(ToonHeadAssets.eyebrows.length));
      int rearHairIdx = reader.read(_bits(ToonHeadAssets.rearHair.length + 1));
      int beardIdx = reader.read(_bits(ToonHeadAssets.beard.length + 1));
      int skinColIdx = reader.read(7);
      int hairColIdx = reader.read(7);
      int clothColIdx = reader.read(7);

      return SvgEngine.generateSvg(
        style: style,
        headOrHairKey: _keyAt(ToonHeadAssets.hair, hairIdx),
        faceOrEyesKey: _keyAt(ToonHeadAssets.eyes, eyesIdx),
        mouthKey: _keyAt(ToonHeadAssets.mouth, mouthIdx),
        bodyKey: _keyAt(ToonHeadAssets.clothes, clothesIdx),
        eyebrowsKey: _keyAt(ToonHeadAssets.eyebrows, eyebrowsIdx),
        rearHairKey: rearHairIdx == ToonHeadAssets.rearHair.length ? null : _keyAt(ToonHeadAssets.rearHair, rearHairIdx),
        facialHairKey: beardIdx == ToonHeadAssets.beard.length ? null : _keyAt(ToonHeadAssets.beard, beardIdx),
        skinColor: _colorAt(skinColIdx),
        hairColor: _colorAt(hairColIdx),
        clothingColor: _colorAt(clothColIdx),
      );
    case AvatarStyle.avataaars:
      int topIdx = reader.read(_bits(AvataaarsAssets.top.length));
      int eyesIdx = reader.read(_bits(AvataaarsAssets.eyes.length));
      int eyebrowsIdx = reader.read(_bits(AvataaarsAssets.eyebrows.length));
      int mouthIdx = reader.read(_bits(AvataaarsAssets.mouth.length));
      int clothingIdx = reader.read(_bits(AvataaarsAssets.clothing.length));
      int graphicIdx = reader.read(_bits(AvataaarsAssets.clothingGraphic.length));
      int styleIdx2 = reader.read(_bits(AvataaarsAssets.style.length));
      int facialHairIdx = reader.read(_bits(AvataaarsAssets.facialHair.length + 1));
      int accIdx = reader.read(_bits(AvataaarsAssets.accessories.length + 1));
      int skinColIdx = reader.read(7);
      int clothColIdx = reader.read(7);
      int hairColIdx = reader.read(7);
      int facialHairColIdx = reader.read(7);
      int accColIdx = reader.read(7);
      int hatColIdx = reader.read(7);
      int bgColIdx = reader.read(7);

      return SvgEngine.generateSvg(
        style: style,
        headOrHairKey: _keyAt(AvataaarsAssets.top, topIdx),
        faceOrEyesKey: _keyAt(AvataaarsAssets.eyes, eyesIdx),
        eyebrowsKey: _keyAt(AvataaarsAssets.eyebrows, eyebrowsIdx),
        mouthKey: _keyAt(AvataaarsAssets.mouth, mouthIdx),
        bodyKey: _keyAt(AvataaarsAssets.clothing, clothingIdx),
        clothingGraphicKey: _keyAt(AvataaarsAssets.clothingGraphic, graphicIdx),
        avataaarStyleKey: _keyAt(AvataaarsAssets.style, styleIdx2),
        facialHairKey: facialHairIdx == AvataaarsAssets.facialHair.length ? null : _keyAt(AvataaarsAssets.facialHair, facialHairIdx),
        accessoriesKey: accIdx == AvataaarsAssets.accessories.length ? null : _keyAt(AvataaarsAssets.accessories, accIdx),
        skinColor: _colorAt(skinColIdx),
        clothingColor: _colorAt(clothColIdx),
        hairColor: _colorAt(hairColIdx),
        facialHairColor: _colorAt(facialHairColIdx),
        accessoriesColor: _colorAt(accColIdx),
        hatColor: _colorAt(hatColIdx),
        backgroundColor: _colorAt(bgColIdx),
      );
    case AvatarStyle.miniavs:
      int bodyIdx = reader.read(_bits(MiniavsAssets.body.length));
      int eyesIdx = reader.read(_bits(MiniavsAssets.eyes.length));
      int mouthIdx = reader.read(_bits(MiniavsAssets.mouth.length));
      int headIdx = reader.read(_bits(MiniavsAssets.head.length));
      int mustacheIdx = reader.read(_bits(MiniavsAssets.mustache.length + 1));
      int glassesIdx = reader.read(_bits(MiniavsAssets.glasses.length + 1));
      int hairIdx = reader.read(_bits(MiniavsAssets.hair.length));
      int skinColIdx = reader.read(7);
      int clothColIdx = reader.read(7);
      int hairColIdx = reader.read(7);

      return SvgEngine.generateSvg(
        style: style,
        headOrHairKey: _keyAt(MiniavsAssets.hair, hairIdx),
        noseKey: _keyAt(MiniavsAssets.head, headIdx),
        faceOrEyesKey: _keyAt(MiniavsAssets.eyes, eyesIdx),
        bodyKey: _keyAt(MiniavsAssets.body, bodyIdx),
        mouthKey: _keyAt(MiniavsAssets.mouth, mouthIdx),
        facialHairKey: mustacheIdx == MiniavsAssets.mustache.length ? null : _keyAt(MiniavsAssets.mustache, mustacheIdx),
        glassesKey: glassesIdx == MiniavsAssets.glasses.length ? null : _keyAt(MiniavsAssets.glasses, glassesIdx),
        skinColor: _colorAt(skinColIdx),
        clothingColor: _colorAt(clothColIdx),
        hairColor: _colorAt(hairColIdx),
      );
  }
}