/** 位置合わせパターンを設定 */ private void setupPositionAdjustPattern() { int[] pos = QRUtil.getPatternPosition(typeNumber); for (int i = 0; i < pos.length; i++) { for (int j = 0; j < pos.length; j++) { int row = pos[i]; int col = pos[j]; if (modules[row][col] != null) { continue; } for (int r = -2; r <= 2; r++) { for (int c = -2; c <= 2; c++) { if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) { modules[row + r][col + c] = Boolean.valueOf(true); } else { modules[row + r][col + c] = Boolean.valueOf(false); } } } } } }
public int getLength() { try { return getData().getBytes(QRUtil.getJISEncoding()).length; } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage()); } }
/** * 最小の型番となる QRCode を作成する。 * * @param data データ * @param errorCorrectLevel 誤り訂正レベル */ public static QRCode getMinimumQRCode(String data, int errorCorrectLevel) { int mode = QRUtil.getMode(data); QRCode qr = new QRCode(); qr.setErrorCorrectLevel(errorCorrectLevel); qr.addData(data, mode); int length = qr.getData(0).getLength(); for (int typeNumber = 1; typeNumber <= 10; typeNumber++) { if (length <= QRUtil.getMaxLength(typeNumber, mode, errorCorrectLevel)) { qr.setTypeNumber(typeNumber); break; } } qr.make(); return qr; }
/** 型番を設定 */ private void setupTypeNumber(boolean test) { int bits = QRUtil.getBCHTypeNumber(typeNumber); for (int i = 0; i < 18; i++) { Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1); modules[i / 3][i % 3 + moduleCount - 8 - 3] = mod; } for (int i = 0; i < 18; i++) { Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1); modules[i % 3 + moduleCount - 8 - 3][i / 3] = mod; } }
public void write(BitBuffer buffer) { try { byte[] data = getData().getBytes(QRUtil.getJISEncoding()); for (int i = 0; i < data.length; i++) { buffer.put(data[i], 8); } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage()); } }
private void mapData(byte[] data, int maskPattern) { int inc = -1; int row = moduleCount - 1; int bitIndex = 7; int byteIndex = 0; for (int col = moduleCount - 1; col > 0; col -= 2) { if (col == 6) col--; while (true) { for (int c = 0; c < 2; c++) { if (modules[row][col - c] == null) { boolean dark = false; if (byteIndex < data.length) { dark = (((data[byteIndex] >>> bitIndex) & 1) == 1); } boolean mask = QRUtil.getMask(maskPattern, row, col - c); if (mask) { dark = !dark; } modules[row][col - c] = Boolean.valueOf(dark); bitIndex--; if (bitIndex == -1) { byteIndex++; bitIndex = 7; } } } row += inc; if (row < 0 || moduleCount <= row) { row -= inc; inc = -inc; break; } } } }
private int getBestMaskPattern() { int minLostPoint = 0; int pattern = 0; for (int i = 0; i < 8; i++) { make(true, i); int lostPoint = QRUtil.getLostPoint(this); if (i == 0 || minLostPoint > lostPoint) { minLostPoint = lostPoint; pattern = i; } } return pattern; }
/** 形式情報を設定 */ private void setupTypeInfo(boolean test, int maskPattern) { int data = (errorCorrectLevel << 3) | maskPattern; int bits = QRUtil.getBCHTypeInfo(data); // 縦方向 for (int i = 0; i < 15; i++) { Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1); if (i < 6) { modules[i][8] = mod; } else if (i < 8) { modules[i + 1][8] = mod; } else { modules[moduleCount - 15 + i][8] = mod; } } // 横方向 for (int i = 0; i < 15; i++) { Boolean mod = Boolean.valueOf(!test && ((bits >> i) & 1) == 1); if (i < 8) { modules[8][moduleCount - i - 1] = mod; } else if (i < 9) { modules[8][15 - i - 1 + 1] = mod; } else { modules[8][15 - i - 1] = mod; } } // 固定 modules[moduleCount - 8][8] = Boolean.valueOf(!test); }
/** * データを追加する。 * * @param data データ */ public void addData(String data) { addData(data, QRUtil.getMode(data)); }
private static byte[] createBytes(BitBuffer buffer, RSBlock[] rsBlocks) { int offset = 0; int maxDcCount = 0; int maxEcCount = 0; int[][] dcdata = new int[rsBlocks.length][]; int[][] ecdata = new int[rsBlocks.length][]; for (int r = 0; r < rsBlocks.length; r++) { int dcCount = rsBlocks[r].getDataCount(); int ecCount = rsBlocks[r].getTotalCount() - dcCount; maxDcCount = Math.max(maxDcCount, dcCount); maxEcCount = Math.max(maxEcCount, ecCount); dcdata[r] = new int[dcCount]; for (int i = 0; i < dcdata[r].length; i++) { dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]; } offset += dcCount; Polynomial rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); Polynomial rawPoly = new Polynomial(dcdata[r], rsPoly.getLength() - 1); Polynomial modPoly = rawPoly.mod(rsPoly); ecdata[r] = new int[rsPoly.getLength() - 1]; for (int i = 0; i < ecdata[r].length; i++) { int modIndex = i + modPoly.getLength() - ecdata[r].length; ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0; } } int totalCodeCount = 0; for (int i = 0; i < rsBlocks.length; i++) { totalCodeCount += rsBlocks[i].getTotalCount(); } byte[] data = new byte[totalCodeCount]; int index = 0; for (int i = 0; i < maxDcCount; i++) { for (int r = 0; r < rsBlocks.length; r++) { if (i < dcdata[r].length) { data[index++] = (byte) dcdata[r][i]; } } } for (int i = 0; i < maxEcCount; i++) { for (int r = 0; r < rsBlocks.length; r++) { if (i < ecdata[r].length) { data[index++] = (byte) ecdata[r][i]; } } } return data; }