|
@@ -0,0 +1,293 @@
|
|
1
|
+--- a/configure.ac
|
|
2
|
|
|
3
|
+@@ -58,9 +58,6 @@
|
|
4
|
+ [build_tools=$withval], [build_tools=yes])
|
|
5
|
+
|
|
6
|
+ AM_CONDITIONAL(BUILD_TOOLS, [test "x$build_tools" = "xyes" ])
|
|
7
|
+-if test x$build_tools = xyes ; then
|
|
8
|
+- PKG_CHECK_MODULES(png, "libpng")
|
|
9
|
+-fi
|
|
10
|
+
|
|
11
|
+ dnl --with-tests
|
|
12
|
+ AC_ARG_WITH([tests], [AS_HELP_STRING([--with-tests], [build tests [default=no]])],
|
|
13
|
+--- a/qrenc.c
|
|
14
|
|
|
15
|
+@@ -25,7 +25,6 @@
|
|
16
|
+ #include <stdio.h>
|
|
17
|
+ #include <stdlib.h>
|
|
18
|
+ #include <string.h>
|
|
19
|
+-#include <png.h>
|
|
20
|
+ #include <getopt.h>
|
|
21
|
+
|
|
22
|
+ #include "qrencode.h"
|
|
23
|
+@@ -49,7 +48,6 @@
|
|
24
|
+ static int verbose = 0;
|
|
25
|
+
|
|
26
|
+ enum imageType {
|
|
27
|
+- PNG_TYPE,
|
|
28
|
+ EPS_TYPE,
|
|
29
|
+ SVG_TYPE,
|
|
30
|
+ ANSI_TYPE,
|
|
31
|
+@@ -60,7 +58,7 @@
|
|
32
|
+ ANSIUTF8_TYPE
|
|
33
|
+ };
|
|
34
|
+
|
|
35
|
+-static enum imageType image_type = PNG_TYPE;
|
|
36
|
++static enum imageType image_type = SVG_TYPE;
|
|
37
|
+
|
|
38
|
+ static const struct option options[] = {
|
|
39
|
+ {"help" , no_argument , NULL, 'h'},
|
|
40
|
+@@ -96,13 +94,13 @@
|
|
41
|
+ if(longopt) {
|
|
42
|
+ fprintf(stderr,
|
|
43
|
+ "Usage: qrencode [OPTION]... [STRING]\n"
|
|
44
|
+-"Encode input data in a QR Code and save as a PNG or EPS image.\n\n"
|
|
45
|
++"Encode input data in a QR Code and save as a SVG or EPS image.\n\n"
|
|
46
|
+ " -h, --help display the help message. -h displays only the help of short\n"
|
|
47
|
+ " options.\n\n"
|
|
48
|
+ " -o FILENAME, --output=FILENAME\n"
|
|
49
|
+ " write image to FILENAME. If '-' is specified, the result\n"
|
|
50
|
+ " will be output to standard output. If -S is given, structured\n"
|
|
51
|
+-" symbols are written to FILENAME-01.png, FILENAME-02.png, ...\n"
|
|
52
|
++" symbols are written to FILENAME-01.svg, FILENAME-02.svg, ...\n"
|
|
53
|
+ " (suffix is removed from FILENAME, if specified)\n"
|
|
54
|
+ " -s NUMBER, --size=NUMBER\n"
|
|
55
|
+ " specify module size in dots (pixels). (default=3)\n\n"
|
|
56
|
+@@ -116,9 +114,9 @@
|
|
57
|
+ " specify the width of the margins. (default=4 (2 for Micro QR)))\n\n"
|
|
58
|
+ " -d NUMBER, --dpi=NUMBER\n"
|
|
59
|
+ " specify the DPI of the generated PNG. (default=72)\n\n"
|
|
60
|
+-" -t {PNG,EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}, --type={PNG,EPS,\n"
|
|
61
|
++" -t {EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}, --type={EPS,\n"
|
|
62
|
+ " SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}\n"
|
|
63
|
+-" specify the type of the generated image. (default=PNG)\n\n"
|
|
64
|
++" specify the type of the generated image. (default=SVG)\n\n"
|
|
65
|
+ " -S, --structured\n"
|
|
66
|
+ " make structured symbols. Version must be specified.\n\n"
|
|
67
|
+ " -k, --kanji assume that the input text contains kanji (shift-jis).\n\n"
|
|
68
|
+@@ -133,7 +131,7 @@
|
|
69
|
+ " --background=RRGGBB[AA]\n"
|
|
70
|
+ " specify foreground/background color in hexadecimal notation.\n"
|
|
71
|
+ " 6-digit (RGB) or 8-digit (RGBA) form are supported.\n"
|
|
72
|
+-" Color output support available only in PNG and SVG.\n"
|
|
73
|
++" Color output support available only in SVG.\n"
|
|
74
|
+ " -V, --version\n"
|
|
75
|
+ " display the version number and copyrights of the qrencode.\n\n"
|
|
76
|
+ " --verbose\n"
|
|
77
|
+@@ -153,12 +151,12 @@
|
|
78
|
+ } else {
|
|
79
|
+ fprintf(stderr,
|
|
80
|
+ "Usage: qrencode [OPTION]... [STRING]\n"
|
|
81
|
+-"Encode input data in a QR Code and save as a PNG or EPS image.\n\n"
|
|
82
|
++"Encode input data in a QR Code and save as a SVG or EPS image.\n\n"
|
|
83
|
+ " -h display this message.\n"
|
|
84
|
+ " --help display the usage of long options.\n"
|
|
85
|
+ " -o FILENAME write image to FILENAME. If '-' is specified, the result\n"
|
|
86
|
+ " will be output to standard output. If -S is given, structured\n"
|
|
87
|
+-" symbols are written to FILENAME-01.png, FILENAME-02.png, ...\n"
|
|
88
|
++" symbols are written to FILENAME-01.svg, FILENAME-02.svg, ...\n"
|
|
89
|
+ " (suffix is removed from FILENAME, if specified)\n"
|
|
90
|
+ " -s NUMBER specify module size in dots (pixels). (default=3)\n"
|
|
91
|
+ " -l {LMQH} specify error correction level from L (lowest) to H (highest).\n"
|
|
92
|
+@@ -166,8 +164,8 @@
|
|
93
|
+ " -v NUMBER specify the version of the symbol. (default=auto)\n"
|
|
94
|
+ " -m NUMBER specify the width of the margins. (default=4 (2 for Micro))\n"
|
|
95
|
+ " -d NUMBER specify the DPI of the generated PNG. (default=72)\n"
|
|
96
|
+-" -t {PNG,EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}\n"
|
|
97
|
+-" specify the type of the generated image. (default=PNG)\n"
|
|
98
|
++" -t {EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}\n"
|
|
99
|
++" specify the type of the generated image. (default=SVG)\n"
|
|
100
|
+ " -S make structured symbols. Version must be specified.\n"
|
|
101
|
+ " -k assume that the input text contains kanji (shift-jis).\n"
|
|
102
|
+ " -c encode lower-case alphabet characters in 8-bit mode. (default)\n"
|
|
103
|
+@@ -178,7 +176,7 @@
|
|
104
|
+ " --background=RRGGBB[AA]\n"
|
|
105
|
+ " specify foreground/background color in hexadecimal notation.\n"
|
|
106
|
+ " 6-digit (RGB) or 8-digit (RGBA) form are supported.\n"
|
|
107
|
+-" Color output support available only in PNG and SVG.\n"
|
|
108
|
++" Color output support available only in SVG.\n"
|
|
109
|
+ " -V display the version number and copyrights of the qrencode.\n"
|
|
110
|
+ " [STRING] input data. If it is not specified, data will be taken from\n"
|
|
111
|
+ " standard input.\n"
|
|
112
|
+@@ -253,128 +251,6 @@
|
|
113
|
+ return fp;
|
|
114
|
+ }
|
|
115
|
+
|
|
116
|
+-static int writePNG(QRcode *qrcode, const char *outfile)
|
|
117
|
+-{
|
|
118
|
+- static FILE *fp; // avoid clobbering by setjmp.
|
|
119
|
+- png_structp png_ptr;
|
|
120
|
+- png_infop info_ptr;
|
|
121
|
+- png_colorp palette;
|
|
122
|
+- png_byte alpha_values[2];
|
|
123
|
+- unsigned char *row, *p, *q;
|
|
124
|
+- int x, y, xx, yy, bit;
|
|
125
|
+- int realwidth;
|
|
126
|
+-
|
|
127
|
+- realwidth = (qrcode->width + margin * 2) * size;
|
|
128
|
+- row = (unsigned char *)malloc((realwidth + 7) / 8);
|
|
129
|
+- if(row == NULL) {
|
|
130
|
+- fprintf(stderr, "Failed to allocate memory.\n");
|
|
131
|
+- exit(EXIT_FAILURE);
|
|
132
|
+- }
|
|
133
|
+-
|
|
134
|
+- if(outfile[0] == '-' && outfile[1] == '\0') {
|
|
135
|
+- fp = stdout;
|
|
136
|
+- } else {
|
|
137
|
+- fp = fopen(outfile, "wb");
|
|
138
|
+- if(fp == NULL) {
|
|
139
|
+- fprintf(stderr, "Failed to create file: %s\n", outfile);
|
|
140
|
+- perror(NULL);
|
|
141
|
+- exit(EXIT_FAILURE);
|
|
142
|
+- }
|
|
143
|
+- }
|
|
144
|
+-
|
|
145
|
+- png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
|
146
|
+- if(png_ptr == NULL) {
|
|
147
|
+- fprintf(stderr, "Failed to initialize PNG writer.\n");
|
|
148
|
+- exit(EXIT_FAILURE);
|
|
149
|
+- }
|
|
150
|
+-
|
|
151
|
+- info_ptr = png_create_info_struct(png_ptr);
|
|
152
|
+- if(info_ptr == NULL) {
|
|
153
|
+- fprintf(stderr, "Failed to initialize PNG write.\n");
|
|
154
|
+- exit(EXIT_FAILURE);
|
|
155
|
+- }
|
|
156
|
+-
|
|
157
|
+- if(setjmp(png_jmpbuf(png_ptr))) {
|
|
158
|
+- png_destroy_write_struct(&png_ptr, &info_ptr);
|
|
159
|
+- fprintf(stderr, "Failed to write PNG image.\n");
|
|
160
|
+- exit(EXIT_FAILURE);
|
|
161
|
+- }
|
|
162
|
+-
|
|
163
|
+- palette = (png_colorp) malloc(sizeof(png_color) * 2);
|
|
164
|
+- if(palette == NULL) {
|
|
165
|
+- fprintf(stderr, "Failed to allocate memory.\n");
|
|
166
|
+- exit(EXIT_FAILURE);
|
|
167
|
+- }
|
|
168
|
+- palette[0].red = fg_color[0];
|
|
169
|
+- palette[0].green = fg_color[1];
|
|
170
|
+- palette[0].blue = fg_color[2];
|
|
171
|
+- palette[1].red = bg_color[0];
|
|
172
|
+- palette[1].green = bg_color[1];
|
|
173
|
+- palette[1].blue = bg_color[2];
|
|
174
|
+- alpha_values[0] = fg_color[3];
|
|
175
|
+- alpha_values[1] = bg_color[3];
|
|
176
|
+- png_set_PLTE(png_ptr, info_ptr, palette, 2);
|
|
177
|
+- png_set_tRNS(png_ptr, info_ptr, alpha_values, 2, NULL);
|
|
178
|
+-
|
|
179
|
+- png_init_io(png_ptr, fp);
|
|
180
|
+- png_set_IHDR(png_ptr, info_ptr,
|
|
181
|
+- realwidth, realwidth,
|
|
182
|
+- 1,
|
|
183
|
+- PNG_COLOR_TYPE_PALETTE,
|
|
184
|
+- PNG_INTERLACE_NONE,
|
|
185
|
+- PNG_COMPRESSION_TYPE_DEFAULT,
|
|
186
|
+- PNG_FILTER_TYPE_DEFAULT);
|
|
187
|
+- png_set_pHYs(png_ptr, info_ptr,
|
|
188
|
+- dpi * INCHES_PER_METER,
|
|
189
|
+- dpi * INCHES_PER_METER,
|
|
190
|
+- PNG_RESOLUTION_METER);
|
|
191
|
+- png_write_info(png_ptr, info_ptr);
|
|
192
|
+-
|
|
193
|
+- /* top margin */
|
|
194
|
+- memset(row, 0xff, (realwidth + 7) / 8);
|
|
195
|
+- for(y=0; y<margin * size; y++) {
|
|
196
|
+- png_write_row(png_ptr, row);
|
|
197
|
+- }
|
|
198
|
+-
|
|
199
|
+- /* data */
|
|
200
|
+- p = qrcode->data;
|
|
201
|
+- for(y=0; y<qrcode->width; y++) {
|
|
202
|
+- bit = 7;
|
|
203
|
+- memset(row, 0xff, (realwidth + 7) / 8);
|
|
204
|
+- q = row;
|
|
205
|
+- q += margin * size / 8;
|
|
206
|
+- bit = 7 - (margin * size % 8);
|
|
207
|
+- for(x=0; x<qrcode->width; x++) {
|
|
208
|
+- for(xx=0; xx<size; xx++) {
|
|
209
|
+- *q ^= (*p & 1) << bit;
|
|
210
|
+- bit--;
|
|
211
|
+- if(bit < 0) {
|
|
212
|
+- q++;
|
|
213
|
+- bit = 7;
|
|
214
|
+- }
|
|
215
|
+- }
|
|
216
|
+- p++;
|
|
217
|
+- }
|
|
218
|
+- for(yy=0; yy<size; yy++) {
|
|
219
|
+- png_write_row(png_ptr, row);
|
|
220
|
+- }
|
|
221
|
+- }
|
|
222
|
+- /* bottom margin */
|
|
223
|
+- memset(row, 0xff, (realwidth + 7) / 8);
|
|
224
|
+- for(y=0; y<margin * size; y++) {
|
|
225
|
+- png_write_row(png_ptr, row);
|
|
226
|
+- }
|
|
227
|
+-
|
|
228
|
+- png_write_end(png_ptr, info_ptr);
|
|
229
|
+- png_destroy_write_struct(&png_ptr, &info_ptr);
|
|
230
|
+-
|
|
231
|
+- fclose(fp);
|
|
232
|
+- free(row);
|
|
233
|
+- free(palette);
|
|
234
|
+-
|
|
235
|
+- return 0;
|
|
236
|
+-}
|
|
237
|
+-
|
|
238
|
+ static int writeEPS(QRcode *qrcode, const char *outfile)
|
|
239
|
+ {
|
|
240
|
+ FILE *fp;
|
|
241
|
+@@ -831,9 +707,6 @@
|
|
242
|
+ }
|
|
243
|
+
|
|
244
|
+ switch(image_type) {
|
|
245
|
+- case PNG_TYPE:
|
|
246
|
+- writePNG(qrcode, outfile);
|
|
247
|
+- break;
|
|
248
|
+ case EPS_TYPE:
|
|
249
|
+ writeEPS(qrcode, outfile);
|
|
250
|
+ break;
|
|
251
|
+@@ -887,9 +760,6 @@
|
|
252
|
+ size_t suffix_size;
|
|
253
|
+
|
|
254
|
+ switch(image_type) {
|
|
255
|
+- case PNG_TYPE:
|
|
256
|
+- type_suffix = ".png";
|
|
257
|
+- break;
|
|
258
|
+ case EPS_TYPE:
|
|
259
|
+ type_suffix = ".eps";
|
|
260
|
+ break;
|
|
261
|
+@@ -948,9 +818,6 @@
|
|
262
|
+ }
|
|
263
|
+
|
|
264
|
+ switch(image_type) {
|
|
265
|
+- case PNG_TYPE:
|
|
266
|
+- writePNG(p->code, filename);
|
|
267
|
+- break;
|
|
268
|
+ case EPS_TYPE:
|
|
269
|
+ writeEPS(p->code, filename);
|
|
270
|
+ break;
|
|
271
|
+@@ -1062,9 +929,7 @@
|
|
272
|
+ }
|
|
273
|
+ break;
|
|
274
|
+ case 't':
|
|
275
|
+- if(strcasecmp(optarg, "png") == 0) {
|
|
276
|
+- image_type = PNG_TYPE;
|
|
277
|
+- } else if(strcasecmp(optarg, "eps") == 0) {
|
|
278
|
++ if(strcasecmp(optarg, "eps") == 0) {
|
|
279
|
+ image_type = EPS_TYPE;
|
|
280
|
+ } else if(strcasecmp(optarg, "svg") == 0) {
|
|
281
|
+ image_type = SVG_TYPE;
|
|
282
|
+@@ -1133,11 +998,6 @@
|
|
283
|
+ exit(EXIT_SUCCESS);
|
|
284
|
+ }
|
|
285
|
+
|
|
286
|
+- if(outfile == NULL && image_type == PNG_TYPE) {
|
|
287
|
+- fprintf(stderr, "No output filename is given.\n");
|
|
288
|
+- exit(EXIT_FAILURE);
|
|
289
|
+- }
|
|
290
|
+-
|
|
291
|
+ if(optind < argc) {
|
|
292
|
+ intext = (unsigned char *)argv[optind];
|
|
293
|
+ length = strlen((char *)intext);
|