static int Mask_writeFormatInformation(int width, unsigned char *frame, int mask, QRecLevel level) { unsigned int format; unsigned char v; int i; int blacks = 0; format = QRspec_getFormatInfo(mask, level); for(i=0; i<8; i++) { if(format & 1) { blacks += 2; v = 0x85; } else { v = 0x84; } frame[width * 8 + width - 1 - i] = v; if(i < 6) { frame[width * i + 8] = v; } else { frame[width * (i + 1) + 8] = v; } format= format >> 1; } for(i=0; i<7; i++) { if(format & 1) { blacks += 2; v = 0x85; } else { v = 0x84; } frame[width * (width - 7 + i) + 8] = v; if(i == 0) { frame[width * 8 + 7] = v; } else { frame[width * 8 + 6 - i] = v; } format= format >> 1; } return blacks; }
void test_format(void) { unsigned int format; int i, j; int err = 0; testStart("Format info test"); for(i=0; i<4; i++) { for(j=0; j<8; j++) { format = calcFormatInfo(j, (QRecLevel)i); // printf("0x%04x, ", format); if(format != QRspec_getFormatInfo(j, (QRecLevel)i)) { printf("Level %d, mask %x\n", i, j); err++; } } // printf("\n"); } testEnd(err); }
void test_format(void) { unsigned char *frame; unsigned int format; int width; int i; unsigned int decode; int blacks, b1 = 0, b2 = 0; testStart("Test format information(level L,mask 0)"); width = QRspec_getWidth(1); frame = QRspec_newFrame(1); format = QRspec_getFormatInfo(1, QR_ECLEVEL_L); blacks = Mask_writeFormatInformation(width, frame, 1, QR_ECLEVEL_L); decode = 0; for(i=0; i<15; i++) { if((1<<i) & format) b2 += 2; } for(i=0; i<8; i++) { decode = decode << 1; decode |= frame[width * 8 + i + (i > 5)] & 1; if(decode & 1) b1++; } for(i=0; i<7; i++) { decode = decode << 1; decode |= frame[width * ((6 - i) + (i < 1)) + 8] & 1; if(decode & 1) b1++; } if(decode != format) { printf("Upper-left format information is invalid.\n"); printf("%08x, %08x\n", format, decode); testEnd(1); return; } decode = 0; for(i=0; i<7; i++) { decode = decode << 1; decode |= frame[width * (width - 1 - i) + 8] & 1; if(decode & 1) b1++; } for(i=0; i<8; i++) { decode = decode << 1; decode |= frame[width * 8 + width - 8 + i] & 1; if(decode & 1) b1++; } if(decode != format) { printf("Bottom and right format information is invalid.\n"); printf("%08x, %08x\n", format, decode); testEnd(1); return; } if(b2 != blacks || b1 != b2) { printf("Number of dark modules is incorrect.\n"); printf("Return value: %d, dark modules in frame: %d, should be: %d\n", blacks, b1, b2); testEnd(1); return; } free(frame); testEnd(0); }