mirror of
https://github.com/zint/zint
synced 2024-11-16 20:57:25 +13:00
raster.c: need ceilf(large_bar_height * si) to avoid zero height rows;
also improve non-half-int interpolation performance raster/vector.c: use new stripf() func in "common.c" to workaround gcc 32-bit float calculation variations gs1.c: allow dummy AI "[]" if GS1NOCHECK_MODE and has data (#204); also add note re TPX AI 235 and terminating FNC1 Remove trailing whitespace in various files
This commit is contained in:
parent
9884875fd5
commit
eb6e5daa2d
@ -22,6 +22,8 @@ Changes
|
|||||||
- CLI: allow both e.g. '-height' and '--height' (getopt_long_only())
|
- CLI: allow both e.g. '-height' and '--height' (getopt_long_only())
|
||||||
- UPC/EAN: add guard_descent
|
- UPC/EAN: add guard_descent
|
||||||
- Add output_options BARCODE_QUIET_ZONES and BARCODE_NO_QUIET_ZONES
|
- Add output_options BARCODE_QUIET_ZONES and BARCODE_NO_QUIET_ZONES
|
||||||
|
- Allow dummy AI "[]" if GS1NOCHECK_MODE and has data (#204)
|
||||||
|
- raster.c: improve non-half-integer interpolation performance
|
||||||
|
|
||||||
Bugs
|
Bugs
|
||||||
----
|
----
|
||||||
@ -31,8 +33,11 @@ Bugs
|
|||||||
- Suppress some pedantic warnings, props codemonkey82 (#204)
|
- Suppress some pedantic warnings, props codemonkey82 (#204)
|
||||||
- gs1.c: Allow 0-length AI data if GS1NOCHECK_MODE, props codemonkey82 (#204)
|
- gs1.c: Allow 0-length AI data if GS1NOCHECK_MODE, props codemonkey82 (#204)
|
||||||
- raster.c: Need ceilf(symbol->height * si) to avoid heap-buffer-overflow;
|
- raster.c: Need ceilf(symbol->height * si) to avoid heap-buffer-overflow;
|
||||||
|
also ceilf(large_bar_height * si);
|
||||||
also avoid distributive multiplication with floats to lessen chances of
|
also avoid distributive multiplication with floats to lessen chances of
|
||||||
platform variation (#204 ARM-Cortex crash)
|
platform variation (#204 ARM-Cortex crash)
|
||||||
|
- raster/vector.c: use new stripf() func to workaround gcc 32-bit
|
||||||
|
float variations
|
||||||
- raster.c: Don't allow for text if scale < 1.0
|
- raster.c: Don't allow for text if scale < 1.0
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ all: $(DLL) $(STATLIB)
|
|||||||
%.o:%.c
|
%.o:%.c
|
||||||
@echo Compiling $< ...
|
@echo Compiling $< ...
|
||||||
$(CC) $(CFLAGS) $(DEFINES) $(ZINT_VERSION) -c -o $@ $<
|
$(CC) $(CFLAGS) $(DEFINES) $(ZINT_VERSION) -c -o $@ $<
|
||||||
|
|
||||||
$(DLL):$(DLL_OBJ)
|
$(DLL):$(DLL_OBJ)
|
||||||
@echo Linking $@...
|
@echo Linking $@...
|
||||||
o2dll.sh -o $@ $(DLL_OBJ) $(LIBS)
|
o2dll.sh -o $@ $(DLL_OBJ) $(LIBS)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* bmp.h - header structure for Windows bitmap files
|
/* bmp.h - header structure for Windows bitmap files
|
||||||
|
|
||||||
libzint - the open source barcode library
|
libzint - the open source barcode library
|
||||||
Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com>
|
Copyright (C) 2009-2021 Robin Stuart <rstuart114@gmail.com>
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
@ -65,7 +65,7 @@ extern "C" {
|
|||||||
uint32_t colours;
|
uint32_t colours;
|
||||||
uint32_t important_colours;
|
uint32_t important_colours;
|
||||||
} bitmap_info_header_t;
|
} bitmap_info_header_t;
|
||||||
|
|
||||||
typedef struct color_ref {
|
typedef struct color_ref {
|
||||||
uint8_t blue;
|
uint8_t blue;
|
||||||
uint8_t green;
|
uint8_t green;
|
||||||
|
@ -1127,7 +1127,7 @@ INTERNAL int ean_14(struct zint_symbol *symbol, unsigned char source[], int leng
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DPD (Deutsher Paket Dienst) Code */
|
/* DPD (Deutsher Paket Dienst) Code */
|
||||||
/* Specification at ftp://dpd.at/Datenspezifikationen/EN/gbs_V4.0.2_hauptdokument.pdf
|
/* Specification at ftp://dpd.at/Datenspezifikationen/EN/gbs_V4.0.2_hauptdokument.pdf
|
||||||
* or https://docplayer.net/33728877-Dpd-parcel-label-specification.html */
|
* or https://docplayer.net/33728877-Dpd-parcel-label-specification.html */
|
||||||
INTERNAL int dpd_parcel(struct zint_symbol *symbol, unsigned char source[], int length) {
|
INTERNAL int dpd_parcel(struct zint_symbol *symbol, unsigned char source[], int length) {
|
||||||
int error_number = 0;
|
int error_number = 0;
|
||||||
@ -1135,26 +1135,26 @@ INTERNAL int dpd_parcel(struct zint_symbol *symbol, unsigned char source[], int
|
|||||||
unsigned char identifier;
|
unsigned char identifier;
|
||||||
const int mod = 36;
|
const int mod = 36;
|
||||||
int cd; // Check digit
|
int cd; // Check digit
|
||||||
|
|
||||||
if (length != 28) {
|
if (length != 28) {
|
||||||
strcpy(symbol->errtxt, "349: DPD input wrong length (28 characters required)");
|
strcpy(symbol->errtxt, "349: DPD input wrong length (28 characters required)");
|
||||||
return ZINT_ERROR_TOO_LONG;
|
return ZINT_ERROR_TOO_LONG;
|
||||||
}
|
}
|
||||||
|
|
||||||
identifier = source[0];
|
identifier = source[0];
|
||||||
|
|
||||||
to_upper(source + 1);
|
to_upper(source + 1);
|
||||||
error_number = is_sane(KRSET, source + 1, length - 1);
|
error_number = is_sane(KRSET, source + 1, length - 1);
|
||||||
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
if (error_number == ZINT_ERROR_INVALID_DATA) {
|
||||||
strcpy(symbol->errtxt, "300: Invalid character in DPD data (alphanumerics only)");
|
strcpy(symbol->errtxt, "300: Invalid character in DPD data (alphanumerics only)");
|
||||||
return error_number;
|
return error_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((identifier < 32) || (identifier > 127)) {
|
if ((identifier < 32) || (identifier > 127)) {
|
||||||
strcpy(symbol->errtxt, "301: Invalid DPD identifier (first character), ASCII values 32 to 127 only");
|
strcpy(symbol->errtxt, "301: Invalid DPD identifier (first character), ASCII values 32 to 127 only");
|
||||||
return ZINT_ERROR_INVALID_DATA;
|
return ZINT_ERROR_INVALID_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_number = code_128(symbol, source, length); /* Only returns errors, not warnings */
|
error_number = code_128(symbol, source, length); /* Only returns errors, not warnings */
|
||||||
|
|
||||||
if (error_number < ZINT_ERROR) {
|
if (error_number < ZINT_ERROR) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
libzint - the open source barcode library
|
libzint - the open source barcode library
|
||||||
Copyright (C) 2020 Robin Stuart <rstuart114@gmail.com>
|
Copyright (C) 2020 - 2021 Robin Stuart <rstuart114@gmail.com>
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
@ -46,7 +46,7 @@ extern "C" {
|
|||||||
#define LATCHC 95
|
#define LATCHC 95
|
||||||
#define AORB 96
|
#define AORB 96
|
||||||
#define ABORC 97
|
#define ABORC 97
|
||||||
|
|
||||||
#define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
#define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
|
||||||
INTERNAL int parunmodd(const unsigned char llyth);
|
INTERNAL int parunmodd(const unsigned char llyth);
|
||||||
|
@ -129,6 +129,18 @@ INTERNAL void lookup(const char set_string[], const char *table[], const char da
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns the position of data in set_string */
|
||||||
|
INTERNAL int posn(const char set_string[], const char data) {
|
||||||
|
int i, n = (int) strlen(set_string);
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
if (data == set_string[i]) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Convert an integer value to a string representing its binary equivalent */
|
/* Convert an integer value to a string representing its binary equivalent */
|
||||||
INTERNAL void bin_append(const int arg, const int length, char *binary) {
|
INTERNAL void bin_append(const int arg, const int length, char *binary) {
|
||||||
int bin_posn = (int) strlen(binary);
|
int bin_posn = (int) strlen(binary);
|
||||||
@ -155,18 +167,6 @@ INTERNAL int bin_append_posn(const int arg, const int length, char *binary, cons
|
|||||||
return bin_posn + length;
|
return bin_posn + length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the position of data in set_string */
|
|
||||||
INTERNAL int posn(const char set_string[], const char data) {
|
|
||||||
int i, n = (int) strlen(set_string);
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
if (data == set_string[i]) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef COMMON_INLINE
|
#ifndef COMMON_INLINE
|
||||||
/* Return true (1) if a module is dark/black, otherwise false (0) */
|
/* Return true (1) if a module is dark/black, otherwise false (0) */
|
||||||
INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord) {
|
INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord) {
|
||||||
@ -435,6 +435,11 @@ INTERNAL int set_height(struct zint_symbol *symbol, const float min_row_height,
|
|||||||
return error_number;
|
return error_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Removes excess precision from floats - see https://stackoverflow.com/q/503436/664741 */
|
||||||
|
INTERNAL float stripf(const float arg) {
|
||||||
|
return *((volatile const float *) &arg);
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns red component if any of ultra colour indexing "0CBMRYGKW" */
|
/* Returns red component if any of ultra colour indexing "0CBMRYGKW" */
|
||||||
INTERNAL int colour_to_red(const int colour) {
|
INTERNAL int colour_to_red(const int colour) {
|
||||||
int return_val = 0;
|
int return_val = 0;
|
||||||
|
@ -114,11 +114,14 @@ extern "C" {
|
|||||||
INTERNAL int to_int(const unsigned char source[], const int length);
|
INTERNAL int to_int(const unsigned char source[], const int length);
|
||||||
INTERNAL void to_upper(unsigned char source[]);
|
INTERNAL void to_upper(unsigned char source[]);
|
||||||
INTERNAL int chr_cnt(const unsigned char string[], const int length, const unsigned char c);
|
INTERNAL int chr_cnt(const unsigned char string[], const int length, const unsigned char c);
|
||||||
|
|
||||||
INTERNAL int is_sane(const char test_string[], const unsigned char source[], const int length);
|
INTERNAL int is_sane(const char test_string[], const unsigned char source[], const int length);
|
||||||
INTERNAL void lookup(const char set_string[], const char *table[], const char data, char dest[]);
|
INTERNAL void lookup(const char set_string[], const char *table[], const char data, char dest[]);
|
||||||
|
INTERNAL int posn(const char set_string[], const char data);
|
||||||
|
|
||||||
INTERNAL void bin_append(const int arg, const int length, char *binary);
|
INTERNAL void bin_append(const int arg, const int length, char *binary);
|
||||||
INTERNAL int bin_append_posn(const int arg, const int length, char *binary, const int bin_posn);
|
INTERNAL int bin_append_posn(const int arg, const int length, char *binary, const int bin_posn);
|
||||||
INTERNAL int posn(const char set_string[], const char data);
|
|
||||||
#ifndef COMMON_INLINE
|
#ifndef COMMON_INLINE
|
||||||
INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord);
|
INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord);
|
||||||
INTERNAL void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
|
INTERNAL void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
|
||||||
@ -128,17 +131,22 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
INTERNAL void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
|
INTERNAL void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
|
||||||
INTERNAL void expand(struct zint_symbol *symbol, const char data[]);
|
INTERNAL void expand(struct zint_symbol *symbol, const char data[]);
|
||||||
|
|
||||||
INTERNAL int is_stackable(const int symbology);
|
INTERNAL int is_stackable(const int symbology);
|
||||||
INTERNAL int is_extendable(const int symbology);
|
INTERNAL int is_extendable(const int symbology);
|
||||||
INTERNAL int is_composite(const int symbology);
|
INTERNAL int is_composite(const int symbology);
|
||||||
INTERNAL int istwodigits(const unsigned char source[], const int length, const int position);
|
INTERNAL int istwodigits(const unsigned char source[], const int length, const int position);
|
||||||
|
|
||||||
INTERNAL unsigned int decode_utf8(unsigned int *state, unsigned int *codep, const unsigned char byte);
|
INTERNAL unsigned int decode_utf8(unsigned int *state, unsigned int *codep, const unsigned char byte);
|
||||||
INTERNAL int is_valid_utf8(const unsigned char source[], const int length);
|
INTERNAL int is_valid_utf8(const unsigned char source[], const int length);
|
||||||
INTERNAL int utf8_to_unicode(struct zint_symbol *symbol, const unsigned char source[], unsigned int vals[],
|
INTERNAL int utf8_to_unicode(struct zint_symbol *symbol, const unsigned char source[], unsigned int vals[],
|
||||||
int *length, const int disallow_4byte);
|
int *length, const int disallow_4byte);
|
||||||
|
|
||||||
INTERNAL int set_height(struct zint_symbol *symbol, const float min_row_height, const float default_height,
|
INTERNAL int set_height(struct zint_symbol *symbol, const float min_row_height, const float default_height,
|
||||||
const float max_height, const int set_errtxt);
|
const float max_height, const int set_errtxt);
|
||||||
|
|
||||||
|
INTERNAL float stripf(const float arg);
|
||||||
|
|
||||||
INTERNAL int colour_to_red(const int colour);
|
INTERNAL int colour_to_red(const int colour);
|
||||||
INTERNAL int colour_to_green(const int colour);
|
INTERNAL int colour_to_green(const int colour);
|
||||||
INTERNAL int colour_to_blue(const int colour);
|
INTERNAL int colour_to_blue(const int colour);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* emf.h - header structure for Microsoft EMF
|
/* emf.h - header structure for Microsoft EMF
|
||||||
|
|
||||||
libzint - the open source barcode library
|
libzint - the open source barcode library
|
||||||
Copyright (C) 2016-2017 Robin Stuart <rstuart114@gmail.com>
|
Copyright (C) 2016-2021 Robin Stuart <rstuart114@gmail.com>
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
@ -215,7 +215,7 @@ extern "C" {
|
|||||||
uint32_t size;
|
uint32_t size;
|
||||||
color_ref_t color;
|
color_ref_t color;
|
||||||
} emr_settextcolor_t;
|
} emr_settextcolor_t;
|
||||||
|
|
||||||
typedef struct emr_exttextoutw {
|
typedef struct emr_exttextoutw {
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
|
@ -1184,6 +1184,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
|
|||||||
unsigned char reduced[]) {
|
unsigned char reduced[]) {
|
||||||
int i, j, last_ai, ai_latch;
|
int i, j, last_ai, ai_latch;
|
||||||
int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
|
int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
|
||||||
|
int ai_no_data;
|
||||||
int ai_count;
|
int ai_count;
|
||||||
int error_value = 0;
|
int error_value = 0;
|
||||||
char obracket = symbol->input_mode & GS1PARENS_MODE ? '(' : '[';
|
char obracket = symbol->input_mode & GS1PARENS_MODE ? '(' : '[';
|
||||||
@ -1231,6 +1232,7 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
|
|||||||
min_ai_length = 5;
|
min_ai_length = 5;
|
||||||
j = 0;
|
j = 0;
|
||||||
ai_latch = 0;
|
ai_latch = 0;
|
||||||
|
ai_no_data = 0;
|
||||||
for (i = 0; i < src_len; i++) {
|
for (i = 0; i < src_len; i++) {
|
||||||
ai_length += j;
|
ai_length += j;
|
||||||
if (((j == 1) && (source[i] != cbracket)) && ((source[i] < '0') || (source[i] > '9'))) {
|
if (((j == 1) && (source[i] != cbracket)) && ((source[i] < '0') || (source[i] > '9'))) {
|
||||||
@ -1247,6 +1249,9 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
|
|||||||
}
|
}
|
||||||
j = 0;
|
j = 0;
|
||||||
ai_length = 0;
|
ai_length = 0;
|
||||||
|
if (i + 1 == src_len || source[i + 1] == obracket) { /* Check if no data */
|
||||||
|
ai_no_data = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (bracket_level > max_bracket_level) {
|
if (bracket_level > max_bracket_level) {
|
||||||
max_bracket_level = bracket_level;
|
max_bracket_level = bracket_level;
|
||||||
@ -1276,9 +1281,13 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (min_ai_length <= 1) {
|
if (min_ai_length <= 1) {
|
||||||
/* AI is too short */
|
/* Allow too short AI if GS1NOCHECK_MODE and AI is zero-length and all AIs have some data
|
||||||
strcpy(symbol->errtxt, "256: Invalid AI in input data (AI too short)");
|
- permits dummy "[]" workaround for ticket #204 data with no valid AI */
|
||||||
return ZINT_ERROR_INVALID_DATA;
|
if (!(symbol->input_mode & GS1NOCHECK_MODE) || min_ai_length == 1 || ai_no_data) {
|
||||||
|
/* AI is too short */
|
||||||
|
strcpy(symbol->errtxt, "256: Invalid AI in input data (AI too short)");
|
||||||
|
return ZINT_ERROR_INVALID_DATA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ai_latch == 1) {
|
if (ai_latch == 1) {
|
||||||
@ -1360,7 +1369,9 @@ INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[]
|
|||||||
if (
|
if (
|
||||||
((last_ai >= 0) && (last_ai <= 4))
|
((last_ai >= 0) && (last_ai <= 4))
|
||||||
|| ((last_ai >= 11) && (last_ai <= 20))
|
|| ((last_ai >= 11) && (last_ai <= 20))
|
||||||
|| (last_ai == 23) /* legacy support */
|
/* NOTE: as noted by Terry Burton the following complies with ISO/IEC 24724:2011 Table D.1,
|
||||||
|
but clashes with TPX AI [235], introduced May 2019; awaiting feedback from GS1 */
|
||||||
|
|| (last_ai == 23) /* legacy support */ /* TODO: probably remove */
|
||||||
|| ((last_ai >= 31) && (last_ai <= 36))
|
|| ((last_ai >= 31) && (last_ai <= 36))
|
||||||
|| (last_ai == 41)
|
|| (last_ai == 41)
|
||||||
) {
|
) {
|
||||||
|
@ -715,7 +715,7 @@ static int pdf417(struct zint_symbol *symbol, unsigned char chaine[], const int
|
|||||||
for (i = k - 1; i >= 0; i--) {
|
for (i = k - 1; i >= 0; i--) {
|
||||||
chainemc[mclength++] = mccorrection[i] ? 929 - mccorrection[i] : 0;
|
chainemc[mclength++] = mccorrection[i] ? 929 - mccorrection[i] : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
printf("Complete CW string (%d):\n", mclength);
|
printf("Complete CW string (%d):\n", mclength);
|
||||||
for (i = 0; i < mclength; i++) {
|
for (i = 0; i < mclength; i++) {
|
||||||
@ -785,7 +785,7 @@ static int pdf417(struct zint_symbol *symbol, unsigned char chaine[], const int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
symbol->width = bp;
|
symbol->width = bp;
|
||||||
|
|
||||||
/* ISO/IEC 15438:2015 Section 5.8.2 3X minimum row height */
|
/* ISO/IEC 15438:2015 Section 5.8.2 3X minimum row height */
|
||||||
error_number = set_height(symbol, 3.0f, 0.0f, 0.0f, 0 /*no_errtxt*/);
|
error_number = set_height(symbol, 3.0f, 0.0f, 0.0f, 0 /*no_errtxt*/);
|
||||||
|
|
||||||
@ -1217,7 +1217,7 @@ INTERNAL int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
symbol->width = bp;
|
symbol->width = bp;
|
||||||
|
|
||||||
/* ISO/IEC 24728:2006 Section 5.8.2 2X minimum row height */
|
/* ISO/IEC 24728:2006 Section 5.8.2 2X minimum row height */
|
||||||
if (error_number) {
|
if (error_number) {
|
||||||
(void) set_height(symbol, 2.0f, 0.0f, 0.0f, 1 /*no_errtxt*/);
|
(void) set_height(symbol, 2.0f, 0.0f, 0.0f, 1 /*no_errtxt*/);
|
||||||
|
@ -267,6 +267,7 @@ static void draw_bar(unsigned char *pixelbuf, const int xpos, const int xlen, co
|
|||||||
const int image_width, const int image_height, const char fill) {
|
const int image_width, const int image_height, const char fill) {
|
||||||
int y;
|
int y;
|
||||||
const int ye = ypos + ylen > image_height ? image_height : ypos + ylen; /* Defensive, should never happen */
|
const int ye = ypos + ylen > image_height ? image_height : ypos + ylen; /* Defensive, should never happen */
|
||||||
|
assert(ypos + ylen <= image_height); // Trigger assert if happens
|
||||||
|
|
||||||
for (y = ypos; y < ye; y++) {
|
for (y = ypos; y < ye; y++) {
|
||||||
memset(pixelbuf + ((size_t) image_width * y) + xpos, fill, xlen);
|
memset(pixelbuf + ((size_t) image_width * y) + xpos, fill, xlen);
|
||||||
@ -962,7 +963,7 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl
|
|||||||
for (r = 0; r < symbol->rows; r++) {
|
for (r = 0; r < symbol->rows; r++) {
|
||||||
int yposn_si = yposn * si;
|
int yposn_si = yposn * si;
|
||||||
float row_height = symbol->row_height[r] ? symbol->row_height[r] : large_bar_height;
|
float row_height = symbol->row_height[r] ? symbol->row_height[r] : large_bar_height;
|
||||||
int row_height_si = row_height * si;
|
int row_height_si = (int) ceilf(row_height * si);
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
@ -1264,9 +1265,10 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl
|
|||||||
image_width, image_height, si);
|
image_width, image_height, si);
|
||||||
|
|
||||||
if (!half_int_scaling) {
|
if (!half_int_scaling) {
|
||||||
|
size_t prev_image_row;
|
||||||
unsigned char *scaled_pixelbuf;
|
unsigned char *scaled_pixelbuf;
|
||||||
int scale_width = (int) (image_width * scaler);
|
int scale_width = (int) stripf(image_width * scaler);
|
||||||
int scale_height = (int) (image_height * scaler);
|
int scale_height = (int) stripf(image_height * scaler);
|
||||||
|
|
||||||
/* Apply scale options by creating another pixel buffer */
|
/* Apply scale options by creating another pixel buffer */
|
||||||
if (!(scaled_pixelbuf = (unsigned char *) malloc((size_t) scale_width * scale_height))) {
|
if (!(scaled_pixelbuf = (unsigned char *) malloc((size_t) scale_width * scale_height))) {
|
||||||
@ -1276,12 +1278,19 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl
|
|||||||
}
|
}
|
||||||
memset(scaled_pixelbuf, DEFAULT_PAPER, (size_t) scale_width * scale_height);
|
memset(scaled_pixelbuf, DEFAULT_PAPER, (size_t) scale_width * scale_height);
|
||||||
|
|
||||||
|
/* Interpolate */
|
||||||
for (r = 0; r < scale_height; r++) {
|
for (r = 0; r < scale_height; r++) {
|
||||||
int scaled_row = r * scale_width;
|
size_t scaled_row = r * scale_width;
|
||||||
int image_row = ((int) (r / scaler)) * image_width;
|
size_t image_row = (size_t) stripf(r / scaler) * image_width;
|
||||||
for (i = 0; i < scale_width; i++) {
|
if (image_row && (image_row == prev_image_row
|
||||||
*(scaled_pixelbuf + scaled_row + i) = *(pixelbuf + image_row + (int) (i / scaler));
|
|| memcmp(pixelbuf + image_row, pixelbuf + prev_image_row, image_width) == 0)) {
|
||||||
|
memcpy(scaled_pixelbuf + scaled_row, scaled_pixelbuf + scaled_row - scale_width, scale_width);
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < scale_width; i++) {
|
||||||
|
*(scaled_pixelbuf + scaled_row + i) = *(pixelbuf + image_row + (int) stripf(i / scaler));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
prev_image_row = image_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle,
|
error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle,
|
||||||
|
@ -88,7 +88,7 @@ static int jisx0201_wctomb(unsigned int *r, const unsigned int wc) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* ZINT: Table converted from JIS X 0208 to Shift JIS values using tools/cnv_sjis.php:
|
/* ZINT: Table converted from JIS X 0208 to Shift JIS values using tools/cnv_sjis.php:
|
||||||
*
|
*
|
||||||
while ($line = fgets(STDIN)) {
|
while ($line = fgets(STDIN)) {
|
||||||
echo preg_replace_callback('/0x([0-9a-f]{4})/', function ($matches) {
|
echo preg_replace_callback('/0x([0-9a-f]{4})/', function ($matches) {
|
||||||
$dec = hexdec($matches[1]);
|
$dec = hexdec($matches[1]);
|
||||||
@ -972,7 +972,8 @@ typedef struct {
|
|||||||
static const Summary16 jisx0208_uni2indx_page00[16] = {
|
static const Summary16 jisx0208_uni2indx_page00[16] = {
|
||||||
/* 0x0000 */
|
/* 0x0000 */
|
||||||
{ 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 },
|
{ 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 },
|
||||||
{ 0, 0x0000 }, { 6843, 0x1000 }, { 0, 0x0000 }, { 0, 0x0000 }, /* ZINT: Patched reverse solidus (backslash) mapping U+005C to 0x815F */
|
/* ZINT: Patched reverse solidus (backslash) mapping U+005C to 0x815F */
|
||||||
|
{ 0, 0x0000 }, { 6843, 0x1000 }, { 0, 0x0000 }, { 0, 0x0000 },
|
||||||
{ 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x118c }, { 5, 0x0053 },
|
{ 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x118c }, { 5, 0x0053 },
|
||||||
{ 9, 0x0000 }, { 9, 0x0080 }, { 10, 0x0000 }, { 10, 0x0080 },
|
{ 9, 0x0000 }, { 9, 0x0080 }, { 10, 0x0000 }, { 10, 0x0080 },
|
||||||
};
|
};
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -927,6 +927,7 @@ static void test_scale(int index, int debug) {
|
|||||||
int option_2;
|
int option_2;
|
||||||
int border_width;
|
int border_width;
|
||||||
int output_options;
|
int output_options;
|
||||||
|
float height;
|
||||||
float scale;
|
float scale;
|
||||||
char *data;
|
char *data;
|
||||||
char *composite;
|
char *composite;
|
||||||
@ -944,32 +945,40 @@ static void test_scale(int index, int debug) {
|
|||||||
};
|
};
|
||||||
// s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
|
// s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
|
||||||
struct item data[] = {
|
struct item data[] = {
|
||||||
/* 0*/ { BARCODE_PDF417, -1, -1, -1, 0, "1", "", 0, 18, 6, 103, 206, 36, 0, 36, 170, 14 }, // With no scaling
|
/* 0*/ { BARCODE_PDF417, -1, -1, -1, 0, 0, "1", "", 0, 18, 6, 103, 206, 36, 0, 36, 170, 14 }, // With no scaling
|
||||||
/* 1*/ { BARCODE_PDF417, -1, -1, -1, 0.6, "1", "", 0, 18, 6, 103, 206 * 0.6, 36 * 0.6, 0 /*set_row*/, 36 * 0.6, 170 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference
|
/* 1*/ { BARCODE_PDF417, -1, -1, -1, 0, 0.6, "1", "", 0, 18, 6, 103, 206 * 0.6, 36 * 0.6, 0 /*set_row*/, 36 * 0.6, 170 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference
|
||||||
/* 2*/ { BARCODE_PDF417, -1, -1, -1, 1.2, "1", "", 0, 18, 6, 103, 206 * 1.2, 36 * 1.2, 0 /*set_row*/, 36 * 1.2, 170 * 1.2 + 1, 14 * 1.2 }, // +1 set_col due to some scaling inversion difference
|
/* 2*/ { BARCODE_PDF417, -1, -1, -1, 0, 1.2, "1", "", 0, 18, 6, 103, 206 * 1.2, 36 * 1.2, 0 /*set_row*/, 36 * 1.2, 170 * 1.2 + 1, 14 * 1.2 }, // +1 set_col due to some scaling inversion difference
|
||||||
/* 3*/ { BARCODE_PDF417, -1, -1, -1, 0.5, "1", "", 0, 18, 6, 103, 206 * 0.5, 36 * 0.5, 0 /*set_row*/, 36 * 0.5, 170 * 0.5, 14 * 0.5 },
|
/* 3*/ { BARCODE_PDF417, -1, -1, -1, 0, 0.5, "1", "", 0, 18, 6, 103, 206 * 0.5, 36 * 0.5, 0 /*set_row*/, 36 * 0.5, 170 * 0.5, 14 * 0.5 },
|
||||||
/* 4*/ { BARCODE_PDF417, -1, -1, -1, 1.0, "1", "", 0, 18, 6, 103, 206 * 1.0, 36 * 1.0, 0 /*set_row*/, 36 * 1.0, 170 * 1.0, 14 * 1.0 },
|
/* 4*/ { BARCODE_PDF417, -1, -1, -1, 0, 1.0, "1", "", 0, 18, 6, 103, 206 * 1.0, 36 * 1.0, 0 /*set_row*/, 36 * 1.0, 170 * 1.0, 14 * 1.0 },
|
||||||
/* 5*/ { BARCODE_PDF417, -1, -1, -1, 1.5, "1", "", 0, 18, 6, 103, 206 * 1.5, 36 * 1.5, 0 /*set_row*/, 36 * 1.5, 170 * 1.5, 14 * 1.5 },
|
/* 5*/ { BARCODE_PDF417, -1, -1, -1, 0, 1.5, "1", "", 0, 18, 6, 103, 206 * 1.5, 36 * 1.5, 0 /*set_row*/, 36 * 1.5, 170 * 1.5, 14 * 1.5 },
|
||||||
/* 6*/ { BARCODE_PDF417, -1, -1, -1, 2.0, "1", "", 0, 18, 6, 103, 206 * 2.0, 36 * 2.0, 0 /*set_row*/, 36 * 2.0, 170 * 2.0, 14 * 2.0 },
|
/* 6*/ { BARCODE_PDF417, -1, -1, -1, 0, 2.0, "1", "", 0, 18, 6, 103, 206 * 2.0, 36 * 2.0, 0 /*set_row*/, 36 * 2.0, 170 * 2.0, 14 * 2.0 },
|
||||||
/* 7*/ { BARCODE_PDF417, -1, -1, -1, 2.5, "1", "", 0, 18, 6, 103, 206 * 2.5, 36 * 2.5, 0 /*set_row*/, 36 * 2.5, 170 * 2.5, 14 * 2.5 },
|
/* 7*/ { BARCODE_PDF417, -1, -1, -1, 0, 2.5, "1", "", 0, 18, 6, 103, 206 * 2.5, 36 * 2.5, 0 /*set_row*/, 36 * 2.5, 170 * 2.5, 14 * 2.5 },
|
||||||
/* 8*/ { BARCODE_PDF417, -1, -1, -1, 3.0, "1", "", 0, 18, 6, 103, 206 * 3.0, 36 * 3.0, 0 /*set_row*/, 36 * 3.0, 170 * 3.0, 14 * 3.0 },
|
/* 8*/ { BARCODE_PDF417, -1, -1, -1, 0, 3.0, "1", "", 0, 18, 6, 103, 206 * 3.0, 36 * 3.0, 0 /*set_row*/, 36 * 3.0, 170 * 3.0, 14 * 3.0 },
|
||||||
/* 9*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, "1", "", 0, 18, 6, 103, 218, 48, 0 /*set_row*/, 48, 176, 14 }, // With no scaling
|
/* 9*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, 0, "1", "", 0, 18, 6, 103, 218, 48, 0 /*set_row*/, 48, 176, 14 }, // With no scaling
|
||||||
/* 10*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0.6, "1", "", 0, 18, 6, 103, 218 * 0.6, 48 * 0.6, 0 /*set_row*/, 48 * 0.6, 176 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference
|
/* 10*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, 0.6, "1", "", 0, 18, 6, 103, 218 * 0.6, 48 * 0.6, 0 /*set_row*/, 48 * 0.6, 176 * 0.6 + 1, 14 * 0.6 }, // +1 set_col due to some scaling inversion difference
|
||||||
/* 11*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 1.6, "1", "", 0, 18, 6, 103, 218 * 1.6, 48 * 1.6, 0 /*set_row*/, 48 * 1.6, 176 * 1.6 + 1, 14 * 1.6 }, // +1 set_col due to some scaling inversion difference
|
/* 11*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, 1.6, "1", "", 0, 18, 6, 103, 218 * 1.6, 48 * 1.6, 0 /*set_row*/, 48 * 1.6, 176 * 1.6 + 1, 14 * 1.6 }, // +1 set_col due to some scaling inversion difference
|
||||||
/* 12*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 1.5, "1", "", 0, 18, 6, 103, 218 * 1.5, 48 * 1.5, 0 /*set_row*/, 48 * 1.5, 176 * 1.5, 14 * 1.5 },
|
/* 12*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, 1.5, "1", "", 0, 18, 6, 103, 218 * 1.5, 48 * 1.5, 0 /*set_row*/, 48 * 1.5, 176 * 1.5, 14 * 1.5 },
|
||||||
/* 13*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 2.5, "1", "", 0, 18, 6, 103, 218 * 2.5, 48 * 2.5, 0 /*set_row*/, 48 * 2.5, 176 * 2.5, 14 * 2.5 },
|
/* 13*/ { BARCODE_PDF417, -1, 3, BARCODE_BOX, 0, 2.5, "1", "", 0, 18, 6, 103, 218 * 2.5, 48 * 2.5, 0 /*set_row*/, 48 * 2.5, 176 * 2.5, 14 * 2.5 },
|
||||||
/* 14*/ { BARCODE_PDF417, -1, 3, OUT_BUFFER_INTERMEDIATE, 1.3, "1", "", 0, 18, 6, 103, 206 * 1.3, 36 * 1.3, 0 /*set_row*/, 36 * 1.3, 170 * 1.3 + 1, 14 * 1.3 }, // +1 set_col due to some scaling inversion difference
|
/* 14*/ { BARCODE_PDF417, -1, 3, OUT_BUFFER_INTERMEDIATE, 0, 1.3, "1", "", 0, 18, 6, 103, 206 * 1.3, 36 * 1.3, 0 /*set_row*/, 36 * 1.3, 170 * 1.3, 14 * 1.3 },
|
||||||
/* 15*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, "123456789012", "", 0, 50, 1, 79, 158, 116, 104 /*set_row*/, 114, 20, 2 }, // With no scaling
|
/* 15*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 0, "123456789012", "", 0, 50, 1, 79, 158, 116, 104 /*set_row*/, 114, 20, 2 }, // With no scaling
|
||||||
/* 16*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 1.5, "123456789012", "", 0, 50, 1, 79, 158 * 1.5, 116 * 1.5, 104 * 1.5 /*set_row*/, 114 * 1.5, 20 * 1.5, 1 * 1.5 },
|
/* 16*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 1.5, "123456789012", "", 0, 50, 1, 79, 158 * 1.5, 116 * 1.5, 104 * 1.5 /*set_row*/, 114 * 1.5, 20 * 1.5, 1 * 1.5 },
|
||||||
/* 17*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 2.0, "123456789012", "", 0, 50, 1, 79, 158 * 2.0, 116 * 2.0, 104 * 2.0 /*set_row*/, 114 * 2.0, 20 * 2.0, 1 * 2.0 },
|
/* 17*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 2.0, "123456789012", "", 0, 50, 1, 79, 158 * 2.0, 116 * 2.0, 104 * 2.0 /*set_row*/, 114 * 2.0, 20 * 2.0, 1 * 2.0 },
|
||||||
/* 18*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 3.5, "123456789012", "", 0, 50, 1, 79, 158 * 3.5, 116 * 3.5, 104 * 3.5 /*set_row*/, 114 * 3.5, 20 * 3.5, 1 * 3.5 },
|
/* 18*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 3.5, "123456789012", "", 0, 50, 1, 79, 158 * 3.5, 116 * 3.5, 104 * 3.5 /*set_row*/, 114 * 3.5, 20 * 3.5, 1 * 3.5 },
|
||||||
/* 19*/ { BARCODE_UPCA, -1, -1, -1, 0, "12345678904", "", 0, 50, 1, 95, 226, 116, 104 /*set_row*/, 114, 5, 2 }, // With no scaling
|
/* 19*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "12345678904", "", 0, 50, 1, 95, 226, 116, 104 /*set_row*/, 114, 5, 2 }, // With no scaling
|
||||||
/* 20*/ { BARCODE_UPCA, -1, -1, -1, 2.5, "12345678904", "", 0, 50, 1, 95, 226 * 2.5, 116 * 2.5, 104 * 2.5 /*set_row*/, 114 * 2.5, 5 * 2.5, 2 * 2.5 },
|
/* 20*/ { BARCODE_UPCA, -1, -1, -1, 0, 2.5, "12345678904", "", 0, 50, 1, 95, 226 * 2.5, 116 * 2.5, 104 * 2.5 /*set_row*/, 114 * 2.5, 5 * 2.5, 2 * 2.5 },
|
||||||
/* 21*/ { BARCODE_UPCA, -1, -1, -1, 4.5, "12345678904", "", 0, 50, 1, 95, 226 * 4.5, 116 * 4.5, 104 * 4.5 /*set_row*/, 114 * 4.5, 5 * 4.5, 2 * 4.5 },
|
/* 21*/ { BARCODE_UPCA, -1, -1, -1, 0, 4.5, "12345678904", "", 0, 50, 1, 95, 226 * 4.5, 116 * 4.5, 104 * 4.5 /*set_row*/, 114 * 4.5, 5 * 4.5, 2 * 4.5 },
|
||||||
/* 22*/ { BARCODE_UPCE_CC, -1, -1, -1, 0, "1234567", "[17]010615[10]A123456\"", 0, 50, 10, 55, 142, 116, 104 /*set_row*/, 115, 11, 2 }, // With no scaling
|
/* 22*/ { BARCODE_UPCE_CC, -1, -1, -1, 0, 0, "1234567", "[17]010615[10]A123456\"", 0, 50, 10, 55, 142, 116, 104 /*set_row*/, 115, 11, 2 }, // With no scaling
|
||||||
/* 23*/ { BARCODE_UPCE_CC, -1, -1, -1, 2.0, "1234567", "[17]010615[10]A123456\"", 0, 50, 10, 55, 142 * 2, 116 * 2, 104 * 2 + 1 /*set_row*/, 115 * 2, 11 * 2, 2 * 2 }, // +1 set_row
|
/* 23*/ { BARCODE_UPCE_CC, -1, -1, -1, 0, 2.0, "1234567", "[17]010615[10]A123456\"", 0, 50, 10, 55, 142 * 2, 116 * 2, 104 * 2 + 1 /*set_row*/, 115 * 2, 11 * 2, 2 * 2 }, // +1 set_row
|
||||||
/* 24*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "1234567890", "", 0, 165, 33, 30, 299, 298, 3 /*set_row*/, 7, 10, 9 }, // With no scaling
|
/* 24*/ { BARCODE_MAXICODE, -1, -1, -1, 0, 0, "1234567890", "", 0, 165, 33, 30, 299, 298, 3 /*set_row*/, 7, 10, 9 }, // With no scaling
|
||||||
/* 25*/ { BARCODE_MAXICODE, -1, -1, -1, 0.1, "1234567890", "", ZINT_WARN_NONCOMPLIANT, 165, 33, 30, 60, 65, 0 /*set_row*/, 1, 3, 1 },
|
/* 25*/ { BARCODE_MAXICODE, -1, -1, -1, 0, 0.1, "1234567890", "", ZINT_WARN_NONCOMPLIANT, 165, 33, 30, 60, 65, 0 /*set_row*/, 1, 3, 1 },
|
||||||
|
/* 26*/ { BARCODE_POSTNET, -1, -1, BARCODE_QUIET_ZONES, 0, 0, "12345", "", 0, 12, 2, 63, 146, 30, 3 /*set_row*/, 27, 10, 2 }, // With no scaling
|
||||||
|
/* 27*/ { BARCODE_POSTNET, -1, -1, BARCODE_QUIET_ZONES, 0, 0.1, "12345", "", 0, 12, 2, 63, 146 * 0.5, 30 * 0.5 - 1, 3 * 0.5 /*set_row*/, 27 * 0.5, 10 * 0.5, 2 * 0.5 }, // -1 height due to yoffset/boffset flooring
|
||||||
|
/* 28*/ { BARCODE_POSTNET, -1, -1, BARCODE_QUIET_ZONES, 0, 0.9, "12345", "", 0, 12, 2, 63, 146 * 0.9, 30 * 0.9, 3 * 0.9 + 1 /*set_row*/, 27 * 0.9, 10 * 0.9, 2 * 0.9 + 1 }, // +1's due to interpolation
|
||||||
|
/* 29*/ { BARCODE_POSTNET, -1, -1, BARCODE_QUIET_ZONES, 0, 2.3, "12345", "", 0, 12, 2, 63, 146 * 2.3, 30 * 2.3, 3 * 2.3 + 1 /*set_row*/, 27 * 2.3 - 1, 10 * 2.3, 2 * 2.3 + 1 }, // -1/+1's due to interpolation
|
||||||
|
/* 30*/ { BARCODE_POSTNET, -1, -1, BARCODE_QUIET_ZONES, 0, 3.1, "12345", "", 0, 12, 2, 63, 146 * 3.1, 30 * 3.1, 3 * 3.1 + 1 /*set_row*/, 27 * 3.1, 10 * 3.1, 2 * 3.2 + 1 }, // +1's due to interpolation
|
||||||
|
/* 31*/ { BARCODE_ITF14, -1, 4, BARCODE_BIND, 61.8, 0, "12345", "", 0, 62, 1, 135, 310, 156, 8 /*set_row*/, 132, 20, 2 }, // With no scaling
|
||||||
|
/* 32*/ { BARCODE_ITF14, -1, 4, BARCODE_BIND, 61.8, 2, "12345", "", 0, 61.75, 1, 135, 310 * 2, 156 * 2 - 1, 8 * 2 /*set_row*/, 132 * 2 - 1, 20 * 2, 2 * 2 }, // -1's due to height rounding
|
||||||
|
/* 33*/ { BARCODE_ITF14, -1, 4, BARCODE_BIND, 61.8, 2.1, "12345", "", 0, 62, 1, 135, 310 * 2.1, 156 * 2.1, 8 * 2.1 /*set_row*/, 132 * 2.1, 20 * 2.1, 2 * 2.1 },
|
||||||
};
|
};
|
||||||
int data_size = ARRAY_SIZE(data);
|
int data_size = ARRAY_SIZE(data);
|
||||||
int i, length, ret;
|
int i, length, ret;
|
||||||
@ -991,6 +1000,9 @@ static void test_scale(int index, int debug) {
|
|||||||
if (data[i].border_width != -1) {
|
if (data[i].border_width != -1) {
|
||||||
symbol->border_width = data[i].border_width;
|
symbol->border_width = data[i].border_width;
|
||||||
}
|
}
|
||||||
|
if (data[i].height) {
|
||||||
|
symbol->height = data[i].height;
|
||||||
|
}
|
||||||
if (data[i].scale) {
|
if (data[i].scale) {
|
||||||
symbol->scale = data[i].scale;
|
symbol->scale = data[i].scale;
|
||||||
}
|
}
|
||||||
@ -1023,7 +1035,7 @@ static void test_scale(int index, int debug) {
|
|||||||
|
|
||||||
assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%d) symbol->bitmap_height %d < expected_set_rows %d\n",
|
assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%d) symbol->bitmap_height %d < expected_set_rows %d\n",
|
||||||
i, data[i].symbology, symbol->bitmap_height, data[i].expected_set_rows);
|
i, data[i].symbology, symbol->bitmap_height, data[i].expected_set_rows);
|
||||||
assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%d) expected_set_rows %d < expected_set_row %d\n",
|
assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%d) expected_set_rows %d <= expected_set_row %d\n",
|
||||||
i, data[i].symbology, data[i].expected_set_rows, data[i].expected_set_row);
|
i, data[i].symbology, data[i].expected_set_rows, data[i].expected_set_row);
|
||||||
for (row = data[i].expected_set_row; row < data[i].expected_set_rows; row++) {
|
for (row = data[i].expected_set_row; row < data[i].expected_set_rows; row++) {
|
||||||
int bits_set = 0;
|
int bits_set = 0;
|
||||||
@ -2196,6 +2208,95 @@ static void test_height(int index, int generate, int debug) {
|
|||||||
testFinish();
|
testFinish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#define TEST_PERF_ITERATIONS 1000
|
||||||
|
|
||||||
|
// Not a real test, just performance indicator for scaling
|
||||||
|
static void test_perf_scale(int index, int debug) {
|
||||||
|
|
||||||
|
struct item {
|
||||||
|
int symbology;
|
||||||
|
int input_mode;
|
||||||
|
int border_width;
|
||||||
|
int output_options;
|
||||||
|
int option_1;
|
||||||
|
int option_2;
|
||||||
|
float height;
|
||||||
|
float scale;
|
||||||
|
char *data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
int expected_rows;
|
||||||
|
int expected_width;
|
||||||
|
char *comment;
|
||||||
|
};
|
||||||
|
struct item data[] = {
|
||||||
|
/* 0*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, 0, 1.3,
|
||||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz&,:#-.$/+%*=^ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM"
|
||||||
|
"NOPQRSTUVWXYZ;<>@[]_`~!||()?{}'123456789012345678901234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJK"
|
||||||
|
"LMNOPQRSTUVWXYZ12345678912345678912345678912345678900001234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFG"
|
||||||
|
"HIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234567"
|
||||||
|
"890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcde"
|
||||||
|
"fghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO",
|
||||||
|
0, 40, 307, "960 chars, text/numeric" },
|
||||||
|
/* 1*/ { BARCODE_POSTNET, -1, -1, BARCODE_QUIET_ZONES, -1, -1, 0, 1.1, "12345", 0, 2, 63, "" },
|
||||||
|
/* 2*/ { BARCODE_ITF14, -1, 4, BARCODE_BIND, -1, -1, 61.8, 3.1, "12345", 0, 1, 135, "" },
|
||||||
|
};
|
||||||
|
int data_size = ARRAY_SIZE(data);
|
||||||
|
int i, length, ret;
|
||||||
|
|
||||||
|
clock_t start, total_encode = 0, total_buffer = 0, diff_encode, diff_buffer;
|
||||||
|
|
||||||
|
if (!(debug & ZINT_DEBUG_TEST_PERFORMANCE)) { /* -d 256 */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < data_size; i++) {
|
||||||
|
int j;
|
||||||
|
|
||||||
|
if (index != -1 && i != index) continue;
|
||||||
|
|
||||||
|
diff_encode = diff_buffer = 0;
|
||||||
|
|
||||||
|
for (j = 0; j < TEST_PERF_ITERATIONS; j++) {
|
||||||
|
struct zint_symbol *symbol = ZBarcode_Create();
|
||||||
|
assert_nonnull(symbol, "Symbol not created\n");
|
||||||
|
|
||||||
|
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);
|
||||||
|
if (data[i].height) {
|
||||||
|
symbol->height = data[i].height;
|
||||||
|
}
|
||||||
|
if (data[i].scale) {
|
||||||
|
symbol->scale = data[i].scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
start = clock();
|
||||||
|
ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length);
|
||||||
|
diff_encode += clock() - start;
|
||||||
|
assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
|
||||||
|
|
||||||
|
assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
|
||||||
|
assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);
|
||||||
|
|
||||||
|
start = clock();
|
||||||
|
ret = ZBarcode_Buffer(symbol, 0 /*rotate_angle*/);
|
||||||
|
diff_buffer += clock() - start;
|
||||||
|
assert_zero(ret, "i:%d ZBarcode_Buffer ret %d != 0 (%s)\n", i, ret, symbol->errtxt);
|
||||||
|
|
||||||
|
ZBarcode_Delete(symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s: diff_encode %gms, diff_buffer %gms\n", data[i].comment, diff_encode * 1000.0 / CLOCKS_PER_SEC, diff_buffer * 1000.0 / CLOCKS_PER_SEC);
|
||||||
|
|
||||||
|
total_encode += diff_encode;
|
||||||
|
total_buffer += diff_buffer;
|
||||||
|
}
|
||||||
|
if (index != -1) {
|
||||||
|
printf("totals: encode %gms, buffer %gms\n", total_encode * 1000.0 / CLOCKS_PER_SEC, total_buffer * 1000.0 / CLOCKS_PER_SEC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */
|
testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */
|
||||||
@ -2212,6 +2313,7 @@ int main(int argc, char *argv[]) {
|
|||||||
{ "test_quiet_zones", test_quiet_zones, 1, 0, 1 },
|
{ "test_quiet_zones", test_quiet_zones, 1, 0, 1 },
|
||||||
{ "test_buffer_plot", test_buffer_plot, 1, 1, 1 },
|
{ "test_buffer_plot", test_buffer_plot, 1, 1, 1 },
|
||||||
{ "test_height", test_height, 1, 1, 1 },
|
{ "test_height", test_height, 1, 1, 1 },
|
||||||
|
{ "test_perf_scale", test_perf_scale, 1, 0, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
testRun(argc, argv, funcs, ARRAY_SIZE(funcs));
|
testRun(argc, argv, funcs, ARRAY_SIZE(funcs));
|
||||||
|
@ -39,17 +39,17 @@ static struct zint_vector_rect *find_rect(struct zint_symbol *symbol, float x, f
|
|||||||
}
|
}
|
||||||
for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) {
|
for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) {
|
||||||
//printf("x %.8g, y %.8g, width %.8g, height %.8g\n", rect->x, rect->y, rect->width, rect->height);
|
//printf("x %.8g, y %.8g, width %.8g, height %.8g\n", rect->x, rect->y, rect->width, rect->height);
|
||||||
if (rect->x == x && rect->y == y) {
|
if (rect->x == stripf(x) && rect->y == stripf(y)) {
|
||||||
if (height && width) {
|
if (height && width) {
|
||||||
if (rect->height == height && rect->width == width) {
|
if (rect->height == stripf(height) && rect->width == stripf(width)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (height) {
|
} else if (height) {
|
||||||
if (rect->height == height) {
|
if (rect->height == stripf(height)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (width) {
|
} else if (width) {
|
||||||
if (rect->width == width) {
|
if (rect->width == stripf(width)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -69,9 +69,9 @@ static struct zint_vector_circle *find_circle(struct zint_symbol *symbol, float
|
|||||||
}
|
}
|
||||||
for (circle = symbol->vector->circles; circle != NULL; circle = circle->next) {
|
for (circle = symbol->vector->circles; circle != NULL; circle = circle->next) {
|
||||||
//printf("x %.8g, y %.8g, diamter %.8g\n", circle->x, circle->y, circle->diameter);
|
//printf("x %.8g, y %.8g, diamter %.8g\n", circle->x, circle->y, circle->diameter);
|
||||||
if (circle->x == x && circle->y == y) {
|
if (circle->x == stripf(x) && circle->y == stripf(y)) {
|
||||||
if (diameter) {
|
if (diameter) {
|
||||||
if (circle->diameter == diameter) {
|
if (circle->diameter == stripf(diameter)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -39,27 +39,27 @@
|
|||||||
* Copyright (c) 1988-1997 Sam Leffler
|
* Copyright (c) 1988-1997 Sam Leffler
|
||||||
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, distribute, and sell this software and
|
* Permission to use, copy, modify, distribute, and sell this software and
|
||||||
* its documentation for any purpose is hereby granted without fee, provided
|
* its documentation for any purpose is hereby granted without fee, provided
|
||||||
* that (i) the above copyright notices and this permission notice appear in
|
* that (i) the above copyright notices and this permission notice appear in
|
||||||
* all copies of the software and related documentation, and (ii) the names of
|
* all copies of the software and related documentation, and (ii) the names of
|
||||||
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
* Sam Leffler and Silicon Graphics may not be used in any advertising or
|
||||||
* publicity relating to the software without the specific, prior written
|
* publicity relating to the software without the specific, prior written
|
||||||
* permission of Sam Leffler and Silicon Graphics.
|
* permission of Sam Leffler and Silicon Graphics.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
*
|
*
|
||||||
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
|
||||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||||
* OF THIS SOFTWARE.
|
* OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* TIFF Library.
|
* TIFF Library.
|
||||||
* Rev 5.0 Lempel-Ziv & Welch Compression Support
|
* Rev 5.0 Lempel-Ziv & Welch Compression Support
|
||||||
*
|
*
|
||||||
* This code is derived from the compress program whose code is
|
* This code is derived from the compress program whose code is
|
||||||
@ -176,16 +176,16 @@ static void tif_lzw_cl_hash(tif_lzw_state *sp) {
|
|||||||
/*
|
/*
|
||||||
* Encode a chunk of pixels.
|
* Encode a chunk of pixels.
|
||||||
*
|
*
|
||||||
* Uses an open addressing double hashing (no chaining) on the
|
* Uses an open addressing double hashing (no chaining) on the
|
||||||
* prefix code/next character combination. We do a variant of
|
* prefix code/next character combination. We do a variant of
|
||||||
* Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
|
* Knuth's algorithm D (vol. 3, sec. 6.4) along with G. Knott's
|
||||||
* relatively-prime secondary probe. Here, the modular division
|
* relatively-prime secondary probe. Here, the modular division
|
||||||
* first probe is gives way to a faster exclusive-or manipulation.
|
* first probe is gives way to a faster exclusive-or manipulation.
|
||||||
* Also do block compression with an adaptive reset, whereby the
|
* Also do block compression with an adaptive reset, whereby the
|
||||||
* code table is cleared when the compression ratio decreases,
|
* code table is cleared when the compression ratio decreases,
|
||||||
* but after the table fills. The variable-length output codes
|
* but after the table fills. The variable-length output codes
|
||||||
* are re-sized at this point, and a CODE_CLEAR is generated
|
* are re-sized at this point, and a CODE_CLEAR is generated
|
||||||
* for the decoder.
|
* for the decoder.
|
||||||
*/
|
*/
|
||||||
static int tif_lzw_encode(tif_lzw_state *sp, FILE *op_file, const unsigned char *bp, int cc) {
|
static int tif_lzw_encode(tif_lzw_state *sp, FILE *op_file, const unsigned char *bp, int cc) {
|
||||||
register long fcode;
|
register long fcode;
|
||||||
|
@ -117,14 +117,14 @@ static const int tiles[] = {
|
|||||||
* Dated 2001-03-09
|
* Dated 2001-03-09
|
||||||
* Corrected thanks to input from Terry Burton */
|
* Corrected thanks to input from Terry Burton */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: Included here is an attempt to allow code compression within Ultracode. Unfortunately
|
* NOTE: Included here is an attempt to allow code compression within Ultracode. Unfortunately
|
||||||
* the copy of the standard this was written from was an early draft which includes self
|
* the copy of the standard this was written from was an early draft which includes self
|
||||||
* contradictions, so this is a "best guess" implementation. Because it is not guaranteed
|
* contradictions, so this is a "best guess" implementation. Because it is not guaranteed
|
||||||
* to be correct this compression is not applied by default. To enable compression set
|
* to be correct this compression is not applied by default. To enable compression set
|
||||||
*
|
*
|
||||||
* symbol->option_3 = ULTRA_COMPRESSION;
|
* symbol->option_3 = ULTRA_COMPRESSION;
|
||||||
*
|
*
|
||||||
* Code compression should be enabled by default when it has been implemented according to
|
* Code compression should be enabled by default when it has been implemented according to
|
||||||
* a more reliable version of the specification.
|
* a more reliable version of the specification.
|
||||||
*/
|
*/
|
||||||
@ -642,7 +642,7 @@ static int ultra_generate_codewords(struct zint_symbol *symbol, const unsigned c
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symbol->option_3 != ULTRA_COMPRESSION && !gs1) {
|
if (symbol->option_3 != ULTRA_COMPRESSION && !gs1) {
|
||||||
// Force eight-bit mode by default as other modes are poorly documented
|
// Force eight-bit mode by default as other modes are poorly documented
|
||||||
symbol_mode = EIGHTBIT_MODE;
|
symbol_mode = EIGHTBIT_MODE;
|
||||||
@ -969,7 +969,7 @@ INTERNAL int ultracode(struct zint_symbol *symbol, unsigned char source[], int l
|
|||||||
|
|
||||||
locn = 0;
|
locn = 0;
|
||||||
/* Calculate error correction codewords (RSEC) */
|
/* Calculate error correction codewords (RSEC) */
|
||||||
|
|
||||||
ultra_gf283((short) data_cw_count, (short) qcc, data_codewords);
|
ultra_gf283((short) data_cw_count, (short) qcc, data_codewords);
|
||||||
|
|
||||||
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
if (symbol->debug & ZINT_DEBUG_PRINT) {
|
||||||
|
@ -228,42 +228,42 @@ static void vector_scale(struct zint_symbol *symbol, const int file_type) {
|
|||||||
// Increase size to overcome limitations in EMF file format
|
// Increase size to overcome limitations in EMF file format
|
||||||
scale *= 20;
|
scale *= 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
symbol->vector->width *= scale;
|
symbol->vector->width = stripf(symbol->vector->width * scale);
|
||||||
symbol->vector->height *= scale;
|
symbol->vector->height = stripf(symbol->vector->height * scale);
|
||||||
|
|
||||||
rect = symbol->vector->rectangles;
|
rect = symbol->vector->rectangles;
|
||||||
while (rect) {
|
while (rect) {
|
||||||
rect->x *= scale;
|
rect->x = stripf(rect->x * scale);
|
||||||
rect->y *= scale;
|
rect->y = stripf(rect->y * scale);
|
||||||
rect->height *= scale;
|
rect->height = stripf(rect->height * scale);
|
||||||
rect->width *= scale;
|
rect->width = stripf(rect->width * scale);
|
||||||
rect = rect->next;
|
rect = rect->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
hex = symbol->vector->hexagons;
|
hex = symbol->vector->hexagons;
|
||||||
while (hex) {
|
while (hex) {
|
||||||
hex->x *= scale;
|
hex->x = stripf(hex->x * scale);
|
||||||
hex->y *= scale;
|
hex->y = stripf(hex->y * scale);
|
||||||
hex->diameter *= scale;
|
hex->diameter = stripf(hex->diameter * scale);
|
||||||
hex = hex->next;
|
hex = hex->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
circle = symbol->vector->circles;
|
circle = symbol->vector->circles;
|
||||||
while (circle) {
|
while (circle) {
|
||||||
circle->x *= scale;
|
circle->x = stripf(circle->x * scale);
|
||||||
circle->y *= scale;
|
circle->y = stripf(circle->y * scale);
|
||||||
circle->diameter *= scale;
|
circle->diameter = stripf(circle->diameter * scale);
|
||||||
circle->width *= scale;
|
circle->width = stripf(circle->width * scale);
|
||||||
circle = circle->next;
|
circle = circle->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
string = symbol->vector->strings;
|
string = symbol->vector->strings;
|
||||||
while (string) {
|
while (string) {
|
||||||
string->x *= scale;
|
string->x = stripf(string->x * scale);
|
||||||
string->y *= scale;
|
string->y = stripf(string->y * scale);
|
||||||
string->width *= scale;
|
string->width = stripf(string->width * scale);
|
||||||
string->fsize *= scale;
|
string->fsize = stripf(string->fsize * scale);
|
||||||
string = string->next;
|
string = string->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -275,92 +275,92 @@ static void vector_rotate(struct zint_symbol *symbol, const int rotate_angle) {
|
|||||||
struct zint_vector_circle *circle;
|
struct zint_vector_circle *circle;
|
||||||
struct zint_vector_string *string;
|
struct zint_vector_string *string;
|
||||||
float temp;
|
float temp;
|
||||||
|
|
||||||
if (rotate_angle == 0) {
|
if (rotate_angle == 0) {
|
||||||
// No rotation needed
|
// No rotation needed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rect = symbol->vector->rectangles;
|
rect = symbol->vector->rectangles;
|
||||||
while (rect) {
|
while (rect) {
|
||||||
if (rotate_angle == 90) {
|
if (rotate_angle == 90) {
|
||||||
temp = rect->x;
|
temp = rect->x;
|
||||||
rect->x = symbol->vector->height - (rect->y + rect->height);
|
rect->x = stripf(symbol->vector->height - (rect->y + rect->height));
|
||||||
rect->y = temp;
|
rect->y = temp;
|
||||||
temp = rect->width;
|
temp = rect->width;
|
||||||
rect->width = rect->height;
|
rect->width = rect->height;
|
||||||
rect->height = temp;
|
rect->height = temp;
|
||||||
} else if (rotate_angle == 180) {
|
} else if (rotate_angle == 180) {
|
||||||
rect->x = symbol->vector->width - (rect->x + rect->width);
|
rect->x = stripf(symbol->vector->width - (rect->x + rect->width));
|
||||||
rect->y = symbol->vector->height - (rect->y + rect->height);
|
rect->y = stripf(symbol->vector->height - (rect->y + rect->height));
|
||||||
} else if (rotate_angle == 270) {
|
} else if (rotate_angle == 270) {
|
||||||
temp = rect->x;
|
temp = rect->x;
|
||||||
rect->x = rect->y;
|
rect->x = rect->y;
|
||||||
rect->y = symbol->vector->width - (temp + rect->width);
|
rect->y = stripf(symbol->vector->width - (temp + rect->width));
|
||||||
temp = rect->width;
|
temp = rect->width;
|
||||||
rect->width = rect->height;
|
rect->width = rect->height;
|
||||||
rect->height = temp;
|
rect->height = temp;
|
||||||
}
|
}
|
||||||
rect = rect->next;
|
rect = rect->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
hex = symbol->vector->hexagons;
|
hex = symbol->vector->hexagons;
|
||||||
while (hex) {
|
while (hex) {
|
||||||
if (rotate_angle == 90) {
|
if (rotate_angle == 90) {
|
||||||
temp = hex->x;
|
temp = hex->x;
|
||||||
hex->x = symbol->vector->height - hex->y;
|
hex->x = stripf(symbol->vector->height - hex->y);
|
||||||
hex->y = temp;
|
hex->y = temp;
|
||||||
hex->rotation = 90;
|
hex->rotation = 90;
|
||||||
} else if (rotate_angle == 180) {
|
} else if (rotate_angle == 180) {
|
||||||
hex->x = symbol->vector->width - hex->x;
|
hex->x = stripf(symbol->vector->width - hex->x);
|
||||||
hex->y = symbol->vector->height - hex->y;
|
hex->y = stripf(symbol->vector->height - hex->y);
|
||||||
hex->rotation = 180;
|
hex->rotation = 180;
|
||||||
} else if (rotate_angle == 270) {
|
} else if (rotate_angle == 270) {
|
||||||
temp = hex->x;
|
temp = hex->x;
|
||||||
hex->x = hex->y;
|
hex->x = hex->y;
|
||||||
hex->y = symbol->vector->width - temp;
|
hex->y = stripf(symbol->vector->width - temp);
|
||||||
hex->rotation = 270;
|
hex->rotation = 270;
|
||||||
}
|
}
|
||||||
hex = hex->next;
|
hex = hex->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
circle = symbol->vector->circles;
|
circle = symbol->vector->circles;
|
||||||
while (circle) {
|
while (circle) {
|
||||||
if (rotate_angle == 90) {
|
if (rotate_angle == 90) {
|
||||||
temp = circle->x;
|
temp = circle->x;
|
||||||
circle->x = symbol->vector->height - circle->y;
|
circle->x = stripf(symbol->vector->height - circle->y);
|
||||||
circle->y = temp;
|
circle->y = temp;
|
||||||
} else if (rotate_angle == 180) {
|
} else if (rotate_angle == 180) {
|
||||||
circle->x = symbol->vector->width - circle->x;
|
circle->x = stripf(symbol->vector->width - circle->x);
|
||||||
circle->y = symbol->vector->height - circle->y;
|
circle->y = stripf(symbol->vector->height - circle->y);
|
||||||
} else if (rotate_angle == 270) {
|
} else if (rotate_angle == 270) {
|
||||||
temp = circle->x;
|
temp = circle->x;
|
||||||
circle->x = circle->y;
|
circle->x = circle->y;
|
||||||
circle->y = symbol->vector->width - temp;
|
circle->y = stripf(symbol->vector->width - temp);
|
||||||
}
|
}
|
||||||
circle = circle->next;
|
circle = circle->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
string = symbol->vector->strings;
|
string = symbol->vector->strings;
|
||||||
while (string) {
|
while (string) {
|
||||||
if (rotate_angle == 90) {
|
if (rotate_angle == 90) {
|
||||||
temp = string->x;
|
temp = string->x;
|
||||||
string->x = symbol->vector->height - string->y;
|
string->x = stripf(symbol->vector->height - string->y);
|
||||||
string->y = temp;
|
string->y = temp;
|
||||||
string->rotation = 90;
|
string->rotation = 90;
|
||||||
} else if (rotate_angle == 180) {
|
} else if (rotate_angle == 180) {
|
||||||
string->x = symbol->vector->width - string->x;
|
string->x = stripf(symbol->vector->width - string->x);
|
||||||
string->y = symbol->vector->height - string->y;
|
string->y = stripf(symbol->vector->height - string->y);
|
||||||
string->rotation = 180;
|
string->rotation = 180;
|
||||||
} else if (rotate_angle == 270) {
|
} else if (rotate_angle == 270) {
|
||||||
temp = string->x;
|
temp = string->x;
|
||||||
string->x = string->y;
|
string->x = string->y;
|
||||||
string->y = symbol->vector->width - temp;
|
string->y = stripf(symbol->vector->width - temp);
|
||||||
string->rotation = 270;
|
string->rotation = 270;
|
||||||
}
|
}
|
||||||
string = string->next;
|
string = string->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((rotate_angle == 90) || (rotate_angle == 270)) {
|
if ((rotate_angle == 90) || (rotate_angle == 270)) {
|
||||||
temp = symbol->vector->height;
|
temp = symbol->vector->height;
|
||||||
symbol->vector->height = symbol->vector->width;
|
symbol->vector->height = symbol->vector->width;
|
||||||
@ -378,7 +378,7 @@ static void vector_reduce_rectangles(struct zint_symbol *symbol) {
|
|||||||
target = prev->next;
|
target = prev->next;
|
||||||
|
|
||||||
while (target) {
|
while (target) {
|
||||||
if ((rect->x == target->x) && (rect->width == target->width) && ((rect->y + rect->height) == target->y)
|
if ((rect->x == target->x) && (rect->width == target->width) && (stripf(rect->y + rect->height) == target->y)
|
||||||
&& (rect->colour == target->colour)) {
|
&& (rect->colour == target->colour)) {
|
||||||
rect->height += target->height;
|
rect->height += target->height;
|
||||||
prev->next = target->next;
|
prev->next = target->next;
|
||||||
@ -919,7 +919,7 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
|
|||||||
vector_reduce_rectangles(symbol);
|
vector_reduce_rectangles(symbol);
|
||||||
|
|
||||||
vector_scale(symbol, file_type);
|
vector_scale(symbol, file_type);
|
||||||
|
|
||||||
if (file_type != OUT_EMF_FILE) {
|
if (file_type != OUT_EMF_FILE) {
|
||||||
/* EMF does its own rotation (with mixed results in various apps) */
|
/* EMF does its own rotation (with mixed results in various apps) */
|
||||||
vector_rotate(symbol, rotate_angle);
|
vector_rotate(symbol, rotate_angle);
|
||||||
|
Loading…
Reference in New Issue
Block a user