1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifndef _BC_PDF417SCANNINGDECODER_H_ 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _BC_PDF417SCANNINGDECODER_H_ 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_CommonDecoderResult; 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_CommonBitMatrix; 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_ErrorCorrection; 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_Codeword; 13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_BoundingBox; 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_ResultPoint; 15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_BarcodeMetadata; 16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_BarcodeValue; 17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_DetectionResult; 18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_DetectionResultRowIndicatorColumn; 19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_PDF417ScanningDecoder { 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_PDF417ScanningDecoder(); 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann virtual ~CBC_PDF417ScanningDecoder(); 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static void Initialize(); 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static void Finalize(); 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image, 27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_ResultPoint* imageTopLeft, 28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_ResultPoint* imageBottomLeft, 29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_ResultPoint* imageTopRight, 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_ResultPoint* imageBottomRight, 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t minCodewordWidth, 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maxCodewordWidth, 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix); 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann private: 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t CODEWORD_SKEW_SIZE; 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t MAX_ERRORS; 39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t MAX_EC_CODEWORDS; 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_PDF417ECErrorCorrection* errorCorrection; 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_DetectionResult* merge( 42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, 43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn, 44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_BoundingBox* adjustBoundingBox( 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn, 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t getMax(CFX_Int32Array& values); 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_BarcodeMetadata* getBarcodeMetadata( 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn, 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn); 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn( 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_CommonBitMatrix* image, 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_BoundingBox* boundingBox, 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_ResultPoint startPoint, 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL leftToRight, 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t minCodewordWidth, 58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maxCodewordWidth); 59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static void adjustCodewordCount(CBC_DetectionResult* detectionResult, 60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_PtrArray* barcodeMatrix, 61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_CommonDecoderResult* createDecoderResult( 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_DetectionResult* detectionResult, 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues( 66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t ecLevel, 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Int32Array& codewords, 68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Int32Array& erasureArray, 69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Int32Array& ambiguousIndexes, 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_PtrArray& ambiguousIndexValues, 71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CFX_PtrArray* createBarcodeMatrix( 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CBC_DetectionResult* detectionResult); 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult, 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t barcodeColumn); 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t getStartColumn(CBC_DetectionResult* detectionResult, 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t barcodeColumn, 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t imageRow, 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL leftToRight); 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image, 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t minColumn, 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maxColumn, 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL leftToRight, 84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t startColumn, 85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t imageRow, 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t minCodewordWidth, 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maxCodewordWidth); 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image, 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t minColumn, 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maxColumn, 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL leftToRight, 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t startColumn, 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t imageRow); 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t getNumberOfECCodeWords(int32_t barcodeECLevel); 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t adjustCodewordStartColumn(CBC_CommonBitMatrix* image, 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t minColumn, 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maxColumn, 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_BOOL leftToRight, 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t codewordStartColumn, 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t imageRow); 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static FX_BOOL checkCodewordSkew(int32_t codewordSize, 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t minCodewordWidth, 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t maxCodewordWidth); 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array& codewords, 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t ecLevel, 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Int32Array& erasures, 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t correctErrors(CFX_Int32Array& codewords, 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_Int32Array& erasures, 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t numECCodewords, 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static void verifyCodewordCount(CFX_Int32Array& codewords, 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t numECCodewords, 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t& e); 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static CFX_Int32Array* getBitCountForCodeword(int32_t codeword); 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t getCodewordBucketNumber(int32_t codeword); 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann static int32_t getCodewordBucketNumber(CFX_Int32Array& moduleBitCount); 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}; 119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif 120