From 8b339661d9711403dd291fe6eefd8acbc5555b70 Mon Sep 17 00:00:00 2001 From: srowen Date: Fri, 6 Mar 2009 22:55:19 +0000 Subject: [PATCH] Some clever, perhaps too-clever optimization of masking code git-svn-id: https://zxing.googlecode.com/svn/trunk@877 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../google/zxing/qrcode/encoder/MaskUtil.java | 34 +++++++++++++------ .../zxing/qrcode/encoder/MatrixUtil.java | 5 +-- .../qrcode/encoder/MaskUtilTestCase.java | 2 +- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/core/src/com/google/zxing/qrcode/encoder/MaskUtil.java b/core/src/com/google/zxing/qrcode/encoder/MaskUtil.java index d99c68cc3..27fadef77 100644 --- a/core/src/com/google/zxing/qrcode/encoder/MaskUtil.java +++ b/core/src/com/google/zxing/qrcode/encoder/MaskUtil.java @@ -136,29 +136,43 @@ public final class MaskUtil { // Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask // pattern conditions. - public static int getDataMaskBit(int maskPattern, int x, int y) { + public static boolean getDataMaskBit(int maskPattern, int x, int y) { if (!QRCode.isValidMaskPattern(maskPattern)) { throw new IllegalArgumentException("Invalid mask pattern"); } + int intermediate, temp; switch (maskPattern) { case 0: - return ((y + x) % 2 == 0) ? 1 : 0; + intermediate = (y + x) & 0x1; + break; case 1: - return (y % 2 == 0) ? 1 : 0; + intermediate = y & 0x1; + break; case 2: - return (x % 3 == 0) ? 1 : 0; + intermediate = x % 3; + break; case 3: - return ((y + x) % 3 == 0) ? 1 : 0; + intermediate = (y + x) % 3; + break; case 4: - return (((y / 2) + (x / 3)) % 2 == 0) ? 1 : 0; + intermediate = ((y >>> 1) + (x / 3)) & 0x1; + break; case 5: - return (((y * x) % 2) + ((y * x) % 3) == 0) ? 1 : 0; + temp = y * x; + intermediate = (temp & 0x1) + (temp % 3); + break; case 6: - return ((((y * x) % 2) + ((y * x) % 3)) % 2 == 0) ? 1 : 0; + temp = y * x; + intermediate = (((temp & 0x1) + (temp % 3)) & 0x1); + break; case 7: - return ((((y * x) % 3) + ((y + x) % 2)) % 2 == 0) ? 1 : 0; + temp = y * x; + intermediate = (((temp % 3) + ((y + x) & 0x1)) & 0x1); + break; + default: + throw new IllegalArgumentException("Invalid mask pattern: " + maskPattern); } - throw new IllegalArgumentException("invalid mask pattern: " + maskPattern); + return intermediate == 0; } // Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both diff --git a/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java b/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java index 493cc7978..9980bcfd6 100644 --- a/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java +++ b/core/src/com/google/zxing/qrcode/encoder/MatrixUtil.java @@ -253,8 +253,9 @@ public final class MatrixUtil { // Skip masking if mask_pattern is -1. if (maskPattern != -1) { - int mask = MaskUtil.getDataMaskBit(maskPattern, xx, y); - bit ^= mask; + if (MaskUtil.getDataMaskBit(maskPattern, xx, y)) { + bit ^= 0x1; + } } matrix.set(y, xx, bit); } diff --git a/core/test/src/com/google/zxing/qrcode/encoder/MaskUtilTestCase.java b/core/test/src/com/google/zxing/qrcode/encoder/MaskUtilTestCase.java index ac95511e0..4b202bca2 100644 --- a/core/test/src/com/google/zxing/qrcode/encoder/MaskUtilTestCase.java +++ b/core/test/src/com/google/zxing/qrcode/encoder/MaskUtilTestCase.java @@ -196,7 +196,7 @@ public final class MaskUtilTestCase extends TestCase { int[][] expected) { for (int x = 0; x < 6; ++x) { for (int y = 0; y < 6; ++y) { - if (expected[y][x] != + if ((expected[y][x] == 1) != MaskUtil.getDataMaskBit(maskPattern, x, y)) { return false; }