mirror of
https://github.com/zint/zint
synced 2024-11-16 20:57:25 +13:00
Added width and height parameters to rendering for easier output control
This commit is contained in:
parent
2cea2399d9
commit
847cd70e32
@ -179,7 +179,7 @@ extern int grid_matrix(struct zint_symbol *symbol, unsigned char source[], int l
|
|||||||
extern int png_handle(struct zint_symbol *symbol, int rotate_angle);
|
extern int png_handle(struct zint_symbol *symbol, int rotate_angle);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int render_plot(struct zint_symbol *symbol, unsigned int hide_text);
|
extern int render_plot(struct zint_symbol *symbol, unsigned int hide_text, float width, float height);
|
||||||
|
|
||||||
extern int bmp_handle(struct zint_symbol *symbol, int rotate_angle);
|
extern int bmp_handle(struct zint_symbol *symbol, int rotate_angle);
|
||||||
extern int ps_plot(struct zint_symbol *symbol);
|
extern int ps_plot(struct zint_symbol *symbol);
|
||||||
@ -868,9 +868,13 @@ int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename,
|
|||||||
*
|
*
|
||||||
* Converts encoded data into an intermediate format to be interpreted
|
* Converts encoded data into an intermediate format to be interpreted
|
||||||
* in other applications using this library.
|
* in other applications using this library.
|
||||||
|
*
|
||||||
|
* If the width and height are not set to zero, the barcode will be resized to those
|
||||||
|
* dimensions. The symbol->scale and symbol->height values are totally ignored in this case.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
int ZBarcode_Render(struct zint_symbol *symbol, unsigned int hide_text)
|
int ZBarcode_Render(struct zint_symbol *symbol, unsigned int hide_text, float width, float height)
|
||||||
{
|
{
|
||||||
// Send the request to the render_plot method
|
// Send the request to the render_plot method
|
||||||
return render_plot(symbol, hide_text);
|
return render_plot(symbol, hide_text, width, height);
|
||||||
}
|
}
|
||||||
|
115
backend/render.c
115
backend/render.c
@ -36,7 +36,7 @@ int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *li
|
|||||||
|
|
||||||
int render_plot_add_string(struct zint_symbol *symbol, char *text, float x, float y, float fsize, float width, struct zint_render_string **last_string);
|
int render_plot_add_string(struct zint_symbol *symbol, char *text, float x, float y, float fsize, float width, struct zint_render_string **last_string);
|
||||||
|
|
||||||
int render_plot(struct zint_symbol *symbol, unsigned int hide_text)
|
int render_plot(struct zint_symbol *symbol, unsigned int hide_text, float width, float height)
|
||||||
{
|
{
|
||||||
struct zint_render *render;
|
struct zint_render *render;
|
||||||
struct zint_render_line *line, *last_line = NULL;
|
struct zint_render_line *line, *last_line = NULL;
|
||||||
@ -51,6 +51,7 @@ int render_plot(struct zint_symbol *symbol, unsigned int hide_text)
|
|||||||
float addon_text_posn;
|
float addon_text_posn;
|
||||||
float default_text_posn;
|
float default_text_posn;
|
||||||
float scaler = symbol->scale;
|
float scaler = symbol->scale;
|
||||||
|
float w, h;
|
||||||
const char *locale = NULL;
|
const char *locale = NULL;
|
||||||
|
|
||||||
// Allocate memory for the rendered version
|
// Allocate memory for the rendered version
|
||||||
@ -68,33 +69,39 @@ int render_plot(struct zint_symbol *symbol, unsigned int hide_text)
|
|||||||
comp_offset = 0;
|
comp_offset = 0;
|
||||||
addon_text_posn = 0.0;
|
addon_text_posn = 0.0;
|
||||||
|
|
||||||
if (symbol->height < 15) {
|
/*
|
||||||
symbol->height = 15;
|
* Determine if there will be any addon texts and text height
|
||||||
|
*/
|
||||||
|
latch = 0;
|
||||||
|
r = 0;
|
||||||
|
/* Isolate add-on text */
|
||||||
|
if(is_extendable(symbol->symbology)) {
|
||||||
|
for(i = 0; i < ustrlen(symbol->text); i++) {
|
||||||
|
if (latch == 1) {
|
||||||
|
addon[r] = symbol->text[i];
|
||||||
|
r++;
|
||||||
|
}
|
||||||
|
if (symbol->text[i] == '+') {
|
||||||
|
latch = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addon[r] = '\0';
|
||||||
|
if((symbol->show_hrt == 0) || (ustrlen(symbol->text) != 0)) {
|
||||||
|
hide_text = 0;
|
||||||
}
|
}
|
||||||
// symbol->height = 50;
|
|
||||||
|
|
||||||
if(!hide_text && ustrlen(symbol->text)) {
|
if(!hide_text && ustrlen(symbol->text)) {
|
||||||
textheight = 9.0;
|
textheight = 9.0;
|
||||||
textoffset = 2.0;
|
textoffset = 2.0;
|
||||||
} else {
|
} else {
|
||||||
textheight = textoffset = 0.0;
|
textheight = textoffset = 0.0;
|
||||||
}
|
}
|
||||||
// Update height for texts
|
|
||||||
symbol->height -= textheight + textoffset;
|
|
||||||
|
|
||||||
large_bar_count = 0;
|
|
||||||
preset_height = 0.0;
|
|
||||||
for(i = 0; i < symbol->rows; i++) {
|
|
||||||
preset_height += symbol->row_height[i];
|
|
||||||
if(symbol->row_height[i] == 0) {
|
|
||||||
large_bar_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
large_bar_height = (symbol->height - preset_height) / large_bar_count;
|
|
||||||
|
|
||||||
if (large_bar_count == 0) {
|
/*
|
||||||
symbol->height = preset_height;
|
* Calculate the width of the barcode, especially if there are any extra
|
||||||
}
|
* borders or white space to add.
|
||||||
|
*/
|
||||||
|
|
||||||
while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
|
while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
|
||||||
comp_offset++;
|
comp_offset++;
|
||||||
@ -131,44 +138,52 @@ int render_plot(struct zint_symbol *symbol, unsigned int hide_text)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
latch = 0;
|
xoffset = symbol->border_width + symbol->whitespace_width;
|
||||||
r = 0;
|
|
||||||
/* Isolate add-on text */
|
// Calculate the initial scale factor if width provided
|
||||||
if(is_extendable(symbol->symbology)) {
|
w = main_width + (xoffset * 2);
|
||||||
for(i = 0; i < ustrlen(symbol->text); i++) {
|
if (width) {
|
||||||
if (latch == 1) {
|
scaler = width / w;
|
||||||
addon[r] = symbol->text[i];
|
}
|
||||||
r++;
|
|
||||||
}
|
/*
|
||||||
if (symbol->text[i] == '+') {
|
* Calculate the height
|
||||||
latch = 1;
|
*/
|
||||||
}
|
if (height) {
|
||||||
|
symbol->height = height / scaler; // starting height
|
||||||
|
} else if (symbol->height == 0) {
|
||||||
|
symbol->height = 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update height for texts
|
||||||
|
symbol->height -= textheight + textoffset;
|
||||||
|
|
||||||
|
// Determine if height should be overridden
|
||||||
|
large_bar_count = 0;
|
||||||
|
preset_height = 0.0;
|
||||||
|
for(i = 0; i < symbol->rows; i++) {
|
||||||
|
preset_height += symbol->row_height[i];
|
||||||
|
if(symbol->row_height[i] == 0) {
|
||||||
|
large_bar_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addon[r] = '\0';
|
large_bar_height = (symbol->height - preset_height) / large_bar_count;
|
||||||
|
|
||||||
if((symbol->show_hrt == 0) || (ustrlen(symbol->text) != 0)) {
|
if (large_bar_count == 0) {
|
||||||
hide_text = 0;
|
symbol->height = preset_height;
|
||||||
}
|
}
|
||||||
if(hide_text) {
|
|
||||||
textoffset = 0;
|
|
||||||
} else {
|
|
||||||
textoffset = 3.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
xoffset = symbol->border_width + symbol->whitespace_width;
|
|
||||||
yoffset = symbol->border_width;
|
yoffset = symbol->border_width;
|
||||||
|
|
||||||
/*
|
// Calculate the scale factor from the height, incase it needs to be lowered for width
|
||||||
* If main_width is bigger than symbol->width we need to recalculate the
|
h = (symbol->height + textheight + textoffset + (yoffset * 2));
|
||||||
* scaler so the barcode fits in the same area!
|
if ((h * scaler) > height) {
|
||||||
*/
|
scaler = height / h;
|
||||||
if (main_width != symbol->width) {
|
}
|
||||||
scaler = scaler / ((symbol->width + (xoffset * 2.0)) / symbol->width);
|
|
||||||
}
|
// Set initial render dimensions
|
||||||
|
render->width = w * scaler;
|
||||||
|
render->height = h * scaler;
|
||||||
|
|
||||||
render->width = (symbol->width + (xoffset * 2)) * scaler;
|
|
||||||
render->height = (symbol->height + textheight + textoffset + yoffset + yoffset) * scaler;
|
|
||||||
|
|
||||||
if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
|
if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
|
||||||
default_text_posn = (symbol->height + textoffset + symbol->border_width + symbol->border_width) * scaler;
|
default_text_posn = (symbol->height + textoffset + symbol->border_width + symbol->border_width) * scaler;
|
||||||
|
@ -209,7 +209,7 @@ ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);
|
|||||||
ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
|
ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
|
||||||
ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle);
|
ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle);
|
||||||
|
|
||||||
ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, unsigned int hide_text);
|
ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, unsigned int hide_text, float width, float height);
|
||||||
|
|
||||||
ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);
|
ZINT_EXTERN int ZBarcode_Buffer(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(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
|
||||||
|
Loading…
Reference in New Issue
Block a user