]> git.sur5r.net Git - glabels/blob - src/bc-zint.c
Refactoring of barcode structure.
[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 glBarcode *render_zint     (struct zint_symbol *symbol, gboolean text_flag);
46
47
48
49 /*****************************************************************************/
50 /* Generate intermediate representation of barcode.                          */
51 /*****************************************************************************/
52 glBarcode *
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         glBarcode           *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, "DPL") == 0) { symbol->symbology = BARCODE_DPLEIT; }
97         if (g_ascii_strcasecmp (id, "DPI") == 0) { symbol->symbology = BARCODE_DPIDENT; }
98         if (g_ascii_strcasecmp (id, "KIX") == 0) { symbol->symbology = BARCODE_KIX; }
99         if (g_ascii_strcasecmp (id, "EAN") == 0) { symbol->symbology = BARCODE_EANX; }
100         if (g_ascii_strcasecmp (id, "HIBC128") == 0) { symbol->symbology = BARCODE_HIBC_128; }
101         if (g_ascii_strcasecmp (id, "HIBC39") == 0) { symbol->symbology = BARCODE_HIBC_39; }
102         if (g_ascii_strcasecmp (id, "HIBCDM") == 0) { symbol->symbology = BARCODE_HIBC_DM; }
103         if (g_ascii_strcasecmp (id, "HIBCQR") == 0) { symbol->symbology = BARCODE_HIBC_QR; }
104         if (g_ascii_strcasecmp (id, "HIBCPDF") == 0) { symbol->symbology = BARCODE_HIBC_MICPDF; }
105         if (g_ascii_strcasecmp (id, "HIBCMPDF") == 0) { symbol->symbology = BARCODE_HIBC_AZTEC; }
106         if (g_ascii_strcasecmp (id, "HIBCAZ") == 0) { symbol->symbology = BARCODE_C25INTER; }
107         if (g_ascii_strcasecmp (id, "I25") == 0) { symbol->symbology = BARCODE_C25INTER; }
108         if (g_ascii_strcasecmp (id, "ISBN") == 0) { symbol->symbology = BARCODE_ISBNX; }
109         if (g_ascii_strcasecmp (id, "ITF14") == 0) { symbol->symbology = BARCODE_ITF14; }
110         if (g_ascii_strcasecmp (id, "GMTX") == 0) { symbol->symbology = BARCODE_GRIDMATRIX; }
111         if (g_ascii_strcasecmp (id, "GS1-128") == 0) { symbol->symbology = BARCODE_EAN128; }
112         if (g_ascii_strcasecmp (id, "LOGM") == 0) { symbol->symbology = BARCODE_LOGMARS; }
113         if (g_ascii_strcasecmp (id, "RSS14") == 0) { symbol->symbology = BARCODE_RSS14; }
114         if (g_ascii_strcasecmp (id, "RSSLTD") == 0) { symbol->symbology = BARCODE_RSS_LTD; }
115         if (g_ascii_strcasecmp (id, "RSSEXP") == 0) { symbol->symbology = BARCODE_RSS_EXP; }
116         if (g_ascii_strcasecmp (id, "RSSS") == 0) { symbol->symbology = BARCODE_RSS14STACK; }
117         if (g_ascii_strcasecmp (id, "RSSSO") == 0) { symbol->symbology = BARCODE_RSS14STACK_OMNI; }
118         if (g_ascii_strcasecmp (id, "RSSSE") == 0) { symbol->symbology = BARCODE_RSS_EXPSTACK; }
119         if (g_ascii_strcasecmp (id, "PHARMA") == 0) { symbol->symbology = BARCODE_PHARMA; }
120         if (g_ascii_strcasecmp (id, "PHARMA2") == 0) { symbol->symbology = BARCODE_PHARMA_TWO; }
121         if (g_ascii_strcasecmp (id, "PZN") == 0) { symbol->symbology = BARCODE_PZN; }
122         if (g_ascii_strcasecmp (id, "TELE") == 0) { symbol->symbology = BARCODE_TELEPEN; }
123         if (g_ascii_strcasecmp (id, "TELEX") == 0) { symbol->symbology = BARCODE_TELEPEN_NUM; }
124         if (g_ascii_strcasecmp (id, "JAPAN") == 0) { symbol->symbology = BARCODE_JAPANPOST; }
125         if (g_ascii_strcasecmp (id, "KOREA") == 0) { symbol->symbology = BARCODE_KOREAPOST; }
126         if (g_ascii_strcasecmp (id, "MPDF") == 0) { symbol->symbology = BARCODE_MICROPDF417; }
127         if (g_ascii_strcasecmp (id, "MSI") == 0) { symbol->symbology = BARCODE_MSI_PLESSEY; }
128         if (g_ascii_strcasecmp (id, "MQR") == 0) { symbol->symbology = BARCODE_MICROQR; }
129         if (g_ascii_strcasecmp (id, "NVE") == 0) { symbol->symbology = BARCODE_NVE18; }
130         if (g_ascii_strcasecmp (id, "PLAN") == 0) { symbol->symbology = BARCODE_PLANET; }
131         if (g_ascii_strcasecmp (id, "POSTNET") == 0) { symbol->symbology = BARCODE_POSTNET; }
132         if (g_ascii_strcasecmp (id, "PDF") == 0) { symbol->symbology = BARCODE_PDF417; }
133         if (g_ascii_strcasecmp (id, "PDFT") == 0) { symbol->symbology = BARCODE_PDF417TRUNC; }
134         if (g_ascii_strcasecmp (id, "QR") == 0) { symbol->symbology = BARCODE_QRCODE; }
135         if (g_ascii_strcasecmp (id, "RM4") == 0) { symbol->symbology = BARCODE_RM4SCC; }
136         if (g_ascii_strcasecmp (id, "UPC-A") == 0) { symbol->symbology = BARCODE_UPCA; }
137         if (g_ascii_strcasecmp (id, "UPC-E") == 0) { symbol->symbology = BARCODE_UPCE; }
138         if (g_ascii_strcasecmp (id, "USPS") == 0) { symbol->symbology = BARCODE_ONECODE; }
139         if (g_ascii_strcasecmp (id, "PLS") == 0) { symbol->symbology = BARCODE_PLESSEY; }
140
141
142         /* Checksum not supported yet!! 
143         if (!checksum_flag) {
144                 flags |= BARCODE_NO_CHECKSUM;
145         }
146         */
147
148         result = ZBarcode_Encode(symbol, (unsigned char *)digits, 0);
149         if (result) {
150                 gl_debug (DEBUG_BARCODE, "Zint Error: %s", symbol->errtxt);
151                 ZBarcode_Delete (symbol);
152                 return NULL;
153         }
154         
155         if(!text_flag) {
156                 symbol->show_hrt = 0;
157         }
158
159         if (!ZBarcode_Render(symbol, (float) w, (float) h)) {
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 glBarcode the provided Zint symbol.
176  *
177  * Based on the SVG output from Zint library, handles lots of otherwise
178  * internal  Zint code to convert directly to glBarcode representation.
179  *
180  *--------------------------------------------------------------------------*/
181 static glBarcode *render_zint(struct zint_symbol *symbol, gboolean text_flag)
182 {
183         glBarcode            *gbc;
184
185         struct zint_render        *render;
186         struct zint_render_line   *zline;
187         struct zint_render_string *zstring;
188
189
190         render = symbol->rendered;
191         gbc = g_new0(glBarcode, 1);
192         
193         for ( zline = render->lines; zline != NULL; zline = zline->next )
194         {
195                 gl_barcode_add_box (gbc, zline->x, zline->y, zline->width, zline->length);
196         }
197
198         /*
199          * Repeat loop for characters
200          */
201         if(text_flag)
202         {
203                 for ( zstring = render->strings; zstring != NULL; zstring = zstring->next )
204                 {
205                         gl_barcode_add_string (gbc,
206                                                zstring->x, zstring->y,
207                                                zstring->fsize, (gchar *)zstring->text, zstring->length);
208                 }
209         }
210
211         /*
212          * Finally add complete sizes
213          */
214         gbc->width = (gdouble) render->width;
215         gbc->height = (gdouble) render->height;
216
217         return gbc;
218 }
219
220 #endif /* HAVE_LIBZINT */
221
222 /*
223  * Local Variables:       -- emacs
224  * mode: C                -- emacs
225  * c-basic-offset: 8      -- emacs
226  * tab-width: 8           -- emacs
227  * indent-tabs-mode: nil  -- emacs
228  * End:                   -- emacs
229  */