#include "MCReader.h"
#include "BinaryBitmap.h"
#include "BitMatrix.h"
#include "DecoderResult.h"
#include "DetectorResult.h"
#include "MCBitMatrixParser.h"
#include "MCDecoder.h"
#include "BarcodeData.h"
namespace ZXing::MaxiCode {
static DetectorResult ExtractPureBits(const BitMatrix& image)
{
int left, top, width, height;
if (!image.findBoundingBox(left, top, width, height, BitMatrixParser::MATRIX_WIDTH))
return {};
BitMatrix bits(BitMatrixParser::MATRIX_WIDTH, BitMatrixParser::MATRIX_HEIGHT);
for (int y = 0; y < BitMatrixParser::MATRIX_HEIGHT; y++) {
int iy = top + (y * height + height / 2) / BitMatrixParser::MATRIX_HEIGHT;
for (int x = 0; x < BitMatrixParser::MATRIX_WIDTH; x++) {
int ix = left + (x * width + width / 2 + (y & 0x01) * width / 2) / BitMatrixParser::MATRIX_WIDTH;
if (image.get(ix, iy)) {
bits.set(x, y);
}
}
}
return {std::move(bits), Rectangle<PointI>(left, top, width, height)};
}
BarcodesData Reader::read(const BinaryBitmap& image, [[maybe_unused]] int maxSymbols) const
{
auto binImg = image.getBitMatrix();
if (binImg == nullptr)
return {};
auto detRes = ExtractPureBits(*binImg);
if (!detRes.isValid())
return {};
DecoderResult decRes = Decode(detRes.bits());
if (!decRes.isValid())
return {};
return ToVector(MatrixBarcode(std::move(decRes), std::move(detRes), BarcodeFormat::MaxiCode));
}
}