2 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
3 * Copyright (C) 2005 Atsushi Konno 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() \
40 char *description; ExceptionType severity; \
41 description=MagickGetException(magick_wand,&severity); \
42 ap_log_rerror(APLOG_MARK,APLOG_DEBUG, 0, r,"%s %s %d %s\n",__FILE__,(__func__),__LINE__,description); \
43 description=(char *) MagickRelinquishMemory(description); \
44 DestroyMagickWand(magick_wand); \
47 /*----------------------------------------------------------------------------*/
48 /* ¥â¡¼¥É»Ø¼¨»Ò¥Æ¡¼¥Ö¥ë */
49 /*----------------------------------------------------------------------------*/
50 static char* v_mode_table[] = {
53 /* 8¥Ó¥Ã¥È¥Ð¥¤¥È */ "0100",
58 /* ¹½Â¤ÅªÏ¢ÀÜ */ "0011",
59 /* ½ªÃ¼¥Ñ¥¿¡¼¥ó */ "0000",
69 /*----------------------------------------------------------------------------*/
70 /* ʸ»ú¿ô»Ø¼¨»Ò¤Î¥Ó¥Ã¥È¿ô */
71 /*----------------------------------------------------------------------------*/
72 static char v_char_count_table[][4] = {
73 /* ¥Ð¡¼¥¸¥ç¥ó *//* ʸ»ú¿ô»Ø¼¨»Ò¤Î¥Ó¥Ã¥È¿ô */
74 /* 1 */ { 10, 9, 8, 8, },
75 /* 2 */ { 10, 9, 8, 8, },
76 /* 3 */ { 10, 9, 8, 8, },
77 /* 4 */ { 10, 9, 8, 8, },
78 /* 5 */ { 10, 9, 8, 8, },
79 /* 6 */ { 10, 9, 8, 8, },
80 /* 7 */ { 10, 9, 8, 8, },
81 /* 8 */ { 10, 9, 8, 8, },
82 /* 9 */ { 10, 9, 8, 8, },
83 /* 10 */ { 12,11,16,10, },
84 /* 11 */ { 12,11,16,10, },
85 /* 12 */ { 12,11,16,10, },
86 /* 13 */ { 12,11,16,10, },
87 /* 14 */ { 12,11,16,10, },
88 /* 15 */ { 12,11,16,10, },
89 /* 16 */ { 12,11,16,10, },
90 /* 17 */ { 12,11,16,10, },
91 /* 18 */ { 12,11,16,10, },
92 /* 19 */ { 12,11,16,10, },
93 /* 20 */ { 12,11,16,10, },
94 /* 21 */ { 12,11,16,10, },
95 /* 22 */ { 12,11,16,10, },
96 /* 23 */ { 12,11,16,10, },
97 /* 24 */ { 12,11,16,10, },
98 /* 25 */ { 12,11,16,10, },
99 /* 26 */ { 12,11,16,10, },
100 /* 27 */ { 14,13,16,12, },
101 /* 28 */ { 14,13,16,12, },
102 /* 29 */ { 14,13,16,12, },
103 /* 30 */ { 14,13,16,12, },
104 /* 31 */ { 14,13,16,12, },
105 /* 32 */ { 14,13,16,12, },
106 /* 33 */ { 14,13,16,12, },
107 /* 34 */ { 14,13,16,12, },
108 /* 35 */ { 14,13,16,12, },
109 /* 36 */ { 14,13,16,12, },
110 /* 37 */ { 14,13,16,12, },
111 /* 38 */ { 14,13,16,12, },
112 /* 39 */ { 14,13,16,12, },
113 /* 40 */ { 14,13,16,12, },
115 static int v_data_code_count[][4] = {
116 /* ¥Ð¡¼¥¸¥ç¥ó *//* ¥Ç¡¼¥¿¥³¡¼¥É¿ô */
118 /* 1 */ {19, 16, 13, 9,},
119 /* 2 */ {34, 28, 22, 16,},
120 /* 3 */ {55, 44, 34, 26,},
121 /* 4 */ {80, 64, 48, 36,},
122 /* 5 */ {108, 86, 62, 46,},
123 /* 6 */ {136, 108, 76, 60,},
124 /* 7 */ {156, 124, 88, 66,},
125 /* 8 */ {194, 154, 110, 86,},
126 /* 9 */ {232, 182, 132, 100,},
127 /* 10 */ {274, 216, 154, 122,},
128 /* 11 */ {324, 254, 180, 140,},
129 /* 12 */ {370, 290, 206, 158,},
130 /* 13 */ {428, 334, 244, 180,},
131 /* 14 */ {461, 365, 261, 197,},
132 /* 15 */ {523, 415, 295, 223,},
133 /* 16 */ {589, 453, 325, 253,},
134 /* 17 */ {647, 507, 367, 283,},
135 /* 18 */ {721, 563, 397, 313,},
136 /* 19 */ {795, 627, 445, 341,},
137 /* 20 */ {861, 669, 485, 385,},
138 /* 21 */ {932, 714, 512, 406,},
139 /* 22 */ {1006,782, 568, 442,},
140 /* 23 */ {1094,860, 614, 464,},
141 /* 24 */ {1174,914, 664, 514,},
142 /* 25 */ {1276,1000,718, 538,},
143 /* 26 */ {1370,1062,754, 596,},
144 /* 27 */ {1468,1128,808, 628,},
145 /* 28 */ {1531,1193,871, 661,},
146 /* 29 */ {1631,1267,911, 701,},
147 /* 30 */ {1735,1373,985, 745,},
148 /* 31 */ {1843,1455,1033,793,},
149 /* 32 */ {1955,1541,1115,845,},
150 /* 33 */ {2071,1631,1171,901,},
151 /* 34 */ {2191,1725,1231,961,},
152 /* 35 */ {2306,1812,1286,986,},
153 /* 36 */ {2434,1914,1354,1054,},
154 /* 37 */ {2566,1992,1426,1096,},
155 /* 38 */ {2702,2102,1502,1142,},
156 /* 39 */ {2812,2216,1582,1222,},
157 /* 40 */ {2956,2334,1666,1276,},
160 /*----------------------------------------------------------------------------*/
161 /* ¤¢¤Þ¤Ã¤¿¾ì¹ç¤ÎÉÕ²Ã¥Ó¥Ã¥È */
162 /*----------------------------------------------------------------------------*/
163 static char* v_pend_bit[] = {
168 /*----------------------------------------------------------------------------*/
170 /*----------------------------------------------------------------------------*/
171 static int v_module_count_table[] = {
172 21, 25, 29, 33, 37, 41, 45, 49,
173 53, 57, 61, 65, 69, 73, 77, 81,
174 85, 89, 93, 97, 101, 105, 109, 113,
175 117, 121, 125, 129, 133, 137, 141, 145,
176 149, 153, 157, 161, 165, 169, 173, 177,
178 /*----------------------------------------------------------------------------*/
179 /* °ÌÃÖ¤¢¤ï¤»¥Ñ¥¿¡¼¥ó¤Î°ÌÃÖ */
180 /*----------------------------------------------------------------------------*/
181 typedef struct _qr_position_pattern_t {
184 } qr_position_pattern_t;
186 static qr_position_pattern_t v_position_adjust_table[] = {
187 { 0, {0,0,0,0,0,0,0,},},
188 { 1, {6,18,0,0,0,0,0,},},
189 { 1, {6,22,0,0,0,0,0,},},
190 { 1, {6,26,0,0,0,0,0,},},
191 { 1, {6,30,0,0,0,0,0,},},
192 { 1, {6,34,0,0,0,0,0,},},
193 { 6, {6,22,38,0,0,0,0,},},
194 { 6, {6,24,42,0,0,0,0,},},
195 { 6, {6,26,46,0,0,0,0,},},
196 { 6, {6,28,50,0,0,0,0,},},
197 { 6, {6,30,54,0,0,0,0,},},
198 { 6, {6,32,58,0,0,0,0,},},
199 { 6, {6,34,62,0,0,0,0,},},
200 {13, {6,26,46,66,0,0,0,},},
201 {13, {6,26,48,70,0,0,0,},},
202 {13, {6,26,50,74,0,0,0,},},
203 {13, {6,30,54,78,0,0,0,},},
204 {13, {6,30,56,82,0,0,0,},},
205 {13, {6,30,58,86,0,0,0,},},
206 {13, {6,34,62,90,0,0,0,},},
207 {22, {6,28,50,72,94,0,0,},},
208 {22, {6,26,50,74,98,0,0,},},
209 {22, {6,30,54,78,102,0,0,},},
210 {22, {6,28,54,80,106,0,0,},},
211 {22, {6,32,58,84,110,0,0,},},
212 {22, {6,30,58,86,114,0,0,},},
213 {22, {6,34,62,90,118,0,0,},},
214 {33, {6,26,50,74,98,122,0,},},
215 {33, {6,30,54,78,102,126,0,},},
216 {33, {6,26,52,78,104,130,0,},},
217 {33, {6,30,56,82,108,134,0,},},
218 {33, {6,34,60,86,112,138,0,},},
219 {33, {6,30,58,86,114,142,0,},},
220 {33, {6,34,62,90,118,146,0,},},
221 {46, {6,30,54,78,102,126,150,},},
222 {46, {6,24,50,76,102,128,154,},},
223 {46, {6,28,54,80,106,132,158,},},
224 {46, {6,32,58,84,110,136,162,},},
225 {46, {6,26,54,82,110,138,166,},},
226 {46, {6,30,58,86,114,142,170,},},
229 /*----------------------------------------------------------------------------*/
231 /*----------------------------------------------------------------------------*/
232 typedef enum _qr_mask_pattern_t {
244 /*----------------------------------------------------------------------------*/
246 /*----------------------------------------------------------------------------*/
247 static unsigned char v_white_base_pic[] = {
248 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
249 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
250 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
251 0x08, 0x02, 0x00, 0x00, 0x00, 0x6f, 0x15, 0xaa,
252 0xaf, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59,
253 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b,
254 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00,
255 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd5,
256 0x04, 0x04, 0x17, 0x13, 0x07, 0x12, 0x27, 0x77,
257 0x6f, 0x00, 0x00, 0x00, 0x22, 0x49, 0x44, 0x41,
258 0x54, 0x78, 0x9c, 0x63, 0xfc, 0xff, 0xff, 0x3f,
259 0x03, 0x35, 0x00, 0x13, 0x55, 0x4c, 0x19, 0x35,
260 0x68, 0xd4, 0xa0, 0x51, 0x83, 0x46, 0x0d, 0x1a,
261 0x35, 0x68, 0xd4, 0x20, 0x8a, 0x00, 0x00, 0x19,
262 0xd1, 0x03, 0x2d, 0xc6, 0xa1, 0x61, 0x7f, 0x00,
263 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
264 0x42, 0x60, 0x82, 0x0a
266 /*----------------------------------------------------------------------------*/
268 /*----------------------------------------------------------------------------*/
269 static unsigned char v_black_pixel_pic[] = {
270 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
271 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
272 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
273 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x15, 0xc4,
274 0x89, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
275 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
276 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00,
277 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00,
278 0x00, 0x20, 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00,
279 0x7a, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00,
280 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
281 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00,
282 0x3a, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9c, 0xba,
283 0x51, 0x3c, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x44,
284 0x41, 0x54, 0x18, 0x57, 0x63, 0x60, 0x60, 0x60,
285 0xf8, 0x0f, 0x00, 0x01, 0x04, 0x01, 0x00, 0x70,
286 0x20, 0x65, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x49,
287 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
289 /*----------------------------------------------------------------------------*/
291 /*----------------------------------------------------------------------------*/
292 typedef struct _qr_version_info_t {
297 static qr_version_info_t v_version_info_table[] = {
304 {QR_VER_7, "000111110010010100",},
305 {QR_VER_8, "001000010110111100",},
306 {QR_VER_9, "001001101010011001",},
307 {QR_VER_10,"001010010011010011",},
308 {QR_VER_11,"001011101111110110",},
309 {QR_VER_12,"001100011101100010",},
310 {QR_VER_13,"001101100001000111",},
311 {QR_VER_14,"001110011000001101",},
312 {QR_VER_15,"001111100100101000",},
313 {QR_VER_16,"010000101101111000",},
314 {QR_VER_17,"010001010001011101",},
315 {QR_VER_18,"010010101000010111",},
316 {QR_VER_19,"010011010100110010",},
317 {QR_VER_20,"010100100110100110",},
318 {QR_VER_21,"010101011010000011",},
319 {QR_VER_22,"010110100011001001",},
320 {QR_VER_23,"010111011111101100",},
321 {QR_VER_24,"011000111011000100",},
322 {QR_VER_25,"011001000111100001",},
323 {QR_VER_26,"011010111110101011",},
324 {QR_VER_27,"011011000010001110",},
325 {QR_VER_28,"011100110000011010",},
326 {QR_VER_29,"011101001100111111",},
327 {QR_VER_30,"011110110101110101",},
328 {QR_VER_31,"011111001001010000",},
329 {QR_VER_32,"100000100111010101",},
330 {QR_VER_33,"100001011011110000",},
331 {QR_VER_34,"100010100010111010",},
332 {QR_VER_35,"100011011110011111",},
333 {QR_VER_36,"100100101100001011",},
334 {QR_VER_37,"100101010000101110",},
335 {QR_VER_38,"100110101001100100",},
336 {QR_VER_39,"100111010101000001",},
337 {QR_VER_40,"101000110001101001",},
341 * ¥Ç¡¼¥¿ÍÆÎ̤Υơ¼¥Ö¥ë
343 /*----------------------------------------------------------------------------*/
344 /* ¥Ð¡¼¥¸¥ç¥óÊÌ¡¢¥ì¥Ù¥ëÊÌ¡¢¥â¡¼¥ÉÊ̥ǡ¼¥¿ÍÆÎÌ */
345 /*----------------------------------------------------------------------------*/
346 typedef struct _qr_capacity_t {
347 qr_ver_t version; /* ¾éĹ¾ðÊó */
348 qr_level_t level; /* ¾éĹ¾ðÊó */
352 static qr_capacity_t v_capacity_table[] = {
353 {QR_VER_1, QR_LEVEL_L, { 41, 25, 17, 10, },},
354 {QR_VER_1, QR_LEVEL_M, { 34, 20, 14, 8, },},
355 {QR_VER_1, QR_LEVEL_Q, { 27, 16, 11, 7, },},
356 {QR_VER_1, QR_LEVEL_H, { 17, 10, 7, 4, },},
358 {QR_VER_2, QR_LEVEL_L, { 77, 47, 32, 20, },},
359 {QR_VER_2, QR_LEVEL_M, { 63, 38, 26, 16, },},
360 {QR_VER_2, QR_LEVEL_Q, { 48, 29, 20, 12, },},
361 {QR_VER_2, QR_LEVEL_H, { 34, 20, 14, 8, },},
363 {QR_VER_3, QR_LEVEL_L, { 127, 77, 53, 32, },},
364 {QR_VER_3, QR_LEVEL_M, { 101, 61, 42, 26, },},
365 {QR_VER_3, QR_LEVEL_Q, { 77, 47, 32, 20, },},
366 {QR_VER_3, QR_LEVEL_H, { 58, 35, 24, 15, },},
368 {QR_VER_4, QR_LEVEL_L, { 187, 114, 78, 48, },},
369 {QR_VER_4, QR_LEVEL_M, { 149, 90, 62, 38, },},
370 {QR_VER_4, QR_LEVEL_Q, { 111, 67, 46, 28, },},
371 {QR_VER_4, QR_LEVEL_H, { 82, 50, 34, 21, },},
373 {QR_VER_5, QR_LEVEL_L, { 255, 154, 106, 65, },},
374 {QR_VER_5, QR_LEVEL_M, { 202, 122, 84, 52, },},
375 {QR_VER_5, QR_LEVEL_Q, { 144, 87, 60, 37, },},
376 {QR_VER_5, QR_LEVEL_H, { 106, 64, 44, 27, },},
378 {QR_VER_6, QR_LEVEL_L, { 322, 195, 134, 82, },},
379 {QR_VER_6, QR_LEVEL_M, { 255, 154, 106, 65, },},
380 {QR_VER_6, QR_LEVEL_Q, { 178, 108, 74, 45, },},
381 {QR_VER_6, QR_LEVEL_H, { 139, 84, 58, 36, },},
383 {QR_VER_7, QR_LEVEL_L, { 370, 224, 154, 95, },},
384 {QR_VER_7, QR_LEVEL_M, { 293, 178, 122, 75, },},
385 {QR_VER_7, QR_LEVEL_Q, { 207, 125, 86, 53, },},
386 {QR_VER_7, QR_LEVEL_H, { 154, 93, 64, 39, },},
388 {QR_VER_8, QR_LEVEL_L, { 461, 279, 192, 118, },},
389 {QR_VER_8, QR_LEVEL_M, { 365, 221, 152, 93, },},
390 {QR_VER_8, QR_LEVEL_Q, { 259, 157, 108, 66, },},
391 {QR_VER_8, QR_LEVEL_H, { 202, 122, 84, 52, },},
393 {QR_VER_9, QR_LEVEL_L, { 552, 335, 230, 141, },},
394 {QR_VER_9, QR_LEVEL_M, { 432, 262, 180, 111, },},
395 {QR_VER_9, QR_LEVEL_Q, { 312, 189, 130, 80, },},
396 {QR_VER_9, QR_LEVEL_H, { 235, 143, 98, 60, },},
398 {QR_VER_10, QR_LEVEL_L, { 652, 395, 271, 167, },},
399 {QR_VER_10, QR_LEVEL_M, { 513, 311, 213, 131, },},
400 {QR_VER_10, QR_LEVEL_Q, { 364, 221, 151, 93, },},
401 {QR_VER_10, QR_LEVEL_H, { 288, 174, 119, 74, },},
403 {QR_VER_11, QR_LEVEL_L, { 772, 468, 321, 198, },},
404 {QR_VER_11, QR_LEVEL_M, { 604, 366, 251, 155, },},
405 {QR_VER_11, QR_LEVEL_Q, { 427, 259, 177, 109, },},
406 {QR_VER_11, QR_LEVEL_H, { 331, 200, 137, 85, },},
408 {QR_VER_12, QR_LEVEL_L, { 883, 535, 367, 226, },},
409 {QR_VER_12, QR_LEVEL_M, { 691, 419, 287, 177, },},
410 {QR_VER_12, QR_LEVEL_Q, { 489, 296, 203, 125, },},
411 {QR_VER_12, QR_LEVEL_H, { 374, 227, 155, 96, },},
413 {QR_VER_13, QR_LEVEL_L, {1022, 619, 425, 262, },},
414 {QR_VER_13, QR_LEVEL_M, { 796, 483, 331, 204, },},
415 {QR_VER_13, QR_LEVEL_Q, { 580, 352, 241, 149, },},
416 {QR_VER_13, QR_LEVEL_H, { 427, 259, 177, 109, },},
418 {QR_VER_14, QR_LEVEL_L, {1101, 667, 458, 282, },},
419 {QR_VER_14, QR_LEVEL_M, { 871, 528, 362, 223, },},
420 {QR_VER_14, QR_LEVEL_Q, { 621, 376, 258, 159, },},
421 {QR_VER_14, QR_LEVEL_H, { 468, 283, 194, 120, },},
423 {QR_VER_15, QR_LEVEL_L, {1250, 758, 520, 320, },},
424 {QR_VER_15, QR_LEVEL_M, { 991, 600, 412, 254, },},
425 {QR_VER_15, QR_LEVEL_Q, { 703, 426, 292, 180, },},
426 {QR_VER_15, QR_LEVEL_H, { 530, 321, 220, 136, },},
428 {QR_VER_16, QR_LEVEL_L, {1408, 854, 586, 361, },},
429 {QR_VER_16, QR_LEVEL_M, {1082, 656, 450, 277, },},
430 {QR_VER_16, QR_LEVEL_Q, { 775, 470, 322, 198, },},
431 {QR_VER_16, QR_LEVEL_H, { 602, 365, 250, 154, },},
433 {QR_VER_17, QR_LEVEL_L, {1548, 938, 644, 397, },},
434 {QR_VER_17, QR_LEVEL_M, {1212, 734, 504, 310, },},
435 {QR_VER_17, QR_LEVEL_Q, { 876, 531, 364, 224, },},
436 {QR_VER_17, QR_LEVEL_H, { 674, 408, 280, 173, },},
438 {QR_VER_18, QR_LEVEL_L, {1725,1046, 718, 442, },},
439 {QR_VER_18, QR_LEVEL_M, {1346, 816, 560, 345, },},
440 {QR_VER_18, QR_LEVEL_Q, { 948, 574, 394, 243, },},
441 {QR_VER_18, QR_LEVEL_H, { 746, 452, 310, 191, },},
443 {QR_VER_19, QR_LEVEL_L, {1903,1153, 792, 488, },},
444 {QR_VER_19, QR_LEVEL_M, {1500, 909, 624, 384, },},
445 {QR_VER_19, QR_LEVEL_Q, {1063, 644, 442, 272, },},
446 {QR_VER_19, QR_LEVEL_H, { 813, 493, 338, 208, },},
448 {QR_VER_20, QR_LEVEL_L, {2061,1249, 858, 528, },},
449 {QR_VER_20, QR_LEVEL_M, {1600, 970, 666, 410, },},
450 {QR_VER_20, QR_LEVEL_Q, {1159, 702, 482, 297, },},
451 {QR_VER_20, QR_LEVEL_H, { 919, 557, 382, 235, },},
453 {QR_VER_21, QR_LEVEL_L, {2232,1352, 929, 572, },},
454 {QR_VER_21, QR_LEVEL_M, {1708,1035, 711, 438, },},
455 {QR_VER_21, QR_LEVEL_Q, {1224, 742, 509, 314, },},
456 {QR_VER_21, QR_LEVEL_H, { 969, 587, 403, 248, },},
458 {QR_VER_22, QR_LEVEL_L, {2409,1460,1003, 618, },},
459 {QR_VER_22, QR_LEVEL_M, {1872,1134, 779, 480, },},
460 {QR_VER_22, QR_LEVEL_Q, {1358, 823, 565, 348, },},
461 {QR_VER_22, QR_LEVEL_H, {1056, 640, 439, 270, },},
463 {QR_VER_23, QR_LEVEL_L, {2620,1588,1091, 672, },},
464 {QR_VER_23, QR_LEVEL_M, {2059,1248, 857, 528, },},
465 {QR_VER_23, QR_LEVEL_Q, {1468, 890, 611, 376, },},
466 {QR_VER_23, QR_LEVEL_H, {1108, 672, 461, 284, },},
468 {QR_VER_24, QR_LEVEL_L, {2812,1704,1171, 721, },},
469 {QR_VER_24, QR_LEVEL_M, {2188,1326, 911, 561, },},
470 {QR_VER_24, QR_LEVEL_Q, {1588, 963, 661, 407, },},
471 {QR_VER_24, QR_LEVEL_H, {1228, 744, 511, 315, },},
473 {QR_VER_25, QR_LEVEL_L, {3057,1853,1273, 784, },},
474 {QR_VER_25, QR_LEVEL_M, {2395,1451, 997, 614, },},
475 {QR_VER_25, QR_LEVEL_Q, {1718,1041, 715, 440, },},
476 {QR_VER_25, QR_LEVEL_H, {1286, 779, 535, 330, },},
478 {QR_VER_26, QR_LEVEL_L, {3283,1990,1367, 842, },},
479 {QR_VER_26, QR_LEVEL_M, {2544,1542,1059, 652, },},
480 {QR_VER_26, QR_LEVEL_Q, {1804,1094, 751, 462, },},
481 {QR_VER_26, QR_LEVEL_H, {1425, 864, 593, 365, },},
483 {QR_VER_27, QR_LEVEL_L, {3517,2132,1465, 902, },},
484 {QR_VER_27, QR_LEVEL_M, {2701,1637,1125, 692, },},
485 {QR_VER_27, QR_LEVEL_Q, {1933,1172, 805, 496, },},
486 {QR_VER_27, QR_LEVEL_H, {1501, 910, 625, 385, },},
488 {QR_VER_28, QR_LEVEL_L, {3669,2223,1528, 940, },},
489 {QR_VER_28, QR_LEVEL_M, {2857,1732,1190, 732, },},
490 {QR_VER_28, QR_LEVEL_Q, {2085,1263, 868, 534, },},
491 {QR_VER_28, QR_LEVEL_H, {1581, 958, 658, 405, },},
493 {QR_VER_29, QR_LEVEL_L, {3909,2369,1628,1002, },},
494 {QR_VER_29, QR_LEVEL_M, {3035,1839,1264, 778, },},
495 {QR_VER_29, QR_LEVEL_Q, {2181,1322, 908, 559, },},
496 {QR_VER_29, QR_LEVEL_H, {1677,1016, 698, 430, },},
498 {QR_VER_30, QR_LEVEL_L, {4158,2520,1732,1066, },},
499 {QR_VER_30, QR_LEVEL_M, {3289,1994,1370, 843, },},
500 {QR_VER_30, QR_LEVEL_Q, {2358,1429, 982, 604, },},
501 {QR_VER_30, QR_LEVEL_H, {1782,1080, 742, 457, },},
503 {QR_VER_31, QR_LEVEL_L, {4417,2677,1840,1132, },},
504 {QR_VER_31, QR_LEVEL_M, {3486,2113,1452, 894, },},
505 {QR_VER_31, QR_LEVEL_Q, {2473,1499,1030, 634, },},
506 {QR_VER_31, QR_LEVEL_H, {1897,1150, 790, 486, },},
508 {QR_VER_32, QR_LEVEL_L, {4686,2840,1952,1201, },},
509 {QR_VER_32, QR_LEVEL_M, {3693,2238,1538, 947, },},
510 {QR_VER_32, QR_LEVEL_Q, {2670,1618,1112, 684, },},
511 {QR_VER_32, QR_LEVEL_H, {2022,1226, 842, 518, },},
513 {QR_VER_33, QR_LEVEL_L, {4965,3009,2068,1273, },},
514 {QR_VER_33, QR_LEVEL_M, {3909,2369,1628,1002, },},
515 {QR_VER_33, QR_LEVEL_Q, {2805,1700,1168, 719, },},
516 {QR_VER_33, QR_LEVEL_H, {2157,1307, 898, 553, },},
518 {QR_VER_34, QR_LEVEL_L, {5253,3183,2188,1347, },},
519 {QR_VER_34, QR_LEVEL_M, {4134,2506,1722,1060, },},
520 {QR_VER_34, QR_LEVEL_Q, {2949,1787,1228, 756, },},
521 {QR_VER_34, QR_LEVEL_H, {2301,1394, 958, 590, },},
523 {QR_VER_35, QR_LEVEL_L, {5529,3351,2303,1417, },},
524 {QR_VER_35, QR_LEVEL_M, {4343,2632,1809,1113, },},
525 {QR_VER_35, QR_LEVEL_Q, {3081,1867,1283, 790, },},
526 {QR_VER_35, QR_LEVEL_H, {2361,1431, 983, 605, },},
528 {QR_VER_36, QR_LEVEL_L, {5836,3537,2431,1496, },},
529 {QR_VER_36, QR_LEVEL_M, {4588,2780,1911,1176, },},
530 {QR_VER_36, QR_LEVEL_Q, {3244,1966,1351, 832, },},
531 {QR_VER_36, QR_LEVEL_H, {2524,1530,1051, 647, },},
533 {QR_VER_37, QR_LEVEL_L, {6153,3729,2563,1577, },},
534 {QR_VER_37, QR_LEVEL_M, {4775,2894,1989,1224, },},
535 {QR_VER_37, QR_LEVEL_Q, {3417,2071,1423, 876, },},
536 {QR_VER_37, QR_LEVEL_H, {2625,1591,1093, 673, },},
538 {QR_VER_38, QR_LEVEL_L, {6479,3927,2699,1661, },},
539 {QR_VER_38, QR_LEVEL_M, {5039,3054,2099,1292, },},
540 {QR_VER_38, QR_LEVEL_Q, {3599,2181,1499, 923, },},
541 {QR_VER_38, QR_LEVEL_H, {2735,1658,1139, 701, },},
543 {QR_VER_39, QR_LEVEL_L, {6743,4087,2809,1729, },},
544 {QR_VER_39, QR_LEVEL_M, {5313,3220,2213,1362, },},
545 {QR_VER_39, QR_LEVEL_Q, {3791,2298,1579, 972, },},
546 {QR_VER_39, QR_LEVEL_H, {2927,1774,1219, 750, },},
548 {QR_VER_40, QR_LEVEL_L, {7089,4296,2953,1817, },},
549 {QR_VER_40, QR_LEVEL_M, {5596,3391,2331,1435, },},
550 {QR_VER_40, QR_LEVEL_Q, {3993,2420,1663,1024, },},
551 {QR_VER_40, QR_LEVEL_H, {3057,1852,1273, 784, },},
555 static char* s_get_mode_spec (qr_code_t* qrcode);
556 static char* s_get_char_bit_count (qr_code_t* qrcode, int len);
557 static char* s_data_to_bin_num (qr_code_t* qrcode, int data_code_count);
558 static char* s_data_to_bin_alpha (qr_code_t* qrcode, int data_code_count);
559 static int s_char_to_num_alpha (qr_code_t* qrcode, char src);
560 static char* s_data_to_bin_8bit (qr_code_t* qrcode, int data_code_count);
561 static char* s_data_to_bin_kanji (qr_code_t* qrcode, int data_code_count);
562 static char* s_tidy_8bit_code (qr_code_t* qrcode, const char* indata, int data_code_count);
563 static char* s_str_to_bin (qr_code_t* qrcode, char* indata, int data_code_count);
564 static void s_init_modules (qr_code_t* qrcode, qr_mask_pattern_t pat, char* module[]);
565 static void s_setup_probe_position(qr_code_t* qrcode, char* dst[], int pos_x, int pos_y);
566 static void s_setup_timing_pattern(qr_code_t* qrcode, char* dst[]);
567 static void s_setup_position_adjust(qr_code_t* qrcode, char* dst[]);
568 static void s_setup_type_info (qr_code_t* qrcode, char* dst[], qr_mask_pattern_t pat);
569 static void s_setup_version_info (qr_code_t* qrcode, char* dst[]);
570 static void s_map_data (qr_code_t* qrcode, char* dst[], unsigned char* indata,
571 int data_count, qr_mask_pattern_t pat);
572 static int s_get_mask (qr_mask_pattern_t pat, int yy, int xx);
573 static int s_get_bit_count (int data);
574 static int s_calc_lost_point (qr_code_t* qrcode, char* dst[]);
575 static int s_count_same_module (qr_ver_t ver, char* dst[]);
576 static int s_count_same_block (qr_ver_t ver, char* dst[]);
577 static int s_count_11311_pattern (qr_ver_t ver, char* dst[]);
578 static int s_count_dark_ratio (qr_ver_t ver, char* dst[]);
580 static void chxj_qr_code (qr_code_t* qrcode, char* module[]);
583 chxj_qr_code_handler(request_rec* r)
591 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 = ap_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 ap_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 ap_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 DBG1(r, "s_get_char_bit_count()[%s]", binstr);
834 /*------------------------------------------------------------------------*/
835 /* ¥Ç¡¼¥¿¥³¡¼¥É¿ô¤ò»»½Ð */
836 /*------------------------------------------------------------------------*/
837 data_code_count = v_data_code_count[qrcode->version][qrcode->level];
839 DBG1(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 DBG1(r,"Before TERM BIT[%s]", binstr);
878 if (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 DBG3(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 DBG1(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 DBG1(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 DBG1(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++)
939 s_init_modules(qrcode, ii, module);
940 s_map_data(qrcode, module, (unsigned char*)eccstr, data_total_count, ii);
941 lost_point = s_calc_lost_point(qrcode, module);
942 if (min_mask_pattern == -1)
944 min_mask_pattern = ii;
945 min_lost_point = lost_point;
949 if (min_lost_point >= lost_point)
951 min_mask_pattern = ii;
952 min_lost_point = lost_point;
957 /*--------------------------------------------------------------------------*/
958 /* ºÇŬ¥Þ¥¹¥¯¤ÇºÆÅÙºî¤ê¤Ê¤ª¤· */
959 /*--------------------------------------------------------------------------*/
961 DBG1(r, "selected mask[%d]", min_mask_pattern);
963 s_init_modules(qrcode, min_mask_pattern, module);
966 (unsigned char*)eccstr,
972 /*--------------------------------------------------------------------------*/
973 /* DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG */
974 /*--------------------------------------------------------------------------*/
977 int module_count = v_module_count_table[qrcode->version];
978 DBG1(r,"loop to [%d]", module_count);
979 for (yy=0; yy<module_count; yy++)
983 rows = apr_psprintf(r->pool, " ");
985 for (xx=0; xx<module_count; xx++)
987 rows = apr_pstrcat(r->pool, rows, "[", apr_psprintf(r->pool, "%c", module[yy][xx]), "]", NULL);
989 DBG2(r,"%d:%s", yy,rows);
996 DBG(r,"end chxj_qr_code()");
1001 chxj_qrcode_node_to_qrcode(qr_code_t* qrcode, Node* node)
1003 request_rec* r = qrcode->r;
1004 Doc* doc = qrcode->doc;
1007 for (child = qs_get_child_node(doc,node);
1009 child = qs_get_next_node(doc,child))
1011 char* name = qs_get_node_name(doc,child);
1012 if (strcasecmp("qrcode",name) == 0)
1014 qrcode->found = QR_FOUND;
1015 qrcode->mode_change = QR_NOT_CHANGE;
1016 qrcode->version = QR_VER_5;
1017 qrcode->level = QR_LEVEL_L;
1018 qrcode->mode = QR_8BIT_MODE;
1020 qrcode->indata = NULL;
1021 chxj_qrcode_node_to_qrcode(qrcode, child);
1024 if (strcasecmp("version", name) == 0)
1027 Node* cchild = qs_get_child_node(doc, child);
1031 qrcode->version = QR_VER_1;
1035 name = qs_get_node_name(doc, cchild);
1036 value = qs_get_node_value(doc, cchild);
1037 if (strcasecmp("TEXT", name) != 0)
1039 qrcode->version = QR_VER_1;
1042 if (value == NULL || strlen(value) == 0)
1044 qrcode->version = QR_VER_1;
1048 if (chxj_chk_numeric(value))
1050 qrcode->version = QR_VER_1;
1053 ver = chxj_atoi(value);
1054 if (ver <= 0 || ver > 40)
1056 qrcode->version = QR_VER_1;
1060 qrcode->version = ver - 1;
1063 if (strcasecmp("level", name) == 0)
1065 Node* cchild = qs_get_child_node(doc, child);
1069 qrcode->level = QR_LEVEL_L;
1072 name = qs_get_node_name(doc, cchild);
1073 value = qs_get_node_value(doc, cchild);
1074 if (strcasecmp("TEXT", name) != 0)
1076 qrcode->level = QR_LEVEL_L;
1080 if (value == NULL || strlen(value) == 0)
1082 qrcode->level = QR_LEVEL_L;
1086 if (strcasecmp("L", value) == 0)
1088 qrcode->level = QR_LEVEL_L;
1091 if (strcasecmp("M", value) == 0)
1093 qrcode->level = QR_LEVEL_M;
1096 if (strcasecmp("Q", value) == 0)
1098 qrcode->level = QR_LEVEL_Q;
1101 if (strcasecmp("H", value) == 0)
1103 qrcode->level = QR_LEVEL_H;
1107 qrcode->level = QR_LEVEL_L;
1111 if (strcasecmp("mode", name) == 0)
1113 Node* cchild = qs_get_child_node(doc, child);
1117 qrcode->mode = QR_NUM_MODE;
1120 name = qs_get_node_name(doc, cchild);
1121 value = qs_get_node_value(doc, cchild);
1122 if (strcasecmp("TEXT", name) != 0)
1124 qrcode->level = QR_NUM_MODE;
1127 if (value == NULL || strlen(value) == 0)
1129 qrcode->level = QR_NUM_MODE;
1133 /*----------------------------------------------------------------------*/
1135 /*----------------------------------------------------------------------*/
1136 if (strcasecmp("NUM", value) == 0)
1138 qrcode->mode = QR_NUM_MODE;
1141 /*----------------------------------------------------------------------*/
1143 /*----------------------------------------------------------------------*/
1144 if (strcasecmp("ALPHA", value) == 0)
1146 qrcode->mode = QR_ALPHA_MODE;
1149 /*----------------------------------------------------------------------*/
1150 /* 8¥Ó¥Ã¥È¥Ð¥¤¥È¥â¡¼¥É */
1151 /*----------------------------------------------------------------------*/
1152 if (strcasecmp("8BIT", value) == 0)
1154 qrcode->mode = QR_8BIT_MODE;
1157 /*----------------------------------------------------------------------*/
1159 /*----------------------------------------------------------------------*/
1160 if (strcasecmp("KANJI", value) == 0)
1162 qrcode->mode = QR_KANJI_MODE;
1166 qrcode->mode = QR_NUM_MODE;
1170 if (strcasecmp("data", name) == 0)
1172 /* TODO: ²þ¹Ô¤â²Äǽ¤Ê¤è¤¦¤Ë½¤Àµ¤¹¤ë */
1173 Node* cchild = qs_get_child_node(doc, child);
1176 qrcode->indata = apr_palloc(r->pool, 1);
1177 qrcode->indata[0] = 0;
1182 for (;cchild; cchild = cchild->next)
1184 name = qs_get_node_name(doc, cchild);
1185 value = qs_get_node_value(doc, cchild);
1186 if (strcasecmp("TEXT", name) != 0)
1190 if (strlen(qrcode->indata) > 0)
1192 qrcode->indata = apr_pstrcat(r->pool, qrcode->indata, "\r\n", NULL);
1194 qrcode->indata = apr_pstrcat(r->pool, qrcode->indata, value, NULL);
1198 if (strcasecmp("size", name) == 0)
1202 Node* cchild = qs_get_child_node(doc, child);
1209 name = qs_get_node_name(doc, cchild);
1210 value = qs_get_node_value(doc, cchild);
1211 if (strcasecmp("TEXT", name) != 0)
1216 if (value == NULL || strlen(value) == 0)
1221 if (chxj_chk_numeric(value))
1227 size = chxj_atoi(value);
1238 qrcode->size = size;
1241 #ifdef QR_CODE_DEBUG
1242 DBG1(r,"qrcode->version[%d]", qrcode->version);
1243 DBG1(r,"qrcode->level[%d]", qrcode->level);
1244 DBG1(r,"qrcode->mode[%d]", qrcode->mode);
1245 DBG1(r,"qrcode->indata[%s]", qrcode->indata);
1251 * ¥â¡¼¥É»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹.
1254 s_get_mode_spec(qr_code_t *qrcode)
1256 char* result = (char*)apr_palloc(qrcode->r->pool, 4+1);
1258 memset(result, 0, 5);
1259 memcpy(result, v_mode_table[qrcode->mode], 4);
1260 #ifdef QR_CODE_DEBUG
1261 DBG1(r,"Mode Spec[%s]", result);
1269 * ʸ»ú¿ô»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹.
1272 s_get_char_bit_count(qr_code_t* qrcode, int len)
1274 int bit_count = v_char_count_table[qrcode->version][qrcode->mode];
1278 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1280 DBG1(qrcode->r, "len [%d]", len);
1281 if (qrcode->mode == QR_KANJI_MODE && data_capacity * 2 < len) {
1282 len = data_capacity * 2;
1285 if (qrcode->mode != QR_KANJI_MODE && data_capacity < len) {
1286 len = data_capacity;
1289 if (qrcode->mode == QR_KANJI_MODE) {
1293 DBG1(qrcode->r, "len [%d]", len);
1295 tmp = (char*)apr_palloc(qrcode->r->pool, bit_count + 1);
1296 for (ii=0; ii<bit_count; ii++) {
1297 tmp[ii] = (len & 0x01) ? '1' : '0';
1301 tmp[bit_count] = '\0';
1303 result = (char*)apr_palloc(qrcode->r->pool, bit_count+1);
1304 for (jj=0,ii=bit_count-1; ii>=0 && jj < bit_count; ii--, jj++) {
1305 result[ii] = tmp[jj];
1308 result[bit_count] = '\0';
1310 #ifdef QR_CODE_DEBUG
1311 DBG1(qrcode->r, "Character Count bit [%s]", result);
1319 * ÆþÎϥǡ¼¥¿¤«¤é¡¢£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1322 s_data_to_bin_num(qr_code_t* qrcode, int data_code_count)
1324 int len = strlen(qrcode->indata);
1333 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1335 if (data_capacity < len) {
1336 DBG(qrcode->r, "input data is too long");
1337 len = data_capacity;
1342 if (chxj_chk_numeric(qrcode->indata) != 0) {
1343 qrcode->mode_change = QR_CHANGE;
1344 qrcode->mode = QR_8BIT_MODE;
1348 result = (char*)apr_palloc(qrcode->r->pool, setn*10 + ((modn == 1) ? 4 : (modn == 2) ? 7 : 0) + 1);
1350 for (ii=0; ii<len; ii++) {
1351 tmp[ii % 3] = qrcode->indata[ii];
1352 if ((ii % 3) == 2) {
1355 for (jj=0; jj<10; jj++) {
1356 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1360 for (jj=10-1; jj>=0; jj--) {
1361 result[kk++] = tmp_bit[jj];
1369 int bb = (modn == 1) ? 4 : 7;
1371 for (jj=0; jj< bb; jj++) {
1372 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1376 tmp_bit[(modn == 1) ? 4 : 7] = 0;
1378 for (jj=bb -1; jj>=0; jj--) {
1379 result[kk++] = tmp_bit[jj];
1389 * ÆþÎϥǡ¼¥¿¤«¤é¡¢£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1392 s_data_to_bin_alpha(qr_code_t* qrcode, int data_code_count)
1394 int len = strlen(qrcode->indata);
1403 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1405 if (data_capacity < len) {
1406 DBG(qrcode->r, "input data is too long");
1407 len = data_capacity;
1412 result = (char*)apr_palloc(qrcode->r->pool, setn*11 + ((modn == 1) ? 6 : 0) + 1);
1415 for (ii=0; ii<len; ii++) {
1416 tmp[ii % 2] = qrcode->indata[ii];
1417 if ((ii % 2) == 1) {
1419 int n = s_char_to_num_alpha(qrcode,tmp[0])*45;
1421 if (qrcode->mode_change == QR_CHANGE)
1424 n += s_char_to_num_alpha(qrcode,tmp[1]);
1425 if (qrcode->mode_change == QR_CHANGE)
1428 for (jj=0; jj<11; jj++) {
1429 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1435 for (jj=11-1; jj>=0; jj--)
1436 result[kk++] = tmp_bit[jj];
1443 int n = s_char_to_num_alpha(qrcode,tmp[0]);
1445 if (qrcode->mode_change == QR_CHANGE)
1448 for (jj=0; jj< 6; jj++) {
1449 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1455 for (jj=6-1; jj>=0; jj--)
1456 result[kk++] = tmp_bit[jj];
1464 * ±Ñ¿ô»ú¥â¡¼¥É¤ÎÊä½õ´Ø¿ô.
1465 * ±Ñ¿ô»ú¤«¤é¡¢¿ôÃͤËÊÑ´¹¤·¤Þ¤¹.
1468 s_char_to_num_alpha(qr_code_t* qrcode, char src)
1481 case 'A': return 10;
1482 case 'B': return 11;
1483 case 'C': return 12;
1484 case 'D': return 13;
1485 case 'E': return 14;
1486 case 'F': return 15;
1487 case 'G': return 16;
1488 case 'H': return 17;
1489 case 'I': return 18;
1490 case 'J': return 19;
1491 case 'K': return 20;
1492 case 'L': return 21;
1493 case 'M': return 22;
1494 case 'N': return 23;
1495 case 'O': return 24;
1496 case 'P': return 25;
1497 case 'Q': return 26;
1498 case 'R': return 27;
1499 case 'S': return 28;
1500 case 'T': return 29;
1501 case 'U': return 30;
1502 case 'V': return 31;
1503 case 'W': return 32;
1504 case 'X': return 33;
1505 case 'Y': return 34;
1506 case 'Z': return 35;
1526 qrcode->mode_change = QR_CHANGE;
1527 qrcode->mode = QR_8BIT_MODE;
1534 * ÆþÎϥǡ¼¥¿¤«¤é£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1537 s_data_to_bin_8bit(qr_code_t* qrcode, int data_code_count)
1539 int len = strlen(qrcode->indata);
1545 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1547 if (data_capacity < len) {
1548 DBG(qrcode->r, "input data is too long");
1549 len = data_capacity;
1552 result = (char*)apr_palloc(qrcode->r->pool, len*8 + 1);
1555 for (ii=0; ii<len; ii++) {
1558 n = (int)qrcode->indata[ii];
1559 for (jj=0; jj<8; jj++) {
1560 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1566 for (jj=8-1; jj>=0; jj--)
1567 result[kk++] = tmp_bit[jj];
1571 #ifdef QR_CODE_DEBUG
1572 DBG2(qrcode->r, "input data --> 2bin result[%s] len:[%d]", result, strlen(result));
1580 * A binary character string is acquired from input data.
1583 s_data_to_bin_kanji(qr_code_t* qrcode, int data_code_count)
1585 int len = strlen(qrcode->indata);
1592 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1594 if (data_capacity * 2 < len) {
1595 DBG(qrcode->r, "input data is too long");
1596 len = data_capacity * 2;
1599 if ((len % 2) != 0) {
1600 DBG(qrcode->r, "invalid data.");
1601 qrcode->mode_change = QR_CHANGE;
1602 qrcode->mode = QR_8BIT_MODE;
1606 result = (char*)apr_palloc(qrcode->r->pool, (len/2)*13 + 1);
1607 for (kk=0,ii=0; ii<len-1; ii++) {
1611 c = (qrcode->indata[ii+0] & 0xff)<< 8;
1612 c +=(qrcode->indata[ii+1] & 0xff);
1614 if (c >= 0x8140 && c <= 0x9FFC) {
1616 up_c = ((c >> 8) & 0xff) * 0xC0;
1622 if (c >= 0xE040 && c <= 0xEBBF) {
1624 up_c = ((c >> 8) & 0xff) * 0xC0;
1630 qrcode->mode_change = QR_CHANGE;
1631 qrcode->mode = QR_8BIT_MODE;
1635 memset(tmp_bit, 0, 13+1);
1636 for (jj=0; jj<13; jj++) {
1637 tmp_bit[jj] = (c & 0x01) ? '1' : '0';
1642 for (jj=13-1; jj>=0; jj--)
1643 result[kk++] = tmp_bit[jj];
1649 #ifdef QR_CODE_DEBUG
1650 DBG2(qrcode->r, "input data --> 2bin result[%s] len:[%d]", result, strlen(result));
1657 * 8bitŤˤ¢¤ï¤»¤Þ¤¹
1660 s_tidy_8bit_code(qr_code_t* qrcode, const char* indata, int data_code_count)
1662 int len = strlen(indata);
1669 #ifdef QR_CODE_DEBUG
1670 DBG2(qrcode->r, "len[%d] data_code_count * 8 [%d]", len, data_code_count * 8);
1673 assert (len <= data_code_count * 8);
1674 /* 8bit¤Ç³ä¤ì¤Ê¤¤¾ì¹ç¤Ï¡¢»Ä¤ê¤ò£°Ëä¤á¤·¡¢8¤Ç³ä¤ì¤ë¤è¤¦¤Ë¤¹¤ë */
1677 assert (len + n <= data_code_count * 8);
1679 tmp = (char*)apr_palloc(qrcode->r->pool, n);
1680 for (ii=0; ii<n; ii++)
1686 result = (char*)apr_palloc(qrcode->r->pool, data_code_count * 8 + 1);
1687 memset(result, 0, data_code_count * 8+ 1);
1688 memcpy(result, indata, len);
1690 memcpy(&result[len], tmp, strlen(tmp));
1692 len = strlen(result);
1693 rest = data_code_count - (len / 8);
1696 for (ii=0; ii<8; ii++)
1697 result[len++] = v_pend_bit[n][ii];
1699 n = (n == 0) ? 1 : 0;
1703 #ifdef QR_CODE_DEBUG
1704 DBG2(qrcode->r, "tidy len[%d] data_code_count[%d]", strlen(result)/8, data_code_count);
1711 * £²¿Êʸ»úÎó¤ò¥Ð¥¤¥Ê¥ê¤ËÊÑ´¹¤·¤Þ¤¹.
1714 s_str_to_bin(qr_code_t* qrcode, char* indata, int data_code_count)
1721 len = strlen(indata);
1722 result = (char*)apr_palloc(qrcode->r->pool, data_code_count);
1723 memset(result, 0, data_code_count);
1726 for (ii=0; ii<len; ii++) {
1727 result[pos] = (result[pos] << 1) | (indata[ii] - '0');
1735 * ½ÐÎÏÎΰè¤ò½é´ü²½¤·¤Þ¤¹.
1736 * °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó¡¢°ÌÃÖ¤¢¤ï¤»¡¢¥¿¥¤¥ß¥ó¥°¡¢·Á¼°¾ðÊó¤òÀßÄꤷ¡¢
1737 * ¤½¤Î¤Û¤«¤Î¾ì½ê¤Ë¤Ï¡¢-1¤òÀßÄꤷ¤Þ¤¹.
1740 s_init_modules(qr_code_t* qrcode, qr_mask_pattern_t pat, char* dst[])
1742 int module_count = v_module_count_table[qrcode->version];
1745 #ifdef QR_CODE_DEBUG
1746 DBG(qrcode->r, "start s_init_modules()");
1748 DBG(qrcode->r, "module_count[%d]", module_count);
1751 for (yy=0; yy<module_count; yy++)
1752 memset(&dst[yy][0], -1, module_count+1);
1754 s_setup_probe_position(qrcode, dst, 0, 0);
1755 s_setup_probe_position(qrcode, dst, 0, module_count - 7);
1756 s_setup_probe_position(qrcode, dst, module_count - 7, 0);
1757 s_setup_position_adjust(qrcode, dst);
1758 s_setup_timing_pattern(qrcode, dst);
1759 s_setup_type_info(qrcode,dst, pat);
1760 s_setup_version_info(qrcode, dst);
1762 #ifdef QR_CODE_DEBUG
1763 DBG(qrcode->r, "end s_init_modules()");
1769 * °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó¤È¤Ä¤¤¤Ç¤ËʬΥ¥Ñ¥¿¡¼¥ó¤Î½ÐÎÏ
1772 s_setup_probe_position(qr_code_t* qrcode, char* dst[], int pos_x, int pos_y)
1774 int module_count = v_module_count_table[qrcode->version];
1777 #ifdef QR_CODE_DEBUG
1778 DBG(qrcode->r, "start s_setup_probe_position()");
1779 DBG(qrcode->r, "module_count[%d]", module_count);
1782 for (yy=-1; yy<=7; yy++) {
1783 for (xx=-1; xx<=7; xx++) {
1784 /* °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó */
1785 if ((yy==0 || yy == 6) && xx != -1 && xx != 7) {
1786 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1787 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1788 dst[yy+pos_y][xx+pos_x] = '1';
1791 if ((xx == 0 && yy != -1 && yy != 7)
1792 || (xx >= 2 && xx <= 4 && yy >=2 && yy <= 4)
1793 || (xx == 6 && yy != -1 && yy != 7)) {
1794 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1795 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1796 dst[yy+pos_y][xx+pos_x] = '1';
1802 && yy + pos_y < module_count
1804 && xx + pos_x < module_count)
1807 && yy + pos_y < module_count
1809 && xx + pos_x < module_count)
1812 && xx + pos_x < module_count
1814 && yy + pos_y < module_count)
1816 && xx + pos_x < module_count
1819 && yy + pos_y < module_count)) {
1820 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1821 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1822 dst[yy+pos_y][xx+pos_x] = '0';
1825 if (yy != -1 && yy != 7 && xx != -1 && xx != 7) {
1826 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1827 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1828 dst[yy+pos_y][xx+pos_x] = '0';
1833 #ifdef QR_CODE_DEBUG
1834 DBG(qrcode->r, "end s_setup_probe_position()");
1838 * ¥¿¥¤¥ß¥ó¥°¥Ñ¥¿¡¼¥ó
1841 s_setup_timing_pattern(qr_code_t* qrcode, char* dst[])
1843 int module_count = v_module_count_table[qrcode->version];
1845 #ifdef QR_CODE_DEBUG
1846 DBG(qrcode->r, "start s_setup_timing_pattern()");
1847 DBG1(qrcode->r, "module_count[%d]", module_count);
1851 for (xx=8; xx < module_count-8; xx++) {
1852 if (dst[yy][xx] != -1)
1855 assert(yy >= 0 && yy < module_count);
1856 assert(xx >= 0 && xx < module_count);
1858 dst[yy][xx] = (xx % 2 == 0) ? '1' : '0';
1862 for (yy=8; yy < module_count-8; yy++) {
1863 if (dst[yy][xx] != -1)
1866 assert(yy >= 0 && yy < module_count);
1867 assert(xx >= 0 && xx < module_count);
1869 dst[yy][xx] = (yy % 2 == 0) ? '1' : '0';
1872 #ifdef QR_CODE_DEBUG
1873 DBG(qrcode->r, "start s_setup_timing_pattern()");
1878 * °ÌÃÖ¹ç¤ï¤»¥Ñ¥¿¡¼¥ó
1881 s_setup_position_adjust(qr_code_t* qrcode, char* dst[])
1883 int module_count = v_module_count_table[qrcode->version];
1884 int* pos_list = v_position_adjust_table[qrcode->version].position;
1889 #ifdef QR_CODE_DEBUG
1890 DBG(qrcode->r, "start s_setup_position_adjust()");
1893 for (yy=0; yy<7; yy++) {
1894 for (xx=0; xx<7; xx++) {
1898 if (mxx == 0 || myy == 0)
1901 if (dst[myy][mxx] != -1)
1904 for (dyy = -2; dyy <= 2; dyy++) {
1905 for (dxx= -2; dxx <= 2; dxx++) {
1910 || (dyy == 0 && dxx == 0)) {
1911 assert(myy+dyy >= 0);
1912 assert(myy+dyy < module_count);
1913 dst[myy+dyy][mxx+dxx] = '1';
1916 assert(myy+dyy >= 0);
1917 assert(myy+dyy < module_count);
1918 dst[myy+dyy][mxx+dxx] = '0';
1925 #ifdef QR_CODE_DEBUG
1926 DBG(qrcode->r, "end s_setup_position_adjust()");
1931 s_setup_type_info(qr_code_t* qrcode, char* dst[], qr_mask_pattern_t pat)
1933 int module_count = v_module_count_table[qrcode->version];
1941 #ifdef QR_CODE_DEBUG
1942 DBG(qrcode->r, "start s_setup_type_info()");
1943 DBG1(qrcode->r, "module_count[%d]", module_count);
1946 /* ·Á¼°¾ðÊó¥Ç¡¼¥¿¤ÎÀ¸À® */
1947 switch(qrcode->level) {
1948 case QR_LEVEL_L: sdata = 0x01 << 3; break;
1949 case QR_LEVEL_M: sdata = 0x00 << 3; break;
1950 case QR_LEVEL_Q: sdata = 0x03 << 3; break;
1951 case QR_LEVEL_H: sdata = 0x02 << 3; break;
1958 /* G(x)=x10+x8+x5+x4+x2+x+1 */
1967 gfmask = (0x01 << 14) | (0x01 << 12) | (0x01 << 10) | (0x01 << 4) | (0x01 << 1);
1970 typedata = sdata << 10;
1971 while (s_get_bit_count(typedata) - s_get_bit_count(gf) >= 0) {
1972 typedata ^= (gf << (s_get_bit_count(typedata) - s_get_bit_count(gf)));
1974 typedata = (sdata << 10 | typedata);
1978 for (yy=0; yy<6; yy++) {
1979 assert(yy >= 0 && yy < module_count);
1980 dst[yy][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1983 for (; yy<8; yy++) {
1984 assert(yy + 1 >= 0 && yy + 1 < module_count);
1985 dst[yy+1][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1988 for (; yy<15; yy++) {
1989 assert(module_count - 15 + yy >= 0 && module_count - 15 + yy < module_count);
1990 dst[module_count - 15 + yy][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1993 for (xx = 0; xx < 8; xx++) {
1994 assert(module_count - xx -1 >= 0 && module_count - xx - 1 < module_count);
1995 dst[8][module_count - xx - 1] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
1998 for (; xx<9; xx++) {
1999 assert(15 - xx >= 0 && 15 - xx < module_count);
2000 dst[8][15 - xx] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
2003 for (; xx<15; xx++) {
2004 assert(15 - xx - 1 >= 0 && 15 - xx - 1 < module_count);
2005 dst[8][15 - xx - 1] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
2008 assert(module_count - 8 >= 0 && module_count - 8 < module_count);
2009 dst[module_count - 8][8] = '1';
2011 #ifdef QR_CODE_DEBUG
2012 DBG(qrcode->r, "start s_setup_type_info()");
2017 s_get_bit_count(int data)
2031 s_setup_version_info(qr_code_t* qrcode, char* dst[])
2033 char* bits = v_version_info_table[qrcode->version].bits;
2034 int module_count = v_module_count_table[qrcode->version];
2039 /* ¥Ð¡¼¥¸¥ç¥ó£·°Ê¹ß¤Î¤ßÂÐ¾Ý */
2043 /* ±¦¾å¤Î·¿ÈÖ¾ðÊó¤ÎÇÛÃÖ */
2044 for (xx=0; xx<strlen(bits); xx++) {
2045 dst[(int)((double)xx/3.0)][(xx % 3) + module_count - 8 - 3] = bits[xx];
2048 /* º¸²¼¤Î·¿ÈÖ¾ðÊó¤ÎÇÛÃÖ */
2049 for (yy=0; yy<strlen(bits); yy++) {
2050 dst[(yy % 3) + module_count - 8 - 3][(int)((double)yy/3.0)] = bits[yy];
2055 s_map_data(qr_code_t* qrcode,
2057 unsigned char* indata, int data_count,qr_mask_pattern_t pat)
2059 int module_count = v_module_count_table[qrcode->version];
2060 int inc_yy_flag = -1;
2068 #ifdef QR_CODE_DEBUG
2069 DBG(qrcode->r, "start s_map_data()");
2070 DBG1(qrcode->r, "module_count[%d]", module_count);
2071 DBG1(qrcode->r, "data_count[%d]", data_count);
2076 yy = module_count - 1;
2078 for (xx = module_count - 1; xx > 0 ; xx -= 2) {
2083 for (ii=0; ii < 2; ii++) {
2084 if (dst[yy][xx - ii] != -1)
2085 /* ´û¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç */
2088 if (in_pos < data_count) {
2089 assert(yy >= 0 && yy < module_count);
2090 assert(xx-ii >= 0 && xx-ii < module_count);
2092 dst[yy][xx-ii] = (((indata[in_pos] >> now_bit) & 0x01) == 1) ? '1' : '0';
2093 mask = s_get_mask(pat, yy, xx - ii);
2095 if (dst[yy][xx-ii] == '1') {
2096 dst[yy][xx-ii] = '0';
2099 dst[yy][xx-ii] = '1';
2103 if (--now_bit < 0) {
2110 } while (yy >= 0 && yy < module_count) ;
2113 inc_yy_flag = -inc_yy_flag;
2117 for (yy=0; yy<module_count; yy++) {
2118 for (xx=0; xx<module_count; xx++) {
2119 if (dst[yy][xx] == -1) {
2121 mask = s_get_mask(pat, yy, xx);
2128 #ifdef QR_CODE_DEBUG
2129 DBG(qrcode->r, "end s_map_data()");
2134 s_get_mask(qr_mask_pattern_t pat, int yy, int xx)
2137 case QR_MASK_1: return ((yy + xx) % 2 == 0) ? 1 : 0;
2138 case QR_MASK_2: return (yy % 2 == 0) ? 1 : 0;
2139 case QR_MASK_3: return (xx % 3 == 0) ? 1 : 0;
2140 case QR_MASK_4: return ((yy + xx) % 3 == 0) ? 1 : 0;
2141 case QR_MASK_5: return (((yy / 2) + (xx / 3)) % 2 == 0) ? 1 : 0;
2142 case QR_MASK_6: return ((yy * xx) % 2 + (yy * xx) % 3 == 0) ? 1 : 0;
2143 case QR_MASK_7: return (((yy * xx) % 2 + (yy * xx) % 3) % 2 == 0) ? 1 : 0;
2144 case QR_MASK_8: return (((yy * xx) % 3 + (yy + xx) % 2) % 2 == 0) ? 1 : 0;
2152 s_calc_lost_point(qr_code_t* qrcode, char* dst[])
2156 /* Ʊ¿§¤Î¹Ô¡¿Îó¤ÎÎÙÀܥ⥸¥å¡¼¥ë ¥â¥¸¥å¡¼¥ë¿ô=(5+i) 3+i */
2157 point = s_count_same_module(qrcode->version,dst);
2159 /* Ʊ¿§¤Î¥â¥¸¥å¡¼¥ë¥Ö¥í¥Ã¥¯ ¥Ö¥í¥Ã¥¯¥µ¥¤¥º 2¡ß2 3 */
2160 point += s_count_same_block(qrcode->version, dst);
2162 /* ¹Ô¡¿Îó¤Ë¤ª¤±¤ë1:1:3:1:1(°Å:ÌÀ:°Å:ÌÀ:°Å)¤Î¥Ñ¥¿¡¼¥ó */
2163 point += s_count_11311_pattern(qrcode->version, dst);
2165 /* Á´ÂΤËÀê¤á¤ë°Å¥â¥¸¥å¡¼¥ë¤Î³ä¹ç 50¡Þ(5+k)%¡Á50¡Þ(5+(k+1))% 10¡ßk */
2166 point += s_count_dark_ratio(qrcode->version, dst);
2172 * Ʊ¿§¤Î¹Ô¡¿Îó¤ÎÎÙÀܥ⥸¥å¡¼¥ë ¥â¥¸¥å¡¼¥ë¿ô=(5+i)
2176 s_count_same_module(qr_ver_t ver, char* dst[])
2178 int module_count = v_module_count_table[ver];
2182 int prev_value = -1;
2184 /* ²£Êý¸þ¤Ç¥Á¥§¥Ã¥¯ */
2185 for (yy=0; yy<module_count; yy++) {
2188 for (xx=0; xx<module_count; xx++) {
2189 if (prev_value == (unsigned char)dst[yy][xx]) {
2195 if (same_count >= 5) {
2198 prev_value = (unsigned char)dst[yy][xx];
2202 /* ½ÄÊý¸þ¤Ç¥Á¥§¥Ã¥¯ */
2203 for (xx=0; xx<module_count; xx++) {
2207 for (yy=0; yy<module_count; yy++) {
2208 if (prev_value == (unsigned char)dst[yy][xx]) {
2215 if (same_count >= 5)
2218 prev_value = (unsigned char)dst[yy][xx];
2229 * Ʊ¿§¤Î¥â¥¸¥å¡¼¥ë¥Ö¥í¥Ã¥¯ ¥Ö¥í¥Ã¥¯¥µ¥¤¥º 2¡ß2
2232 s_count_same_block(qr_ver_t ver, char* dst[])
2234 int module_count = v_module_count_table[ver];
2240 for (yy = 0; yy < module_count-1; yy++) {
2241 for (xx = 0; xx < module_count-1; xx++) {
2243 if (dst[yy+0][xx+0] == '1') count++;
2244 if (dst[yy+0][xx+1] == '1') count++;
2245 if (dst[yy+1][xx+0] == '1') count++;
2246 if (dst[yy+1][xx+1] == '1') count++;
2247 if (count == 0 || count == 4) {
2256 s_count_11311_pattern(qr_ver_t ver, char* dst[])
2258 int module_count = v_module_count_table[ver];
2263 /* ²£Êý¸þ¤Î¥Á¥§¥Ã¥¯ */
2264 for (yy = 0; yy < module_count; yy++) {
2265 for (xx = 0; xx < module_count-6; xx++) {
2266 if (dst[yy][xx+0] == '1'
2267 && dst[yy][xx+1] == '0'
2268 && dst[yy][xx+2] == '1'
2269 && dst[yy][xx+3] == '1'
2270 && dst[yy][xx+4] == '1'
2271 && dst[yy][xx+5] == '0'
2272 && dst[yy][xx+6] == '1') {
2278 /* ½ÄÊý¸þ¤Î¥Á¥§¥Ã¥¯ */
2279 for (xx = 0; xx < module_count; xx++) {
2280 for (yy = 0; yy < module_count-6; yy++) {
2281 if (dst[yy+0][xx] == '1'
2282 && dst[yy+1][xx] == '0'
2283 && dst[yy+2][xx] == '1'
2284 && dst[yy+3][xx] == '1'
2285 && dst[yy+4][xx] == '1'
2286 && dst[yy+5][xx] == '0'
2287 && dst[yy+6][xx] == '1') {
2296 * Á´ÂΤËÀê¤á¤ë°Å¥â¥¸¥å¡¼¥ë¤Î³ä¹ç 50¡Þ(5+k)%¡Á50¡Þ(5+(k+1))%
2299 s_count_dark_ratio(qr_ver_t ver, char* dst[])
2301 int module_count = v_module_count_table[ver];
2305 int all_count = module_count * module_count;
2307 /* ñ¤Ë"°Å"¤ò¥«¥¦¥ó¥È¤¹¤ë */
2308 for (yy=0; yy<module_count; yy++) {
2309 for (xx=0; xx < module_count; xx++)
2310 if (dst[yy][xx] == '1')
2314 /* % ¤òµá¤á¡¢50¡ó¤«¤é¤Îº¹¤òµá¤á¤ë¡£ */
2315 ratio = (int)(((double)(dark_count) / (double)all_count)*100.0 - 50.0);
2318 /* 5%Ëè¤Ë10ÅÀ¸ºÅÀ¤Ê¤Î¤Ç¡¢¤Þ¤º5¤Ç³ä¤ë */