Image-PNG-QRCode
view release on metacpan or search on metacpan
#define QR_MINIMUM_VERSION 1
#define QR_MAXIMUM_VERSION 40
#define QR_MINIMUM_LEVEL 1
#define QR_MAXIMUM_LEVEL 4
#endif /* def HEADER */
#define SETQRBIT(f,x,y) qr->f[((x)>>3) + (y) * qr->WDB] |= 0x80 >> ((x) & 7)
#define TOGQRBIT(f,x,y) qr->f[((x)>>3) + (y) * qr->WDB] ^= 0x80 >> ((x) & 7)
static void setmask(qr_t * qr, unsigned char x, unsigned char y)
{
unsigned bt;
if (x > y) {
bt = x;
x = y;
y = bt;
}
// y*y = 1+3+5...
bt = y;
bt *= y;
i = (qr->WD - 7);
SETQRBIT(framebase,i + 3, k + 3);
/* Outer black rectangle */
for (j = 0; j < 6; j++) {
SETQRBIT(framebase,i + j, k);
SETQRBIT(framebase,i, k + j + 1);
SETQRBIT(framebase,i + 6, k + j);
SETQRBIT(framebase,i + j + 1, k + 6);
}
for (j = 1; j < 5; j++) {
setmask(qr, i + j, k + 1);
setmask(qr, i + 1, k + j + 1);
setmask(qr, i + 5, k + j);
setmask(qr, i + j + 1, k + 5);
}
for (j = 2; j < 4; j++) {
SETQRBIT(framebase,i + j, k + 2);
SETQRBIT(framebase,i + 2, k + j + 1);
SETQRBIT(framebase,i + 4, k + j);
SETQRBIT(framebase,i + j + 1, k + 4);
}
}
}
int j;
SETQRBIT(framebase,x, y);
for (j = -2; j < 2; j++) {
SETQRBIT(framebase,x + j, y - 2);
SETQRBIT(framebase,x - 2, y + j + 1);
SETQRBIT(framebase,x + 2, y + j);
SETQRBIT(framebase,x + j + 1, y + 2);
}
for (j = 0; j < 2; j++) {
setmask(qr, x - 1, y + j);
setmask(qr, x + 1, y - j);
setmask(qr, x - j, y - 1);
setmask(qr, x + j, y + 1);
}
}
static const unsigned char adelta[41] = {
0, 11, 15, 19, 23, 27, 31, // force 1 pat
16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28,
};
static void doaligns(qr_t * qr)
verinfo = vpat[vers - 7];
bc = 17;
for (x = 0; x < 6; x++) {
for (y = 0; y < 3; y++, bc--) {
if (1 & (bc > 11 ? vers >> (bc - 12) : verinfo >> bc)) {
SETQRBIT(framebase,5 - x, 2 - y + qr->WD - 11);
SETQRBIT(framebase,2 - y + qr->WD - 11, 5 - x);
}
else {
setmask(qr, 5 - x, 2 - y + qr->WD - 11);
setmask(qr, 2 - y + qr->WD - 11, 5 - x);
}
}
}
}
void initframe(qr_t * qr)
{
unsigned x, y;
qr->framebase = calloc(qr->WDB * qr->WD, 1);
qr->framask = calloc(((qr->WD * (qr->WD + 1) / 2) + 7) / 8, 1);
qr->rlens = malloc(qr->WD + 1);
// finders
putfind(qr);
// alignment blocks
doaligns(qr);
// single black
SETQRBIT(framebase,8, qr->WD - 8);
// timing gap - masks only
for (y = 0; y < 7; y++) {
setmask(qr, 7, y);
setmask(qr, qr->WD - 8, y);
setmask(qr, 7, y + qr->WD - 7);
}
for (x = 0; x < 8; x++) {
setmask(qr, x, 7);
setmask(qr, x + qr->WD - 8, 7);
setmask(qr, x, qr->WD - 8);
}
// reserve mask-format area
for (x = 0; x < 9; x++)
setmask(qr,x, 8);
for (x = 0; x < 8; x++) {
setmask(qr,x + qr->WD - 8, 8);
setmask(qr,8, x);
}
for (y = 0; y < 7; y++)
setmask(qr,8, y + qr->WD - 7);
// timing
for (x = 0; x < qr->WD - 14; x++) {
if (x & 1) {
setmask(qr,8 + x, 6);
setmask(qr,6, 8 + x);
}
else {
SETQRBIT(framebase,8 + x, 6);
SETQRBIT(framebase,6, 8 + x);
}
}
// version block
putvpat(qr);
for (y = 0; y < qr->WD; y++) {
for (x = 0; x <= y; x++) {
if (QRBIT(framebase,x, y)) {
setmask(qr,x, y);
}
}
}
}
static void freeframe(qr_t * qr)
{
free( qr->framebase );
free( qr->framask );
free( qr->rlens );
( run in 0.526 second using v1.01-cache-2.11-cpan-cc502c75498 )