void test_calcN2(void) { unsigned char frame[64]; int width; int demerit; int x, y; testStart("Test mask evaluation (2x2 block check)"); width = 4; for(y = 0; y < width; y++) { for(x = 0; x < width; x++) { frame[y * width + x] = ((x & 2) ^ (y & 2)) >> 1; } } demerit = Mask_calcN2(width, frame); assert_equal(demerit, N2 * 4, "Calculation of N2 demerit is wrong: %d, expected %d", demerit, N2 * 4); width = 4; for(y = 0; y < width; y++) { for(x = 0; x < width; x++) { frame[y * width + x] = (((x + 1) & 2) ^ (y & 2)) >> 1; } } demerit = Mask_calcN2(width, frame); assert_equal(demerit, N2 * 2, "Calculation of N2 demerit is wrong: %d, expected %d", demerit, N2 * 2); width = 6; for(y = 0; y < width; y++) { for(x = 0; x < width; x++) { frame[y * width + x] = (x / 3) ^ (y / 3); } } demerit = Mask_calcN2(width, frame); assert_equal(demerit, N2 * 16, "Calculation of N2 demerit is wrong: %d, expected %d", demerit, N2 * 16); testFinish(); }
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; }