Set font only once in EMF

Correct fault which led to wrong bytecount - multiple declarations of font not needed
Also included HeaderExtension1 and HeaderExtension2 objects for better compatability with GDI
As suggested by Alex Roy in #185
This commit is contained in:
Robin Stuart 2020-04-19 18:46:14 +01:00
parent bd654647c0
commit 99cd6a3391
2 changed files with 19 additions and 3 deletions

View File

@ -260,7 +260,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol) {
/* Header */ /* Header */
emr_header.type = 0x00000001; // EMR_HEADER emr_header.type = 0x00000001; // EMR_HEADER
emr_header.size = 88; // Assuming no additional data in header emr_header.size = 108; // Including extensions
emr_header.emf_header.bounds.left = 0; emr_header.emf_header.bounds.left = 0;
emr_header.emf_header.bounds.right = ceil(symbol->vector->width); emr_header.emf_header.bounds.right = ceil(symbol->vector->width);
emr_header.emf_header.bounds.bottom = ceil(symbol->vector->height); emr_header.emf_header.bounds.bottom = ceil(symbol->vector->height);
@ -280,7 +280,14 @@ INTERNAL int emf_plot(struct zint_symbol *symbol) {
emr_header.emf_header.device.cy = 1000; emr_header.emf_header.device.cy = 1000;
emr_header.emf_header.millimeters.cx = 300; emr_header.emf_header.millimeters.cx = 300;
emr_header.emf_header.millimeters.cy = 300; emr_header.emf_header.millimeters.cy = 300;
bytecount = 88; /* HeaderExtension1 */
emr_header.emf_header.cb_pixel_format = 0x0000; // None set
emr_header.emf_header.off_pixel_format = 0x0000; // None set
emr_header.emf_header.b_open_gl = 0x0000; // OpenGL not present
/* HeaderExtension2 */
emr_header.emf_header.micrometers.cx = 0;
emr_header.emf_header.micrometers.cy = 0;
bytecount = 108;
recordcount = 1; recordcount = 1;
/* Create Brushes */ /* Create Brushes */
@ -624,9 +631,12 @@ INTERNAL int emf_plot(struct zint_symbol *symbol) {
} }
// Text // Text
if (string_count > 0) {
fwrite(&emr_selectobject_font, sizeof (emr_selectobject_t), 1, emf_file);
}
for (i = 0; i < string_count; i++) { for (i = 0; i < string_count; i++) {
spacing = 8 * symbol->scale; spacing = 8 * symbol->scale;
fwrite(&emr_selectobject_font, sizeof (emr_selectobject_t), 1, emf_file);
fwrite(&text[i], sizeof (emr_exttextoutw_t), 1, emf_file); fwrite(&text[i], sizeof (emr_exttextoutw_t), 1, emf_file);
fwrite(this_string[i], bump_up(text[i].w_emr_text.chars + 1) * 2, 1, emf_file); fwrite(this_string[i], bump_up(text[i].w_emr_text.chars + 1) * 2, 1, emf_file);
free(this_string[i]); free(this_string[i]);

View File

@ -121,6 +121,12 @@ extern "C" {
uint32_t n_pal_entries; uint32_t n_pal_entries;
size_l_t device; size_l_t device;
size_l_t millimeters; size_l_t millimeters;
// HeaderExtension1 Object
uint32_t cb_pixel_format;
uint32_t off_pixel_format;
uint32_t b_open_gl;
// HeaderExtension2 Object
size_l_t micrometers;
} emf_header_t; } emf_header_t;
typedef struct emr_header { typedef struct emr_header {