1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*
* 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 "CharacterSet.h"
#include "Version.h"
#include <string_view>
#include <utility>
#include <memory>
namespace ZXing {
/**
* @brief Specify which algorithm to use for the grayscale to binary transformation.
*
* The difference is how to get to a threshold value T which results in a bit value R(esult) = L(uminance) <= T(hreshold).
*/
enum class Binarizer : unsigned char // needs to be unsigned for the bitfield below to work, uint8_t fails as well
{
LocalAverage, ///< T = average of neighboring pixels for matrix and GlobalHistogram for linear (HybridBinarizer)
GlobalHistogram, ///< T = valley between the 2 largest peaks in the histogram (per line in linear case)
FixedThreshold, ///< T = 127
BoolCast, ///< T = 0, fastest possible
};
/**
* @brief Specify whether to ignore, read or require EAN-2/5 add-on symbols while scanning EAN/UPC codes.
*/
enum class EanAddOnSymbol : unsigned char // see above
{
Ignore, ///< Ignore any Add-On symbol during read/scan
Read, ///< Read EAN-2/EAN-5 Add-On symbol if found
Require, ///< Require EAN-2/EAN-5 Add-On symbol to be present
};
/**
* @brief Specify how the decoded byte content of a barcode should be transcoded to text.
*
* @see Barcode::text(), ReaderOptions::textMode().
*/
enum class TextMode : unsigned char // see above
{
Plain, ///< bytes() transcoded to unicode based on ECI info or guessed charset (the default mode prior to 2.0)
ECI, ///< standard content following the ECI protocol with every character set ECI segment transcoded to unicode
HRI, ///< Human Readable Interpretation (dependent on the ContentType)
Escaped, ///< Use the EscapeNonGraphical() function (e.g. ASCII 29 will be transcoded to "<GS>")
Hex, ///< bytes() transcoded to ASCII string of HEX values
HexECI, ///< bytesECI() transcoded to ASCII string of HEX values
};
/**
* @brief Configuration options for barcode reading and decoding behavior.
*
* ReaderOptions encapsulates a set of flags and parameters that control
* how barcode detection and decoding is performed. It provides
* fluent setters that support chaining. Both `name(val)` and `setName(val)`
* forms are available for convenience and compatibility.
*
* The class is intended to be passed to the ReadBarcodes function to
* influence scanning heuristics, performance vs. accuracy trade-offs, output
* formatting, and symbol filtering. Instances can be reused across multiple
* read operations.
*
* The default settings are optimized for detection rate and can be tuned
* for speed or specific use-cases.
*
* @see BarcodeFormats, Binarizer, TextMode, CharacterSet, ReadBarcodes
*/
class ReaderOptions
{
struct Data;
std::unique_ptr<Data> d;
public:
ReaderOptions();
~ReaderOptions();
ReaderOptions(const ReaderOptions&);
ReaderOptions& operator=(const ReaderOptions&);
ReaderOptions(ReaderOptions&&) noexcept;
ReaderOptions& operator=(ReaderOptions&&) noexcept;
#define ZX_PROPERTY(TYPE, NAME, SETTER, ...) \
TYPE NAME() const noexcept; \
__VA_ARGS__ ReaderOptions& NAME(TYPE v) &; \
__VA_ARGS__ ReaderOptions&& NAME(TYPE v) &&; \
__VA_ARGS__ inline ReaderOptions& SETTER(TYPE v) & { return NAME(v); } \
__VA_ARGS__ inline ReaderOptions&& SETTER(TYPE v) && { return std::move(*this).NAME(v); }
/// Specify a set of BarcodeFormats that should be searched for, the default is all supported formats.
const BarcodeFormats& formats() const noexcept;
ReaderOptions& formats(BarcodeFormats&& v) &;
ReaderOptions&& formats(BarcodeFormats&& v) &&;
ReaderOptions& formats(const BarcodeFormats& v) & { return formats(BarcodeFormats(v)); }
ReaderOptions&& formats(const BarcodeFormats& v) && { return std::move(*this).formats(BarcodeFormats(v)); }
inline ReaderOptions& setFormats(BarcodeFormats&& v) & { return formats(std::move(v)); }
inline ReaderOptions&& setFormats(BarcodeFormats&& v) && { return std::move(*this).formats(std::move(v)); }
inline ReaderOptions& setFormats(const BarcodeFormats& v) & { return formats(BarcodeFormats(v)); }
inline ReaderOptions&& setFormats(const BarcodeFormats& v) && { return std::move(*this).formats(BarcodeFormats(v)); }
/// Spend more time to try to find a barcode; optimize for accuracy instead of not speed (default: true).
ZX_PROPERTY(bool, tryHarder, setTryHarder)
/// Try detecting codes in 90, 180 and 270 degree rotated images (default: true).
ZX_PROPERTY(bool, tryRotate, setTryRotate)
/// Try detecting inverted ("reversed reflectance") codes if the format allows for those (default: true).
ZX_PROPERTY(bool, tryInvert, setTryInvert)
/// Try detecting code in downscaled images (depending on image size) (default: true).
ZX_PROPERTY(bool, tryDownscale, setTryDownscale)
#ifdef ZXING_EXPERIMENTAL_API
/// Also try detecting code after denoising (currently morphological closing filter for 2D formats only).
ZX_PROPERTY(bool, tryDenoise, setTryDenoise)
#endif
/// Binarizer to use for grayscale to binary transformation (default: Binarizer::LocalAverage).
ZX_PROPERTY(Binarizer, binarizer, setBinarizer)
/// Set to true if the input contains nothing but a single perfectly aligned barcode (generated image).
ZX_PROPERTY(bool, isPure, setIsPure)
/// Image size ( min(width, height) ) threshold at which to start downscaled scanning.
ZX_PROPERTY(uint16_t, downscaleThreshold, setDownscaleThreshold)
/// Scale factor used during downscaling, meaningful values are 2, 3 and 4.
ZX_PROPERTY(uint8_t, downscaleFactor, setDownscaleFactor)
/// The number of scan lines in a linear barcode that have to be equal to accept the result (default: 2).
ZX_PROPERTY(uint8_t, minLineCount, setMinLineCount)
/// The maximum number of symbols (barcodes) to detect / look for with ReadBarcodes().
ZX_PROPERTY(uint8_t, maxNumberOfSymbols, setMaxNumberOfSymbols)
/// Validate optional checksums where applicable (e.g. Code39, ITF) (default: false).
ZX_PROPERTY(bool, validateOptionalChecksum, setValidateOptionalChecksum)
/// If true, return the barcodes with errors as well (e.g. checksum errors, see Barcode::error()) (default: false).
ZX_PROPERTY(bool, returnErrors, setReturnErrors)
/// Specify whether to ignore, read or require EAN-2/5 add-on symbols while scanning EAN/UPC codes.
ZX_PROPERTY(EanAddOnSymbol, eanAddOnSymbol, setEanAddOnSymbol)
/// Specifies the TextMode that controls the return of the Barcode::text() function (default: TextMode::HRI).
ZX_PROPERTY(TextMode, textMode, setTextMode)
/// Specifies fallback character set to use instead of auto-detecting it (when applicable).
ZX_PROPERTY(CharacterSet, characterSet, setCharacterSet)
ReaderOptions& characterSet(std::string_view v) &;
ReaderOptions&& characterSet(std::string_view v) &&;
inline ReaderOptions& setCharacterSet(std::string_view v) & { return characterSet(v); }
inline ReaderOptions&& setCharacterSet(std::string_view v) && { return std::move(*this).characterSet(v); }
#undef ZX_PROPERTY
/// @cond DEPRECATED
// Silence deprecated-declarations warnings, only happening here for deprecated inline functions
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#elif defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4996)
#endif
#define ZX_DEPRECATED_PROPERTY(TYPE, NAME, SETTER, GET_IMPL, SET_IMPL) \
[[deprecated]] inline TYPE NAME() const noexcept { return GET_IMPL; } \
[[deprecated]] ReaderOptions& NAME(TYPE v) & { SET_IMPL; return *this; } \
[[deprecated]] ReaderOptions&& NAME(TYPE v) && { SET_IMPL; return std::move(*this); } \
[[deprecated]] inline ReaderOptions& SETTER(TYPE v) & { return NAME(v); } \
[[deprecated]] inline ReaderOptions&& SETTER(TYPE v) && { return std::move(*this).NAME(v); }
/// @deprecated (does nothing). See BarcodeFormat::Code39Ext and ::Code39Std to select full ASCII or standard Code39 mode.
ZX_DEPRECATED_PROPERTY(bool, tryCode39ExtendedMode, setTryCode39ExtendedMode, true, (void)v)
/// @deprecated (use validateOptionalChecksum). The Code39 symbol has a valid checksum iff symbologyIdentifier()[2] is an odd digit
ZX_DEPRECATED_PROPERTY(bool, validateCode39CheckSum, setValidateCode39CheckSum, validateOptionalChecksum(),
validateOptionalChecksum(v))
/// @deprecated (use validateOptionalChecksum). The ITF symbol has a valid checksum iff symbologyIdentifier()[2] == '1'.
ZX_DEPRECATED_PROPERTY(bool, validateITFCheckSum, setValidateITFCheckSum, validateOptionalChecksum(), validateOptionalChecksum(v))
#undef ZX_DEPRECATED_PROPERTY
#ifdef __GNUC__
#pragma GCC diagnostic pop
#elif defined(_MSC_VER)
#pragma warning(pop)
#endif
/// @endcond
#ifdef ZXING_INTERNAL
/// Check if a specific format is explicitly enabled in the formats set
bool hasFormat(const BarcodeFormats& formats) const noexcept;
/// Check if any format is explicitly or implicitly enabled in the formats set
bool hasAnyFormat(const BarcodeFormats& formats) const noexcept;
#endif
};
} // ZXing