static int Mask_evaluateSymbol(int width, unsigned char *frame) { int x, y; int demerit = 0; int runLength[QRSPEC_WIDTH_MAX + 1]; int length; demerit += Mask_calcN2(width, frame); for(y=0; y<width; y++) { length = Mask_calcRunLength(width, frame + y * width, 0, runLength); demerit += Mask_calcN1N3(length, runLength); } for(x=0; x<width; x++) { length = Mask_calcRunLength(width, frame + x, 1, runLength); demerit += Mask_calcN1N3(length, runLength); } return demerit; }
void test_calcN1N3(void) { int runLength[26]; int length; int demerit; int i; static unsigned char pattern[][16] = { {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, N3}, {0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, N3}, {1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0}, {1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, N3}, {1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, N3}, {1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, N3 * 2}, }; static unsigned char pattern2[][19] = { {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, N3 + N1 + 1}, {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, N3 + N1 + 1}, {1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, N1 + 1}, {1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, N3 + N1 + 1}, {1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, N3 + N1 + 1} }; testStart("Test N3 penalty calculation"); for(i=0; i<6; i++) { length = Mask_calcRunLength(15, pattern[i], 0, runLength); demerit = Mask_calcN1N3(length, runLength); assert_equal(pattern[i][15], demerit, "N3 penalty is wrong: %d, expected %d\n", demerit, pattern[i][15]); } for(i=0; i<5; i++) { length = Mask_calcRunLength(18, pattern2[i], 0, runLength); demerit = Mask_calcN1N3(length, runLength); assert_equal(pattern2[i][18], demerit, "N3 penalty is wrong: %d, expected %d\n", demerit, pattern2[i][18]); } testFinish(); }
//__STATIC static int Mask_evaluateSymbol(int width, unsigned char *frame) { int x, y; unsigned char *p; unsigned char b22, w22; int head; int demerit = 0; p = frame; for(y=0; y<width; y++) { head = 0; runLength[0] = 1; for(x=0; x<width; x++) { if(x > 0 && y > 0) { b22 = p[0] & p[-1] & p[-width] & p [-width-1]; w22 = p[0] | p[-1] | p[-width] | p [-width-1]; if((b22 | (w22 ^ 1))&1) { demerit += N2; } } if(x == 0 && (p[0] & 1)) { runLength[0] = -1; head = 1; runLength[head] = 1; } else if(x > 0) { if((p[0] ^ p[-1]) & 1) { head++; runLength[head] = 1; } else { runLength[head]++; } } p++; } demerit += Mask_calcN1N3(head+1, runLength); } for(x=0; x<width; x++) { head = 0; runLength[0] = 1; p = frame + x; for(y=0; y<width; y++) { if(y == 0 && (p[0] & 1)) { runLength[0] = -1; head = 1; runLength[head] = 1; } else if(y > 0) { if((p[0] ^ p[-width]) & 1) { head++; runLength[head] = 1; } else { runLength[head]++; } } p+=width; } demerit += Mask_calcN1N3(head+1, runLength); } return demerit; }