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++) {
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)
949 min_mask_pattern = ii;
950 min_lost_point = lost_point;
955 /*--------------------------------------------------------------------------*/
956 /* ºÇŬ¥Þ¥¹¥¯¤ÇºÆÅÙºî¤ê¤Ê¤ª¤· */
957 /*--------------------------------------------------------------------------*/
959 DBG1(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 DBG1(r,"loop to [%d]", module_count);
977 for (yy=0; yy<module_count; yy++)
981 rows = apr_psprintf(r->pool, " ");
983 for (xx=0; xx<module_count; xx++)
985 rows = apr_pstrcat(r->pool, rows, "[", apr_psprintf(r->pool, "%c", module[yy][xx]), "]", NULL);
987 DBG2(r,"%d:%s", yy,rows);
994 DBG(r,"end chxj_qr_code()");
999 chxj_qrcode_node_to_qrcode(qr_code_t* qrcode, Node* node)
1001 request_rec* r = qrcode->r;
1002 Doc* doc = qrcode->doc;
1005 for (child = qs_get_child_node(doc,node);
1007 child = qs_get_next_node(doc,child))
1009 char* name = qs_get_node_name(doc,child);
1010 if (strcasecmp("qrcode",name) == 0)
1012 qrcode->found = QR_FOUND;
1013 qrcode->mode_change = QR_NOT_CHANGE;
1014 qrcode->version = QR_VER_5;
1015 qrcode->level = QR_LEVEL_L;
1016 qrcode->mode = QR_8BIT_MODE;
1018 qrcode->indata = NULL;
1019 chxj_qrcode_node_to_qrcode(qrcode, child);
1022 if (strcasecmp("version", name) == 0)
1025 Node* cchild = qs_get_child_node(doc, child);
1029 qrcode->version = QR_VER_1;
1033 name = qs_get_node_name(doc, cchild);
1034 value = qs_get_node_value(doc, cchild);
1035 if (strcasecmp("TEXT", name) != 0)
1037 qrcode->version = QR_VER_1;
1040 if (value == NULL || strlen(value) == 0)
1042 qrcode->version = QR_VER_1;
1046 if (chxj_chk_numeric(value))
1048 qrcode->version = QR_VER_1;
1051 ver = chxj_atoi(value);
1052 if (ver <= 0 || ver > 40)
1054 qrcode->version = QR_VER_1;
1058 qrcode->version = ver - 1;
1061 if (strcasecmp("level", name) == 0)
1063 Node* cchild = qs_get_child_node(doc, child);
1067 qrcode->level = QR_LEVEL_L;
1070 name = qs_get_node_name(doc, cchild);
1071 value = qs_get_node_value(doc, cchild);
1072 if (strcasecmp("TEXT", name) != 0)
1074 qrcode->level = QR_LEVEL_L;
1078 if (value == NULL || strlen(value) == 0)
1080 qrcode->level = QR_LEVEL_L;
1084 if (strcasecmp("L", value) == 0)
1086 qrcode->level = QR_LEVEL_L;
1089 if (strcasecmp("M", value) == 0)
1091 qrcode->level = QR_LEVEL_M;
1094 if (strcasecmp("Q", value) == 0)
1096 qrcode->level = QR_LEVEL_Q;
1099 if (strcasecmp("H", value) == 0)
1101 qrcode->level = QR_LEVEL_H;
1105 qrcode->level = QR_LEVEL_L;
1109 if (strcasecmp("mode", name) == 0)
1111 Node* cchild = qs_get_child_node(doc, child);
1115 qrcode->mode = QR_NUM_MODE;
1118 name = qs_get_node_name(doc, cchild);
1119 value = qs_get_node_value(doc, cchild);
1120 if (strcasecmp("TEXT", name) != 0)
1122 qrcode->level = QR_NUM_MODE;
1125 if (value == NULL || strlen(value) == 0)
1127 qrcode->level = QR_NUM_MODE;
1131 /*----------------------------------------------------------------------*/
1133 /*----------------------------------------------------------------------*/
1134 if (strcasecmp("NUM", value) == 0)
1136 qrcode->mode = QR_NUM_MODE;
1139 /*----------------------------------------------------------------------*/
1141 /*----------------------------------------------------------------------*/
1142 if (strcasecmp("ALPHA", value) == 0)
1144 qrcode->mode = QR_ALPHA_MODE;
1147 /*----------------------------------------------------------------------*/
1148 /* 8¥Ó¥Ã¥È¥Ð¥¤¥È¥â¡¼¥É */
1149 /*----------------------------------------------------------------------*/
1150 if (strcasecmp("8BIT", value) == 0)
1152 qrcode->mode = QR_8BIT_MODE;
1155 /*----------------------------------------------------------------------*/
1157 /*----------------------------------------------------------------------*/
1158 if (strcasecmp("KANJI", value) == 0)
1160 qrcode->mode = QR_KANJI_MODE;
1164 qrcode->mode = QR_NUM_MODE;
1168 if (strcasecmp("data", name) == 0)
1170 /* TODO: ²þ¹Ô¤â²Äǽ¤Ê¤è¤¦¤Ë½¤Àµ¤¹¤ë */
1171 Node* cchild = qs_get_child_node(doc, child);
1174 qrcode->indata = apr_palloc(r->pool, 1);
1175 qrcode->indata[0] = 0;
1180 for (;cchild; cchild = cchild->next)
1182 name = qs_get_node_name(doc, cchild);
1183 value = qs_get_node_value(doc, cchild);
1184 if (strcasecmp("TEXT", name) != 0)
1188 if (strlen(qrcode->indata) > 0)
1190 qrcode->indata = apr_pstrcat(r->pool, qrcode->indata, "\r\n", NULL);
1192 qrcode->indata = apr_pstrcat(r->pool, qrcode->indata, value, NULL);
1196 if (strcasecmp("size", name) == 0)
1200 Node* cchild = qs_get_child_node(doc, child);
1207 name = qs_get_node_name(doc, cchild);
1208 value = qs_get_node_value(doc, cchild);
1209 if (strcasecmp("TEXT", name) != 0)
1214 if (value == NULL || strlen(value) == 0)
1219 if (chxj_chk_numeric(value))
1225 size = chxj_atoi(value);
1236 qrcode->size = size;
1239 #ifdef QR_CODE_DEBUG
1240 DBG1(r,"qrcode->version[%d]", qrcode->version);
1241 DBG1(r,"qrcode->level[%d]", qrcode->level);
1242 DBG1(r,"qrcode->mode[%d]", qrcode->mode);
1243 DBG1(r,"qrcode->indata[%s]", qrcode->indata);
1249 * ¥â¡¼¥É»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹.
1252 s_get_mode_spec(qr_code_t *qrcode)
1254 char* result = (char*)apr_palloc(qrcode->r->pool, 4+1);
1256 memset(result, 0, 5);
1257 memcpy(result, v_mode_table[qrcode->mode], 4);
1258 #ifdef QR_CODE_DEBUG
1259 DBG1(r,"Mode Spec[%s]", result);
1267 * ʸ»ú¿ô»Ø¼¨»Ò¤ò¼èÆÀ¤·¤Þ¤¹.
1270 s_get_char_bit_count(qr_code_t* qrcode, int len)
1272 int bit_count = v_char_count_table[qrcode->version][qrcode->mode];
1276 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1278 DBG1(qrcode->r, "len [%d]", len);
1279 if (qrcode->mode == QR_KANJI_MODE && data_capacity * 2 < len) {
1280 len = data_capacity * 2;
1283 if (qrcode->mode != QR_KANJI_MODE && data_capacity < len) {
1284 len = data_capacity;
1287 if (qrcode->mode == QR_KANJI_MODE) {
1291 DBG1(qrcode->r, "len [%d]", len);
1293 tmp = (char*)apr_palloc(qrcode->r->pool, bit_count + 1);
1294 for (ii=0; ii<bit_count; ii++) {
1295 tmp[ii] = (len & 0x01) ? '1' : '0';
1299 tmp[bit_count] = '\0';
1301 result = (char*)apr_palloc(qrcode->r->pool, bit_count+1);
1302 for (jj=0,ii=bit_count-1; ii>=0 && jj < bit_count; ii--, jj++) {
1303 result[ii] = tmp[jj];
1306 result[bit_count] = '\0';
1308 #ifdef QR_CODE_DEBUG
1309 DBG1(qrcode->r, "Character Count bit [%s]", result);
1317 * ÆþÎϥǡ¼¥¿¤«¤é¡¢£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1320 s_data_to_bin_num(qr_code_t* qrcode, int data_code_count)
1322 int len = strlen(qrcode->indata);
1331 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1333 if (data_capacity < len) {
1334 DBG(qrcode->r, "input data is too long");
1335 len = data_capacity;
1340 if (chxj_chk_numeric(qrcode->indata) != 0) {
1341 qrcode->mode_change = QR_CHANGE;
1342 qrcode->mode = QR_8BIT_MODE;
1346 result = (char*)apr_palloc(qrcode->r->pool, setn*10 + ((modn == 1) ? 4 : (modn == 2) ? 7 : 0) + 1);
1348 for (ii=0; ii<len; ii++) {
1349 tmp[ii % 3] = qrcode->indata[ii];
1350 if ((ii % 3) == 2) {
1353 for (jj=0; jj<10; jj++) {
1354 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1358 for (jj=10-1; jj>=0; jj--) {
1359 result[kk++] = tmp_bit[jj];
1367 int bb = (modn == 1) ? 4 : 7;
1369 for (jj=0; jj< bb; jj++) {
1370 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1374 tmp_bit[(modn == 1) ? 4 : 7] = 0;
1376 for (jj=bb -1; jj>=0; jj--) {
1377 result[kk++] = tmp_bit[jj];
1387 * ÆþÎϥǡ¼¥¿¤«¤é¡¢£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1390 s_data_to_bin_alpha(qr_code_t* qrcode, int data_code_count)
1392 int len = strlen(qrcode->indata);
1401 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1403 if (data_capacity < len) {
1404 DBG(qrcode->r, "input data is too long");
1405 len = data_capacity;
1410 result = (char*)apr_palloc(qrcode->r->pool, setn*11 + ((modn == 1) ? 6 : 0) + 1);
1413 for (ii=0; ii<len; ii++) {
1414 tmp[ii % 2] = qrcode->indata[ii];
1415 if ((ii % 2) == 1) {
1417 int n = s_char_to_num_alpha(qrcode,tmp[0])*45;
1419 if (qrcode->mode_change == QR_CHANGE)
1422 n += s_char_to_num_alpha(qrcode,tmp[1]);
1423 if (qrcode->mode_change == QR_CHANGE)
1426 for (jj=0; jj<11; jj++) {
1427 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1433 for (jj=11-1; jj>=0; jj--)
1434 result[kk++] = tmp_bit[jj];
1441 int n = s_char_to_num_alpha(qrcode,tmp[0]);
1443 if (qrcode->mode_change == QR_CHANGE)
1446 for (jj=0; jj< 6; jj++) {
1447 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1453 for (jj=6-1; jj>=0; jj--)
1454 result[kk++] = tmp_bit[jj];
1462 * ±Ñ¿ô»ú¥â¡¼¥É¤ÎÊä½õ´Ø¿ô.
1463 * ±Ñ¿ô»ú¤«¤é¡¢¿ôÃͤËÊÑ´¹¤·¤Þ¤¹.
1466 s_char_to_num_alpha(qr_code_t* qrcode, char src)
1479 case 'A': return 10;
1480 case 'B': return 11;
1481 case 'C': return 12;
1482 case 'D': return 13;
1483 case 'E': return 14;
1484 case 'F': return 15;
1485 case 'G': return 16;
1486 case 'H': return 17;
1487 case 'I': return 18;
1488 case 'J': return 19;
1489 case 'K': return 20;
1490 case 'L': return 21;
1491 case 'M': return 22;
1492 case 'N': return 23;
1493 case 'O': return 24;
1494 case 'P': return 25;
1495 case 'Q': return 26;
1496 case 'R': return 27;
1497 case 'S': return 28;
1498 case 'T': return 29;
1499 case 'U': return 30;
1500 case 'V': return 31;
1501 case 'W': return 32;
1502 case 'X': return 33;
1503 case 'Y': return 34;
1504 case 'Z': return 35;
1524 qrcode->mode_change = QR_CHANGE;
1525 qrcode->mode = QR_8BIT_MODE;
1532 * ÆþÎϥǡ¼¥¿¤«¤é£²¿Êʸ»úÎó¤ò¼èÆÀ¤·¤Þ¤¹.
1535 s_data_to_bin_8bit(qr_code_t* qrcode, int data_code_count)
1537 int len = strlen(qrcode->indata);
1543 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1545 if (data_capacity < len) {
1546 DBG(qrcode->r, "input data is too long");
1547 len = data_capacity;
1550 result = (char*)apr_palloc(qrcode->r->pool, len*8 + 1);
1553 for (ii=0; ii<len; ii++) {
1556 n = (int)qrcode->indata[ii];
1557 for (jj=0; jj<8; jj++) {
1558 tmp_bit[jj] = (n & 0x01) ? '1' : '0';
1564 for (jj=8-1; jj>=0; jj--)
1565 result[kk++] = tmp_bit[jj];
1569 #ifdef QR_CODE_DEBUG
1570 DBG2(qrcode->r, "input data --> 2bin result[%s] len:[%d]", result, strlen(result));
1578 * A binary character string is acquired from input data.
1581 s_data_to_bin_kanji(qr_code_t* qrcode, int data_code_count)
1583 int len = strlen(qrcode->indata);
1590 int data_capacity = v_capacity_table[qrcode->version*4+qrcode->level].size[qrcode->mode];
1592 if (data_capacity * 2 < len) {
1593 DBG(qrcode->r, "input data is too long");
1594 len = data_capacity * 2;
1597 if ((len % 2) != 0) {
1598 DBG(qrcode->r, "invalid data.");
1599 qrcode->mode_change = QR_CHANGE;
1600 qrcode->mode = QR_8BIT_MODE;
1604 result = (char*)apr_palloc(qrcode->r->pool, (len/2)*13 + 1);
1605 for (kk=0,ii=0; ii<len-1; ii++) {
1609 c = (qrcode->indata[ii+0] & 0xff)<< 8;
1610 c +=(qrcode->indata[ii+1] & 0xff);
1612 if (c >= 0x8140 && c <= 0x9FFC) {
1614 up_c = ((c >> 8) & 0xff) * 0xC0;
1620 if (c >= 0xE040 && c <= 0xEBBF) {
1622 up_c = ((c >> 8) & 0xff) * 0xC0;
1628 qrcode->mode_change = QR_CHANGE;
1629 qrcode->mode = QR_8BIT_MODE;
1633 memset(tmp_bit, 0, 13+1);
1634 for (jj=0; jj<13; jj++) {
1635 tmp_bit[jj] = (c & 0x01) ? '1' : '0';
1640 for (jj=13-1; jj>=0; jj--)
1641 result[kk++] = tmp_bit[jj];
1647 #ifdef QR_CODE_DEBUG
1648 DBG2(qrcode->r, "input data --> 2bin result[%s] len:[%d]", result, strlen(result));
1655 * 8bitŤˤ¢¤ï¤»¤Þ¤¹
1658 s_tidy_8bit_code(qr_code_t* qrcode, const char* indata, int data_code_count)
1660 int len = strlen(indata);
1667 #ifdef QR_CODE_DEBUG
1668 DBG2(qrcode->r, "len[%d] data_code_count * 8 [%d]", len, data_code_count * 8);
1671 assert (len <= data_code_count * 8);
1672 /* 8bit¤Ç³ä¤ì¤Ê¤¤¾ì¹ç¤Ï¡¢»Ä¤ê¤ò£°Ëä¤á¤·¡¢8¤Ç³ä¤ì¤ë¤è¤¦¤Ë¤¹¤ë */
1675 assert (len + n <= data_code_count * 8);
1677 tmp = (char*)apr_palloc(qrcode->r->pool, n);
1678 for (ii=0; ii<n; ii++)
1684 result = (char*)apr_palloc(qrcode->r->pool, data_code_count * 8 + 1);
1685 memset(result, 0, data_code_count * 8+ 1);
1686 memcpy(result, indata, len);
1688 memcpy(&result[len], tmp, strlen(tmp));
1690 len = strlen(result);
1691 rest = data_code_count - (len / 8);
1694 for (ii=0; ii<8; ii++)
1695 result[len++] = v_pend_bit[n][ii];
1697 n = (n == 0) ? 1 : 0;
1701 #ifdef QR_CODE_DEBUG
1702 DBG2(qrcode->r, "tidy len[%d] data_code_count[%d]", strlen(result)/8, data_code_count);
1709 * £²¿Êʸ»úÎó¤ò¥Ð¥¤¥Ê¥ê¤ËÊÑ´¹¤·¤Þ¤¹.
1712 s_str_to_bin(qr_code_t* qrcode, char* indata, int data_code_count)
1719 len = strlen(indata);
1720 result = (char*)apr_palloc(qrcode->r->pool, data_code_count);
1721 memset(result, 0, data_code_count);
1724 for (ii=0; ii<len; ii++) {
1725 result[pos] = (result[pos] << 1) | (indata[ii] - '0');
1733 * ½ÐÎÏÎΰè¤ò½é´ü²½¤·¤Þ¤¹.
1734 * °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó¡¢°ÌÃÖ¤¢¤ï¤»¡¢¥¿¥¤¥ß¥ó¥°¡¢·Á¼°¾ðÊó¤òÀßÄꤷ¡¢
1735 * ¤½¤Î¤Û¤«¤Î¾ì½ê¤Ë¤Ï¡¢-1¤òÀßÄꤷ¤Þ¤¹.
1738 s_init_modules(qr_code_t* qrcode, qr_mask_pattern_t pat, char* dst[])
1740 int module_count = v_module_count_table[qrcode->version];
1743 #ifdef QR_CODE_DEBUG
1744 DBG(qrcode->r, "start s_init_modules()");
1746 DBG(qrcode->r, "module_count[%d]", module_count);
1749 for (yy=0; yy<module_count; yy++)
1750 memset(&dst[yy][0], -1, module_count+1);
1752 s_setup_probe_position(qrcode, dst, 0, 0);
1753 s_setup_probe_position(qrcode, dst, 0, module_count - 7);
1754 s_setup_probe_position(qrcode, dst, module_count - 7, 0);
1755 s_setup_position_adjust(qrcode, dst);
1756 s_setup_timing_pattern(qrcode, dst);
1757 s_setup_type_info(qrcode,dst, pat);
1758 s_setup_version_info(qrcode, dst);
1760 #ifdef QR_CODE_DEBUG
1761 DBG(qrcode->r, "end s_init_modules()");
1767 * °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó¤È¤Ä¤¤¤Ç¤ËʬΥ¥Ñ¥¿¡¼¥ó¤Î½ÐÎÏ
1770 s_setup_probe_position(qr_code_t* qrcode, char* dst[], int pos_x, int pos_y)
1772 int module_count = v_module_count_table[qrcode->version];
1775 #ifdef QR_CODE_DEBUG
1776 DBG(qrcode->r, "start s_setup_probe_position()");
1777 DBG(qrcode->r, "module_count[%d]", module_count);
1780 for (yy=-1; yy<=7; yy++) {
1781 for (xx=-1; xx<=7; xx++) {
1782 /* °ÌÃÖ¸¡½Ð¥Ñ¥¿¡¼¥ó */
1783 if ((yy==0 || yy == 6) && xx != -1 && xx != 7) {
1784 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1785 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1786 dst[yy+pos_y][xx+pos_x] = '1';
1789 if ((xx == 0 && yy != -1 && yy != 7)
1790 || (xx >= 2 && xx <= 4 && yy >=2 && yy <= 4)
1791 || (xx == 6 && yy != -1 && yy != 7)) {
1792 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1793 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1794 dst[yy+pos_y][xx+pos_x] = '1';
1800 && yy + pos_y < module_count
1802 && xx + pos_x < module_count)
1805 && yy + pos_y < module_count
1807 && xx + pos_x < module_count)
1810 && xx + pos_x < module_count
1812 && yy + pos_y < module_count)
1814 && xx + pos_x < module_count
1817 && yy + pos_y < module_count)) {
1818 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1819 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1820 dst[yy+pos_y][xx+pos_x] = '0';
1823 if (yy != -1 && yy != 7 && xx != -1 && xx != 7) {
1824 assert(yy+pos_y >= 0 && yy+pos_y < module_count);
1825 assert(xx+pos_x >= 0 && xx+pos_x < module_count);
1826 dst[yy+pos_y][xx+pos_x] = '0';
1831 #ifdef QR_CODE_DEBUG
1832 DBG(qrcode->r, "end s_setup_probe_position()");
1836 * ¥¿¥¤¥ß¥ó¥°¥Ñ¥¿¡¼¥ó
1839 s_setup_timing_pattern(qr_code_t* qrcode, char* dst[])
1841 int module_count = v_module_count_table[qrcode->version];
1843 #ifdef QR_CODE_DEBUG
1844 DBG(qrcode->r, "start s_setup_timing_pattern()");
1845 DBG1(qrcode->r, "module_count[%d]", module_count);
1849 for (xx=8; xx < module_count-8; xx++) {
1850 if (dst[yy][xx] != -1)
1853 assert(yy >= 0 && yy < module_count);
1854 assert(xx >= 0 && xx < module_count);
1856 dst[yy][xx] = (xx % 2 == 0) ? '1' : '0';
1860 for (yy=8; yy < module_count-8; yy++) {
1861 if (dst[yy][xx] != -1)
1864 assert(yy >= 0 && yy < module_count);
1865 assert(xx >= 0 && xx < module_count);
1867 dst[yy][xx] = (yy % 2 == 0) ? '1' : '0';
1870 #ifdef QR_CODE_DEBUG
1871 DBG(qrcode->r, "start s_setup_timing_pattern()");
1876 * °ÌÃÖ¹ç¤ï¤»¥Ñ¥¿¡¼¥ó
1879 s_setup_position_adjust(qr_code_t* qrcode, char* dst[])
1881 int module_count = v_module_count_table[qrcode->version];
1882 int* pos_list = v_position_adjust_table[qrcode->version].position;
1887 #ifdef QR_CODE_DEBUG
1888 DBG(qrcode->r, "start s_setup_position_adjust()");
1891 for (yy=0; yy<7; yy++) {
1892 for (xx=0; xx<7; xx++) {
1896 if (mxx == 0 || myy == 0)
1899 if (dst[myy][mxx] != -1)
1902 for (dyy = -2; dyy <= 2; dyy++) {
1903 for (dxx= -2; dxx <= 2; dxx++) {
1908 || (dyy == 0 && dxx == 0)) {
1909 assert(myy+dyy >= 0);
1910 assert(myy+dyy < module_count);
1911 dst[myy+dyy][mxx+dxx] = '1';
1914 assert(myy+dyy >= 0);
1915 assert(myy+dyy < module_count);
1916 dst[myy+dyy][mxx+dxx] = '0';
1923 #ifdef QR_CODE_DEBUG
1924 DBG(qrcode->r, "end s_setup_position_adjust()");
1929 s_setup_type_info(qr_code_t* qrcode, char* dst[], qr_mask_pattern_t pat)
1931 int module_count = v_module_count_table[qrcode->version];
1939 #ifdef QR_CODE_DEBUG
1940 DBG(qrcode->r, "start s_setup_type_info()");
1941 DBG1(qrcode->r, "module_count[%d]", module_count);
1944 /* ·Á¼°¾ðÊó¥Ç¡¼¥¿¤ÎÀ¸À® */
1945 switch(qrcode->level) {
1946 case QR_LEVEL_L: sdata = 0x01 << 3; break;
1947 case QR_LEVEL_M: sdata = 0x00 << 3; break;
1948 case QR_LEVEL_Q: sdata = 0x03 << 3; break;
1949 case QR_LEVEL_H: sdata = 0x02 << 3; break;
1956 /* G(x)=x10+x8+x5+x4+x2+x+1 */
1965 gfmask = (0x01 << 14) | (0x01 << 12) | (0x01 << 10) | (0x01 << 4) | (0x01 << 1);
1968 typedata = sdata << 10;
1969 while (s_get_bit_count(typedata) - s_get_bit_count(gf) >= 0) {
1970 typedata ^= (gf << (s_get_bit_count(typedata) - s_get_bit_count(gf)));
1972 typedata = (sdata << 10 | typedata);
1976 for (yy=0; yy<6; yy++) {
1977 assert(yy >= 0 && yy < module_count);
1978 dst[yy][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1981 for (; yy<8; yy++) {
1982 assert(yy + 1 >= 0 && yy + 1 < module_count);
1983 dst[yy+1][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1986 for (; yy<15; yy++) {
1987 assert(module_count - 15 + yy >= 0 && module_count - 15 + yy < module_count);
1988 dst[module_count - 15 + yy][8] = (((typedata >> yy) & 0x01) == 1) ? '1' : '0';
1991 for (xx = 0; xx < 8; xx++) {
1992 assert(module_count - xx -1 >= 0 && module_count - xx - 1 < module_count);
1993 dst[8][module_count - xx - 1] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
1996 for (; xx<9; xx++) {
1997 assert(15 - xx >= 0 && 15 - xx < module_count);
1998 dst[8][15 - xx] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
2001 for (; xx<15; xx++) {
2002 assert(15 - xx - 1 >= 0 && 15 - xx - 1 < module_count);
2003 dst[8][15 - xx - 1] = (((typedata >> xx) & 0x01) == 1) ? '1' : '0';
2006 assert(module_count - 8 >= 0 && module_count - 8 < module_count);
2007 dst[module_count - 8][8] = '1';
2009 #ifdef QR_CODE_DEBUG
2010 DBG(qrcode->r, "start s_setup_type_info()");
2015 s_get_bit_count(int data)
2029 s_setup_version_info(qr_code_t* qrcode, char* dst[])
2031 char* bits = v_version_info_table[qrcode->version].bits;
2032 int module_count = v_module_count_table[qrcode->version];
2037 /* ¥Ð¡¼¥¸¥ç¥ó£·°Ê¹ß¤Î¤ßÂÐ¾Ý */
2041 /* ±¦¾å¤Î·¿ÈÖ¾ðÊó¤ÎÇÛÃÖ */
2042 for (xx=0; xx<strlen(bits); xx++) {
2043 dst[(int)((double)xx/3.0)][(xx % 3) + module_count - 8 - 3] = bits[xx];
2046 /* º¸²¼¤Î·¿ÈÖ¾ðÊó¤ÎÇÛÃÖ */
2047 for (yy=0; yy<strlen(bits); yy++) {
2048 dst[(yy % 3) + module_count - 8 - 3][(int)((double)yy/3.0)] = bits[yy];
2053 s_map_data(qr_code_t* qrcode,
2055 unsigned char* indata, int data_count,qr_mask_pattern_t pat)
2057 int module_count = v_module_count_table[qrcode->version];
2058 int inc_yy_flag = -1;
2066 #ifdef QR_CODE_DEBUG
2067 DBG(qrcode->r, "start s_map_data()");
2068 DBG1(qrcode->r, "module_count[%d]", module_count);
2069 DBG1(qrcode->r, "data_count[%d]", data_count);
2074 yy = module_count - 1;
2076 for (xx = module_count - 1; xx > 0 ; xx -= 2) {
2081 for (ii=0; ii < 2; ii++) {
2082 if (dst[yy][xx - ii] != -1)
2083 /* ´û¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç */
2086 if (in_pos < data_count) {
2087 assert(yy >= 0 && yy < module_count);
2088 assert(xx-ii >= 0 && xx-ii < module_count);
2090 dst[yy][xx-ii] = (((indata[in_pos] >> now_bit) & 0x01) == 1) ? '1' : '0';
2091 mask = s_get_mask(pat, yy, xx - ii);
2093 if (dst[yy][xx-ii] == '1') {
2094 dst[yy][xx-ii] = '0';
2097 dst[yy][xx-ii] = '1';
2101 if (--now_bit < 0) {
2108 } while (yy >= 0 && yy < module_count) ;
2111 inc_yy_flag = -inc_yy_flag;
2115 for (yy=0; yy<module_count; yy++) {
2116 for (xx=0; xx<module_count; xx++) {
2117 if (dst[yy][xx] == -1) {
2119 mask = s_get_mask(pat, yy, xx);
2126 #ifdef QR_CODE_DEBUG
2127 DBG(qrcode->r, "end s_map_data()");
2132 s_get_mask(qr_mask_pattern_t pat, int yy, int xx)
2135 case QR_MASK_1: return ((yy + xx) % 2 == 0) ? 1 : 0;
2136 case QR_MASK_2: return (yy % 2 == 0) ? 1 : 0;
2137 case QR_MASK_3: return (xx % 3 == 0) ? 1 : 0;
2138 case QR_MASK_4: return ((yy + xx) % 3 == 0) ? 1 : 0;
2139 case QR_MASK_5: return (((yy / 2) + (xx / 3)) % 2 == 0) ? 1 : 0;
2140 case QR_MASK_6: return ((yy * xx) % 2 + (yy * xx) % 3 == 0) ? 1 : 0;
2141 case QR_MASK_7: return (((yy * xx) % 2 + (yy * xx) % 3) % 2 == 0) ? 1 : 0;
2142 case QR_MASK_8: return (((yy * xx) % 3 + (yy + xx) % 2) % 2 == 0) ? 1 : 0;
2150 s_calc_lost_point(qr_code_t* qrcode, char* dst[])
2154 /* Ʊ¿§¤Î¹Ô¡¿Îó¤ÎÎÙÀܥ⥸¥å¡¼¥ë ¥â¥¸¥å¡¼¥ë¿ô=(5+i) 3+i */
2155 point = s_count_same_module(qrcode->version,dst);
2157 /* Ʊ¿§¤Î¥â¥¸¥å¡¼¥ë¥Ö¥í¥Ã¥¯ ¥Ö¥í¥Ã¥¯¥µ¥¤¥º 2¡ß2 3 */
2158 point += s_count_same_block(qrcode->version, dst);
2160 /* ¹Ô¡¿Îó¤Ë¤ª¤±¤ë1:1:3:1:1(°Å:ÌÀ:°Å:ÌÀ:°Å)¤Î¥Ñ¥¿¡¼¥ó */
2161 point += s_count_11311_pattern(qrcode->version, dst);
2163 /* Á´ÂΤËÀê¤á¤ë°Å¥â¥¸¥å¡¼¥ë¤Î³ä¹ç 50¡Þ(5+k)%¡Á50¡Þ(5+(k+1))% 10¡ßk */
2164 point += s_count_dark_ratio(qrcode->version, dst);
2170 * Ʊ¿§¤Î¹Ô¡¿Îó¤ÎÎÙÀܥ⥸¥å¡¼¥ë ¥â¥¸¥å¡¼¥ë¿ô=(5+i)
2174 s_count_same_module(qr_ver_t ver, char* dst[])
2176 int module_count = v_module_count_table[ver];
2180 int prev_value = -1;
2182 /* ²£Êý¸þ¤Ç¥Á¥§¥Ã¥¯ */
2183 for (yy=0; yy<module_count; yy++) {
2186 for (xx=0; xx<module_count; xx++) {
2187 if (prev_value == (unsigned char)dst[yy][xx]) {
2193 if (same_count >= 5) {
2196 prev_value = (unsigned char)dst[yy][xx];
2200 /* ½ÄÊý¸þ¤Ç¥Á¥§¥Ã¥¯ */
2201 for (xx=0; xx<module_count; xx++) {
2205 for (yy=0; yy<module_count; yy++) {
2206 if (prev_value == (unsigned char)dst[yy][xx]) {
2213 if (same_count >= 5)
2216 prev_value = (unsigned char)dst[yy][xx];
2227 * Ʊ¿§¤Î¥â¥¸¥å¡¼¥ë¥Ö¥í¥Ã¥¯ ¥Ö¥í¥Ã¥¯¥µ¥¤¥º 2¡ß2
2230 s_count_same_block(qr_ver_t ver, char* dst[])
2232 int module_count = v_module_count_table[ver];
2238 for (yy = 0; yy < module_count-1; yy++) {
2239 for (xx = 0; xx < module_count-1; xx++) {
2241 if (dst[yy+0][xx+0] == '1') count++;
2242 if (dst[yy+0][xx+1] == '1') count++;
2243 if (dst[yy+1][xx+0] == '1') count++;
2244 if (dst[yy+1][xx+1] == '1') count++;
2245 if (count == 0 || count == 4) {
2254 s_count_11311_pattern(qr_ver_t ver, char* dst[])
2256 int module_count = v_module_count_table[ver];
2261 /* ²£Êý¸þ¤Î¥Á¥§¥Ã¥¯ */
2262 for (yy = 0; yy < module_count; yy++) {
2263 for (xx = 0; xx < module_count-6; xx++) {
2264 if (dst[yy][xx+0] == '1'
2265 && dst[yy][xx+1] == '0'
2266 && dst[yy][xx+2] == '1'
2267 && dst[yy][xx+3] == '1'
2268 && dst[yy][xx+4] == '1'
2269 && dst[yy][xx+5] == '0'
2270 && dst[yy][xx+6] == '1') {
2276 /* ½ÄÊý¸þ¤Î¥Á¥§¥Ã¥¯ */
2277 for (xx = 0; xx < module_count; xx++) {
2278 for (yy = 0; yy < module_count-6; yy++) {
2279 if (dst[yy+0][xx] == '1'
2280 && dst[yy+1][xx] == '0'
2281 && dst[yy+2][xx] == '1'
2282 && dst[yy+3][xx] == '1'
2283 && dst[yy+4][xx] == '1'
2284 && dst[yy+5][xx] == '0'
2285 && dst[yy+6][xx] == '1') {
2294 * Á´ÂΤËÀê¤á¤ë°Å¥â¥¸¥å¡¼¥ë¤Î³ä¹ç 50¡Þ(5+k)%¡Á50¡Þ(5+(k+1))%
2297 s_count_dark_ratio(qr_ver_t ver, char* dst[])
2299 int module_count = v_module_count_table[ver];
2303 int all_count = module_count * module_count;
2305 /* ñ¤Ë"°Å"¤ò¥«¥¦¥ó¥È¤¹¤ë */
2306 for (yy=0; yy<module_count; yy++) {
2307 for (xx=0; xx < module_count; xx++)
2308 if (dst[yy][xx] == '1')
2312 /* % ¤òµá¤á¡¢50¡ó¤«¤é¤Îº¹¤òµá¤á¤ë¡£ */
2313 ratio = (int)(((double)(dark_count) / (double)all_count)*100.0 - 50.0);
2316 /* 5%Ëè¤Ë10ÅÀ¸ºÅÀ¤Ê¤Î¤Ç¡¢¤Þ¤º5¤Ç³ä¤ë */