Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/zxing-cpp/core/src/Barcode.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/zxing-cpp/core/src/Barcode.h Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,215 @@ +/* +* Copyright 2016 Nu-book Inc. +* Copyright 2016 ZXing authors +* Copyright 2020 Axel Waggershauser +*/ +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "BarcodeFormat.h" +#include "ByteArray.h" +#include "Content.h" +#include "ReaderOptions.h" +#include "Error.h" +#include "ImageView.h" +#include "Quadrilateral.h" +#include "StructuredAppend.h" + +#ifdef ZXING_EXPERIMENTAL_API +#include <memory> +namespace ZXing { +class BitMatrix; +} + +extern "C" struct zint_symbol; +struct zint_symbol_deleter +{ + void operator()(zint_symbol* p) const noexcept; +}; +using unique_zint_symbol = std::unique_ptr<zint_symbol, zint_symbol_deleter>; +#endif + +#include <string> +#include <vector> + +namespace ZXing { + +class DecoderResult; +class DetectorResult; +class WriterOptions; +class Result; // TODO: 3.0 replace deprected symbol name + +using Position = QuadrilateralI; +using Barcode = Result; +using Barcodes = std::vector<Barcode>; +using Results = std::vector<Result>; + +/** + * @brief The Barcode class encapsulates the result of decoding a barcode within an image. + */ +class Result +{ + void setIsInverted(bool v) { _isInverted = v; } + Result& setReaderOptions(const ReaderOptions& opts); + + friend Barcode MergeStructuredAppendSequence(const Barcodes&); + friend Barcodes ReadBarcodes(const ImageView&, const ReaderOptions&); + friend Image WriteBarcodeToImage(const Barcode&, const WriterOptions&); + friend void IncrementLineCount(Barcode&); + +public: + Result() = default; + + // linear symbology convenience constructor + Result(const std::string& text, int y, int xStart, int xStop, BarcodeFormat format, SymbologyIdentifier si, Error error = {}, + bool readerInit = false); + + Result(DecoderResult&& decodeResult, DetectorResult&& detectorResult, BarcodeFormat format); + + [[deprecated]] Result(DecoderResult&& decodeResult, Position&& position, BarcodeFormat format); + + bool isValid() const; + + const Error& error() const { return _error; } + + BarcodeFormat format() const { return _format; } + + /** + * @brief bytes is the raw / standard content without any modifications like character set conversions + */ + const ByteArray& bytes() const; + + /** + * @brief bytesECI is the raw / standard content following the ECI protocol + */ + ByteArray bytesECI() const; + + /** + * @brief text returns the bytes() content rendered to unicode/utf8 text accoring to specified TextMode + */ + std::string text(TextMode mode) const; + + /** + * @brief text returns the bytes() content rendered to unicode/utf8 text accoring to the TextMode set in the ReaderOptions + */ + std::string text() const; + + /** + * @brief ecLevel returns the error correction level of the symbol (empty string if not applicable) + */ + std::string ecLevel() const; + + /** + * @brief contentType gives a hint to the type of content found (Text/Binary/GS1/etc.) + */ + ContentType contentType() const; + + /** + * @brief hasECI specifies wheter or not an ECI tag was found + */ + bool hasECI() const; + + const Position& position() const { return _position; } + void setPosition(Position pos) { _position = pos; } + + /** + * @brief orientation of barcode in degree, see also Position::orientation() + */ + int orientation() const; + + /** + * @brief isMirrored is the symbol mirrored (currently only supported by QRCode and DataMatrix) + */ + bool isMirrored() const { return _isMirrored; } + + /** + * @brief isInverted is the symbol inverted / has reveresed reflectance (see ReaderOptions::tryInvert) + */ + bool isInverted() const { return _isInverted; } + + /** + * @brief symbologyIdentifier Symbology identifier "]cm" where "c" is symbology code character, "m" the modifier. + */ + std::string symbologyIdentifier() const; + + /** + * @brief sequenceSize number of symbols in a structured append sequence. + * + * If this is not part of a structured append sequence, the returned value is -1. + * If it is a structured append symbol but the total number of symbols is unknown, the + * returned value is 0 (see PDF417 if optional "Segment Count" not given). + */ + int sequenceSize() const; + + /** + * @brief sequenceIndex the 0-based index of this symbol in a structured append sequence. + */ + int sequenceIndex() const; + + /** + * @brief sequenceId id to check if a set of symbols belongs to the same structured append sequence. + * + * If the symbology does not support this feature, the returned value is empty (see MaxiCode). + * For QR Code, this is the parity integer converted to a string. + * For PDF417 and DataMatrix, this is the "fileId". + */ + std::string sequenceId() const; + + bool isLastInSequence() const { return sequenceSize() == sequenceIndex() + 1; } + bool isPartOfSequence() const { return sequenceSize() > -1 && sequenceIndex() > -1; } + + /** + * @brief readerInit Set if Reader Initialisation/Programming symbol. + */ + bool readerInit() const { return _readerInit; } + + /** + * @brief lineCount How many lines have been detected with this code (applies only to linear symbologies) + */ + int lineCount() const { return _lineCount; } + + /** + * @brief version QRCode / DataMatrix / Aztec version or size. + */ + std::string version() const; + +#ifdef ZXING_EXPERIMENTAL_API + void symbol(BitMatrix&& bits); + ImageView symbol() const; + void zint(unique_zint_symbol&& z); + zint_symbol* zint() const { return _zint.get(); } +#endif + + bool operator==(const Result& o) const; + +private: + Content _content; + Error _error; + Position _position; + ReaderOptions _readerOpts; // TODO: 3.0 switch order to prevent 4 padding bytes + StructuredAppendInfo _sai; + BarcodeFormat _format = BarcodeFormat::None; + char _ecLevel[4] = {}; + char _version[4] = {}; + int _lineCount = 0; + bool _isMirrored = false; + bool _isInverted = false; + bool _readerInit = false; +#ifdef ZXING_EXPERIMENTAL_API + std::shared_ptr<BitMatrix> _symbol; + std::shared_ptr<zint_symbol> _zint; +#endif +}; + +/** + * @brief Merge a list of Barcodes from one Structured Append sequence to a single barcode + */ +Barcode MergeStructuredAppendSequence(const Barcodes& results); + +/** + * @brief Automatically merge all Structured Append sequences found in the given list of barcodes + */ +Barcodes MergeStructuredAppendSequences(const Barcodes& barcodes); + +} // ZXing
