Files
ANSLibs/QRCode/datamatrix/DMEncoderContext.h

129 lines
2.5 KiB
C
Raw Permalink Normal View History

/*
* Copyright 2016 Huy Cuong Nguyen
* Copyright 2006-2007 Jeremias Maerki.
*/
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include "ByteArray.h"
#include "DMSymbolInfo.h"
#include "ZXAlgorithms.h"
#include <stdexcept>
#include <string>
#include <utility>
namespace ZXing::DataMatrix {
class EncoderContext
{
std::string _msg;
SymbolShape _shape = SymbolShape::NONE;
int _minWidth = -1;
int _minHeight = -1;
int _maxWidth = -1;
int _maxHeight = -1;
ByteArray _codewords;
int _pos = 0;
int _newEncoding = -1;
const SymbolInfo* _symbolInfo = nullptr;
int _skipAtEnd = 0;
public:
explicit EncoderContext(std::string&& msg) : _msg(std::move(msg)) { _codewords.reserve(_msg.length()); }
EncoderContext(const EncoderContext &) = delete; // avoid copy by mistake
void setSymbolShape(SymbolShape shape) {
_shape = shape;
}
void setSizeConstraints(int minWidth, int minHeight, int maxWidth, int maxHeight) {
_minWidth = minWidth;
_minHeight = minHeight;
_maxWidth = maxWidth;
_maxHeight = maxHeight;
}
const std::string& message() const {
return _msg;
}
void setSkipAtEnd(int count) {
_skipAtEnd = count;
}
int currentPos() const {
return _pos;
}
void setCurrentPos(int pos) {
_pos = pos;
}
int currentChar() const {
return _msg.at(_pos) & 0xff;
}
int nextChar() const {
return _msg.at(_pos + 1) & 0xff;
}
const ByteArray& codewords() const {
return _codewords;
}
int codewordCount() const {
return Size(_codewords);
}
void addCodeword(uint8_t codeword) {
_codewords.push_back(codeword);
}
void setNewEncoding(int encoding) {
_newEncoding = encoding;
}
void clearNewEncoding() {
_newEncoding = -1;
}
int newEncoding() const {
return _newEncoding;
}
bool hasMoreCharacters() const {
return _pos < totalMessageCharCount();
}
int totalMessageCharCount() const {
return narrow_cast<int>(_msg.length() - _skipAtEnd);
}
int remainingCharacters() const {
return totalMessageCharCount() - _pos;
}
const SymbolInfo* updateSymbolInfo(int len) {
if (_symbolInfo == nullptr || len > _symbolInfo->dataCapacity()) {
_symbolInfo = SymbolInfo::Lookup(len, _shape, _minWidth, _minHeight, _maxWidth, _maxHeight);
if (_symbolInfo == nullptr) {
throw std::invalid_argument("Can't find a symbol arrangement that matches the message. Data codewords: " + std::to_string(len));
}
}
return _symbolInfo;
}
void resetSymbolInfo() {
_symbolInfo = nullptr;
}
const SymbolInfo* symbolInfo() const {
return _symbolInfo;
}
};
} // namespace ZXing::DataMatrix