extern unsigned char *FrameFiller_test(int version) { int width; unsigned char *frame, *p; FrameFiller *filler; int i, length; width = QRspec_getWidth(version); frame = QRspec_newFrame(version); if(frame == NULL) return NULL; filler = FrameFiller_new(width, frame, 0); if(filler == NULL) { free(frame); return NULL; } length = QRspec_getDataLength(version, QR_ECLEVEL_L) * 8 + QRspec_getECCLength(version, QR_ECLEVEL_L) * 8 + QRspec_getRemainder(version); for(i=0; i<length; i++) { p = FrameFiller_next(filler); if(p == NULL) { free(filler); free(frame); return NULL; } *p = (unsigned char)(i & 0x7f) | 0x80; } free(filler); return frame; }
extern unsigned char *FrameFiller_testMQR(int version) { int width; unsigned char *frame, *p; FrameFiller *filler; int i, length; width = MQRspec_getWidth(version); frame = MQRspec_newFrame(version); if(frame == NULL) return NULL; filler = FrameFiller_new(width, frame, 1); if(filler == NULL) { free(frame); return NULL; } length = MQRspec_getDataLengthBit(version, QR_ECLEVEL_L) + MQRspec_getECCLength(version, QR_ECLEVEL_L) * 8; for(i=0; i<length; i++) { p = FrameFiller_next(filler); if(p == NULL) { fprintf(stderr, "Frame filler run over the frame!\n"); free(filler); return frame; } *p = (unsigned char)(i & 0x7f) | 0x80; } free(filler); return frame; }
__STATIC QRcode *QRcode_encodeMaskMQR(QRinput *input, int mask) { int width, version; MQRRawCode *raw; unsigned char *frame, *masked, *p, code, bit; FrameFiller *filler; int i, j; QRcode *qrcode = NULL; if(!input->mqr) { errno = EINVAL; return NULL; } if(input->version <= 0 || input->version > MQRSPEC_VERSION_MAX) { errno = EINVAL; return NULL; } if(input->level > QR_ECLEVEL_Q) { errno = EINVAL; return NULL; } raw = MQRraw_new(input); if(raw == NULL) return NULL; version = raw->version; width = MQRspec_getWidth(version); frame = MQRspec_newFrame(version); if(frame == NULL) { MQRraw_free(raw); return NULL; } filler = FrameFiller_new(width, frame, 1); if(filler == NULL) { MQRraw_free(raw); free(frame); return NULL; } /* inteleaved data and ecc codes */ for(i=0; i<raw->dataLength + raw->eccLength; i++) { code = MQRraw_getCode(raw); if(raw->oddbits && i == raw->dataLength - 1) { bit = 1 << (raw->oddbits - 1); for(j=0; j<raw->oddbits; j++) { p = FrameFiller_next(filler); if(p == NULL) goto EXIT; *p = 0x02 | ((bit & code) != 0); bit = bit >> 1; } } else {
unsigned char *FrameFiller_fillerTest(int version) { int width, length; unsigned char *frame, *p; FrameFiller *filler; int i, j; unsigned char cl = 1; unsigned char ch = 0; width = QRspec_getWidth(version); frame = QRspec_newFrame(version); filler = FrameFiller_new(width, frame); length = QRspec_getDataLength(version, QR_ECLEVEL_L) + QRspec_getECCLength(version, QR_ECLEVEL_L); for(i=0; i<length; i++) { for(j=0; j<8; j++) { p = FrameFiller_next(filler); *p = ch | cl; cl++; if(cl == 9) { cl = 1; ch += 0x10; } } } length = QRspec_getRemainder(version); for(i=0; i<length; i++) { p = FrameFiller_next(filler); *p = 0xa0; } p = FrameFiller_next(filler); free(filler); if(p != NULL) { return NULL; } return frame; }
__STATIC QRcode *QRcode_encodeMask(QRinput *input, int mask) { int width, version; QRRawCode *raw; unsigned char *frame, *masked, *p, code, bit; FrameFiller *filler; int i, j; QRcode *qrcode = NULL; if(input->mqr) { errno = EINVAL; return NULL; } if(input->version < 0 || input->version > QRSPEC_VERSION_MAX) { errno = EINVAL; return NULL; } if(input->level > QR_ECLEVEL_H) { errno = EINVAL; return NULL; } raw = QRraw_new(input); if(raw == NULL) return NULL; version = raw->version; width = QRspec_getWidth(version); frame = QRspec_newFrame(version); if(frame == NULL) { QRraw_free(raw); return NULL; } filler = FrameFiller_new(width, frame, 0); if(filler == NULL) { QRraw_free(raw); free(frame); return NULL; } /* inteleaved data and ecc codes */ for(i=0; i<raw->dataLength + raw->eccLength; i++) { code = QRraw_getCode(raw); bit = 0x80; for(j=0; j<8; j++) { p = FrameFiller_next(filler); if(p == NULL) goto EXIT; *p = 0x02 | ((bit & code) != 0); bit = bit >> 1; } } QRraw_free(raw); raw = NULL; /* remainder bits */ j = QRspec_getRemainder(version); for(i=0; i<j; i++) { p = FrameFiller_next(filler); if(p == NULL) goto EXIT; *p = 0x02; } /* masking */ if(mask == -2) { // just for debug purpose masked = (unsigned char *)malloc(width * width); memcpy(masked, frame, width * width); } else if(mask < 0) { masked = Mask_mask(width, frame, input->level); } else { masked = Mask_makeMask(width, frame, mask, input->level); } if(masked == NULL) { goto EXIT; } qrcode = QRcode_new(version, width, masked); EXIT: QRraw_free(raw); free(filler); free(frame); return qrcode; }