55 { 0, 0, 0, { 0, 0, 0, 0}},
56 { 21, 26, 0, { 7, 10, 13, 17}},
57 { 25, 44, 7, { 10, 16, 22, 28}},
58 { 29, 70, 7, { 15, 26, 36, 44}},
59 { 33, 100, 7, { 20, 36, 52, 64}},
60 { 37, 134, 7, { 26, 48, 72, 88}},
61 { 41, 172, 7, { 36, 64, 96, 112}},
62 { 45, 196, 0, { 40, 72, 108, 130}},
63 { 49, 242, 0, { 48, 88, 132, 156}},
64 { 53, 292, 0, { 60, 110, 160, 192}},
65 { 57, 346, 0, { 72, 130, 192, 224}},
66 { 61, 404, 0, { 80, 150, 224, 264}},
67 { 65, 466, 0, { 96, 176, 260, 308}},
68 { 69, 532, 0, { 104, 198, 288, 352}},
69 { 73, 581, 3, { 120, 216, 320, 384}},
70 { 77, 655, 3, { 132, 240, 360, 432}},
71 { 81, 733, 3, { 144, 280, 408, 480}},
72 { 85, 815, 3, { 168, 308, 448, 532}},
73 { 89, 901, 3, { 180, 338, 504, 588}},
74 { 93, 991, 3, { 196, 364, 546, 650}},
75 { 97, 1085, 3, { 224, 416, 600, 700}},
76 {101, 1156, 4, { 224, 442, 644, 750}},
77 {105, 1258, 4, { 252, 476, 690, 816}},
78 {109, 1364, 4, { 270, 504, 750, 900}},
79 {113, 1474, 4, { 300, 560, 810, 960}},
80 {117, 1588, 4, { 312, 588, 870, 1050}},
81 {121, 1706, 4, { 336, 644, 952, 1110}},
82 {125, 1828, 4, { 360, 700, 1020, 1200}},
83 {129, 1921, 3, { 390, 728, 1050, 1260}},
84 {133, 2051, 3, { 420, 784, 1140, 1350}},
85 {137, 2185, 3, { 450, 812, 1200, 1440}},
86 {141, 2323, 3, { 480, 868, 1290, 1530}},
87 {145, 2465, 3, { 510, 924, 1350, 1620}},
88 {149, 2611, 3, { 540, 980, 1440, 1710}},
89 {153, 2761, 3, { 570, 1036, 1530, 1800}},
90 {157, 2876, 0, { 570, 1064, 1590, 1890}},
91 {161, 3034, 0, { 600, 1120, 1680, 1980}},
92 {165, 3196, 0, { 630, 1204, 1770, 2100}},
93 {169, 3362, 0, { 660, 1260, 1860, 2220}},
94 {173, 3532, 0, { 720, 1316, 1950, 2310}},
95 {177, 3706, 0, { 750, 1372, 2040, 2430}}
115 if(words >=
size)
return i;
174 words = (1 << bits) - 1;
191 {{ 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}},
192 {{ 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}},
193 {{ 1, 0}, { 1, 0}, { 1, 0}, { 1, 0}},
194 {{ 1, 0}, { 1, 0}, { 2, 0}, { 2, 0}},
195 {{ 1, 0}, { 2, 0}, { 2, 0}, { 4, 0}},
196 {{ 1, 0}, { 2, 0}, { 2, 2}, { 2, 2}},
197 {{ 2, 0}, { 4, 0}, { 4, 0}, { 4, 0}},
198 {{ 2, 0}, { 4, 0}, { 2, 4}, { 4, 1}},
199 {{ 2, 0}, { 2, 2}, { 4, 2}, { 4, 2}},
200 {{ 2, 0}, { 3, 2}, { 4, 4}, { 4, 4}},
201 {{ 2, 2}, { 4, 1}, { 6, 2}, { 6, 2}},
202 {{ 4, 0}, { 1, 4}, { 4, 4}, { 3, 8}},
203 {{ 2, 2}, { 6, 2}, { 4, 6}, { 7, 4}},
204 {{ 4, 0}, { 8, 1}, { 8, 4}, {12, 4}},
205 {{ 3, 1}, { 4, 5}, {11, 5}, {11, 5}},
206 {{ 5, 1}, { 5, 5}, { 5, 7}, {11, 7}},
207 {{ 5, 1}, { 7, 3}, {15, 2}, { 3, 13}},
208 {{ 1, 5}, {10, 1}, { 1, 15}, { 2, 17}},
209 {{ 5, 1}, { 9, 4}, {17, 1}, { 2, 19}},
210 {{ 3, 4}, { 3, 11}, {17, 4}, { 9, 16}},
211 {{ 3, 5}, { 3, 13}, {15, 5}, {15, 10}},
212 {{ 4, 4}, {17, 0}, {17, 6}, {19, 6}},
213 {{ 2, 7}, {17, 0}, { 7, 16}, {34, 0}},
214 {{ 4, 5}, { 4, 14}, {11, 14}, {16, 14}},
215 {{ 6, 4}, { 6, 14}, {11, 16}, {30, 2}},
216 {{ 8, 4}, { 8, 13}, { 7, 22}, {22, 13}},
217 {{10, 2}, {19, 4}, {28, 6}, {33, 4}},
218 {{ 8, 4}, {22, 3}, { 8, 26}, {12, 28}},
219 {{ 3, 10}, { 3, 23}, { 4, 31}, {11, 31}},
220 {{ 7, 7}, {21, 7}, { 1, 37}, {19, 26}},
221 {{ 5, 10}, {19, 10}, {15, 25}, {23, 25}},
222 {{13, 3}, { 2, 29}, {42, 1}, {23, 28}},
223 {{17, 0}, {10, 23}, {10, 35}, {19, 35}},
224 {{17, 1}, {14, 21}, {29, 19}, {11, 46}},
225 {{13, 6}, {14, 23}, {44, 7}, {59, 1}},
226 {{12, 7}, {12, 26}, {39, 14}, {22, 41}},
227 {{ 6, 14}, { 6, 34}, {46, 10}, { 2, 64}},
228 {{17, 4}, {29, 14}, {49, 10}, {24, 46}},
229 {{ 4, 18}, {13, 32}, {48, 14}, {42, 32}},
230 {{20, 4}, {40, 7}, {43, 22}, {10, 67}},
231 {{19, 6}, {18, 31}, {34, 34}, {20, 61}},
248 spec[3] = spec[4] = 0;
251 spec[1] = data / (b1 + b2);
252 spec[2] = ecc / (b1 + b2);
254 spec[4] = spec[1] + 1;
271 { 0, 0}, {18, 0}, {22, 0}, {26, 0}, {30, 0},
272 {34, 0}, {22, 38}, {24, 42}, {26, 46}, {28, 50},
273 {30, 54}, {32, 58}, {34, 62}, {26, 46}, {26, 48},
274 {26, 50}, {30, 54}, {30, 56}, {30, 58}, {34, 62},
275 {28, 50}, {26, 50}, {30, 54}, {28, 54}, {32, 58},
276 {30, 58}, {34, 62}, {26, 50}, {30, 54}, {26, 52},
277 {30, 56}, {34, 60}, {30, 58}, {34, 62}, {30, 54},
278 {24, 50}, {28, 54}, {32, 58}, {26, 54}, {30, 58},
289 static const unsigned char finder[] = {
290 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
291 0xa1, 0xa0, 0xa0, 0xa0, 0xa1,
292 0xa1, 0xa0, 0xa1, 0xa0, 0xa1,
293 0xa1, 0xa0, 0xa0, 0xa0, 0xa1,
294 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
297 const unsigned char *s;
299 frame += (oy - 2) * width + ox - 2;
301 for(y = 0; y < 5; y++) {
302 for(x = 0; x < 5; x++) {
312 int d, w, x, y, cx, cy;
331 for(x = 1; x < w - 1; x++) {
338 for(y = 0; y < w-1; y++) {
340 for(x = 0; x < w-1; x++) {
357 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
358 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
359 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
360 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
377 {0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976},
378 {0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0},
379 {0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed},
380 {0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b}
385 if(mask < 0 || mask > 7)
return 0;
402 static const unsigned char finder[] = {
403 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1,
404 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1,
405 0xc1, 0xc0, 0xc1, 0xc1, 0xc1, 0xc0, 0xc1,
406 0xc1, 0xc0, 0xc1, 0xc1, 0xc1, 0xc0, 0xc1,
407 0xc1, 0xc0, 0xc1, 0xc1, 0xc1, 0xc0, 0xc1,
408 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1,
409 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1,
412 const unsigned char *s;
414 frame += oy * width + ox;
416 for(y = 0; y < 7; y++) {
417 for(x = 0; x < 7; x++) {
428 unsigned char *frame, *p, *q;
431 unsigned int verinfo, v;
434 frame = (
unsigned char *)malloc((
size_t)(width * width));
435 if(frame == NULL)
return NULL;
437 memset(frame, 0, (
size_t)(width * width));
444 q = frame + width * (width - 7);
445 for(y = 0; y < 7; y++) {
452 memset(frame + width * 7, 0xc0, 8);
453 memset(frame + width * 8 - 8, 0xc0, 8);
454 memset(frame + width * (width - 8), 0xc0, 8);
456 memset(frame + width * 8, 0x84, 9);
457 memset(frame + width * 9 - 8, 0x84, 8);
459 for(y = 0; y < 8; y++) {
463 p = frame + width * (width - 7) + 8;
464 for(y = 0; y < 7; y++) {
469 p = frame + width * 6 + 8;
470 q = frame + width * 8 + 6;
471 for(x = 1; x < width-15; x++) {
484 p = frame + width * (width - 11);
486 for(x = 0; x < 6; x++) {
487 for(y = 0; y < 3; y++) {
488 p[width * y + x] = 0x88 | (v & 1);
493 p = frame + width - 11;
495 for(y = 0; y < 6; y++) {
496 for(x = 0; x < 3; x++) {
497 p[x] = 0x88 | (v & 1);
504 frame[width * (width - 8) + 8] = 0x81;
QRecLevel
Level of error correction.
QRencodeMode
Encoding mode.
@ QR_MODE_KANJI
Kanji (shift-jis) mode.
#define QRSPEC_VERSION_MAX
Maximum version (size) of QR-code symbol.
static unsigned char * QRspec_createFrame(int version)
static void QRspec_putAlignmentMarker(unsigned char *frame, int width, int ox, int oy)
Put an alignment marker.
static const int eccTable[40+1][4][2]
Error correction code.
int QRspec_getRemainder(int version)
Return the numer of remainder bits.
unsigned char * QRspec_newFrame(int version)
Frame.
int QRspec_getMinimumVersion(int size, QRecLevel level)
Return a version number that satisfies the input code length.
static const int alignmentPattern[40+1][2]
Alignment pattern.
int QRspec_getWidth(int version)
Return the width of the symbol for the version.
static const QRspec_Capacity qrspecCapacity[40+1]
Table of the capacity of symbols See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
unsigned int QRspec_getVersionPattern(int version)
Version information pattern.
static void QRspec_putAlignmentPattern(int version, unsigned char *frame, int width)
int QRspec_getECCLength(int version, QRecLevel level)
Return maximum error correction code length (bytes) for the version.
static void putFinderPattern(unsigned char *frame, int width, int ox, int oy)
Frame.
int QRspec_maximumWords(QRencodeMode mode, int version)
Return the maximum length for the mode and version.
static const unsigned int formatInfo[4][8]
Format information.
static const int lengthTableBits[4][3]
Length indicator.
unsigned int QRspec_getFormatInfo(int mask, QRecLevel level)
Format information.
static const unsigned int versionPattern[40 - 6]
Version information pattern.
int QRspec_lengthIndicator(QRencodeMode mode, int version)
Length indicator.
void QRspec_getEccSpec(int version, QRecLevel level, int spec[5])
Error correction code.
int QRspec_getDataLength(int version, QRecLevel level)
Return maximum data code length (bytes) for the version.