2016-07-19 23:09:08 +01:00
/* bmp.c - Handles output to Windows Bitmap file */
2016-07-19 23:02:39 +01:00
/*
libzint - the open source barcode library
2022-07-14 16:01:30 +01:00
Copyright ( C ) 2009 - 2022 Robin Stuart < rstuart114 @ gmail . com >
2016-07-19 23:02:39 +01:00
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
2017-10-23 21:37:52 +02:00
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2016-07-19 23:02:39 +01:00
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
2017-10-23 21:37:52 +02:00
documentation and / or other materials provided with the distribution .
2016-07-19 23:02:39 +01: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
2017-10-23 21:37:52 +02:00
without specific prior written permission .
2016-07-19 23:02:39 +01: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
2017-10-23 21:37:52 +02:00
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
2016-07-19 23:02:39 +01:00
SUCH DAMAGE .
*/
2022-07-14 16:01:30 +01:00
/* SPDX-License-Identifier: BSD-3-Clause */
2016-07-19 23:02:39 +01:00
2021-06-10 11:15:39 +01:00
# include <errno.h>
- 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
# include <math.h>
2016-07-19 23:02:39 +01:00
# include <stdio.h>
2016-09-03 18:45:09 +01:00
# ifdef _MSC_VER
# include <io.h>
# include <fcntl.h>
# endif
2022-09-13 22:08:08 +01:00
# include "common.h"
- 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
# include "output.h"
2022-09-13 22:08:08 +01:00
# include "bmp.h" /* Bitmap header structure */
2016-07-19 23:02:39 +01:00
2020-11-01 18:32:55 +00:00
INTERNAL int bmp_pixel_plot ( struct zint_symbol * symbol , unsigned char * pixelbuf ) {
2016-09-11 08:42:31 +01:00
int i , row , column ;
2016-07-19 23:02:39 +01:00
int row_size ;
2020-08-12 00:18:10 +01:00
int bits_per_pixel ;
int colour_count ;
- 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
int resolution ;
2020-06-04 18:45:25 +01:00
unsigned int data_offset , data_size , file_size ;
2016-07-19 23:02:39 +01:00
unsigned char * bitmap_file_start , * bmp_posn ;
2020-06-04 18:45:25 +01:00
unsigned char * bitmap ;
2016-07-19 23:02:39 +01:00
FILE * bmp_file ;
2016-09-03 18:45:09 +01:00
bitmap_file_header_t file_header ;
bitmap_info_header_t info_header ;
2020-08-12 00:18:10 +01:00
color_ref_t bg_color_ref ;
color_ref_t fg_color_ref ;
2020-08-12 13:19:56 +01:00
color_ref_t ultra_color_ref [ 8 ] ;
2021-07-26 15:29:05 +01:00
int ultra_fg_index = 9 ;
const int output_to_stdout = symbol - > output_options & BARCODE_STDOUT ; /* Suppress gcc -fanalyzer warning */
fg_color_ref . red = ( 16 * ctoi ( symbol - > fgcolour [ 0 ] ) ) + ctoi ( symbol - > fgcolour [ 1 ] ) ;
fg_color_ref . green = ( 16 * ctoi ( symbol - > fgcolour [ 2 ] ) ) + ctoi ( symbol - > fgcolour [ 3 ] ) ;
fg_color_ref . blue = ( 16 * ctoi ( symbol - > fgcolour [ 4 ] ) ) + ctoi ( symbol - > fgcolour [ 5 ] ) ;
fg_color_ref . reserved = 0x00 ;
bg_color_ref . red = ( 16 * ctoi ( symbol - > bgcolour [ 0 ] ) ) + ctoi ( symbol - > bgcolour [ 1 ] ) ;
bg_color_ref . green = ( 16 * ctoi ( symbol - > bgcolour [ 2 ] ) ) + ctoi ( symbol - > bgcolour [ 3 ] ) ;
bg_color_ref . blue = ( 16 * ctoi ( symbol - > bgcolour [ 4 ] ) ) + ctoi ( symbol - > bgcolour [ 5 ] ) ;
bg_color_ref . reserved = 0x00 ;
2016-07-19 23:02:39 +01:00
2020-08-12 00:18:10 +01:00
if ( symbol - > symbology = = BARCODE_ULTRA ) {
2021-07-26 15:29:05 +01:00
for ( i = 0 ; i < 8 ; i + + ) {
ultra_color_ref [ i ] . red = colour_to_red ( i + 1 ) ;
ultra_color_ref [ i ] . green = colour_to_green ( i + 1 ) ;
ultra_color_ref [ i ] . blue = colour_to_blue ( i + 1 ) ;
ultra_color_ref [ i ] . reserved = 0x00 ;
if ( memcmp ( & ultra_color_ref [ i ] , & fg_color_ref , sizeof ( fg_color_ref ) ) = = 0 ) {
ultra_fg_index = i + 1 ;
}
}
2020-08-12 13:19:56 +01:00
bits_per_pixel = 4 ;
2021-07-26 15:29:05 +01:00
colour_count = ultra_fg_index = = 9 ? 10 : 9 ;
2020-08-12 00:18:10 +01:00
} else {
bits_per_pixel = 1 ;
colour_count = 2 ;
}
row_size = 4 * ( ( bits_per_pixel * symbol - > bitmap_width + 31 ) / 32 ) ;
2020-06-04 18:45:25 +01:00
data_size = symbol - > bitmap_height * row_size ;
2021-06-10 11:15:39 +01:00
data_offset = sizeof ( bitmap_file_header_t ) + sizeof ( bitmap_info_header_t ) ;
data_offset + = colour_count * sizeof ( color_ref_t ) ;
2020-06-04 18:45:25 +01:00
file_size = data_offset + data_size ;
2020-06-15 16:06:11 +01:00
bitmap_file_start = ( unsigned char * ) malloc ( file_size ) ;
2020-06-04 18:45:25 +01:00
if ( bitmap_file_start = = NULL ) {
2021-07-26 15:29:05 +01:00
strcpy ( symbol - > errtxt , " 602: Insufficient memory for BMP file buffer " ) ;
2020-06-04 18:45:25 +01:00
return ZINT_ERROR_MEMORY ;
}
memset ( bitmap_file_start , 0 , file_size ) ; /* Not required but keeps padding bytes consistent */
2016-09-05 22:06:50 +01:00
2020-06-04 18:45:25 +01:00
bitmap = bitmap_file_start + data_offset ;
2016-07-19 23:02:39 +01:00
/* Pixel Plotting */
2020-08-12 00:18:10 +01:00
if ( symbol - > symbology = = BARCODE_ULTRA ) {
for ( row = 0 ; row < symbol - > bitmap_height ; row + + ) {
for ( column = 0 ; column < symbol - > bitmap_width ; column + + ) {
2020-08-12 13:19:56 +01:00
i = ( column / 2 ) + ( row * row_size ) ;
2020-08-12 00:18:10 +01:00
switch ( * ( pixelbuf + ( symbol - > bitmap_width * ( symbol - > bitmap_height - row - 1 ) ) + column ) ) {
2022-07-14 16:01:30 +01:00
case ' C ' : /* Cyan */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 1 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' B ' : /* Blue */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 2 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' M ' : /* Magenta */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 3 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' R ' : /* Red */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 4 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' Y ' : /* Yellow */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 5 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' G ' : /* Green */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 6 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' K ' : /* Black */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 7 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' W ' : /* White */
2020-08-12 13:19:56 +01:00
bitmap [ i ] + = 8 < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
2020-08-12 00:18:10 +01:00
break ;
2022-07-14 16:01:30 +01:00
case ' 1 ' : /* Foreground */
2021-07-26 15:29:05 +01:00
bitmap [ i ] + = ultra_fg_index < < ( 4 * ( 1 - ( column % 2 ) ) ) ;
break ;
2020-08-12 00:18:10 +01:00
}
}
}
} else {
for ( row = 0 ; row < symbol - > bitmap_height ; row + + ) {
for ( column = 0 ; column < symbol - > bitmap_width ; column + + ) {
i = ( column / 8 ) + ( row * row_size ) ;
if ( ( * ( pixelbuf + ( symbol - > bitmap_width * ( symbol - > bitmap_height - row - 1 ) ) + column ) ) = = ' 1 ' ) {
bitmap [ i ] + = ( 0x01 < < ( 7 - ( column % 8 ) ) ) ;
}
2016-07-19 23:02:39 +01:00
}
2016-09-11 08:42:31 +01:00
}
2016-07-19 23:02:39 +01:00
}
symbol - > bitmap_byte_length = data_size ;
2016-09-05 22:06:50 +01:00
2022-07-14 16:01:30 +01:00
file_header . header_field = 0x4d42 ; /* "BM" */
2020-06-04 18:45:25 +01:00
file_header . file_size = file_size ;
2016-07-19 23:02:39 +01:00
file_header . reserved = 0 ;
2020-06-04 18:45:25 +01:00
file_header . data_offset = data_offset ;
2016-07-19 23:02:39 +01:00
2021-06-10 11:15:39 +01:00
info_header . header_size = sizeof ( bitmap_info_header_t ) ;
2016-07-19 23:02:39 +01:00
info_header . width = symbol - > bitmap_width ;
info_header . height = symbol - > bitmap_height ;
info_header . colour_planes = 1 ;
2020-08-12 00:18:10 +01:00
info_header . bits_per_pixel = bits_per_pixel ;
2022-07-14 16:01:30 +01:00
info_header . compression_method = 0 ; /* BI_RGB */
2016-07-19 23:02:39 +01:00
info_header . image_size = 0 ;
- 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
resolution = symbol - > dpmm ? ( int ) roundf ( stripf ( symbol - > dpmm * 1000.0f ) ) : 0 ; /* pixels per metre */
info_header . horiz_res = resolution ;
info_header . vert_res = resolution ;
2020-08-12 00:18:10 +01:00
info_header . colours = colour_count ;
info_header . important_colours = colour_count ;
2021-06-10 11:15:39 +01:00
2016-07-19 23:02:39 +01:00
bmp_posn = bitmap_file_start ;
2021-06-10 11:15:39 +01:00
memcpy ( bitmap_file_start , & file_header , sizeof ( bitmap_file_header_t ) ) ;
bmp_posn + = sizeof ( bitmap_file_header_t ) ;
memcpy ( bmp_posn , & info_header , sizeof ( bitmap_info_header_t ) ) ;
2020-08-12 13:19:56 +01:00
bmp_posn + = sizeof ( bitmap_info_header_t ) ;
memcpy ( bmp_posn , & bg_color_ref , sizeof ( color_ref_t ) ) ;
if ( symbol - > symbology = = BARCODE_ULTRA ) {
for ( i = 0 ; i < 8 ; i + + ) {
bmp_posn + = sizeof ( color_ref_t ) ;
memcpy ( bmp_posn , & ultra_color_ref [ i ] , sizeof ( color_ref_t ) ) ;
}
2021-07-26 15:29:05 +01:00
if ( ultra_fg_index = = 9 ) {
bmp_posn + = sizeof ( color_ref_t ) ;
memcpy ( bmp_posn , & fg_color_ref , sizeof ( color_ref_t ) ) ;
}
2021-06-10 11:15:39 +01:00
} else {
2020-08-12 00:18:10 +01:00
bmp_posn + = sizeof ( color_ref_t ) ;
memcpy ( bmp_posn , & fg_color_ref , sizeof ( color_ref_t ) ) ;
}
2016-09-05 22:06:50 +01:00
2016-07-19 23:02:39 +01:00
/* Open output file in binary mode */
2021-07-26 15:29:05 +01:00
if ( output_to_stdout ) {
2016-07-19 23:02:39 +01:00
# ifdef _MSC_VER
if ( - 1 = = _setmode ( _fileno ( stdout ) , _O_BINARY ) ) {
2021-07-26 15:29:05 +01:00
sprintf ( symbol - > errtxt , " 600: Could not set stdout to binary (%d: %.30s) " , errno , strerror ( errno ) ) ;
2017-06-28 21:46:29 +02:00
free ( bitmap_file_start ) ;
2016-07-19 23:02:39 +01:00
return ZINT_ERROR_FILE_ACCESS ;
}
# endif
bmp_file = stdout ;
} else {
- 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
if ( ! ( bmp_file = out_fopen ( symbol - > outfile , " wb " ) ) ) {
2017-06-28 21:46:29 +02:00
free ( bitmap_file_start ) ;
2021-07-26 15:29:05 +01:00
sprintf ( symbol - > errtxt , " 601: Could not open output file (%d: %.30s) " , errno , strerror ( errno ) ) ;
2016-07-19 23:02:39 +01:00
return ZINT_ERROR_FILE_ACCESS ;
}
}
2016-09-05 22:06:50 +01:00
2016-07-19 23:02:39 +01:00
fwrite ( bitmap_file_start , file_header . file_size , 1 , bmp_file ) ;
2021-07-26 15:29:05 +01:00
if ( output_to_stdout ) {
fflush ( bmp_file ) ;
} else {
fclose ( bmp_file ) ;
}
2016-09-05 22:06:50 +01:00
2016-09-03 18:45:09 +01:00
free ( bitmap_file_start ) ;
2016-07-19 23:02:39 +01:00
return 0 ;
2017-06-28 21:46:29 +02:00
}
2022-07-14 16:01:30 +01:00
/* vim: set ts=4 sw=4 et : */