Skip to content

Commit

Permalink
Refactoring of FrameFiller.
Browse files Browse the repository at this point in the history
  • Loading branch information
fukuchi committed Jun 8, 2009
1 parent bb5a1d3 commit 3e7a9b4
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 59 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2009.06.08 Kentaro FUKUCHI <fukuchi@megaui.net>
* qrencode.c:
- FrameFiller_nextMQR() has integrated to FrameFiller_next().
- FrameFiller_new() now requires mqr flag.

2009.06.06 Kentaro FUKUCHI <fukuchi@megaui.net>
* qrenc.c, tests/view_qrcode.c:
- Experimental support of Micro QR Code has been implemented.
Expand Down
71 changes: 12 additions & 59 deletions qrencode.c
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,10 @@ typedef struct {
int x, y;
int dir;
int bit;
int mqr;
} FrameFiller;

static FrameFiller *FrameFiller_new(int width, unsigned char *frame)
static FrameFiller *FrameFiller_new(int width, unsigned char *frame, int mqr)
{
FrameFiller *filler;

Expand All @@ -305,6 +306,7 @@ static FrameFiller *FrameFiller_new(int width, unsigned char *frame)
filler->y = width - 1;
filler->dir = -1;
filler->bit = -1;
filler->mqr = mqr;

return filler;
}
Expand Down Expand Up @@ -338,7 +340,7 @@ static unsigned char *FrameFiller_next(FrameFiller *filler)
y = 0;
x -= 2;
filler->dir = 1;
if(x == 6) {
if(!filler->mqr && x == 6) {
x--;
y = 9;
}
Expand All @@ -348,7 +350,7 @@ static unsigned char *FrameFiller_next(FrameFiller *filler)
y = w - 1;
x -= 2;
filler->dir = -1;
if(x == 6) {
if(!filler->mqr && x == 6) {
x--;
y -= 8;
}
Expand Down Expand Up @@ -377,7 +379,7 @@ extern unsigned char *FrameFiller_test(int version)
width = QRspec_getWidth(version);
frame = QRspec_newFrame(version);
if(frame == NULL) return NULL;
filler = FrameFiller_new(width, frame);
filler = FrameFiller_new(width, frame, 0);
if(filler == NULL) {
free(frame);
return NULL;
Expand All @@ -399,55 +401,6 @@ extern unsigned char *FrameFiller_test(int version)
}
#endif

static unsigned char *FrameFiller_nextMQR(FrameFiller *filler)
{
unsigned char *p;
int x, y, w;

if(filler->bit == -1) {
filler->bit = 0;
return filler->frame + filler->y * filler->width + filler->x;
}

x = filler->x;
y = filler->y;
p = filler->frame;
w = filler->width;

if(filler->bit == 0) {
x--;
filler->bit++;
} else {
x++;
y += filler->dir;
filler->bit--;
}

if(filler->dir < 0) {
if(y < 0) {
y = 0;
x -= 2;
filler->dir = 1;
}
} else {
if(y == w) {
y = w - 1;
x -= 2;
filler->dir = -1;
}
}
if(x < 0 || y < 0) return NULL;

filler->x = x;
filler->y = y;

if(p[y * w + x] & 0x80) {
// This tail recursion could be optimized.
return FrameFiller_nextMQR(filler);
}
return &p[y * w + x];
}

#ifdef __STATIC
extern unsigned char *FrameFiller_testMQR(int version)
{
Expand All @@ -459,15 +412,15 @@ extern unsigned char *FrameFiller_testMQR(int version)
width = MQRspec_getWidth(version);
frame = MQRspec_newFrame(version);
if(frame == NULL) return NULL;
filler = FrameFiller_new(width, frame);
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_nextMQR(filler);
p = FrameFiller_next(filler);
if(p == NULL) {
fprintf(stderr, "Frame filler run over the frame!\n");
free(filler);
Expand Down Expand Up @@ -539,7 +492,7 @@ __STATIC QRcode *QRcode_encodeMask(QRinput *input, int mask)
QRraw_free(raw);
return NULL;
}
filler = FrameFiller_new(width, frame);
filler = FrameFiller_new(width, frame, 0);
if(filler == NULL) {
QRraw_free(raw);
free(frame);
Expand Down Expand Up @@ -617,7 +570,7 @@ __STATIC QRcode *QRcode_encodeMaskMQR(QRinput *input, int mask)
MQRraw_free(raw);
return NULL;
}
filler = FrameFiller_new(width, frame);
filler = FrameFiller_new(width, frame, 1);
if(filler == NULL) {
MQRraw_free(raw);
free(frame);
Expand All @@ -630,15 +583,15 @@ __STATIC QRcode *QRcode_encodeMaskMQR(QRinput *input, int mask)
if(raw->oddbits && i == raw->dataLength - 1) {
bit = 1 << raw->oddbits;
for(j=0; j<raw->oddbits; j++) {
p = FrameFiller_nextMQR(filler);
p = FrameFiller_next(filler);
if(p == NULL) goto EXIT;
*p = 0x02 | ((bit & code) != 0);
bit = bit >> 1;
}
} else {
bit = 0x80;
for(j=0; j<8; j++) {
p = FrameFiller_nextMQR(filler);
p = FrameFiller_next(filler);
if(p == NULL) goto EXIT;
*p = 0x02 | ((bit & code) != 0);
bit = bit >> 1;
Expand Down

0 comments on commit 3e7a9b4

Please sign in to comment.