From 7c5f3286c5adac687f594eb98d54db0ebd21c5ab Mon Sep 17 00:00:00 2001 From: srowen Date: Tue, 2 Dec 2008 01:00:18 +0000 Subject: [PATCH] Unify handling of EC level between encoder and decoder git-svn-id: http://zxing.googlecode.com/svn/trunk@770 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../com/google/zxing/qrcode/QRCodeWriter.java | 7 +- .../qrcode/decoder/ErrorCorrectionLevel.java | 34 +++-- .../google/zxing/qrcode/encoder/Encoder.java | 37 +++--- .../zxing/qrcode/encoder/MatrixUtil.java | 34 ++--- .../google/zxing/qrcode/encoder/QRCode.java | 118 +++++++----------- .../zxing/qrcode/QRCodeWriterTestCase.java | 12 +- .../decoder/ErrorCorrectionLevelTestCase.java | 5 +- .../zxing/qrcode/encoder/EncoderTestCase.java | 5 +- .../qrcode/encoder/MatrixUtilTestCase.java | 7 +- .../zxing/qrcode/encoder/QRCodeTestCase.java | 39 +----- 10 files changed, 132 insertions(+), 166 deletions(-) diff --git a/core/src/com/google/zxing/qrcode/QRCodeWriter.java b/core/src/com/google/zxing/qrcode/QRCodeWriter.java index 7cf12b96..1920465b 100644 --- a/core/src/com/google/zxing/qrcode/QRCodeWriter.java +++ b/core/src/com/google/zxing/qrcode/QRCodeWriter.java @@ -24,6 +24,7 @@ import com.google.zxing.common.ByteArray; import com.google.zxing.common.ByteMatrix; import com.google.zxing.qrcode.encoder.Encoder; import com.google.zxing.qrcode.encoder.QRCode; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import java.util.Hashtable; @@ -58,11 +59,11 @@ public final class QRCodeWriter implements Writer { height); } - int errorCorrectionLevel = QRCode.EC_LEVEL_L; + ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L; if (hints != null) { - Integer requestedECLevel = (Integer) hints.get(EncodeHintType.ERROR_CORRECTION); + ErrorCorrectionLevel requestedECLevel = (ErrorCorrectionLevel) hints.get(EncodeHintType.ERROR_CORRECTION); if (requestedECLevel != null) { - errorCorrectionLevel = requestedECLevel.intValue(); + errorCorrectionLevel = requestedECLevel; } } diff --git a/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java b/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java index 3826bc43..53277930 100644 --- a/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java +++ b/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java @@ -24,46 +24,62 @@ import com.google.zxing.ReaderException; * * @author Sean Owen */ -final class ErrorCorrectionLevel { +public final class ErrorCorrectionLevel { // No, we can't use an enum here. J2ME doesn't support it. /** * L = ~7% correction */ - static final ErrorCorrectionLevel L = new ErrorCorrectionLevel(0); + public static final ErrorCorrectionLevel L = new ErrorCorrectionLevel(0, 0x01, "L"); /** * M = ~15% correction */ - static final ErrorCorrectionLevel M = new ErrorCorrectionLevel(1); + public static final ErrorCorrectionLevel M = new ErrorCorrectionLevel(1, 0x00, "M"); /** * Q = ~25% correction */ - static final ErrorCorrectionLevel Q = new ErrorCorrectionLevel(2); + public static final ErrorCorrectionLevel Q = new ErrorCorrectionLevel(2, 0x03, "Q"); /** * H = ~30% correction */ - static final ErrorCorrectionLevel H = new ErrorCorrectionLevel(3); + public static final ErrorCorrectionLevel H = new ErrorCorrectionLevel(3, 0x02, "H"); private static final ErrorCorrectionLevel[] FOR_BITS = {M, L, H, Q}; private final int ordinal; + private final int bits; + private final String name; - private ErrorCorrectionLevel(int ordinal) { + private ErrorCorrectionLevel(int ordinal, int bits, String name) { this.ordinal = ordinal; + this.bits = bits; + this.name = name; } - int ordinal() { + public int ordinal() { return ordinal; } + public int getBits() { + return bits; + } + + public String getName() { + return name; + } + + public String toString() { + return name; + } + /** * @param bits int containing the two bits encoding a QR Code's error correction level * @return {@link ErrorCorrectionLevel} representing the encoded error correction level */ - static ErrorCorrectionLevel forBits(int bits) throws ReaderException { + public static ErrorCorrectionLevel forBits(int bits) { if (bits < 0 || bits >= FOR_BITS.length) { - throw ReaderException.getInstance(); + throw new IllegalArgumentException(); } return FOR_BITS[bits]; } diff --git a/core/src/com/google/zxing/qrcode/encoder/Encoder.java b/core/src/com/google/zxing/qrcode/encoder/Encoder.java index 687f845f..8b6b0305 100644 --- a/core/src/com/google/zxing/qrcode/encoder/Encoder.java +++ b/core/src/com/google/zxing/qrcode/encoder/Encoder.java @@ -21,6 +21,7 @@ import com.google.zxing.common.ByteArray; import com.google.zxing.common.reedsolomon.GF256; import com.google.zxing.common.reedsolomon.ReedSolomonEncoder; import com.google.zxing.WriterException; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import java.util.Vector; @@ -119,14 +120,15 @@ public final class Encoder { } // Encode "bytes" with the error correction level "getECLevel". The encoding mode will be chosen - // internally by chooseMode(). On success, store the result in "qrCode" and return true. On - // error, return false. We recommend you to use QRCode.EC_LEVEL_L (the lowest level) for + // internally by chooseMode(). On success, store the result in "qrCode" and return true. + // We recommend you to use QRCode.EC_LEVEL_L (the lowest level) for // "getECLevel" since our primary use is to show QR code on desktop screens. We don't need very // strong error correction for this purpose. // // Note that there is no way to encode bytes in MODE_KANJI. We might want to add EncodeWithMode() // with which clients can specify the encoding mode. For now, we don't need the functionality. - public static void encode(final ByteArray bytes, int ecLevel, QRCode qrCode) throws WriterException { + public static void encode(final ByteArray bytes, ErrorCorrectionLevel ecLevel, QRCode qrCode) + throws WriterException { // Step 1: Choose the mode (encoding). final int mode = chooseMode(bytes); @@ -211,7 +213,7 @@ public final class Encoder { return QRCode.MODE_8BIT_BYTE; } - private static int chooseMaskPattern(final BitVector bits, int ecLevel, int version, + private static int chooseMaskPattern(final BitVector bits, ErrorCorrectionLevel ecLevel, int version, ByteMatrix matrix) throws WriterException { if (!QRCode.isValidMatrixWidth(matrix.width())) { throw new WriterException("Invalid matrix width: " + matrix.width()); @@ -231,25 +233,22 @@ public final class Encoder { return bestMaskPattern; } - // Initialize "qrCode" according to "numInputBytes", "getECLevel", and "mode". On success, modify - // "qrCode" and return true. On error, return false. - private static void initQRCode(int numInputBytes, int ecLevel, int mode, QRCode qrCode) throws WriterException { + // Initialize "qrCode" according to "numInputBytes", "ecLevel", and "mode". On success, modify + // "qrCode" and return true. + private static void initQRCode(int numInputBytes, ErrorCorrectionLevel ecLevel, int mode, QRCode qrCode) + throws WriterException { qrCode.setECLevel(ecLevel); qrCode.setMode(mode); - if (!QRCode.isValidECLevel(ecLevel)) { - throw new WriterException("Invalid EC level: " + ecLevel); - } - // In the following comments, we use numbers of Version 7-H. for (int i = 0; i < RS_BLOCK_TABLE.length; ++i) { final RSBlockInfo row = RS_BLOCK_TABLE[i]; // numBytes = 196 final int numBytes = row.numBytes; // getNumECBytes = 130 - final int numEcBytes = row.blockInfo[ecLevel][0]; + final int numEcBytes = row.blockInfo[ecLevel.ordinal()][0]; // getNumRSBlocks = 5 - final int numRSBlocks = row.blockInfo[ecLevel][1]; + final int numRSBlocks = row.blockInfo[ecLevel.ordinal()][1]; // getNumDataBytes = 196 - 130 = 66 final int numDataBytes = numBytes - numEcBytes; // We want to choose the smallest version which can contain data of "numInputBytes" + some @@ -360,7 +359,7 @@ public final class Encoder { } // Interleave "bits" with corresponding error correction bytes. On success, store the result in - // "result" and return true. On error, return false. The interleave rule is complicated. See 8.6 + // "result" and return true. The interleave rule is complicated. See 8.6 // of JISX0510:2004 (p.37) for details. static void interleaveWithECBytes(final BitVector bits, int numTotalBytes, int numDataBytes, int numRSBlocks, BitVector result) throws WriterException { @@ -466,7 +465,7 @@ public final class Encoder { } // Append "bytes" in "mode" mode (encoding) into "bits". On success, store the result in "bits" - // and return true. On error, return false. + // and return true. static void appendBytes(final ByteArray bytes, int mode, BitVector bits) throws WriterException { switch (mode) { case QRCode.MODE_NUMERIC: @@ -487,7 +486,7 @@ public final class Encoder { } // Append "bytes" to "bits" using QRCode.MODE_NUMERIC mode. On success, store the result in "bits" - // and return true. On error, return false. + // and return true. static void appendNumericBytes(final ByteArray bytes, BitVector bits) throws WriterException { // Validate all the bytes first. for (int i = 0; i < bytes.size(); ++i) { @@ -518,7 +517,7 @@ public final class Encoder { } // Append "bytes" to "bits" using QRCode.MODE_ALPHANUMERIC mode. On success, store the result in - // "bits" and return true. On error, return false. + // "bits" and return true. static void appendAlphanumericBytes(final ByteArray bytes, BitVector bits) throws WriterException { for (int i = 0; i < bytes.size();) { final int code1 = getAlphanumericCode(bytes.at(i)); @@ -542,7 +541,7 @@ public final class Encoder { } // Append "bytes" to "bits" using QRCode.MODE_8BIT_BYTE mode. On success, store the result in - // "bits" and return true. On error, return false. + // "bits" and return true. static void append8BitBytes(final ByteArray bytes, BitVector bits) { for (int i = 0; i < bytes.size(); ++i) { bits.appendBits(bytes.at(i), 8); @@ -550,7 +549,7 @@ public final class Encoder { } // Append "bytes" to "bits" using QRCode.MODE_KANJI mode. On success, store the result in "bits" - // and return true. On error, return false. See 8.4.5 of JISX0510:2004 (p.21) for how to encode + // and return true. See 8.4.5 of JISX0510:2004 (p.21) for how to encode // Kanji bytes. static void appendKanjiBytes(final ByteArray bytes, BitVector bits) throws WriterException { if (bytes.size() % 2 != 0) { diff --git a/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java b/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java index 0425177f..3743c42e 100644 --- a/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java +++ b/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java @@ -18,6 +18,7 @@ package com.google.zxing.qrcode.encoder; import com.google.zxing.common.ByteMatrix; import com.google.zxing.WriterException; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * @author satorux@google.com (Satoru Takabayashi) - creator @@ -133,9 +134,9 @@ public final class MatrixUtil { matrix.clear((byte) -1); } - // Build 2D matrix of QR Code from "dataBits" with "getECLevel", "version" and "getMaskPattern". On - // success, store the result in "matrix" and return true. On error, return false. - public static void buildMatrix(final BitVector dataBits, int ecLevel, int version, + // Build 2D matrix of QR Code from "dataBits" with "ecLevel", "version" and "getMaskPattern". On + // success, store the result in "matrix" and return true. + public static void buildMatrix(final BitVector dataBits, ErrorCorrectionLevel ecLevel, int version, int maskPattern, ByteMatrix matrix) throws WriterException { MatrixUtil.clearMatrix(matrix); embedBasicPatterns(version, matrix); @@ -147,7 +148,7 @@ public final class MatrixUtil { embedDataBits(dataBits, maskPattern, matrix); } - // Embed basic patterns. On success, modify the matrix and return true. On error, return false. + // Embed basic patterns. On success, modify the matrix and return true. // The basic patterns are: // - Position detection patterns // - Timing patterns @@ -166,7 +167,8 @@ public final class MatrixUtil { } // Embed type information. On success, modify the matrix. - public static void embedTypeInfo(int ecLevel, int maskPattern, ByteMatrix matrix) throws WriterException { + public static void embedTypeInfo(ErrorCorrectionLevel ecLevel, int maskPattern, ByteMatrix matrix) + throws WriterException { BitVector typeInfoBits = new BitVector(); makeTypeInfoBits(ecLevel, maskPattern, typeInfoBits); @@ -194,9 +196,8 @@ public final class MatrixUtil { } } - // Embed version information if need be. On success, modify the matrix and return true. On error, - // return false. See 8.10 of JISX0510:2004 (p.47) for how to embed version information. Return - // true on success, otherwise return false. + // Embed version information if need be. On success, modify the matrix and return true. + // See 8.10 of JISX0510:2004 (p.47) for how to embed version information. public static void maybeEmbedVersionInfo(int version, ByteMatrix matrix) throws WriterException { if (version < 7) { // Version info is necessary if version >= 7. return; // Don't need version info. @@ -218,8 +219,8 @@ public final class MatrixUtil { } } - // Embed "dataBits" using "getMaskPattern". On success, modify the matrix and return true. On - // error, return false. For debugging purposes, it skips masking process if "getMaskPattern" is -1. + // Embed "dataBits" using "getMaskPattern". On success, modify the matrix and return true. + // For debugging purposes, it skips masking process if "getMaskPattern" is -1. // See 8.7 of JISX0510:2004 (p.38) for how to embed data bits. public static void embedDataBits(final BitVector dataBits, int maskPattern, ByteMatrix matrix) throws WriterException { @@ -322,14 +323,14 @@ public final class MatrixUtil { } // Make bit vector of type information. On success, store the result in "bits" and return true. - // On error, return false. Encode error correction level and mask pattern. See 8.9 of + // Encode error correction level and mask pattern. See 8.9 of // JISX0510:2004 (p.45) for details. - public static void makeTypeInfoBits(int ecLevel, final int maskPattern, BitVector bits) throws WriterException { - final int ecCode = QRCode.getECLevelCode(ecLevel); + public static void makeTypeInfoBits(ErrorCorrectionLevel ecLevel, final int maskPattern, BitVector bits) + throws WriterException { if (!QRCode.isValidMaskPattern(maskPattern)) { throw new WriterException("Invalid mask pattern"); } - final int typeInfo = (ecCode << 3) | maskPattern; + final int typeInfo = (ecLevel.getBits() << 3) | maskPattern; bits.appendBits(typeInfo, 5); final int bchCode = MatrixUtil.calculateBCHCode(typeInfo, TYPE_INFO_POLY); @@ -345,7 +346,7 @@ public final class MatrixUtil { } // Make bit vector of version information. On success, store the result in "bits" and return true. - // On error, return false. See 8.10 of JISX0510:2004 (p.45) for details. + // See 8.10 of JISX0510:2004 (p.45) for details. public static void makeVersionInfoBits(int version, BitVector bits) throws WriterException { bits.appendBits(version, 6); final int bchCode = MatrixUtil.calculateBCHCode(version, VERSION_INFO_POLY); @@ -494,7 +495,8 @@ public final class MatrixUtil { } // Embed position adjustment patterns if need be. - private static void maybeEmbedPositionAdjustmentPatterns(final int version, ByteMatrix matrix) throws WriterException { + private static void maybeEmbedPositionAdjustmentPatterns(final int version, ByteMatrix matrix) + throws WriterException { if (version < 2) { // The patterns appear if version >= 2 return; } diff --git a/core/src/com/google/zxing/qrcode/encoder/QRCode.java b/core/src/com/google/zxing/qrcode/encoder/QRCode.java index b4dc0573..30e46765 100644 --- a/core/src/com/google/zxing/qrcode/encoder/QRCode.java +++ b/core/src/com/google/zxing/qrcode/encoder/QRCode.java @@ -18,6 +18,7 @@ package com.google.zxing.qrcode.encoder; import com.google.zxing.common.ByteMatrix; import com.google.zxing.WriterException; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * @author satorux@google.com (Satoru Takabayashi) - creator @@ -42,7 +43,7 @@ public final class QRCode { }; private int mode; - private int ecLevel; + private ErrorCorrectionLevel ecLevel; private int version; private int matrixWidth; private int maskPattern; @@ -75,22 +76,9 @@ public final class QRCode { // MODE_FNC1, public static final int NUM_MODES = 4; - // The error correction levels are defined in the table 22 of JISX0510:2004 (p.45). It's very - // unlikely (we've already covered all of them!) but if you add an item to this, please also add - // it to ecLevelToString() and getECLevelCode(). - // - // Formerly enum ECLevel - public static final int EC_LEVEL_UNDEFINED = -1; - // They don't have names in the standard! - public static final int EC_LEVEL_L = 0; // 7% of corruption can be recovered. - public static final int EC_LEVEL_M = 1; // 15% - public static final int EC_LEVEL_Q = 2; // 25% - public static final int EC_LEVEL_H = 3; // 30% - public static final int NUM_EC_LEVELS = 4; - public QRCode() { mode = MODE_UNDEFINED; - ecLevel = EC_LEVEL_UNDEFINED; + ecLevel = null; version = -1; matrixWidth = -1; maskPattern = -1; @@ -102,25 +90,55 @@ public final class QRCode { } // Mode of the QR Code. - public int getMode() { return mode; } + public int getMode() { + return mode; + } + // Error correction level of the QR Code. - public int getECLevel() { return ecLevel; } + public ErrorCorrectionLevel getECLevel() { + return ecLevel; + } + // Version of the QR Code. The bigger size, the bigger version. - public int getVersion() { return version; } + public int getVersion() { + return version; + } + // ByteMatrix width of the QR Code. - public int getMatrixWidth() { return matrixWidth; } + public int getMatrixWidth() { + return matrixWidth; + } + // Mask pattern of the QR Code. - public int getMaskPattern() { return maskPattern; } + public int getMaskPattern() { + return maskPattern; + } + // Number of total bytes in the QR Code. - public int getNumTotalBytes() { return numTotalBytes; } + public int getNumTotalBytes() { + return numTotalBytes; + } + // Number of data bytes in the QR Code. - public int getNumDataBytes() { return numDataBytes; } + public int getNumDataBytes() { + return numDataBytes; + } + // Number of error correction bytes in the QR Code. - public int getNumECBytes() { return numECBytes; } + public int getNumECBytes() { + return numECBytes; + } + // Number of Reedsolomon blocks in the QR Code. - public int getNumRSBlocks() { return numRSBlocks; } + public int getNumRSBlocks() { + return numRSBlocks; + } + // ByteMatrix data of the QR Code. - public final ByteMatrix getMatrix() { return matrix; } + public final ByteMatrix getMatrix() { + return matrix; + } + // Return the value of the module (cell) pointed by "x" and "y" in the matrix of the QR Code. They // call cells in the matrix "modules". 1 represents a black cell, and 0 represents a white cell. @@ -140,7 +158,7 @@ public final class QRCode { return ( // First check if all version are not uninitialized. mode != MODE_UNDEFINED && - ecLevel != EC_LEVEL_UNDEFINED && + ecLevel != null && version != -1 && matrixWidth != -1 && maskPattern != -1 && @@ -151,7 +169,6 @@ public final class QRCode { // Then check them in other ways.. isValidVersion(version) && isValidMode(mode) && - isValidECLevel(ecLevel) && isValidMatrixWidth(matrixWidth) && isValidMaskPattern(maskPattern) && numTotalBytes == numDataBytes + numECBytes && @@ -170,7 +187,7 @@ public final class QRCode { result.append(" mode: "); result.append(modeToString(mode)); result.append("\n ecLevel: "); - result.append(ecLevelToString(ecLevel)); + result.append(ecLevel); result.append("\n version: "); result.append(version); result.append("\n matrixWidth: "); @@ -199,7 +216,7 @@ public final class QRCode { mode = value; } - public void setECLevel(int value) { + public void setECLevel(ErrorCorrectionLevel value) { ecLevel = value; } @@ -241,11 +258,6 @@ public final class QRCode { return version >= MIN_VERSION && version <= MAX_VERSION; } - // Check if "ecLevel" is valid. - public static boolean isValidECLevel(int ecLevel) { - return ecLevel >= 0 && ecLevel < NUM_EC_LEVELS; - } - // Check if "mode" is valid. public static boolean isValidMode(final int mode) { return mode >= 0 && mode < NUM_MODES; @@ -261,25 +273,6 @@ public final class QRCode { return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS; } - // Convert "getECLevel" to String for debugging. - public static String ecLevelToString(int ecLevel) { - switch (ecLevel) { - case QRCode.EC_LEVEL_UNDEFINED: - return "UNDEFINED"; - case QRCode.EC_LEVEL_L: - return "L"; - case QRCode.EC_LEVEL_M: - return "M"; - case QRCode.EC_LEVEL_Q: - return "Q"; - case QRCode.EC_LEVEL_H: - return "H"; - default: - break; - } - return "UNKNOWN"; - } - // Convert "mode" to String for debugging. public static String modeToString(int mode) { switch (mode) { @@ -299,23 +292,6 @@ public final class QRCode { return "UNKNOWN"; } - // Return the code of error correction level. On error, return -1. The codes of error correction - // levels are defined in the table 22 of JISX0510:2004 (p.45). - public static int getECLevelCode(final int ecLevel) throws WriterException { - switch (ecLevel) { - case QRCode.EC_LEVEL_L: - return 1; - case QRCode.EC_LEVEL_M: - return 0; - case QRCode.EC_LEVEL_Q: - return 3; - case QRCode.EC_LEVEL_H: - return 2; - default: - throw new WriterException("Unknown EC level"); - } - } - // Return the code of mode. On error, return -1. The codes of modes are defined in the table 2 of // JISX0510:2004 (p.16). public static int getModeCode(final int mode) throws WriterException { @@ -352,7 +328,7 @@ public final class QRCode { throw new IllegalArgumentException("Bad version: " + version); } - // Return true if the all values in the matrix are binary numbers. Otherwise, return false. + // Return true if the all values in the matrix are binary numbers. // // JAVAPORT: This is going to be super expensive and unnecessary, we should not call this in // production. I'm leaving it because it may be useful for testing. It should be removed entirely diff --git a/core/test/src/com/google/zxing/qrcode/QRCodeWriterTestCase.java b/core/test/src/com/google/zxing/qrcode/QRCodeWriterTestCase.java index eec33571..8a280b20 100644 --- a/core/test/src/com/google/zxing/qrcode/QRCodeWriterTestCase.java +++ b/core/test/src/com/google/zxing/qrcode/QRCodeWriterTestCase.java @@ -20,7 +20,7 @@ import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.WriterException; import com.google.zxing.common.ByteMatrix; -import com.google.zxing.qrcode.encoder.QRCode; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import junit.framework.TestCase; import javax.imageio.ImageIO; @@ -96,7 +96,7 @@ public final class QRCodeWriterTestCase extends TestCase { assertEquals(strangeHeight, matrix.height()); } - private static boolean compareToGoldenFile(final String contents, final int ecLevel, + private static boolean compareToGoldenFile(final String contents, final ErrorCorrectionLevel ecLevel, final int resolution, final String fileName) throws WriterException { BufferedImage image = loadImage(fileName); @@ -106,7 +106,7 @@ public final class QRCodeWriterTestCase extends TestCase { QRCodeWriter writer = new QRCodeWriter(); Hashtable hints = new Hashtable(); - hints.put(EncodeHintType.ERROR_CORRECTION, new Integer(ecLevel)); + hints.put(EncodeHintType.ERROR_CORRECTION, ecLevel); ByteMatrix generatedResult = writer.encode(contents, BarcodeFormat.QR_CODE, resolution, resolution, hints); @@ -123,16 +123,16 @@ public final class QRCodeWriterTestCase extends TestCase { // and cell phones. We expect pixel-perfect results, because the error correction level is known, // and the pixel dimensions matches exactly. public void testRegressionTest() throws WriterException { - assertTrue(compareToGoldenFile("http://www.google.com/", QRCode.EC_LEVEL_M, 99, + assertTrue(compareToGoldenFile("http://www.google.com/", ErrorCorrectionLevel.M, 99, "renderer-test-01.png")); - assertTrue(compareToGoldenFile("12345", QRCode.EC_LEVEL_L, 58, "renderer-test-02.png")); + assertTrue(compareToGoldenFile("12345", ErrorCorrectionLevel.L, 58, "renderer-test-02.png")); // Test in Katakana in Shift_JIS. final byte[] KATAKANA_INPUT = { (byte)0x83, 0x65, (byte)0x83, 0x58, (byte)0x83, 0x67 }; - assertTrue(compareToGoldenFile(new String(KATAKANA_INPUT), QRCode.EC_LEVEL_H, 145, + assertTrue(compareToGoldenFile(new String(KATAKANA_INPUT), ErrorCorrectionLevel.H, 145, "renderer-test-03.png")); } diff --git a/core/test/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevelTestCase.java b/core/test/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevelTestCase.java index 14a3df0c..f23cfb8a 100644 --- a/core/test/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevelTestCase.java +++ b/core/test/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevelTestCase.java @@ -16,7 +16,6 @@ package com.google.zxing.qrcode.decoder; -import com.google.zxing.ReaderException; import junit.framework.TestCase; /** @@ -24,7 +23,7 @@ import junit.framework.TestCase; */ public final class ErrorCorrectionLevelTestCase extends TestCase { - public void testForBits() throws ReaderException { + public void testForBits() { assertEquals(ErrorCorrectionLevel.M, ErrorCorrectionLevel.forBits(0)); assertEquals(ErrorCorrectionLevel.L, ErrorCorrectionLevel.forBits(1)); assertEquals(ErrorCorrectionLevel.H, ErrorCorrectionLevel.forBits(2)); @@ -32,7 +31,7 @@ public final class ErrorCorrectionLevelTestCase extends TestCase { try { ErrorCorrectionLevel.forBits(4); fail("Should have thrown an exception"); - } catch (ReaderException re) { + } catch (IllegalArgumentException iae) { // good } } diff --git a/core/test/src/com/google/zxing/qrcode/encoder/EncoderTestCase.java b/core/test/src/com/google/zxing/qrcode/encoder/EncoderTestCase.java index daeb08f6..c62b1171 100644 --- a/core/test/src/com/google/zxing/qrcode/encoder/EncoderTestCase.java +++ b/core/test/src/com/google/zxing/qrcode/encoder/EncoderTestCase.java @@ -18,6 +18,7 @@ package com.google.zxing.qrcode.encoder; import com.google.zxing.common.ByteArray; import com.google.zxing.WriterException; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import junit.framework.TestCase; /** @@ -85,7 +86,7 @@ public final class EncoderTestCase extends TestCase { public void testEncode() throws WriterException { QRCode qrCode = new QRCode(); - Encoder.encode(new ByteArray("ABCDEF"), QRCode.EC_LEVEL_H, qrCode); + Encoder.encode(new ByteArray("ABCDEF"), ErrorCorrectionLevel.H, qrCode); // The following is a valid QR Code that can be read by cell phones. String expected = "<<\n" + @@ -643,6 +644,6 @@ public final class EncoderTestCase extends TestCase { dataBytes[x] = '0'; } QRCode qrCode = new QRCode(); - Encoder.encode(new ByteArray(dataBytes), QRCode.EC_LEVEL_L, qrCode); + Encoder.encode(new ByteArray(dataBytes), ErrorCorrectionLevel.L, qrCode); } } diff --git a/core/test/src/com/google/zxing/qrcode/encoder/MatrixUtilTestCase.java b/core/test/src/com/google/zxing/qrcode/encoder/MatrixUtilTestCase.java index aefef50d..d6c13e53 100644 --- a/core/test/src/com/google/zxing/qrcode/encoder/MatrixUtilTestCase.java +++ b/core/test/src/com/google/zxing/qrcode/encoder/MatrixUtilTestCase.java @@ -18,6 +18,7 @@ package com.google.zxing.qrcode.encoder; import com.google.zxing.common.ByteMatrix; import com.google.zxing.WriterException; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import junit.framework.TestCase; /** @@ -141,7 +142,7 @@ public final class MatrixUtilTestCase extends TestCase { " 1 \n"; ByteMatrix matrix = new ByteMatrix(21, 21); MatrixUtil.clearMatrix(matrix); - MatrixUtil.embedTypeInfo(QRCode.EC_LEVEL_M, 5, matrix); + MatrixUtil.embedTypeInfo(ErrorCorrectionLevel.M, 5, matrix); assertEquals(expected, matrix.toString()); } @@ -242,7 +243,7 @@ public final class MatrixUtilTestCase extends TestCase { } ByteMatrix matrix = new ByteMatrix(21, 21); MatrixUtil.buildMatrix(bits, - QRCode.EC_LEVEL_H, + ErrorCorrectionLevel.H, 1, // Version 1 3, // Mask pattern 3 matrix); @@ -289,7 +290,7 @@ public final class MatrixUtilTestCase extends TestCase { public void testMakeTypeInfoInfoBits() throws WriterException { // From Appendix C in JISX0510:2004 (p 65) BitVector bits = new BitVector(); - MatrixUtil.makeTypeInfoBits(QRCode.EC_LEVEL_M, + MatrixUtil.makeTypeInfoBits(ErrorCorrectionLevel.M, 5, bits); assertEquals("100000011001110", bits.toString()); } diff --git a/core/test/src/com/google/zxing/qrcode/encoder/QRCodeTestCase.java b/core/test/src/com/google/zxing/qrcode/encoder/QRCodeTestCase.java index 15481fdd..41e38e65 100644 --- a/core/test/src/com/google/zxing/qrcode/encoder/QRCodeTestCase.java +++ b/core/test/src/com/google/zxing/qrcode/encoder/QRCodeTestCase.java @@ -18,6 +18,7 @@ package com.google.zxing.qrcode.encoder; import com.google.zxing.common.ByteMatrix; import com.google.zxing.WriterException; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import junit.framework.TestCase; /** @@ -33,7 +34,7 @@ public final class QRCodeTestCase extends TestCase { // First, test simple setters and getters. // We use numbers of version 7-H. qrCode.setMode(QRCode.MODE_8BIT_BYTE); - qrCode.setECLevel(QRCode.EC_LEVEL_H); + qrCode.setECLevel(ErrorCorrectionLevel.H); qrCode.setVersion(7); qrCode.setMatrixWidth(45); qrCode.setMaskPattern(3); @@ -43,7 +44,7 @@ public final class QRCodeTestCase extends TestCase { qrCode.setNumRSBlocks(5); assertEquals(QRCode.MODE_8BIT_BYTE, qrCode.getMode()); - assertEquals(QRCode.EC_LEVEL_H, qrCode.getECLevel()); + assertEquals(ErrorCorrectionLevel.H, qrCode.getECLevel()); assertEquals(7, qrCode.getVersion()); assertEquals(45, qrCode.getMatrixWidth()); assertEquals(3, qrCode.getMaskPattern()); @@ -85,7 +86,7 @@ public final class QRCodeTestCase extends TestCase { String expected = "<<\n" + " mode: UNDEFINED\n" + - " ecLevel: UNDEFINED\n" + + " ecLevel: null\n" + " version: -1\n" + " matrixWidth: -1\n" + " maskPattern: -1\n" + @@ -134,7 +135,7 @@ public final class QRCodeTestCase extends TestCase { ">>\n"; QRCode qrCode = new QRCode(); qrCode.setMode(QRCode.MODE_8BIT_BYTE); - qrCode.setECLevel(QRCode.EC_LEVEL_H); + qrCode.setECLevel(ErrorCorrectionLevel.H); qrCode.setVersion(1); qrCode.setMatrixWidth(21); qrCode.setMaskPattern(3); @@ -161,15 +162,6 @@ public final class QRCodeTestCase extends TestCase { assertFalse(QRCode.isValidVersion(0)); } - public void testIsValidECLevel() { - assertFalse(QRCode.isValidECLevel(QRCode.EC_LEVEL_UNDEFINED)); - assertTrue(QRCode.isValidECLevel(QRCode.EC_LEVEL_L)); - assertTrue(QRCode.isValidECLevel(QRCode.EC_LEVEL_Q)); - assertTrue(QRCode.isValidECLevel(QRCode.EC_LEVEL_M)); - assertTrue(QRCode.isValidECLevel(QRCode.EC_LEVEL_H)); - assertFalse(QRCode.isValidECLevel(QRCode.NUM_EC_LEVELS)); - } - public void testIsValidMode() { assertFalse(QRCode.isValidMode(QRCode.MODE_UNDEFINED)); assertTrue(QRCode.isValidMode(QRCode.MODE_NUMERIC)); @@ -200,15 +192,6 @@ public final class QRCodeTestCase extends TestCase { assertEquals("UNKNOWN", QRCode.modeToString(QRCode.NUM_MODES)); } - public void testECLevelToString() { - assertEquals("UNDEFINED", QRCode.ecLevelToString(QRCode.EC_LEVEL_UNDEFINED)); - assertEquals("L", QRCode.ecLevelToString(QRCode.EC_LEVEL_L)); - assertEquals("M", QRCode.ecLevelToString(QRCode.EC_LEVEL_M)); - assertEquals("Q", QRCode.ecLevelToString(QRCode.EC_LEVEL_Q)); - assertEquals("H", QRCode.ecLevelToString(QRCode.EC_LEVEL_H)); - assertEquals("UNKNOWN", QRCode.ecLevelToString(QRCode.NUM_EC_LEVELS)); - } - public void testGetModeCode() throws WriterException { assertEquals(1, QRCode.getModeCode(QRCode.MODE_NUMERIC)); assertEquals(2, QRCode.getModeCode(QRCode.MODE_ALPHANUMERIC)); @@ -222,16 +205,4 @@ public final class QRCodeTestCase extends TestCase { } } - public void testGetECLevelCode() throws WriterException { - assertEquals(1, QRCode.getECLevelCode(QRCode.EC_LEVEL_L)); - assertEquals(0, QRCode.getECLevelCode(QRCode.EC_LEVEL_M)); - assertEquals(3, QRCode.getECLevelCode(QRCode.EC_LEVEL_Q)); - assertEquals(2, QRCode.getECLevelCode(QRCode.EC_LEVEL_H)); - try { - QRCode.getECLevelCode(QRCode.EC_LEVEL_UNDEFINED); - fail("Should have thrown exception"); - } catch (WriterException we) { - // good - } - } } -- 2.20.1