blob: f0837240252e284a9d320beeee11702ee2d60a51 [file] [log] [blame]
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08001#include <string.h>
2
3#include "qrencode.h"
4
5typedef enum
6{
7 FALSE = 0,
8 TRUE = !FALSE
9} bool;
10
11typedef unsigned char BYTE;
12typedef unsigned int WORD;
13
14#define QR_LEVEL_L 0
15#define QR_LEVEL_M 1
16#define QR_LEVEL_Q 2
17#define QR_LEVEL_H 3
18
19#define QR_MODE_NUMERAL 0
20#define QR_MODE_ALPHABET 1
21#define QR_MODE_8BIT 2
22
23#define QR_VRESION_S 0
24#define QR_VRESION_M 1
25#define QR_VRESION_L 2
26
27#define MAX_ALLCODEWORD 172 //733Êǰ汾16ÐèÒªµÄ×î´ó¿Õ¼ä
28#define MAX_DATACODEWORD 136 //589Êǰ汾16ÐèÒªµÄ×î´ó¿Õ¼ä
29#define MAX_CODEBLOCK 153
30
31/////////////////////////////////////////////////////////////////////////////
32
33struct RS_BLOCKINFO
34{
35 int ncRSBlock;
36 int ncAllCodeWord;
37 int ncDataCodeWord;
38};
39
40struct QR_VERSIONINFO
41{
42 int nVersionNo;
43 int ncAllCodeWord;
44
45 int ncDataCodeWord[4];
46 int ncAlignPoint;
47 int nAlignPoint[6];
48
49 struct RS_BLOCKINFO RS_BlockInfo1[4];
50 struct RS_BLOCKINFO RS_BlockInfo2[4];
51};
52
53static const struct QR_VERSIONINFO QR_VersonInfo[] = {{0}, // Ver.0
54 {
55 1, // Ver.1
56 26, 19, 16, 13, 9,
57 0, 0, 0, 0, 0, 0, 0,
58 1, 26, 19,
59 1, 26, 16,
60 1, 26, 13,
61 1, 26, 9,
62 0, 0, 0,
63 0, 0, 0,
64 0, 0, 0,
65 0, 0, 0
66 },
67 {
68 2, // Ver.2
69 44, 34, 28, 22, 16,
70 1, 18, 0, 0, 0, 0, 0,
71 1, 44, 34,
72 1, 44, 28,
73 1, 44, 22,
74 1, 44, 16,
75 0, 0, 0,
76 0, 0, 0,
77 0, 0, 0,
78 0, 0, 0
79 },
80 {
81 3, // Ver.3
82 70, 55, 44, 34, 26,
83 1, 22, 0, 0, 0, 0, 0,
84 1, 70, 55,
85 1, 70, 44,
86 2, 35, 17,
87 2, 35, 13,
88 0, 0, 0,
89 0, 0, 0,
90 0, 0, 0,
91 0, 0, 0
92 },
93 {
94 4, // Ver.4
95 100, 80, 64, 48, 36,
96 1, 26, 0, 0, 0, 0, 0,
97 1, 100, 80,
98 2, 50, 32,
99 2, 50, 24,
100 4, 25, 9,
101 0, 0, 0,
102 0, 0, 0,
103 0, 0, 0,
104 0, 0, 0
105 },
106 {
107 5, // Ver.5
108 134, 108, 86, 62, 46,
109 1, 30, 0, 0, 0, 0, 0,
110 1, 134, 108,
111 2, 67, 43,
112 2, 33, 15,
113 2, 33, 11,
114 0, 0, 0,
115 0, 0, 0,
116 2, 34, 16,
117 2, 34, 12
118 },
119 {
120 6, // Ver.6
121 172, 136, 108, 76, 60,
122 1, 34, 0, 0, 0, 0, 0,
123 2, 86, 68,
124 4, 43, 27,
125 4, 43, 19,
126 4, 43, 15,
127 0, 0, 0,
128 0, 0, 0,
129 0, 0, 0,
130 0, 0, 0
131 },
132};
133
134
135/////////////////////////////////////////////////////////////////////////////
136static const BYTE byExpToInt[] = { 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38,
137 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192,
138 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35,
139 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161,
140 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240,
141 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226,
142 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206,
143 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204,
144 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84,
145 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115,
146 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255,
147 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65,
148 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166,
149 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9,
150 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22,
151 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 1
152 };
153
154
155/////////////////////////////////////////////////////////////////////////////
156static const BYTE byIntToExp[] = { 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75,
157 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113,
158 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69,
159 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166,
160 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136,
161 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64,
162 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61,
163 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87,
164 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24,
165 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46,
166 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97,
167 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162,
168 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246,
169 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90,
170 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215,
171 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175
172 };
173
174
175/////////////////////////////////////////////////////////////////////////////
176static const BYTE byRSExp7[] = {87, 229, 146, 149, 238, 102, 21};
177static const BYTE byRSExp10[] = {251, 67, 46, 61, 118, 70, 64, 94, 32, 45};
178static const BYTE byRSExp13[] = { 74, 152, 176, 100, 86, 100, 106, 104, 130, 218, 206, 140, 78};
179static const BYTE byRSExp15[] = { 8, 183, 61, 91, 202, 37, 51, 58, 58, 237, 140, 124, 5, 99, 105};
180static const BYTE byRSExp16[] = {120, 104, 107, 109, 102, 161, 76, 3, 91, 191, 147, 169, 182, 194, 225, 120};
181static const BYTE byRSExp17[] = { 43, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136};
182static const BYTE byRSExp18[] = {215, 234, 158, 94, 184, 97, 118, 170, 79, 187, 152, 148, 252, 179, 5, 98, 96, 153};
183static const BYTE byRSExp20[] = { 17, 60, 79, 50, 61, 163, 26, 187, 202, 180, 221, 225, 83, 239, 156, 164, 212, 212, 188, 190};
184static const BYTE byRSExp22[] = {210, 171, 247, 242, 93, 230, 14, 109, 221, 53, 200, 74, 8, 172, 98, 80, 219, 134, 160, 105,
185 165, 231
186 };
187static const BYTE byRSExp24[] = {229, 121, 135, 48, 211, 117, 251, 126, 159, 180, 169, 152, 192, 226, 228, 218, 111, 0, 117, 232,
188 87, 96, 227, 21
189 };
190static const BYTE byRSExp26[] = {173, 125, 158, 2, 103, 182, 118, 17, 145, 201, 111, 28, 165, 53, 161, 21, 245, 142, 13, 102,
191 48, 227, 153, 145, 218, 70
192 };
193static const BYTE byRSExp28[] = {168, 223, 200, 104, 224, 234, 108, 180, 110, 190, 195, 147, 205, 27, 232, 201, 21, 43, 245, 87,
194 42, 195, 212, 119, 242, 37, 9, 123
195 };
196static const BYTE byRSExp30[] = { 41, 173, 145, 152, 216, 31, 179, 182, 50, 48, 110, 86, 239, 96, 222, 125, 42, 173, 226, 193,
197 224, 130, 156, 37, 251, 216, 238, 40, 192, 180
198 };
199static const BYTE byRSExp32[] = { 10, 6, 106, 190, 249, 167, 4, 67, 209, 138, 138, 32, 242, 123, 89, 27, 120, 185, 80, 156,
200 38, 69, 171, 60, 28, 222, 80, 52, 254, 185, 220, 241
201 };
202static const BYTE byRSExp34[] = {111, 77, 146, 94, 26, 21, 108, 19, 105, 94, 113, 193, 86, 140, 163, 125, 58, 158, 229, 239,
203 218, 103, 56, 70, 114, 61, 183, 129, 167, 13, 98, 62, 129, 51
204 };
205static const BYTE byRSExp36[] = {200, 183, 98, 16, 172, 31, 246, 234, 60, 152, 115, 0, 167, 152, 113, 248, 238, 107, 18, 63,
206 218, 37, 87, 210, 105, 177, 120, 74, 121, 196, 117, 251, 113, 233, 30, 120
207 };
208static const BYTE byRSExp38[] = {159, 34, 38, 228, 230, 59, 243, 95, 49, 218, 176, 164, 20, 65, 45, 111, 39, 81, 49, 118,
209 113, 222, 193, 250, 242, 168, 217, 41, 164, 247, 177, 30, 238, 18, 120, 153, 60, 193
210 };
211static const BYTE byRSExp40[] = { 59, 116, 79, 161, 252, 98, 128, 205, 128, 161, 247, 57, 163, 56, 235, 106, 53, 26, 187, 174,
212 226, 104, 170, 7, 175, 35, 181, 114, 88, 41, 47, 163, 125, 134, 72, 20, 232, 53, 35, 15
213 };
214static const BYTE byRSExp42[] = {250, 103, 221, 230, 25, 18, 137, 231, 0, 3, 58, 242, 221, 191, 110, 84, 230, 8, 188, 106,
215 96, 147, 15, 131, 139, 34, 101, 223, 39, 101, 213, 199, 237, 254, 201, 123, 171, 162, 194, 117,
216 50, 96
217 };
218static const BYTE byRSExp44[] = {190, 7, 61, 121, 71, 246, 69, 55, 168, 188, 89, 243, 191, 25, 72, 123, 9, 145, 14, 247,
219 1, 238, 44, 78, 143, 62, 224, 126, 118, 114, 68, 163, 52, 194, 217, 147, 204, 169, 37, 130,
220 113, 102, 73, 181
221 };
222static const BYTE byRSExp46[] = {112, 94, 88, 112, 253, 224, 202, 115, 187, 99, 89, 5, 54, 113, 129, 44, 58, 16, 135, 216,
223 169, 211, 36, 1, 4, 96, 60, 241, 73, 104, 234, 8, 249, 245, 119, 174, 52, 25, 157, 224,
224 43, 202, 223, 19, 82, 15
225 };
226static const BYTE byRSExp48[] = {228, 25, 196, 130, 211, 146, 60, 24, 251, 90, 39, 102, 240, 61, 178, 63, 46, 123, 115, 18,
227 221, 111, 135, 160, 182, 205, 107, 206, 95, 150, 120, 184, 91, 21, 247, 156, 140, 238, 191, 11,
228 94, 227, 84, 50, 163, 39, 34, 108
229 };
230static const BYTE byRSExp50[] = {232, 125, 157, 161, 164, 9, 118, 46, 209, 99, 203, 193, 35, 3, 209, 111, 195, 242, 203, 225,
231 46, 13, 32, 160, 126, 209, 130, 160, 242, 215, 242, 75, 77, 42, 189, 32, 113, 65, 124, 69,
232 228, 114, 235, 175, 124, 170, 215, 232, 133, 205
233 };
234static const BYTE byRSExp52[] = {116, 50, 86, 186, 50, 220, 251, 89, 192, 46, 86, 127, 124, 19, 184, 233, 151, 215, 22, 14,
235 59, 145, 37, 242, 203, 134, 254, 89, 190, 94, 59, 65, 124, 113, 100, 233, 235, 121, 22, 76,
236 86, 97, 39, 242, 200, 220, 101, 33, 239, 254, 116, 51
237 };
238static const BYTE byRSExp54[] = {183, 26, 201, 87, 210, 221, 113, 21, 46, 65, 45, 50, 238, 184, 249, 225, 102, 58, 209, 218,
239 109, 165, 26, 95, 184, 192, 52, 245, 35, 254, 238, 175, 172, 79, 123, 25, 122, 43, 120, 108,
240 215, 80, 128, 201, 235, 8, 153, 59, 101, 31, 198, 76, 31, 156
241 };
242static const BYTE byRSExp56[] = {106, 120, 107, 157, 164, 216, 112, 116, 2, 91, 248, 163, 36, 201, 202, 229, 6, 144, 254, 155,
243 135, 208, 170, 209, 12, 139, 127, 142, 182, 249, 177, 174, 190, 28, 10, 85, 239, 184, 101, 124,
244 152, 206, 96, 23, 163, 61, 27, 196, 247, 151, 154, 202, 207, 20, 61, 10
245 };
246static const BYTE byRSExp58[] = { 82, 116, 26, 247, 66, 27, 62, 107, 252, 182, 200, 185, 235, 55, 251, 242, 210, 144, 154, 237,
247 176, 141, 192, 248, 152, 249, 206, 85, 253, 142, 65, 165, 125, 23, 24, 30, 122, 240, 214, 6,
248 129, 218, 29, 145, 127, 134, 206, 245, 117, 29, 41, 63, 159, 142, 233, 125, 148, 123
249 };
250static const BYTE byRSExp60[] = {107, 140, 26, 12, 9, 141, 243, 197, 226, 197, 219, 45, 211, 101, 219, 120, 28, 181, 127, 6,
251 100, 247, 2, 205, 198, 57, 115, 219, 101, 109, 160, 82, 37, 38, 238, 49, 160, 209, 121, 86,
252 11, 124, 30, 181, 84, 25, 194, 87, 65, 102, 190, 220, 70, 27, 209, 16, 89, 7, 33, 240
253 };
254static const BYTE byRSExp62[] = { 65, 202, 113, 98, 71, 223, 248, 118, 214, 94, 0, 122, 37, 23, 2, 228, 58, 121, 7, 105,
255 135, 78, 243, 118, 70, 76, 223, 89, 72, 50, 70, 111, 194, 17, 212, 126, 181, 35, 221, 117,
256 235, 11, 229, 149, 147, 123, 213, 40, 115, 6, 200, 100, 26, 246, 182, 218, 127, 215, 36, 186,
257 110, 106
258 };
259static const BYTE byRSExp64[] = { 45, 51, 175, 9, 7, 158, 159, 49, 68, 119, 92, 123, 177, 204, 187, 254, 200, 78, 141, 149,
260 119, 26, 127, 53, 160, 93, 199, 212, 29, 24, 145, 156, 208, 150, 218, 209, 4, 216, 91, 47,
261 184, 146, 47, 140, 195, 195, 125, 242, 238, 63, 99, 108, 140, 230, 242, 31, 204, 11, 178, 243,
262 217, 156, 213, 231
263 };
264static const BYTE byRSExp66[] = { 5, 118, 222, 180, 136, 136, 162, 51, 46, 117, 13, 215, 81, 17, 139, 247, 197, 171, 95, 173,
265 65, 137, 178, 68, 111, 95, 101, 41, 72, 214, 169, 197, 95, 7, 44, 154, 77, 111, 236, 40,
266 121, 143, 63, 87, 80, 253, 240, 126, 217, 77, 34, 232, 106, 50, 168, 82, 76, 146, 67, 106,
267 171, 25, 132, 93, 45, 105
268 };
269static const BYTE byRSExp68[] = {247, 159, 223, 33, 224, 93, 77, 70, 90, 160, 32, 254, 43, 150, 84, 101, 190, 205, 133, 52,
270 60, 202, 165, 220, 203, 151, 93, 84, 15, 84, 253, 173, 160, 89, 227, 52, 199, 97, 95, 231,
271 52, 177, 41, 125, 137, 241, 166, 225, 118, 2, 54, 32, 82, 215, 175, 198, 43, 238, 235, 27,
272 101, 184, 127, 3, 5, 8, 163, 238
273 };
274
275static const BYTE* byRSExp[] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, byRSExp7, NULL, NULL,
276 byRSExp10, NULL, NULL, byRSExp13, NULL, byRSExp15, byRSExp16, byRSExp17, byRSExp18, NULL,
277 byRSExp20, NULL, byRSExp22, NULL, byRSExp24, NULL, byRSExp26, NULL, byRSExp28, NULL,
278 byRSExp30, NULL, byRSExp32, NULL, byRSExp34, NULL, byRSExp36, NULL, byRSExp38, NULL,
279 byRSExp40, NULL, byRSExp42, NULL, byRSExp44, NULL, byRSExp46, NULL, byRSExp48, NULL,
280 byRSExp50, NULL, byRSExp52, NULL, byRSExp54, NULL, byRSExp56, NULL, byRSExp58, NULL,
281 byRSExp60, NULL, byRSExp62, NULL, byRSExp64, NULL, byRSExp66, NULL, byRSExp68
282 };
283
284static const int nIndicatorLenNumeral[] = {10, 12, 14};
285static const int nIndicatorLenAlphabet[] = { 9, 11, 13};
286static const int nIndicatorLen8Bit[] = { 8, 16, 16};
287
288static int m_ncDataCodeWordBit;
289static BYTE m_byDataCodeWord[MAX_DATACODEWORD];
290
291static int m_ncDataBlock;
292static BYTE m_byBlockMode[MAX_DATACODEWORD];
293static int m_nBlockLength[MAX_DATACODEWORD];
294
295static int m_ncAllCodeWord;
296static BYTE m_byAllCodeWord[MAX_ALLCODEWORD];
297static BYTE m_byRSWork[MAX_CODEBLOCK];
298
299static int m_nLevel;
300static int m_nVersion;
301static int m_nMaskingNo;
302
303int m_nSymbleSize;
304BYTE m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE];
305
306#define min(a,b) (((a) < (b)) ? (a) : (b))
307
308static bool IsNumeralData(unsigned char c)
309{
310 if(c >= '0' && c <= '9')
311 return TRUE;
312
313 return FALSE;
314}
315
316static bool IsAlphabetData(unsigned char c)
317{
318 if(c >= '0' && c <= '9')
319 return TRUE;
320
321 if(c >= 'A' && c <= 'Z')
322 return TRUE;
323
324 if(c == ' ' || c == '$' || c == '%' || c == '*' || c == '+' || c == '-' || c == '.'
325 || c == '/' || c == ':')
326 return TRUE;
327
328 return FALSE;
329}
330
331static BYTE AlphabetToBinaly(BYTE c)
332{
333 if(c >= '0' && c <= '9') return (BYTE)(c - '0');
334
335 if(c >= 'A' && c <= 'Z') return (BYTE)(c - 'A' + 10);
336
337 if(c == ' ') return 36;
338
339 if(c == '$') return 37;
340
341 if(c == '%') return 38;
342
343 if(c == '*') return 39;
344
345 if(c == '+') return 40;
346
347 if(c == '-') return 41;
348
349 if(c == '.') return 42;
350
351 if(c == '/') return 43;
352
353 return 44;
354}
355static int GetBitLength(BYTE nMode, int ncData, int nVerGroup)
356{
357 int ncBits = 0;
358
359 switch(nMode)
360 {
361 case QR_MODE_NUMERAL:
362 ncBits = 4 + nIndicatorLenNumeral[nVerGroup] + (10 * (ncData / 3));
363 switch(ncData % 3)
364 {
365 case 1:
366 ncBits += 4;
367 break;
368 case 2:
369 ncBits += 7;
370 break;
371 default:
372 break;
373 }
374
375 break;
376
377 case QR_MODE_ALPHABET:
378 ncBits = 4 + nIndicatorLenAlphabet[nVerGroup] + (11 * (ncData / 2)) + (6 * (ncData % 2));
379 break;
380
381 case QR_MODE_8BIT:
382 ncBits = 4 + nIndicatorLen8Bit[nVerGroup] + (8 * ncData);
383 break;
384
385 default:
386 break;
387 }
388
389 return ncBits;
390}
391
392static int SetBitStream(int nIndex, WORD wData, int ncData)
393{
394 int i;
395
396 if(nIndex == -1 || nIndex + ncData > MAX_DATACODEWORD * 8)
397 return -1;
398
399 for(i = 0; i < ncData; ++i)
400 {
401 if(wData & (1 << (ncData - i - 1)))
402 {
403 m_byDataCodeWord[(nIndex + i) / 8] |= 1 << (7 - ((nIndex + i) % 8));
404 }
405 }
406
407 return nIndex + ncData;
408}
409
410static void GetRSCodeWord(BYTE* lpbyRSWork, int ncDataCodeWord, int ncRSCodeWord)
411{
412 int i, j;
413
414 for(i = 0; i < ncDataCodeWord ; ++i)
415 {
416 if(lpbyRSWork[0] != 0)
417 {
418 BYTE nExpFirst = byIntToExp[lpbyRSWork[0]];
419
420 for(j = 0; j < ncRSCodeWord; ++j)
421 {
422 BYTE nExpElement = (BYTE)(((int)(byRSExp[ncRSCodeWord][j] + nExpFirst)) % 255);
423
424 lpbyRSWork[j] = (BYTE)(lpbyRSWork[j + 1] ^ byExpToInt[nExpElement]);
425 }
426
427 for(j = ncRSCodeWord; j < ncDataCodeWord + ncRSCodeWord - 1; ++j)
428 lpbyRSWork[j] = lpbyRSWork[j + 1];
429 }
430 else
431 {
432 for(j = 0; j < ncDataCodeWord + ncRSCodeWord - 1; ++j)
433 lpbyRSWork[j] = lpbyRSWork[j + 1];
434 }
435 }
436}
437
438static void SetAlignmentPattern(int x, int y)
439{
440 static BYTE byPattern[] = {0x1f,
441 0x11,
442 0x15,
443 0x11,
444 0x1f
445 };
446 int i, j;
447
448 if(m_byModuleData[x][y] & 0x20)
449 return;
450
451 x -= 2; y -= 2;
452
453 for(i = 0; i < 5; ++i)
454 {
455 for(j = 0; j < 5; ++j)
456 {
457 m_byModuleData[x + j][y + i] = (byPattern[i] & (1 << (4 - j))) ? '\x30' : '\x20';
458 }
459 }
460}
461static void SetFinderPattern(int x, int y)
462{
463 static BYTE byPattern[] = {0x7f,
464 0x41,
465 0x5d,
466 0x5d,
467 0x5d,
468 0x41,
469 0x7f
470 };
471 int i, j;
472
473 for(i = 0; i < 7; ++i)
474 {
475 for(j = 0; j < 7; ++j)
476 {
477 m_byModuleData[x + j][y + i] = (byPattern[i] & (1 << (6 - j))) ? '\x30' : '\x20';
478 }
479 }
480}
481
482static void SetVersionPattern(void)
483{
484 int i, j;
485 int nVerData;
486
487 if(m_nVersion <= 6)
488 return;
489
490 nVerData = m_nVersion << 12;
491
492 for(i = 0; i < 6; ++i)
493 {
494 if(nVerData & (1 << (17 - i)))
495 {
496 nVerData ^= (0x1f25 << (5 - i));
497 }
498 }
499
500 nVerData += m_nVersion << 12;
501
502 for(i = 0; i < 6; ++i)
503 {
504 for(j = 0; j < 3; ++j)
505 {
506 m_byModuleData[m_nSymbleSize - 11 + j][i] = m_byModuleData[i][m_nSymbleSize - 11 + j] =
507 (nVerData & (1 << (i * 3 + j))) ? '\x30' : '\x20';
508 }
509 }
510}
511
512static void SetCodeWordPattern(void)
513{
514 int x = m_nSymbleSize;
515 int y = m_nSymbleSize - 1;
516
517 int nCoef_x = 1;
518 int nCoef_y = 1;
519
520 int i, j;
521
522 for(i = 0; i < m_ncAllCodeWord; ++i)
523 {
524 for(j = 0; j < 8; ++j)
525 {
526 do
527 {
528 x += nCoef_x;
529 nCoef_x *= -1;
530
531 if(nCoef_x < 0)
532 {
533 y += nCoef_y;
534
535 if(y < 0 || y == m_nSymbleSize)
536 {
537 y = (y < 0) ? 0 : m_nSymbleSize - 1;
538 nCoef_y *= -1;
539
540 x -= 2;
541
542 if(x == 6)
543 --x;
544 }
545 }
546 }
547 while(m_byModuleData[x][y] & 0x20);
548
549 m_byModuleData[x][y] = (m_byAllCodeWord[i] & (1 << (7 - j))) ? '\x02' : '\x00';
550 }
551 }
552}
553
554static void SetMaskingPattern(int nPatternNo)
555{
556 int i, j;
557
558 for(i = 0; i < m_nSymbleSize; ++i)
559 {
560 for(j = 0; j < m_nSymbleSize; ++j)
561 {
562 if(!(m_byModuleData[j][i] & 0x20))
563 {
564 bool bMask;
565
566 switch(nPatternNo)
567 {
568 case 0:
569 bMask = (bool)((i + j) % 2 == 0);
570 break;
571
572 case 1:
573 bMask = (bool)(i % 2 == 0);
574 break;
575
576 case 2:
577 bMask = (bool)(j % 3 == 0);
578 break;
579
580 case 3:
581 bMask = (bool)((i + j) % 3 == 0);
582 break;
583
584 case 4:
585 bMask = (bool)(((i / 2) + (j / 3)) % 2 == 0);
586 break;
587
588 case 5:
589 bMask = (bool)(((i * j) % 2) + ((i * j) % 3) == 0);
590 break;
591
592 case 6:
593 bMask = (bool)((((i * j) % 2) + ((i * j) % 3)) % 2 == 0);
594 break;
595
596 default:
597 bMask = (bool)((((i * j) % 3) + ((i + j) % 2)) % 2 == 0);
598 break;
599 }
600
601 m_byModuleData[j][i] = (BYTE)((m_byModuleData[j][i] & 0xfe) | (((
602 m_byModuleData[j][i] & 0x02) > 1) ^ bMask));
603 }
604 }
605 }
606}
607
608static void SetFormatInfoPattern(int nPatternNo)
609{
610 int nFormatInfo;
611 int i;
612 int nFormatData;
613
614 switch(m_nLevel)
615 {
616 case QR_LEVEL_M:
617 nFormatInfo = 0x00;
618 break;
619
620 case QR_LEVEL_L:
621 nFormatInfo = 0x08;
622 break;
623
624 case QR_LEVEL_Q:
625 nFormatInfo = 0x18;
626 break;
627
628 default:
629 nFormatInfo = 0x10;
630 break;
631 }
632
633 nFormatInfo += nPatternNo;
634
635 nFormatData = nFormatInfo << 10;
636
637 for(i = 0; i < 5; ++i)
638 {
639 if(nFormatData & (1 << (14 - i)))
640 {
641 nFormatData ^= (0x0537 << (4 - i));
642 }
643 }
644
645 nFormatData += nFormatInfo << 10;
646
647 nFormatData ^= 0x5412;
648
649 for(i = 0; i <= 5; ++i)
650 m_byModuleData[8][i] = (nFormatData & (1 << i)) ? '\x30' : '\x20';
651
652 m_byModuleData[8][7] = (nFormatData & (1 << 6)) ? '\x30' : '\x20';
653 m_byModuleData[8][8] = (nFormatData & (1 << 7)) ? '\x30' : '\x20';
654 m_byModuleData[7][8] = (nFormatData & (1 << 8)) ? '\x30' : '\x20';
655
656 for(i = 9; i <= 14; ++i)
657 m_byModuleData[14 - i][8] = (nFormatData & (1 << i)) ? '\x30' : '\x20';
658
659 for(i = 0; i <= 7; ++i)
660 m_byModuleData[m_nSymbleSize - 1 - i][8] = (nFormatData & (1 << i)) ? '\x30' : '\x20';
661
662 m_byModuleData[8][m_nSymbleSize - 8] = '\x30';
663
664 for(i = 8; i <= 14; ++i)
665 m_byModuleData[8][m_nSymbleSize - 15 + i] = (nFormatData & (1 << i)) ? '\x30' : '\x20';
666}
667
668static int CountPenalty(void)
669{
670 int nPenalty = 0;
671 int i, j, k;
672 int nCount = 0, s_nCount;
673
674 for(i = 0; i < m_nSymbleSize; ++i)
675 {
676 for(j = 0; j < m_nSymbleSize - 4; ++j)
677 {
678 int nCount = 1;
679
680 for(k = j + 1; k < m_nSymbleSize; k++)
681 {
682 if(((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i][k] & 0x11) == 0))
683 ++nCount;
684 else
685 break;
686 }
687
688 if(nCount >= 5)
689 {
690 nPenalty += 3 + (nCount - 5);
691 }
692
693 j = k - 1;
694 }
695 }
696
697 for(i = 0; i < m_nSymbleSize; ++i)
698 {
699 for(j = 0; j < m_nSymbleSize - 4; ++j)
700 {
701 int nCount = 1;
702
703 for(k = j + 1; k < m_nSymbleSize; k++)
704 {
705 if(((m_byModuleData[j][i] & 0x11) == 0) == ((m_byModuleData[k][i] & 0x11) == 0))
706 ++nCount;
707 else
708 break;
709 }
710
711 if(nCount >= 5)
712 {
713 nPenalty += 3 + (nCount - 5);
714 }
715
716 j = k - 1;
717 }
718 }
719
720 for(i = 0; i < m_nSymbleSize - 1; ++i)
721 {
722 for(j = 0; j < m_nSymbleSize - 1; ++j)
723 {
724 if((((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i + 1][j] & 0x11) == 0)) &&
725 (((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i] [j + 1] & 0x11) == 0)) &&
726 (((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i + 1][j + 1] & 0x11) == 0)))
727 {
728 nPenalty += 3;
729 }
730 }
731 }
732
733 for(i = 0; i < m_nSymbleSize; ++i)
734 {
735 for(j = 0; j < m_nSymbleSize - 6; ++j)
736 {
737 if(((j == 0) || (!(m_byModuleData[i][j - 1] & 0x11))) && // Ã÷»ò·ûºÅÍâ
738 (m_byModuleData[i][j] & 0x11) && // °µ - 1
739 (!(m_byModuleData[i][j + 1] & 0x11)) && // Ã÷ - 1
740 (m_byModuleData[i][j + 2] & 0x11) && // °µ ©´
741 (m_byModuleData[i][j + 3] & 0x11) && // °µ ©¦3
742 (m_byModuleData[i][j + 4] & 0x11) && // °µ ©¼
743 (!(m_byModuleData[i][j + 5] & 0x11)) && // Ã÷ - 1
744 (m_byModuleData[i][j + 6] & 0x11) && // °µ - 1
745 ((j == m_nSymbleSize - 7) || (!(m_byModuleData[i][j + 7] & 0x11)))) // Ã÷»ò·ûºÅÍâ
746 {
747 if(((j < 2 || !(m_byModuleData[i][j - 2] & 0x11)) &&
748 (j < 3 || !(m_byModuleData[i][j - 3] & 0x11)) &&
749 (j < 4 || !(m_byModuleData[i][j - 4] & 0x11))) ||
750 ((j >= m_nSymbleSize - 8 || !(m_byModuleData[i][j + 8] & 0x11)) &&
751 (j >= m_nSymbleSize - 9 || !(m_byModuleData[i][j + 9] & 0x11)) &&
752 (j >= m_nSymbleSize - 10 || !(m_byModuleData[i][j + 10] & 0x11))))
753 {
754 nPenalty += 40;
755 }
756 }
757 }
758 }
759
760 for(i = 0; i < m_nSymbleSize; ++i)
761 {
762 for(j = 0; j < m_nSymbleSize - 6; ++j)
763 {
764 if(((j == 0) || (!(m_byModuleData[j - 1][i] & 0x11))) && // Ã÷»ò·ûºÅÍâ
765 (m_byModuleData[j] [i] & 0x11) && // °µ - 1
766 (!(m_byModuleData[j + 1][i] & 0x11)) && // Ã÷ - 1
767 (m_byModuleData[j + 2][i] & 0x11) && // °µ ©´
768 (m_byModuleData[j + 3][i] & 0x11) && // °µ ©¦3
769 (m_byModuleData[j + 4][i] & 0x11) && // °µ ©¼
770 (!(m_byModuleData[j + 5][i] & 0x11)) && // Ã÷ - 1
771 (m_byModuleData[j + 6][i] & 0x11) && // °µ - 1
772 ((j == m_nSymbleSize - 7) || (!(m_byModuleData[j + 7][i] & 0x11)))) // Ã÷»ò·ûºÅÍâ
773 {
774 if(((j < 2 || !(m_byModuleData[j - 2][i] & 0x11)) &&
775 (j < 3 || !(m_byModuleData[j - 3][i] & 0x11)) &&
776 (j < 4 || !(m_byModuleData[j - 4][i] & 0x11))) ||
777 ((j >= m_nSymbleSize - 8 || !(m_byModuleData[j + 8][i] & 0x11)) &&
778 (j >= m_nSymbleSize - 9 || !(m_byModuleData[j + 9][i] & 0x11)) &&
779 (j >= m_nSymbleSize - 10 || !(m_byModuleData[j + 10][i] & 0x11))))
780 {
781 nPenalty += 40;
782 }
783 }
784 }
785 }
786
787 for(i = 0; i < m_nSymbleSize; ++i)
788 {
789 for(j = 0; j < m_nSymbleSize; ++j)
790 {
791 if(!(m_byModuleData[i][j] & 0x11))
792 {
793 ++nCount;
794 }
795 }
796 }
797
798 if((50 - ((nCount * 100) / (m_nSymbleSize * m_nSymbleSize))) > 0)
799 s_nCount = 50 - ((nCount * 100) / (m_nSymbleSize * m_nSymbleSize));
800 else
801 s_nCount = 0 - (50 - ((nCount * 100) / (m_nSymbleSize * m_nSymbleSize)));
802 nPenalty += (s_nCount / 5) * 10;
803
804 return nPenalty;
805}
806
807static bool EncodeSourceData(char* lpsSource, int ncLength, int nVerGroup)
808{
809 int i, j;
810 int ncSrcBits, ncDstBits;
811 int nBlock = 0;
812 int ncComplete = 0;
813 WORD wBinCode;
814
815 memset(m_nBlockLength, 0, sizeof(m_nBlockLength));
816
817 for(m_ncDataBlock = i = 0; i < ncLength; ++i)
818 {
819 BYTE byMode;
820
821 if(IsNumeralData(lpsSource[i]))
822 byMode = QR_MODE_NUMERAL;
823 else if(IsAlphabetData(lpsSource[i]))
824 byMode = QR_MODE_ALPHABET;
825 else
826 byMode = QR_MODE_8BIT;
827
828 if(i == 0)
829 m_byBlockMode[0] = byMode;
830
831 if(m_byBlockMode[m_ncDataBlock] != byMode)
832 m_byBlockMode[++m_ncDataBlock] = byMode;
833
834 ++m_nBlockLength[m_ncDataBlock];
835 }
836
837 ++m_ncDataBlock;
838
839 while(nBlock < m_ncDataBlock - 1)
840 {
841 int ncJoinFront, ncJoinBehind;
842 int nJoinPosition = 0;
843
844 if((m_byBlockMode[nBlock] == QR_MODE_NUMERAL
845 && m_byBlockMode[nBlock + 1] == QR_MODE_ALPHABET) ||
846 (m_byBlockMode[nBlock] == QR_MODE_ALPHABET
847 && m_byBlockMode[nBlock + 1] == QR_MODE_NUMERAL))
848 {
849 ncSrcBits = GetBitLength(m_byBlockMode[nBlock], m_nBlockLength[nBlock], nVerGroup) +
850 GetBitLength(m_byBlockMode[nBlock + 1], m_nBlockLength[nBlock + 1], nVerGroup);
851
852 ncDstBits = GetBitLength(QR_MODE_ALPHABET,
853 m_nBlockLength[nBlock] + m_nBlockLength[nBlock + 1], nVerGroup);
854
855 if(ncSrcBits > ncDstBits)
856 {
857 if(nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_8BIT)
858 {
859 ncJoinFront = GetBitLength(QR_MODE_8BIT,
860 m_nBlockLength[nBlock - 1] + m_nBlockLength[nBlock], nVerGroup) +
861 GetBitLength(m_byBlockMode[nBlock + 1], m_nBlockLength[nBlock + 1], nVerGroup);
862
863 if(ncJoinFront > ncDstBits + GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock - 1],
864 nVerGroup))
865 ncJoinFront = 0;
866 }
867 else
868 ncJoinFront = 0;
869
870 if(nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_8BIT)
871 {
872 ncJoinBehind = GetBitLength(m_byBlockMode[nBlock], m_nBlockLength[nBlock], nVerGroup) +
873 GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock + 1] + m_nBlockLength[nBlock + 2],
874 nVerGroup);
875
876 if(ncJoinBehind > ncDstBits + GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock + 2],
877 nVerGroup))
878 ncJoinBehind = 0;
879 }
880 else
881 ncJoinBehind = 0;
882
883 if(ncJoinFront != 0 && ncJoinBehind != 0)
884 {
885 nJoinPosition = (ncJoinFront < ncJoinBehind) ? -1 : 1;
886 }
887 else
888 {
889 nJoinPosition = (ncJoinFront != 0) ? -1 : ((ncJoinBehind != 0) ? 1 : 0);
890 }
891
892 if(nJoinPosition != 0)
893 {
894 if(nJoinPosition == -1)
895 {
896 m_nBlockLength[nBlock - 1] += m_nBlockLength[nBlock];
897
898 for(i = nBlock; i < m_ncDataBlock - 1; ++i)
899 {
900 m_byBlockMode[i] = m_byBlockMode[i + 1];
901 m_nBlockLength[i] = m_nBlockLength[i + 1];
902 }
903 }
904 else
905 {
906 m_byBlockMode[nBlock + 1] = QR_MODE_8BIT;
907 m_nBlockLength[nBlock + 1] += m_nBlockLength[nBlock + 2];
908
909 for(i = nBlock + 2; i < m_ncDataBlock - 1; ++i)
910 {
911 m_byBlockMode[i] = m_byBlockMode[i + 1];
912 m_nBlockLength[i] = m_nBlockLength[i + 1];
913 }
914 }
915
916 --m_ncDataBlock;
917 }
918 else
919 {
920 if(nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_ALPHABET)
921 {
922 m_nBlockLength[nBlock + 1] += m_nBlockLength[nBlock + 2];
923
924 for(i = nBlock + 2; i < m_ncDataBlock - 1; ++i)
925 {
926 m_byBlockMode[i] = m_byBlockMode[i + 1];
927 m_nBlockLength[i] = m_nBlockLength[i + 1];
928 }
929
930 --m_ncDataBlock;
931 }
932
933 m_byBlockMode[nBlock] = QR_MODE_ALPHABET;
934 m_nBlockLength[nBlock] += m_nBlockLength[nBlock + 1];
935
936 for(i = nBlock + 1; i < m_ncDataBlock - 1; ++i)
937 {
938 m_byBlockMode[i] = m_byBlockMode[i + 1];
939 m_nBlockLength[i] = m_nBlockLength[i + 1];
940 }
941
942 --m_ncDataBlock;
943
944 if(nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_ALPHABET)
945 {
946 m_nBlockLength[nBlock - 1] += m_nBlockLength[nBlock];
947
948 for(i = nBlock; i < m_ncDataBlock - 1; ++i)
949 {
950 m_byBlockMode[i] = m_byBlockMode[i + 1];
951 m_nBlockLength[i] = m_nBlockLength[i + 1];
952 }
953
954 --m_ncDataBlock;
955 }
956 }
957
958 continue;
959 }
960 }
961
962 ++nBlock;
963 }
964
965 nBlock = 0;
966
967 while(nBlock < m_ncDataBlock - 1)
968 {
969 ncSrcBits = GetBitLength(m_byBlockMode[nBlock], m_nBlockLength[nBlock], nVerGroup)
970 + GetBitLength(m_byBlockMode[nBlock + 1], m_nBlockLength[nBlock + 1], nVerGroup);
971
972 ncDstBits = GetBitLength(QR_MODE_8BIT,
973 m_nBlockLength[nBlock] + m_nBlockLength[nBlock + 1], nVerGroup);
974
975 if(nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_8BIT)
976 ncDstBits -= (4 + nIndicatorLen8Bit[nVerGroup]);
977
978 if(nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_8BIT)
979 ncDstBits -= (4 + nIndicatorLen8Bit[nVerGroup]);
980
981 if(ncSrcBits > ncDstBits)
982 {
983 if(nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_8BIT)
984 {
985 m_nBlockLength[nBlock - 1] += m_nBlockLength[nBlock];
986
987 for(i = nBlock; i < m_ncDataBlock - 1; ++i)
988 {
989 m_byBlockMode[i] = m_byBlockMode[i + 1];
990 m_nBlockLength[i] = m_nBlockLength[i + 1];
991 }
992
993 --m_ncDataBlock;
994 --nBlock;
995 }
996
997 if(nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_8BIT)
998 {
999 m_nBlockLength[nBlock + 1] += m_nBlockLength[nBlock + 2];
1000
1001 for(i = nBlock + 2; i < m_ncDataBlock - 1; ++i)
1002 {
1003 m_byBlockMode[i] = m_byBlockMode[i + 1];
1004 m_nBlockLength[i] = m_nBlockLength[i + 1];
1005 }
1006
1007 --m_ncDataBlock;
1008 }
1009
1010 m_byBlockMode[nBlock] = QR_MODE_8BIT;
1011 m_nBlockLength[nBlock] += m_nBlockLength[nBlock + 1];
1012
1013 for(i = nBlock + 1; i < m_ncDataBlock - 1; ++i)
1014 {
1015 m_byBlockMode[i] = m_byBlockMode[i + 1];
1016 m_nBlockLength[i] = m_nBlockLength[i + 1];
1017 }
1018
1019 --m_ncDataBlock;
1020
1021 if(nBlock >= 1)
1022 --nBlock;
1023
1024 continue;
1025 }
1026
1027 ++nBlock;
1028 }
1029
1030 m_ncDataCodeWordBit = 0;
1031
1032 memset(m_byDataCodeWord, 0, MAX_DATACODEWORD);
1033
1034 for(i = 0; i < m_ncDataBlock && m_ncDataCodeWordBit != -1; ++i)
1035 {
1036 if(m_byBlockMode[i] == QR_MODE_NUMERAL)
1037 {
1038 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 1, 4);
1039
1040 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (WORD)m_nBlockLength[i],
1041 nIndicatorLenNumeral[nVerGroup]);
1042
1043 for(j = 0; j < m_nBlockLength[i]; j += 3)
1044 {
1045 if(j < m_nBlockLength[i] - 2)
1046 {
1047 wBinCode = (WORD)(((lpsSource[ncComplete + j] - '0') * 100) +
1048 ((lpsSource[ncComplete + j + 1] - '0') * 10) +
1049 (lpsSource[ncComplete + j + 2] - '0'));
1050
1051 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 10);
1052 }
1053 else if(j == m_nBlockLength[i] - 2)
1054 {
1055 wBinCode = (WORD)(((lpsSource[ncComplete + j] - '0') * 10) +
1056 (lpsSource[ncComplete + j + 1] - '0'));
1057
1058 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 7);
1059 }
1060 else if(j == m_nBlockLength[i] - 1)
1061 {
1062 wBinCode = (WORD)(lpsSource[ncComplete + j] - '0');
1063
1064 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 4);
1065 }
1066 }
1067
1068 ncComplete += m_nBlockLength[i];
1069 }
1070
1071 else if(m_byBlockMode[i] == QR_MODE_ALPHABET)
1072 {
1073 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 2, 4);
1074
1075 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (WORD)m_nBlockLength[i],
1076 nIndicatorLenAlphabet[nVerGroup]);
1077
1078 for(j = 0; j < m_nBlockLength[i]; j += 2)
1079 {
1080 if(j < m_nBlockLength[i] - 1)
1081 {
1082 wBinCode = (WORD)((AlphabetToBinaly(lpsSource[ncComplete + j]) * 45) +
1083 AlphabetToBinaly(lpsSource[ncComplete + j + 1]));
1084
1085 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 11);
1086 }
1087 else
1088 {
1089 wBinCode = (WORD)AlphabetToBinaly(lpsSource[ncComplete + j]);
1090
1091 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 6);
1092 }
1093 }
1094
1095 ncComplete += m_nBlockLength[i];
1096 }
1097
1098 else if(m_byBlockMode[i] == QR_MODE_8BIT)
1099 {
1100 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 4, 4);
1101
1102 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (WORD)m_nBlockLength[i],
1103 nIndicatorLen8Bit[nVerGroup]);
1104
1105 for(j = 0; j < m_nBlockLength[i]; ++j)
1106 {
1107 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (WORD)lpsSource[ncComplete + j],
1108 8);
1109 }
1110
1111 ncComplete += m_nBlockLength[i];
1112 }
1113 }
1114
1115 return (bool)(m_ncDataCodeWordBit != -1);
1116}
1117
1118static int GetEncodeVersion(int nVersion, char* lpsSource, int ncLength)
1119{
1120 int nVerGroup = nVersion >= 27 ? QR_VRESION_L : (nVersion >= 10 ? QR_VRESION_M :
1121 QR_VRESION_S);
1122 int i, j;
1123
1124 for(i = nVerGroup; i <= QR_VRESION_L; ++i)
1125 {
1126 if(EncodeSourceData(lpsSource, ncLength, i))
1127 {
1128 if(i == QR_VRESION_S)
1129 {
1130 for(j = 1; j <= 9; ++j)
1131 {
1132 if((m_ncDataCodeWordBit + 7) / 8 <= QR_VersonInfo[j].ncDataCodeWord[m_nLevel])
1133 return j;
1134 }
1135 }
1136 else if(i == QR_VRESION_M)
1137 {
1138 for(j = 10; j <= 26; ++j)
1139 {
1140 if((m_ncDataCodeWordBit + 7) / 8 <= QR_VersonInfo[j].ncDataCodeWord[m_nLevel])
1141 return j;
1142 }
1143 }
1144 else if(i == QR_VRESION_L)
1145 {
1146 for(j = 27; j <= 40; ++j)
1147 {
1148 if((m_ncDataCodeWordBit + 7) / 8 <= QR_VersonInfo[j].ncDataCodeWord[m_nLevel])
1149 return j;
1150 }
1151 }
1152 }
1153 }
1154 return 0;
1155}
1156
1157static void SetFunctionModule(void)
1158{
1159 int i, j;
1160
1161 SetFinderPattern(0, 0);
1162 SetFinderPattern(m_nSymbleSize - 7, 0);
1163 SetFinderPattern(0, m_nSymbleSize - 7);
1164
1165 for(i = 0; i < 8; ++i)
1166 {
1167 m_byModuleData[i][7] = m_byModuleData[7][i] = '\x20';
1168 m_byModuleData[m_nSymbleSize - 8][i] = m_byModuleData[m_nSymbleSize - 8 + i][7] = '\x20';
1169 m_byModuleData[i][m_nSymbleSize - 8] = m_byModuleData[7][m_nSymbleSize - 8 + i] = '\x20';
1170 }
1171
1172 for(i = 0; i < 9; ++i)
1173 {
1174 m_byModuleData[i][8] = m_byModuleData[8][i] = '\x20';
1175 }
1176
1177 for(i = 0; i < 8; ++i)
1178 {
1179 m_byModuleData[m_nSymbleSize - 8 + i][8] = m_byModuleData[8][m_nSymbleSize - 8 + i] =
1180 '\x20';
1181 }
1182
1183 SetVersionPattern();
1184
1185 for(i = 0; i < QR_VersonInfo[m_nVersion].ncAlignPoint; ++i)
1186 {
1187 SetAlignmentPattern(QR_VersonInfo[m_nVersion].nAlignPoint[i], 6);
1188 SetAlignmentPattern(6, QR_VersonInfo[m_nVersion].nAlignPoint[i]);
1189
1190 for(j = 0; j < QR_VersonInfo[m_nVersion].ncAlignPoint; ++j)
1191 {
1192 SetAlignmentPattern(QR_VersonInfo[m_nVersion].nAlignPoint[i],
1193 QR_VersonInfo[m_nVersion].nAlignPoint[j]);
1194 }
1195 }
1196
1197 for(i = 8; i <= m_nSymbleSize - 9; ++i)
1198 {
1199 m_byModuleData[i][6] = (i % 2) == 0 ? '\x30' : '\x20';
1200 m_byModuleData[6][i] = (i % 2) == 0 ? '\x30' : '\x20';
1201 }
1202}
1203
1204static void FormatModule(void)
1205{
1206 int i, j;
1207 int nMinPenalty, nPenalty;
1208
1209 memset(m_byModuleData, 0, sizeof(m_byModuleData));
1210
1211 SetFunctionModule();
1212
1213 SetCodeWordPattern();
1214
1215 if(m_nMaskingNo == -1)
1216 {
1217 m_nMaskingNo = 0;
1218
1219 SetMaskingPattern(m_nMaskingNo);
1220 SetFormatInfoPattern(m_nMaskingNo);
1221
1222 nMinPenalty = CountPenalty();
1223
1224 for(i = 1; i <= 7; ++i)
1225 {
1226 SetMaskingPattern(i);
1227 SetFormatInfoPattern(i);
1228
1229 nPenalty = CountPenalty();
1230
1231 if(nPenalty < nMinPenalty)
1232 {
1233 nMinPenalty = nPenalty;
1234 m_nMaskingNo = i;
1235 }
1236 }
1237 }
1238
1239 SetMaskingPattern(m_nMaskingNo);
1240 SetFormatInfoPattern(m_nMaskingNo);
1241
1242 for(i = 0; i < m_nSymbleSize; ++i)
1243 {
1244 for(j = 0; j < m_nSymbleSize; ++j)
1245 {
1246 m_byModuleData[i][j] = (BYTE)((m_byModuleData[i][j] & 0x11) != 0);
1247 }
1248 }
1249}
1250
1251int QRencode(char* lpsSource, char* qr)
1252{
1253 int i, j, nVersion=2, bAutoExtent=1;
1254 int ncLength, nEncodeVersion, ncDataCodeWord, ncTerminater;
1255 BYTE byPaddingCode = 0xec;
1256 int nDataCwIndex = 0, ncBlock1, ncBlock2, ncBlockSum;
1257 int nBlockNo = 0, ncDataCw1, ncDataCw2;
1258 int ncRSCw1, ncRSCw2;
1259
1260 m_nLevel = QR_LEVEL_M;
1261 m_nMaskingNo = 0;
1262
1263 ncLength = strlen(lpsSource);
1264 if(ncLength == 0)
1265 return -1;
1266
1267 nEncodeVersion = GetEncodeVersion(nVersion, lpsSource, ncLength);
1268 if(nEncodeVersion == 0)
1269 return -1;
1270
1271 if(nVersion == 0)
1272 {
1273 m_nVersion = nEncodeVersion;
1274 }
1275 else
1276 {
1277 if(nEncodeVersion <= nVersion)
1278 {
1279 m_nVersion = nVersion;
1280 }
1281 else
1282 {
1283 if(bAutoExtent)
1284 m_nVersion = nEncodeVersion;
1285 else
1286 return -1;
1287 }
1288 }
1289
1290 ncDataCodeWord = QR_VersonInfo[m_nVersion].ncDataCodeWord[m_nLevel];
1291
1292 ncTerminater = min(4, (ncDataCodeWord * 8) - m_ncDataCodeWordBit);
1293
1294 if(ncTerminater > 0)
1295 m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 0, ncTerminater);
1296
1297 for(i = (m_ncDataCodeWordBit + 7) / 8; i < ncDataCodeWord; ++i)
1298 {
1299 m_byDataCodeWord[i] = byPaddingCode;
1300
1301 byPaddingCode = (BYTE)(byPaddingCode == 0xec ? 0x11 : 0xec);
1302 }
1303
1304 m_ncAllCodeWord = QR_VersonInfo[m_nVersion].ncAllCodeWord;
1305 memset(m_byAllCodeWord, 0, m_ncAllCodeWord);
1306
1307 ncBlock1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[m_nLevel].ncRSBlock;
1308 ncBlock2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[m_nLevel].ncRSBlock;
1309 ncBlockSum = ncBlock1 + ncBlock2;
1310
1311 ncDataCw1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[m_nLevel].ncDataCodeWord;
1312 ncDataCw2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[m_nLevel].ncDataCodeWord;
1313
1314 for(i = 0; i < ncBlock1; ++i)
1315 {
1316 for(j = 0; j < ncDataCw1; ++j)
1317 {
1318 m_byAllCodeWord[(ncBlockSum * j) + nBlockNo] = m_byDataCodeWord[nDataCwIndex++];
1319 }
1320
1321 ++nBlockNo;
1322 }
1323
1324 for(i = 0; i < ncBlock2; ++i)
1325 {
1326 for(j = 0; j < ncDataCw2; ++j)
1327 {
1328 if(j < ncDataCw1)
1329 {
1330 m_byAllCodeWord[(ncBlockSum * j) + nBlockNo] = m_byDataCodeWord[nDataCwIndex++];
1331 }
1332 else
1333 {
1334 m_byAllCodeWord[(ncBlockSum * ncDataCw1) + i] = m_byDataCodeWord[nDataCwIndex++];
1335 }
1336 }
1337
1338 ++nBlockNo;
1339 }
1340
1341 ncRSCw1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[m_nLevel].ncAllCodeWord - ncDataCw1;
1342 ncRSCw2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[m_nLevel].ncAllCodeWord - ncDataCw2;
1343
1344 nDataCwIndex = 0;
1345 nBlockNo = 0;
1346
1347 for(i = 0; i < ncBlock1; ++i)
1348 {
1349 memset(m_byRSWork, 0, sizeof(m_byRSWork));
1350
1351 memmove(m_byRSWork, m_byDataCodeWord + nDataCwIndex, ncDataCw1);
1352
1353 GetRSCodeWord(m_byRSWork, ncDataCw1, ncRSCw1);
1354
1355 for(j = 0; j < ncRSCw1; ++j)
1356 {
1357 m_byAllCodeWord[ncDataCodeWord + (ncBlockSum * j) + nBlockNo] = m_byRSWork[j];
1358 }
1359
1360 nDataCwIndex += ncDataCw1;
1361 ++nBlockNo;
1362 }
1363
1364 for(i = 0; i < ncBlock2; ++i)
1365 {
1366 memset(m_byRSWork, 0, sizeof(m_byRSWork));
1367
1368 memmove(m_byRSWork, m_byDataCodeWord + nDataCwIndex, ncDataCw2);
1369
1370 GetRSCodeWord(m_byRSWork, ncDataCw2, ncRSCw2);
1371
1372 for(j = 0; j < ncRSCw2; ++j)
1373 {
1374 m_byAllCodeWord[ncDataCodeWord + (ncBlockSum * j) + nBlockNo] = m_byRSWork[j];
1375 }
1376
1377 nDataCwIndex += ncDataCw2;
1378 ++nBlockNo;
1379 }
1380
1381 m_nSymbleSize = m_nVersion * 4 + 17;
1382
1383 FormatModule();
1384
1385 //64x64
1386 // for (i = 0; i < MAX_MODULESIZE; i++) {
1387 // for (j = 0; j < MAX_MODULESIZE; j++) {
1388 // n_byModuleData[i*2][j*2] = m_byModuleData[i][j];
1389 // n_byModuleData[i*2][j*2+1] = m_byModuleData[i][j];
1390 // }
1391 // memcpy(n_byModuleData[i*2+1], n_byModuleData[i*2], MAX_MODULESIZE*2);
1392 // }
1393 // for (i = 0; i < MAX_MODULESIZE2; i++) {
1394 // for (j = 0; j < (MAX_MODULESIZE2/8); j++) {
1395 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] = n_byModuleData[i][j*8 + 0] << 7;
1396 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 1] << 6;
1397 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 2] << 5;
1398 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 3] << 4;
1399 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 4] << 3;
1400 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 5] << 2;
1401 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 6] << 1;
1402 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 7];
1403 // }
1404 // if (j == MAX_MODULESIZE2/8) {
1405 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] = n_byModuleData[i][j*8 + 0] << 7;
1406 // qr[i * (MAX_MODULESIZE2/8 + 1) + j] |= n_byModuleData[i][j*8 + 1] << 6;
1407 // }
1408 // }
1409
1410 //48x48
1411 // for (i = 0; i < MAX_MODULESIZE; i++) {
1412 // qr[i * ((MAX_MODULESIZE-1)/8 + 1)] = m_byModuleData[i][0];
1413 // for (j = 1; j < ((MAX_MODULESIZE-1)/8 + 1); j++) {
1414 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] = m_byModuleData[i][(j-1)*8 + 1] << 7;
1415 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] |= m_byModuleData[i][(j-1)*8 + 2] << 6;
1416 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] |= m_byModuleData[i][(j-1)*8 + 3] << 5;
1417 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] |= m_byModuleData[i][(j-1)*8 + 4] << 4;
1418 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] |= m_byModuleData[i][(j-1)*8 + 5] << 3;
1419 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] |= m_byModuleData[i][(j-1)*8 + 6] << 2;
1420 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] |= m_byModuleData[i][(j-1)*8 + 7] << 1;
1421 // qr[i * ((MAX_MODULESIZE-1)/8 + 1) + j] |= m_byModuleData[i][(j-1)*8 + 8];
1422 // }
1423 // }
1424 // for (i = 0; i < 7; i++) {
1425 // for (j = 0; j < (MAX_MODULESIZE-1)/8 + 1; j++) {
1426 // qr[MAX_MODULESIZE * 6 + i + j] = 0;
1427 // }
1428 // }
1429
1430 //32x32
1431 // for (i = 0; i < MAX_MODULESIZE; i++) {
1432 // for (j = 0; j < (MAX_MODULESIZE/8); j++) {
1433 // qr[i * (MAX_MODULESIZE/8 + 1) + j] = m_byModuleData[i][j*8 + 0] << 7;
1434 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 1] << 6;
1435 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 2] << 5;
1436 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 3] << 4;
1437 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 4] << 3;
1438 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 5] << 2;
1439 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 6] << 1;
1440 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 7];
1441 // }
1442 // if (j == MAX_MODULESIZE/8) {
1443 // qr[i * (MAX_MODULESIZE/8 + 1) + j] = m_byModuleData[i][j*8 + 0] << 7;
1444 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 1] << 6;
1445 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 2] << 5;
1446 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 3] << 4;
1447 // qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 4] << 3;
1448 // }
1449 // }
1450 //40x40
1451 if(qr)
1452 {
1453 for(i = 0; i < MAX_MODULESIZE; i++)
1454 {
1455 for(j = 0; j < (MAX_MODULESIZE/8); j++)
1456 {
1457 qr[i * (MAX_MODULESIZE/8 + 1) + j] = m_byModuleData[i][j*8 + 0] << 7;
1458 qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 1] << 6;
1459 qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 2] << 5;
1460 qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 3] << 4;
1461 qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 4] << 3;
1462 qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 5] << 2;
1463 qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 6] << 1;
1464 qr[i * (MAX_MODULESIZE/8 + 1) + j] |= m_byModuleData[i][j*8 + 7];
1465 }
1466 if(j == MAX_MODULESIZE/8)
1467 {
1468 qr[i * (MAX_MODULESIZE/8 + 1) + j] = m_byModuleData[i][j*8 + 0] << 7;
1469 }
1470 }
1471 }
1472 return 1;
1473}
1474