2 * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
3 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include "apr_strings.h"
21 #include "http_protocol.h"
24 #include "chxj_str_util.h"
25 #include "chxj_qr_code.h"
26 #include "chxj_calc_ecc.h"
28 #include "chxj_specified_device.h"
29 #include "qs_malloc.h"
31 #include "qs_parse_file.h"
33 #include <wand/magick_wand.h>
38 #define EXIT_MAGICK_ERROR() \
41 ExceptionType severity; \
42 description=MagickGetException(magick_wand,&severity); \
43 ap_log_rerror(APLOG_MARK,APLOG_DEBUG, 0, r,"%s %s %d %s\n",__FILE__,(__func__),__LINE__,description); \
44 description=(char *) MagickRelinquishMemory(description); \
45 DestroyMagickWand(magick_wand); \
48 /*----------------------------------------------------------------------------*/
49 /* ¥â¡¼¥É»Ø¼¨»Ò¥Æ¡¼¥Ö¥ë */
50 /*----------------------------------------------------------------------------*/
51 static char* v_mode_table[] = {
54 /* 8¥Ó¥Ã¥È¥Ð¥¤¥È */ "0100",
59 /* ¹½Â¤ÅªÏ¢ÀÜ */ "0011",
60 /* ½ªÃ¼¥Ñ¥¿¡¼¥ó */ "0000",
70 /*----------------------------------------------------------------------------*/
71 /* ʸ»ú¿ô»Ø¼¨»Ò¤Î¥Ó¥Ã¥È¿ô */
72 /*----------------------------------------------------------------------------*/
73 static char v_char_count_table[][4] = {
74 /* ¥Ð¡¼¥¸¥ç¥ó *//* ʸ»ú¿ô»Ø¼¨»Ò¤Î¥Ó¥Ã¥È¿ô */
75 /* 1 */ { 10, 9, 8, 8, },
76 /* 2 */ { 10, 9, 8, 8, },
77 /* 3 */ { 10, 9, 8, 8, },
78 /* 4 */ { 10, 9, 8, 8, },
79 /* 5 */ { 10, 9, 8, 8, },
80 /* 6 */ { 10, 9, 8, 8, },
81 /* 7 */ { 10, 9, 8, 8, },
82 /* 8 */ { 10, 9, 8, 8, },
83 /* 9 */ { 10, 9, 8, 8, },
84 /* 10 */ { 12,11,16,10, },
85 /* 11 */ { 12,11,16,10, },
86 /* 12 */ { 12,11,16,10, },
87 /* 13 */ { 12,11,16,10, },
88 /* 14 */ { 12,11,16,10, },
89 /* 15 */ { 12,11,16,10, },
90 /* 16 */ { 12,11,16,10, },
91 /* 17 */ { 12,11,16,10, },
92 /* 18 */ { 12,11,16,10, },
93 /* 19 */ { 12,11,16,10, },
94 /* 20 */ { 12,11,16,10, },
95 /* 21 */ { 12,11,16,10, },
96 /* 22 */ { 12,11,16,10, },
97 /* 23 */ { 12,11,16,10, },
98 /* 24 */ { 12,11,16,10, },
99 /* 25 */ { 12,11,16,10, },
100 /* 26 */ { 12,11,16,10, },
101 /* 27 */ { 14,13,16,12, },
102 /* 28 */ { 14,13,16,12, },
103 /* 29 */ { 14,13,16,12, },
104 /* 30 */ { 14,13,16,12, },
105 /* 31 */ { 14,13,16,12, },
106 /* 32 */ { 14,13,16,12, },
107 /* 33 */ { 14,13,16,12, },
108 /* 34 */ { 14,13,16,12, },
109 /* 35 */ { 14,13,16,12, },
110 /* 36 */ { 14,13,16,12, },
111 /* 37 */ { 14,13,16,12, },
112 /* 38 */ { 14,13,16,12, },
113 /* 39 */ { 14,13,16,12, },
114 /* 40 */ { 14,13,16,12, },
116 static int v_data_code_count[][4] = {
117 /* ¥Ð¡¼¥¸¥ç¥ó *//* ¥Ç¡¼¥¿¥³¡¼¥É¿ô */
119 /* 1 */ {19, 16, 13, 9,},
120 /* 2 */ {34, 28, 22, 16,},
121 /* 3 */ {55, 44, 34, 26,},
122 /* 4 */ {80, 64, 48, 36,},
123 /* 5 */ {108, 86, 62, 46,},
124 /* 6 */ {136, 108, 76, 60,},
125 /* 7 */ {156, 124, 88, 66,},
126 /* 8 */ {194, 154, 110, 86,},
127 /* 9 */ {232, 182, 132, 100,},
128 /* 10 */ {274, 216, 154, 122,},
129 /* 11 */ {324, 254, 180, 140,},
130 /* 12 */ {370, 290, 206, 158,},
131 /* 13 */ {428, 334, 244, 180,},
132 /* 14 */ {461, 365, 261, 197,},
133 /* 15 */ {523, 415, 295, 223,},
134 /* 16 */ {589, 453, 325, 253,},
135 /* 17 */ {647, 507, 367, 283,},
136 /* 18 */ {721, 563, 397, 313,},
137 /* 19 */ {795, 627, 445, 341,},
138 /* 20 */ {861, 669, 485, 385,},
139 /* 21 */ {932, 714, 512, 406,},
140 /* 22 */ {1006,782, 568, 442,},
141 /* 23 */ {1094,860, 614, 464,},
142 /* 24 */ {1174,914, 664, 514,},
143 /* 25 */ {1276,1000,718, 538,},
144 /* 26 */ {1370,1062,754, 596,},
145 /* 27 */ {1468,1128,808, 628,},
146 /* 28 */ {1531,1193,871, 661,},
147 /* 29 */ {1631,1267,911, 701,},
148 /* 30 */ {1735,1373,985, 745,},
149 /* 31 */ {1843,1455,1033,793,},
150 /* 32 */ {1955,1541,1115,845,},
151 /* 33 */ {2071,1631,1171,901,},
152 /* 34 */ {2191,1725,1231,961,},
153 /* 35 */ {2306,1812,1286,986,},
154 /* 36 */ {2434,1914,1354,1054,},
155 /* 37 */ {2566,1992,1426,1096,},
156 /* 38 */ {2702,2102,1502,1142,},
157 /* 39 */ {2812,2216,1582,1222,},
158 /* 40 */ {2956,2334,1666,1276,},
161 /*----------------------------------------------------------------------------*/
162 /* ¤¢¤Þ¤Ã¤¿¾ì¹ç¤ÎÉÕ²Ã¥Ó¥Ã¥È */
163 /*----------------------------------------------------------------------------*/
164 static char* v_pend_bit[] = {
169 /*----------------------------------------------------------------------------*/
171 /*----------------------------------------------------------------------------*/
172 static int v_module_count_table[] = {
173 21, 25, 29, 33, 37, 41, 45, 49,
174 53, 57, 61, 65, 69, 73, 77, 81,
175 85, 89, 93, 97, 101, 105, 109, 113,
176 117, 121, 125, 129, 133, 137, 141, 145,
177 149, 153, 157, 161, 165, 169, 173, 177,
179 /*----------------------------------------------------------------------------*/
180 /* °ÌÃÖ¤¢¤ï¤»¥Ñ¥¿¡¼¥ó¤Î°ÌÃÖ */
181 /*----------------------------------------------------------------------------*/
182 typedef struct _qr_position_pattern_t {
185 } qr_position_pattern_t;
187 static qr_position_pattern_t v_position_adjust_table[] = {
188 { 0, {0,0,0,0,0,0,0,},},
189 { 1, {6,18,0,0,0,0,0,},},
190 { 1, {6,22,0,0,0,0,0,},},
191 { 1, {6,26,0,0,0,0,0,},},
192 { 1, {6,30,0,0,0,0,0,},},
193 { 1, {6,34,0,0,0,0,0,},},
194 { 6, {6,22,38,0,0,0,0,},},
195 { 6, {6,24,42,0,0,0,0,},},
196 { 6, {6,26,46,0,0,0,0,},},
197 { 6, {6,28,50,0,0,0,0,},},
198 { 6, {6,30,54,0,0,0,0,},},
199 { 6, {6,32,58,0,0,0,0,},},
200 { 6, {6,34,62,0,0,0,0,},},
201 {13, {6,26,46,66,0,0,0,},},
202 {13, {6,26,48,70,0,0,0,},},
203 {13, {6,26,50,74,0,0,0,},},
204 {13, {6,30,54,78,0,0,0,},},
205 {13, {6,30,56,82,0,0,0,},},
206 {13, {6,30,58,86,0,0,0,},},
207 {13, {6,34,62,90,0,0,0,},},
208 {22, {6,28,50,72,94,0,0,},},
209 {22, {6,26,50,74,98,0,0,},},
210 {22, {6,30,54,78,102,0,0,},},
211 {22, {6,28,54,80,106,0,0,},},
212 {22, {6,32,58,84,110,0,0,},},
213 {22, {6,30,58,86,114,0,0,},},
214 {22, {6,34,62,90,118,0,0,},},
215 {33, {6,26,50,74,98,122,0,},},
216 {33, {6,30,54,78,102,126,0,},},
217 {33, {6,26,52,78,104,130,0,},},
218 {33, {6,30,56,82,108,134,0,},},
219 {33, {6,34,60,86,112,138,0,},},
220 {33, {6,30,58,86,114,142,0,},},
221 {33, {6,34,62,90,118,146,0,},},
222 {46, {6,30,54,78,102,126,150,},},
223 {46, {6,24,50,76,102,128,154,},},
224 {46, {6,28,54,80,106,132,158,},},
225 {46, {6,32,58,84,110,136,162,},},
226 {46, {6,26,54,82,110,138,166,},},
227 {46, {6,30,58,86,114,142,170,},},
230 /*----------------------------------------------------------------------------*/
232 /*----------------------------------------------------------------------------*/
233 typedef enum _qr_mask_pattern_t {
245 /*----------------------------------------------------------------------------*/
247 /*----------------------------------------------------------------------------*/
248 static unsigned char v_white_base_pic[] = {
249 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
250 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
251 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
252 0x08, 0x02, 0x00, 0x00, 0x00, 0x6f, 0x15, 0xaa,
253 0xaf, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59,
254 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b,
255 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00,
256 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd5,
257 0x04, 0x04, 0x17, 0x13, 0x07, 0x12, 0x27, 0x77,
258 0x6f, 0x00, 0x00, 0x00, 0x22, 0x49, 0x44, 0x41,
259 0x54, 0x78, 0x9c, 0x63, 0xfc, 0xff, 0xff, 0x3f,
260 0x03, 0x35, 0x00, 0x13, 0x55, 0x4c, 0x19, 0x35,
261 0x68, 0xd4, 0xa0, 0x51, 0x83, 0x46, 0x0d, 0x1a,
262 0x35, 0x68, 0xd4, 0x20, 0x8a, 0x00, 0x00, 0x19,
263 0xd1, 0x03, 0x2d, 0xc6, 0xa1, 0x61, 0x7f, 0x00,
264 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
265 0x42, 0x60, 0x82, 0x0a
267 /*----------------------------------------------------------------------------*/
269 /*----------------------------------------------------------------------------*/
270 static unsigned char v_black_pixel_pic[] = {
271 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
272 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
273 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
274 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x15, 0xc4,
275 0x89, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
276 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
277 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00,
278 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00,
279 0x00, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00,
280 0x7a, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00,
281 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
282 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00,
283 0x3a, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9c, 0xba,
284 0x51, 0x3c, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x44,
285 0x41, 0x54, 0x18, 0x57, 0x63, 0x60, 0x60, 0x60,
286 0xf8, 0x0f, 0x00, 0x01, 0x04, 0x01, 0x00, 0x70,
287 0x20, 0x65, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x49,
288 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
290 /*----------------------------------------------------------------------------*/
292 /*----------------------------------------------------------------------------*/
293 typedef struct _qr_version_info_t {
298 static qr_version_info_t v_version_info_table[] = {
305 {QR_VER_7, "000111110010010100",},
306 {QR_VER_8, "001000010110111100",},
307 {QR_VER_9, "001001101010011001",},
308 {QR_VER_10,"001010010011010011",},
309 {QR_VER_11,"001011101111110110",},
310 {QR_VER_12,"001100011101100010",},
311 {QR_VER_13,"001101100001000111",},
312 {QR_VER_14,"001110011000001101",},
313 {QR_VER_15,"001111100100101000",},
314 {QR_VER_16,"010000101101111000",},
315 {QR_VER_17,"010001010001011101",},
316 {QR_VER_18,"010010101000010111",},
317 {QR_VER_19,"010011010100110010",},
318 {QR_VER_20,"010100100110100110",},
319 {QR_VER_21,"010101011010000011",},
320 {QR_VER_22,"010110100011001001",},
321 {QR_VER_23,"010111011111101100",},
322 {QR_VER_24,"011000111011000100",},
323 {QR_VER_25,"011001000111100001",},
324 {QR_VER_26,"011010111110101011",},
325 {QR_VER_27,"011011000010001110",},
326 {QR_VER_28,"011100110000011010",},
327 {QR_VER_29,"011101001100111111",},
328 {QR_VER_30,"011110110101110101",},
329 {QR_VER_31,"011111001001010000",},
330 {QR_VER_32,"100000100111010101",},
331 {QR_VER_33,"100001011011110000",},
332 {QR_VER_34,"100010100010111010",},
333 {QR_VER_35,"100011011110011111",},
334 {QR_VER_36,"100100101100001011",},
335 {QR_VER_37,"100101010000101110",},
336 {QR_VER_38,"100110101001100100",},
337 {QR_VER_39,"100111010101000001",},
338 {QR_VER_40,"101000110001101001",},
342 * ¥Ç¡¼¥¿ÍÆÎ̤Υơ¼¥Ö¥ë
344 /*----------------------------------------------------------------------------*/
345 /* ¥Ð¡¼¥¸¥ç¥óÊÌ¡¢¥ì¥Ù¥ëÊÌ¡¢¥â¡¼¥ÉÊ̥ǡ¼¥¿ÍÆÎÌ */
346 /*----------------------------------------------------------------------------*/
347 typedef struct _qr_capacity_t {
348 qr_ver_t version; /* ¾éĹ¾ðÊó */
349 qr_level_t level; /* ¾éĹ¾ðÊó */
353 static qr_capacity_t v_capacity_table[] = {
354 {QR_VER_1, QR_LEVEL_L, { 41, 25, 17, 10, },},
355 {QR_VER_1, QR_LEVEL_M, { 34, 20, 14, 8, },},
356 {QR_VER_1, QR_LEVEL_Q, { 27, 16, 11, 7, },},
357 {QR_VER_1, QR_LEVEL_H, { 17, 10, 7, 4, },},
359 {QR_VER_2, QR_LEVEL_L, { 77, 47, 32, 20, },},
360 {QR_VER_2, QR_LEVEL_M, { 63, 38, 26, 16, },},
361 {QR_VER_2, QR_LEVEL_Q, { 48, 29, 20, 12, },},
362 {QR_VER_2, QR_LEVEL_H, { 34, 20, 14, 8, },},
364 {QR_VER_3, QR_LEVEL_L, { 127, 77, 53, 32, },},
365 {QR_VER_3, QR_LEVEL_M, { 101, 61, 42, 26, },},
366 {QR_VER_3, QR_LEVEL_Q, { 77, 47, 32, 20, },},
367 {QR_VER_3, QR_LEVEL_H, { 58, 35, 24, 15, },},
369 {QR_VER_4, QR_LEVEL_L, { 187, 114, 78, 48, },},
370 {QR_VER_4, QR_LEVEL_M, { 149, 90, 62, 38, },},
371 {QR_VER_4, QR_LEVEL_Q, { 111, 67, 46, 28, },},
372 {QR_VER_4, QR_LEVEL_H, { 82, 50, 34, 21, },},
374 {QR_VER_5, QR_LEVEL_L, { 255, 154, 106, 65, },},
375 {QR_VER_5, QR_LEVEL_M, { 202, 122, 84, 52, },},
376 {QR_VER_5, QR_LEVEL_Q, { 144, 87, 60, 37, },},
377 {QR_VER_5, QR_LEVEL_H, { 106, 64, 44, 27, },},
379 {QR_VER_6, QR_LEVEL_L, { 322, 195, 134, 82, },},
380 {QR_VER_6, QR_LEVEL_M, { 255, 154, 106, 65, },},
381 {QR_VER_6, QR_LEVEL_Q, { 178, 108, 74, 45, },},
382 {QR_VER_6, QR_LEVEL_H, { 139, 84, 58, 36, },},
384 {QR_VER_7, QR_LEVEL_L, { 370, 224, 154, 95, },},
385 {QR_VER_7, QR_LEVEL_M, { 293, 178, 122, 75, },},
386 {QR_VER_7, QR_LEVEL_Q, { 207, 125, 86, 53, },},
387 {QR_VER_7, QR_LEVEL_H, { 154, 93, 64, 39, },},
389 {QR_VER_8, QR_LEVEL_L, { 461, 279, 192, 118, },},
390 {QR_VER_8, QR_LEVEL_M, { 365, 221, 152, 93, },},
391 {QR_VER_8, QR_LEVEL_Q, { 259, 157, 108, 66, },},
392 {QR_VER_8, QR_LEVEL_H, { 202, 122, 84, 52, },},
394 {QR_VER_9, QR_LEVEL_L, { 552, 335, 230, 141, },},
395 {QR_VER_9, QR_LEVEL_M, { 432, 262, 180, 111, },},
396 {QR_VER_9, QR_LEVEL_Q, { 312, 189, 130, 80, },},
397 {QR_VER_9, QR_LEVEL_H, { 235, 143, 98, 60, },},
399 {QR_VER_10, QR_LEVEL_L, { 652, 395, 271, 167, },},
400 {QR_VER_10, QR_LEVEL_M, { 513, 311, 213, 131, },},
401 {QR_VER_10, QR_LEVEL_Q, { 364, 221, 151, 93, },},
402 {QR_VER_10, QR_LEVEL_H, { 288, 174, 119, 74, },},
404 {QR_VER_11, QR_LEVEL_L, { 772, 468, 321, 198, },},
405 {QR_VER_11, QR_LEVEL_M, { 604, 366, 251, 155, },},
406 {QR_VER_11, QR_LEVEL_Q, { 427, 259, 177, 109, },},
407 {QR_VER_11, QR_LEVEL_H, { 331, 200, 137, 85, },},
409 {QR_VER_12, QR_LEVEL_L, { 883, 535, 367, 226, },},
410 {QR_VER_12, QR_LEVEL_M, { 691, 419, 287, 177, },},
411 {QR_VER_12, QR_LEVEL_Q, { 489, 296, 203, 125, },},
412 {QR_VER_12, QR_LEVEL_H, { 374, 227, 155, 96, },},
414 {QR_VER_13, QR_LEVEL_L, {1022, 619, 425, 262, },},
415 {QR_VER_13, QR_LEVEL_M, { 796, 483, 331, 204, },},
416 {QR_VER_13, QR_LEVEL_Q, { 580, 352, 241, 149, },},
417 {QR_VER_13, QR_LEVEL_H, { 427, 259, 177, 109, },},
419 {QR_VER_14, QR_LEVEL_L, {1101, 667, 458, 282, },},
420 {QR_VER_14, QR_LEVEL_M, { 871, 528, 362, 223, },},
421 {QR_VER_14, QR_LEVEL_Q, { 621, 376, 258, 159, },},
422 {QR_VER_14, QR_LEVEL_H, { 468, 283, 194, 120, },},
424 {QR_VER_15, QR_LEVEL_L, {1250, 758, 520, 320, },},
425 {QR_VER_15, QR_LEVEL_M, { 991, 600, 412, 254, },},
426 {QR_VER_15, QR_LEVEL_Q, { 703, 426, 292, 180, },},
427 {QR_VER_15, QR_LEVEL_H, { 530, 321, 220, 136, },},
429 {QR_VER_16, QR_LEVEL_L, {1408, 854, 586, 361, },},
430 {QR_VER_16, QR_LEVEL_M, {1082, 656, 450, 277, },},
431 {QR_VER_16, QR_LEVEL_Q, { 775, 470, 322, 198, },},
432 {QR_VER_16, QR_LEVEL_H, { 602, 365, 250, 154, },},
434 {QR_VER_17, QR_LEVEL_L, {1548, 938, 644, 397, },},
435 {QR_VER_17, QR_LEVEL_M, {1212, 734, 504, 310, },},
436 {QR_VER_17, QR_LEVEL_Q, { 876, 531, 364, 224, },},
437 {QR_VER_17, QR_LEVEL_H, { 674, 408, 280, 173, },},
439 {QR_VER_18, QR_LEVEL_L, {1725,1046, 718, 442, },},
440 {QR_VER_18, QR_LEVEL_M, {1346, 816, 560, 345, },},
441 {QR_VER_18, QR_LEVEL_Q, { 948, 574, 394, 243, },},
442 {QR_VER_18, QR_LEVEL_H, { 746, 452, 310, 191, },},
444 {QR_VER_19, QR_LEVEL_L, {1903,1153, 792, 488, },},
445 {QR_VER_19, QR_LEVEL_M, {1500, 909, 624, 384, },},
446 {QR_VER_19, QR_LEVEL_Q, {1063, 644, 442, 272, },},
447 {QR_VER_19, QR_LEVEL_H, { 813, 493, 338, 208, },},
449 {QR_VER_20, QR_LEVEL_L, {2061,1249, 858, 528, },},
450 {QR_VER_20, QR_LEVEL_M, {1600, 970, 666, 410, },},
451 {QR_VER_20, QR_LEVEL_Q, {1159, 702, 482, 297, },},
452 {QR_VER_20, QR_LEVEL_H, { 919, 557, 382, 235, },},
454 {QR_VER_21, QR_LEVEL_L, {2232,1352, 929, 572, },},
455 {QR_VER_21, QR_LEVEL_M, {1708,1035, 711, 438, },},
456 {QR_VER_21, QR_LEVEL_Q, {1224, 742, 509, 314, },},
457 {QR_VER_21, QR_LEVEL_H, { 969, 587, 403, 248, },},
459 {QR_VER_22, QR_LEVEL_L, {2409,1460,1003, 618, },},
460 {QR_VER_22, QR_LEVEL_M, {1872,1134, 779, 480, },},
461 {QR_VER_22, QR_LEVEL_Q, {1358, 823, 565, 348, },},
462 {QR_VER_22, QR_LEVEL_H, {1056, 640, 439, 270, },},
464 {QR_VER_23, QR_LEVEL_L, {2620,1588,1091, 672, },},
465 {QR_VER_23, QR_LEVEL_M, {2059,1248, 857, 528, },},
466 {QR_VER_23, QR_LEVEL_Q, {1468, 890, 611, 376, },},
467 {QR_VER_23, QR_LEVEL_H, {1108, 672, 461, 284, },},
469 {QR_VER_24, QR_LEVEL_L, {2812,1704,1171, 721, },},
470 {QR_VER_24, QR_LEVEL_M, {2188,1326, 911, 561, },},
471 {QR_VER_24, QR_LEVEL_Q, {1588, 963, 661, 407, },},
472 {QR_VER_24, QR_LEVEL_H, {1228, 744, 511, 315, },},
474 {QR_VER_25, QR_LEVEL_L, {3057,1853,1273, 784, },},
475 {QR_VER_25, QR_LEVEL_M, {2395,1451, 997, 614, },},
476 {QR_VER_25, QR_LEVEL_Q, {1718,1041, 715, 440, },},
477 {QR_VER_25, QR_LEVEL_H, {1286, 779, 535, 330, },},
479 {QR_VER_26, QR_LEVEL_L, {3283,1990,1367, 842, },},
480 {QR_VER_26, QR_LEVEL_M, {2544,1542,1059, 652, },},
481 {QR_VER_26, QR_LEVEL_Q, {1804,1094, 751, 462, },},
482 {QR_VER_26, QR_LEVEL_H, {1425, 864, 593, 365, },},
484 {QR_VER_27, QR_LEVEL_L, {3517,2132,1465, 902, },},
485 {QR_VER_27, QR_LEVEL_M, {2701,1637,1125, 692, },},
486 {QR_VER_27, QR_LEVEL_Q, {1933,1172, 805, 496, },},
487 {QR_VER_27, QR_LEVEL_H, {1501, 910, 625, 385, },},
489 {QR_VER_28, QR_LEVEL_L, {3669,2223,1528, 940, },},
490 {QR_VER_28, QR_LEVEL_M, {2857,1732,1190, 732, },},
491 {QR_VER_28, QR_LEVEL_Q, {2085,1263, 868, 534, },},
492 {QR_VER_28, QR_LEVEL_H, {1581, 958, 658, 405, },},
494 {QR_VER_29, QR_LEVEL_L, {3909,2369,1628,1002, },},
495 {QR_VER_29, QR_LEVEL_M, {3035,1839,1264, 778, },},
496 {QR_VER_29, QR_LEVEL_Q, {2181,1322, 908, 559, },},
497 {QR_VER_29, QR_LEVEL_H, {1677,1016, 698, 430, },},
499 {QR_VER_30, QR_LEVEL_L, {4158,2520,1732,1066, },},
500 {QR_VER_30, QR_LEVEL_M, {3289,1994,1370, 843, },},
501 {QR_VER_30, QR_LEVEL_Q, {2358,1429, 982, 604, },},
502 {QR_VER_30, QR_LEVEL_H, {1782,1080, 742, 457, },},
504 {QR_VER_31, QR_LEVEL_L, {4417,2677,1840,1132, },},
505 {QR_VER_31, QR_LEVEL_M, {3486,2113,1452, 894, },},
506 {QR_VER_31, QR_LEVEL_Q, {2473,1499,1030, 634, },},
507 {QR_VER_31, QR_LEVEL_H, {1897,1150, 790, 486, },},
509 {QR_VER_32, QR_LEVEL_L, {4686,2840,1952,1201, },},
510 {QR_VER_32, QR_LEVEL_M, {3693,2238,1538, 947, },},
511 {QR_VER_32, QR_LEVEL_Q, {2670,1618,1112, 684, },},
512 {QR_VER_32, QR_LEVEL_H, {2022,1226, 842, 518, },},
514 {QR_VER_33, QR_LEVEL_L, {4965,3009,2068,1273, },},
515 {QR_VER_33, QR_LEVEL_M, {3909,2369,1628,1002, },},
516 {QR_VER_33, QR_LEVEL_Q, {2805,1700,1168, 719, },},
517 {QR_VER_33, QR_LEVEL_H, {2157,1307, 898, 553, },},
519 {QR_VER_34, QR_LEVEL_L, {5253,3183,2188,1347, },},
520 {QR_VER_34, QR_LEVEL_M, {4134,2506,1722,1060, },},
521 {QR_VER_34, QR_LEVEL_Q, {2949,1787,1228, 756, },},
522 {QR_VER_34, QR_LEVEL_H, {2301,1394, 958, 590, },},
524 {QR_VER_35, QR_LEVEL_L, {5529,3351,2303,1417, },},
525 {QR_VER_35, QR_LEVEL_M, {4343,2632,1809,1113, },},
526 {QR_VER_35, QR_LEVEL_Q, {3081,1867,1283, 790, },},
527 {QR_VER_35, QR_LEVEL_H, {2361,1431, 983, 605, },},
529 {QR_VER_36, QR_LEVEL_L, {5836,3537,2431,1496, },},
530 {QR_VER_36, QR_LEVEL_M, {4588,2780,1911,1176, },},
531 {QR_VER_36, QR_LEVEL_Q, {3244,1966,1351, 832, },},
532 {QR_VER_36, QR_LEVEL_H, {2524,1530,1051, 647, },},
534 {QR_VER_37, QR_LEVEL_L, {6153,3729,2563,1577, },},
535 {QR_VER_37, QR_LEVEL_M, {4775,2894,1989,1224, },},
536 {QR_VER_37, QR_LEVEL_Q, {3417,2071,1423, 876, },},
537 {QR_VER_37, QR_LEVEL_H, {2625,1591,1093, 673, },},
539 {QR_VER_38, QR_LEVEL_L, {6479,3927,2699,1661, },},
540 {QR_VER_38, QR_LEVEL_M, {5039,3054,2099,1292, },},
541 {QR_VER_38, QR_LEVEL_Q, {3599,2181,1499, 923, },},
542 {QR_VER_38, QR_LEVEL_H, {2735,1658,1139, 701, },},
544 {QR_VER_39, QR_LEVEL_L, {6743,4087,2809,1729, },},
545 {QR_VER_39, QR_LEVEL_M, {5313,3220,2213,1362, },},
546 {QR_VER_39, QR_LEVEL_Q, {3791,2298,1579, 972, },},
547 {QR_VER_39, QR_LEVEL_H, {2927,1774,1219, 750, },},
549 {QR_VER_40, QR_LEVEL_L, {7089,4296,2953,1817, },},
550 {QR_VER_40, QR_LEVEL_M, {5596,3391,2331,1435, },},
551 {QR_VER_40, QR_LEVEL_Q, {3993,2420,1663,1024, },},
552 {QR_VER_40, QR_LEVEL_H, {3057,1852,1273, 784, },},
556 static char* s_get_mode_spec (qr_code_t* qrcode);
557 static char* s_get_char_bit_count (qr_code_t* qrcode, int len);
558 static char* s_data_to_bin_num (qr_code_t* qrcode, int data_code_count);
559 static char* s_data_to_bin_alpha (qr_code_t* qrcode, int data_code_count);
560 static int s_char_to_num_alpha (qr_code_t* qrcode, char src);
561 static char* s_data_to_bin_8bit (qr_code_t* qrcode, int data_code_count);
562 static char* s_data_to_bin_kanji (qr_code_t* qrcode, int data_code_count);
563 static char* s_tidy_8bit_code (qr_code_t* qrcode, const char* indata, int data_code_count);
564 static char* s_str_to_bin (qr_code_t* qrcode, char* indata, int data_code_count);
565 static void s_init_modules (qr_code_t* qrcode, qr_mask_pattern_t pat, char* module[]);
566 static void s_setup_probe_position(qr_code_t* qrcode, char* dst[], int pos_x, int pos_y);
567 static void s_setup_timing_pattern(qr_code_t* qrcode, char* dst[]);
568 static void s_setup_position_adjust(qr_code_t* qrcode, char* dst[]);
569 static void s_setup_type_info (qr_code_t* qrcode, char* dst[], qr_mask_pattern_t pat);
570 static void s_setup_version_info (qr_code_t* qrcode, char* dst[]);
571 static void s_map_data (qr_code_t* qrcode, char* dst[], unsigned char* indata,
572 int data_count, qr_mask_pattern_t pat);
573 static int s_get_mask (qr_mask_pattern_t pat, int yy, int xx);
574 static int s_get_bit_count (int data);
575 static int s_calc_lost_point (qr_code_t* qrcode, char* dst[]);
576 static int s_count_same_module (qr_ver_t ver, char* dst[]);
577 static int s_count_same_block (qr_ver_t ver, char* dst[]);
578 static int s_count_11311_pattern (qr_ver_t ver, char* dst[]);
579 static int s_count_dark_ratio (qr_ver_t ver, char* dst[]);
581 static void chxj_qr_code (qr_code_t* qrcode, char* module[]);
584 chxj_qr_code_handler(request_rec* r)
592 mod_chxj_config* conf;
594 DBG(r,"start chxj_qr_code_handler()");
596 if (strcasecmp(r->handler, "chxj-qrcode")) {
597 DBG(r, "end chxj_qr_code_handler()");
601 /*--------------------------------------------------------------------------*/
602 /* ¤â¤·¡¢¥¤¥á¡¼¥¸ÊÑ´¹¥Ï¥ó¥É¥éÃæ¤Ç¤¢¤ì¤Ð¡¢¤³¤³¤Ç¤Ï½èÍý¤·¤Ê¤¤ */
603 /*--------------------------------------------------------------------------*/
604 conf = chxj_get_module_config(r->per_dir_config, &chxj_module);
605 if (!conf || conf->image == CHXJ_IMG_ON)
608 memset(&doc, 0, sizeof(Doc));
609 memset(&qrcode, 0, sizeof(qr_code_t));
612 doc.parse_mode = PARSE_MODE_CHTML;
616 qs_init_malloc(&doc);
617 root = qs_parse_file(&doc, r->filename);
618 qrcode.found = QR_NOT_FOUND;
619 chxj_qrcode_node_to_qrcode(&qrcode, root);
621 if (qrcode.found == QR_NOT_FOUND)
622 return HTTP_NOT_FOUND;
624 qs_all_free(&doc,QX_LOGMARK);
626 sts = chxj_qrcode_create_image_data(&qrcode, &img, &len);
630 chxj_set_content_type(r, "image/jpg");
632 ap_rwrite((void*)img, len, r);
639 chxj_qr_code_blob_handler(request_rec* r, const char* indata, size_t* len)
647 DBG(r, "start chxj_qr_code_blob_handler()");
649 memset(&doc, 0, sizeof(Doc));
650 memset(&qrcode, 0, sizeof(qr_code_t));
653 doc.parse_mode = PARSE_MODE_CHTML;
657 qs_init_malloc(&doc);
658 root = qs_parse_string(&doc, indata, *len);
659 qrcode.found = QR_NOT_FOUND;
660 chxj_qrcode_node_to_qrcode(&qrcode, root);
661 qs_all_free(&doc,QX_LOGMARK);
663 if (qrcode.found == QR_NOT_FOUND)
666 sts = chxj_qrcode_create_image_data(&qrcode, &img, len);
668 DBG(r, "end chxj_qr_code_blob_handler()");
672 chxj_set_content_type(r, "image/jpg");
674 DBG(r, "end chxj_qr_code_blob_handler()");
681 chxj_qrcode_create_image_data(
688 MagickBooleanType status;
689 request_rec* r = qrcode->r;
690 MagickWand* magick_wand;
691 MagickWand* black_wand;
696 DBG(r,"start s_create_image_file()");
699 module_count = v_module_count_table[qrcode->version];
700 module = (char**)apr_palloc(r->pool, sizeof(char*)*(module_count+1));
701 for (yy=0; yy<module_count; yy++) {
702 module[yy] = (char*)apr_palloc(r->pool, module_count+1);
703 memset(module[yy], -1, module_count+1);
706 chxj_qr_code(qrcode, module);
709 magick_wand = NewMagickWand();
710 black_wand = NewMagickWand();
713 if (MagickSetSize(magick_wand, 24, 24) == MagickFalse)
716 if (MagickSetSize(black_wand, 24, 24) == MagickFalse)
719 if (MagickReadImageBlob(magick_wand, v_white_base_pic, sizeof(v_white_base_pic)) == MagickFalse)
722 if (MagickReadImageBlob(black_wand, v_black_pixel_pic, sizeof(v_black_pixel_pic)) == MagickFalse)
725 if (MagickSetImageUnits(magick_wand, PixelsPerInchResolution) == MagickFalse)
728 if (MagickSetImageUnits(black_wand, PixelsPerInchResolution) == MagickFalse)
731 if (MagickResizeImage(magick_wand, (module_count)+6, (module_count)+6 , LanczosFilter,0.0) == MagickFalse)
734 if (MagickSetImageResolution(magick_wand, 96,96) == MagickFalse)
737 if (MagickSetImageResolution(black_wand, 96,96) == MagickFalse)
740 if (MagickSetImageType(magick_wand, GrayscaleType) == MagickFalse)
743 if (MagickSetImageType(black_wand, GrayscaleType) == MagickFalse)
747 for (yy=0; yy<module_count; yy++) {
748 for (xx=0; xx<module_count; xx++) {
749 if (module[yy][xx] == '1') {
750 if (MagickCompositeImage(magick_wand, black_wand, CopyCompositeOp, xx+3,yy+3) == MagickFalse)
756 if (qrcode->size <= 0) {
757 status = MagickResizeImage(magick_wand, ((module_count)*4+6), ((module_count)*4+6) , LanczosFilter,0.0);
760 status = MagickResizeImage(magick_wand,
761 (module_count * qrcode->size + 6),
762 (module_count * qrcode->size + 6) ,
766 if (status == MagickFalse)
769 if (MagickSetImageFormat(magick_wand,"jpg") == MagickFalse)
773 DBG(r,"convert to jpg");
776 tmp = (unsigned char*)MagickGetImageBlob(magick_wand,img_len);
777 *img = apr_palloc(r->pool, *img_len);
778 memcpy(*img, tmp, *img_len);
781 DestroyMagickWand(magick_wand);
782 DestroyMagickWand(black_wand);
786 DBG(r, "end chxj_qr_code_handler()");
793 return HTTP_NOT_FOUND;
799 chxj_qr_code(qr_code_t* qrcode, char* module[])
801 request_rec* r = qrcode->doc->r;
802 unsigned char* eccstr;
805 char* real_data = NULL;
808 int data_total_count;
810 int min_mask_pattern;
811 int module_count = v_module_count_table[qrcode->version];
814 DBG(r,"start chxj_qr_code()");
817 /*------------------------------------------------------------------------*/
818 /* ¥â¡¼¥É»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹ */
819 /*------------------------------------------------------------------------*/
820 binstr = apr_psprintf(r->pool, "%s", s_get_mode_spec(qrcode));
822 DBG(r,"s_get_mode_spec()");
825 /*------------------------------------------------------------------------*/
826 /* ʸ»ú¿ô»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹ */
827 /*------------------------------------------------------------------------*/
828 binstr = apr_pstrcat(r->pool, binstr,
829 s_get_char_bit_count(qrcode, strlen(qrcode->indata)), NULL);
831 DBG(r, "s_get_char_bit_count()[%s]", binstr);
834 /*------------------------------------------------------------------------*/
835 /* ¥Ç¡¼¥¿¥³¡¼¥É¿ô¤ò»»½Ð */
836 /*------------------------------------------------------------------------*/
837 data_code_count = v_data_code_count[qrcode->version][qrcode->level];
839 DBG(r,"data_code_count=[%d]", data_code_count);
842 /*------------------------------------------------------------------------*/
843 /* ¼Â¥Ç¡¼¥¿¤Î£²¿Ê²½ */
844 /*------------------------------------------------------------------------*/
845 qrcode->mode_change = QR_NOT_CHANGE;
846 switch(qrcode->mode) {
848 real_data = s_data_to_bin_num(qrcode, data_code_count);
852 real_data = s_data_to_bin_alpha(qrcode, data_code_count);
856 real_data = s_data_to_bin_8bit(qrcode,data_code_count);
860 real_data = s_data_to_bin_kanji(qrcode,data_code_count);
864 qrcode->mode = QR_8BIT_MODE;
865 qrcode->mode_change = QR_CHANGE;
869 while(qrcode->mode_change == QR_CHANGE);
871 /*--------------------------------------------------------------------------*/
872 /* ½ªÃ¼¥Ñ¥¿¡¼¥ó¤ÎÉղà */
873 /*--------------------------------------------------------------------------*/
874 binstr = apr_pstrcat(r->pool, binstr, real_data, NULL);
876 DBG(r,"Before TERM BIT[%s]", binstr);
878 if ((size_t)(data_code_count * 8) > strlen(binstr)) {
879 int binstr_len = strlen(binstr);
880 for (ii=0; ii< (data_code_count * 8) - binstr_len && ii < 4; ii++) {
881 binstr = apr_pstrcat(r->pool, binstr, "0", NULL);
885 DBG(r, "After TERM BIT[%s] len[%d]bit [%f]byte", binstr, strlen(binstr), (float)(((float)strlen(binstr))/8.0));
886 DBG(r,"add term data");
889 /*--------------------------------------------------------------------------*/
890 /* 8bitñ°Ì¤Ë¤½¤í¤¨¤ë */
891 /*--------------------------------------------------------------------------*/
892 binstr = s_tidy_8bit_code(qrcode, binstr, data_code_count);
894 DBG(r,"After Tidy 8 BIT[%s]", binstr);
895 DBG(r,"s_tidy_8bit_code()");
898 /*--------------------------------------------------------------------------*/
899 /* ʸ»úÎó¤ò¥Ð¥¤¥Ê¥ê¤Ø */
900 /*--------------------------------------------------------------------------*/
901 decstr = s_str_to_bin(qrcode, binstr, data_code_count);
903 DBG(r,"s_str_to_bin()");
907 /*--------------------------------------------------------------------------*/
908 /* DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG */
909 /*--------------------------------------------------------------------------*/
911 char* rows = apr_psprintf(r->pool, " ");
912 for (ii=0; ii<data_code_count; ii++) {
913 rows = apr_pstrcat(r->pool, rows, apr_psprintf(r->pool, "[%02x]\n", (unsigned char)decstr[ii]), NULL);
915 DBG(r,"decstr[%s]", rows);
920 /*--------------------------------------------------------------------------*/
922 /* ½ÐÎϤȤ·¤Æ¤Îeccstr¤Ï¡¢¥¤¥ó¥¿¥ê¡¼¥ÖºÑ¤ß¤Î¥Ç¡¼¥¿¤¬¥»¥Ã¥È¤µ¤ì¤Þ¤¹. */
923 /*--------------------------------------------------------------------------*/
924 eccstr = apr_palloc(r->pool, module_count* module_count);
925 data_total_count = chxj_calc_ecc(qrcode, (unsigned char*)decstr, eccstr);
927 DBG(r,"chxj_calc_ecc() total_count[%d]", data_total_count);
930 /*--------------------------------------------------------------------------*/
931 /* ºÇŬ¤Î¥Þ¥¹¥¯¤ò¼èÆÀ¤¹¤ë */
932 /* Á´¤Æ¤Î¥Ñ¥¿¡¼¥ó¤ò»î¤·¡¢ºÇ¤â¼ºÅÀ¤Î¾¯¤Ê¤¤¥Þ¥¹¥¯¤òÁªÂò¤·¤Þ¤¹ */
933 /*--------------------------------------------------------------------------*/
935 min_mask_pattern = -1;
936 for (ii=0; ii<8; ii++) {
938 s_init_modules(qrcode, ii, module);
939 s_map_data(qrcode, module, (unsigned char*)eccstr, data_total_count, ii);
940 lost_point = s_calc_lost_point(qrcode, module);
942 if (min_mask_pattern == -1) {
943 min_mask_pattern = ii;
944 min_lost_point = lost_point;
947 if (min_lost_point >= lost_point) {
948 min_mask_pattern = ii;
949 min_lost_point = lost_point;
954 /*--------------------------------------------------------------------------*/
955 /* ºÇŬ¥Þ¥¹¥¯¤ÇºÆÅÙºî¤ê¤Ê¤ª¤· */
956 /*--------------------------------------------------------------------------*/
958 DBG(r, "selected mask[%d]", min_mask_pattern);
961 s_init_modules(qrcode, min_mask_pattern, module);
964 (unsigned char*)eccstr,
970 /*--------------------------------------------------------------------------*/
971 /* DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG */
972 /*--------------------------------------------------------------------------*/
975 int module_count = v_module_count_table[qrcode->version];
976 DBG(r,"loop to [%d]", module_count);
977 for (yy=0; yy<module_count; yy++) {
980 rows = apr_psprintf(r->pool, " ");
982 for (xx=0; xx<module_count; xx++)
983 rows = apr_pstrcat(r->pool, rows, "[", apr_psprintf(r->pool, "%c", module[yy][xx]), "]", NULL);
985 DBG(r,"%d:%s", yy,rows);
992 DBG(r,"end chxj_qr_code()");
997 chxj_qrcode_node_to_qrcode(qr_code_t* qrcode, Node* node)
1006 for (child = qs_get_child_node(doc,node);
1008 child = qs_get_next_node(doc,child)) {
1012 name = qs_get_node_name(doc,child);
1014 if (strcasecmp("qrcode",name) == 0) {
1016 qrcode->found = QR_FOUND;
1017 qrcode->mode_change = QR_NOT_CHANGE;
1018 qrcode->version = QR_VER_5;
1019 qrcode->level = QR_LEVEL_L;
1020 qrcode->mode = QR_8BIT_MODE;
1022 qrcode->indata = NULL;
1023 chxj_qrcode_node_to_qrcode(qrcode, child);
1026 if (strcasecmp("version", name) == 0) {
1031 cchild = qs_get_child_node(doc, child);
1033 if (cchild == NULL) {
1034 qrcode->version = QR_VER_1;
1038 name = qs_get_node_name(doc, cchild);
1039 value = qs_get_node_value(doc, cchild);
1040 if (strcasecmp("TEXT", name) != 0) {
1041 qrcode->version = QR_VER_1;
1044 if (value == NULL || strlen(value) == 0) {
1045 qrcode->version = QR_VER_1;
1049 if (chxj_chk_numeric(value)) {
1050 qrcode->version = QR_VER_1;
1053 ver = chxj_atoi(value);
1054 if (ver <= 0 || ver > 40) {
1055 qrcode->version = QR_VER_1;
1059 qrcode->version = ver - 1;
1062 if (strcasecmp("level", name) == 0) {
1063 Node* cchild = qs_get_child_node(doc, child);
1065 if (cchild == NULL) {
1066 qrcode->level = QR_LEVEL_L;
1069 name = qs_get_node_name(doc, cchild);
1070 value = qs_get_node_value(doc, cchild);
1071 if (strcasecmp("TEXT", name) != 0) {
1072 qrcode->level = QR_LEVEL_L;
1076 if (value == NULL || strlen(value) == 0) {
1077 qrcode->level = QR_LEVEL_L;
1081 if (strcasecmp("L", value) == 0) {
1082 qrcode->level = QR_LEVEL_L;
1085 if (strcasecmp("M", value) == 0) {
1086 qrcode->level = QR_LEVEL_M;
1089 if (strcasecmp("Q", value) == 0) {
1090 qrcode->level = QR_LEVEL_Q;
1093 if (strcasecmp("H", value) == 0) {
1094 qrcode->level = QR_LEVEL_H;
1098 qrcode->level = QR_LEVEL_L;
1102 if (strcasecmp("mode", name) == 0)
1104 Node* cchild = qs_get_child_node(doc, child);
1108 qrcode->mode = QR_NUM_MODE;
1111 name = qs_get_node_name(doc, cchild);
1112 value = qs_get_node_value(doc, cchild);
1113 if (strcasecmp("TEXT", name) != 0)
1115 qrcode->level = QR_NUM_MODE;
1118 if (value == NULL || strlen(value) == 0)
1120 qrcode->level = QR_NUM_MODE;
1124 /*----------------------------------------------------------------------*/
1126 /*----------------------------------------------------------------------*/
1127 if (strcasecmp("NUM", value) == 0)
1129 qrcode->mode = QR_NUM_MODE;
1132 /*----------------------------------------------------------------------*/
1134 /*----------------------------------------------------------------------*/
1135 if (strcasecmp("ALPHA", value) == 0)
1137 qrcode->mode = QR_ALPHA_MODE;
1140 /*----------------------------------------------------------------------*/
1141 /* 8¥Ó¥Ã¥È¥Ð¥¤¥È¥â¡¼¥É */
1142 /*----------------------------------------------------------------------*/
1143 if (strcasecmp("8BIT", value) == 0)
1145 qrcode->mode = QR_8BIT_MODE;
1148 /*----------------------------------------------------------------------*/
1150 /*----------------------------------------------------------------------*/
1151 if (strcasecmp("KANJI", value) == 0)
1153 qrcode->mode = QR_KANJI_MODE;
1157 qrcode->mode = QR_NUM_MODE;
1161 if (strcasecmp("data", name) == 0)
1163 /* TODO: ²þ¹Ô¤â²Äǽ¤Ê¤è¤¦¤Ë½¤Àµ¤¹¤ë */
1164 Node* cchild = qs_get_child_node(doc, child);
1167 qrcode->indata = apr_palloc(r->pool, 1);
1168 qrcode->indata[0] = 0;
1173 for (;cchild; cchild = cchild->next)
1175 name = qs_get_node_name(doc, cchild);
1176 value = qs_get_node_value(doc, cchild);
1177 if (strcasecmp("TEXT", name) != 0)
1181 if (strlen(qrcode->indata) > 0)
1183 qrcode->indata = apr_pstrcat(r->pool, qrcode->indata, "\r\n", NULL);
1185 qrcode->indata = apr_pstrcat(r->pool, qrcode->indata, value, NULL);
1189 if (strcasecmp("size", name) == 0)
1193 Node* cchild = qs_get_child_node(doc, child);
1200 name = qs_get_node_name(doc, cchild);
1201 value = qs_get_node_value(doc, cchild);
1202 if (strcasecmp("TEXT", name) != 0)
1207 if (value == NULL || strlen(value) == 0)
1212 if (chxj_chk_numeric(value))
1218 size = chxj_atoi(value);
1229 qrcode->size = size;
1232 #ifdef QR_CODE_DEBUG
1233 DBG(r,"qrcode->version[%d]", qrcode->version);
1234 DBG(r,"qrcode->level[%d]", qrcode->level);
1235 DBG(r,"qrcode->mode[%d]", qrcode->mode);
1236 DBG(r,"qrcode->indata[%s]", qrcode->indata);
1242 * ¥â¡¼¥É»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹.
1245 s_get_mode_spec(qr_code_t *qrcode)
1247 char* result = (char*)apr_palloc(qrcode->r->pool, 4+1);
1249 memset(result, 0, 5);
1250 memcpy(result, v_mode_table[qrcode->mode], 4);
1251 #ifdef QR_CODE_DEBUG
1252 DBG(r,"Mode Spec[%s]", result);
1260 * ʸ»ú¿ô»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹.
1263 s_get_char_bit_count(qr_code_t* qrcode, int len)
1265 int bit_count = v_char_count_table[qrcode->version][qrcode->mode];
1269 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1271 DBG(qrcode->r, "len [%d]", len);
1272 if (qrcode->mode == QR_KANJI_MODE && data_capacity * 2 < len) {
1273 len = data_capacity * 2;
1276 if (qrcode->mode != QR_KANJI_MODE && data_capacity < len) {
1277 len = data_capacity;
1280 if (qrcode->mode == QR_KANJI_MODE) {
1284 DBG(qrcode->r, "len [%d]", len);
1286 tmp = (char*)apr_palloc(qrcode->r->pool, bit_count + 1);
1287 for (ii=0; ii<bit_count; ii++) {
1288 tmp[ii] = (len & 0x01) ? '1' : '0';
1292 tmp[bit_count] = '\0';
1294 result = (char*)apr_palloc(qrcode->r->pool, bit_count+1);
1295 for (jj=0,ii=bit_count-1; ii>=0 && jj < bit_count; ii--, jj++) {
1296 result[ii] = tmp[jj];
1299 result[bit_count] = '\0';
1301 #ifdef QR_CODE_DEBUG
1302 DBG(qrcode->r, "Character Count bit [%s]", result);
1310 * ÆþÎϥǡ¼¥¿¤«¤é¡¢£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1313 s_data_to_bin_num(qr_code_t* qrcode, int UNUSED(data_code_count))
1315 int len = strlen(qrcode->indata);
1324 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1326 if (data_capacity < len) {
1327 DBG(qrcode->r, "input data is too long");
1328 len = data_capacity;
1333 if (chxj_chk_numeric(qrcode->indata) != 0) {
1334 qrcode->mode_change = QR_CHANGE;
1335 qrcode->mode = QR_8BIT_MODE;
1339 result = (char*)apr_palloc(qrcode->r->pool, setn*10 + ((modn == 1) ? 4 : (modn == 2) ? 7 : 0) + 1);
1341 for (ii=0; ii<len; ii++) {
1342 tmp[ii % 3] = qrcode->indata[ii];
1343 if ((ii % 3) == 2) {
1346 for (jj=0; jj<10; jj++) {
1347 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1351 for (jj=10-1; jj>=0; jj--) {
1352 result[kk++] = tmp_bit[jj];
1360 int bb = (modn == 1) ? 4 : 7;
1362 for (jj=0; jj< bb; jj++) {
1363 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1367 tmp_bit[(modn == 1) ? 4 : 7] = 0;
1369 for (jj=bb -1; jj>=0; jj--) {
1370 result[kk++] = tmp_bit[jj];
1380 * ÆþÎϥǡ¼¥¿¤«¤é¡¢£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1383 s_data_to_bin_alpha(qr_code_t* qrcode, int UNUSED(data_code_count))
1385 int len = strlen(qrcode->indata);
1394 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1396 if (data_capacity < len) {
1397 DBG(qrcode->r, "input data is too long");
1398 len = data_capacity;
1403 result = (char*)apr_palloc(qrcode->r->pool, setn*11 + ((modn == 1) ? 6 : 0) + 1);
1406 for (ii=0; ii<len; ii++) {
1407 tmp[ii % 2] = qrcode->indata[ii];
1408 if ((ii % 2) == 1) {
1410 int n = s_char_to_num_alpha(qrcode,tmp[0])*45;
1412 if (qrcode->mode_change == QR_CHANGE)
1415 n += s_char_to_num_alpha(qrcode,tmp[1]);
1416 if (qrcode->mode_change == QR_CHANGE)
1419 for (jj=0; jj<11; jj++) {
1420 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1426 for (jj=11-1; jj>=0; jj--)
1427 result[kk++] = tmp_bit[jj];
1434 int n = s_char_to_num_alpha(qrcode,tmp[0]);
1436 if (qrcode->mode_change == QR_CHANGE)
1439 for (jj=0; jj< 6; jj++) {
1440 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1446 for (jj=6-1; jj>=0; jj--)
1447 result[kk++] = tmp_bit[jj];
1455 * ±Ñ¿ô»ú¥â¡¼¥É¤ÎÊä½õ´Ø¿ô.
1456 * ±Ñ¿ô»ú¤«¤é¡¢¿ôÃͤËÊÑ´¹¤·¤Þ¤¹.
1459 s_char_to_num_alpha(qr_code_t* qrcode, char src)
1472 case 'A': return 10;
1473 case 'B': return 11;
1474 case 'C': return 12;
1475 case 'D': return 13;
1476 case 'E': return 14;
1477 case 'F': return 15;
1478 case 'G': return 16;
1479 case 'H': return 17;
1480 case 'I': return 18;
1481 case 'J': return 19;
1482 case 'K': return 20;
1483 case 'L': return 21;
1484 case 'M': return 22;
1485 case 'N': return 23;
1486 case 'O': return 24;
1487 case 'P': return 25;
1488 case 'Q': return 26;
1489 case 'R': return 27;
1490 case 'S': return 28;
1491 case 'T': return 29;
1492 case 'U': return 30;
1493 case 'V': return 31;
1494 case 'W': return 32;
1495 case 'X': return 33;
1496 case 'Y': return 34;
1497 case 'Z': return 35;
1517 qrcode->mode_change = QR_CHANGE;
1518 qrcode->mode = QR_8BIT_MODE;
1525 * ÆþÎϥǡ¼¥¿¤«¤é£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1528 s_data_to_bin_8bit(qr_code_t* qrcode, int UNUSED(data_code_count))
1530 int len = strlen(qrcode->indata);
1536 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1538 if (data_capacity < len) {
1539 DBG(qrcode->r, "input data is too long");
1540 len = data_capacity;
1543 result = (char*)apr_palloc(qrcode->r->pool, len*8 + 1);
1546 for (ii=0; ii<len; ii++) {
1549 n = (int)qrcode->indata[ii];
1550 for (jj=0; jj<8; jj++) {
1551 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1557 for (jj=8-1; jj>=0; jj--)
1558 result[kk++] = tmp_bit[jj];
1562 #ifdef QR_CODE_DEBUG
1563 DBG(qrcode->r, "input data --> 2bin result[%s] len:[%d]", result, strlen(result));
1571 * A binary character string is acquired from input data.
1574 s_data_to_bin_kanji(qr_code_t* qrcode, int UNUSED(data_code_count))
1576 int len = strlen(qrcode->indata);
1583 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1585 if (data_capacity * 2 < len) {
1586 DBG(qrcode->r, "input data is too long");
1587 len = data_capacity * 2;
1590 if ((len % 2) != 0) {
1591 DBG(qrcode->r, "invalid data.");
1592 qrcode->mode_change = QR_CHANGE;
1593 qrcode->mode = QR_8BIT_MODE;
1597 result = (char*)apr_palloc(qrcode->r->pool, (len/2)*13 + 1);
1598 for (kk=0,ii=0; ii<len-1; ii++) {
1602 c = (qrcode->indata[ii+0] & 0xff)<< 8;
1603 c +=(qrcode->indata[ii+1] & 0xff);
1605 if (c >= 0x8140 && c <= 0x9FFC) {
1607 up_c = ((c >> 8) & 0xff) * 0xC0;
1613 if (c >= 0xE040 && c <= 0xEBBF) {
1615 up_c = ((c >> 8) & 0xff) * 0xC0;
1621 qrcode->mode_change = QR_CHANGE;
1622 qrcode->mode = QR_8BIT_MODE;
1626 memset(tmp_bit, 0, 13+1);
1627 for (jj=0; jj<13; jj++) {
1628 tmp_bit[jj] = (c & 0x01) ? '1' : '0';
1633 for (jj=13-1; jj>=0; jj--)
1634 result[kk++] = tmp_bit[jj];
1640 #ifdef QR_CODE_DEBUG
1641 DBG(qrcode->r, "input data --> 2bin result[%s] len:[%d]", result, strlen(result));
1648 * 8bitŤˤ¢¤ï¤»¤Þ¤¹
1651 s_tidy_8bit_code(qr_code_t* qrcode, const char* indata, int data_code_count)
1653 int len = strlen(indata);
1660 #ifdef QR_CODE_DEBUG
1661 DBG(qrcode->r, "len[%d] data_code_count * 8 [%d]", len, data_code_count * 8);
1664 assert (len <= data_code_count * 8);
1665 /* 8bit¤Ç³ä¤ì¤Ê¤¤¾ì¹ç¤Ï¡¢»Ä¤ê¤ò£°Ëä¤á¤·¡¢8¤Ç³ä¤ì¤ë¤è¤¦¤Ë¤¹¤ë */
1668 assert (len + n <= data_code_count * 8);
1670 tmp = (char*)apr_palloc(qrcode->r->pool, n);
1671 for (ii=0; ii<n; ii++)
1677 result = (char*)apr_palloc(qrcode->r->pool, data_code_count * 8 + 1);
1678 memset(result, 0, data_code_count * 8+ 1);
1679 memcpy(result, indata, len);
1681 memcpy(&result[len], tmp, strlen(tmp));
1683 len = strlen(result);
1684 rest = data_code_count - (len / 8);
1687 for (ii=0; ii<8; ii++)
1688 result[len++] = v_pend_bit[n][ii];
1690 n = (n == 0) ? 1 : 0;
1694 #ifdef QR_CODE_DEBUG
1695 DBG(qrcode->r, "tidy len[%d] data_code_count[%d]", strlen(result)/8, data_code_count);
1702 * £²¿Êʸ»úÎó¤ò¥Ð¥¤¥Ê¥ê¤ËÊÑ´¹¤·¤Þ¤¹.
1705 s_str_to_bin(qr_code_t* qrcode, char* indata, int data_code_count)
1712 len = strlen(indata);
1713 result = (char*)apr_palloc(qrcode->r->pool, data_code_count);
1714 memset(result, 0, data_code_count);
1717 for (ii=0; ii<len; ii++) {
1718 result[pos] = (result[pos] << 1) | (indata[ii] - '0');
1726 * ½ÐÎÏÎΰè¤ò½é´ü²½¤·¤Þ¤¹.
1727 * °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó¡¢°ÌÃÖ¤¢¤ï¤»¡¢¥¿¥¤¥ß¥ó¥°¡¢·Á¼°¾ðÊó¤òÀßÄꤷ¡¢
1728 * ¤½¤Î¤Û¤«¤Î¾ì½ê¤Ë¤Ï¡¢-1¤òÀßÄꤷ¤Þ¤¹.
1731 s_init_modules(qr_code_t* qrcode, qr_mask_pattern_t pat, char* dst[])
1733 int module_count = v_module_count_table[qrcode->version];
1736 #ifdef QR_CODE_DEBUG
1737 DBG(qrcode->r, "start s_init_modules()");
1739 DBG(qrcode->r, "module_count[%d]", module_count);
1742 for (yy=0; yy<module_count; yy++)
1743 memset(&dst[yy][0], -1, module_count+1);
1745 s_setup_probe_position(qrcode, dst, 0, 0);
1746 s_setup_probe_position(qrcode, dst, 0, module_count - 7);
1747 s_setup_probe_position(qrcode, dst, module_count - 7, 0);
1748 s_setup_position_adjust(qrcode, dst);
1749 s_setup_timing_pattern(qrcode, dst);
1750 s_setup_type_info(qrcode,dst, pat);
1751 s_setup_version_info(qrcode, dst);
1753 #ifdef QR_CODE_DEBUG
1754 DBG(qrcode->r, "end s_init_modules()");
1760 * °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó¤È¤Ä¤¤¤Ç¤ËʬΥ¥Ñ¥¿¡¼¥ó¤Î½ÐÎÏ
1763 s_setup_probe_position(qr_code_t* qrcode, char* dst[], int pos_x, int pos_y)
1765 int module_count = v_module_count_table[qrcode->version];
1768 #ifdef QR_CODE_DEBUG
1769 DBG(qrcode->r, "start s_setup_probe_position()");
1770 DBG(qrcode->r, "module_count[%d]", module_count);
1773 for (yy=-1; yy<=7; yy++) {
1774 for (xx=-1; xx<=7; xx++) {
1775 /* °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó */
1776 if ((yy==0 || yy == 6) && xx != -1 && xx != 7) {
1777 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1778 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1779 dst[yy+pos_y][xx+pos_x] = '1';
1782 if ((xx == 0 && yy != -1 && yy != 7)
1783 || (xx >= 2 && xx <= 4 && yy >=2 && yy <= 4)
1784 || (xx == 6 && yy != -1 && yy != 7)) {
1785 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1786 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1787 dst[yy+pos_y][xx+pos_x] = '1';
1793 && yy + pos_y < module_count
1795 && xx + pos_x < module_count)
1798 && yy + pos_y < module_count
1800 && xx + pos_x < module_count)
1803 && xx + pos_x < module_count
1805 && yy + pos_y < module_count)
1807 && xx + pos_x < module_count
1810 && yy + pos_y < module_count)) {
1811 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1812 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1813 dst[yy+pos_y][xx+pos_x] = '0';
1816 if (yy != -1 && yy != 7 && xx != -1 && xx != 7) {
1817 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1818 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1819 dst[yy+pos_y][xx+pos_x] = '0';
1824 #ifdef QR_CODE_DEBUG
1825 DBG(qrcode->r, "end s_setup_probe_position()");
1829 * ¥¿¥¤¥ß¥ó¥°¥Ñ¥¿¡¼¥ó
1832 s_setup_timing_pattern(qr_code_t* qrcode, char* dst[])
1834 int module_count = v_module_count_table[qrcode->version];
1836 #ifdef QR_CODE_DEBUG
1837 DBG(qrcode->r, "start s_setup_timing_pattern()");
1838 DBG(qrcode->r, "module_count[%d]", module_count);
1842 for (xx=8; xx < module_count-8; xx++) {
1843 if (dst[yy][xx] != -1)
1846 assert(yy >= 0 && yy < module_count);
1847 assert(xx >= 0 && xx < module_count);
1849 dst[yy][xx] = (xx % 2 == 0) ? '1' : '0';
1853 for (yy=8; yy < module_count-8; yy++) {
1854 if (dst[yy][xx] != -1)
1857 assert(yy >= 0 && yy < module_count);
1858 assert(xx >= 0 && xx < module_count);
1860 dst[yy][xx] = (yy % 2 == 0) ? '1' : '0';
1863 #ifdef QR_CODE_DEBUG
1864 DBG(qrcode->r, "start s_setup_timing_pattern()");
1869 * °ÌÃÖ¹ç¤ï¤»¥Ñ¥¿¡¼¥ó
1872 s_setup_position_adjust(qr_code_t* qrcode, char* dst[])
1874 int module_count = v_module_count_table[qrcode->version];
1875 int* pos_list = v_position_adjust_table[qrcode->version].position;
1880 #ifdef QR_CODE_DEBUG
1881 DBG(qrcode->r, "start s_setup_position_adjust()");
1884 for (yy=0; yy<7; yy++) {
1885 for (xx=0; xx<7; xx++) {
1889 if (mxx == 0 || myy == 0)
1892 if (dst[myy][mxx] != -1)
1895 for (dyy = -2; dyy <= 2; dyy++) {
1896 for (dxx= -2; dxx <= 2; dxx++) {
1901 || (dyy == 0 && dxx == 0)) {
1902 assert(myy+dyy >= 0);
1903 assert(myy+dyy < module_count);
1904 dst[myy+dyy][mxx+dxx] = '1';
1907 assert(myy+dyy >= 0);
1908 assert(myy+dyy < module_count);
1909 dst[myy+dyy][mxx+dxx] = '0';
1916 #ifdef QR_CODE_DEBUG
1917 DBG(qrcode->r, "end s_setup_position_adjust()");
1922 s_setup_type_info(qr_code_t* qrcode, char* dst[], qr_mask_pattern_t pat)
1924 int module_count = v_module_count_table[qrcode->version];
1932 #ifdef QR_CODE_DEBUG
1933 DBG(qrcode->r, "start s_setup_type_info()");
1934 DBG(qrcode->r, "module_count[%d]", module_count);
1937 /* ·Á¼°¾ðÊó¥Ç¡¼¥¿¤ÎÀ¸À® */
1938 switch(qrcode->level) {
1939 case QR_LEVEL_L: sdata = 0x01 << 3; break;
1940 case QR_LEVEL_M: sdata = 0x00 << 3; break;
1941 case QR_LEVEL_Q: sdata = 0x03 << 3; break;
1942 case QR_LEVEL_H: sdata = 0x02 << 3; break;
1949 /* G(x)=x10+x8+x5+x4+x2+x+1 */
1958 gfmask = (0x01 << 14) | (0x01 << 12) | (0x01 << 10) | (0x01 << 4) | (0x01 << 1);
1961 typedata = sdata << 10;
1962 while (s_get_bit_count(typedata) - s_get_bit_count(gf) >= 0) {
1963 typedata ^= (gf << (s_get_bit_count(typedata) - s_get_bit_count(gf)));
1965 typedata = (sdata << 10 | typedata);
1969 for (yy=0; yy<6; yy++) {
1970 assert(yy >= 0 && yy < module_count);
1971 dst[yy][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1974 for (; yy<8; yy++) {
1975 assert(yy + 1 >= 0 && yy + 1 < module_count);
1976 dst[yy+1][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1979 for (; yy<15; yy++) {
1980 assert(module_count - 15 + yy >= 0 && module_count - 15 + yy < module_count);
1981 dst[module_count - 15 + yy][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1984 for (xx = 0; xx < 8; xx++) {
1985 assert(module_count - xx -1 >= 0 && module_count - xx - 1 < module_count);
1986 dst[8][module_count - xx - 1] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
1989 for (; xx<9; xx++) {
1990 assert(15 - xx >= 0 && 15 - xx < module_count);
1991 dst[8][15 - xx] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
1994 for (; xx<15; xx++) {
1995 assert(15 - xx - 1 >= 0 && 15 - xx - 1 < module_count);
1996 dst[8][15 - xx - 1] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
1999 assert(module_count - 8 >= 0 && module_count - 8 < module_count);
2000 dst[module_count - 8][8] = '1';
2002 #ifdef QR_CODE_DEBUG
2003 DBG(qrcode->r, "start s_setup_type_info()");
2008 s_get_bit_count(int data)
2022 s_setup_version_info(qr_code_t* qrcode, char* dst[])
2024 char* bits = v_version_info_table[qrcode->version].bits;
2025 int module_count = v_module_count_table[qrcode->version];
2030 /* ¥Ð¡¼¥¸¥ç¥ó£·°Ê¹ß¤Î¤ßÂÐ¾Ý */
2034 /* ±¦¾å¤Î·¿ÈÖ¾ðÊó¤ÎÇÛÃÖ */
2035 for (xx=0; xx<strlen(bits); xx++) {
2036 dst[(int)((double)xx/3.0)][(xx % 3) + module_count - 8 - 3] = bits[xx];
2039 /* º¸²¼¤Î·¿ÈÖ¾ðÊó¤ÎÇÛÃÖ */
2040 for (yy=0; yy<strlen(bits); yy++) {
2041 dst[(yy % 3) + module_count - 8 - 3][(int)((double)yy/3.0)] = bits[yy];
2046 s_map_data(qr_code_t* qrcode,
2048 unsigned char* indata, int data_count,qr_mask_pattern_t pat)
2050 int module_count = v_module_count_table[qrcode->version];
2051 int inc_yy_flag = -1;
2059 #ifdef QR_CODE_DEBUG
2060 DBG(qrcode->r, "start s_map_data()");
2061 DBG(qrcode->r, "module_count[%d]", module_count);
2062 DBG(qrcode->r, "data_count[%d]", data_count);
2067 yy = module_count - 1;
2069 for (xx = module_count - 1; xx > 0 ; xx -= 2) {
2074 for (ii=0; ii < 2; ii++) {
2075 if (dst[yy][xx - ii] != -1)
2076 /* ´û¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç */
2079 if (in_pos < data_count) {
2080 assert(yy >= 0 && yy < module_count);
2081 assert(xx-ii >= 0 && xx-ii < module_count);
2083 dst[yy][xx-ii] = (((indata[in_pos] >> now_bit) & 0x01) == 1) ? '1' : '0';
2084 mask = s_get_mask(pat, yy, xx - ii);
2086 if (dst[yy][xx-ii] == '1') {
2087 dst[yy][xx-ii] = '0';
2090 dst[yy][xx-ii] = '1';
2094 if (--now_bit < 0) {
2101 } while (yy >= 0 && yy < module_count) ;
2104 inc_yy_flag = -inc_yy_flag;
2108 for (yy=0; yy<module_count; yy++) {
2109 for (xx=0; xx<module_count; xx++) {
2110 if (dst[yy][xx] == -1) {
2112 mask = s_get_mask(pat, yy, xx);
2119 #ifdef QR_CODE_DEBUG
2120 DBG(qrcode->r, "end s_map_data()");
2125 s_get_mask(qr_mask_pattern_t pat, int yy, int xx)
2128 case QR_MASK_1: return ((yy + xx) % 2 == 0) ? 1 : 0;
2129 case QR_MASK_2: return (yy % 2 == 0) ? 1 : 0;
2130 case QR_MASK_3: return (xx % 3 == 0) ? 1 : 0;
2131 case QR_MASK_4: return ((yy + xx) % 3 == 0) ? 1 : 0;
2132 case QR_MASK_5: return (((yy / 2) + (xx / 3)) % 2 == 0) ? 1 : 0;
2133 case QR_MASK_6: return ((yy * xx) % 2 + (yy * xx) % 3 == 0) ? 1 : 0;
2134 case QR_MASK_7: return (((yy * xx) % 2 + (yy * xx) % 3) % 2 == 0) ? 1 : 0;
2135 case QR_MASK_8: return (((yy * xx) % 3 + (yy + xx) % 2) % 2 == 0) ? 1 : 0;
2143 s_calc_lost_point(qr_code_t* qrcode, char* dst[])
2147 /* Ʊ¿§¤Î¹Ô¡¿Îó¤ÎÎÙÀܥ⥸¥å¡¼¥ë ¥â¥¸¥å¡¼¥ë¿ô=(5+i) 3+i */
2148 point = s_count_same_module(qrcode->version,dst);
2150 /* Ʊ¿§¤Î¥â¥¸¥å¡¼¥ë¥Ö¥í¥Ã¥¯ ¥Ö¥í¥Ã¥¯¥µ¥¤¥º 2¡ß2 3 */
2151 point += s_count_same_block(qrcode->version, dst);
2153 /* ¹Ô¡¿Îó¤Ë¤ª¤±¤ë1:1:3:1:1(°Å:ÌÀ:°Å:ÌÀ:°Å)¤Î¥Ñ¥¿¡¼¥ó */
2154 point += s_count_11311_pattern(qrcode->version, dst);
2156 /* Á´ÂΤËÀê¤á¤ë°Å¥â¥¸¥å¡¼¥ë¤Î³ä¹ç 50¡Þ(5+k)%¡Á50¡Þ(5+(k+1))% 10¡ßk */
2157 point += s_count_dark_ratio(qrcode->version, dst);
2163 * Ʊ¿§¤Î¹Ô¡¿Îó¤ÎÎÙÀܥ⥸¥å¡¼¥ë ¥â¥¸¥å¡¼¥ë¿ô=(5+i)
2167 s_count_same_module(qr_ver_t ver, char* dst[])
2175 module_count = v_module_count_table[ver];
2180 /* ²£Êý¸þ¤Ç¥Á¥§¥Ã¥¯ */
2181 for (yy=0; yy<module_count; yy++) {
2184 for (xx=0; xx<module_count; xx++) {
2185 if (prev_value == (unsigned char)dst[yy][xx])
2190 if (same_count >= 5)
2193 prev_value = (unsigned char)dst[yy][xx];
2197 /* ½ÄÊý¸þ¤Ç¥Á¥§¥Ã¥¯ */
2198 for (xx=0; xx<module_count; xx++) {
2202 for (yy=0; yy<module_count; yy++) {
2203 if (prev_value == (unsigned char)dst[yy][xx]) {
2210 if (same_count >= 5)
2213 prev_value = (unsigned char)dst[yy][xx];
2224 * Ʊ¿§¤Î¥â¥¸¥å¡¼¥ë¥Ö¥í¥Ã¥¯ ¥Ö¥í¥Ã¥¯¥µ¥¤¥º 2¡ß2
2227 s_count_same_block(qr_ver_t ver, char* dst[])
2234 module_count = v_module_count_table[ver];
2237 for (yy = 0; yy < module_count-1; yy++) {
2238 for (xx = 0; xx < module_count-1; xx++) {
2240 if (dst[yy+0][xx+0] == '1') count++;
2241 if (dst[yy+0][xx+1] == '1') count++;
2242 if (dst[yy+1][xx+0] == '1') count++;
2243 if (dst[yy+1][xx+1] == '1') count++;
2244 if (count == 0 || count == 4) {
2253 s_count_11311_pattern(qr_ver_t ver, char* dst[])
2259 module_count = v_module_count_table[ver];
2262 /* ²£Êý¸þ¤Î¥Á¥§¥Ã¥¯ */
2263 for (yy = 0; yy < module_count; yy++) {
2264 for (xx = 0; xx < module_count-6; xx++) {
2265 if (dst[yy][xx+0] == '1'
2266 && dst[yy][xx+1] == '0'
2267 && dst[yy][xx+2] == '1'
2268 && dst[yy][xx+3] == '1'
2269 && dst[yy][xx+4] == '1'
2270 && dst[yy][xx+5] == '0'
2271 && dst[yy][xx+6] == '1') {
2277 /* ½ÄÊý¸þ¤Î¥Á¥§¥Ã¥¯ */
2278 for (xx = 0; xx < module_count; xx++) {
2279 for (yy = 0; yy < module_count-6; yy++) {
2280 if (dst[yy+0][xx] == '1'
2281 && dst[yy+1][xx] == '0'
2282 && dst[yy+2][xx] == '1'
2283 && dst[yy+3][xx] == '1'
2284 && dst[yy+4][xx] == '1'
2285 && dst[yy+5][xx] == '0'
2286 && dst[yy+6][xx] == '1') {
2297 * Á´ÂΤËÀê¤á¤ë°Å¥â¥¸¥å¡¼¥ë¤Î³ä¹ç 50¡Þ(5+k)%¡Á50¡Þ(5+(k+1))%
2300 s_count_dark_ratio(qr_ver_t ver, char* dst[])
2308 module_count = v_module_count_table[ver];
2310 all_count = module_count * module_count;
2312 /* ñ¤Ë"°Å"¤ò¥«¥¦¥ó¥È¤¹¤ë */
2313 for (yy=0; yy<module_count; yy++) {
2314 for (xx=0; xx < module_count; xx++)
2315 if (dst[yy][xx] == '1')
2319 /* % ¤òµá¤á¡¢50¡ó¤«¤é¤Îº¹¤òµá¤á¤ë¡£ */
2320 ratio = (int)(((double)(dark_count) / (double)all_count)*100.0 - 50.0);
2323 /* 5%Ëè¤Ë10ÅÀ¸ºÅÀ¤Ê¤Î¤Ç¡¢¤Þ¤º5¤Ç³ä¤ë */