Пример #1
0
  /**
   * Reads version information from one of its two locations within the QR Code.
   *
   * @return {@link Version} encapsulating the QR Code's version
   * @throws com.application.food.zxing.FormatException if both version information locations cannot
   *     be parsed as the valid encoding of version information
   */
  Version readVersion() throws FormatException {

    if (parsedVersion != null) {
      return parsedVersion;
    }

    int dimension = bitMatrix.getHeight();

    int provisionalVersion = (dimension - 17) >> 2;
    if (provisionalVersion <= 6) {
      return Version.getVersionForNumber(provisionalVersion);
    }

    // Read top-right version info: 3 wide by 6 tall
    int versionBits = 0;
    int ijMin = dimension - 11;
    for (int j = 5; j >= 0; j--) {
      for (int i = dimension - 9; i >= ijMin; i--) {
        versionBits = copyBit(i, j, versionBits);
      }
    }

    Version theParsedVersion = Version.decodeVersionInformation(versionBits);
    if (theParsedVersion != null && theParsedVersion.getDimensionForVersion() == dimension) {
      parsedVersion = theParsedVersion;
      return theParsedVersion;
    }

    // Hmm, failed. Try bottom left: 6 wide by 3 tall
    versionBits = 0;
    for (int i = 5; i >= 0; i--) {
      for (int j = dimension - 9; j >= ijMin; j--) {
        versionBits = copyBit(i, j, versionBits);
      }
    }

    theParsedVersion = Version.decodeVersionInformation(versionBits);
    if (theParsedVersion != null && theParsedVersion.getDimensionForVersion() == dimension) {
      parsedVersion = theParsedVersion;
      return theParsedVersion;
    }
    throw FormatException.getFormatInstance();
  }