readVersion method

UQrVersion readVersion()

Implementation

UQrVersion readVersion() {
  final UQrVersion? cached = _version;
  if (cached != null) return cached;

  final int dimension = _bits.height;
  final int provisional = (dimension - 17) ~/ 4;
  if (provisional <= 6) {
    final UQrVersion version = UQrVersion.forNumber(provisional);
    _version = version;
    return version;
  }

  int versionBits = 0;
  final int ijMin = dimension - 11;
  for (int j = 5; j >= 0; j--) {
    for (int i = dimension - 9; i >= ijMin; i--) {
      versionBits = _copyBit(i, j, versionBits);
    }
  }
  UQrVersion? version = UQrVersion.decodeVersionInformation(versionBits);
  if (version != null && version.dimension == dimension) {
    _version = version;
    return version;
  }

  versionBits = 0;
  for (int i = 5; i >= 0; i--) {
    for (int j = dimension - 9; j >= ijMin; j--) {
      versionBits = _copyBit(i, j, versionBits);
    }
  }
  version = UQrVersion.decodeVersionInformation(versionBits);
  if (version != null && version.dimension == dimension) {
    _version = version;
    return version;
  }
  throw const UCodeDecodeException("Unreadable QR version information");
}