// 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.
- static boolean Encode(final StringPiece& bytes, QRCode.ECLevel ec_level,
- QRCode *qr_code) {
+ static boolean Encode(final StringPiece& bytes, int ec_level, QRCode *qr_code) {
// Step 1: Choose the mode (encoding).
- final QRCode.Mode mode = ChooseMode(bytes);
+ final int mode = ChooseMode(bytes);
// Step 2: Append "bytes" into "data_bits" in appropriate encoding.
BitVector data_bits;
// distinguish Shift_JIS from other encodings such as ISO-8859-1, from
// data bytes alone. For example "\xE0\xE0" can be interpreted as one
// character in Shift_JIS, but also two characters in ISO-8859-1.
- static QRCode.Mode ChooseMode(final StringPiece &bytes) {
- boolean has_numeric = false;
- boolean has_alphanumeric = false;
- boolean has_other = false;
- for (int i = 0; i < bytes.size(); ++i) {
- final int byte = bytes[i];
- if (byte >= '0' && byte <= '9') {
- has_numeric = true;
- } else if (GetAlphanumericCode(byte) != -1) {
- has_alphanumeric = true;
- } else {
- has_other = true;
- }
- }
- if (has_other) {
+ static int ChooseMode(final StringPiece &bytes) {
+ boolean has_numeric = false;
+ boolean has_alphanumeric = false;
+ boolean has_other = false;
+ for (int i = 0; i < bytes.size(); ++i) {
+ final int byte = bytes[i];
+ if (byte >= '0' && byte <= '9') {
+ has_numeric = true;
+ } else if (GetAlphanumericCode(byte) != -1) {
+ has_alphanumeric = true;
+ } else {
+ has_other = true;
+ }
+ }
+ if (has_other) {
+ return QRCode.MODE_8BIT_BYTE;
+ } else if (has_alphanumeric) {
+ return QRCode.MODE_ALPHANUMERIC;
+ } else if (has_numeric) {
+ return QRCode.MODE_NUMERIC;
+ }
+ // "bytes" must be empty to reach here.
+ Debug.DCHECK(bytes.empty());
return QRCode.MODE_8BIT_BYTE;
- } else if (has_alphanumeric) {
- return QRCode.MODE_ALPHANUMERIC;
- } else if (has_numeric) {
- return QRCode.MODE_NUMERIC;
}
- // "bytes" must be empty to reach here.
- Debug.DCHECK(bytes.empty());
- return QRCode.MODE_8BIT_BYTE;
-}
- private static int ChooseMaskPattern(final BitVector &bits,
- QRCode.ECLevel ec_level,
- int version,
- QRCodeMatrix *matrix) {
+ private static int ChooseMaskPattern(final BitVector &bits, int ec_level, int version,
+ QRCodeMatrix *matrix) {
if (!QRCode.IsValidMatrixWidth(matrix.width())) {
Debug.LOG_ERROR("Invalid matrix width: " + matrix.width());
return -1;
// Initialize "qr_code" according to "num_input_bytes", "ec_level",
// and "mode". On success, modify "qr_code" and return true. On
// error, return false.
- static boolean InitQRCode(int num_input_bytes, QRCode.ECLevel ec_level,
- QRCode.Mode mode, QRCode *qr_code) {
+ static boolean InitQRCode(int num_input_bytes, int ec_level, int mode, QRCode *qr_code) {
qr_code.set_ec_level(ec_level);
qr_code.set_mode(mode);
// Append mode info. On success, store the result in "bits" and
// return true. On error, return false.
- static boolean AppendModeInfo(QRCode.Mode mode, BitVector *bits) {
+ static boolean AppendModeInfo(int mode, BitVector *bits) {
final int code = QRCode.GetModeCode(mode);
if (code == -1) {
Debug.LOG_ERROR("Invalid mode: " + mode);
// Append length info. On success, store the result in "bits" and
// return true. On error, return false.
- static boolean AppendLengthInfo(int num_bytes,
- int version,
- QRCode.Mode mode,
- BitVector *bits) {
+ static boolean AppendLengthInfo(int num_bytes, int version, int mode, BitVector *bits) {
int num_letters = num_bytes;
// In Kanji mode, a letter is represented in two bytes.
if (mode == QRCode.MODE_KANJI) {
return true;
}
- // Append "bytes" in "mode" mode (encoding) into "bits". On
- // success, store the result in "bits" and return true. On error,
- // return false.
- static boolean AppendBytes(final StringPiece &bytes,
- QRCode.Mode mode, BitVector *bits) {
+ // Append "bytes" in "mode" mode (encoding) into "bits". On success, store the result in "bits"
+ // and return true. On error, return false.
+ static boolean AppendBytes(final StringPiece &bytes, int mode, BitVector *bits) {
switch (mode) {
case QRCode.MODE_NUMERIC:
return AppendNumericBytes(bytes, bits);
return false;
}
- // Append "bytes" to "bits" using QRCode.MODE_NUMERIC mode.
- // On success, store the result in "bits" and return true. On error,
- // return false.
+ // Append "bytes" to "bits" using QRCode.MODE_NUMERIC mode. On success, store the result in "bits"
+ // and return true. On error, return false.
static boolean AppendNumericBytes(final StringPiece &bytes, BitVector *bits) {
// Validate all the bytes first.
for (int i = 0; i < bytes.size(); ++i) {
// "version" and "mask_pattern". On success, store the result in
// "matrix" and return true. On error, return false.
public static boolean BuildMatrix(final BitVector &data_bits,
- QRCode.ECLevel ec_level,
+ int ec_level,
int version,
int mask_pattern,
QRCodeMatrix *matrix) {
// Embed type information. On success, modify the matrix and return
// true. On error, return false.
- public static boolean EmbedTypeInfo(QRCode.ECLevel ec_level,
- int mask_pattern,
- QRCodeMatrix *matrix) {
+ public static boolean EmbedTypeInfo(int ec_level, int mask_pattern, QRCodeMatrix *matrix) {
BitVector type_info_bits;
if (!MakeTypeInfoBits(ec_level, mask_pattern, &type_info_bits)) {
return false;
// result in "bits" and return true. On error, return false.
// Encode error correction level and mask pattern. See 8.9 of
// JISX0510:2004 (p.45) for details.
- public static boolean MakeTypeInfoBits(QRCode.ECLevel ec_level,
- final int mask_pattern,
- BitVector *bits) {
+ public static boolean MakeTypeInfoBits(int ec_level, final int mask_pattern, BitVector *bits) {
final int ec_code = QRCode.GetECLevelCode(ec_level);
if (ec_code == -1) {
return false;
// JAVAPORT: Do not remove trailing slashes yet. There are very likely conflicts with local
// variables and parameters which will introduce insidious bugs.
- private Mode mode_;
- private ECLevel ec_level_;
+ private int mode_;
+ private int ec_level_;
private int version_;
private int matrix_width_;
private int mask_pattern_;
private QRCodeMatrix *matrix_;
- // They call encoding "mode". The modes are defined in 8.3 of
- // JISX0510:2004 (p.14). It's unlikely (probably we will not
- // support complicated modes) but if you add an item to this, please
- // also add it to ModeToString(), GetModeCode(),
- // GetNumBitsForLength(), Encoder.AppendBytes(),
+ // They call encoding "mode". The modes are defined in 8.3 of JISX0510:2004 (p.14). It's unlikely
+ // (probably we will not support complicated modes) but if you add an item to this, please also
+ // add it to ModeToString(), GetModeCode(), GetNumBitsForLength(), Encoder.AppendBytes(), and
// Encoder.ChooseMode().
- public enum Mode {
- MODE_UNDEFINED = -1,
- MODE_NUMERIC,
- MODE_ALPHANUMERIC,
- MODE_8BIT_BYTE,
- MODE_KANJI, // Shift_JIS
- // The following modes are unimplemented.
- // MODE_ECI,
- // MODE_MIXED,
- // MODE_CONCATENATED,
- // MODE_FNC1,
- NUM_MODES, // Always keep this at the end.
- };
+ //
+ // JAVAPORT: These used to be C++ enums, but the code evaluates them as integers, and requires
+ // negative values. I don't want to take the ParsedResultType approach of a class full of statics
+ // of that class's type. The best compromise here is integer constants.
+ //
+ // Formerly enum Mode
+ public static final int MODE_UNDEFINED = -1;
+ public static final int MODE_NUMERIC = 0;
+ public static final int MODE_ALPHANUMERIC = 1;
+ public static final int MODE_8BIT_BYTE = 2;
+ public static final int MODE_KANJI = 3; // Shift_JIS
+ // The following modes are unimplemented.
+ // MODE_ECI,
+ // MODE_MIXED,
+ // MODE_CONCATENATED,
+ // 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().
- public enum ECLevel {
- EC_LEVEL_UNDEFINED = -1,
- // They don't have names in the standard!
- EC_LEVEL_L, // 7% of corruption can be recovered.
- EC_LEVEL_M, // 15%
- EC_LEVEL_Q, // 25%
- EC_LEVEL_H, // 30%
- NUM_EC_LEVELS, // Always keep this at the end.
- };
+ // 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;
}
// Mode of the QR Code.
- public Mode mode() { return mode_; }
+ public int mode() { return mode_; }
// Error correction level of the QR Code.
- public ECLevel ec_level() { return ec_level_; }
+ public int ec_level() { return ec_level_; }
// Version of the QR Code. The bigger size, the bigger version.
public int version() { return version_; }
// Matrix width of the QR Code.
return result;
}
- public void set_mode(Mode value) { mode_ = value; }
- public void set_ec_level(ECLevel value) { ec_level_ = value; }
+ public void set_mode(int value) { mode_ = value; }
+ public void set_ec_level(int value) { ec_level_ = value; }
public void set_version(int value) { version_ = value; }
public void set_matrix_width(int value) { matrix_width_ = value; }
public void set_mask_pattern(int value) { mask_pattern_ = value; }
return version >= kMinVersion && version <= kMaxVersion;
}
// Check if "mask_pattern" is valid.
- public static boolean IsValidECLevel(ECLevel ec_level) {
+ public static boolean IsValidECLevel(int ec_level) {
return ec_level >= 0 && ec_level < NUM_EC_LEVELS;
}
// Check if "mode" is valid.
- public static boolean IsValidMode(final QRCode.Mode mode) {
+ public static boolean IsValidMode(final int mode) {
return mode >= 0 && mode < NUM_MODES;
}
// Check if "width" is valid.
}
// Convert "ec_level" to String for debugging.
- public static final char *ECLevelToString(QRCode.ECLevel ec_level) {
- switch (ec_level) {
- 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;
+ public static final String ECLevelToString(int ec_level) {
+ switch (ec_level) {
+ 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";
}
- return "UNKNOWN";
-}
// Convert "mode" to String for debugging.
- public static final char *ModeToString(QRCode.Mode mode) {
- switch (mode) {
- case QRCode.MODE_UNDEFINED:
- return "UNDEFINED";
- case QRCode.MODE_NUMERIC:
- return "NUMERIC";
- case QRCode.MODE_ALPHANUMERIC:
- return "ALPHANUMERIC";
- case QRCode.MODE_8BIT_BYTE:
- return "8BIT_BYTE";
- case QRCode.MODE_KANJI:
- return "KANJI";
- default:
- break;
+ public static final String ModeToString(int mode) {
+ switch (mode) {
+ case QRCode.MODE_UNDEFINED:
+ return "UNDEFINED";
+ case QRCode.MODE_NUMERIC:
+ return "NUMERIC";
+ case QRCode.MODE_ALPHANUMERIC:
+ return "ALPHANUMERIC";
+ case QRCode.MODE_8BIT_BYTE:
+ return "8BIT_BYTE";
+ case QRCode.MODE_KANJI:
+ return "KANJI";
+ default:
+ break;
+ }
+ return "UNKNOWN";
}
- 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 QRCode.ECLevel ec_level) {
+ public static int GetECLevelCode(final int ec_level) {
switch (ec_level) {
case QRCode.EC_LEVEL_L:
return 1;
// 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 QRCode.Mode mode) {
+ public static int GetModeCode(final int mode) {
switch (mode) {
case QRCode.MODE_NUMERIC:
return 1;
// Return the number of bits needed for representing the length info
// of QR Code with "version" and "mode". On error, return -1.
- public static int GetNumBitsForLength(int version, QRCode.Mode mode) {
+ public static int GetNumBitsForLength(int version, int mode) {
if (!IsValidVersion(version)) {
Debug.LOG_ERROR("Invalid version: " + version);
return -1;
// Similar to RenderAsPNG but it renders QR code from data in
// "bytes" with error correction level "ec_level". This is the
// friendliest function in the QR code library.
- public static boolean RenderAsPNGFromData(final StringPiece& bytes,
- QRCode.ECLevel ec_level,
- int cell_size,
- String *result) {
+ public static boolean RenderAsPNGFromData(final StringPiece& bytes, int ec_level, int cell_size,
+ String *result) {
QRCode qr_code;
if (!Encoder.Encode(bytes, ec_level, &qr_code)) {
return false;