2020-05-06 19:57:27 +01:00
/*
libzint - the open source barcode library
- `zint_symbol->fgcolour` & `bgcolour` buffer lengths extended 10
-> 16 to allow for "C,M,Y,K" comma-separated decimal percentage
strings
- API/CLI/GUI: allow foreground/background colours to be specified
as comma-separated decimal "C,M,Y,K" strings where "C", "M" etc.
are percentages (0-100) (ticket #281, 3rd point)
- output.c: new funcs `out_colour_get_rgb()` & `out_colour_get_cmyk()`
and use in bmp/emf/gif etc.
- PCX: add alpha support
- GUI: fix fg/gbcolor icon background not being reset on zap
- GUI: Rearrange some Appearance tab inputs (Border Type <-> Width,
Show Text <-> Font, Text/Font <-> Printing Scale/Size) to flow
more naturally (hopefully)
- GUI: save button "Save As..." -> "Save..." and add icon
- CLI: add --bgcolor/colour & --fgcolor/colour synonyms
2023-01-29 19:51:11 +00:00
Copyright ( C ) 2020 - 2023 Robin Stuart < rstuart114 @ gmail . com >
2020-05-06 19:57:27 +01:00
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
documentation and / or other materials provided with the distribution .
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
without specific prior written permission .
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
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE .
*/
2022-09-12 19:26:04 +01:00
/* SPDX-License-Identifier: BSD-3-Clause */
2020-05-06 19:57:27 +01:00
# include "testcommon.h"
2021-03-19 13:09:21 +00:00
# include <sys/stat.h>
2020-05-06 19:57:27 +01:00
2020-12-23 10:57:24 +00:00
INTERNAL int tif_pixel_plot ( struct zint_symbol * symbol , unsigned char * pixelbuf ) ;
2020-05-06 19:57:27 +01:00
2022-09-12 19:26:04 +01:00
/* For overview when debugging: ./test_tiff -f pixel_plot -d 5 */
static void test_pixel_plot ( const testCtx * const p_ctx ) {
int debug = p_ctx - > debug ;
2020-05-06 19:57:27 +01:00
struct item {
int width ;
int height ;
2020-10-03 22:51:08 +01:00
char * pattern ;
2020-05-06 19:57:27 +01:00
int repeat ;
2022-09-12 19:26:04 +01:00
int no_identify ; /* identify fails for some valid TIFFs (eg. RGB with LZW and large rows) */
2021-07-26 15:29:05 +01:00
int ret ;
2020-05-06 19:57:27 +01:00
} ;
2022-09-12 19:26:04 +01:00
/* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */
2020-05-06 19:57:27 +01:00
struct item data [ ] = {
2021-07-26 15:29:05 +01:00
/* 0*/ { 1 , 1 , " 1 " , 0 , 0 , 0 } ,
/* 1*/ { 2 , 1 , " 11 " , 0 , 0 , 0 } ,
/* 2*/ { 1 , 2 , " 11 " , 0 , 0 , 0 } ,
/* 3*/ { 2 , 2 , " 10 " , 1 , 0 , 0 } ,
/* 4*/ { 3 , 1 , " 101 " , 0 , 0 , 0 } ,
/* 5*/ { 1 , 3 , " 101 " , 0 , 0 , 0 } ,
/* 6*/ { 4 , 1 , " 1010 " , 0 , 0 , 0 } ,
/* 7*/ { 1 , 4 , " 1010 " , 0 , 0 , 0 } ,
/* 8*/ { 5 , 1 , " 10101 " , 0 , 0 , 0 } ,
/* 9*/ { 1 , 5 , " 10101 " , 0 , 0 , 0 } ,
/* 10*/ { 3 , 2 , " 101 " , 1 , 0 , 0 } ,
/* 11*/ { 100 , 2 , " 10 " , 1 , 0 , 0 } ,
/* 12*/ { 2 , 100 , " 10 " , 1 , 0 , 0 } ,
/* 13*/ { 3 , 3 , " 101010101 " , 0 , 0 , 0 } ,
/* 14*/ { 4 , 3 , " 10 " , 1 , 0 , 0 } ,
/* 15*/ { 3 , 4 , " 10 " , 1 , 0 , 0 } ,
2022-09-12 19:26:04 +01:00
/* 16*/ { 45 , 44 , " 10 " , 1 , 0 , 0 } , /* Strip Count 1, Rows Per Strip 44 (45 * 44 * 4 == 7920) */
/* 17*/ { 45 , 45 , " 10 " , 1 , 0 , 0 } , /* Strip Count 1, Rows Per Strip 45 (45 * 45 * 4 == 8100) */
/* 18*/ { 46 , 45 , " 10 " , 1 , 0 , 0 } , /* Strip Count 2, Rows Per Strip 44 (46 * 45 * 4 == 8280) */
/* 19*/ { 46 , 46 , " 10 " , 1 , 0 , 0 } , /* Strip Count 2, Rows Per Strip 44 */
/* 20*/ { 2048 , 1 , " 10 " , 1 , 1 , 0 } , /* Strip Count 1, Rows Per Strip 1 (2048 * 4 == 8192) */
/* 21*/ { 1 , 2048 , " 10 " , 1 , 0 , 0 } , /* Strip Count 1, Rows Per Strip 2048 */
/* 22*/ { 2048 , 2 , " 10 " , 1 , 1 , 0 } , /* Strip Count 2, Rows Per Strip 1 */
/* 23*/ { 2 , 2048 , " 10 " , 1 , 0 , 0 } , /* Strip Count 2, Rows Per Strip 1024 (2 * 1024 * 4 == 8192) */
/* 24*/ { 2048 , 3 , " 10 " , 1 , 1 , 0 } , /* Strip Count 3, Rows Per Strip 1 */
/* 25*/ { 3 , 2048 , " 10 " , 1 , 0 , 0 } , /* Strip Count 4, Rows Per Strip 682 ((3 * 682 + 2) * 4 == 8192) */
/* 26*/ { 2049 , 4 , " 10 " , 1 , 1 , 0 } , /* Strip Count 4, Rows Per Strip 1 (2049 * 1 * 4 == 8196) - large rows in 1 strip, even if > 8192 */
/* 27*/ { 4 , 2049 , " 10 " , 1 , 0 , 0 } , /* Strip Count 5, Rows Per Strip 512 ((4 * 512 + 1) * 4 == 8196) */
/* 28*/ { 4096 , 1 , " 10 " , 1 , 1 , 0 } , /* Strip Count 1, Rows Per Strip 1 */
/* 29*/ { 1 , 4096 , " 10 " , 1 , 0 , 0 } , /* Strip Count 2, Rows Per Strip 2048 */
/* 30*/ { 4096 , 2 , " 10 " , 1 , 1 , 0 } , /* Strip Count 2, Rows Per Strip 1 */
/* 31*/ { 2 , 4096 , " 10 " , 1 , 0 , 0 } , /* Strip Count 4, Rows Per Strip 1024 */
/* 32*/ { 8192 , 2 , " 10 " , 1 , 1 , 0 } , /* Strip Count 2, Rows Per Strip 1 */
/* 33*/ { 2 , 8192 , " 10 " , 1 , 0 , 0 } , /* Strip Count 8, Rows Per Strip 1024 */
/* 34*/ { ZINT_MAX_DATA_LEN , 1 , " 10 " , 1 , 1 , 0 } , /* Strip Count 1, Rows Per Strip 1 */
2022-12-02 22:30:47 +00:00
/* 35*/ { 1 , ZINT_MAX_DATA_LEN , " 10 " , 1 , 1 /*NOTE: disabled due to failing on github CI, works locally*/ , 0 } , /* Strip Count 9, Rows Per Strip 2048 */
2022-09-12 19:26:04 +01:00
/* 36*/ { ZINT_MAX_DATA_LEN , 2 , " 10 " , 1 , 1 , 0 } , /* Strip Count 2, Rows Per Strip 1 */
2022-12-02 22:30:47 +00:00
/* 37*/ { 2 , ZINT_MAX_DATA_LEN , " 10 " , 1 , 1 /*NOTE: disabled due to failing on github CI, works locally*/ , 0 } , /* Strip Count 17, Rows Per Strip 1024 */
2020-05-06 19:57:27 +01:00
} ;
int data_size = ARRAY_SIZE ( data ) ;
2021-06-23 15:00:49 +01:00
int i , ret ;
2023-06-12 01:25:55 +01:00
struct zint_symbol * symbol = NULL ;
2020-05-06 19:57:27 +01:00
char * tif = " out.tif " ;
2021-10-20 23:05:30 +01:00
char data_buf [ ZINT_MAX_DATA_LEN * 2 + 1 ] ;
2020-05-06 19:57:27 +01:00
2021-06-23 15:00:49 +01:00
int have_tiffinfo = testUtilHaveTiffInfo ( ) ;
- API: add new zint_symbol `dpmm` field for output resolution (BMP/
EMF/PCX/PNG/TIF only, i.e. excluding EPS, GIF & SVG)
- Add support for specifying scale by X-dimension and resolution
with new option `--scalexdimdp` for CLI/Tcl & new API function
`ZBarcode_Scale_From_XdimDp()` (+ `ZBarcode_XdimDp_From_Scale()`
& `ZBarcode_Default_Xdim()`) and new GUI popup; manual: document
- BMP/EMF/PCX/PNG/TIF: use new `dpmm` resolution field (for EMF
following Inkscape)
- backend_qt: add `dpmm()`, `vectorWidth()`, `vectorHeight()`,
`noPng()`, `getVersion()`, `takesGS1AIData()`, & `XdimDp` stuff
incl. new `QZintXdimDp` struct for passing around scale vars &
use in `getAsCLI()`; add comments
- Raise `scale` limit to 200 (from 100) to allow for large dpmm
- output: create directories & subdirectories as necessary for
output path using new function `out_fopen()` and use in BMP/EMF/
EPS/GIF/PCX/PNG/SVG/TIF
- DPLEIT/DPIDENT: format HRT according to (incomplete)
documentation, and set default height to 72X (from 50X)
- CODE128B renamed to CODE128AB as can use subsets A and/or B
- CODABAR: fix minimum height calc
- EMF: fix indexing of handles (zero-based not 1-based)
- GUI: fix symbology zap (previous technique of clearing and
re-loading settings without doing a sync no longer works);
fix UPCEAN guard descent enable
- MAILMARK: better error message if input < 14 characters
- GUI: add "Default" button for DAFT tracker ratio & enable/disable
various default buttons; use new `takesGS1AIData()` to
enable/disable GS1-specific checkboxes
- CLI: use new `validate_float()` to parse float options (7
significant digits allowed only, no scientific notation)
- DATAMATRIX/GRIDMATRIX/PDF417/QR/ULTRA: micro-optimize structapp
ID parse
- library/CLI: fiddle with static asserts (make CHAR_BIT sensitive,
supposedly)
- win32/README: update building libpng (assembly removed)
- README.linux: document incompatibility of Qt6 >= 6.3
- manual: expand Barcode Studio waffle
- test suite: change range separator to hyphen and allow multiple
excludes
2022-12-02 21:39:01 +00:00
const char * const have_identify = testUtilHaveIdentify ( ) ;
2021-06-23 15:00:49 +01:00
2023-06-12 01:25:55 +01:00
testStartSymbol ( " test_pixel_plot " , & symbol ) ;
2021-06-23 15:00:49 +01:00
symbol = ZBarcode_Create ( ) ;
2021-03-21 21:20:16 +00:00
assert_nonnull ( symbol , " Symbol not created \n " ) ;
2021-06-23 15:00:49 +01:00
for ( i = 0 ; i < data_size ; i + + ) {
int size ;
2020-05-06 19:57:27 +01:00
2022-09-12 19:26:04 +01:00
if ( testContinue ( p_ctx , i ) ) continue ;
2020-05-06 19:57:27 +01:00
strcpy ( symbol - > outfile , tif ) ;
symbol - > bitmap_width = data [ i ] . width ;
symbol - > bitmap_height = data [ i ] . height ;
2022-09-12 19:26:04 +01:00
symbol - > symbology = BARCODE_ULTRA ; /* Use ULTRA with alpha background to force RGB */
2021-03-21 21:20:16 +00:00
strcpy ( symbol - > bgcolour , " FFFFFFEE " ) ;
2020-05-06 19:57:27 +01:00
symbol - > debug | = debug ;
2021-06-23 15:00:49 +01:00
size = data [ i ] . width * data [ i ] . height ;
2021-03-19 13:09:21 +00:00
assert_nonzero ( size < ( int ) sizeof ( data_buf ) , " i:%d tif_pixel_plot size %d >= sizeof(data_buf) %d \n " , i , size , ( int ) sizeof ( data_buf ) ) ;
2020-05-06 19:57:27 +01:00
if ( data [ i ] . repeat ) {
testUtilStrCpyRepeat ( data_buf , data [ i ] . pattern , size ) ;
} else {
strcpy ( data_buf , data [ i ] . pattern ) ;
}
assert_equal ( size , ( int ) strlen ( data_buf ) , " i:%d tif_pixel_plot size %d != strlen(data_buf) %d \n " , i , size , ( int ) strlen ( data_buf ) ) ;
2020-10-03 22:51:08 +01:00
symbol - > bitmap = ( unsigned char * ) data_buf ;
2020-05-06 19:57:27 +01:00
2020-11-01 18:32:55 +00:00
ret = tif_pixel_plot ( symbol , ( unsigned char * ) data_buf ) ;
2021-07-26 15:29:05 +01:00
assert_equal ( ret , data [ i ] . ret , " i:%d tif_pixel_plot ret %d != %d (%s) \n " , i , ret , data [ i ] . ret , symbol - > errtxt ) ;
2020-05-06 19:57:27 +01:00
2021-07-26 15:29:05 +01:00
if ( ret < ZINT_ERROR ) {
if ( have_tiffinfo ) {
ret = testUtilVerifyTiffInfo ( symbol - > outfile , debug ) ;
assert_zero ( ret , " i:%d tiffinfo %s ret %d != 0 \n " , i , symbol - > outfile , ret ) ;
} else if ( have_identify & & ! data [ i ] . no_identify ) {
- API: add new zint_symbol `dpmm` field for output resolution (BMP/
EMF/PCX/PNG/TIF only, i.e. excluding EPS, GIF & SVG)
- Add support for specifying scale by X-dimension and resolution
with new option `--scalexdimdp` for CLI/Tcl & new API function
`ZBarcode_Scale_From_XdimDp()` (+ `ZBarcode_XdimDp_From_Scale()`
& `ZBarcode_Default_Xdim()`) and new GUI popup; manual: document
- BMP/EMF/PCX/PNG/TIF: use new `dpmm` resolution field (for EMF
following Inkscape)
- backend_qt: add `dpmm()`, `vectorWidth()`, `vectorHeight()`,
`noPng()`, `getVersion()`, `takesGS1AIData()`, & `XdimDp` stuff
incl. new `QZintXdimDp` struct for passing around scale vars &
use in `getAsCLI()`; add comments
- Raise `scale` limit to 200 (from 100) to allow for large dpmm
- output: create directories & subdirectories as necessary for
output path using new function `out_fopen()` and use in BMP/EMF/
EPS/GIF/PCX/PNG/SVG/TIF
- DPLEIT/DPIDENT: format HRT according to (incomplete)
documentation, and set default height to 72X (from 50X)
- CODE128B renamed to CODE128AB as can use subsets A and/or B
- CODABAR: fix minimum height calc
- EMF: fix indexing of handles (zero-based not 1-based)
- GUI: fix symbology zap (previous technique of clearing and
re-loading settings without doing a sync no longer works);
fix UPCEAN guard descent enable
- MAILMARK: better error message if input < 14 characters
- GUI: add "Default" button for DAFT tracker ratio & enable/disable
various default buttons; use new `takesGS1AIData()` to
enable/disable GS1-specific checkboxes
- CLI: use new `validate_float()` to parse float options (7
significant digits allowed only, no scientific notation)
- DATAMATRIX/GRIDMATRIX/PDF417/QR/ULTRA: micro-optimize structapp
ID parse
- library/CLI: fiddle with static asserts (make CHAR_BIT sensitive,
supposedly)
- win32/README: update building libpng (assembly removed)
- README.linux: document incompatibility of Qt6 >= 6.3
- manual: expand Barcode Studio waffle
- test suite: change range separator to hyphen and allow multiple
excludes
2022-12-02 21:39:01 +00:00
ret = testUtilVerifyIdentify ( have_identify , symbol - > outfile , debug ) ;
2021-07-26 15:29:05 +01:00
assert_zero ( ret , " i:%d identify %s ret %d != 0 \n " , i , symbol - > outfile , ret ) ;
}
if ( ! ( debug & ZINT_DEBUG_TEST_KEEP_OUTFILE ) ) {
2023-05-10 21:29:09 +01:00
assert_zero ( testUtilRemove ( symbol - > outfile ) , " i:%d testUtilRemove(%s) != 0 \n " , i , symbol - > outfile ) ;
2021-07-26 15:29:05 +01:00
}
} else {
if ( ! ( debug & ZINT_DEBUG_TEST_KEEP_OUTFILE ) ) {
2023-05-10 21:29:09 +01:00
( void ) testUtilRemove ( symbol - > outfile ) ;
2021-07-26 15:29:05 +01:00
}
2020-05-06 19:57:27 +01:00
}
symbol - > bitmap = NULL ;
}
2021-03-21 21:20:16 +00:00
ZBarcode_Delete ( symbol ) ;
2020-05-06 19:57:27 +01:00
testFinish ( ) ;
}
2022-09-12 19:26:04 +01:00
static void test_print ( const testCtx * const p_ctx ) {
int debug = p_ctx - > debug ;
2021-03-19 13:09:21 +00:00
struct item {
int symbology ;
int input_mode ;
int border_width ;
int output_options ;
int whitespace_width ;
2021-07-26 15:29:05 +01:00
int whitespace_height ;
2021-03-19 13:09:21 +00:00
int show_hrt ;
int option_1 ;
int option_2 ;
int height ;
float scale ;
char * fgcolour ;
char * bgcolour ;
char * data ;
char * composite ;
char * expected_file ;
char * comment ;
} ;
struct item data [ ] = {
2021-07-26 15:29:05 +01:00
/* 0*/ { BARCODE_CODE128 , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 112233 " , " EEDDCC " , " A " , " " , " code128_fgbg.tif " , " " } ,
/* 1*/ { BARCODE_CODE128 , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " FFFFFF " , " 000000 " , " A " , " " , " code128_reverse.tif " , " " } ,
/* 2*/ { BARCODE_CODE128 , - 1 , - 1 , CMYK_COLOUR , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 112233 " , " CCDDEE " , " A " , " " , " code128_cmyk_fgbg.tif " , " " } ,
/* 3*/ { BARCODE_CODE128 , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " C00000 " , " FEDCBACC " , " A " , " " , " code128_bgalpha.tif " , " " } ,
/* 4*/ { BARCODE_CODE128 , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 00000099 " , " FEDCBA " , " A " , " " , " code128_fgalpha.tif " , " " } ,
/* 5*/ { BARCODE_CODE128 , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 00000099 " , " FEDCBACC " , " A " , " " , " code128_fgbgalpha.tif " , " " } ,
/* 6*/ { BARCODE_CODE128 , - 1 , - 1 , CMYK_COLOUR , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " C00000 " , " FEDCBA " , " A " , " " , " code128_cmyk.tif " , " " } ,
/* 7*/ { BARCODE_CODE128 , - 1 , - 1 , CMYK_COLOUR , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " C0000099 " , " FEDCBACC " , " A " , " " , " code128_cmyk_fgbgalpha.tif " , " " } ,
- `zint_symbol->fgcolour` & `bgcolour` buffer lengths extended 10
-> 16 to allow for "C,M,Y,K" comma-separated decimal percentage
strings
- API/CLI/GUI: allow foreground/background colours to be specified
as comma-separated decimal "C,M,Y,K" strings where "C", "M" etc.
are percentages (0-100) (ticket #281, 3rd point)
- output.c: new funcs `out_colour_get_rgb()` & `out_colour_get_cmyk()`
and use in bmp/emf/gif etc.
- PCX: add alpha support
- GUI: fix fg/gbcolor icon background not being reset on zap
- GUI: Rearrange some Appearance tab inputs (Border Type <-> Width,
Show Text <-> Font, Text/Font <-> Printing Scale/Size) to flow
more naturally (hopefully)
- GUI: save button "Save As..." -> "Save..." and add icon
- CLI: add --bgcolor/colour & --fgcolor/colour synonyms
2023-01-29 19:51:11 +00:00
/* 8*/ { BARCODE_CODE128 , - 1 , - 1 , CMYK_COLOUR , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 71,0,40,44 " , " 10,0,20,5 " , " A " , " " , " code128_cmyk_fgbgcmyk.tif " , " " } ,
/* 9*/ { BARCODE_ULTRA , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " C00000 " , " FEDCBACC " , " 1234 " , " " , " ultra_bgalpha.tif " , " " } ,
/* 10*/ { BARCODE_ULTRA , - 1 , - 1 , CMYK_COLOUR , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " C00000 " , " FEDCBACC " , " 1234 " , " " , " ultra_cmyk_bgalpha.tif " , " " } ,
/* 11*/ { BARCODE_ULTRA , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 000000BB " , " FEDCBA " , " 1234 " , " " , " ultra_fgalpha.tif " , " " } ,
/* 12*/ { BARCODE_ULTRA , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 000000BB " , " FEDCBACC " , " 1234 " , " " , " ultra_fgbgalpha.tif " , " " } ,
/* 13*/ { BARCODE_ULTRA , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " 000000BB " , " " , " 1234 " , " " , " ultra_fgalpha_nobg.tif " , " " } ,
/* 14*/ { BARCODE_ULTRA , - 1 , - 1 , - 1 , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " " , " FEDCBACC " , " 1234 " , " " , " ultra_bgalpha_nofg.tif " , " " } ,
/* 15*/ { BARCODE_ULTRA , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0.5f , " " , " " , " 1 " , " " , " ultra_odd.tif " , " " } ,
/* 16*/ { BARCODE_ULTRA , - 1 , - 1 , CMYK_COLOUR , 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " " , " " , " 1234 " , " " , " ultra_cmyk.tif " , " " } ,
/* 17*/ { BARCODE_ULTRA , - 1 , 1 , BARCODE_BOX , 1 , 1 , - 1 , - 1 , - 1 , 0 , 0 , " FF0000 " , " 0000FF " , " 1234 " , " " , " ultra_fgbg_hvwsp1_box1.tif " , " " } ,
/* 18*/ { BARCODE_HANXIN , UNICODE_MODE , - 1 , - 1 , - 1 , - 1 , - 1 , 4 , 84 , 0 , 2 , " " , " " , " 1 " , " " , " hanxin_v84_l4_scale2.tif " , " " } ,
/* 19*/ { BARCODE_AZTEC , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 32 , 0 , 0 , " 4BE055 " , " " , " 1 " , " " , " aztec_v32_fg.tif " , " " } ,
/* 20*/ { BARCODE_DAFT , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 8 , 0.5f , " " , " " , " F " , " " , " daft_height8_scale0.5.tif " , " " } ,
/* 21*/ { BARCODE_DAFT , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 1 , 0.5f , " " , " " , " DAFT " , " " , " daft_height1_scale0.5.tif " , " " } ,
2023-06-12 01:25:55 +01:00
/* 22*/ { BARCODE_EANX , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " " , " " , " 9501234 " , " " , " ean8_gss_5.2.2.2-1.tif " , " " } ,
/* 23*/ { BARCODE_EANX , - 1 , - 1 , EANUPC_GUARD_WHITESPACE , - 1 , - 1 , - 1 , - 1 , - 1 , 0 , 0 , " " , " " , " 9501234 " , " " , " ean8_gss_5.2.2.2-1_gws.tif " , " " } ,
2021-03-19 13:09:21 +00:00
} ;
int data_size = ARRAY_SIZE ( data ) ;
2021-06-23 15:00:49 +01:00
int i , length , ret ;
2023-06-12 01:25:55 +01:00
struct zint_symbol * symbol = NULL ;
2021-03-19 13:09:21 +00:00
2021-06-14 00:48:29 +01:00
const char * data_dir = " /backend/tests/data/tif " ;
const char * tif = " out.tif " ;
char expected_file [ 1024 ] ;
2021-03-19 13:09:21 +00:00
char escaped [ 1024 ] ;
int escaped_size = 1024 ;
char * text ;
2021-06-23 15:00:49 +01:00
int have_tiffinfo = testUtilHaveTiffInfo ( ) ;
- API: add new zint_symbol `dpmm` field for output resolution (BMP/
EMF/PCX/PNG/TIF only, i.e. excluding EPS, GIF & SVG)
- Add support for specifying scale by X-dimension and resolution
with new option `--scalexdimdp` for CLI/Tcl & new API function
`ZBarcode_Scale_From_XdimDp()` (+ `ZBarcode_XdimDp_From_Scale()`
& `ZBarcode_Default_Xdim()`) and new GUI popup; manual: document
- BMP/EMF/PCX/PNG/TIF: use new `dpmm` resolution field (for EMF
following Inkscape)
- backend_qt: add `dpmm()`, `vectorWidth()`, `vectorHeight()`,
`noPng()`, `getVersion()`, `takesGS1AIData()`, & `XdimDp` stuff
incl. new `QZintXdimDp` struct for passing around scale vars &
use in `getAsCLI()`; add comments
- Raise `scale` limit to 200 (from 100) to allow for large dpmm
- output: create directories & subdirectories as necessary for
output path using new function `out_fopen()` and use in BMP/EMF/
EPS/GIF/PCX/PNG/SVG/TIF
- DPLEIT/DPIDENT: format HRT according to (incomplete)
documentation, and set default height to 72X (from 50X)
- CODE128B renamed to CODE128AB as can use subsets A and/or B
- CODABAR: fix minimum height calc
- EMF: fix indexing of handles (zero-based not 1-based)
- GUI: fix symbology zap (previous technique of clearing and
re-loading settings without doing a sync no longer works);
fix UPCEAN guard descent enable
- MAILMARK: better error message if input < 14 characters
- GUI: add "Default" button for DAFT tracker ratio & enable/disable
various default buttons; use new `takesGS1AIData()` to
enable/disable GS1-specific checkboxes
- CLI: use new `validate_float()` to parse float options (7
significant digits allowed only, no scientific notation)
- DATAMATRIX/GRIDMATRIX/PDF417/QR/ULTRA: micro-optimize structapp
ID parse
- library/CLI: fiddle with static asserts (make CHAR_BIT sensitive,
supposedly)
- win32/README: update building libpng (assembly removed)
- README.linux: document incompatibility of Qt6 >= 6.3
- manual: expand Barcode Studio waffle
- test suite: change range separator to hyphen and allow multiple
excludes
2022-12-02 21:39:01 +00:00
const char * const have_identify = testUtilHaveIdentify ( ) ;
2021-06-23 15:00:49 +01:00
2023-06-12 01:25:55 +01:00
testStartSymbol ( " test_print " , & symbol ) ;
2021-06-23 15:00:49 +01:00
2022-09-12 19:26:04 +01:00
if ( p_ctx - > generate ) {
2021-06-16 17:56:32 +01:00
char data_dir_path [ 1024 ] ;
assert_nonzero ( testUtilDataPath ( data_dir_path , sizeof ( data_dir_path ) , data_dir , NULL ) , " testUtilDataPath(%s) == 0 \n " , data_dir ) ;
2021-06-23 15:00:49 +01:00
if ( ! testUtilDirExists ( data_dir_path ) ) {
ret = testUtilMkDir ( data_dir_path ) ;
assert_zero ( ret , " testUtilMkDir(%s) ret %d != 0 (%d: %s) \n " , data_dir_path , ret , errno , strerror ( errno ) ) ;
2021-03-19 13:09:21 +00:00
}
}
2021-06-23 15:00:49 +01:00
for ( i = 0 ; i < data_size ; i + + ) {
int text_length ;
2021-03-19 13:09:21 +00:00
2022-09-12 19:26:04 +01:00
if ( testContinue ( p_ctx , i ) ) continue ;
2021-03-19 13:09:21 +00:00
2021-06-23 15:00:49 +01:00
symbol = ZBarcode_Create ( ) ;
2021-03-19 13:09:21 +00:00
assert_nonnull ( symbol , " Symbol not created \n " ) ;
2021-06-23 15:00:49 +01:00
length = testUtilSetSymbol ( symbol , data [ i ] . symbology , data [ i ] . input_mode , - 1 /*eci*/ , data [ i ] . option_1 , data [ i ] . option_2 , - 1 , data [ i ] . output_options , data [ i ] . data , - 1 , debug ) ;
2021-03-19 13:09:21 +00:00
if ( data [ i ] . show_hrt ! = - 1 ) {
symbol - > show_hrt = data [ i ] . show_hrt ;
}
if ( data [ i ] . height ) {
symbol - > height = data [ i ] . height ;
}
if ( data [ i ] . scale ) {
symbol - > scale = data [ i ] . scale ;
}
if ( data [ i ] . border_width ! = - 1 ) {
symbol - > border_width = data [ i ] . border_width ;
}
if ( data [ i ] . whitespace_width ! = - 1 ) {
symbol - > whitespace_width = data [ i ] . whitespace_width ;
}
2021-07-26 15:29:05 +01:00
if ( data [ i ] . whitespace_height ! = - 1 ) {
symbol - > whitespace_height = data [ i ] . whitespace_height ;
}
2021-03-19 13:09:21 +00:00
if ( * data [ i ] . fgcolour ) {
strcpy ( symbol - > fgcolour , data [ i ] . fgcolour ) ;
}
if ( * data [ i ] . bgcolour ) {
strcpy ( symbol - > bgcolour , data [ i ] . bgcolour ) ;
}
if ( strlen ( data [ i ] . composite ) ) {
text = data [ i ] . composite ;
strcpy ( symbol - > primary , data [ i ] . data ) ;
} else {
text = data [ i ] . data ;
}
2021-06-27 11:47:55 +01:00
text_length = ( int ) strlen ( text ) ;
2021-03-19 13:09:21 +00:00
ret = ZBarcode_Encode ( symbol , ( unsigned char * ) text , text_length ) ;
assert_zero ( ret , " i:%d %s ZBarcode_Encode ret %d != 0 %s \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , ret , symbol - > errtxt ) ;
strcpy ( symbol - > outfile , tif ) ;
ret = ZBarcode_Print ( symbol , 0 ) ;
assert_zero ( ret , " i:%d %s ZBarcode_Print %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , ret ) ;
2021-06-14 00:48:29 +01:00
assert_nonzero ( testUtilDataPath ( expected_file , sizeof ( expected_file ) , data_dir , data [ i ] . expected_file ) , " i:%d testUtilDataPath == 0 \n " , i ) ;
2022-09-12 19:26:04 +01:00
if ( p_ctx - > generate ) {
2021-07-26 15:29:05 +01:00
printf ( " /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %d, %.5g, \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" , \" %s \" }, \n " ,
2021-03-19 13:09:21 +00:00
i , testUtilBarcodeName ( data [ i ] . symbology ) , testUtilInputModeName ( data [ i ] . input_mode ) , data [ i ] . border_width , testUtilOutputOptionsName ( data [ i ] . output_options ) ,
2021-07-26 15:29:05 +01:00
data [ i ] . whitespace_width , data [ i ] . whitespace_height , data [ i ] . show_hrt , data [ i ] . option_1 , data [ i ] . option_2 ,
data [ i ] . height , data [ i ] . scale , data [ i ] . fgcolour , data [ i ] . bgcolour ,
2021-03-19 13:09:21 +00:00
testUtilEscape ( data [ i ] . data , length , escaped , escaped_size ) , data [ i ] . composite , data [ i ] . expected_file , data [ i ] . comment ) ;
2021-06-23 15:00:49 +01:00
ret = testUtilRename ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d testUtilRename(%s, %s) ret %d != 0 \n " , i , symbol - > outfile , expected_file , ret ) ;
2021-03-21 21:20:16 +00:00
if ( have_tiffinfo ) {
2021-06-14 00:48:29 +01:00
ret = testUtilVerifyTiffInfo ( expected_file , debug ) ;
assert_zero ( ret , " i:%d %s tiffinfo %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , expected_file , ret ) ;
2021-03-21 21:20:16 +00:00
} else if ( have_identify ) {
- API: add new zint_symbol `dpmm` field for output resolution (BMP/
EMF/PCX/PNG/TIF only, i.e. excluding EPS, GIF & SVG)
- Add support for specifying scale by X-dimension and resolution
with new option `--scalexdimdp` for CLI/Tcl & new API function
`ZBarcode_Scale_From_XdimDp()` (+ `ZBarcode_XdimDp_From_Scale()`
& `ZBarcode_Default_Xdim()`) and new GUI popup; manual: document
- BMP/EMF/PCX/PNG/TIF: use new `dpmm` resolution field (for EMF
following Inkscape)
- backend_qt: add `dpmm()`, `vectorWidth()`, `vectorHeight()`,
`noPng()`, `getVersion()`, `takesGS1AIData()`, & `XdimDp` stuff
incl. new `QZintXdimDp` struct for passing around scale vars &
use in `getAsCLI()`; add comments
- Raise `scale` limit to 200 (from 100) to allow for large dpmm
- output: create directories & subdirectories as necessary for
output path using new function `out_fopen()` and use in BMP/EMF/
EPS/GIF/PCX/PNG/SVG/TIF
- DPLEIT/DPIDENT: format HRT according to (incomplete)
documentation, and set default height to 72X (from 50X)
- CODE128B renamed to CODE128AB as can use subsets A and/or B
- CODABAR: fix minimum height calc
- EMF: fix indexing of handles (zero-based not 1-based)
- GUI: fix symbology zap (previous technique of clearing and
re-loading settings without doing a sync no longer works);
fix UPCEAN guard descent enable
- MAILMARK: better error message if input < 14 characters
- GUI: add "Default" button for DAFT tracker ratio & enable/disable
various default buttons; use new `takesGS1AIData()` to
enable/disable GS1-specific checkboxes
- CLI: use new `validate_float()` to parse float options (7
significant digits allowed only, no scientific notation)
- DATAMATRIX/GRIDMATRIX/PDF417/QR/ULTRA: micro-optimize structapp
ID parse
- library/CLI: fiddle with static asserts (make CHAR_BIT sensitive,
supposedly)
- win32/README: update building libpng (assembly removed)
- README.linux: document incompatibility of Qt6 >= 6.3
- manual: expand Barcode Studio waffle
- test suite: change range separator to hyphen and allow multiple
excludes
2022-12-02 21:39:01 +00:00
ret = testUtilVerifyIdentify ( have_identify , expected_file , debug ) ;
2021-06-14 00:48:29 +01:00
assert_zero ( ret , " i:%d %s identify %s ret %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , expected_file , ret ) ;
2021-03-19 13:09:21 +00:00
}
} else {
assert_nonzero ( testUtilExists ( symbol - > outfile ) , " i:%d testUtilExists(%s) == 0 \n " , i , symbol - > outfile ) ;
2021-06-14 00:48:29 +01:00
assert_nonzero ( testUtilExists ( expected_file ) , " i:%d testUtilExists(%s) == 0 \n " , i , expected_file ) ;
2021-03-19 13:09:21 +00:00
2021-06-14 00:48:29 +01:00
ret = testUtilCmpBins ( symbol - > outfile , expected_file ) ;
assert_zero ( ret , " i:%d %s testUtilCmpBins(%s, %s) %d != 0 \n " , i , testUtilBarcodeName ( data [ i ] . symbology ) , symbol - > outfile , expected_file , ret ) ;
2023-05-10 21:29:09 +01:00
assert_zero ( testUtilRemove ( symbol - > outfile ) , " i:%d testUtilRemove(%s) != 0 \n " , i , symbol - > outfile ) ;
2021-03-19 13:09:21 +00:00
}
ZBarcode_Delete ( symbol ) ;
}
testFinish ( ) ;
}
2022-09-12 19:26:04 +01:00
static void test_outfile ( const testCtx * const p_ctx ) {
2021-07-26 15:29:05 +01:00
int ret ;
2022-12-06 15:09:06 +00:00
int skip_readonly_test = 0 ;
2021-07-26 15:29:05 +01:00
struct zint_symbol symbol = { 0 } ;
unsigned char data [ ] = { " 1 " } ;
2022-09-12 19:26:04 +01:00
( void ) p_ctx ;
2021-07-26 15:29:05 +01:00
testStart ( " test_outfile " ) ;
symbol . symbology = BARCODE_CODE128 ;
symbol . bitmap = data ;
symbol . bitmap_width = symbol . bitmap_height = 1 ;
- API: add new zint_symbol `dpmm` field for output resolution (BMP/
EMF/PCX/PNG/TIF only, i.e. excluding EPS, GIF & SVG)
- Add support for specifying scale by X-dimension and resolution
with new option `--scalexdimdp` for CLI/Tcl & new API function
`ZBarcode_Scale_From_XdimDp()` (+ `ZBarcode_XdimDp_From_Scale()`
& `ZBarcode_Default_Xdim()`) and new GUI popup; manual: document
- BMP/EMF/PCX/PNG/TIF: use new `dpmm` resolution field (for EMF
following Inkscape)
- backend_qt: add `dpmm()`, `vectorWidth()`, `vectorHeight()`,
`noPng()`, `getVersion()`, `takesGS1AIData()`, & `XdimDp` stuff
incl. new `QZintXdimDp` struct for passing around scale vars &
use in `getAsCLI()`; add comments
- Raise `scale` limit to 200 (from 100) to allow for large dpmm
- output: create directories & subdirectories as necessary for
output path using new function `out_fopen()` and use in BMP/EMF/
EPS/GIF/PCX/PNG/SVG/TIF
- DPLEIT/DPIDENT: format HRT according to (incomplete)
documentation, and set default height to 72X (from 50X)
- CODE128B renamed to CODE128AB as can use subsets A and/or B
- CODABAR: fix minimum height calc
- EMF: fix indexing of handles (zero-based not 1-based)
- GUI: fix symbology zap (previous technique of clearing and
re-loading settings without doing a sync no longer works);
fix UPCEAN guard descent enable
- MAILMARK: better error message if input < 14 characters
- GUI: add "Default" button for DAFT tracker ratio & enable/disable
various default buttons; use new `takesGS1AIData()` to
enable/disable GS1-specific checkboxes
- CLI: use new `validate_float()` to parse float options (7
significant digits allowed only, no scientific notation)
- DATAMATRIX/GRIDMATRIX/PDF417/QR/ULTRA: micro-optimize structapp
ID parse
- library/CLI: fiddle with static asserts (make CHAR_BIT sensitive,
supposedly)
- win32/README: update building libpng (assembly removed)
- README.linux: document incompatibility of Qt6 >= 6.3
- manual: expand Barcode Studio waffle
- test suite: change range separator to hyphen and allow multiple
excludes
2022-12-02 21:39:01 +00:00
strcpy ( symbol . outfile , " test_tif_out.tif " ) ;
2022-12-06 15:09:06 +00:00
# ifndef _WIN32
skip_readonly_test = getuid ( ) = = 0 ; /* Skip if running as root on Unix as can't create read-only file */
# endif
if ( ! skip_readonly_test ) {
( void ) testUtilRmROFile ( symbol . outfile ) ; /* In case lying around from previous fail */
assert_nonzero ( testUtilCreateROFile ( symbol . outfile ) , " tif_pixel_plot testUtilCreateROFile(%s) fail (%d: %s) \n " , symbol . outfile , errno , strerror ( errno ) ) ;
ret = tif_pixel_plot ( & symbol , data ) ;
assert_equal ( ret , ZINT_ERROR_FILE_ACCESS , " tif_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s) \n " , ret , ZINT_ERROR_FILE_ACCESS , symbol . errtxt ) ;
assert_zero ( testUtilRmROFile ( symbol . outfile ) , " tif_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s) \n " , symbol . outfile , errno , strerror ( errno ) ) ;
}
2021-07-26 15:29:05 +01:00
symbol . output_options | = BARCODE_STDOUT ;
2023-06-12 01:25:55 +01:00
printf ( " <<<Begin ignore (TIF to stdout) \n " ) ; fflush ( stdout ) ;
2021-07-26 15:29:05 +01:00
ret = tif_pixel_plot ( & symbol , data ) ;
2023-06-12 01:25:55 +01:00
printf ( " \n <<<End ignore (TIF to stdout) \n " ) ; fflush ( stdout ) ;
2021-07-26 15:29:05 +01:00
assert_zero ( ret , " tif_pixel_plot ret %d != 0 (%s) \n " , ret , symbol . errtxt ) ;
testFinish ( ) ;
}
2020-05-06 19:57:27 +01:00
int main ( int argc , char * argv [ ] ) {
2022-09-12 19:26:04 +01:00
testFunction funcs [ ] = { /* name, func */
{ " test_pixel_plot " , test_pixel_plot } ,
{ " test_print " , test_print } ,
{ " test_outfile " , test_outfile } ,
2020-05-06 19:57:27 +01:00
} ;
testRun ( argc , argv , funcs , ARRAY_SIZE ( funcs ) ) ;
testReport ( ) ;
return 0 ;
}
2022-09-12 19:26:04 +01:00
/* vim: set ts=4 sw=4 et : */