2015-08-18 15:23:28 +03:00
/* zint_tcl.c TCL binding for zint */
/*
zint - the open source tcl binding to the zint barcode library
Copyright ( C ) 2014 Harald Oehlmann < oehhar @ users . sourceforge . net >
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
2016-09-14 10:51:54 +03:00
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2015-08-18 15:23:28 +03:00
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
2016-09-14 10:51:54 +03:00
documentation and / or other materials provided with the distribution .
2015-08-18 15:23:28 +03:00
3. Neither the name of the project nor the names of its contributors
may be used to endorse or promote products derived from this software
2016-09-14 10:51:54 +03:00
without specific prior written permission .
2015-08-18 15:23:28 +03:00
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
2016-09-14 10:51:54 +03:00
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
2015-08-18 15:23:28 +03:00
SUCH DAMAGE .
*/
/*
History
2014 - 06 - 16 2.5 .0 HaO
2016-10-14 17:23:15 +03:00
First implementation
2016 - 09 - 14 2.5 .1 HaO
- Added Codablock F options " -rows " .
2016-09-14 10:51:54 +03:00
- Adopted to new image format of zint
2016-10-14 17:23:15 +03:00
2016 - 10 - 14 2.5 .2 HaO
2017-10-23 22:34:31 +03:00
- Include the upstream reverted image format
2016 - 12 - 12 2.5 .3 HaO
2020-08-04 16:49:25 +03:00
- No changes here , take 2.5 .1 framework files
2017-10-23 22:34:31 +03:00
2017 - 05 - 12 2.6 .0 HaO
2020-08-04 16:49:25 +03:00
- No changes here , take 2.6 framework files
2017-10-23 22:34:31 +03:00
2017 - 08 - 29 2.6 .1 HaO
2020-08-04 16:49:25 +03:00
- Framework 2.6 .1 extensions
- EAN / UPC Codes with included check digit
- UPNQR Code
- Misspelled symbology : AztecRunes
2017-10-23 22:34:31 +03:00
2017 - 10 - 23 2.6 .2 HaO
2020-08-04 16:49:25 +03:00
- Framework 2.6 .2 bugfixes
- Allow dll unload
2018 - 02 - 13 2.6 .3 HaO
- Framework trunk update
- Added VIN and MailMark symbologies .
2018 - 11 - 02 2.6 .4 HaO
- Framework trunk update
- Add options - bold , - dotted , - dotsize , - dmre , - eci
- Implemented ECI logic
2019-09-02 13:37:01 +03:00
2019 - 09 - 01 2.6 .5 HaO
2020-08-04 16:49:25 +03:00
- Framework 2.6 .5 update
- Add option - gssep
2019-09-18 12:58:57 +03:00
2019 - 09 - 18 2.6 .6 HaO
2020-08-04 16:49:25 +03:00
- Framework 2.6 .6 update
2019-10-07 12:57:35 +03:00
2019 - 10 - 07 2.6 .7 HaO
2020-08-04 16:49:25 +03:00
- Framework 2.6 .7 update
2019-12-05 22:16:39 +03:00
2019 - 12 - 05 2.7 .0 HaO
2020-08-04 16:49:25 +03:00
- Framework 2.7 .0 update
2019-12-05 22:16:39 +03:00
- Add symbology rmqr
2020-02-01 21:36:50 +03:00
2020 - 02 - 01 2.7 .1 HaO
2020-08-04 16:49:25 +03:00
- Framework 2.7 .1 update
2020 - 04 - 06 HaO
- Added option - fullmultibyte
2020 - 04 - 07 2.8 .0 HaO
2020-04-07 19:11:33 +03:00
- Added symbology " UltraCode " .
2020-05-19 13:02:18 +03:00
2020 - 05 - 19 HaO
- Added option - separator to specify stacked symbology separator width
- - cols maximum changed from 66 to 67
2020-07-27 19:44:51 +03:00
2020 - 07 - 27 2.9 .0 HaO
- added option " -addongap "
- Renamed symbology names :
- Matrix2of5 - > Standard2of5
- PDF417Trunc - > PDF417Compact
- RSS14Stacked - > GS1DataBarStacked
- RSS14Stacked - > GS1DataBarStacked
- RSS14StackedOmni - > GS1DataBarSstackedOmni
- RSS14ExpandedStacked - > GS1DataBarExpandedStacked
- OneCode - > USPSIntelligentMail
- EAN128 - CC - > GS1 - 128 - CC
- RSS14 - CC - > GS1DataBarOmni - CC
- RSSLimited - CC - > GS1DataBarLimited - CC
- RSSExpandedStacked - CC - > GS1DataBarExpanded - CC
- RSSEXPanded - CC - > GS1DataBarExpanded - CC
- RSS14Stacked - CC - > GS1DataBarStacked - CC
- RSS14Omni - CC - > GS1DataBarStackedOmni - CC
- RSSExpandedStacked - CC - > GS1DataBarExpandedStacked - CC
* * * Potential incompatibility * * *
2020-08-04 16:49:25 +03:00
2020 - 08 - 04 2.10 .0 HaO
- added symbology " DPDCode "
- Alpha channel support added :
- added option - nobackground
- also allow RRGGBBAA for - fg and - bg options
2021-01-05 16:13:11 +03:00
2021 - 01 - 05 2.9 .1 HaO
- Added options - reverse , - werror , - wzpl
- Use version number from zint . h ( first 3 digits ) . Do not use an own one .
2021-01-14 12:07:25 +03:00
2021 - 01 - 14 GL
- Removed TCL native encoding of ECI ' s and replace by zint buildin mechanism .
The input is now UTF - 8 for any ECI and zint cares about the encoding .
2021-01-14 13:03:13 +03:00
2021 - 01 - 14 HaO
- Added detection of presence of the Tk package and late initialization .
This is a preparation to add a TCL only mode to the DLL .
2021-01-22 21:07:59 +03:00
2021 - 01 - 22 GL
- - cols maximum changed from 67 to 108 ( DotCode )
2021-05-15 14:23:46 +03:00
2021 - 05 - 10 GL
- Added - gs1parens option
2015-08-18 15:23:28 +03:00
*/
2016-07-04 14:46:30 +03:00
# if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
2015-08-18 15:23:28 +03:00
# pragma warning(disable : 4201 4214 4514)
# define STRICT
# define WIN32_LEAN_AND_MEAN
/* TCL Defines */
# define DLL_BUILD
# include <windows.h>
/* Define ERROR_INVALID_DATA is also used by zint... */
# ifdef ERROR_INVALID_DATA
# undef ERROR_INVALID_DATA
# endif
2016-07-04 14:46:30 +03:00
# endif
2015-08-18 15:23:28 +03:00
# include <zint.h>
2021-01-05 16:13:11 +03:00
/* Load version defines */
# include <zintconfig.h>
2016-07-04 14:46:30 +03:00
# include <string.h>
2015-08-18 15:23:28 +03:00
2016-07-04 14:46:30 +03:00
# if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
2015-08-18 15:23:28 +03:00
# define USE_TCL_STUBS
# define USE_TK_STUBS
2016-07-04 14:46:30 +03:00
# endif
2015-08-18 15:23:28 +03:00
# include <tcl.h>
2016-09-14 10:51:54 +03:00
# include <tk.h>
2015-08-18 15:23:28 +03:00
2016-07-04 14:46:30 +03:00
# undef EXPORT
# if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
# define EXPORT __declspec(dllexport)
# else
# define EXPORT
# endif
2015-08-18 15:23:28 +03:00
/*----------------------------------------------------------------------------*/
/* >>>>> Hepler defines */
2021-01-14 12:07:25 +03:00
/* Two macros are necessary to not include the define name, but the value */
2021-01-05 16:13:11 +03:00
# define STRING(x) #x
# define TOSTRING(x) STRING(x)
/* Define VERSION as the first 3 digits of the zint library version number */
# define VERSION TOSTRING( ZINT_VERSION_MAJOR ) \
" . " TOSTRING ( ZINT_VERSION_MINOR ) \
" . " TOSTRING ( ZINT_VERSION_RELEASE )
2015-08-18 15:23:28 +03:00
/*----------------------------------------------------------------------------*/
/* >>>> External Prototypes (exports) */
2016-07-04 14:46:30 +03:00
EXPORT int Zint_Init ( Tcl_Interp * interp ) ;
2017-10-23 22:34:31 +03:00
EXPORT int Zint_Unload ( Tcl_Interp * Interp , int Flags ) ;
2015-08-18 15:23:28 +03:00
/*----------------------------------------------------------------------------*/
/* >>>> local prototypes */
2021-01-14 13:03:13 +03:00
static void InterpCleanupProc ( ClientData clientData , Tcl_Interp * interp ) ;
static int CheckForTk ( Tcl_Interp * interp , int * tkFlagPtr ) ;
2016-09-14 10:51:54 +03:00
static int Zint ( ClientData unused , Tcl_Interp * interp , int objc ,
Tcl_Obj * CONST objv [ ] ) ;
static int Encode ( Tcl_Interp * interp , int objc ,
Tcl_Obj * CONST objv [ ] ) ;
2015-08-18 15:23:28 +03:00
/*----------------------------------------------------------------------------*/
/* >>>> File Global Variables */
/* >> List of Codes */
static char * s_code_list [ ] = {
2016-09-14 10:51:54 +03:00
" Code11 " ,
2020-07-27 19:44:51 +03:00
" Standard2of5 " ,
2016-09-14 10:51:54 +03:00
" Interleaved2of5 " ,
" IATAC2of5 " ,
" Logic2of5 " ,
" Ind2of5 " ,
" Code39 " ,
" Code39Extended " ,
2017-10-23 22:34:31 +03:00
" EAN " ,
2020-07-27 19:44:51 +03:00
" EAN+Check " ,
2016-09-14 10:51:54 +03:00
" GS1-128 " ,
" Codabar " ,
" Code128 " ,
" DPLeit " ,
" DPIdent " ,
" Code16K " ,
" Code49 " ,
" Code93 " ,
" Flat " ,
" GS1DataBar " ,
" GS1DataBarLimited " ,
" GS1DataBarExpanded " ,
" Telepen " ,
2017-10-23 22:34:31 +03:00
" UPC-A " ,
2020-07-27 19:44:51 +03:00
" UPC-A+Check " ,
2016-09-14 10:51:54 +03:00
" UPC-E " ,
2017-10-23 22:34:31 +03:00
" UPC-E+Check " ,
2020-10-04 00:51:08 +03:00
" POSTNET " ,
2016-09-14 10:51:54 +03:00
" MSIPlessey " ,
" FIM " ,
" Logmars " ,
" Pharma " ,
" PZN " ,
" PharmaTwo " ,
" PDF417 " ,
2020-07-27 19:44:51 +03:00
" PDF417Compact " ,
2016-09-14 10:51:54 +03:00
" MaxiCode " ,
" QR " ,
" Code128B " ,
" AusPost " ,
" AusReply " ,
" AusRoute " ,
" AusRedirect " ,
" ISBN " ,
" RM4SCC " ,
" Datamatrix " ,
2020-08-04 16:49:25 +03:00
" EAN14 " ,
2020-07-27 19:44:51 +03:00
" VIN " ,
2016-09-14 10:51:54 +03:00
" CodablockF " ,
" NVE18 " ,
" JapanPost " ,
" KoreaPost " ,
2020-07-27 19:44:51 +03:00
" GS1DataBarStacked " ,
" GS1DataBarSstackedOmni " ,
" GS1DataBarExpandedStacked " ,
2020-10-04 00:51:08 +03:00
" PLANET " ,
2020-08-04 16:49:25 +03:00
" DPDCode " ,
2016-09-14 10:51:54 +03:00
" MicroPDF417 " ,
2020-07-27 19:44:51 +03:00
" USPSIntelligentMail " ,
2016-09-14 10:51:54 +03:00
" Plessey " ,
" TelepenNum " ,
" ITF14 " ,
" KIX " ,
" Aztec " ,
" DAFT " ,
" MicroQR " ,
" HIBC-128 " ,
" HIBC-39 " ,
" HIBC-DM " ,
" HIBC-QR " ,
" HIBC-PDF " ,
" HIBC-MicroPDF " ,
" HIBC-CodablockF " ,
2017-10-23 22:34:31 +03:00
" HIBCAztec " ,
2020-07-27 19:44:51 +03:00
" DotCode " ,
2020-08-04 16:49:25 +03:00
" HanXin " ,
2020-07-27 19:44:51 +03:00
" MailMark " ,
2017-08-29 23:19:55 +03:00
" AztecRunes " ,
2016-09-14 10:51:54 +03:00
" Code32 " ,
" EAN-CC " ,
2020-07-27 19:44:51 +03:00
" GS1-128-CC " ,
" GS1DataBarOmni-CC " ,
" GS1DataBarLimited-CC " ,
" GS1DataBarExpanded-CC " ,
2016-09-14 10:51:54 +03:00
" UPCA-CC " ,
" UPCE-CC " ,
2020-07-27 19:44:51 +03:00
" GS1DataBarStacked-CC " ,
" GS1DataBarStackedOmni-CC " ,
" GS1DataBarExpandedStacked-CC " ,
2016-09-14 10:51:54 +03:00
" Channel " ,
" CodeOne " ,
2016-10-14 17:23:15 +03:00
" GridMatrix " ,
2020-08-04 16:49:25 +03:00
" UPNQR " ,
" UltraCode " ,
2019-12-05 22:16:39 +03:00
" rMQR " ,
2016-09-14 10:51:54 +03:00
NULL } ;
2015-08-18 15:23:28 +03:00
static int s_code_number [ ] = {
2016-09-14 10:51:54 +03:00
BARCODE_CODE11 ,
2020-07-29 22:43:08 +03:00
BARCODE_C25STANDARD ,
2016-09-14 10:51:54 +03:00
BARCODE_C25INTER ,
BARCODE_C25IATA ,
BARCODE_C25LOGIC ,
BARCODE_C25IND ,
BARCODE_CODE39 ,
BARCODE_EXCODE39 ,
2017-10-23 22:34:31 +03:00
BARCODE_EANX ,
2020-08-04 16:49:25 +03:00
BARCODE_EANX_CHK ,
2020-07-29 22:43:08 +03:00
BARCODE_GS1_128 ,
2016-09-14 10:51:54 +03:00
BARCODE_CODABAR ,
BARCODE_CODE128 ,
BARCODE_DPLEIT ,
BARCODE_DPIDENT ,
BARCODE_CODE16K ,
BARCODE_CODE49 ,
BARCODE_CODE93 ,
BARCODE_FLAT ,
2020-07-29 22:43:08 +03:00
BARCODE_DBAR_OMN ,
BARCODE_DBAR_LTD ,
BARCODE_DBAR_EXP ,
2016-09-14 10:51:54 +03:00
BARCODE_TELEPEN ,
2017-10-23 22:34:31 +03:00
BARCODE_UPCA ,
2020-08-04 16:49:25 +03:00
BARCODE_UPCA_CHK ,
2016-09-14 10:51:54 +03:00
BARCODE_UPCE ,
2017-10-23 22:34:31 +03:00
BARCODE_UPCE_CHK ,
2016-09-14 10:51:54 +03:00
BARCODE_POSTNET ,
BARCODE_MSI_PLESSEY ,
BARCODE_FIM ,
BARCODE_LOGMARS ,
BARCODE_PHARMA ,
BARCODE_PZN ,
BARCODE_PHARMA_TWO ,
BARCODE_PDF417 ,
2020-07-30 00:35:31 +03:00
BARCODE_PDF417COMP ,
2016-09-14 10:51:54 +03:00
BARCODE_MAXICODE ,
BARCODE_QRCODE ,
BARCODE_CODE128B ,
BARCODE_AUSPOST ,
BARCODE_AUSREPLY ,
BARCODE_AUSROUTE ,
BARCODE_AUSREDIRECT ,
BARCODE_ISBNX ,
BARCODE_RM4SCC ,
BARCODE_DATAMATRIX ,
2020-08-04 16:49:25 +03:00
BARCODE_EAN14 ,
BARCODE_VIN ,
2016-09-14 10:51:54 +03:00
BARCODE_CODABLOCKF ,
BARCODE_NVE18 ,
BARCODE_JAPANPOST ,
BARCODE_KOREAPOST ,
2020-07-29 22:43:08 +03:00
BARCODE_DBAR_STK ,
BARCODE_DBAR_OMNSTK ,
BARCODE_DBAR_EXPSTK ,
2016-09-14 10:51:54 +03:00
BARCODE_PLANET ,
2020-08-04 16:49:25 +03:00
BARCODE_DPD ,
2016-09-14 10:51:54 +03:00
BARCODE_MICROPDF417 ,
2020-07-29 22:43:08 +03:00
BARCODE_USPS_IMAIL ,
2016-09-14 10:51:54 +03:00
BARCODE_PLESSEY ,
BARCODE_TELEPEN_NUM ,
BARCODE_ITF14 ,
BARCODE_KIX ,
BARCODE_AZTEC ,
BARCODE_DAFT ,
BARCODE_MICROQR ,
BARCODE_HIBC_128 ,
BARCODE_HIBC_39 ,
BARCODE_HIBC_DM ,
BARCODE_HIBC_QR ,
BARCODE_HIBC_PDF ,
BARCODE_HIBC_MICPDF ,
BARCODE_HIBC_BLOCKF ,
2017-10-23 22:34:31 +03:00
BARCODE_HIBC_AZTEC ,
2020-08-04 16:49:25 +03:00
BARCODE_DOTCODE ,
BARCODE_HANXIN ,
BARCODE_MAILMARK ,
2016-09-14 10:51:54 +03:00
BARCODE_AZRUNE ,
BARCODE_CODE32 ,
BARCODE_EANX_CC ,
2020-07-29 22:43:08 +03:00
BARCODE_GS1_128_CC ,
BARCODE_DBAR_OMN_CC ,
BARCODE_DBAR_LTD_CC ,
BARCODE_DBAR_EXP_CC ,
2016-09-14 10:51:54 +03:00
BARCODE_UPCA_CC ,
BARCODE_UPCE_CC ,
2020-07-29 22:43:08 +03:00
BARCODE_DBAR_STK_CC ,
BARCODE_DBAR_OMNSTK_CC ,
BARCODE_DBAR_EXPSTK_CC ,
2016-09-14 10:51:54 +03:00
BARCODE_CHANNEL ,
BARCODE_CODEONE ,
2016-10-14 17:23:15 +03:00
BARCODE_GRIDMATRIX ,
2020-08-04 16:49:25 +03:00
BARCODE_UPNQR ,
BARCODE_ULTRA ,
2019-12-05 22:16:39 +03:00
BARCODE_RMQR ,
2016-09-14 10:51:54 +03:00
0 } ;
2015-08-18 15:23:28 +03:00
2018-11-02 20:48:04 +03:00
/* ECI TCL encoding names.
* The ECI comments are given after the name .
* A * * indicates encodings where native data must be delivered and not utf - 8
*/
static char * s_eci_list [ ] = {
" iso8859-1 " , /* 3: ISO-8859-1 - Latin alphabet No. 1 (default)*/
" iso8859-2 " , /* 4: ISO-8859-2 - Latin alphabet No. 2*/
" iso8859-3 " , /* 5: ISO-8859-3 - Latin alphabet No. 3*/
" iso8859-4 " , /* 6: ISO-8859-4 - Latin alphabet No. 4*/
" iso8859-5 " , /* 7: ISO-8859-5 - Latin/Cyrillic alphabet*/
" iso8859-6 " , /* 8: ISO-8859-6 - Latin/Arabic alphabet*/
" iso8859-7 " , /* 9: ISO-8859-7 - Latin/Greek alphabet*/
" iso8859-9 " , /*10: ISO-8859-8 - Latin/Hebrew alphabet*/
" iso8859-9 " , /*11: ISO-8859-9 - Latin alphabet No. 5*/
" iso8859-10 " , /*12: ISO-8859-10 - Latin alphabet No. 6*/
" iso8859-11 " , /*13: ISO-8859-11 - Latin/Thai alphabet*/
" iso8859-13 " , /*15: ISO-8859-13 - Latin alphabet No. 7*/
" iso8859-14 " , /*16: ISO-8859-14 - Latin alphabet No. 8 (Celtic)*/
" iso8859-15 " , /*17: ISO-8859-15 - Latin alphabet No. 9*/
" iso8859-16 " , /*18: ISO-8859-16 - Latin alphabet No. 10*/
2021-01-12 17:11:53 +03:00
" jis0208 " , /*20: Shift JIS (JIS X 0208 and JIS X 0201)*/
2018-11-02 20:48:04 +03:00
" cp1250 " , /*21: Windows-1250*/
" cp1251 " , /*22: Windows-1251*/
" cp1252 " , /*23: Windows-1252*/
" cp1256 " , /*24: Windows-1256*/
2021-01-12 17:11:53 +03:00
" unicode " , /*25: UCS-2BE (High order byte first) Unicode BMP*/
2018-11-02 20:48:04 +03:00
" utf-8 " , /*26: Unicode (UTF-8)*/
" ascii " , /*27: ISO-646:1991 7-bit character set*/
2021-01-12 17:11:53 +03:00
" big5 " , /*28: Big5 (Taiwan) Chinese Character Set*/
" euc-cn " , /*29: GB (PRC) Chinese Character Set*/
2021-03-20 17:36:21 +03:00
" iso2022-kr " , /*30: Korean Character Set EUC-KR (KS X 1001:2002)*/
2020-08-04 16:49:25 +03:00
NULL
2018-11-02 20:48:04 +03:00
} ;
/* The ECI numerical number to pass to ZINT */
static int s_eci_number [ ] = {
3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 15 , 16 , 17 , 18 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30
} ;
2015-08-18 15:23:28 +03:00
/* Version information */
static char version_string [ ] = VERSION ;
/* Help text */
static char help_message [ ] = " zint tcl(stub,obj) dll \n "
2018-11-02 20:48:04 +03:00
" Generate barcode in tk images \n "
2016-09-14 10:51:54 +03:00
" Usage: \n "
2021-01-14 13:03:13 +03:00
" zint encode data photo ?option value? ... \n "
2017-10-23 22:34:31 +03:00
" data: data to encode in the symbol \n "
2017-10-23 18:32:57 +03:00
" photo: a tcl photo image handle ('p' after 'image create photo p') \n "
2016-09-14 10:51:54 +03:00
" Available options: \n "
2018-11-02 20:48:04 +03:00
" -barcode choice: symbology, use 'zint symbology' to get a list \n "
2021-01-05 16:13:11 +03:00
" -addongap number: (7..12, default: 9) set add-on gap in multiple of module size (UPC/EAN-CC) \n "
" -bg color: set background color as 6 or 8 hex rrggbbaa \n "
/* cli option --binary internally handled */
2016-09-14 10:51:54 +03:00
" -bind bool: bars above/below the code, size set by -border \n "
2021-01-05 16:13:11 +03:00
" -bold bool: use bold text \n "
2018-11-02 20:48:04 +03:00
" -border integer: width of a border around the symbol. Use with -bind/-box 1 \n "
2016-09-14 10:51:54 +03:00
" -box bool: box around bar code, size set be -border \n "
2021-01-05 16:13:11 +03:00
/* cli option --cmyk not supported as no corresponding output */
2021-01-22 21:07:59 +03:00
" -cols integer: PDF417, Codablock F, DotCode: number of columns \n "
2021-01-05 16:13:11 +03:00
/* cli option --data is standard parameter */
2018-11-02 11:36:51 +03:00
" -dmre bool: Allow Data Matrix Rectangular Extended \n "
2018-11-02 20:48:04 +03:00
" -dotsize number: radius ratio of dots from 0.01 to 1.0 \n "
2021-01-05 16:13:11 +03:00
" -dotty bool: use dots instead of boxes for matrix codes \n "
/* cli option --dump not supported */
/* cli option --ecinos not supported */
" -eci number: ECI to use \n "
/* cli option --esc not supported */
" -fg color: set foreground color as 6 or 8 hex rrggbbaa \n "
/* replaces cli options --binary and --gs1 */
2020-08-04 16:49:25 +03:00
" -format binary|unicode|gs1: input data format. Default:unicode \n "
2021-01-05 16:13:11 +03:00
" -fullmultibyte bool: allow multibyte compaction for xQR, HanXin, Gridmatrix \n "
/* cli option --gs1 replaced by -format */
2021-05-15 14:23:46 +03:00
" -gs1parens bool: for gs1, AIs enclosed in parentheses instead of square brackets \n "
2020-08-04 16:49:25 +03:00
" -gssep bool: for gs1, use gs as separator instead fnc1 (Datamatrix only) \n "
2021-01-05 16:13:11 +03:00
" -height integer: Symbol height in modules \n "
/* cli option --input not supported */
2016-09-14 10:51:54 +03:00
" -init bool: Create reader initialisation symbol (Code 128, Data Matrix) \n "
2021-01-22 21:07:59 +03:00
" -mask number: set masking pattern to use (QR/MicroQR/HanXin/DotCode) \n "
2021-01-05 16:13:11 +03:00
/* cli option --mirror not supported */
2021-01-22 21:07:59 +03:00
" -mode number: set encoding mode (MaxiCode, Composite) \n "
2021-01-05 16:13:11 +03:00
" -nobackground bool: set background transparent \n "
" -notext bool: no interpretation line \n "
/* cli option --output not supported */
" -primary text: Structured primary data (MaxiCode, Composite) \n "
" -reverse bool: Reverse colours (white on black) \n "
" -rotate angle: Image rotation by 0,90 or 270 degrees \n "
" -rows integer: Codablock F: number of rows \n "
" -scale double: Scale the image to this factor \n "
" -scmvv number: Prefix SCM with [)> \\ R01 \\ Gvv (vv is NUMBER) (MaxiCode) \n "
" -secure integer: EC Level (PDF417, QR) \n "
" -separator 0..4 (default: 1) : Stacked symbologies: separator width \n "
/* cli option --small replaced by -smalltext */
2016-09-14 10:51:54 +03:00
" -smalltext bool: tiny interpretation line font \n "
2021-01-05 16:13:11 +03:00
" -square bool: force Data Matrix symbols to be square \n "
/* cli option --types not supported */
" -vers integer: Symbology option \n "
" -whitesp integer: horizontal quiet zone in modules \n "
" -werror bool: Convert all warnings into errors \n "
" -wzpl bool: ZPL compatibility mode (allows non-standard symbols) \n "
2016-09-14 10:51:54 +03:00
" -to {x0 y0 ?width? ?height?}: place to put in photo image \n "
" \n "
" zint symbologies: List available symbologies \n "
2018-11-02 20:48:04 +03:00
" zint eci: List available eci tables \n "
2021-01-05 16:13:11 +03:00
" zint help \n "
" zint version \n "
2016-09-14 10:51:54 +03:00
;
2021-01-05 16:13:11 +03:00
2015-08-18 15:23:28 +03:00
/*----------------------------------------------------------------------------*/
/* Exported symbols */
2016-07-04 14:46:30 +03:00
# if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
2016-09-14 10:51:54 +03:00
EXPORT BOOL WINAPI DllEntryPoint ( HINSTANCE hInstance ,
DWORD seginfo , LPVOID lpCmdLine )
2015-08-18 15:23:28 +03:00
{
/* Don't do anything, so just return true */
return TRUE ;
}
2016-07-04 14:46:30 +03:00
# endif
2015-08-18 15:23:28 +03:00
/*----------------------------------------------------------------------------*/
/* Initialisation Procedures */
2017-09-10 18:03:09 +03:00
EXPORT int Zint_Init ( Tcl_Interp * interp )
2015-08-18 15:23:28 +03:00
{
2021-01-14 13:03:13 +03:00
int * tkFlagPtr ;
2016-09-14 10:51:54 +03:00
/*------------------------------------------------------------------------*/
2016-07-04 14:46:30 +03:00
# ifdef USE_TCL_STUBS
2021-01-14 13:03:13 +03:00
if ( Tcl_InitStubs ( interp , " 8.5 " , 0 ) = = NULL )
2016-07-04 14:46:30 +03:00
# else
2021-01-14 13:03:13 +03:00
if ( Tcl_PkgRequire ( interp , " Tcl " , " 8.5 " , 0 ) = = NULL )
2016-07-04 14:46:30 +03:00
# endif
2016-09-14 10:51:54 +03:00
{
return TCL_ERROR ;
}
/*------------------------------------------------------------------------*/
2021-01-14 13:03:13 +03:00
/* This procedure is called once per thread and any thread local data */
/* should be allocated and initialized here (and not in static variables) */
/* Create a flag if Tk is loaded */
tkFlagPtr = ( int * ) ckalloc ( sizeof ( int ) ) ;
* tkFlagPtr = 0 ;
Tcl_CallWhenDeleted ( interp , InterpCleanupProc , ( ClientData ) tkFlagPtr ) ;
2016-09-14 10:51:54 +03:00
/*------------------------------------------------------------------------*/
2021-01-14 13:03:13 +03:00
Tcl_CreateObjCommand ( interp , " zint " , Zint , ( ClientData ) tkFlagPtr ,
( Tcl_CmdDeleteProc * ) NULL ) ;
2017-10-16 20:26:54 +03:00
Tcl_PkgProvide ( interp , " zint " , version_string ) ;
2016-09-14 10:51:54 +03:00
/*------------------------------------------------------------------------*/
return TCL_OK ;
2015-08-18 15:23:28 +03:00
}
2021-01-14 13:03:13 +03:00
/*----------------------------------------------------------------------------*/
/* >>>> Cleanup procedure */
/*----------------------------------------------------------------------------*/
/* This routine is called, if a thread is terminated */
static void InterpCleanupProc ( ClientData clientData , Tcl_Interp * interp )
{
ckfree ( ( char * ) clientData ) ;
}
/*----------------------------------------------------------------------------*/
/* >>>> Unload Procedures */
/*----------------------------------------------------------------------------*/
2017-10-23 22:34:31 +03:00
EXPORT int Zint_Unload ( Tcl_Interp * Interp , int Flags )
{
2020-08-04 16:49:25 +03:00
// Allow unload
return TCL_OK ;
2017-10-23 22:34:31 +03:00
}
2015-08-18 15:23:28 +03:00
/*----------------------------------------------------------------------------*/
/* >>>>> Called routine */
/*----------------------------------------------------------------------------*/
/* Decode tcl commands */
2021-01-14 13:03:13 +03:00
static int Zint ( ClientData tkFlagPtr , Tcl_Interp * interp , int objc ,
2016-09-14 10:51:54 +03:00
Tcl_Obj * CONST objv [ ] )
2015-08-18 15:23:28 +03:00
{
2016-09-14 10:51:54 +03:00
/* Option list and indexes */
2018-11-02 20:48:04 +03:00
enum iCommand { iEncode , iSymbologies , iECI , iVersion , iHelp } ;
2016-09-14 10:51:54 +03:00
/* choice of option */
int Index ;
/*------------------------------------------------------------------------*/
/* > Check if option argument is given and decode it */
if ( objc > 1 )
{
2018-11-02 20:48:04 +03:00
char * subCmds [ ] = { " encode " , " symbologies " , " eci " , " version " , " help " , NULL } ;
2016-09-14 10:51:54 +03:00
if ( Tcl_GetIndexFromObj ( interp , objv [ 1 ] , ( const char * * ) subCmds ,
" option " , 0 , & Index )
= = TCL_ERROR )
{
return TCL_ERROR ;
}
} else {
Tcl_WrongNumArgs ( interp , 1 , objv , " option " ) ;
return TCL_ERROR ;
}
/*------------------------------------------------------------------------*/
/* > Call functions in dependency of Index */
/*------------------------------------------------------------------------*/
switch ( Index )
{
case iEncode :
2021-01-14 13:03:13 +03:00
if ( CheckForTk ( interp , ( int * ) tkFlagPtr ) ! = TCL_OK ) {
return TCL_ERROR ;
}
2016-09-14 10:51:54 +03:00
return Encode ( interp , objc , objv ) ;
case iSymbologies :
2015-08-18 15:23:28 +03:00
{
Tcl_Obj * oRes ;
int posCur ;
oRes = Tcl_NewObj ( ) ;
for ( posCur = 0 ; s_code_list [ posCur ] ! = NULL ; posCur + + ) {
if ( ZBarcode_ValidID ( s_code_number [ posCur ] ) ! = 0 ) {
if ( TCL_OK ! = Tcl_ListObjAppendElement ( interp ,
2016-09-14 10:51:54 +03:00
oRes , Tcl_NewStringObj ( s_code_list [ posCur ] , - 1 ) ) )
2015-08-18 15:23:28 +03:00
{
return TCL_ERROR ;
}
}
}
Tcl_SetObjResult ( interp , oRes ) ;
return TCL_OK ;
}
2018-11-02 20:48:04 +03:00
case iECI :
{
Tcl_Obj * oRes ;
int posCur ;
oRes = Tcl_NewObj ( ) ;
for ( posCur = 0 ; s_eci_list [ posCur ] ! = NULL ; posCur + + ) {
if ( TCL_OK ! = Tcl_ListObjAppendElement ( interp ,
oRes , Tcl_NewStringObj ( s_eci_list [ posCur ] , - 1 ) ) )
{
return TCL_ERROR ;
}
}
Tcl_SetObjResult ( interp , oRes ) ;
return TCL_OK ;
}
2016-09-14 10:51:54 +03:00
case iVersion :
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( version_string , - 1 ) ) ;
return TCL_OK ;
case iHelp :
default :
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( help_message , - 1 ) ) ;
return TCL_OK ;
}
2015-08-18 15:23:28 +03:00
}
2021-01-14 13:03:13 +03:00
/*----------------------------------------------------------------------
* Check availability of Tk .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
static int CheckForTk ( Tcl_Interp * interp , int * tkFlagPtr )
{
if ( * tkFlagPtr > 0 ) {
return TCL_OK ;
}
if ( * tkFlagPtr = = 0 ) {
if ( ! Tcl_PkgPresent ( interp , " Tk " , " 8.5 " , 0 ) ) {
Tcl_SetResult ( interp , " package Tk not loaded " , TCL_STATIC ) ;
return TCL_ERROR ;
}
}
# ifdef USE_TK_STUBS
if ( * tkFlagPtr < 0 | | Tk_InitStubs ( interp , " 8.5 " , 0 ) = = NULL ) {
* tkFlagPtr = - 1 ;
Tcl_SetResult ( interp , " error initializing Tk " , TCL_STATIC ) ;
return TCL_ERROR ;
}
# endif
* tkFlagPtr = 1 ;
return TCL_OK ;
} /*----------------------------------------------------------------------------*/
2015-08-18 15:23:28 +03:00
/* >>>>> Encode */
/*----------------------------------------------------------------------------*/
/* Encode image */
2016-09-14 10:51:54 +03:00
static int Encode ( Tcl_Interp * interp , int objc ,
Tcl_Obj * CONST objv [ ] )
2015-08-18 15:23:28 +03:00
{
2021-01-05 16:13:11 +03:00
struct zint_symbol * my_symbol ;
2016-09-14 10:51:54 +03:00
Tcl_DString dsInput ;
char * pStr = NULL ;
int lStr ;
2018-11-02 20:48:04 +03:00
Tcl_Encoding hZINTEncoding ;
2016-09-14 10:51:54 +03:00
int rotate_angle = 0 ;
int fError = 0 ;
Tcl_DString dString ;
int optionPos ;
int destX0 = 0 ;
int destY0 = 0 ;
int destWidth = 0 ;
int destHeight = 0 ;
2020-08-04 16:49:25 +03:00
int ECIIndex = 0 ;
2020-07-27 19:44:51 +03:00
int fFullMultiByte = 0 ;
int addon_gap = 0 ;
2020-05-19 13:02:18 +03:00
int Separator = 1 ;
2020-11-27 15:54:44 +03:00
int Mask = 0 ;
2021-01-05 16:13:11 +03:00
unsigned int cap ;
2016-09-14 10:51:54 +03:00
/*------------------------------------------------------------------------*/
/* >> Check if at least data and object is given and a pair number of */
/* >> options */
if ( objc < 4 | | ( objc % 2 ) ! = 0 )
{
Tcl_WrongNumArgs ( interp , 2 , objv , " data photo ?-switch value?... " ) ;
return TCL_ERROR ;
}
/*------------------------------------------------------------------------*/
/* >>> Prepare encoding */
2018-11-02 20:48:04 +03:00
hZINTEncoding = Tcl_GetEncoding ( interp , " utf-8 " ) ;
if ( NULL = = hZINTEncoding ) {
2016-09-14 10:51:54 +03:00
return TCL_ERROR ;
}
/*------------------------------------------------------------------------*/
/* >>> Prepare zint object */
2021-01-05 16:13:11 +03:00
my_symbol = ZBarcode_Create ( ) ;
my_symbol - > input_mode = UNICODE_MODE ;
my_symbol - > option_3 = 0 ;
2016-09-14 10:51:54 +03:00
/*------------------------------------------------------------------------*/
/* >> Decode options */
for ( optionPos = 4 ; optionPos < objc ; optionPos + = 2 ) {
/*--------------------------------------------------------------------*/
/* Option list and indexes */
char * optionList [ ] = {
2020-07-27 19:44:51 +03:00
" -addongap " , " -barcode " , " -bg " , " -bind " , " -bold " , " -border " , " -box " ,
" -cols " , " -dmre " , " -dotsize " , " -dotty " , " -eci " , " -fg " , " -format " ,
2021-05-15 14:23:46 +03:00
" -fullmultibyte " , " -gs1parens " , " -gssep " , " -height " , " -init " , " -mask " , " -mode " ,
2021-01-05 16:13:11 +03:00
" -nobackground " , " -notext " , " -primary " , " -reverse " , " -rotate " ,
" -rows " , " -scale " , " -scmvv " , " -secure " , " -separator " , " -smalltext " ,
" -square " , " -to " , " -vers " , " -werror " , " -whitesp " , " -wzpl " ,
NULL } ;
2016-09-14 10:51:54 +03:00
enum iOption {
2021-01-05 16:13:11 +03:00
iAddonGap , iBarcode , iBG , iBind , iBold , iBorder , iBox ,
iCols , iDMRE , iDotSize , iDotty , iECI , iFG , iFormat ,
2021-05-15 14:23:46 +03:00
iFullMultiByte , iGS1Parens , iGSSep , iHeight , iInit , iMask , iMode ,
2021-01-05 16:13:11 +03:00
iNoBackground , iNoText , iPrimary , iReverse , iRotate ,
iRows , iScale , iSCMvv , iSecure , iSeparator , iSmallText ,
iSquare , iTo , iVers , iWError , iWhiteSp , iWZPL
2016-09-14 10:51:54 +03:00
} ;
int optionIndex ;
int intValue ;
double doubleValue ;
/*--------------------------------------------------------------------*/
if ( Tcl_GetIndexFromObj ( interp , objv [ optionPos ] ,
( const char * * ) optionList ,
" zint option " , optionPos - 1 , & optionIndex )
= = TCL_ERROR )
{
fError = 1 ;
break ;
}
/*--------------------------------------------------------------------*/
/* >> Decode object */
switch ( optionIndex ) {
case iBind :
2018-11-02 20:48:04 +03:00
case iBold :
2016-09-14 10:51:54 +03:00
case iBox :
2018-11-02 20:48:04 +03:00
case iDMRE :
case iDotty :
2021-05-15 14:23:46 +03:00
case iGS1Parens :
2020-08-04 16:49:25 +03:00
case iGSSep :
2016-09-14 10:51:54 +03:00
case iInit :
2020-08-04 16:49:25 +03:00
case iNoBackground :
2016-09-14 10:51:54 +03:00
case iNoText :
2018-11-02 20:48:04 +03:00
case iSmallText :
2020-08-04 16:49:25 +03:00
case iSquare :
case iFullMultiByte :
2021-01-05 16:13:11 +03:00
case iReverse :
case iWError :
case iWZPL :
2016-09-14 10:51:54 +03:00
/* >> Binary options */
if ( TCL_OK ! = Tcl_GetBooleanFromObj ( interp , objv [ optionPos + 1 ] ,
& intValue ) )
{
fError = 1 ;
}
break ;
case iFG :
case iBG :
/* >> Colors */
pStr = Tcl_GetStringFromObj ( objv [ optionPos + 1 ] , & lStr ) ;
2020-08-04 16:49:25 +03:00
if ( lStr ! = 6 & & lStr ! = 8 ) {
2016-09-14 10:51:54 +03:00
Tcl_SetObjResult ( interp ,
2020-08-04 16:49:25 +03:00
Tcl_NewStringObj ( " Color is not 6 or 8 hex " , - 1 ) ) ;
2016-09-14 10:51:54 +03:00
fError = 1 ;
}
break ;
2018-11-02 20:48:04 +03:00
case iDotSize :
2016-09-14 10:51:54 +03:00
case iScale :
/* >> Float */
if ( TCL_OK ! = Tcl_GetDoubleFromObj ( interp , objv [ optionPos + 1 ] ,
& doubleValue ) )
{
fError = 1 ;
}
break ;
2020-07-27 19:44:51 +03:00
case iAddonGap :
2016-09-14 10:51:54 +03:00
case iBorder :
2016-10-14 17:23:15 +03:00
case iCols :
2018-11-02 20:48:04 +03:00
case iHeight :
2016-09-14 10:51:54 +03:00
case iMode :
case iRotate :
2018-11-02 20:48:04 +03:00
case iRows :
case iSecure :
case iVers :
2016-09-14 10:51:54 +03:00
case iWhiteSp :
2020-05-19 13:02:18 +03:00
case iSeparator :
2020-11-27 15:54:44 +03:00
case iMask :
2020-12-19 20:13:35 +03:00
case iSCMvv :
2020-11-27 15:54:44 +03:00
/* >> Int */
if ( TCL_OK ! = Tcl_GetIntFromObj ( interp , objv [ optionPos + 1 ] ,
& intValue ) )
{
fError = 1 ;
}
break ;
2016-09-14 10:51:54 +03:00
case iPrimary :
/* > Primary String up to 90 characters */
/* > Output filename up to 250 characters */
Tcl_DStringInit ( & dString ) ;
pStr = Tcl_GetStringFromObj ( objv [ optionPos + 1 ] , & lStr ) ;
2018-11-02 20:48:04 +03:00
Tcl_UtfToExternalDString ( hZINTEncoding , pStr , lStr , & dString ) ;
2016-09-14 10:51:54 +03:00
if ( Tcl_DStringLength ( & dString ) > ( optionIndex = = iPrimary ? 90 : 250 ) ) {
Tcl_DStringFree ( & dString ) ;
Tcl_SetObjResult ( interp , Tcl_NewStringObj ( " String to long " , - 1 ) ) ;
fError = 1 ;
}
break ;
}
if ( fError ) {
break ;
}
/*--------------------------------------------------------------------*/
switch ( optionIndex ) {
2020-07-27 19:44:51 +03:00
case iAddonGap :
if ( intValue < 7 | | intValue > 12 ) {
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Invalid add-on gap value not within 7 to 12 " , - 1 ) ) ;
fError = 1 ;
} else {
addon_gap = intValue ;
}
break ;
2016-09-14 10:51:54 +03:00
case iBind :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options | = BARCODE_BIND ;
2016-09-14 10:51:54 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options & = ~ BARCODE_BIND ;
2016-09-14 10:51:54 +03:00
}
break ;
2018-11-02 20:48:04 +03:00
case iBold :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options | = BOLD_TEXT ;
2018-11-02 20:48:04 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options & = ~ BOLD_TEXT ;
2018-11-02 20:48:04 +03:00
}
break ;
2016-09-14 10:51:54 +03:00
case iBox :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options | = BARCODE_BOX ;
2016-09-14 10:51:54 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options & = ~ BARCODE_BOX ;
2016-09-14 10:51:54 +03:00
}
break ;
2018-11-02 20:48:04 +03:00
case iDotSize :
if ( doubleValue < 0.01 ) {
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Dot size below 0.01 " , - 1 ) ) ;
fError = 1 ;
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > dot_size = ( float ) doubleValue ;
2018-11-02 20:48:04 +03:00
}
break ;
case iDotty :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options | = BARCODE_DOTTY_MODE ;
2018-11-02 20:48:04 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options & = ~ BARCODE_DOTTY_MODE ;
2019-09-02 13:37:01 +03:00
}
break ;
2021-05-15 14:23:46 +03:00
case iGS1Parens :
if ( intValue ) {
my_symbol - > input_mode | = GS1PARENS_MODE ;
} else {
my_symbol - > input_mode & = ~ GS1PARENS_MODE ;
}
break ;
2019-09-02 13:37:01 +03:00
case iGSSep :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options | = GS1_GS_SEPARATOR ;
2019-09-02 13:37:01 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options & = ~ GS1_GS_SEPARATOR ;
2018-11-02 20:48:04 +03:00
}
2020-08-04 16:49:25 +03:00
break ;
case iFullMultiByte :
fFullMultiByte = intValue ;
break ;
2018-11-02 20:48:04 +03:00
case iECI :
if ( Tcl_GetIndexFromObj ( interp , objv [ optionPos + 1 ] ,
( const char * * ) s_eci_list , " -eci " , optionPos , & ECIIndex )
= = TCL_ERROR )
{
fError = 1 ;
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > eci = s_eci_number [ ECIIndex ] ;
2018-11-02 20:48:04 +03:00
}
break ;
2016-09-14 10:51:54 +03:00
case iInit :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options | = READER_INIT ;
2016-09-14 10:51:54 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options & = ~ READER_INIT ;
2016-09-14 10:51:54 +03:00
}
break ;
case iSmallText :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options | = SMALL_TEXT ;
2016-09-14 10:51:54 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > output_options & = ~ SMALL_TEXT ;
}
break ;
case iReverse :
if ( intValue ) {
strcpy ( my_symbol - > fgcolour , " ffffff " ) ;
strcpy ( my_symbol - > bgcolour , " 000000 " ) ;
}
break ;
case iWError :
if ( intValue ) {
my_symbol - > warn_level = WARN_FAIL_ALL ;
}
break ;
case iWZPL :
if ( intValue ) {
my_symbol - > warn_level = WARN_ZPL_COMPAT ;
2016-09-14 10:51:54 +03:00
}
break ;
case iFG :
2021-01-05 16:13:11 +03:00
strncpy ( my_symbol - > fgcolour , pStr , lStr ) ;
my_symbol - > fgcolour [ lStr ] = ' \0 ' ;
2016-09-14 10:51:54 +03:00
break ;
case iBG :
2021-01-05 16:13:11 +03:00
strncpy ( my_symbol - > bgcolour , pStr , lStr ) ;
my_symbol - > bgcolour [ lStr ] = ' \0 ' ;
2020-08-04 16:49:25 +03:00
break ;
case iNoBackground :
if ( intValue ) {
2021-01-05 16:13:11 +03:00
strcpy ( my_symbol - > bgcolour , " ffffff00 " ) ;
2020-08-04 16:49:25 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
case iNoText :
2021-01-05 16:13:11 +03:00
my_symbol - > show_hrt = ( intValue ? 0 : 1 ) ;
2016-09-14 10:51:54 +03:00
break ;
case iSquare :
2018-11-02 20:48:04 +03:00
/* DM_SQUARE overwrites DM_DMRE */
if ( intValue )
2021-01-05 16:13:11 +03:00
my_symbol - > option_3 = DM_SQUARE ;
2016-09-14 10:51:54 +03:00
break ;
case iDMRE :
2018-11-02 20:48:04 +03:00
/* DM_DMRE overwrites DM_SQUARE */
if ( intValue )
2021-01-05 16:13:11 +03:00
my_symbol - > option_3 = DM_DMRE ;
2016-09-14 10:51:54 +03:00
break ;
case iScale :
2015-08-18 15:23:28 +03:00
if ( doubleValue < 0.01 ) {
2016-09-14 10:51:54 +03:00
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Scale below 0.01 " , - 1 ) ) ;
fError = 1 ;
2015-08-18 15:23:28 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > scale = ( float ) doubleValue ;
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
case iBorder :
2015-08-18 15:23:28 +03:00
if ( intValue < 0 | | intValue > 1000 ) {
2016-09-14 10:51:54 +03:00
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Border out of range " , - 1 ) ) ;
fError = 1 ;
2015-08-18 15:23:28 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > border_width = intValue ;
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
case iHeight :
2015-08-18 15:23:28 +03:00
if ( intValue < 1 | | intValue > 1000 ) {
2016-09-14 10:51:54 +03:00
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Height out of range " , - 1 ) ) ;
fError = 1 ;
2015-08-18 15:23:28 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > height = intValue ;
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
2020-05-19 13:02:18 +03:00
case iSeparator :
if ( intValue < 0 | | intValue > 4 ) {
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Separator out of range " , - 1 ) ) ;
fError = 1 ;
} else {
Separator = intValue ;
}
break ;
2020-11-27 15:54:44 +03:00
case iMask :
if ( intValue < 0 | | intValue > 7 ) {
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Mask out of range " , - 1 ) ) ;
fError = 1 ;
} else {
Mask = intValue + 1 ;
}
break ;
2020-12-19 20:13:35 +03:00
case iSCMvv :
if ( intValue < 0 | | intValue > 99 ) {
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " SCM version out of range " , - 1 ) ) ;
fError = 1 ;
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > option_2 = intValue + 1 ;
2020-12-19 20:13:35 +03:00
}
break ;
2016-09-14 10:51:54 +03:00
case iCols :
case iVers :
/* >> Int in Option 2 */
2015-08-18 15:23:28 +03:00
if ( intValue < 1
2021-01-22 21:07:59 +03:00
| | ( optionIndex = = iCols & & intValue > 108 )
2016-09-14 10:51:54 +03:00
| | ( optionIndex = = iVers & & intValue > 47 ) )
2015-08-18 15:23:28 +03:00
{
2016-09-14 10:51:54 +03:00
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " cols/vers out of range " , - 1 ) ) ;
fError = 1 ;
2015-08-18 15:23:28 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > option_2 = intValue ;
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
case iSecure :
2016-10-14 17:23:15 +03:00
case iMode :
2016-09-14 10:51:54 +03:00
case iRows :
/* >> Int in Option 1 */
2015-08-18 15:23:28 +03:00
if ( ( optionIndex = = iSecure & & ( intValue < 1 | | intValue > 8 ) )
2016-09-14 10:51:54 +03:00
| | ( optionIndex = = iMode & & ( intValue < 0 | | intValue > 6 ) )
2016-10-14 17:23:15 +03:00
| | ( optionIndex = = iRows & & ( intValue < 0 | | intValue > 44 ) ) )
2015-08-18 15:23:28 +03:00
{
2016-09-14 10:51:54 +03:00
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " secure/mode/rows out of range " , - 1 ) ) ;
fError = 1 ;
2015-08-18 15:23:28 +03:00
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > option_1 = intValue ;
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
case iPrimary :
2021-01-05 16:13:11 +03:00
strcpy ( my_symbol - > primary , Tcl_DStringValue ( & dString ) ) ;
2016-09-14 10:51:54 +03:00
Tcl_DStringFree ( & dString ) ;
break ;
case iRotate :
2015-08-18 15:23:28 +03:00
/* >> Rotate angle */
/*----------------------------------------------------------------*/
{
2018-11-02 11:36:51 +03:00
char * rotateList [ ] = { " 0 " , " 90 " , " 180 " , " 270 " , NULL } ;
2015-08-18 15:23:28 +03:00
enum iRotate { iRotate0 , iRotate90 , iRotate180 , iRotate270 } ;
/*------------------------------------------------------------*/
if ( Tcl_GetIndexFromObj ( interp , objv [ optionPos + 1 ] ,
( const char * * ) rotateList ,
2016-09-14 10:51:54 +03:00
" rotate " , optionPos , & intValue )
2015-08-18 15:23:28 +03:00
= = TCL_ERROR )
{
fError = 1 ;
break ;
}
switch ( intValue ) {
case iRotate90 : rotate_angle = 90 ; break ;
case iRotate180 : rotate_angle = 180 ; break ;
case iRotate270 : rotate_angle = 270 ; break ;
default : rotate_angle = 0 ; break ;
}
}
2016-09-14 10:51:54 +03:00
break ;
case iBarcode :
2015-08-18 15:23:28 +03:00
if ( Tcl_GetIndexFromObj ( interp , objv [ optionPos + 1 ] ,
2016-09-14 10:51:54 +03:00
( const char * * ) s_code_list , " -barcode " , optionPos , & intValue )
2015-08-18 15:23:28 +03:00
= = TCL_ERROR )
{
fError = 1 ;
} else {
2021-01-05 16:13:11 +03:00
my_symbol - > symbology = s_code_number [ intValue ] ;
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
case iWhiteSp :
2021-01-05 16:13:11 +03:00
my_symbol - > whitespace_width = intValue ;
2016-09-14 10:51:54 +03:00
break ;
case iTo :
2015-08-18 15:23:28 +03:00
/* >> Decode the -to parameter as list of X0 Y0 ?Width Height? */
{
Tcl_Obj * poParam ;
if ( TCL_OK ! = Tcl_ListObjLength ( interp ,
2016-09-14 10:51:54 +03:00
objv [ optionPos + 1 ] , & lStr ) )
2015-08-18 15:23:28 +03:00
{
fError = 1 ;
} else if ( ! ( lStr = = 2 | | lStr = = 4 ) ) {
Tcl_SetObjResult ( interp ,
2016-09-14 10:51:54 +03:00
Tcl_NewStringObj (
" option -to not a list of 2 or 4 " , - 1 ) ) ;
2015-08-18 15:23:28 +03:00
fError = 1 ;
2016-07-04 14:46:30 +03:00
} else if ( (
2016-09-14 10:51:54 +03:00
TCL_OK ! = Tcl_ListObjIndex ( interp , objv [ optionPos + 1 ] ,
0 , & poParam )
| | TCL_OK ! = Tcl_GetIntFromObj ( interp , poParam , & destX0 )
| | TCL_OK ! = Tcl_ListObjIndex ( interp , objv [ optionPos + 1 ] ,
1 , & poParam )
| | TCL_OK ! = Tcl_GetIntFromObj ( interp , poParam , & destY0 )
| | lStr = = 4 ) & & (
TCL_OK ! = Tcl_ListObjIndex ( interp , objv [ optionPos + 1 ] ,
2 , & poParam )
| | TCL_OK ! = Tcl_GetIntFromObj ( interp , poParam ,
& destWidth )
| | TCL_OK ! = Tcl_ListObjIndex ( interp , objv [ optionPos + 1 ] ,
3 , & poParam )
| | TCL_OK ! = Tcl_GetIntFromObj ( interp , poParam ,
& destHeight )
) )
2015-08-18 15:23:28 +03:00
{
fError = 1 ;
2016-09-14 10:51:54 +03:00
}
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
break ;
2015-08-18 15:23:28 +03:00
case iFormat :
/* >> Format of the input data */
/*----------------------------------------------------------------*/
{
char * formatList [ ] = { " binary " , " gs1 " , " unicode " , NULL } ;
enum iFormat { iBinary , iGS1 , iUnicode } ;
/*------------------------------------------------------------*/
if ( Tcl_GetIndexFromObj ( interp , objv [ optionPos + 1 ] ,
( const char * * ) formatList ,
2016-09-14 10:51:54 +03:00
" format " , optionPos , & intValue )
2015-08-18 15:23:28 +03:00
= = TCL_ERROR )
{
fError = 1 ;
break ;
}
switch ( intValue ) {
2021-01-05 16:13:11 +03:00
case iBinary : my_symbol - > input_mode = DATA_MODE ; break ;
case iGS1 : my_symbol - > input_mode = GS1_MODE ; break ;
default : my_symbol - > input_mode = UNICODE_MODE ; break ;
2015-08-18 15:23:28 +03:00
}
}
}
2016-09-14 10:51:54 +03:00
}
2020-05-19 13:02:18 +03:00
/*------------------------------------------------------------------------*/
2021-01-05 16:13:11 +03:00
/* >>> Get symbology capability mask */
cap = ZBarcode_Cap ( my_symbol - > symbology ,
ZINT_CAP_STACKABLE | ZINT_CAP_EXTENDABLE | ZINT_CAP_FULL_MULTIBYTE
| ZINT_CAP_MASK ) ;
/*------------------------------------------------------------------------*/
2020-11-27 15:54:44 +03:00
/* >>> option_3 is set by three values depending on the symbology */
2020-05-19 13:02:18 +03:00
/* On wrong symbology, the option is ignored(as does the zint program)*/
2021-01-05 16:13:11 +03:00
if ( fFullMultiByte & & ( cap & ZINT_CAP_FULL_MULTIBYTE ) ) {
my_symbol - > option_3 = ZINT_FULL_MULTIBYTE ;
2020-11-27 15:54:44 +03:00
}
2021-01-05 16:13:11 +03:00
if ( Mask & & ( cap & ZINT_CAP_MASK ) ) {
my_symbol - > option_3 | = Mask < < 8 ;
2020-11-27 15:54:44 +03:00
}
2021-01-05 16:13:11 +03:00
if ( Separator & & ( cap & ZINT_CAP_STACKABLE ) ) {
my_symbol - > option_3 = Separator ;
2020-11-27 15:54:44 +03:00
}
2015-08-18 15:23:28 +03:00
/*------------------------------------------------------------------------*/
2020-07-27 19:44:51 +03:00
/* >>> option_2 is set by two values depending on the symbology */
/* On wrong symbology, the option is ignored(as does the zint program)*/
2021-01-05 16:13:11 +03:00
if ( addon_gap & & ( cap & ZINT_CAP_EXTENDABLE ) ) {
my_symbol - > option_2 = addon_gap ;
2020-07-27 19:44:51 +03:00
}
/*------------------------------------------------------------------------*/
2018-11-02 20:48:04 +03:00
/* >>> Prepare input dstring and encode it to ECI encoding*/
2016-09-14 10:51:54 +03:00
Tcl_DStringInit ( & dsInput ) ;
/*------------------------------------------------------------------------*/
if ( ! fError ) {
/*--------------------------------------------------------------------*/
2018-11-02 20:48:04 +03:00
/* >>> Get input mode */
2021-01-05 16:13:11 +03:00
if ( my_symbol - > input_mode = = DATA_MODE ) {
2015-08-18 15:23:28 +03:00
/* Binary data */
2016-07-04 14:46:30 +03:00
pStr = ( char * ) Tcl_GetByteArrayFromObj ( objv [ 2 ] , & lStr ) ;
2015-08-18 15:23:28 +03:00
} else {
2021-01-12 17:11:53 +03:00
/* UTF8 Data */
pStr = Tcl_GetStringFromObj ( objv [ 2 ] , & lStr ) ;
Tcl_UtfToExternalDString ( hZINTEncoding , pStr , lStr , & dsInput ) ;
pStr = Tcl_DStringValue ( & dsInput ) ;
lStr = Tcl_DStringLength ( & dsInput ) ;
2015-08-18 15:23:28 +03:00
}
2018-11-02 20:48:04 +03:00
}
/*------------------------------------------------------------------------*/
/* >>> Build symbol graphic */
if ( ! fError ) {
2020-08-04 16:49:25 +03:00
int ErrorNumber ;
Tk_PhotoHandle hPhoto ;
/*--------------------------------------------------------------------*/
/* call zint graphic creation to buffer */
2021-01-05 16:13:11 +03:00
ErrorNumber = ZBarcode_Encode_and_Buffer ( my_symbol ,
2018-11-02 20:48:04 +03:00
( unsigned char * ) pStr , lStr , rotate_angle ) ;
2015-08-18 15:23:28 +03:00
/*--------------------------------------------------------------------*/
2018-11-02 20:48:04 +03:00
/* >> Show a message */
if ( 0 ! = ErrorNumber )
{
2021-01-05 16:13:11 +03:00
Tcl_SetObjResult ( interp , Tcl_NewStringObj ( my_symbol - > errtxt , - 1 ) ) ;
2018-11-02 20:48:04 +03:00
}
2020-09-30 14:19:12 +03:00
if ( ZINT_ERROR < = ErrorNumber )
2015-08-18 15:23:28 +03:00
{
/* >> Encode error */
fError = 1 ;
2016-09-14 10:51:54 +03:00
} else if (
NULL = = ( hPhoto = Tk_FindPhoto ( interp , Tcl_GetString ( objv [ 3 ] ) ) ) )
2015-08-18 15:23:28 +03:00
{
2016-09-14 10:51:54 +03:00
Tcl_SetObjResult ( interp ,
Tcl_NewStringObj ( " Unknown photo image " , - 1 ) ) ;
2015-08-18 15:23:28 +03:00
fError = 1 ;
2016-10-14 17:23:15 +03:00
} else {
Tk_PhotoImageBlock sImageBlock ;
2020-08-04 16:49:25 +03:00
char * pImageRGBA = NULL ;
2021-01-05 16:13:11 +03:00
if ( my_symbol - > alphamap = = NULL ) {
sImageBlock . pixelPtr = ( unsigned char * ) my_symbol - > bitmap ;
sImageBlock . width = my_symbol - > bitmap_width ;
sImageBlock . height = my_symbol - > bitmap_height ;
sImageBlock . pitch = 3 * my_symbol - > bitmap_width ;
2020-08-04 16:49:25 +03:00
sImageBlock . pixelSize = 3 ;
sImageBlock . offset [ 0 ] = 0 ;
sImageBlock . offset [ 1 ] = 1 ;
sImageBlock . offset [ 2 ] = 2 ;
sImageBlock . offset [ 3 ] = 0 ;
} else {
int index ;
/* Alpha channel present - prepare the image data in rgba order */
2021-01-05 16:13:11 +03:00
pImageRGBA = ckalloc ( my_symbol - > bitmap_width * my_symbol - > bitmap_height * 4 ) ;
for ( index = 0 ; index < my_symbol - > bitmap_width * my_symbol - > bitmap_height ; index + + ) {
pImageRGBA [ index * 4 ] = my_symbol - > bitmap [ index * 3 ] ;
pImageRGBA [ index * 4 + 1 ] = my_symbol - > bitmap [ index * 3 + 1 ] ;
pImageRGBA [ index * 4 + 2 ] = my_symbol - > bitmap [ index * 3 + 2 ] ;
pImageRGBA [ index * 4 + 3 ] = my_symbol - > alphamap [ index ] ;
2020-08-04 16:49:25 +03:00
}
sImageBlock . pixelPtr = ( unsigned char * ) pImageRGBA ;
2021-01-05 16:13:11 +03:00
sImageBlock . width = my_symbol - > bitmap_width ;
sImageBlock . height = my_symbol - > bitmap_height ;
sImageBlock . pitch = 4 * my_symbol - > bitmap_width ;
2020-08-04 16:49:25 +03:00
sImageBlock . pixelSize = 4 ;
sImageBlock . offset [ 0 ] = 0 ;
sImageBlock . offset [ 1 ] = 1 ;
sImageBlock . offset [ 2 ] = 2 ;
sImageBlock . offset [ 3 ] = 3 ;
}
2015-08-18 15:23:28 +03:00
if ( 0 = = destWidth ) {
2021-01-05 16:13:11 +03:00
destWidth = my_symbol - > bitmap_width ;
2015-08-18 15:23:28 +03:00
}
if ( 0 = = destHeight ) {
2021-01-05 16:13:11 +03:00
destHeight = my_symbol - > bitmap_height ;
2015-08-18 15:23:28 +03:00
}
if ( TCL_OK ! = Tk_PhotoPutBlock ( interp , hPhoto , & sImageBlock ,
2016-09-14 10:51:54 +03:00
destX0 , destY0 , destWidth , destHeight ,
TK_PHOTO_COMPOSITE_OVERLAY ) )
2015-08-18 15:23:28 +03:00
{
fError = 1 ;
}
2020-08-04 16:49:25 +03:00
if ( pImageRGBA ! = NULL ) {
ckfree ( pImageRGBA ) ;
}
2015-08-18 15:23:28 +03:00
}
2016-09-14 10:51:54 +03:00
}
/*------------------------------------------------------------------------*/
2018-11-02 20:48:04 +03:00
Tcl_FreeEncoding ( hZINTEncoding ) ;
2016-09-14 10:51:54 +03:00
Tcl_DStringFree ( & dsInput ) ;
2021-01-05 16:13:11 +03:00
ZBarcode_Delete ( my_symbol ) ;
2016-09-14 10:51:54 +03:00
/*------------------------------------------------------------------------*/
if ( fError ) {
return TCL_ERROR ;
}
return TCL_OK ;
2015-08-18 15:23:28 +03:00
}