mirror of
https://github.com/zxing/zxing.git
synced 2024-11-10 04:54:04 -08:00
Unify handling of EC level between encoder and decoder
git-svn-id: https://zxing.googlecode.com/svn/trunk@770 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
416193ff9a
commit
784673a241
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue