142 lines
3.4 KiB
C++
142 lines
3.4 KiB
C++
|
|
/*
|
||
|
|
* Copyright 2016 Huy Cuong Nguyen
|
||
|
|
* Copyright 2016 ZXing authors
|
||
|
|
*/
|
||
|
|
// SPDX-License-Identifier: Apache-2.0
|
||
|
|
|
||
|
|
#include "DMSymbolInfo.h"
|
||
|
|
|
||
|
|
#include "ZXAlgorithms.h"
|
||
|
|
#include "ZXTestSupport.h"
|
||
|
|
|
||
|
|
#include <cstddef>
|
||
|
|
#include <stdexcept>
|
||
|
|
|
||
|
|
namespace ZXing::DataMatrix {
|
||
|
|
|
||
|
|
static constexpr const SymbolInfo PROD_SYMBOLS[] = {
|
||
|
|
{ false, 3, 5, 8, 8, 1 },
|
||
|
|
{ false, 5, 7, 10, 10, 1 },
|
||
|
|
{ true, 5, 7, 16, 6, 1 },
|
||
|
|
{ false, 8, 10, 12, 12, 1 },
|
||
|
|
{ true, 10, 11, 14, 6, 2 },
|
||
|
|
{ false, 12, 12, 14, 14, 1 },
|
||
|
|
{ true, 16, 14, 24, 10, 1 },
|
||
|
|
|
||
|
|
{ false, 18, 14, 16, 16, 1 },
|
||
|
|
{ false, 22, 18, 18, 18, 1 },
|
||
|
|
{ true, 22, 18, 16, 10, 2 },
|
||
|
|
{ false, 30, 20, 20, 20, 1 },
|
||
|
|
{ true, 32, 24, 16, 14, 2 },
|
||
|
|
{ false, 36, 24, 22, 22, 1 },
|
||
|
|
{ false, 44, 28, 24, 24, 1 },
|
||
|
|
{ true, 49, 28, 22, 14, 2 },
|
||
|
|
|
||
|
|
{ false, 62, 36, 14, 14, 4 },
|
||
|
|
{ false, 86, 42, 16, 16, 4 },
|
||
|
|
{ false, 114, 48, 18, 18, 4 },
|
||
|
|
{ false, 144, 56, 20, 20, 4 },
|
||
|
|
{ false, 174, 68, 22, 22, 4 },
|
||
|
|
|
||
|
|
{ false, 204, 84, 24, 24, 4, 102, 42 },
|
||
|
|
{ false, 280, 112, 14, 14, 16, 140, 56 },
|
||
|
|
{ false, 368, 144, 16, 16, 16, 92, 36 },
|
||
|
|
{ false, 456, 192, 18, 18, 16, 114, 48 },
|
||
|
|
{ false, 576, 224, 20, 20, 16, 144, 56 },
|
||
|
|
{ false, 696, 272, 22, 22, 16, 174, 68 },
|
||
|
|
{ false, 816, 336, 24, 24, 16, 136, 56 },
|
||
|
|
{ false, 1050, 408, 18, 18, 36, 175, 68 },
|
||
|
|
{ false, 1304, 496, 20, 20, 36, 163, 62 },
|
||
|
|
{ false, 1558, 620, 22, 22, 36, -1, 62 },
|
||
|
|
};
|
||
|
|
|
||
|
|
static const SymbolInfo* s_symbols = PROD_SYMBOLS;
|
||
|
|
static ZXING_IF_NOT_TEST(const) size_t s_symbolCount = Size(PROD_SYMBOLS);
|
||
|
|
|
||
|
|
#ifdef ZXING_BUILD_FOR_TEST
|
||
|
|
|
||
|
|
ZXING_EXPORT_TEST_ONLY
|
||
|
|
void OverrideSymbolSet(const SymbolInfo* symbols, size_t count)
|
||
|
|
{
|
||
|
|
s_symbols = symbols;
|
||
|
|
s_symbolCount = count;
|
||
|
|
}
|
||
|
|
|
||
|
|
ZXING_EXPORT_TEST_ONLY
|
||
|
|
void UseDefaultSymbolSet()
|
||
|
|
{
|
||
|
|
s_symbols = PROD_SYMBOLS;
|
||
|
|
s_symbolCount = Size(PROD_SYMBOLS);
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif // ZXING_BUILD_FOR_TEST
|
||
|
|
|
||
|
|
const SymbolInfo *
|
||
|
|
SymbolInfo::Lookup(int dataCodewords)
|
||
|
|
{
|
||
|
|
return Lookup(dataCodewords, SymbolShape::NONE);
|
||
|
|
}
|
||
|
|
|
||
|
|
const SymbolInfo *
|
||
|
|
SymbolInfo::Lookup(int dataCodewords, SymbolShape shape)
|
||
|
|
{
|
||
|
|
return Lookup(dataCodewords, shape, -1, -1, -1, -1);
|
||
|
|
}
|
||
|
|
|
||
|
|
const SymbolInfo *
|
||
|
|
SymbolInfo::Lookup(int dataCodewords, bool allowRectangular)
|
||
|
|
{
|
||
|
|
return Lookup(dataCodewords, allowRectangular ? SymbolShape::NONE : SymbolShape::SQUARE, -1, -1, -1, -1);
|
||
|
|
}
|
||
|
|
|
||
|
|
const SymbolInfo *
|
||
|
|
SymbolInfo::Lookup(int dataCodewords, SymbolShape shape, int minWidth, int minHeight, int maxWidth, int maxHeight)
|
||
|
|
{
|
||
|
|
for (size_t i = 0; i < s_symbolCount; ++i) {
|
||
|
|
auto& symbol = s_symbols[i];
|
||
|
|
if (shape == SymbolShape::SQUARE && symbol._rectangular) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
if (shape == SymbolShape::RECTANGLE && !symbol._rectangular) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
if (minWidth >= 0 && minHeight >= 0 && (symbol.symbolWidth() < minWidth || symbol.symbolHeight() < minHeight)) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
if (maxWidth >= 0 && maxHeight >= 0 && (symbol.symbolWidth() > maxWidth || symbol.symbolHeight() > maxHeight)) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
if (dataCodewords <= symbol._dataCapacity) {
|
||
|
|
return &symbol;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nullptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
int
|
||
|
|
SymbolInfo::horizontalDataRegions() const
|
||
|
|
{
|
||
|
|
switch (_dataRegions) {
|
||
|
|
case 1: return 1;
|
||
|
|
case 2: return 2;
|
||
|
|
case 4: return 2;
|
||
|
|
case 16: return 4;
|
||
|
|
case 36: return 6;
|
||
|
|
default: throw std::out_of_range("Cannot handle this number of data regions");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int
|
||
|
|
SymbolInfo::verticalDataRegions() const {
|
||
|
|
switch (_dataRegions) {
|
||
|
|
case 1: return 1;
|
||
|
|
case 2: return 1;
|
||
|
|
case 4: return 2;
|
||
|
|
case 16: return 4;
|
||
|
|
case 36: return 6;
|
||
|
|
default: throw std::out_of_range("Cannot handle this number of data regions");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
} // namespace ZXing::DataMatrix
|