zint-barcode-generator/backend/emf.h

250 lines
6.7 KiB
C
Raw Normal View History

/* emf.h - header structure for Microsoft EMF */
/*
libzint - the open source barcode library
Copyright (C) 2016-2024 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
2017-10-23 15:37:52 -04:00
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
2017-10-23 15:37:52 -04:00
documentation and/or other materials provided with the distribution.
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 15:37:52 -04:00
without specific prior written permission.
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 15:37:52 -04:00
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
*/
/* SPDX-License-Identifier: BSD-3-Clause */
#ifndef Z_EMF_H
#define Z_EMF_H
Performance improvements for linear encoding and raster output - use fixed-length string tables (mostly) instead of (char *) pointer ones (saves ~40K) - re-use C128Table for CODABLOCKF and CODE16K (required removal of Stop character and extra CODE16K-only entry) - use pointer to destination and copy (memcpy/strcpy(), bin_append_posn()) instead of concatenating (strcat()) (mostly) - replace last remaining bin_append()s with bin_append_posn(); bin_append() removed - add length arg to toupper() and expand() (avoids strlen()) - change is_sane() to use table-based flags (avoids an iteration) - rename lookup() to is_sane_lookup() and change to check and return posns and use in pointer to destination loops (avoids strcat()s) - remove special case PHARMA in expand() (dealt with in pharma()) - make #define SILVER/CALCIUM/TECHNETIUM/KRSET etc static strings - replace strchr() -> posn() - CODE128: populate destination once in checksum loop; re-use and export some more routines (c128_set_a/b/c(), c128_put_in_set()) for sharing; prefix defines (SHIFTA -> C128_SHIFTA etc) and existing exported routines - use factor XOR toggle trick in checksum calcs (avoids branch) - raster.c: fill out single 1-pixel row and copy using new draw_bar_line(), copy_bar_line() routines; similarly in buffer_plot compare previous line & copy if same (same technique as used to improve non-half-integer scaling, significant performance increase, (c) codemonkey82); also done for PNG (BMP/GIF/PCX/TIFF not done) - raster/vector/output.c: shorten "output_" prefix -> "out_"; sync vector to other raster changes to try to keep source files similar - 2of5.c: prefix "c25_" JAPANPOST: return error if input data truncated (backward incompatible) DAFT: max chars 50 -> 100 common.c: istwodigit() -> is_twodigit() common.c/emf.c/output.c: use some further stripf()s (MSVC6 float variations) library.c: new check_output_args() helper zint.h: add BARCODE_LAST marker and use in library.c QRCODE: remove a NOLINT (requires clang-tidy-13), one remaining CMake: separate no-optimize from ZINT_DEBUG into new ZINT_NOOPT option
2021-10-20 18:05:30 -04:00
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef OUT_USE_PRAGMA_PACK
#pragma pack(1)
#endif
2017-10-23 15:37:52 -04:00
typedef struct rect_l {
int32_t left;
int32_t top;
int32_t right;
int32_t bottom;
} OUT_PACK rect_l_t;
2017-10-23 15:37:52 -04:00
typedef struct size_l {
uint32_t cx;
uint32_t cy;
} OUT_PACK size_l_t;
2017-10-23 15:37:52 -04:00
typedef struct point_l {
int32_t x;
int32_t y;
} OUT_PACK point_l_t;
2017-10-23 15:37:52 -04:00
typedef struct color_ref {
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t reserved;
} OUT_PACK color_ref_t;
2017-10-23 15:37:52 -04:00
typedef struct log_brush_ex {
uint32_t brush_style;
color_ref_t color;
uint32_t brush_hatch;
} OUT_PACK log_brush_ex_t;
2017-10-23 15:37:52 -04:00
typedef struct log_pen {
uint32_t pen_style;
point_l_t width;
color_ref_t color_ref;
} OUT_PACK log_pen_t;
2017-10-23 15:37:52 -04:00
typedef struct log_font {
int32_t height;
int32_t width;
int32_t escapement;
int32_t orientation;
int32_t weight;
uint8_t italic;
uint8_t underline;
uint8_t strike_out;
uint8_t char_set;
uint8_t out_precision;
uint8_t clip_precision;
uint8_t quality;
uint8_t pitch_and_family;
unsigned char facename[64];
} OUT_PACK log_font_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_text {
point_l_t reference;
uint32_t chars;
uint32_t off_string;
uint32_t options;
rect_l_t rectangle;
uint32_t off_dx;
} OUT_PACK emr_text_t;
2017-10-23 15:37:52 -04:00
typedef struct emf_header {
rect_l_t bounds;
rect_l_t frame;
uint32_t record_signature;
uint32_t version;
uint32_t bytes;
uint32_t records;
uint16_t handles;
uint16_t reserved;
uint32_t n_description;
uint32_t off_description;
uint32_t n_pal_entries;
size_l_t device;
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;
} OUT_PACK emf_header_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_header {
uint32_t type;
uint32_t size;
emf_header_t emf_header;
} OUT_PACK emr_header_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_mapmode {
uint32_t type;
uint32_t size;
uint32_t mapmode;
} OUT_PACK emr_mapmode_t;
typedef struct emr_setworldtransform {
uint32_t type;
uint32_t size;
float m11;
float m12;
float m21;
float m22;
float dx;
float dy;
} OUT_PACK emr_setworldtransform_t;
typedef struct emr_createbrushindirect {
uint32_t type;
uint32_t size;
uint32_t ih_brush;
log_brush_ex_t log_brush;
} OUT_PACK emr_createbrushindirect_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_createpen {
uint32_t type;
uint32_t size;
uint32_t ih_pen;
log_pen_t log_pen;
} OUT_PACK emr_createpen_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_selectobject {
uint32_t type;
uint32_t size;
uint32_t ih_object;
} OUT_PACK emr_selectobject_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_rectangle {
uint32_t type;
uint32_t size;
rect_l_t box;
} OUT_PACK emr_rectangle_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_ellipse {
uint32_t type;
uint32_t size;
rect_l_t box;
} OUT_PACK emr_ellipse_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_polygon {
uint32_t type;
uint32_t size;
rect_l_t bounds;
uint32_t count;
point_l_t a_points_a;
point_l_t a_points_b;
point_l_t a_points_c;
point_l_t a_points_d;
point_l_t a_points_e;
point_l_t a_points_f;
} OUT_PACK emr_polygon_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_extcreatefontindirectw {
uint32_t type;
uint32_t size;
uint32_t ih_fonts;
log_font_t elw;
} OUT_PACK emr_extcreatefontindirectw_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_settextalign {
uint32_t type;
uint32_t size;
uint32_t text_alignment_mode;
} OUT_PACK emr_settextalign_t;
typedef struct emr_settextcolor {
uint32_t type;
uint32_t size;
color_ref_t color;
} OUT_PACK emr_settextcolor_t;
typedef struct emr_exttextoutw {
uint32_t type;
uint32_t size;
rect_l_t bounds;
uint32_t i_graphics_mode;
float ex_scale;
float ey_scale;
emr_text_t w_emr_text;
} OUT_PACK emr_exttextoutw_t;
2017-10-23 15:37:52 -04:00
typedef struct emr_eof {
uint32_t type;
uint32_t size;
uint32_t n_pal_entries;
uint32_t off_pal_entries;
uint32_t size_last;
} OUT_PACK emr_eof_t;
2017-10-23 15:37:52 -04:00
typedef struct box {
emr_rectangle_t top;
emr_rectangle_t bottom;
emr_rectangle_t left;
emr_rectangle_t right;
} OUT_PACK box_t;
2017-10-23 15:37:52 -04:00
#ifdef OUT_USE_PRAGMA_PACK
#pragma pack()
#endif
Performance improvements for linear encoding and raster output - use fixed-length string tables (mostly) instead of (char *) pointer ones (saves ~40K) - re-use C128Table for CODABLOCKF and CODE16K (required removal of Stop character and extra CODE16K-only entry) - use pointer to destination and copy (memcpy/strcpy(), bin_append_posn()) instead of concatenating (strcat()) (mostly) - replace last remaining bin_append()s with bin_append_posn(); bin_append() removed - add length arg to toupper() and expand() (avoids strlen()) - change is_sane() to use table-based flags (avoids an iteration) - rename lookup() to is_sane_lookup() and change to check and return posns and use in pointer to destination loops (avoids strcat()s) - remove special case PHARMA in expand() (dealt with in pharma()) - make #define SILVER/CALCIUM/TECHNETIUM/KRSET etc static strings - replace strchr() -> posn() - CODE128: populate destination once in checksum loop; re-use and export some more routines (c128_set_a/b/c(), c128_put_in_set()) for sharing; prefix defines (SHIFTA -> C128_SHIFTA etc) and existing exported routines - use factor XOR toggle trick in checksum calcs (avoids branch) - raster.c: fill out single 1-pixel row and copy using new draw_bar_line(), copy_bar_line() routines; similarly in buffer_plot compare previous line & copy if same (same technique as used to improve non-half-integer scaling, significant performance increase, (c) codemonkey82); also done for PNG (BMP/GIF/PCX/TIFF not done) - raster/vector/output.c: shorten "output_" prefix -> "out_"; sync vector to other raster changes to try to keep source files similar - 2of5.c: prefix "c25_" JAPANPOST: return error if input data truncated (backward incompatible) DAFT: max chars 50 -> 100 common.c: istwodigit() -> is_twodigit() common.c/emf.c/output.c: use some further stripf()s (MSVC6 float variations) library.c: new check_output_args() helper zint.h: add BARCODE_LAST marker and use in library.c QRCODE: remove a NOLINT (requires clang-tidy-13), one remaining CMake: separate no-optimize from ZINT_DEBUG into new ZINT_NOOPT option
2021-10-20 18:05:30 -04:00
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* vim: set ts=4 sw=4 et : */
#endif /* Z_EMF_H */