]> git.sur5r.net Git - glabels/blob - src/bc-zint.c
Imported Upstream version 3.4.0
[glabels] / src / bc-zint.c
1 /*
2  *  bc-zint.c
3  *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #ifdef HAVE_LIBZINT
24
25 #include "bc-zint.h"
26
27 #include <glib.h>
28 #include <ctype.h>
29 #include <string.h>
30 #include <zint.h> /* Zint */
31
32 #include "debug.h"
33
34
35 /*========================================================*/
36 /* Private macros and constants.                          */
37 /*========================================================*/
38 #define DEFAULT_W 144
39 #define DEFAULT_H  72
40
41
42 /*===========================================*/
43 /* Local function prototypes                 */
44 /*===========================================*/
45 static lglBarcode *render_zint     (struct zint_symbol *symbol, gboolean text_flag);
46
47
48
49 /*****************************************************************************/
50 /* Generate intermediate representation of barcode.                          */
51 /*****************************************************************************/
52 lglBarcode *
53 gl_barcode_zint_new (const gchar          *id,
54                            gboolean        text_flag,
55                            gboolean        checksum_flag,
56                            gdouble         w,
57                            gdouble         h,
58                            const gchar    *digits)
59 {
60         lglBarcode          *gbc;
61         struct zint_symbol  *symbol;
62         gint                 result;
63
64         symbol = ZBarcode_Create();
65
66         /* Auto set to default size */
67         if ( (w == 0) && (h == 0) )
68         {
69                 w = DEFAULT_W;
70                 h = DEFAULT_H;
71         }
72
73         /* Assign type flag.  Pre-filter by length for subtypes. */
74         if (g_ascii_strcasecmp (id, "AUSP") == 0)     { symbol->symbology = BARCODE_AUSPOST; }
75         if (g_ascii_strcasecmp (id, "AUSRP") == 0)    { symbol->symbology = BARCODE_AUSREPLY; }
76         if (g_ascii_strcasecmp (id, "AUSRT") == 0)    { symbol->symbology = BARCODE_AUSROUTE; }
77         if (g_ascii_strcasecmp (id, "AUSRD") == 0)    { symbol->symbology = BARCODE_AUSREDIRECT; }
78         if (g_ascii_strcasecmp (id, "AZTEC") == 0)    { symbol->symbology = BARCODE_AZTEC; }
79         if (g_ascii_strcasecmp (id, "AZRUN") == 0)    { symbol->symbology = BARCODE_AZRUNE; }
80         if (g_ascii_strcasecmp (id, "CBR") == 0)      { symbol->symbology = BARCODE_CODABAR; }
81         if (g_ascii_strcasecmp (id, "Code1") == 0)    { symbol->symbology = BARCODE_CODEONE; }
82         if (g_ascii_strcasecmp (id, "Code11") == 0)   { symbol->symbology = BARCODE_CODE11; }
83         if (g_ascii_strcasecmp (id, "C16K") == 0)     { symbol->symbology = BARCODE_CODE16K; }
84         if (g_ascii_strcasecmp (id, "C25M") == 0)     { symbol->symbology = BARCODE_C25MATRIX; }
85         if (g_ascii_strcasecmp (id, "C25I") == 0)     { symbol->symbology = BARCODE_C25IATA; }
86         if (g_ascii_strcasecmp (id, "C25DL") == 0)    { symbol->symbology = BARCODE_C25LOGIC; }
87         if (g_ascii_strcasecmp (id, "Code32") == 0)   { symbol->symbology = BARCODE_CODE32; }
88         if (g_ascii_strcasecmp (id, "Code39") == 0)   { symbol->symbology = BARCODE_CODE39; }
89         if (g_ascii_strcasecmp (id, "Code39E") == 0)  { symbol->symbology = BARCODE_EXCODE39; }
90         if (g_ascii_strcasecmp (id, "Code49") == 0)   { symbol->symbology = BARCODE_CODE49; }
91         if (g_ascii_strcasecmp (id, "Code93") == 0)   { symbol->symbology = BARCODE_CODE93; }
92         if (g_ascii_strcasecmp (id, "Code128") == 0)  { symbol->symbology = BARCODE_CODE128; }
93         if (g_ascii_strcasecmp (id, "Code128B") == 0) { symbol->symbology = BARCODE_CODE128B; }
94         if (g_ascii_strcasecmp (id, "DAFT") == 0)     { symbol->symbology = BARCODE_DAFT; }
95         if (g_ascii_strcasecmp (id, "DMTX") == 0)     { symbol->symbology = BARCODE_DATAMATRIX; }
96         if (g_ascii_strcasecmp (id, "DMTX-GS1") == 0) { symbol->symbology = BARCODE_DATAMATRIX;
97                                                         symbol->input_mode = GS1_MODE; }
98         if (g_ascii_strcasecmp (id, "DPL") == 0)      { symbol->symbology = BARCODE_DPLEIT; }
99         if (g_ascii_strcasecmp (id, "DPI") == 0)      { symbol->symbology = BARCODE_DPIDENT; }
100         if (g_ascii_strcasecmp (id, "KIX") == 0)      { symbol->symbology = BARCODE_KIX; }
101         if (g_ascii_strcasecmp (id, "EAN") == 0)      { symbol->symbology = BARCODE_EANX; }
102         if (g_ascii_strcasecmp (id, "HIBC128") == 0)  { symbol->symbology = BARCODE_HIBC_128; }
103         if (g_ascii_strcasecmp (id, "HIBC39") == 0)   { symbol->symbology = BARCODE_HIBC_39; }
104         if (g_ascii_strcasecmp (id, "HIBCDM") == 0)   { symbol->symbology = BARCODE_HIBC_DM; }
105         if (g_ascii_strcasecmp (id, "HIBCQR") == 0)   { symbol->symbology = BARCODE_HIBC_QR; }
106         if (g_ascii_strcasecmp (id, "HIBCPDF") == 0)  { symbol->symbology = BARCODE_HIBC_MICPDF; }
107         if (g_ascii_strcasecmp (id, "HIBCMPDF") == 0) { symbol->symbology = BARCODE_HIBC_AZTEC; }
108         if (g_ascii_strcasecmp (id, "HIBCAZ") == 0)   { symbol->symbology = BARCODE_C25INTER; }
109         if (g_ascii_strcasecmp (id, "I25") == 0)      { symbol->symbology = BARCODE_C25INTER; }
110         if (g_ascii_strcasecmp (id, "ISBN") == 0)     { symbol->symbology = BARCODE_ISBNX; }
111         if (g_ascii_strcasecmp (id, "ITF14") == 0)    { symbol->symbology = BARCODE_ITF14; }
112         if (g_ascii_strcasecmp (id, "GMTX") == 0)     { symbol->symbology = BARCODE_GRIDMATRIX; }
113         if (g_ascii_strcasecmp (id, "GS1-128") == 0)  { symbol->symbology = BARCODE_EAN128; }
114         if (g_ascii_strcasecmp (id, "LOGM") == 0)     { symbol->symbology = BARCODE_LOGMARS; }
115         if (g_ascii_strcasecmp (id, "RSS14") == 0)    { symbol->symbology = BARCODE_RSS14; }
116         if (g_ascii_strcasecmp (id, "RSSLTD") == 0)   { symbol->symbology = BARCODE_RSS_LTD; }
117         if (g_ascii_strcasecmp (id, "RSSEXP") == 0)   { symbol->symbology = BARCODE_RSS_EXP; }
118         if (g_ascii_strcasecmp (id, "RSSS") == 0)     { symbol->symbology = BARCODE_RSS14STACK; }
119         if (g_ascii_strcasecmp (id, "RSSSO") == 0)    { symbol->symbology = BARCODE_RSS14STACK_OMNI; }
120         if (g_ascii_strcasecmp (id, "RSSSE") == 0)    { symbol->symbology = BARCODE_RSS_EXPSTACK; }
121         if (g_ascii_strcasecmp (id, "PHARMA") == 0)   { symbol->symbology = BARCODE_PHARMA; }
122         if (g_ascii_strcasecmp (id, "PHARMA2") == 0)  { symbol->symbology = BARCODE_PHARMA_TWO; }
123         if (g_ascii_strcasecmp (id, "PZN") == 0)      { symbol->symbology = BARCODE_PZN; }
124         if (g_ascii_strcasecmp (id, "TELE") == 0)     { symbol->symbology = BARCODE_TELEPEN; }
125         if (g_ascii_strcasecmp (id, "TELEX") == 0)    { symbol->symbology = BARCODE_TELEPEN_NUM; }
126         if (g_ascii_strcasecmp (id, "JAPAN") == 0)    { symbol->symbology = BARCODE_JAPANPOST; }
127         if (g_ascii_strcasecmp (id, "KOREA") == 0)    { symbol->symbology = BARCODE_KOREAPOST; }
128         if (g_ascii_strcasecmp (id, "MAXI") == 0)     { symbol->symbology = BARCODE_MAXICODE; }
129         if (g_ascii_strcasecmp (id, "MPDF") == 0)     { symbol->symbology = BARCODE_MICROPDF417; }
130         if (g_ascii_strcasecmp (id, "MSI") == 0)      { symbol->symbology = BARCODE_MSI_PLESSEY; }
131         if (g_ascii_strcasecmp (id, "MQR") == 0)      { symbol->symbology = BARCODE_MICROQR; }
132         if (g_ascii_strcasecmp (id, "NVE") == 0)      { symbol->symbology = BARCODE_NVE18; }
133         if (g_ascii_strcasecmp (id, "PLAN") == 0)     { symbol->symbology = BARCODE_PLANET; }
134         if (g_ascii_strcasecmp (id, "POSTNET") == 0)  { symbol->symbology = BARCODE_POSTNET; }
135         if (g_ascii_strcasecmp (id, "PDF") == 0)      { symbol->symbology = BARCODE_PDF417; }
136         if (g_ascii_strcasecmp (id, "PDFT") == 0)     { symbol->symbology = BARCODE_PDF417TRUNC; }
137         if (g_ascii_strcasecmp (id, "QR") == 0)       { symbol->symbology = BARCODE_QRCODE; }
138         if (g_ascii_strcasecmp (id, "RM4") == 0)      { symbol->symbology = BARCODE_RM4SCC; }
139         if (g_ascii_strcasecmp (id, "UPC-A") == 0)    { symbol->symbology = BARCODE_UPCA; }
140         if (g_ascii_strcasecmp (id, "UPC-E") == 0)    { symbol->symbology = BARCODE_UPCE; }
141         if (g_ascii_strcasecmp (id, "USPS") == 0)     { symbol->symbology = BARCODE_ONECODE; }
142         if (g_ascii_strcasecmp (id, "PLS") == 0)      { symbol->symbology = BARCODE_PLESSEY; }
143
144
145         result = ZBarcode_Encode(symbol, (unsigned char *)digits, 0);
146         if (result)
147         {
148                 gl_debug (DEBUG_BARCODE, "Zint Error: %s", symbol->errtxt);
149                 ZBarcode_Delete (symbol);
150                 return NULL;
151         }
152
153         if(!text_flag)
154         {
155                 symbol->show_hrt = 0;
156         }
157
158         if (!ZBarcode_Render(symbol, (float) w, (float) h))
159         {
160                 g_message("Zint Rendering Error: %s", symbol->errtxt);
161                 ZBarcode_Delete(symbol);
162                 return NULL;
163         }
164
165         /* Convert Sums provided by zint encode */
166         gbc = render_zint(symbol, text_flag);
167
168         ZBarcode_Delete(symbol);
169
170         return gbc;
171 }
172
173
174 /*--------------------------------------------------------------------------
175  * PRIVATE. Render to lglBarcode the provided Zint symbol.
176  *--------------------------------------------------------------------------*/
177 static lglBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag)
178 {
179         lglBarcode            *gbc;
180
181         struct zint_render         *render;
182         struct zint_render_line    *zline;
183         struct zint_render_string  *zstring;
184         struct zint_render_ring    *zring;
185         struct zint_render_hexagon *zhexagon;
186
187         render = symbol->rendered;
188         gbc = lgl_barcode_new ();
189
190         for ( zline = render->lines; zline != NULL; zline = zline->next )
191         {
192                 lgl_barcode_add_box (gbc, zline->x, zline->y, zline->width, zline->length);
193         }
194
195         for ( zring = render->rings; zring != NULL; zring = zring->next )
196         {
197                 lgl_barcode_add_ring (gbc, zring->x, zring->y, zring->radius, zring->line_width);
198         }
199
200         for ( zhexagon = render->hexagons; zhexagon != NULL; zhexagon = zhexagon->next )
201         {
202                 lgl_barcode_add_hexagon (gbc, zhexagon->x, zhexagon->y, 2.89);
203         }
204
205         if(text_flag)
206         {
207                 for ( zstring = render->strings; zstring != NULL; zstring = zstring->next )
208                 {
209                         lgl_barcode_add_string (gbc,
210                                                 zstring->x, zstring->y,
211                                                 zstring->fsize, (gchar *)zstring->text, zstring->length);
212                 }
213         }
214
215         /*
216          * Finally add complete sizes
217          */
218         gbc->width = (gdouble) render->width;
219         gbc->height = (gdouble) render->height;
220
221         return gbc;
222 }
223
224 #endif /* HAVE_LIBZINT */
225
226 /*
227  * Local Variables:       -- emacs
228  * mode: C                -- emacs
229  * c-basic-offset: 8      -- emacs
230  * tab-width: 8           -- emacs
231  * indent-tabs-mode: nil  -- emacs
232  * End:                   -- emacs
233  */