Use internal vector format in Qt backend

This commit is contained in:
Robin Stuart
2018-06-18 02:36:40 +01:00
parent 30fcd7986c
commit 656c8132a8
4 changed files with 176 additions and 399 deletions

View File

@ -181,11 +181,13 @@ extern int vin(struct zint_symbol *symbol, const unsigned char source[], const s
extern int mailmark(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Royal Mail 4-state Mailmark */
extern int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to PNG/BMP/PCX */
extern int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to EPS/EMF/SVG */
extern int render_plot(struct zint_symbol *symbol, float width, float height); /* Plot to gLabels */
extern int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to new vector format */
//extern int ps_plot(struct zint_symbol *symbol); /* Plot to EPS */
//extern int svg_plot(struct zint_symbol *symbol); /* Plot to SVG */
extern int emf_plot(struct zint_symbol *symbol); /* Plot to Metafile */
//extern int emf_plot(struct zint_symbol *symbol); /* Plot to Metafile */
void error_tag(char error_string[], int error_number) {
@ -1251,13 +1253,13 @@ int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) {
error_number = dump_plot(symbol);
} else
if (!(strcmp(output, "EPS"))) {
error_number = vector_plot(symbol, rotate_angle, OUT_EPS_FILE);
error_number = plot_vector(symbol, rotate_angle, OUT_EPS_FILE);
} else
if (!(strcmp(output, "SVG"))) {
error_number = vector_plot(symbol, rotate_angle, OUT_SVG_FILE);
error_number = plot_vector(symbol, rotate_angle, OUT_SVG_FILE);
} else
if (!(strcmp(output, "EMF"))) {
error_number = vector_plot(symbol, rotate_angle, OUT_EMF_FILE);
error_number = plot_vector(symbol, rotate_angle, OUT_EMF_FILE);
} else {
strcpy(symbol->errtxt, "225: Unknown output format");
error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION);
@ -1298,6 +1300,26 @@ int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle) {
return error_number;
}
int ZBarcode_Buffer_Vector(struct zint_symbol *symbol, int rotate_angle) {
int error_number;
switch (rotate_angle) {
case 0:
case 90:
case 180:
case 270:
break;
default:
strcpy(symbol->errtxt, "228: Invalid rotation angle");
error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION);
return ZINT_ERROR_INVALID_OPTION;
}
error_number = plot_vector(symbol, rotate_angle, OUT_BUFFER);
error_tag(symbol->errtxt, error_number);
return error_number;
}
int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) {
int error_number;
int first_err;
@ -1333,6 +1355,24 @@ int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input,
return error_number;
}
int ZBarcode_Encode_and_Buffer_Vector(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) {
int error_number;
int first_err;
error_number = ZBarcode_Encode(symbol, input, length);
if (error_number >= 5) {
return error_number;
}
first_err = error_number;
error_number = ZBarcode_Buffer_Vector(symbol, rotate_angle);
if (error_number == 0) {
error_number = first_err;
}
return error_number;
}
int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) {
FILE *file;
unsigned char *buffer;
@ -1428,6 +1468,24 @@ int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename,
return error_number;
}
int ZBarcode_Encode_File_and_Buffer_Vector(struct zint_symbol *symbol, char *filename, int rotate_angle) {
int error_number;
int first_err;
error_number = ZBarcode_Encode_File(symbol, filename);
if (error_number >= 5) {
return error_number;
}
first_err = error_number;
error_number = ZBarcode_Buffer_Vector(symbol, rotate_angle);
if (error_number == 0) {
error_number = first_err;
}
return error_number;
}
/*
* Rendering support, initially added by Sam Lown.
*

View File

@ -296,7 +296,7 @@ void vector_reduce_rectangles(struct zint_symbol *symbol) {
return;
}
int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_type) {
int error_number;
struct zint_vector *vector;
struct zint_vector_rect *rectangle, *rect, *last_rectangle = NULL;
@ -359,7 +359,7 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
addon_text_posn = 0.0;
rect_count = 0;
last_row_start = 0;
/*
* Determine if there will be any addon texts and text height
*/
@ -455,8 +455,8 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
}
}
vector->width = ceil(symbol->width + xoffset + xoffset);
vector->height = ceil(symbol->height + text_offset + yoffset + yoffset);
vector->width = ceil(symbol->width + (2.0 * xoffset));
vector->height = ceil(symbol->height + text_offset + (2.0 * yoffset));
large_bar_height = (symbol->height - preset_height) / large_bar_count;
@ -527,21 +527,21 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
// Plot Maxicode symbols
if (symbol->symbology == BARCODE_MAXICODE) {
vector->width = 37.0 + xoffset;
vector->height = 36.0 + yoffset;
vector->width = 37.0 + (2.0 * xoffset);
vector->height = 36.0 + (2.0 * yoffset);
// Bullseye
struct zint_vector_circle *circle = vector_plot_create_circle(17.88 + (xoffset / 2.0), 17.8 + (yoffset / 2.0), 10.85, 0);
struct zint_vector_circle *circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 10.85, 0);
vector_plot_add_circle(symbol, circle, &last_circle);
circle = vector_plot_create_circle(17.88 + (xoffset / 2.0), 17.8 + (yoffset / 2.0), 8.97, 1);
circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 8.97, 1);
vector_plot_add_circle(symbol, circle, &last_circle);
circle = vector_plot_create_circle(17.88 + (xoffset / 2.0), 17.8 + (yoffset / 2.0), 7.10, 0);
circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 7.10, 0);
vector_plot_add_circle(symbol, circle, &last_circle);
circle = vector_plot_create_circle(17.88 + (xoffset / 2.0), 17.8 + (yoffset / 2.0), 5.22, 1);
circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 5.22, 1);
vector_plot_add_circle(symbol, circle, &last_circle);
circle = vector_plot_create_circle(17.88 + (xoffset / 2.0), 17.8 + (yoffset / 2.0), 3.31, 0);
circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 3.31, 0);
vector_plot_add_circle(symbol, circle, &last_circle);
circle = vector_plot_create_circle(17.88 + (xoffset / 2.0), 17.8 + (yoffset / 2.0), 1.43, 1);
circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 1.43, 1);
vector_plot_add_circle(symbol, circle, &last_circle);
/* Hexagons */
@ -549,7 +549,8 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
for (i = 0; i < symbol->width; i++) {
if (module_is_set(symbol, r, i)) {
//struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 0.88) + ((r & 1) ? 1.76 : 1.32)), ((r * 0.76) + 0.76), symbol->dot_size);
struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 1.23) + 0.615 + ((r & 1) ? 0.615 : 0.0)), ((r * 1.067) + 0.715), symbol->dot_size);
struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 1.23) + 0.615 + ((r & 1) ? 0.615 : 0.0)) + xoffset,
((r * 1.067) + 0.715) + yoffset, symbol->dot_size);
vector_plot_add_hexagon(symbol, hexagon, &last_hexagon);
}
}
@ -561,7 +562,7 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
for (r = 0; r < symbol->rows; r++) {
for (i = 0; i < symbol->width; i++) {
if (module_is_set(symbol, r, i)) {
struct zint_vector_circle *circle = vector_plot_create_circle(i + 0.5 + (xoffset / 2.0), r + 0.5 + (yoffset / 2.0), 1.0, 0);
struct zint_vector_circle *circle = vector_plot_create_circle(i + 0.5 + xoffset, r + 0.5 + yoffset, 1.0, 0);
vector_plot_add_circle(symbol, circle, &last_circle);
}
}
@ -817,13 +818,15 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
}
}
if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
rectangle = vector_plot_create_rect(0.0, 0.0, symbol->width + xoffset + xoffset, symbol->border_width);
// Top
rectangle = vector_plot_create_rect(0.0, 0.0, vector->width, symbol->border_width);
if (symbol->symbology == BARCODE_CODABLOCKF) {
rectangle->x = xoffset;
rectangle->width -= (2.0 * xoffset);
}
vector_plot_add_rect(symbol, rectangle, &last_rectangle);
rectangle = vector_plot_create_rect(0.0, symbol->height + symbol->border_width, symbol->width + xoffset + xoffset, symbol->border_width);
// Bottom
rectangle = vector_plot_create_rect(0.0, vector->height - symbol->border_width, vector->width, symbol->border_width);
if (symbol->symbology == BARCODE_CODABLOCKF) {
rectangle->x = xoffset;
rectangle->width -= (2.0 * xoffset);
@ -831,10 +834,11 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
vector_plot_add_rect(symbol, rectangle, &last_rectangle);
}
if (symbol->output_options & BARCODE_BOX) {
/* side bars */
rectangle = vector_plot_create_rect(0.0, 0.0, symbol->border_width, (symbol->height + (2 * symbol->border_width)));
// Left
rectangle = vector_plot_create_rect(0.0, 0.0, symbol->border_width, vector->height);
vector_plot_add_rect(symbol, rectangle, &last_rectangle);
rectangle = vector_plot_create_rect(symbol->width + xoffset + xoffset - symbol->border_width, 0.0, symbol->border_width, (symbol->height + (2 * symbol->border_width)));
// Right
rectangle = vector_plot_create_rect(vector->width - symbol->border_width, 0.0, symbol->border_width, vector->height);
vector_plot_add_rect(symbol, rectangle, &last_rectangle);
}
@ -852,10 +856,9 @@ int vector_plot(struct zint_symbol *symbol, int rotate_angle, int file_type) {
case OUT_EMF_FILE:
error_number = emf_plot(symbol);
break;
/* case OUT_BUFFER: No more work needed */
}
vector_free(symbol);
return error_number;
}

View File

@ -311,8 +311,11 @@ extern "C" {
ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, const float width, const float height);
ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);
ZINT_EXTERN int ZBarcode_Buffer_Vector(struct zint_symbol *symbol, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_and_Buffer_Vector(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle);
ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer_Vector(struct zint_symbol *symbol, char *filename, int rotate_angle);
ZINT_EXTERN int ZBarcode_ValidID(int symbol_id);
ZINT_EXTERN int ZBarcode_Version();