Some clever, perhaps too-clever optimization of masking code

git-svn-id: https://zxing.googlecode.com/svn/trunk@877 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2009-03-06 22:55:19 +00:00
parent d9498fdc4e
commit 8b339661d9
3 changed files with 28 additions and 13 deletions

View file

@ -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 // Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask
// pattern conditions. // 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)) { if (!QRCode.isValidMaskPattern(maskPattern)) {
throw new IllegalArgumentException("Invalid mask pattern"); throw new IllegalArgumentException("Invalid mask pattern");
} }
int intermediate, temp;
switch (maskPattern) { switch (maskPattern) {
case 0: case 0:
return ((y + x) % 2 == 0) ? 1 : 0; intermediate = (y + x) & 0x1;
break;
case 1: case 1:
return (y % 2 == 0) ? 1 : 0; intermediate = y & 0x1;
break;
case 2: case 2:
return (x % 3 == 0) ? 1 : 0; intermediate = x % 3;
break;
case 3: case 3:
return ((y + x) % 3 == 0) ? 1 : 0; intermediate = (y + x) % 3;
break;
case 4: case 4:
return (((y / 2) + (x / 3)) % 2 == 0) ? 1 : 0; intermediate = ((y >>> 1) + (x / 3)) & 0x1;
break;
case 5: case 5:
return (((y * x) % 2) + ((y * x) % 3) == 0) ? 1 : 0; temp = y * x;
intermediate = (temp & 0x1) + (temp % 3);
break;
case 6: 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: 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 // Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both

View file

@ -253,8 +253,9 @@ public final class MatrixUtil {
// Skip masking if mask_pattern is -1. // Skip masking if mask_pattern is -1.
if (maskPattern != -1) { if (maskPattern != -1) {
int mask = MaskUtil.getDataMaskBit(maskPattern, xx, y); if (MaskUtil.getDataMaskBit(maskPattern, xx, y)) {
bit ^= mask; bit ^= 0x1;
}
} }
matrix.set(y, xx, bit); matrix.set(y, xx, bit);
} }

View file

@ -196,7 +196,7 @@ public final class MaskUtilTestCase extends TestCase {
int[][] expected) { int[][] expected) {
for (int x = 0; x < 6; ++x) { for (int x = 0; x < 6; ++x) {
for (int y = 0; y < 6; ++y) { for (int y = 0; y < 6; ++y) {
if (expected[y][x] != if ((expected[y][x] == 1) !=
MaskUtil.getDataMaskBit(maskPattern, x, y)) { MaskUtil.getDataMaskBit(maskPattern, x, y)) {
return false; return false;
} }