Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/zint/backend_qt/qzint.h @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/thirdparty/zint/backend_qt/qzint.h Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,425 @@ +/*************************************************************************** + * Copyright (C) 2008 by BogDan Vatra * + * bogdan@licentia.eu * + * Copyright (C) 2010-2023 Robin Stuart * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + ***************************************************************************/ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + +/* + * For version, see "../backend/zintconfig.h" + * For documentation, see "../docs/manual.txt" + */ + +#ifndef QZINT_H +#define QZINT_H + +#include <QObject> +#include <QColor> +#include <QPainter> +#include "zint.h" + +namespace Zint +{ + +/* QString version of `struct zint_seg` */ +class QZintSeg { +public: + QString m_text; // `seg->source` and `seg->length` + int m_eci; // `seg->eci` + + QZintSeg(); + QZintSeg(const QString& text, const int ECIIndex = 0); // `ECIIndex` is comboBox index (not ECI value) +}; + +struct QZintXdimDpVars; // Forward reference to Printing Scale settings, see end + +/* Interface */ +class QZint : public QObject +{ + Q_OBJECT + +public: + /* Legacy - not used */ + enum AspectRatioMode{ IgnoreAspectRatio = 0, KeepAspectRatio = 1, CenterBarCode = 2 }; + +public: + QZint(); + ~QZint(); + + /* Symbology to use (see BARCODE_XXX) */ + int symbol() const; // `symbol->symbology` + void setSymbol(int symbol); + + /* Input data encoding. Default UNICODE_MODE */ + int inputMode() const; // `symbol->input_mode` + void setInputMode(int input_mode); + + /* Note text/eci and segs are mutally exclusive */ + + /* Input data (segment 0 text) */ + QString text() const; + /* Set input data. Note: clears segs */ + void setText(const QString& text); + + /* Input segments. */ + std::vector<QZintSeg> segs() const; + /* Set segments. Note: clears text and sets eci */ + void setSegs(const std::vector<QZintSeg>& segs); + + /* Primary message (Maxicode, Composite) */ + QString primaryMessage() const; // `symbol->primary` + void setPrimaryMessage(const QString& primaryMessage); + + /* Symbol height in X-dimensions */ + float height() const; // `symbol->height` + void setHeight(float height); + + /* Symbol-specific options (see "../docs/manual.txt") */ + int option1() const; // `symbol->option_1` + void setOption1(int option_1); + + /* Symbol-specific options */ + int option2() const; // `symbol->option_2` + void setOption2(int option); + + /* Symbol-specific options */ + int option3() const; // `symbol->option_3` + void setOption3(int option); + + /* Scale factor when printing barcode, i.e. adjusts X-dimension */ + float scale() const; // `symbol->scale` + void setScale(float scale); + + /* Resolution of output in dots per mm (BMP/EMF/PCX/PNG/TIF only) */ + float dpmm() const; // `symbol->dpmm` + void setDPMM(float dpmm); + + /* Dotty mode */ + bool dotty() const; // `symbol->input_mode | BARCODE_DOTTY_MODE` + void setDotty(bool botty); + + /* Size of dots used in BARCODE_DOTTY_MODE */ + float dotSize() const; // `symbol->dot_size` + void setDotSize(float dot_size); + + /* Height in X-dimensions that EAN/UPC guard bars descend */ + float guardDescent() const; // `symbol->guard_descent` + void setGuardDescent(float guardDescent); + + /* Structured Append info */ + int structAppCount() const; // `symbol->structapp.count` + int structAppIndex() const; // `symbol->structapp.index` + QString structAppID() const; // `symbol->structapp.id` + void setStructApp(const int count, const int index, const QString& id); + void clearStructApp(); + + /* Foreground colour (may be RGB(A) hex string or CMYK decimal "C,M,Y,K" percentage string) */ + QString fgStr() const; // `symbol->fgcolour` + bool setFgStr(const QString& fgStr); // Returns false if not valid colour string + + /* Foreground colour as QColor */ + QColor fgColor() const; // `symbol->fgcolour` + void setFgColor(const QColor& fgColor); + + /* Background colour (may be RGB(A) hex string or CMYK decimal "C,M,Y,K" percentage string) */ + QString bgStr() const; // `symbol->bgcolour` + bool setBgStr(const QString& bgStr); // Returns false if not valid colour string + + /* Background colour as QColor */ + QColor bgColor() const; // `symbol->bgcolour` + void setBgColor(const QColor& bgColor); + + /* Use CMYK colour space (Encapsulated PostScript and TIF) */ + bool cmyk() const; // `symbol->output_options | CMYK_COLOUR` + void setCMYK(bool cmyk); + + /* Type of border above/below/around barcode */ + int borderType() const; // `symbol->output_options | BARCODE_BIND | BARCODE_BOX | BARCODE_BIND_TOP` + void setBorderType(int borderTypeIndex); + + /* Size of border in X-dimensions */ + int borderWidth() const; // `symbol->border_width` + void setBorderWidth(int borderWidth); + + /* Width in X-dimensions of whitespace to left & right of barcode */ + int whitespace() const; // `symbol->whitespace_width` + void setWhitespace(int whitespace); + + /* Height in X-dimensions of whitespace above & below the barcode */ + int vWhitespace() const; // `symbol->whitespace_height` + void setVWhitespace(int vWhitespace); + + /* Type of font to use i.e. normal, small, bold or (vector only) small bold */ + int fontSetting() const; // `symbol->output_options | SMALL_TEXT | BOLD_TEXT` + void setFontSetting(int fontSettingIndex); // Sets from comboBox index + void setFontSettingValue(int fontSetting); // Sets literal value + + /* Text gap */ + float textGap() const; // `symbol->text_gap` + void setTextGap(float textGap); + + /* Show (true) or hide (false) Human Readable Text (HRT) */ + bool showText() const; // `symbol->show_hrt` + void setShowText(bool showText); + + /* Set to true to use GS (Group Separator) instead of FNC1 as GS1 separator (Data Matrix) */ + bool gsSep() const; // `symbol->output_options | GS1_GS_SEPARATOR` + void setGSSep(bool gsSep); + + /* Add compliant quiet zones (additional to any specified whitespace) + Note: CODE16K, CODE49, CODABLOCKF, ITF14, EAN/UPC have default quiet zones */ + bool quietZones() const; // `symbol->output_options | BARCODE_QUIET_ZONES` + void setQuietZones(bool quietZones); + + /* Disable quiet zones, notably those with defaults as listed above */ + bool noQuietZones() const; // `symbol->output_options | BARCODE_NO_QUIET_ZONES` + void setNoQuietZones(bool noQuietZones); + + /* Warn if height not compliant and use standard height (if any) as default */ + bool compliantHeight() const; // `symbol->output_options | COMPLIANT_HEIGHT` + void setCompliantHeight(bool compliantHeight); + + /* Rotate barcode by angle (degrees 0, 90, 180 and 270) */ + int rotateAngle() const; + void setRotateAngle(int rotateIndex); // Sets from comboBox index + void setRotateAngleValue(int rotateAngle); // Sets literal value + + /* Extended Channel Interpretation (segment 0 eci) */ + int eci() const; // `symbol->eci` + void setECI(int ECIIndex); // Sets from comboBox index + void setECIValue(int eci); // Sets literal value + + /* Process parentheses as GS1 AI delimiters (instead of square brackets) */ + bool gs1Parens() const; // `symbol->input_mode | GS1PARENS_MODE` + void setGS1Parens(bool gs1Parens); + + /* Do not check validity of GS1 data (except that printable ASCII only) */ + bool gs1NoCheck() const; // `symbol->input_mode | GS1NOCHECK_MODE` + void setGS1NoCheck(bool gs1NoCheck); + + /* Reader Initialisation (Programming) */ + bool readerInit() const; // `symbol->output_options | READER_INIT` + void setReaderInit(bool readerInit); + + /* Whether to add quiet zone indicators ("<", ">") to HRT (EAN/UPC) */ + bool guardWhitespace() const; // `symbol->output_options | EANUPC_GUARD_WHITESPACE` + void setGuardWhitespace(bool guardWhitespace); + + /* Whether to embed the font in vector output - currently only for SVG output of EAN/UPC */ + bool embedVectorFont() const; // `symbol->output_options | EANUPC_GUARD_WHITESPACE` + void setEmbedVectorFont(bool embedVectorFont); + + /* Affects error/warning value returned by Zint API (see `getError()` below) */ + int warnLevel() const; // `symbol->warn_level` + void setWarnLevel(int warnLevel); + + /* Debugging flags */ + bool debug() const; // `symbol->debug` + void setDebug(bool debug); + + + /* Symbol output info set by Zint on successful `render()` */ + int encodedWidth() const; // Read-only, encoded width (no. of modules encoded) + int encodedRows() const; // Read-only, no. of rows encoded + float encodedHeight() const; // Read-only, in X-dimensions + float vectorWidth() const; // Read-only, scaled width + float vectorHeight() const; // Read-only, scaled height + + + /* Legacy property getters/setters */ + void setWidth(int width); /* `symbol->option_2` */ + int width() const; + void setSecurityLevel(int securityLevel); /* `symbol->option_1` */ + int securityLevel() const; + void setPdf417CodeWords(int pdf417CodeWords); /* No-op */ + int pdf417CodeWords() const; + void setHideText(bool hide); /* `setShowText(!hide)` */ + void setTargetSize(int width, int height); /* No-op */ + QString error_message() const; /* Same as `lastError()` */ + + + /* Test capabilities - `ZBarcode_Cap()` */ + bool hasHRT(int symbology = 0) const; + bool isStackable(int symbology = 0) const; + bool isEANUPC(int symbology = 0) const; + bool isExtendable(int symbology = 0) const; /* Legacy - same as `isEANUPC()` */ + bool isComposite(int symbology = 0) const; + bool supportsECI(int symbology = 0) const; + bool supportsGS1(int symbology = 0) const; + bool isDotty(int symbology = 0) const; + bool hasDefaultQuietZones(int symbology = 0) const; + bool isFixedRatio(int symbology = 0) const; + bool supportsReaderInit(int symbology = 0) const; + bool supportsFullMultibyte(int symbology = 0) const; + bool hasMask(int symbology = 0) const; + bool supportsStructApp(int symbology = 0) const; + bool hasCompliantHeight(int symbology = 0) const; + + /* Whether takes GS1 AI-delimited data */ + bool takesGS1AIData(int symbology = 0) const; + + + /* Error or warning returned by Zint on `render()` or `save_to_file()` */ + int getError() const; + + /* Error message returned by Zint on `render()` or `save_to_file()` */ + const QString& lastError() const; // `symbol->errtxt` + + /* Whether `lastError()` set */ + bool hasErrors() const; // `symbol->errtxt` + + + /* Encode and print barcode to file `filename`. Only sets `getError()` on error, not on warning */ + bool save_to_file(const QString& filename); // `ZBarcode_Print()` + + /* Encode and display barcode in `paintRect` using `painter`. + Note: legacy argument `mode` is not used */ + void render(QPainter& painter, const QRectF& paintRect, AspectRatioMode mode = IgnoreAspectRatio); + + + /* Returns the default X-dimension (`ZBarcode_Default_Xdim()`). + If `symbology` non-zero then used instead of `symbol()` */ + float defaultXdim(int symbology = 0) const; + + /* Returns the scale to use for X-dimension `x_dim_mm` at `dpmm` for `filetype`. + If `symbology` non-zero then used instead of `symbol()` */ + float getScaleFromXdimDp(float x_dim_mm, float dpmm, const QString& fileType, int symbology = 0) const; + // `ZBarcode_Scale_Xdim()` + + /* Reverse of `getScaleFromXdimDp()` above, returning the X-dimension or dot density given the scale `scale`. + If `symbology` non-zero then used instead of `symbol()` */ + float getXdimDpFromScale(float scale, float x_dim_mm_or_dpmm, const QString& fileType, int symbology = 0) const; + // `ZBarcode_XdimDp_From_Scale()` + + /* Set `width_x_dim` and `height_x_dim` with estimated size of barcode based on X-dimension `x_dim`. To be called + after a successful `render()`. Returns false if `scale()` zero or render is in error, otherwise true */ + bool getWidthHeightXdim(float x_dim, float &width_x_dim, float &height_x_dim) const; + + + /* Return the BARCODE_XXX name of `symbology` */ + static QString barcodeName(const int symbology); // `ZBarcode_BarcodeName()` + + /* Whether Zint library "libzint" built with PNG support or not */ + static bool noPng(); // `ZBarcode_NoPng()` + + /* Version of Zint library "libzint" linked to */ + static int getVersion(); // `ZBarcode_Version()` + + + /* Translate settings into Command Line equivalent. Set `win` to use Windows escaping of data. + If `autoHeight` set then `--height=` option will not be emitted. + If HEIGHTPERROW_MODE set and non-zero `heightPerRow` given then use that for height instead of internal + height */ + QString getAsCLI(const bool win, const bool longOptOnly = false, const bool barcodeNames = false, + const bool noEXE = false, const bool autoHeight = false, const float heightPerRow = 0.0f, + const QString& outfile = "", const QZintXdimDpVars *xdimdpVars = nullptr) const; + +signals: + void encoded(); // Emitted on successful `render()` + void errored(); // Emitted if an error (not warning) occurred on `render()` + +private: + bool resetSymbol(); // Reset the symbol structure for encoding using member fields + void encode(); // `ZBarcode_Encode_and_Buffer_Vector()` or `ZBarcode_Encode_Segs_and_Buffer_Vector()` + + /* Helper to convert `m_segs` to `struct zint_seg[]` */ + int convertSegs(struct zint_seg segs[], std::vector<QByteArray>& bstrs); + + /* Convert `zint_vector_rect->colour` to Qt color */ + static Qt::GlobalColor colourToQtColor(int colour); + + /* `getAsCLI()` helpers */ + static void arg_str(QString& cmd, const char *const opt, const QString& val); + static void arg_int(QString& cmd, const char *const opt, const int val, const bool allowZero = false); + static void arg_bool(QString& cmd, const char *const opt, const bool val); + static void arg_data(QString& cmd, const char *const opt, const QString& val, const bool win); + static void arg_seg(QString& cmd, const int seg_no, const QZintSeg& val, const bool win); + static void arg_data_esc(QString& cmd, const char *const opt, QString& text, const bool win); + static void arg_float(QString& cmd, const char *const opt, const float val, const bool allowZero = false); + static void arg_structapp(QString& cmd, const char *const opt, const int count, const int index, + const QString& id, const bool win); + static void arg_scalexdimdp(QString& cmd, const char *const opt, const float scale, const float dpmm, + const int symbol, const QZintXdimDpVars *xdimdpVars); + +private: + zint_symbol *m_zintSymbol; + int m_symbol; + int m_input_mode; + QString m_text; + QString m_primaryMessage; + std::vector<QZintSeg> m_segs; + float m_height; + int m_option_1; + int m_option_2; + int m_option_3; + float m_dpmm; + float m_scale; + bool m_dotty; + float m_dot_size; + float m_guardDescent; + float m_textGap; + struct zint_structapp m_structapp; + QString m_fgStr; + QString m_bgStr; + bool m_cmyk; + int m_borderType; + int m_borderWidth; + int m_whitespace; + int m_vwhitespace; + int m_fontSetting; + bool m_show_hrt; + bool m_gssep; + bool m_quiet_zones; + bool m_no_quiet_zones; + bool m_compliant_height; + int m_rotate_angle; + int m_eci; + bool m_gs1parens; + bool m_gs1nocheck; + bool m_reader_init; + bool m_guard_whitespace; + bool m_embed_vector_font; + int m_warn_level; + bool m_debug; + int m_encodedWidth; + int m_encodedRows; + float m_encodedHeight; + float m_vectorWidth; + float m_vectorHeight; + QString m_lastError; + int m_error; + + int target_size_horiz; /* Legacy */ + int target_size_vert; /* Legacy */ +}; + +/* Printing Scale settings */ +struct QZintXdimDpVars { + double x_dim = 0.0; // X-dimension in `x_dim_units` + int x_dim_units = 0; // 0 for mm, 1 for inches + int resolution = 0; // Dot density in `resolution_units` + int resolution_units = 0; // 0 for dpmm, 1 for dpi + int filetype = 0; // For non-MaxiCode, 0 for GIF (raster), 1 for SVG (vector) + int filetype_maxicode = 0; // For MaxiCode only, 0 for GIF (raster), 1 for SVG (vector), 2 for EMF + int set = 0; // 1 if explicitly set, 0 if just defaults (in which case the struct isn't applicable to `dpmm()`) + + /* Helper to return "GIF"/"SVG"(/"EMF") if `msg` false, "raster"/"vector"(/"EMF") otherwise + (EMF only if `symbol` is MaxiCode) */ + static const char *getFileType(int symbol, const struct QZintXdimDpVars *vars, bool msg = false); +}; + +} /* namespace Zint */ + +/* vim: set ts=4 sw=4 et : */ +#endif /* QZINT_H */
